datapos-connector-file-store-emulator 0.2.441 → 0.2.443

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,37 +1,37 @@
1
1
  const M = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
2
2
  let z = (e = 21) => {
3
- let t = "", d = crypto.getRandomValues(new Uint8Array(e |= 0));
3
+ let t = "", i = crypto.getRandomValues(new Uint8Array(e |= 0));
4
4
  for (; e--; )
5
- t += M[d[e] & 63];
5
+ t += M[i[e] & 63];
6
6
  return t;
7
7
  }, y = class extends Error {
8
8
  locator;
9
9
  /** Logical source of the error. */
10
- constructor(t, d, i) {
11
- super(t, i), this.name = new.target.name, this.locator = d;
10
+ constructor(t, i, d) {
11
+ super(t, d), this.name = new.target.name, this.locator = i;
12
12
  }
13
13
  }, j = class extends y {
14
14
  };
15
15
  class v extends j {
16
16
  body;
17
17
  /** Sanitized HTTP response body. */
18
- constructor(t, d, i, s) {
19
- super(t, d, s), this.name = new.target.name, this.body = h(i ?? void 0);
18
+ constructor(t, i, d, s) {
19
+ super(t, i, s), this.name = new.target.name, this.body = h(d ?? void 0);
20
20
  }
21
21
  }
22
22
  class u extends y {
23
23
  }
24
- async function C(e, t, d) {
25
- const i = ` - ${e.statusText}`, s = `${t} Response status '${e.status}${e.statusText ? i : ""}' received.`;
24
+ async function C(e, t, i) {
25
+ const d = ` - ${e.statusText}`, s = `${t} Response status '${e.status}${e.statusText ? d : ""}' received.`;
26
26
  let o;
27
27
  try {
28
28
  o = await e.text();
29
29
  } catch (a) {
30
- o = `<body unavailable: ${r(a).message}>`;
30
+ o = `<body unavailable: ${l(a).message}>`;
31
31
  }
32
- return new v(s, d, o);
32
+ return new v(s, i, o);
33
33
  }
34
- function r(e) {
34
+ function l(e) {
35
35
  if (e instanceof Error) return e;
36
36
  if (typeof e == "string") return new Error(e);
37
37
  if (typeof e == "number" || typeof e == "boolean" || typeof e == "bigint") return new Error(String(e));
@@ -50,8 +50,8 @@ function h(e) {
50
50
  }
51
51
  function g(e) {
52
52
  if (e) {
53
- const t = e.lastIndexOf("/"), d = e.lastIndexOf(".", t === -1 ? e.length : t);
54
- return d === -1 ? e : e.slice(0, Math.max(0, d));
53
+ const t = e.lastIndexOf("/"), i = e.lastIndexOf(".", t === -1 ? e.length : t);
54
+ return i === -1 ? e : e.slice(0, Math.max(0, i));
55
55
  }
56
56
  }
57
57
  function w(e) {
@@ -76,16 +76,16 @@ function R(e) {
76
76
  }
77
77
  }
78
78
  async function p(e, t) {
79
- const d = `datapos-tool-${t}`, i = e.find((o) => o.id === d);
80
- if (!i) throw new Error(`Connector could not load unknown tool '${t}'.`);
81
- const s = await import(`https://engine-eu.datapos.app/tools/${t}_v${i.version}/${d}.es.js`);
79
+ const i = `datapos-tool-${t}`, d = e.find((o) => o.id === i);
80
+ if (!d) throw new Error(`Connector could not load unknown tool '${t}'.`);
81
+ const s = await import(`https://engine-eu.datapos.app/tools/${t}_v${d.version}/${i}.es.js`);
82
82
  return new s.Tool();
83
83
  }
84
84
  const n = (e) => new Map(Object.entries(e));
85
85
  n({ "en-gb": "Data Positioning Events" }), n({ "en-gb": "Delimited Text" }), n({ "en-gb": "JSON" }), n({ "en-gb": "SPSS" }), n({ "en-gb": "XLSX" }), n({ "en-gb": "XML" });
86
86
  n({ "en-gb": "Newline" }), n({ "en-gb": "Carriage Return" }), n({ "en-gb": "Carriage Return/Newline" });
87
87
  n({ "en-gb": "Colon" }), n({ "en-gb": "Comma" }), n({ "en-gb": "Exclamation Mark" }), n({ "en-gb": "Record Separator" }), n({ "en-gb": "Semicolon" }), n({ "en-gb": "Space" }), n({ "en-gb": "Tab" }), n({ "en-gb": "Underscore" }), n({ "en-gb": "Unit Separator" }), n({ "en-gb": "Vertical Bar" });
88
- const P = [",", ";", " ", "|", " ", ":", "_", "!", "0x1F", "0x1E"], E = "datapos-connector-file-store-emulator", S = { en: "File Store Emulator" }, T = { "en-gb": "Imitates a cloud-based file storage solution. It hosts a read-only set of files for demonstration, evaluation and testing purposes and is freely available to all users." }, x = null, k = "fileStore", _ = { default: { authMethodId: "none", maxConnectionCount: 1 } }, F = '<svg fill="#000000" height="100%" viewBox="0 0 576 512"><path d="M320 32H64C46.33 32 32 46.33 32 64V448C32 465.7 46.33 480 64 480H296.2C305.1 491.8 317.3 502.3 329.7 511.3C326.6 511.7 323.3 512 320 512H64C28.65 512 0 483.3 0 448V64C0 28.65 28.65 0 64 0H320C355.3 0 384 28.65 384 64V198.6C372.8 201.8 362.1 206 352 211.2V64C352 46.33 337.7 32 320 32V32zM64 144C64 135.2 71.16 128 80 128H304C312.8 128 320 135.2 320 144C320 152.8 312.8 160 304 160H80C71.16 160 64 152.8 64 144zM272 224C280.8 224 288 231.2 288 240C288 248.8 280.8 256 272 256H80C71.16 256 64 248.8 64 240C64 231.2 71.16 224 80 224H272zM208 320C216.8 320 224 327.2 224 336C224 344.8 216.8 352 208 352H80C71.16 352 64 344.8 64 336C64 327.2 71.16 320 80 320H208zM476.7 324.7C482.9 318.4 493.1 318.4 499.3 324.7C505.6 330.9 505.6 341.1 499.3 347.3L427.3 419.3C421.1 425.6 410.9 425.6 404.7 419.3L364.7 379.3C358.4 373.1 358.4 362.9 364.7 356.7C370.9 350.4 381.1 350.4 387.3 356.7L416 385.4L476.7 324.7zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM432 480C493.9 480 544 429.9 544 368C544 306.1 493.9 256 432 256C370.1 256 320 306.1 320 368C320 429.9 370.1 480 432 480z"/></svg>', O = '<svg fill="#ffffff" height="100%" viewBox="0 0 576 512"><path d="M320 32H64C46.33 32 32 46.33 32 64V448C32 465.7 46.33 480 64 480H296.2C305.1 491.8 317.3 502.3 329.7 511.3C326.6 511.7 323.3 512 320 512H64C28.65 512 0 483.3 0 448V64C0 28.65 28.65 0 64 0H320C355.3 0 384 28.65 384 64V198.6C372.8 201.8 362.1 206 352 211.2V64C352 46.33 337.7 32 320 32V32zM64 144C64 135.2 71.16 128 80 128H304C312.8 128 320 135.2 320 144C320 152.8 312.8 160 304 160H80C71.16 160 64 152.8 64 144zM272 224C280.8 224 288 231.2 288 240C288 248.8 280.8 256 272 256H80C71.16 256 64 248.8 64 240C64 231.2 71.16 224 80 224H272zM208 320C216.8 320 224 327.2 224 336C224 344.8 216.8 352 208 352H80C71.16 352 64 344.8 64 336C64 327.2 71.16 320 80 320H208zM476.7 324.7C482.9 318.4 493.1 318.4 499.3 324.7C505.6 330.9 505.6 341.1 499.3 347.3L427.3 419.3C421.1 425.6 410.9 425.6 404.7 419.3L364.7 379.3C358.4 373.1 358.4 362.9 364.7 356.7C370.9 350.4 381.1 350.4 387.3 356.7L416 385.4L476.7 324.7zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM432 480C493.9 480 544 429.9 544 368C544 306.1 493.9 256 432 256C370.1 256 320 306.1 320 368C320 429.9 370.1 480 432 480z"/></svg>', N = null, U = ["abortOperation", "auditContent", "auditObjectContent", "findObjectFolderPath", "getReadableStream", "listNodes", "previewObject", "retrieveRecords"], L = null, D = "beta", V = "connector", B = "source", G = null, H = null, q = null, Z = "0.2.441", K = {
88
+ const P = [",", ";", " ", "|", " ", ":", "_", "!", "0x1F", "0x1E"], E = "datapos-connector-file-store-emulator", S = { en: "File Store Emulator" }, T = { "en-gb": "Imitates a cloud-based file storage solution. It hosts a read-only set of files for demonstration, evaluation and testing purposes and is freely available to all users." }, x = null, k = "fileStore", _ = { default: { authMethodId: "none", maxConnectionCount: 1 } }, F = '<svg fill="#000000" height="100%" viewBox="0 0 576 512"><path d="M320 32H64C46.33 32 32 46.33 32 64V448C32 465.7 46.33 480 64 480H296.2C305.1 491.8 317.3 502.3 329.7 511.3C326.6 511.7 323.3 512 320 512H64C28.65 512 0 483.3 0 448V64C0 28.65 28.65 0 64 0H320C355.3 0 384 28.65 384 64V198.6C372.8 201.8 362.1 206 352 211.2V64C352 46.33 337.7 32 320 32V32zM64 144C64 135.2 71.16 128 80 128H304C312.8 128 320 135.2 320 144C320 152.8 312.8 160 304 160H80C71.16 160 64 152.8 64 144zM272 224C280.8 224 288 231.2 288 240C288 248.8 280.8 256 272 256H80C71.16 256 64 248.8 64 240C64 231.2 71.16 224 80 224H272zM208 320C216.8 320 224 327.2 224 336C224 344.8 216.8 352 208 352H80C71.16 352 64 344.8 64 336C64 327.2 71.16 320 80 320H208zM476.7 324.7C482.9 318.4 493.1 318.4 499.3 324.7C505.6 330.9 505.6 341.1 499.3 347.3L427.3 419.3C421.1 425.6 410.9 425.6 404.7 419.3L364.7 379.3C358.4 373.1 358.4 362.9 364.7 356.7C370.9 350.4 381.1 350.4 387.3 356.7L416 385.4L476.7 324.7zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM432 480C493.9 480 544 429.9 544 368C544 306.1 493.9 256 432 256C370.1 256 320 306.1 320 368C320 429.9 370.1 480 432 480z"/></svg>', O = '<svg fill="#ffffff" height="100%" viewBox="0 0 576 512"><path d="M320 32H64C46.33 32 32 46.33 32 64V448C32 465.7 46.33 480 64 480H296.2C305.1 491.8 317.3 502.3 329.7 511.3C326.6 511.7 323.3 512 320 512H64C28.65 512 0 483.3 0 448V64C0 28.65 28.65 0 64 0H320C355.3 0 384 28.65 384 64V198.6C372.8 201.8 362.1 206 352 211.2V64C352 46.33 337.7 32 320 32V32zM64 144C64 135.2 71.16 128 80 128H304C312.8 128 320 135.2 320 144C320 152.8 312.8 160 304 160H80C71.16 160 64 152.8 64 144zM272 224C280.8 224 288 231.2 288 240C288 248.8 280.8 256 272 256H80C71.16 256 64 248.8 64 240C64 231.2 71.16 224 80 224H272zM208 320C216.8 320 224 327.2 224 336C224 344.8 216.8 352 208 352H80C71.16 352 64 344.8 64 336C64 327.2 71.16 320 80 320H208zM476.7 324.7C482.9 318.4 493.1 318.4 499.3 324.7C505.6 330.9 505.6 341.1 499.3 347.3L427.3 419.3C421.1 425.6 410.9 425.6 404.7 419.3L364.7 379.3C358.4 373.1 358.4 362.9 364.7 356.7C370.9 350.4 381.1 350.4 387.3 356.7L416 385.4L476.7 324.7zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM432 480C493.9 480 544 429.9 544 368C544 306.1 493.9 256 432 256C370.1 256 320 306.1 320 368C320 429.9 370.1 480 432 480z"/></svg>', N = null, U = ["abortOperation", "auditObjectContent", "findObjectFolderPath", "getReadableStream", "listNodes", "previewObject", "retrieveRecords"], L = null, D = "beta", V = "connector", B = "source", G = null, H = null, q = null, Z = "0.2.443", K = {
89
89
  id: E,
90
90
  label: S,
91
91
  description: T,
@@ -125,10 +125,10 @@ const P = [",", ";", " ", "|", " ", ":", "_", "!", "0x1F", "0x1E"], E = "datapos
125
125
  };
126
126
  let I;
127
127
  async function Q(e, t) {
128
- const { add_my_numbers: d } = await A();
128
+ const { add_my_numbers: i } = await A();
129
129
  console.log(1111, e, t);
130
- const i = d(Math.trunc(e), Math.trunc(t));
131
- return console.log(2222, i), i;
130
+ const d = i(Math.trunc(e), Math.trunc(t));
131
+ return console.log(2222, d), d;
132
132
  }
133
133
  async function J(e) {
134
134
  const { checksum_from_rust: t } = await A();
@@ -143,8 +143,8 @@ class ee {
143
143
  config;
144
144
  engineUtilities;
145
145
  toolConfigs;
146
- constructor(t, d) {
147
- this.abortController = void 0, this.config = K, this.engineUtilities = t, this.toolConfigs = d;
146
+ constructor(t, i) {
147
+ this.abortController = void 0, this.config = K, this.engineUtilities = t, this.toolConfigs = i;
148
148
  }
149
149
  //━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
150
150
  //#region: Operations.
@@ -155,37 +155,45 @@ class ee {
155
155
  abortOperation() {
156
156
  this.abortController && (this.abortController.abort(), this.abortController = void 0);
157
157
  }
158
- /**
159
- * Audit the content of a CSV file using Rust CSV parser.
160
- * Automatically selects the appropriate processing mode based on browser capabilities.
161
- */
162
- async auditContent(t, d, i) {
163
- this.abortController = new AbortController();
164
- try {
165
- const s = await this.getReadableStream({ id: "", path: t }), o = await p(this.toolConfigs, "rust-csv-core"), a = { delimiter: ",", hasHeaders: !0 }, c = d ? await o.processWithTransferableStream(s, a, i) : await o.processWithChunks(s, a, i);
166
- return {
167
- processedRowCount: c.processedRowCount,
168
- durationMs: c.durationMs ?? 0
169
- };
170
- } catch (s) {
171
- throw r(s);
172
- } finally {
173
- this.abortController = void 0;
174
- }
175
- }
158
+ // /**
159
+ // * Audit the content of a CSV file using Rust CSV parser.
160
+ // * Automatically selects the appropriate processing mode based on browser capabilities.
161
+ // */
162
+ // async auditContent(path: string, supportsTransferableStreams: boolean, onProgress?: (rowCount: number) => void): Promise<{ processedRowCount: number; durationMs?: number }> {
163
+ // this.abortController = new AbortController();
164
+ // try {
165
+ // // Get the readable stream
166
+ // const stream = await this.getReadableStream({ id: '', path });
167
+ // // Load the Rust CSV core tool
168
+ // const rustCsvTool = await loadTool<RustCsvCoreTool>(this.toolConfigs, 'rust-csv-core');
169
+ // // Choose processing mode based on browser capability
170
+ // const options = { delimiter: ',', hasHeaders: true };
171
+ // const result = supportsTransferableStreams
172
+ // ? await rustCsvTool.processWithTransferableStream(stream, options, onProgress)
173
+ // : await rustCsvTool.processWithChunks(stream, options, onProgress);
174
+ // return {
175
+ // processedRowCount: result.processedRowCount,
176
+ // durationMs: result.durationMs ?? 0
177
+ // };
178
+ // } catch (error) {
179
+ // throw normalizeToError(error);
180
+ // } finally {
181
+ // this.abortController = undefined;
182
+ // }
183
+ // }
176
184
  /**
177
185
  * Audit object content.
178
186
  */
179
- async auditObjectContent(t, d) {
187
+ async auditObjectContent(t, i) {
180
188
  this.abortController = new AbortController();
181
189
  try {
182
- const i = await this.getReadableStream({ id: "", path: t.path }), s = await p(this.toolConfigs, "rust-csv-core"), o = { delimiter: ",", hasHeaders: !0 }, a = t.supportsTransferableStreams ? await s.processWithTransferableStream(i, o, d) : await s.processWithChunks(i, o, d);
190
+ const d = await this.getReadableStream({ id: "", path: t.path }), s = await p(this.toolConfigs, "rust-csv-core"), o = { delimiter: ",", hasHeaders: !0 }, a = t.supportsTransferableStreams ? await s.processWithTransferableStream(d, o, i) : await s.processWithChunks(d, o, i);
183
191
  return {
184
192
  processedRowCount: a.processedRowCount,
185
193
  durationMs: a.durationMs ?? 0
186
194
  };
187
- } catch (i) {
188
- throw r(i);
195
+ } catch (d) {
196
+ throw l(d);
189
197
  } finally {
190
198
  this.abortController = void 0;
191
199
  }
@@ -194,27 +202,27 @@ class ee {
194
202
  * Find the folder path containing the specified object node.
195
203
  */
196
204
  findObjectFolderPath(t) {
197
- const d = b;
198
- for (const i in d)
199
- if (Object.hasOwn(d, i) && d[i]?.find((a) => a.typeId === "object" && a.id === t.nodeId))
200
- return Promise.resolve(i);
205
+ const i = b;
206
+ for (const d in i)
207
+ if (Object.hasOwn(i, d) && i[d]?.find((a) => a.typeId === "object" && a.id === t.nodeId))
208
+ return Promise.resolve(d);
201
209
  return Promise.resolve(null);
202
210
  }
203
211
  /**
204
212
  * Get a readable stream for the specified object node path.
205
213
  */
206
214
  async getReadableStream(t) {
207
- const { signal: d } = this.abortController = new AbortController();
215
+ const { signal: i } = this.abortController = new AbortController();
208
216
  try {
209
- const i = await fetch(`${f}/fileStore${t.path}`, { signal: d });
210
- if (!i.ok)
211
- throw await C(i, `Failed to fetch '${t.path}' file.`, "datapos-connector-file-store-emulator|Connector|getReadableStream");
212
- if (i.body == null)
217
+ const d = await fetch(`${f}/fileStore${t.path}`, { signal: i });
218
+ if (!d.ok)
219
+ throw await C(d, `Failed to fetch '${t.path}' file.`, "datapos-connector-file-store-emulator|Connector|getReadableStream");
220
+ if (d.body == null)
213
221
  throw new u("Readable streams are not supported in this runtime.", "datapos-connector-file-store-emulator|Connector|getReadableStream.unsupported");
214
222
  const s = await Q(12, 56), o = await J(this.config.version);
215
- return console.log("sum", o, s), await Promise.resolve(i.body);
216
- } catch (i) {
217
- throw r(i);
223
+ return console.log("sum", o, s), await Promise.resolve(d.body);
224
+ } catch (d) {
225
+ throw l(d);
218
226
  } finally {
219
227
  this.abortController = void 0;
220
228
  }
@@ -223,23 +231,23 @@ class ee {
223
231
  * Lists all nodes (folders and objects) in the specified folder path.
224
232
  */
225
233
  listNodes(t) {
226
- const i = b[t.folderPath] ?? [], s = [];
227
- for (const o of i)
228
- o.typeId === "folder" ? s.push(X(t.folderPath, o.name, o.childCount)) : s.push(W(t.folderPath, o.id, o.name, o.lastModifiedAt, o.size));
234
+ const d = b[t.folderPath] ?? [], s = [];
235
+ for (const o of d)
236
+ o.typeId === "folder" ? s.push(X(t.folderPath, o.name, o.childCount)) : s.push(Y(t.folderPath, o.id, o.name, o.lastModifiedAt, o.size));
229
237
  return Promise.resolve({ cursor: void 0, isMore: !1, connectionNodeConfigs: s, totalCount: s.length });
230
238
  }
231
239
  /**
232
240
  * Preview the contents of the object node with the specified path.
233
241
  */
234
242
  async previewObject(t) {
235
- const { signal: d } = this.abortController = new AbortController();
243
+ const { signal: i } = this.abortController = new AbortController();
236
244
  try {
237
- const i = Date.now(), s = performance.now(), a = await (await p(this.toolConfigs, "file-operators")).previewFile(`${f}/fileStore${t.path}`, d, t.chunkSize);
245
+ const d = Date.now(), s = performance.now(), a = await (await p(this.toolConfigs, "file-operators")).previewFile(`${f}/fileStore${t.path}`, i, t.chunkSize);
238
246
  if (a.dataFormatId == null) throw new Error(`File '${t.path}' has unknown type.`);
239
247
  if (a.text == null) throw new Error(`File '${t.path}' is empty.`);
240
- const l = await (await p(this.toolConfigs, "csv-parse")).parseText(a.text, P), m = this.engineUtilities.inferDataTypes(l.parsedRecords);
248
+ const c = await (await p(this.toolConfigs, "csv-parse")).parseText(a.text, P), m = this.engineUtilities.inferDataTypes(c.parsedRecords);
241
249
  return {
242
- asAt: i,
250
+ asAt: d,
243
251
  columnConfigs: m.columnConfigs,
244
252
  dataFormatId: a.dataFormatId,
245
253
  duration: performance.now() - s,
@@ -247,15 +255,15 @@ class ee {
247
255
  encodingConfidenceLevel: a.encodingConfidenceLevel,
248
256
  fileType: a.fileTypeConfig,
249
257
  hasHeaders: m.hasHeaderRow,
250
- recordDelimiterId: l.recordDelimiterId,
251
- parsedRecords: l.parsedRecords,
258
+ recordDelimiterId: c.recordDelimiterId,
259
+ parsedRecords: c.parsedRecords,
252
260
  inferenceRecords: m.typedRecords,
253
261
  size: a.bytes.length,
254
262
  text: a.text,
255
- valueDelimiterId: l.valueDelimiterId
263
+ valueDelimiterId: c.valueDelimiterId
256
264
  };
257
- } catch (i) {
258
- throw r(i);
265
+ } catch (d) {
266
+ throw l(d);
259
267
  } finally {
260
268
  this.abortController = void 0;
261
269
  }
@@ -263,22 +271,22 @@ class ee {
263
271
  /**
264
272
  * Retrieves all records from a CSV object node using streaming and chunked processing.
265
273
  */
266
- async retrieveRecords(t, d, i) {
274
+ async retrieveRecords(t, i, d) {
267
275
  this.abortController = new AbortController();
268
276
  try {
269
- const s = await p(this.toolConfigs, "csv-parse"), o = { delimiter: t.valueDelimiterId, info: !0, relax_column_count: !0, relax_quotes: !0 }, a = `${f}/fileStore${t.path}`, c = await s.parseStream(t, o, a, this.abortController, d);
270
- i(c);
277
+ const s = await p(this.toolConfigs, "csv-parse"), o = { delimiter: t.valueDelimiterId, info: !0, relax_column_count: !0, relax_quotes: !0 }, a = `${f}/fileStore${t.path}`, r = await s.parseStream(t, o, a, this.abortController, i);
278
+ d(r);
271
279
  } catch (s) {
272
- throw r(s);
280
+ throw l(s);
273
281
  } finally {
274
282
  this.abortController = void 0;
275
283
  }
276
284
  }
277
285
  //#endregion ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
278
286
  }
279
- function X(e, t, d) {
287
+ function X(e, t, i) {
280
288
  return {
281
- childCount: d,
289
+ childCount: i,
282
290
  childNodes: [],
283
291
  extension: void 0,
284
292
  folderPath: e,
@@ -292,8 +300,8 @@ function X(e, t, d) {
292
300
  typeId: "folder"
293
301
  };
294
302
  }
295
- function W(e, t, d, i, s) {
296
- const o = g(d) ?? "", a = w(d), c = i, l = R(a);
303
+ function Y(e, t, i, d, s) {
304
+ const o = g(i) ?? "", a = w(i), r = d, c = R(a);
297
305
  return {
298
306
  childCount: void 0,
299
307
  childNodes: [],
@@ -301,9 +309,9 @@ function W(e, t, d, i, s) {
301
309
  folderPath: e,
302
310
  handle: void 0,
303
311
  id: t,
304
- label: d,
305
- lastModifiedAt: c,
306
- mimeType: l,
312
+ label: i,
313
+ lastModifiedAt: r,
314
+ mimeType: c,
307
315
  name: o,
308
316
  size: s,
309
317
  typeId: "object"
@@ -1 +1 @@
1
- {"version":3,"file":"datapos-connector-file-store-emulator.es.js","sources":["../node_modules/nanoid/url-alphabet/index.js","../node_modules/nanoid/index.browser.js","../node_modules/@datapos/datapos-shared/dist/datapos-shared-errors.es.js","../node_modules/@datapos/datapos-shared/dist/datapos-shared-utilities.es.js","../node_modules/@datapos/datapos-shared/dist/datapos-shared-tools.es.js","../node_modules/@datapos/datapos-shared/dist/datapos-shared-locale.es.js","../node_modules/@datapos/datapos-shared/dist/datapos-shared-dataview.es.js","../src/rustBridge.ts","../src/index.ts"],"sourcesContent":["export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","/* @ts-self-types=\"./index.d.ts\" */\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","class i extends Error {\n locator;\n /** Logical source of the error. */\n constructor(n, o, e) {\n super(n, e), this.name = new.target.name, this.locator = o;\n }\n}\nclass a extends i {\n}\nclass d extends a {\n}\nclass f extends a {\n}\nclass c extends a {\n body;\n /** Sanitized HTTP response body. */\n constructor(n, o, e, t) {\n super(n, o, t), this.name = new.target.name, this.body = b(e ?? void 0);\n }\n}\nclass g extends i {\n}\nclass l extends a {\n componentName;\n /** Vue component name, if available. */\n info;\n /** Vue error info string. */\n constructor(n, o, e, t, s) {\n super(n, o, s), this.name = new.target.name, this.info = e, this.componentName = t;\n }\n}\nclass E extends a {\n}\nclass u extends a {\n}\nasync function y(r, n, o) {\n const e = ` - ${r.statusText}`, t = `${n} Response status '${r.status}${r.statusText ? e : \"\"}' received.`;\n let s;\n try {\n s = await r.text();\n } catch (m) {\n s = `<body unavailable: ${w(m).message}>`;\n }\n return new c(t, o, s);\n}\nfunction h(r) {\n return r.map((n) => n.message).join(\" \");\n}\nfunction R(r) {\n try {\n r();\n } catch {\n }\n}\nfunction w(r) {\n if (r instanceof Error) return r;\n if (typeof r == \"string\") return new Error(r);\n if (typeof r == \"number\" || typeof r == \"boolean\" || typeof r == \"bigint\") return new Error(String(r));\n if (typeof r == \"symbol\") return new Error(r.description ?? \"Unknown error\");\n if (r != null && typeof r == \"object\")\n try {\n return new Error(JSON.stringify(r));\n } catch {\n return new Error(\"Unknown error\");\n }\n return new Error(\"Unknown error\");\n}\nfunction x(r) {\n const n = /* @__PURE__ */ new Set(), o = [];\n let e = r;\n for (; e != null && !n.has(e); ) {\n n.add(e);\n let t;\n if (e instanceof c)\n t = { componentName: void 0, body: e.body, info: void 0, locator: e.locator, message: e.message, name: e.name, stack: e.stack }, e = e.cause;\n else if (e instanceof l)\n t = {\n componentName: e.componentName,\n body: void 0,\n info: e.info,\n locator: e.locator,\n message: e.message,\n name: e.name,\n stack: e.stack\n }, e = e.cause;\n else if (e instanceof i)\n t = { componentName: void 0, body: void 0, info: void 0, locator: e.locator, message: e.message, name: e.name, stack: e.stack }, e = e.cause;\n else if (e instanceof Error) {\n const s = e;\n t = { componentName: void 0, body: void 0, info: void 0, locator: \"\", message: s.message, name: s.name, stack: s.stack }, e = s.cause;\n } else\n t = { componentName: void 0, body: void 0, info: void 0, locator: \"\", message: p(e), name: \"Error\", stack: void 0 }, e = void 0;\n /(?:\\.{3}|[.!?])$/.test(t.message) || (t.message += \".\"), o.push(t);\n }\n return o;\n}\nfunction v(r) {\n if (r.length === 0) return;\n let n;\n for (const o of r.toReversed()) {\n let e;\n if (o.body !== void 0)\n e = new c(o.message, o.locator, o.body, { cause: n });\n else if (o.info !== void 0)\n e = new l(o.message, o.locator, o.info, o.componentName, { cause: n });\n else if (o.locator === \"\")\n e = new Error(o.message, { cause: n }), e.name = o.name;\n else\n switch (o.name) {\n case \"APIError\":\n e = new d(o.message, o.locator, { cause: n });\n break;\n case \"EngineError\":\n e = new f(o.message, o.locator, { cause: n });\n break;\n case \"ApplicationError\":\n e = new a(o.message, o.locator, { cause: n });\n break;\n case \"OperationalError\":\n e = new g(o.message, o.locator, { cause: n });\n break;\n case \"WindowHandledRuntimeError\":\n e = new E(o.message, o.locator, { cause: n });\n break;\n case \"WindowHandledPromiseRejectionError\":\n e = new u(o.message, o.locator, { cause: n });\n break;\n default:\n e = new i(o.message, o.locator, { cause: n });\n break;\n }\n o.stack !== void 0 && (e.stack = o.stack), n = e;\n }\n return n;\n}\nfunction p(r) {\n let n;\n try {\n n = JSON.stringify(r);\n } catch {\n typeof r == \"symbol\" ? n = r.description ?? \"Unknown error\" : typeof r == \"bigint\" ? n = r.toString() : n = \"Unknown error\";\n }\n return n === \"\" && (n = \"Unknown error\"), n;\n}\nfunction b(r) {\n if (!(r == null || r === \"\"))\n return r.length > 2048 ? `${r.slice(0, 2048)}... [truncated]` : r;\n}\nexport {\n d as APIError,\n a as ApplicationError,\n f as EngineError,\n c as FetchError,\n g as OperationalError,\n l as VueHandledError,\n u as WindowHandledPromiseRejectionError,\n E as WindowHandledRuntimeError,\n y as buildFetchError,\n h as concatenateSerialisedErrorMessages,\n R as ignoreErrors,\n w as normalizeToError,\n x as serialiseError,\n v as unserialiseError\n};\n","const c = \"en-US\", s = /* @__PURE__ */ new Map();\nfunction f(e) {\n switch (e) {\n case \"Edm.Binary\":\n return \"unknown\";\n // Binary...\n case \"Edm.Boolean\":\n return \"boolean\";\n case \"Edm.Byte\":\n return \"wholeNumber\";\n case \"Edm.DateTime\":\n return \"moment\";\n // DateTime...\n case \"Edm.DateTimeOffset\":\n return \"moment\";\n // DateTimeOffset...\n case \"Edm.Decimal\":\n return \"decimalNumber\";\n case \"Edm.Double\":\n return \"decimalNumber\";\n case \"Edm.Guid\":\n return \"string\";\n case \"Edm.Int16\":\n return \"wholeNumber\";\n case \"Edm.Int32\":\n return \"wholeNumber\";\n case \"Edm.Int64\":\n return \"wholeNumber\";\n case \"Edm.SByte\":\n return \"wholeNumber\";\n case \"Edm.Single\":\n return \"decimalNumber\";\n case \"Edm.String\":\n return \"string\";\n case \"Edm.Time\":\n return \"momentTime\";\n // Time...\n default:\n return \"unknown\";\n }\n}\nfunction l(e) {\n if (e) {\n const t = e.lastIndexOf(\"/\"), n = e.lastIndexOf(\".\", t === -1 ? e.length : t);\n return n === -1 ? e : e.slice(0, Math.max(0, n));\n }\n}\nfunction m(e) {\n if (e) {\n const t = e.lastIndexOf(\".\");\n if (t !== -1) return e.slice(Math.max(0, t + 1));\n }\n}\nfunction r(e, t = 2, n = t, i = c) {\n if (e == null) return \"\";\n const u = `${i}decimal${t}.${n}`;\n let a = s.get(u);\n return a || (a = new Intl.NumberFormat(i, {\n localeMatcher: \"best fit\",\n maximumFractionDigits: t,\n minimumFractionDigits: n,\n minimumIntegerDigits: 1,\n style: \"decimal\",\n useGrouping: !0\n }), s.set(u, a)), a.format(e);\n}\nfunction d(e) {\n return e == null ? \"\" : e < 1e3 ? o(e) : e < 1e6 ? `${r(e / 1e3, 2, 0)}K` : e < 1e9 ? `${r(e / 1e6, 2, 0)}M` : e < 1e12 ? `${r(e / 1e9, 2, 0)}B` : `${r(e / 1e12, 2, 0)}T`;\n}\nfunction x(e) {\n return e == null ? \"\" : e === 1 ? \"1 byte\" : e < 1024 ? `${o(e)} bytes` : e < 1048576 ? `${r(e / 1024, 2, 0)} KB` : e < 1073741824 ? `${r(e / 1048576, 2, 0)} MB` : e < 1099511627776 ? `${r(e / 1073741824, 2, 0)} GB` : `${r(e / 1099511627776, 2, 0)} TB`;\n}\nfunction p(e) {\n return e == null ? \"\" : e < 1e3 ? `${o(e)} ms` : e === 1e3 ? `${o(e)} sec` : e < 6e4 ? `${r(e / 1e3, 2, 0)} secs` : e === 6e4 ? \"1 min\" : e < 36e5 ? `${r(e / 6e4, 2, 0)} mins` : e === 36e5 ? \"1 hr\" : e < 864e5 ? `${r(e / 36e5, 2, 0)} hrs` : e === 864e5 ? \"1 day\" : `${r(e / 864e5, 2, 0)} days`;\n}\nfunction o(e, t = c) {\n if (e == null) return \"\";\n const n = `${t}decimal0.0`;\n let i = s.get(n);\n return i || (i = new Intl.NumberFormat(t, {\n localeMatcher: \"best fit\",\n maximumFractionDigits: 0,\n minimumFractionDigits: 0,\n minimumIntegerDigits: 1,\n style: \"decimal\",\n useGrouping: !0\n }), s.set(n, i)), i.format(e);\n}\nfunction E(e) {\n switch (e) {\n case \"csv\":\n return \"text/csv\";\n case \"tab\":\n case \"tsv\":\n return \"text/tab-separated-values\";\n case \"xls\":\n return \"application/vnd.ms-excel\";\n case \"xlsx\":\n return \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\";\n default:\n return \"application/octet-stream\";\n }\n}\nexport {\n f as convertODataTypeIdToUsageTypeId,\n m as extractExtensionFromPath,\n l as extractNameFromPath,\n r as formatNumberAsDecimalNumber,\n p as formatNumberAsDuration,\n d as formatNumberAsSize,\n x as formatNumberAsStorageSize,\n o as formatNumberAsWholeNumber,\n E as lookupMimeTypeForExtension\n};\n","async function a(e, o) {\n const n = `datapos-tool-${o}`, t = e.find((r) => r.id === n);\n if (!t) throw new Error(`Connector could not load unknown tool '${o}'.`);\n const l = await import(`https://engine-eu.datapos.app/tools/${o}_v${t.version}/${n}.es.js`);\n return new l.Tool();\n}\nexport {\n a as loadTool\n};\n","const o = \"en-gb\", i = (e) => new Map(Object.entries(e)), s = (e, t, n = o) => {\n const r = e.get(t);\n if (r !== void 0) return r;\n if (n !== t)\n return e.get(n);\n};\nexport {\n o as DEFAULT_LOCALE_CODE,\n i as createLabelMap,\n s as resolveLabel\n};\n","import { createLabelMap as e } from \"./datapos-shared-locale.es.js\";\ne({ \"en-gb\": \"Data Positioning Events\" }), e({ \"en-gb\": \"Delimited Text\" }), e({ \"en-gb\": \"JSON\" }), e({ \"en-gb\": \"SPSS\" }), e({ \"en-gb\": \"XLSX\" }), e({ \"en-gb\": \"XML\" });\ne({ \"en-gb\": \"Newline\" }), e({ \"en-gb\": \"Carriage Return\" }), e({ \"en-gb\": \"Carriage Return/Newline\" });\ne({ \"en-gb\": \"Colon\" }), e({ \"en-gb\": \"Comma\" }), e({ \"en-gb\": \"Exclamation Mark\" }), e({ \"en-gb\": \"Record Separator\" }), e({ \"en-gb\": \"Semicolon\" }), e({ \"en-gb\": \"Space\" }), e({ \"en-gb\": \"Tab\" }), e({ \"en-gb\": \"Underscore\" }), e({ \"en-gb\": \"Unit Separator\" }), e({ \"en-gb\": \"Vertical Bar\" });\nconst a = [\",\", \";\", \"\t\", \"|\", \" \", \":\", \"_\", \"!\", \"0x1F\", \"0x1E\"];\nexport {\n a as ORDERED_VALUE_DELIMITER_IDS\n};\n","// Dependencies - Framework\nimport type * as RustModule from '../rust/datapos-connector-file-store-emulator-core/pkg/datapos_connector_file_store_emulator_core.js';\n\n// Interfaces/Types\ntype RustBindings = typeof RustModule;\n\n// Module Variables\nlet rustBindingsPromise: Promise<RustBindings> | undefined;\n\n// Utilities\nasync function addNumbersWithRust(left: number, right: number): Promise<number> {\n const { add_my_numbers } = await loadRustBindings();\n console.log(1111, left, right);\n const yyyy = add_my_numbers(Math.trunc(left), Math.trunc(right));\n console.log(2222, yyyy);\n return yyyy;\n}\n\n// Utilities\nasync function checksumWithRust(input: string): Promise<number> {\n const { checksum_from_rust } = await loadRustBindings();\n return checksum_from_rust(input);\n}\n\n// Helpers\nasync function loadRustBindings(): Promise<RustBindings> {\n rustBindingsPromise ??= import('../rust/datapos-connector-file-store-emulator-core/pkg/datapos_connector_file_store_emulator_core.js');\n return rustBindingsPromise;\n}\n\n// Exposures\nexport { addNumbersWithRust, checksumWithRust };\n","/**\n * File store emulator connector.\n */\n\n// Vendor dependencies.\nimport { nanoid } from 'nanoid';\n\n// Framework dependencies.\nimport type { Tool as CSVParseTool } from '@datapos/datapos-tool-csv-parse';\nimport type { EngineUtilities } from '@datapos/datapos-shared/engine';\nimport type { Tool as FileOperatorsTool } from '@datapos/datapos-tool-file-operators';\nimport type { Tool as RustCsvCoreTool } from '@datapos/datapos-tool-rust-csv-core';\nimport type {\n AuditObjectContentOptions,\n AuditObjectContentResult,\n ConnectionNodeConfig,\n ConnectorConfig,\n ConnectorInterface,\n FindObjectFolderPathOptions,\n GetReadableStreamOptions,\n ListNodesOptions,\n ListNodesResult,\n PreviewObjectOptions,\n RetrieveRecordsOptions,\n RetrieveRecordsSummary\n} from '@datapos/datapos-shared/component/connector';\nimport { buildFetchError, normalizeToError, OperationalError } from '@datapos/datapos-shared/errors';\nimport { extractExtensionFromPath, extractNameFromPath, lookupMimeTypeForExtension } from '@datapos/datapos-shared/utilities';\nimport { loadTool, type ToolConfig } from '@datapos/datapos-shared/component/tool';\nimport { ORDERED_VALUE_DELIMITER_IDS, type ParsingRecord, type PreviewConfig } from '@datapos/datapos-shared/component/dataView';\n\n// Data dependencies.\nimport config from '~/config.json';\nimport fileStoreFolderPathData from '@/fileStoreFolderPaths.json';\n\n// TODO\nimport { addNumbersWithRust, checksumWithRust } from '@/rustBridge';\n\n/**\n * File store folder paths.\n */\ntype FileStoreFolderNode =\n | ({ typeId: 'folder'; childCount: number } & { name: string })\n | ({ typeId: 'object'; id: string; lastModifiedAt: number; size: number } & { name: string });\n\n/**\n *\n */\ntype FileStoreFolderPaths = Record<string, FileStoreFolderNode[]>;\n\n/**\n *\n */\nconst URL_PREFIX = 'https://sample-data-eu.datapos.app';\n\n/**\n * File store emulator connector.\n */\nclass Connector implements ConnectorInterface {\n abortController: AbortController | undefined;\n readonly config: ConnectorConfig;\n engineUtilities: EngineUtilities;\n readonly toolConfigs;\n\n constructor(engineUtilities: EngineUtilities, toolConfigs: ToolConfig[]) {\n this.abortController = undefined;\n this.config = config as ConnectorConfig;\n this.engineUtilities = engineUtilities;\n this.toolConfigs = toolConfigs;\n }\n\n //━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n //#region: Operations.\n //━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n /**\n * Abort the currently running operation.\n */\n abortOperation(): void {\n if (!this.abortController) return;\n this.abortController.abort();\n this.abortController = undefined;\n }\n\n /**\n * Audit the content of a CSV file using Rust CSV parser.\n * Automatically selects the appropriate processing mode based on browser capabilities.\n */\n async auditContent(path: string, supportsTransferableStreams: boolean, onProgress?: (rowCount: number) => void): Promise<{ processedRowCount: number; durationMs?: number }> {\n this.abortController = new AbortController();\n\n try {\n // Get the readable stream\n const stream = await this.getReadableStream({ id: '', path });\n\n // Load the Rust CSV core tool\n const rustCsvTool = await loadTool<RustCsvCoreTool>(this.toolConfigs, 'rust-csv-core');\n\n // Choose processing mode based on browser capability\n const options = { delimiter: ',', hasHeaders: true };\n const result = supportsTransferableStreams\n ? await rustCsvTool.processWithTransferableStream(stream, options, onProgress)\n : await rustCsvTool.processWithChunks(stream, options, onProgress);\n\n return {\n processedRowCount: result.processedRowCount,\n durationMs: result.durationMs ?? 0\n };\n } catch (error) {\n throw normalizeToError(error);\n } finally {\n this.abortController = undefined;\n }\n }\n\n /**\n * Audit object content.\n */\n async auditObjectContent(options: AuditObjectContentOptions, chunk: (rowCount: number) => void): Promise<AuditObjectContentResult> {\n this.abortController = new AbortController();\n\n try {\n // Get the readable stream\n const stream = await this.getReadableStream({ id: '', path: options.path });\n\n // Load the Rust CSV core tool\n const rustCsvTool = await loadTool<RustCsvCoreTool>(this.toolConfigs, 'rust-csv-core');\n\n // Choose processing mode based on browser capability\n const options2 = { delimiter: ',', hasHeaders: true };\n const result = options.supportsTransferableStreams\n ? await rustCsvTool.processWithTransferableStream(stream, options2, chunk)\n : await rustCsvTool.processWithChunks(stream, options2, chunk);\n\n return {\n processedRowCount: result.processedRowCount,\n durationMs: result.durationMs ?? 0\n };\n } catch (error) {\n throw normalizeToError(error);\n } finally {\n this.abortController = undefined;\n }\n }\n\n /**\n * Find the folder path containing the specified object node.\n */\n findObjectFolderPath(options: FindObjectFolderPathOptions): Promise<string | null> {\n const fileStoreFolderPaths = fileStoreFolderPathData as FileStoreFolderPaths;\n // Loop through the folder path data checking for an object entry with an identifier equal to the object name.\n for (const folderPath in fileStoreFolderPaths) {\n if (Object.hasOwn(fileStoreFolderPaths, folderPath)) {\n // eslint-disable-next-line security/detect-object-injection\n const folderPathNodes = fileStoreFolderPaths[folderPath];\n const folderPathNode = folderPathNodes?.find((folderPathNode) => folderPathNode.typeId === 'object' && folderPathNode.id === options.nodeId);\n if (folderPathNode) return Promise.resolve(folderPath); // Found, return folder path.\n }\n }\n return Promise.resolve(null); // Not found.\n }\n\n /**\n * Get a readable stream for the specified object node path.\n */\n async getReadableStream(options: GetReadableStreamOptions): Promise<ReadableStream<Uint8Array>> {\n // Create an abort controller and extract its signal.\n const { signal } = (this.abortController = new AbortController());\n\n try {\n const response = await fetch(`${URL_PREFIX}/fileStore${options.path}`, { signal });\n if (!response.ok) {\n throw await buildFetchError(response, `Failed to fetch '${options.path}' file.`, 'datapos-connector-file-store-emulator|Connector|getReadableStream');\n }\n if (response.body == null) {\n throw new OperationalError('Readable streams are not supported in this runtime.', 'datapos-connector-file-store-emulator|Connector|getReadableStream.unsupported');\n }\n\n // TODO: Remove after testing.\n const xxx = await addNumbersWithRust(12, 56);\n const sum = await checksumWithRust(this.config.version);\n console.log('sum', sum, xxx);\n\n return await Promise.resolve(response.body);\n } catch (error) {\n throw normalizeToError(error);\n } finally {\n this.abortController = undefined;\n }\n }\n\n /**\n * Lists all nodes (folders and objects) in the specified folder path.\n */\n listNodes(options: ListNodesOptions): Promise<ListNodesResult> {\n const fileStoreFolderPaths = fileStoreFolderPathData as FileStoreFolderPaths;\n const folderNodes = fileStoreFolderPaths[options.folderPath] ?? [];\n const connectionNodeConfigs: ConnectionNodeConfig[] = [];\n for (const folderNode of folderNodes) {\n if (folderNode.typeId === 'folder') {\n connectionNodeConfigs.push(constructFolderNodeConfig(options.folderPath, folderNode.name, folderNode.childCount));\n } else {\n connectionNodeConfigs.push(constructObjectNodeConfig(options.folderPath, folderNode.id, folderNode.name, folderNode.lastModifiedAt, folderNode.size));\n }\n }\n return Promise.resolve({ cursor: undefined, isMore: false, connectionNodeConfigs, totalCount: connectionNodeConfigs.length });\n }\n\n /**\n * Preview the contents of the object node with the specified path.\n */\n async previewObject(options: PreviewObjectOptions): Promise<PreviewConfig> {\n // Create an abort controller and extract its signal.\n const { signal } = (this.abortController = new AbortController());\n\n try {\n const asAt = Date.now();\n const startedAt = performance.now();\n\n // Preview file to determine file format and decode text.\n const fileOperatorsTool = await loadTool<FileOperatorsTool>(this.toolConfigs, 'file-operators');\n const filePreviewResult = await fileOperatorsTool.previewFile(`${URL_PREFIX}/fileStore${options.path}`, signal, options.chunkSize);\n if (filePreviewResult.dataFormatId == null) throw new Error(`File '${options.path}' has unknown type.`);\n if (filePreviewResult.text == null) throw new Error(`File '${options.path}' is empty.`);\n\n // Parse text, identify delimiters, and produce string value records.\n const csvParseTool = await loadTool<CSVParseTool>(this.toolConfigs, 'csv-parse');\n const parseTextResult = await csvParseTool.parseText(filePreviewResult.text, ORDERED_VALUE_DELIMITER_IDS);\n\n // Infer and cast values for each parsed record.\n const inferenceSummary = this.engineUtilities.inferDataTypes(parseTextResult.parsedRecords);\n\n return {\n asAt,\n columnConfigs: inferenceSummary.columnConfigs,\n dataFormatId: filePreviewResult.dataFormatId,\n duration: performance.now() - startedAt,\n encodingId: filePreviewResult.encodingId,\n encodingConfidenceLevel: filePreviewResult.encodingConfidenceLevel,\n fileType: filePreviewResult.fileTypeConfig,\n hasHeaders: inferenceSummary.hasHeaderRow,\n recordDelimiterId: parseTextResult.recordDelimiterId,\n parsedRecords: parseTextResult.parsedRecords,\n inferenceRecords: inferenceSummary.typedRecords,\n size: filePreviewResult.bytes.length,\n text: filePreviewResult.text,\n valueDelimiterId: parseTextResult.valueDelimiterId\n } as PreviewConfig;\n } catch (error) {\n throw normalizeToError(error);\n } finally {\n this.abortController = undefined;\n }\n }\n /**\n * Retrieves all records from a CSV object node using streaming and chunked processing.\n */\n async retrieveRecords(options: RetrieveRecordsOptions, chunk: (records: ParsingRecord[]) => void, complete: (result: RetrieveRecordsSummary) => void): Promise<void> {\n this.abortController = new AbortController();\n\n try {\n const csvParseTool = await loadTool<CSVParseTool>(this.toolConfigs, 'csv-parse');\n const parseStreamOptions = { delimiter: options.valueDelimiterId, info: true, relax_column_count: true, relax_quotes: true };\n const url = `${URL_PREFIX}/fileStore${options.path}`;\n const summary = await csvParseTool.parseStream(options, parseStreamOptions, url, this.abortController, chunk);\n complete(summary);\n } catch (error) {\n throw normalizeToError(error);\n } finally {\n this.abortController = undefined;\n }\n }\n\n //#endregion ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n}\n\n//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n//#region: Helpers.\n//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Construct folder node configuration.\n */\nfunction constructFolderNodeConfig(folderPath: string, name: string, childCount: number): ConnectionNodeConfig {\n return {\n childCount,\n childNodes: [],\n extension: undefined,\n folderPath,\n handle: undefined,\n id: nanoid(),\n label: name,\n lastModifiedAt: undefined,\n mimeType: undefined,\n name,\n size: undefined,\n typeId: 'folder'\n };\n}\n\n/**\n * Construct object (file) node configuration.\n */\nfunction constructObjectNodeConfig(folderPath: string, id: string, fullName: string, lastModifiedAt: number, size: number): ConnectionNodeConfig {\n const name = extractNameFromPath(fullName) ?? '';\n const extension = extractExtensionFromPath(fullName);\n const lastModifiedAtTimestamp = lastModifiedAt;\n const mimeType = lookupMimeTypeForExtension(extension);\n return {\n childCount: undefined,\n childNodes: [],\n extension,\n folderPath,\n handle: undefined,\n id,\n label: fullName,\n lastModifiedAt: lastModifiedAtTimestamp,\n mimeType,\n name,\n size,\n typeId: 'object'\n };\n}\n\n//#endregion ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n// Exposures.\nexport { Connector };\n"],"names":["urlAlphabet","nanoid","size","id","bytes","scopedUrlAlphabet","n","o","e","i","c","a","t","b","g","y","r","s","m","w","l","E","rustBindingsPromise","addNumbersWithRust","left","right","add_my_numbers","loadRustBindings","yyyy","checksumWithRust","input","checksum_from_rust","URL_PREFIX","Connector","engineUtilities","toolConfigs","config","path","supportsTransferableStreams","onProgress","stream","rustCsvTool","loadTool","options","result","error","normalizeToError","chunk","options2","fileStoreFolderPaths","fileStoreFolderPathData","folderPath","folderPathNode","signal","response","buildFetchError","OperationalError","xxx","sum","folderNodes","connectionNodeConfigs","folderNode","constructFolderNodeConfig","constructObjectNodeConfig","asAt","startedAt","filePreviewResult","parseTextResult","ORDERED_VALUE_DELIMITER_IDS","inferenceSummary","complete","csvParseTool","parseStreamOptions","url","summary","name","childCount","fullName","lastModifiedAt","extractNameFromPath","extension","extractExtensionFromPath","lastModifiedAtTimestamp","mimeType","lookupMimeTypeForExtension"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6]}
1
+ {"version":3,"file":"datapos-connector-file-store-emulator.es.js","sources":["../node_modules/nanoid/url-alphabet/index.js","../node_modules/nanoid/index.browser.js","../node_modules/@datapos/datapos-shared/dist/datapos-shared-errors.es.js","../node_modules/@datapos/datapos-shared/dist/datapos-shared-utilities.es.js","../node_modules/@datapos/datapos-shared/dist/datapos-shared-tools.es.js","../node_modules/@datapos/datapos-shared/dist/datapos-shared-locale.es.js","../node_modules/@datapos/datapos-shared/dist/datapos-shared-dataview.es.js","../src/rustBridge.ts","../src/index.ts"],"sourcesContent":["export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","/* @ts-self-types=\"./index.d.ts\" */\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","class i extends Error {\n locator;\n /** Logical source of the error. */\n constructor(n, o, e) {\n super(n, e), this.name = new.target.name, this.locator = o;\n }\n}\nclass a extends i {\n}\nclass d extends a {\n}\nclass f extends a {\n}\nclass c extends a {\n body;\n /** Sanitized HTTP response body. */\n constructor(n, o, e, t) {\n super(n, o, t), this.name = new.target.name, this.body = b(e ?? void 0);\n }\n}\nclass g extends i {\n}\nclass l extends a {\n componentName;\n /** Vue component name, if available. */\n info;\n /** Vue error info string. */\n constructor(n, o, e, t, s) {\n super(n, o, s), this.name = new.target.name, this.info = e, this.componentName = t;\n }\n}\nclass E extends a {\n}\nclass u extends a {\n}\nasync function y(r, n, o) {\n const e = ` - ${r.statusText}`, t = `${n} Response status '${r.status}${r.statusText ? e : \"\"}' received.`;\n let s;\n try {\n s = await r.text();\n } catch (m) {\n s = `<body unavailable: ${w(m).message}>`;\n }\n return new c(t, o, s);\n}\nfunction h(r) {\n return r.map((n) => n.message).join(\" \");\n}\nfunction R(r) {\n try {\n r();\n } catch {\n }\n}\nfunction w(r) {\n if (r instanceof Error) return r;\n if (typeof r == \"string\") return new Error(r);\n if (typeof r == \"number\" || typeof r == \"boolean\" || typeof r == \"bigint\") return new Error(String(r));\n if (typeof r == \"symbol\") return new Error(r.description ?? \"Unknown error\");\n if (r != null && typeof r == \"object\")\n try {\n return new Error(JSON.stringify(r));\n } catch {\n return new Error(\"Unknown error\");\n }\n return new Error(\"Unknown error\");\n}\nfunction x(r) {\n const n = /* @__PURE__ */ new Set(), o = [];\n let e = r;\n for (; e != null && !n.has(e); ) {\n n.add(e);\n let t;\n if (e instanceof c)\n t = { componentName: void 0, body: e.body, info: void 0, locator: e.locator, message: e.message, name: e.name, stack: e.stack }, e = e.cause;\n else if (e instanceof l)\n t = {\n componentName: e.componentName,\n body: void 0,\n info: e.info,\n locator: e.locator,\n message: e.message,\n name: e.name,\n stack: e.stack\n }, e = e.cause;\n else if (e instanceof i)\n t = { componentName: void 0, body: void 0, info: void 0, locator: e.locator, message: e.message, name: e.name, stack: e.stack }, e = e.cause;\n else if (e instanceof Error) {\n const s = e;\n t = { componentName: void 0, body: void 0, info: void 0, locator: \"\", message: s.message, name: s.name, stack: s.stack }, e = s.cause;\n } else\n t = { componentName: void 0, body: void 0, info: void 0, locator: \"\", message: p(e), name: \"Error\", stack: void 0 }, e = void 0;\n /(?:\\.{3}|[.!?])$/.test(t.message) || (t.message += \".\"), o.push(t);\n }\n return o;\n}\nfunction v(r) {\n if (r.length === 0) return;\n let n;\n for (const o of r.toReversed()) {\n let e;\n if (o.body !== void 0)\n e = new c(o.message, o.locator, o.body, { cause: n });\n else if (o.info !== void 0)\n e = new l(o.message, o.locator, o.info, o.componentName, { cause: n });\n else if (o.locator === \"\")\n e = new Error(o.message, { cause: n }), e.name = o.name;\n else\n switch (o.name) {\n case \"APIError\":\n e = new d(o.message, o.locator, { cause: n });\n break;\n case \"EngineError\":\n e = new f(o.message, o.locator, { cause: n });\n break;\n case \"ApplicationError\":\n e = new a(o.message, o.locator, { cause: n });\n break;\n case \"OperationalError\":\n e = new g(o.message, o.locator, { cause: n });\n break;\n case \"WindowHandledRuntimeError\":\n e = new E(o.message, o.locator, { cause: n });\n break;\n case \"WindowHandledPromiseRejectionError\":\n e = new u(o.message, o.locator, { cause: n });\n break;\n default:\n e = new i(o.message, o.locator, { cause: n });\n break;\n }\n o.stack !== void 0 && (e.stack = o.stack), n = e;\n }\n return n;\n}\nfunction p(r) {\n let n;\n try {\n n = JSON.stringify(r);\n } catch {\n typeof r == \"symbol\" ? n = r.description ?? \"Unknown error\" : typeof r == \"bigint\" ? n = r.toString() : n = \"Unknown error\";\n }\n return n === \"\" && (n = \"Unknown error\"), n;\n}\nfunction b(r) {\n if (!(r == null || r === \"\"))\n return r.length > 2048 ? `${r.slice(0, 2048)}... [truncated]` : r;\n}\nexport {\n d as APIError,\n a as ApplicationError,\n f as EngineError,\n c as FetchError,\n g as OperationalError,\n l as VueHandledError,\n u as WindowHandledPromiseRejectionError,\n E as WindowHandledRuntimeError,\n y as buildFetchError,\n h as concatenateSerialisedErrorMessages,\n R as ignoreErrors,\n w as normalizeToError,\n x as serialiseError,\n v as unserialiseError\n};\n","const c = \"en-US\", s = /* @__PURE__ */ new Map();\nfunction f(e) {\n switch (e) {\n case \"Edm.Binary\":\n return \"unknown\";\n // Binary...\n case \"Edm.Boolean\":\n return \"boolean\";\n case \"Edm.Byte\":\n return \"wholeNumber\";\n case \"Edm.DateTime\":\n return \"moment\";\n // DateTime...\n case \"Edm.DateTimeOffset\":\n return \"moment\";\n // DateTimeOffset...\n case \"Edm.Decimal\":\n return \"decimalNumber\";\n case \"Edm.Double\":\n return \"decimalNumber\";\n case \"Edm.Guid\":\n return \"string\";\n case \"Edm.Int16\":\n return \"wholeNumber\";\n case \"Edm.Int32\":\n return \"wholeNumber\";\n case \"Edm.Int64\":\n return \"wholeNumber\";\n case \"Edm.SByte\":\n return \"wholeNumber\";\n case \"Edm.Single\":\n return \"decimalNumber\";\n case \"Edm.String\":\n return \"string\";\n case \"Edm.Time\":\n return \"momentTime\";\n // Time...\n default:\n return \"unknown\";\n }\n}\nfunction l(e) {\n if (e) {\n const t = e.lastIndexOf(\"/\"), n = e.lastIndexOf(\".\", t === -1 ? e.length : t);\n return n === -1 ? e : e.slice(0, Math.max(0, n));\n }\n}\nfunction m(e) {\n if (e) {\n const t = e.lastIndexOf(\".\");\n if (t !== -1) return e.slice(Math.max(0, t + 1));\n }\n}\nfunction r(e, t = 2, n = t, i = c) {\n if (e == null) return \"\";\n const u = `${i}decimal${t}.${n}`;\n let a = s.get(u);\n return a || (a = new Intl.NumberFormat(i, {\n localeMatcher: \"best fit\",\n maximumFractionDigits: t,\n minimumFractionDigits: n,\n minimumIntegerDigits: 1,\n style: \"decimal\",\n useGrouping: !0\n }), s.set(u, a)), a.format(e);\n}\nfunction d(e) {\n return e == null ? \"\" : e < 1e3 ? o(e) : e < 1e6 ? `${r(e / 1e3, 2, 0)}K` : e < 1e9 ? `${r(e / 1e6, 2, 0)}M` : e < 1e12 ? `${r(e / 1e9, 2, 0)}B` : `${r(e / 1e12, 2, 0)}T`;\n}\nfunction x(e) {\n return e == null ? \"\" : e === 1 ? \"1 byte\" : e < 1024 ? `${o(e)} bytes` : e < 1048576 ? `${r(e / 1024, 2, 0)} KB` : e < 1073741824 ? `${r(e / 1048576, 2, 0)} MB` : e < 1099511627776 ? `${r(e / 1073741824, 2, 0)} GB` : `${r(e / 1099511627776, 2, 0)} TB`;\n}\nfunction p(e) {\n return e == null ? \"\" : e < 1e3 ? `${o(e)} ms` : e === 1e3 ? `${o(e)} sec` : e < 6e4 ? `${r(e / 1e3, 2, 0)} secs` : e === 6e4 ? \"1 min\" : e < 36e5 ? `${r(e / 6e4, 2, 0)} mins` : e === 36e5 ? \"1 hr\" : e < 864e5 ? `${r(e / 36e5, 2, 0)} hrs` : e === 864e5 ? \"1 day\" : `${r(e / 864e5, 2, 0)} days`;\n}\nfunction o(e, t = c) {\n if (e == null) return \"\";\n const n = `${t}decimal0.0`;\n let i = s.get(n);\n return i || (i = new Intl.NumberFormat(t, {\n localeMatcher: \"best fit\",\n maximumFractionDigits: 0,\n minimumFractionDigits: 0,\n minimumIntegerDigits: 1,\n style: \"decimal\",\n useGrouping: !0\n }), s.set(n, i)), i.format(e);\n}\nfunction E(e) {\n switch (e) {\n case \"csv\":\n return \"text/csv\";\n case \"tab\":\n case \"tsv\":\n return \"text/tab-separated-values\";\n case \"xls\":\n return \"application/vnd.ms-excel\";\n case \"xlsx\":\n return \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\";\n default:\n return \"application/octet-stream\";\n }\n}\nexport {\n f as convertODataTypeIdToUsageTypeId,\n m as extractExtensionFromPath,\n l as extractNameFromPath,\n r as formatNumberAsDecimalNumber,\n p as formatNumberAsDuration,\n d as formatNumberAsSize,\n x as formatNumberAsStorageSize,\n o as formatNumberAsWholeNumber,\n E as lookupMimeTypeForExtension\n};\n","async function a(e, o) {\n const n = `datapos-tool-${o}`, t = e.find((r) => r.id === n);\n if (!t) throw new Error(`Connector could not load unknown tool '${o}'.`);\n const l = await import(`https://engine-eu.datapos.app/tools/${o}_v${t.version}/${n}.es.js`);\n return new l.Tool();\n}\nexport {\n a as loadTool\n};\n","const o = \"en-gb\", i = (e) => new Map(Object.entries(e)), s = (e, t, n = o) => {\n const r = e.get(t);\n if (r !== void 0) return r;\n if (n !== t)\n return e.get(n);\n};\nexport {\n o as DEFAULT_LOCALE_CODE,\n i as createLabelMap,\n s as resolveLabel\n};\n","import { createLabelMap as e } from \"./datapos-shared-locale.es.js\";\ne({ \"en-gb\": \"Data Positioning Events\" }), e({ \"en-gb\": \"Delimited Text\" }), e({ \"en-gb\": \"JSON\" }), e({ \"en-gb\": \"SPSS\" }), e({ \"en-gb\": \"XLSX\" }), e({ \"en-gb\": \"XML\" });\ne({ \"en-gb\": \"Newline\" }), e({ \"en-gb\": \"Carriage Return\" }), e({ \"en-gb\": \"Carriage Return/Newline\" });\ne({ \"en-gb\": \"Colon\" }), e({ \"en-gb\": \"Comma\" }), e({ \"en-gb\": \"Exclamation Mark\" }), e({ \"en-gb\": \"Record Separator\" }), e({ \"en-gb\": \"Semicolon\" }), e({ \"en-gb\": \"Space\" }), e({ \"en-gb\": \"Tab\" }), e({ \"en-gb\": \"Underscore\" }), e({ \"en-gb\": \"Unit Separator\" }), e({ \"en-gb\": \"Vertical Bar\" });\nconst a = [\",\", \";\", \"\t\", \"|\", \" \", \":\", \"_\", \"!\", \"0x1F\", \"0x1E\"];\nexport {\n a as ORDERED_VALUE_DELIMITER_IDS\n};\n","// Dependencies - Framework\nimport type * as RustModule from '../rust/datapos-connector-file-store-emulator-core/pkg/datapos_connector_file_store_emulator_core.js';\n\n// Interfaces/Types\ntype RustBindings = typeof RustModule;\n\n// Module Variables\nlet rustBindingsPromise: Promise<RustBindings> | undefined;\n\n// Utilities\nasync function addNumbersWithRust(left: number, right: number): Promise<number> {\n const { add_my_numbers } = await loadRustBindings();\n console.log(1111, left, right);\n const yyyy = add_my_numbers(Math.trunc(left), Math.trunc(right));\n console.log(2222, yyyy);\n return yyyy;\n}\n\n// Utilities\nasync function checksumWithRust(input: string): Promise<number> {\n const { checksum_from_rust } = await loadRustBindings();\n return checksum_from_rust(input);\n}\n\n// Helpers\nasync function loadRustBindings(): Promise<RustBindings> {\n rustBindingsPromise ??= import('../rust/datapos-connector-file-store-emulator-core/pkg/datapos_connector_file_store_emulator_core.js');\n return rustBindingsPromise;\n}\n\n// Exposures\nexport { addNumbersWithRust, checksumWithRust };\n","/**\n * File store emulator connector.\n */\n\n// Vendor dependencies.\nimport { nanoid } from 'nanoid';\n\n// Framework dependencies.\nimport type { Tool as CSVParseTool } from '@datapos/datapos-tool-csv-parse';\nimport type { EngineUtilities } from '@datapos/datapos-shared/engine';\nimport type { Tool as FileOperatorsTool } from '@datapos/datapos-tool-file-operators';\nimport type { Tool as RustCsvCoreTool } from '@datapos/datapos-tool-rust-csv-core';\nimport type {\n AuditObjectContentOptions,\n AuditObjectContentResult,\n ConnectionNodeConfig,\n ConnectorConfig,\n ConnectorInterface,\n FindObjectFolderPathOptions,\n GetReadableStreamOptions,\n ListNodesOptions,\n ListNodesResult,\n PreviewObjectOptions,\n RetrieveRecordsOptions,\n RetrieveRecordsSummary\n} from '@datapos/datapos-shared/component/connector';\nimport { buildFetchError, normalizeToError, OperationalError } from '@datapos/datapos-shared/errors';\nimport { extractExtensionFromPath, extractNameFromPath, lookupMimeTypeForExtension } from '@datapos/datapos-shared/utilities';\nimport { loadTool, type ToolConfig } from '@datapos/datapos-shared/component/tool';\nimport { ORDERED_VALUE_DELIMITER_IDS, type ParsingRecord, type PreviewConfig } from '@datapos/datapos-shared/component/dataView';\n\n// Data dependencies.\nimport config from '~/config.json';\nimport fileStoreFolderPathData from '@/fileStoreFolderPaths.json';\n\n// TODO\nimport { addNumbersWithRust, checksumWithRust } from '@/rustBridge';\n\n/**\n * File store folder paths.\n */\ntype FileStoreFolderNode =\n | ({ typeId: 'folder'; childCount: number } & { name: string })\n | ({ typeId: 'object'; id: string; lastModifiedAt: number; size: number } & { name: string });\n\n/**\n *\n */\ntype FileStoreFolderPaths = Record<string, FileStoreFolderNode[]>;\n\n/**\n *\n */\nconst URL_PREFIX = 'https://sample-data-eu.datapos.app';\n\n/**\n * File store emulator connector.\n */\nclass Connector implements ConnectorInterface {\n abortController: AbortController | undefined;\n readonly config: ConnectorConfig;\n engineUtilities: EngineUtilities;\n readonly toolConfigs;\n\n constructor(engineUtilities: EngineUtilities, toolConfigs: ToolConfig[]) {\n this.abortController = undefined;\n this.config = config as ConnectorConfig;\n this.engineUtilities = engineUtilities;\n this.toolConfigs = toolConfigs;\n }\n\n //━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n //#region: Operations.\n //━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n /**\n * Abort the currently running operation.\n */\n abortOperation(): void {\n if (!this.abortController) return;\n this.abortController.abort();\n this.abortController = undefined;\n }\n\n // /**\n // * Audit the content of a CSV file using Rust CSV parser.\n // * Automatically selects the appropriate processing mode based on browser capabilities.\n // */\n // async auditContent(path: string, supportsTransferableStreams: boolean, onProgress?: (rowCount: number) => void): Promise<{ processedRowCount: number; durationMs?: number }> {\n // this.abortController = new AbortController();\n\n // try {\n // // Get the readable stream\n // const stream = await this.getReadableStream({ id: '', path });\n\n // // Load the Rust CSV core tool\n // const rustCsvTool = await loadTool<RustCsvCoreTool>(this.toolConfigs, 'rust-csv-core');\n\n // // Choose processing mode based on browser capability\n // const options = { delimiter: ',', hasHeaders: true };\n // const result = supportsTransferableStreams\n // ? await rustCsvTool.processWithTransferableStream(stream, options, onProgress)\n // : await rustCsvTool.processWithChunks(stream, options, onProgress);\n\n // return {\n // processedRowCount: result.processedRowCount,\n // durationMs: result.durationMs ?? 0\n // };\n // } catch (error) {\n // throw normalizeToError(error);\n // } finally {\n // this.abortController = undefined;\n // }\n // }\n\n /**\n * Audit object content.\n */\n async auditObjectContent(options: AuditObjectContentOptions, chunk: (rowCount: number) => void): Promise<AuditObjectContentResult> {\n this.abortController = new AbortController();\n\n try {\n // Get the readable stream\n const stream = await this.getReadableStream({ id: '', path: options.path });\n\n // Load the Rust CSV core tool\n const rustCsvTool = await loadTool<RustCsvCoreTool>(this.toolConfigs, 'rust-csv-core');\n\n // Choose processing mode based on browser capability\n const options2 = { delimiter: ',', hasHeaders: true };\n const result = options.supportsTransferableStreams\n ? await rustCsvTool.processWithTransferableStream(stream, options2, chunk)\n : await rustCsvTool.processWithChunks(stream, options2, chunk);\n\n return {\n processedRowCount: result.processedRowCount,\n durationMs: result.durationMs ?? 0\n };\n } catch (error) {\n throw normalizeToError(error);\n } finally {\n this.abortController = undefined;\n }\n }\n\n /**\n * Find the folder path containing the specified object node.\n */\n findObjectFolderPath(options: FindObjectFolderPathOptions): Promise<string | null> {\n const fileStoreFolderPaths = fileStoreFolderPathData as FileStoreFolderPaths;\n // Loop through the folder path data checking for an object entry with an identifier equal to the object name.\n for (const folderPath in fileStoreFolderPaths) {\n if (Object.hasOwn(fileStoreFolderPaths, folderPath)) {\n // eslint-disable-next-line security/detect-object-injection\n const folderPathNodes = fileStoreFolderPaths[folderPath];\n const folderPathNode = folderPathNodes?.find((folderPathNode) => folderPathNode.typeId === 'object' && folderPathNode.id === options.nodeId);\n if (folderPathNode) return Promise.resolve(folderPath); // Found, return folder path.\n }\n }\n return Promise.resolve(null); // Not found.\n }\n\n /**\n * Get a readable stream for the specified object node path.\n */\n async getReadableStream(options: GetReadableStreamOptions): Promise<ReadableStream<Uint8Array>> {\n // Create an abort controller and extract its signal.\n const { signal } = (this.abortController = new AbortController());\n\n try {\n const response = await fetch(`${URL_PREFIX}/fileStore${options.path}`, { signal });\n if (!response.ok) {\n throw await buildFetchError(response, `Failed to fetch '${options.path}' file.`, 'datapos-connector-file-store-emulator|Connector|getReadableStream');\n }\n if (response.body == null) {\n throw new OperationalError('Readable streams are not supported in this runtime.', 'datapos-connector-file-store-emulator|Connector|getReadableStream.unsupported');\n }\n\n // TODO: Remove after testing.\n const xxx = await addNumbersWithRust(12, 56);\n const sum = await checksumWithRust(this.config.version);\n console.log('sum', sum, xxx);\n\n return await Promise.resolve(response.body);\n } catch (error) {\n throw normalizeToError(error);\n } finally {\n this.abortController = undefined;\n }\n }\n\n /**\n * Lists all nodes (folders and objects) in the specified folder path.\n */\n listNodes(options: ListNodesOptions): Promise<ListNodesResult> {\n const fileStoreFolderPaths = fileStoreFolderPathData as FileStoreFolderPaths;\n const folderNodes = fileStoreFolderPaths[options.folderPath] ?? [];\n const connectionNodeConfigs: ConnectionNodeConfig[] = [];\n for (const folderNode of folderNodes) {\n if (folderNode.typeId === 'folder') {\n connectionNodeConfigs.push(constructFolderNodeConfig(options.folderPath, folderNode.name, folderNode.childCount));\n } else {\n connectionNodeConfigs.push(constructObjectNodeConfig(options.folderPath, folderNode.id, folderNode.name, folderNode.lastModifiedAt, folderNode.size));\n }\n }\n return Promise.resolve({ cursor: undefined, isMore: false, connectionNodeConfigs, totalCount: connectionNodeConfigs.length });\n }\n\n /**\n * Preview the contents of the object node with the specified path.\n */\n async previewObject(options: PreviewObjectOptions): Promise<PreviewConfig> {\n // Create an abort controller and extract its signal.\n const { signal } = (this.abortController = new AbortController());\n\n try {\n const asAt = Date.now();\n const startedAt = performance.now();\n\n // Preview file to determine file format and decode text.\n const fileOperatorsTool = await loadTool<FileOperatorsTool>(this.toolConfigs, 'file-operators');\n const filePreviewResult = await fileOperatorsTool.previewFile(`${URL_PREFIX}/fileStore${options.path}`, signal, options.chunkSize);\n if (filePreviewResult.dataFormatId == null) throw new Error(`File '${options.path}' has unknown type.`);\n if (filePreviewResult.text == null) throw new Error(`File '${options.path}' is empty.`);\n\n // Parse text, identify delimiters, and produce string value records.\n const csvParseTool = await loadTool<CSVParseTool>(this.toolConfigs, 'csv-parse');\n const parseTextResult = await csvParseTool.parseText(filePreviewResult.text, ORDERED_VALUE_DELIMITER_IDS);\n\n // Infer and cast values for each parsed record.\n const inferenceSummary = this.engineUtilities.inferDataTypes(parseTextResult.parsedRecords);\n\n return {\n asAt,\n columnConfigs: inferenceSummary.columnConfigs,\n dataFormatId: filePreviewResult.dataFormatId,\n duration: performance.now() - startedAt,\n encodingId: filePreviewResult.encodingId,\n encodingConfidenceLevel: filePreviewResult.encodingConfidenceLevel,\n fileType: filePreviewResult.fileTypeConfig,\n hasHeaders: inferenceSummary.hasHeaderRow,\n recordDelimiterId: parseTextResult.recordDelimiterId,\n parsedRecords: parseTextResult.parsedRecords,\n inferenceRecords: inferenceSummary.typedRecords,\n size: filePreviewResult.bytes.length,\n text: filePreviewResult.text,\n valueDelimiterId: parseTextResult.valueDelimiterId\n } as PreviewConfig;\n } catch (error) {\n throw normalizeToError(error);\n } finally {\n this.abortController = undefined;\n }\n }\n /**\n * Retrieves all records from a CSV object node using streaming and chunked processing.\n */\n async retrieveRecords(options: RetrieveRecordsOptions, chunk: (records: ParsingRecord[]) => void, complete: (result: RetrieveRecordsSummary) => void): Promise<void> {\n this.abortController = new AbortController();\n\n try {\n const csvParseTool = await loadTool<CSVParseTool>(this.toolConfigs, 'csv-parse');\n const parseStreamOptions = { delimiter: options.valueDelimiterId, info: true, relax_column_count: true, relax_quotes: true };\n const url = `${URL_PREFIX}/fileStore${options.path}`;\n const summary = await csvParseTool.parseStream(options, parseStreamOptions, url, this.abortController, chunk);\n complete(summary);\n } catch (error) {\n throw normalizeToError(error);\n } finally {\n this.abortController = undefined;\n }\n }\n\n //#endregion ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n}\n\n//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n//#region: Helpers.\n//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Construct folder node configuration.\n */\nfunction constructFolderNodeConfig(folderPath: string, name: string, childCount: number): ConnectionNodeConfig {\n return {\n childCount,\n childNodes: [],\n extension: undefined,\n folderPath,\n handle: undefined,\n id: nanoid(),\n label: name,\n lastModifiedAt: undefined,\n mimeType: undefined,\n name,\n size: undefined,\n typeId: 'folder'\n };\n}\n\n/**\n * Construct object (file) node configuration.\n */\nfunction constructObjectNodeConfig(folderPath: string, id: string, fullName: string, lastModifiedAt: number, size: number): ConnectionNodeConfig {\n const name = extractNameFromPath(fullName) ?? '';\n const extension = extractExtensionFromPath(fullName);\n const lastModifiedAtTimestamp = lastModifiedAt;\n const mimeType = lookupMimeTypeForExtension(extension);\n return {\n childCount: undefined,\n childNodes: [],\n extension,\n folderPath,\n handle: undefined,\n id,\n label: fullName,\n lastModifiedAt: lastModifiedAtTimestamp,\n mimeType,\n name,\n size,\n typeId: 'object'\n };\n}\n\n//#endregion ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n// Exposures.\nexport { Connector };\n"],"names":["urlAlphabet","nanoid","size","id","bytes","scopedUrlAlphabet","n","o","e","i","c","a","t","b","g","y","r","s","m","w","l","E","rustBindingsPromise","addNumbersWithRust","left","right","add_my_numbers","loadRustBindings","yyyy","checksumWithRust","input","checksum_from_rust","URL_PREFIX","Connector","engineUtilities","toolConfigs","config","options","chunk","stream","rustCsvTool","loadTool","options2","result","error","normalizeToError","fileStoreFolderPaths","fileStoreFolderPathData","folderPath","folderPathNode","signal","response","buildFetchError","OperationalError","xxx","sum","folderNodes","connectionNodeConfigs","folderNode","constructFolderNodeConfig","constructObjectNodeConfig","asAt","startedAt","filePreviewResult","parseTextResult","ORDERED_VALUE_DELIMITER_IDS","inferenceSummary","complete","csvParseTool","parseStreamOptions","url","summary","name","childCount","fullName","lastModifiedAt","extractNameFromPath","extension","extractExtensionFromPath","lastModifiedAtTimestamp","mimeType","lookupMimeTypeForExtension"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6]}
@@ -15,14 +15,6 @@ declare class Connector implements ConnectorInterface {
15
15
  * Abort the currently running operation.
16
16
  */
17
17
  abortOperation(): void;
18
- /**
19
- * Audit the content of a CSV file using Rust CSV parser.
20
- * Automatically selects the appropriate processing mode based on browser capabilities.
21
- */
22
- auditContent(path: string, supportsTransferableStreams: boolean, onProgress?: (rowCount: number) => void): Promise<{
23
- processedRowCount: number;
24
- durationMs?: number;
25
- }>;
26
18
  /**
27
19
  * Audit object content.
28
20
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "datapos-connector-file-store-emulator",
3
- "version": "0.2.441",
3
+ "version": "0.2.443",
4
4
  "license": "MIT",
5
5
  "author": "Jonathan Terrell <terrell.jm@gmail.com>",
6
6
  "private": false,
@@ -26,11 +26,11 @@
26
26
  ],
27
27
  "prettier": "@datapos/datapos-development/prettierrc",
28
28
  "dependencies": {
29
- "@datapos/datapos-shared": "^0.3.527",
29
+ "@datapos/datapos-shared": "^0.3.528",
30
30
  "nanoid": "^5.1.6"
31
31
  },
32
32
  "devDependencies": {
33
- "@datapos/datapos-development": "^0.3.442",
33
+ "@datapos/datapos-development": "^0.3.443",
34
34
  "@datapos/datapos-tool-csv-parse": "^0.0.130",
35
35
  "@datapos/datapos-tool-file-operators": "^0.0.16",
36
36
  "@datapos/datapos-tool-rust-csv-core": "^0.1.17",