opfs-worker 1.2.3 → 1.2.4

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.
package/dist/raw.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { expose as A, transfer as m } from "comlink";
2
- import { O as o, o as g, g as C, n as F, s as p, P as b, w as f, F as E, j as H, W as l, h as v, k as D, u as $, y as T, r as S, l as O, C as N, A as I, z as x, B as P, f as u, x as _ } from "./helpers-BXhw_-Ar.js";
2
+ import { O as o, o as g, g as C, n as F, s as p, P as b, w as f, F as E, j as H, W as l, h as v, k as D, u as $, y as T, r as S, l as O, C as N, A as I, z as x, B as P, f as u, x as _ } from "./helpers-BwklIUit.js";
3
3
  class k {
4
4
  /** Root directory handle for the file system */
5
5
  root;
@@ -14,7 +14,7 @@ class k {
14
14
  root: "/",
15
15
  namespace: "",
16
16
  maxFileSize: 50 * 1024 * 1024,
17
- hashAlgorithm: !1,
17
+ hashAlgorithm: "etag",
18
18
  broadcastChannel: "opfs-worker"
19
19
  };
20
20
  /** Map of open file descriptors to their metadata */
@@ -46,10 +46,10 @@ class k {
46
46
  const e = t.path;
47
47
  if (![...this.watchers.values()].some((r) => g(e, r.pattern) && r.include.some((s) => s && g(e, s)) && !r.exclude.some((s) => s && g(e, s))))
48
48
  return;
49
- let a;
49
+ let i;
50
50
  if (this.options.hashAlgorithm)
51
51
  try {
52
- a = (await this.stat(e)).hash;
52
+ i = (await this.stat(e)).hash;
53
53
  } catch {
54
54
  }
55
55
  try {
@@ -58,7 +58,7 @@ class k {
58
58
  namespace: this.options.namespace,
59
59
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
60
60
  ...t,
61
- ...a && { hash: a }
61
+ ...i && { hash: i }
62
62
  };
63
63
  this.broadcastChannel.postMessage(r);
64
64
  } catch (r) {
@@ -101,12 +101,12 @@ class k {
101
101
  */
102
102
  async mount() {
103
103
  const t = this.options.root;
104
- return this.mountingPromise && await this.mountingPromise, this.mountingPromise = new Promise(async (e, i) => {
104
+ return this.mountingPromise && await this.mountingPromise, this.mountingPromise = new Promise(async (e, a) => {
105
105
  try {
106
- const a = await navigator.storage.getDirectory();
107
- this.root = t === "/" ? a : await this.getDirectoryHandle(t, !0, a), e(!0);
108
- } catch (a) {
109
- i(new o("Failed to initialize OPFS", "INIT_FAILED", t, a));
106
+ const i = await navigator.storage.getDirectory();
107
+ this.root = t === "/" ? i : await this.getDirectoryHandle(t, !0, i), e(!0);
108
+ } catch (i) {
109
+ a(new o("Failed to initialize OPFS", "INIT_FAILED", t, i));
110
110
  } finally {
111
111
  this.mountingPromise = null;
112
112
  }
@@ -143,10 +143,10 @@ class k {
143
143
  * const docsDir2 = await fs.getDirectoryHandle(['users', 'john', 'documents'], true);
144
144
  * ```
145
145
  */
146
- async getDirectoryHandle(t, e = !1, i = this.root) {
147
- const a = Array.isArray(t) ? t : p(t);
148
- let r = i;
149
- for (const s of a)
146
+ async getDirectoryHandle(t, e = !1, a = this.root) {
147
+ const i = Array.isArray(t) ? t : p(t);
148
+ let r = a;
149
+ for (const s of i)
150
150
  r = await r.getDirectoryHandle(s, { create: e });
151
151
  return r;
152
152
  }
@@ -169,12 +169,12 @@ class k {
169
169
  * const fileHandle2 = await fs.getFileHandle(['config', 'settings.json'], true);
170
170
  * ```
171
171
  */
172
- async getFileHandle(t, e = !1, i = this.root) {
173
- const a = p(t);
174
- if (a.length === 0)
172
+ async getFileHandle(t, e = !1, a = this.root) {
173
+ const i = p(t);
174
+ if (i.length === 0)
175
175
  throw new b("Path must not be empty", Array.isArray(t) ? t.join("/") : t);
176
- const r = a.pop();
177
- return (await this.getDirectoryHandle(a, e, i)).getFileHandle(r, { create: e });
176
+ const r = i.pop();
177
+ return (await this.getDirectoryHandle(i, e, a)).getFileHandle(r, { create: e });
178
178
  }
179
179
  /**
180
180
  * Get a complete index of all files and directories in the file system
@@ -196,10 +196,10 @@ class k {
196
196
  * ```
197
197
  */
198
198
  async index() {
199
- const t = /* @__PURE__ */ new Map(), e = async (i) => {
200
- const a = await this.readDir(i);
201
- for (const r of a) {
202
- const s = `${i === "/" ? "" : i}/${r.name}`;
199
+ const t = /* @__PURE__ */ new Map(), e = async (a) => {
200
+ const i = await this.readDir(a);
201
+ for (const r of i) {
202
+ const s = `${a === "/" ? "" : a}/${r.name}`;
203
203
  try {
204
204
  const n = await this.stat(s);
205
205
  t.set(s, n), n.isDirectory && await e(s);
@@ -242,8 +242,8 @@ class k {
242
242
  return await f(t, "shared", async () => {
243
243
  const e = await this.open(t);
244
244
  try {
245
- const { size: i } = await this.fstat(e), a = new Uint8Array(i);
246
- return i > 0 && await this.read(e, a, 0, i, 0), m(a, [a.buffer]);
245
+ const { size: a } = await this.fstat(e), i = new Uint8Array(a);
246
+ return a > 0 && await this.read(e, i, 0, a, 0), m(i, [i.buffer]);
247
247
  } finally {
248
248
  await this.close(e);
249
249
  }
@@ -276,15 +276,15 @@ class k {
276
276
  */
277
277
  async writeFile(t, e) {
278
278
  await this.mount();
279
- const i = e instanceof Uint8Array ? e : new Uint8Array(e);
279
+ const a = e instanceof Uint8Array ? e : new Uint8Array(e);
280
280
  await f(t, "exclusive", async () => {
281
- const a = await this.exists(t), r = await this.open(t, { create: !0, truncate: !0 });
281
+ const i = await this.exists(t), r = await this.open(t, { create: !0, truncate: !0 });
282
282
  try {
283
- await this.write(r, i, 0, i.length, null, !1), await this.fsync(r);
283
+ await this.write(r, a, 0, a.length, null, !1), await this.fsync(r);
284
284
  } finally {
285
285
  await this.close(r);
286
286
  }
287
- await this.notifyChange({ path: t, type: a ? l.Changed : l.Added, isDirectory: !1 });
287
+ await this.notifyChange({ path: t, type: i ? l.Changed : l.Added, isDirectory: !1 });
288
288
  });
289
289
  }
290
290
  /**
@@ -311,14 +311,14 @@ class k {
311
311
  */
312
312
  async appendFile(t, e) {
313
313
  await this.mount();
314
- const i = e instanceof Uint8Array ? e : new Uint8Array(e);
314
+ const a = e instanceof Uint8Array ? e : new Uint8Array(e);
315
315
  await f(t, "exclusive", async () => {
316
- const a = await this.open(t, { create: !0 });
316
+ const i = await this.open(t, { create: !0 });
317
317
  try {
318
- const { size: r } = await this.fstat(a);
319
- await this.write(a, i, 0, i.length, r, !1), await this.fsync(a);
318
+ const { size: r } = await this.fstat(i);
319
+ await this.write(i, a, 0, a.length, r, !1), await this.fsync(i);
320
320
  } finally {
321
- await this.close(a);
321
+ await this.close(i);
322
322
  }
323
323
  await this.notifyChange({ path: t, type: l.Changed, isDirectory: !1 });
324
324
  });
@@ -346,15 +346,15 @@ class k {
346
346
  */
347
347
  async mkdir(t, e) {
348
348
  await this.mount();
349
- const i = e?.recursive ?? !1, a = p(t);
349
+ const a = e?.recursive ?? !1, i = p(t);
350
350
  let r = this.root;
351
- for (let s = 0; s < a.length; s++) {
352
- const n = a[s];
351
+ for (let s = 0; s < i.length; s++) {
352
+ const n = i[s];
353
353
  try {
354
- r = await r.getDirectoryHandle(n, { create: i || s === a.length - 1 });
354
+ r = await r.getDirectoryHandle(n, { create: a || s === i.length - 1 });
355
355
  } catch (c) {
356
356
  throw c.name === "NotFoundError" ? new o(
357
- `Parent directory does not exist: ${H(a.slice(0, s + 1))}`,
357
+ `Parent directory does not exist: ${H(i.slice(0, s + 1))}`,
358
358
  "ENOENT",
359
359
  void 0,
360
360
  c
@@ -395,9 +395,9 @@ class k {
395
395
  isFile: !1,
396
396
  isDirectory: !0
397
397
  };
398
- const e = v(t), i = await this.getDirectoryHandle(D(t), !1), a = this.options.hashAlgorithm !== null;
398
+ const e = v(t), a = await this.getDirectoryHandle(D(t), !1), i = this.options.hashAlgorithm;
399
399
  try {
400
- const s = await (await i.getFileHandle(e, { create: !1 })).getFile(), n = {
400
+ const s = await (await a.getFileHandle(e, { create: !1 })).getFile(), n = {
401
401
  kind: "file",
402
402
  size: s.size,
403
403
  mtime: new Date(s.lastModified).toISOString(),
@@ -405,9 +405,11 @@ class k {
405
405
  isFile: !0,
406
406
  isDirectory: !1
407
407
  };
408
- if (a && this.options.hashAlgorithm)
408
+ if (i === "etag")
409
+ n.hash = `${s.lastModified.toString(36)}-${s.size.toString(36)}`;
410
+ else if (typeof i == "string")
409
411
  try {
410
- const c = await $(s, this.options.hashAlgorithm, this.options.maxFileSize);
412
+ const c = await $(s, i, this.options.maxFileSize);
411
413
  n.hash = c;
412
414
  } catch (c) {
413
415
  console.warn(`Failed to calculate hash for ${t}:`, c);
@@ -418,7 +420,7 @@ class k {
418
420
  throw new o("Failed to stat (file)", "STAT_FAILED", void 0, r);
419
421
  }
420
422
  try {
421
- return await i.getDirectoryHandle(e, { create: !1 }), {
423
+ return await a.getDirectoryHandle(e, { create: !1 }), {
422
424
  kind: "directory",
423
425
  size: 0,
424
426
  mtime: (/* @__PURE__ */ new Date(0)).toISOString(),
@@ -450,17 +452,17 @@ class k {
450
452
  */
451
453
  async readDir(t) {
452
454
  await this.mount();
453
- const e = await this.getDirectoryHandle(t, !1), i = [];
454
- for await (const [a, r] of e.entries()) {
455
+ const e = await this.getDirectoryHandle(t, !1), a = [];
456
+ for await (const [i, r] of e.entries()) {
455
457
  const s = r.kind === "file";
456
- i.push({
457
- name: a,
458
+ a.push({
459
+ name: i,
458
460
  kind: r.kind,
459
461
  isFile: s,
460
462
  isDirectory: !s
461
463
  });
462
464
  }
463
- return i;
465
+ return a;
464
466
  }
465
467
  /**
466
468
  * Check if a file or directory exists
@@ -480,22 +482,22 @@ class k {
480
482
  if (await this.mount(), t === "/")
481
483
  return !0;
482
484
  const e = v(t);
483
- let i = null;
485
+ let a = null;
484
486
  try {
485
- i = await this.getDirectoryHandle(D(t), !1);
486
- } catch (a) {
487
- if (i = null, a.name !== "NotFoundError" && a.name !== "TypeMismatchError")
488
- throw a;
487
+ a = await this.getDirectoryHandle(D(t), !1);
488
+ } catch (i) {
489
+ if (a = null, i.name !== "NotFoundError" && i.name !== "TypeMismatchError")
490
+ throw i;
489
491
  }
490
- if (!i || !e)
492
+ if (!a || !e)
491
493
  return !1;
492
494
  try {
493
- return await i.getFileHandle(e, { create: !1 }), !0;
494
- } catch (a) {
495
- if (a.name !== "NotFoundError" && a.name !== "TypeMismatchError")
496
- throw a;
495
+ return await a.getFileHandle(e, { create: !1 }), !0;
496
+ } catch (i) {
497
+ if (i.name !== "NotFoundError" && i.name !== "TypeMismatchError")
498
+ throw i;
497
499
  try {
498
- return await i.getDirectoryHandle(e, { create: !1 }), !0;
500
+ return await a.getDirectoryHandle(e, { create: !1 }), !0;
499
501
  } catch (r) {
500
502
  if (r.name !== "NotFoundError" && r.name !== "TypeMismatchError")
501
503
  throw r;
@@ -526,9 +528,9 @@ class k {
526
528
  await this.mount();
527
529
  try {
528
530
  const e = await this.readDir(t);
529
- for (const i of e) {
530
- const a = `${t === "/" ? "" : t}/${i.name}`;
531
- await this.remove(a, { recursive: !0 });
531
+ for (const a of e) {
532
+ const i = `${t === "/" ? "" : t}/${a.name}`;
533
+ await this.remove(i, { recursive: !0 });
532
534
  }
533
535
  await this.notifyChange({ path: t, type: l.Changed, isDirectory: !0 });
534
536
  } catch (e) {
@@ -562,8 +564,8 @@ class k {
562
564
  async remove(t, e) {
563
565
  if (await this.mount(), t === "/")
564
566
  throw new o("Cannot remove root directory", "EROOT");
565
- const { recursive: i = !1, force: a = !1 } = e || {}, r = await this.getDirectoryHandle(D(t), !1), s = await this.stat(t);
566
- await T(r, t, { recursive: i, force: a }), await this.notifyChange({ path: t, type: l.Removed, isDirectory: s.isDirectory });
567
+ const { recursive: a = !1, force: i = !1 } = e || {}, r = await this.getDirectoryHandle(D(t), !1), s = await this.stat(t);
568
+ await T(r, t, { recursive: a, force: i }), await this.notifyChange({ path: t, type: l.Removed, isDirectory: s.isDirectory });
567
569
  }
568
570
  /**
569
571
  * Resolve a path to an absolute path
@@ -616,15 +618,15 @@ class k {
616
618
  * await fs.rename('/old/path/file.txt', '/new/path/renamed.txt', { overwrite: true });
617
619
  * ```
618
620
  */
619
- async rename(t, e, i) {
621
+ async rename(t, e, a) {
620
622
  await this.mount();
621
623
  try {
622
- const a = i?.overwrite ?? !1, r = await this.stat(t);
623
- if (await this.exists(e) && !a)
624
+ const i = a?.overwrite ?? !1, r = await this.stat(t);
625
+ if (await this.exists(e) && !i)
624
626
  throw new o(`Destination already exists: ${e}`, "EEXIST", void 0);
625
- await this.copy(t, e, { recursive: !0, overwrite: a }), await this.remove(t, { recursive: !0 }), await this.notifyChange({ path: t, type: l.Removed, isDirectory: r.isDirectory }), await this.notifyChange({ path: e, type: l.Added, isDirectory: r.isDirectory });
626
- } catch (a) {
627
- throw a instanceof o ? a : new o(`Failed to rename from ${t} to ${e}`, "RENAME_FAILED", void 0, a);
627
+ await this.copy(t, e, { recursive: !0, overwrite: i }), await this.remove(t, { recursive: !0 }), await this.notifyChange({ path: t, type: l.Removed, isDirectory: r.isDirectory }), await this.notifyChange({ path: e, type: l.Added, isDirectory: r.isDirectory });
628
+ } catch (i) {
629
+ throw i instanceof o ? i : new o(`Failed to rename from ${t} to ${e}`, "RENAME_FAILED", void 0, i);
628
630
  }
629
631
  }
630
632
  /**
@@ -652,10 +654,10 @@ class k {
652
654
  * await fs.copy('/source', '/dest', { recursive: true, overwrite: false });
653
655
  * ```
654
656
  */
655
- async copy(t, e, i) {
657
+ async copy(t, e, a) {
656
658
  await this.mount();
657
659
  try {
658
- const a = i?.recursive ?? !1, r = i?.overwrite ?? !0;
660
+ const i = a?.recursive ?? !1, r = a?.overwrite ?? !0;
659
661
  if (!await this.exists(t))
660
662
  throw new o(`Source does not exist: ${t}`, "ENOENT", void 0);
661
663
  if (await this.exists(e) && !r)
@@ -664,7 +666,7 @@ class k {
664
666
  const h = await this.readFile(t);
665
667
  await this.writeFile(e, h);
666
668
  } else {
667
- if (!a)
669
+ if (!i)
668
670
  throw new o(`Cannot copy directory without recursive option: ${t}`, "EISDIR", void 0);
669
671
  await this.mkdir(e, { recursive: !0 });
670
672
  const h = await this.readDir(t);
@@ -673,8 +675,8 @@ class k {
673
675
  await this.copy(d, y, { recursive: !0, overwrite: r });
674
676
  }
675
677
  }
676
- } catch (a) {
677
- throw a instanceof o ? a : new o(`Failed to copy from ${t} to ${e}`, "CP_FAILED", void 0, a);
678
+ } catch (i) {
679
+ throw i instanceof o ? i : new o(`Failed to copy from ${t} to ${e}`, "CP_FAILED", void 0, i);
678
680
  }
679
681
  }
680
682
  /**
@@ -705,12 +707,12 @@ class k {
705
707
  async watch(t, e) {
706
708
  if (!this.options.broadcastChannel)
707
709
  throw new o("This instance is not configured to send events. Please specify options.broadcastChannel to enable watching.", "ENOENT");
708
- const i = {
710
+ const a = {
709
711
  pattern: O(t, e?.recursive ?? !0),
710
712
  include: Array.isArray(e?.include) ? e.include : [e?.include ?? "**"],
711
713
  exclude: Array.isArray(e?.exclude) ? e.exclude : [e?.exclude ?? ""]
712
714
  };
713
- this.watchers.set(t, i);
715
+ this.watchers.set(t, a);
714
716
  }
715
717
  /**
716
718
  * Stop watching a previously watched path
@@ -747,13 +749,13 @@ class k {
747
749
  */
748
750
  async open(t, e) {
749
751
  await this.mount();
750
- const { create: i = !1, exclusive: a = !1, truncate: r = !1 } = e || {}, s = F(S(t));
752
+ const { create: a = !1, exclusive: i = !1, truncate: r = !1 } = e || {}, s = F(S(t));
751
753
  try {
752
- return i && a ? await f(s, "exclusive", async () => {
754
+ return a && i ? await f(s, "exclusive", async () => {
753
755
  if (await this.exists(s))
754
756
  throw new o(`File already exists: ${s}`, "EEXIST", s);
755
- return this._openFile(s, i, r);
756
- }) : await this._openFile(s, i, r);
757
+ return this._openFile(s, a, r);
758
+ }) : await this._openFile(s, a, r);
757
759
  } catch (n) {
758
760
  throw n instanceof o ? n : new o(`Failed to open file: ${s}`, "OPEN_FAILED", s, n);
759
761
  }
@@ -762,19 +764,19 @@ class k {
762
764
  * Internal method to open a file (without locking)
763
765
  * @private
764
766
  */
765
- async _openFile(t, e, i) {
766
- const a = await this.getFileHandle(t, e);
767
+ async _openFile(t, e, a) {
768
+ const i = await this.getFileHandle(t, e);
767
769
  try {
768
- await a.getFile();
770
+ await i.getFile();
769
771
  } catch (n) {
770
772
  throw n.name === "TypeMismatchError" ? new o(`Is a directory: ${t}`, "EISDIR", t) : n;
771
773
  }
772
- const r = await N(a, t);
773
- i && (r.truncate(0), r.flush());
774
+ const r = await N(i, t);
775
+ a && (r.truncate(0), r.flush());
774
776
  const s = this.nextFd++;
775
777
  return this.openFiles.set(s, {
776
778
  path: t,
777
- fileHandle: a,
779
+ fileHandle: i,
778
780
  syncHandle: r,
779
781
  position: 0
780
782
  }), s;
@@ -821,14 +823,14 @@ class k {
821
823
  * await fs.close(fd);
822
824
  * ```
823
825
  */
824
- async read(t, e, i, a, r) {
826
+ async read(t, e, a, i, r) {
825
827
  const s = this._getFileDescriptor(t);
826
- x(e.length, i, a, r);
828
+ x(e.length, a, i, r);
827
829
  try {
828
- const n = r ?? s.position, c = s.syncHandle.getSize(), { isEOF: h, actualLength: w } = P(n, a, c);
830
+ const n = r ?? s.position, c = s.syncHandle.getSize(), { isEOF: h, actualLength: w } = P(n, i, c);
829
831
  if (h)
830
832
  return m({ bytesRead: 0, buffer: e }, [e.buffer]);
831
- const d = e.subarray(i, i + w), y = s.syncHandle.read(d, { at: n });
833
+ const d = e.subarray(a, a + w), y = s.syncHandle.read(d, { at: n });
832
834
  return r == null && (s.position = n + y), m({ bytesRead: y, buffer: e }, [e.buffer]);
833
835
  } catch (n) {
834
836
  throw u("read", t, s.path, n);
@@ -855,11 +857,11 @@ class k {
855
857
  * await fs.close(fd);
856
858
  * ```
857
859
  */
858
- async write(t, e, i = 0, a, r, s = !0) {
859
- const n = this._getFileDescriptor(t), c = a ?? e.length - i;
860
- x(e.length, i, c, r);
860
+ async write(t, e, a = 0, i, r, s = !0) {
861
+ const n = this._getFileDescriptor(t), c = i ?? e.length - a;
862
+ x(e.length, a, c, r);
861
863
  try {
862
- const h = r ?? n.position, w = e.subarray(i, i + c), d = n.syncHandle.write(w, { at: h });
864
+ const h = r ?? n.position, w = e.subarray(a, a + c), d = n.syncHandle.write(w, { at: h });
863
865
  return (r == null || r === n.position) && (n.position = h + d), s && await this.notifyChange({ path: n.path, type: l.Changed, isDirectory: !1 }), d;
864
866
  } catch (h) {
865
867
  throw u("write", t, n.path, h);
@@ -904,13 +906,13 @@ class k {
904
906
  * ```
905
907
  */
906
908
  async ftruncate(t, e = 0) {
907
- const i = this._getFileDescriptor(t);
909
+ const a = this._getFileDescriptor(t);
908
910
  if (e < 0 || !Number.isInteger(e))
909
911
  throw new o("Invalid size", "EINVAL");
910
912
  try {
911
- i.syncHandle.truncate(e), i.syncHandle.flush(), i.position > e && (i.position = e), await this.notifyChange({ path: i.path, type: l.Changed, isDirectory: !1 });
912
- } catch (a) {
913
- throw u("truncate", t, i.path, a);
913
+ a.syncHandle.truncate(e), a.syncHandle.flush(), a.position > e && (a.position = e), await this.notifyChange({ path: a.path, type: l.Changed, isDirectory: !1 });
914
+ } catch (i) {
915
+ throw u("truncate", t, a.path, i);
914
916
  }
915
917
  }
916
918
  /**
@@ -931,8 +933,8 @@ class k {
931
933
  const e = this._getFileDescriptor(t);
932
934
  try {
933
935
  e.syncHandle.flush();
934
- } catch (i) {
935
- throw u("sync", t, e.path, i);
936
+ } catch (a) {
937
+ throw u("sync", t, e.path, a);
936
938
  }
937
939
  }
938
940
  /**
@@ -978,10 +980,10 @@ class k {
978
980
  async createIndex(t) {
979
981
  await this.mount();
980
982
  try {
981
- for (const [e, i] of t) {
982
- const a = F(e);
983
+ for (const [e, a] of t) {
984
+ const i = F(e);
983
985
  let r;
984
- i instanceof Blob ? r = await _(i) : typeof i == "string" ? r = new TextEncoder().encode(i) : r = i, await this.writeFile(a, r);
986
+ a instanceof Blob ? r = await _(a) : typeof a == "string" ? r = new TextEncoder().encode(a) : r = a, await this.writeFile(i, r);
985
987
  }
986
988
  } catch (e) {
987
989
  throw e instanceof o ? e : new o("Failed to sync file system", "SYNC_FAILED", void 0, e);