opfs-worker 2.0.0 → 2.1.1

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.
Files changed (134) hide show
  1. package/README.md +64 -428
  2. package/dist/BaseOPFS-BusBkyJX.js +2114 -0
  3. package/dist/BaseOPFS-BusBkyJX.js.map +1 -0
  4. package/dist/BaseOPFS-CYwrD7-q.cjs +4 -0
  5. package/dist/BaseOPFS-CYwrD7-q.cjs.map +1 -0
  6. package/dist/OPFSAsync-B2dR-2VR.cjs +2 -0
  7. package/dist/OPFSAsync-B2dR-2VR.cjs.map +1 -0
  8. package/dist/OPFSAsync-CO44W23e.js +124 -0
  9. package/dist/OPFSAsync-CO44W23e.js.map +1 -0
  10. package/dist/OPFSFacade-CEaSqTut.js +308 -0
  11. package/dist/OPFSFacade-CEaSqTut.js.map +1 -0
  12. package/dist/OPFSFacade-hrNXCn6w.cjs +2 -0
  13. package/dist/OPFSFacade-hrNXCn6w.cjs.map +1 -0
  14. package/dist/OPFSSync-BPrNtvFS.cjs +2 -0
  15. package/dist/OPFSSync-BPrNtvFS.cjs.map +1 -0
  16. package/dist/OPFSSync-D7obTsl3.js +208 -0
  17. package/dist/OPFSSync-D7obTsl3.js.map +1 -0
  18. package/dist/assets/dedicated.worker-DW6UqFo0.js.map +1 -0
  19. package/dist/{OPFSWorker.d.ts → core/BaseOPFS.d.ts} +53 -292
  20. package/dist/core/BaseOPFS.d.ts.map +1 -0
  21. package/dist/core/OPFSAsync.d.ts +55 -0
  22. package/dist/core/OPFSAsync.d.ts.map +1 -0
  23. package/dist/core/OPFSSync.d.ts +54 -0
  24. package/dist/core/OPFSSync.d.ts.map +1 -0
  25. package/dist/createOPFSAsync-DdhJYoC0.js +10 -0
  26. package/dist/createOPFSAsync-DdhJYoC0.js.map +1 -0
  27. package/dist/createOPFSAsync-DyWpvmL-.cjs +2 -0
  28. package/dist/createOPFSAsync-DyWpvmL-.cjs.map +1 -0
  29. package/dist/createOPFSDedicated-BwTc0NV5.js +2407 -0
  30. package/dist/createOPFSDedicated-BwTc0NV5.js.map +1 -0
  31. package/dist/createOPFSDedicated-CEeRexom.cjs +2357 -0
  32. package/dist/createOPFSDedicated-CEeRexom.cjs.map +1 -0
  33. package/dist/createOPFSShared-BSFWsoLe.js +23 -0
  34. package/dist/createOPFSShared-BSFWsoLe.js.map +1 -0
  35. package/dist/createOPFSShared-BoCft_BS.cjs +2 -0
  36. package/dist/createOPFSShared-BoCft_BS.cjs.map +1 -0
  37. package/dist/dedicated.worker.js +2355 -0
  38. package/dist/dedicated.worker.js.map +1 -0
  39. package/dist/{OPFSFacade.d.ts → facade/OPFSFacade.d.ts} +51 -25
  40. package/dist/facade/OPFSFacade.d.ts.map +1 -0
  41. package/dist/facade/createOPFSAsync.d.ts +16 -0
  42. package/dist/facade/createOPFSAsync.d.ts.map +1 -0
  43. package/dist/facade/createOPFSDedicated.d.ts +17 -0
  44. package/dist/facade/createOPFSDedicated.d.ts.map +1 -0
  45. package/dist/facade/createOPFSShared.d.ts +24 -0
  46. package/dist/facade/createOPFSShared.d.ts.map +1 -0
  47. package/dist/index.async.cjs +2 -0
  48. package/dist/index.async.cjs.map +1 -0
  49. package/dist/index.async.d.ts +10 -0
  50. package/dist/index.async.d.ts.map +1 -0
  51. package/dist/index.async.js +55 -0
  52. package/dist/index.async.js.map +1 -0
  53. package/dist/index.cjs +1 -2477
  54. package/dist/index.cjs.map +1 -1
  55. package/dist/index.d.ts +17 -3
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +61 -2828
  58. package/dist/index.js.map +1 -1
  59. package/dist/index.pure.cjs +1 -1
  60. package/dist/index.pure.cjs.map +1 -1
  61. package/dist/index.pure.d.ts +3 -1
  62. package/dist/index.pure.d.ts.map +1 -1
  63. package/dist/index.pure.js +50 -1053
  64. package/dist/index.pure.js.map +1 -1
  65. package/dist/index.sharedworker.cjs +2 -0
  66. package/dist/index.sharedworker.cjs.map +1 -0
  67. package/dist/index.sharedworker.d.ts +11 -0
  68. package/dist/index.sharedworker.d.ts.map +1 -0
  69. package/dist/index.sharedworker.js +55 -0
  70. package/dist/index.sharedworker.js.map +1 -0
  71. package/dist/index.sync.cjs +2 -0
  72. package/dist/index.sync.cjs.map +1 -0
  73. package/dist/index.sync.d.ts +11 -0
  74. package/dist/index.sync.d.ts.map +1 -0
  75. package/dist/index.sync.js +55 -0
  76. package/dist/index.sync.js.map +1 -0
  77. package/dist/shared.worker.js +2240 -0
  78. package/dist/shared.worker.js.map +1 -0
  79. package/dist/types.d.ts +42 -4
  80. package/dist/types.d.ts.map +1 -1
  81. package/dist/worker/createDedicatedWorker.d.ts +30 -0
  82. package/dist/worker/createDedicatedWorker.d.ts.map +1 -0
  83. package/dist/worker/createSharedWorker.d.ts +37 -0
  84. package/dist/worker/createSharedWorker.d.ts.map +1 -0
  85. package/dist/worker/dedicated.worker.d.ts +2 -0
  86. package/dist/worker/dedicated.worker.d.ts.map +1 -0
  87. package/dist/worker/shared.worker.d.ts +2 -0
  88. package/dist/worker/shared.worker.d.ts.map +1 -0
  89. package/docs/api/backend.md +36 -0
  90. package/docs/api/create.md +82 -0
  91. package/docs/api/facade.md +53 -0
  92. package/docs/choosing-a-mode.md +41 -0
  93. package/docs/file-descriptors.md +46 -605
  94. package/docs/guides/async.md +36 -0
  95. package/docs/guides/dedicated.md +76 -0
  96. package/docs/guides/hashing.md +34 -0
  97. package/docs/guides/pure.md +46 -0
  98. package/docs/guides/sharedworker.md +57 -0
  99. package/docs/guides/streaming.md +185 -0
  100. package/docs/guides/watching.md +35 -0
  101. package/docs/migration.md +41 -0
  102. package/docs/types.md +105 -153
  103. package/package.json +53 -4
  104. package/src/{OPFSWorker.ts → core/BaseOPFS.ts} +159 -629
  105. package/src/core/OPFSAsync.ts +248 -0
  106. package/src/core/OPFSSync.ts +460 -0
  107. package/src/{OPFSFacade.ts → facade/OPFSFacade.ts} +134 -58
  108. package/src/facade/createOPFSAsync.ts +22 -0
  109. package/src/facade/createOPFSDedicated.ts +23 -0
  110. package/src/facade/createOPFSShared.ts +30 -0
  111. package/src/index.async.ts +11 -0
  112. package/src/index.pure.ts +3 -2
  113. package/src/index.sharedworker.ts +12 -0
  114. package/src/index.sync.ts +12 -0
  115. package/src/index.ts +37 -8
  116. package/src/types.ts +45 -4
  117. package/src/worker/createDedicatedWorker.ts +74 -0
  118. package/src/worker/createSharedWorker.ts +67 -0
  119. package/src/worker/dedicated.worker.ts +13 -0
  120. package/src/worker/shared.worker.ts +17 -0
  121. package/dist/OPFSFacade.d.ts.map +0 -1
  122. package/dist/OPFSWorker.d.ts.map +0 -1
  123. package/dist/assets/worker.entry-DUlEoroc.js.map +0 -1
  124. package/dist/createOPFSWorker.d.ts +0 -17
  125. package/dist/createOPFSWorker.d.ts.map +0 -1
  126. package/dist/helpers-DNj8ZoMu.cjs +0 -4
  127. package/dist/helpers-DNj8ZoMu.cjs.map +0 -1
  128. package/dist/helpers-WY2jfbOT.js +0 -1427
  129. package/dist/helpers-WY2jfbOT.js.map +0 -1
  130. package/dist/worker.entry.d.ts +0 -2
  131. package/dist/worker.entry.d.ts.map +0 -1
  132. package/docs/api-reference.md +0 -815
  133. package/src/createOPFSWorker.ts +0 -57
  134. package/src/worker.entry.ts +0 -6
package/dist/types.d.ts CHANGED
@@ -1,5 +1,4 @@
1
- import type { OPFSWorker } from './OPFSWorker';
2
- import type { Remote } from 'comlink';
1
+ import type { OPFSSync } from './core/OPFSSync';
3
2
  /**
4
3
  * Type for paths that can be either a string or URI
5
4
  */
@@ -37,8 +36,14 @@ export interface WatchEvent {
37
36
  timestamp: string;
38
37
  hash?: string;
39
38
  }
40
- export type { OPFSWorker };
41
- export type RemoteOPFSWorker = Remote<OPFSWorker>;
39
+ export type { OPFSSync };
40
+ /**
41
+ * Promise-based fs API surface shared by all backends: a Comlink proxy to
42
+ * `OPFSSync` in a worker, or an in-process `OPFSAsync` instance.
43
+ */
44
+ export type OPFSApi = {
45
+ [K in keyof OPFSSync]: OPFSSync[K];
46
+ };
42
47
  export interface OPFSOptions {
43
48
  /** Root path for the file system (default: '/') */
44
49
  root?: string;
@@ -51,6 +56,39 @@ export interface OPFSOptions {
51
56
  /** Custom name for the broadcast channel (default: 'opfs-worker') */
52
57
  broadcastChannel?: string | BroadcastChannel | null;
53
58
  }
59
+ /** Payload accepted by {@link importFiles} for a single entry. */
60
+ export type ImportFileData = string | Uint8Array | Blob;
61
+ /**
62
+ * Entries for {@link importFiles}: an array of `[path, data]` tuples, a `Map`,
63
+ * or any iterable that yields the same pairs.
64
+ */
65
+ export type ImportFilesEntries = Iterable<[string, ImportFileData]> | Map<string, ImportFileData>;
66
+ /** Progress event fired while {@link importFiles} writes entries. */
67
+ export interface ImportFilesProgress {
68
+ /** Path of the file currently being written */
69
+ path: string;
70
+ /** 0-based index of the current file */
71
+ index: number;
72
+ /** Total number of entries in this import */
73
+ count: number;
74
+ /** Bytes written for the current file so far */
75
+ bytesWritten: number;
76
+ /** Size of the current file in bytes */
77
+ bytesTotal: number;
78
+ /** Bytes written across all files so far */
79
+ totalBytesWritten: number;
80
+ /** Sum of all entry sizes in bytes */
81
+ totalBytes: number;
82
+ }
83
+ /** Result of a finished {@link importFiles} call. */
84
+ export interface ImportFilesResult {
85
+ /** Paths written, in import order */
86
+ paths: string[];
87
+ /** Number of files imported (`paths.length`) */
88
+ count: number;
89
+ /** Total bytes written across all files */
90
+ bytesWritten: number;
91
+ }
54
92
  export interface RenameOptions {
55
93
  /** Whether to overwrite existing files (default: false) */
56
94
  overwrite?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,GAAG,CAAC;AAEpC,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,WAAW,CAAC;AAExC,MAAM,MAAM,cAAc,GAAG,OAAO,GAChC,MAAM,GACN,OAAO,GACP,SAAS,GACT,UAAU,GACV,MAAM,GACN,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,KAAK,CAAC;AAEV,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;AAEtC,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,cAAc,CAAC;AAEvD,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACxB;AAED,oBAAY,cAAc;IACtB,KAAK,UAAU;IACf,OAAO,YAAY;IACnB,OAAO,YAAY;CACtB;AAED,MAAM,WAAW,UAAU;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,YAAY,EAAE,UAAU,EAAE,CAAC;AAC3B,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAElD,MAAM,WAAW,WAAW;IACxB,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,aAAa,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACpF,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAC;CACvD;AAED,MAAM,WAAW,aAAa;IAC1B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IACzB,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACrB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,GAAG,CAAC;AAEpC,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,WAAW,CAAC;AAExC,MAAM,MAAM,cAAc,GAAG,OAAO,GAChC,MAAM,GACN,OAAO,GACP,SAAS,GACT,UAAU,GACV,MAAM,GACN,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,KAAK,CAAC;AAEV,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;AAEtC,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,cAAc,CAAC;AAEvD,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACxB;AAED,oBAAY,cAAc;IACtB,KAAK,UAAU;IACf,OAAO,YAAY;IACnB,OAAO,YAAY;CACtB;AAED,MAAM,WAAW,UAAU;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,YAAY,EAAE,QAAQ,EAAE,CAAC;AAEzB;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG;KAAG,CAAC,IAAI,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC;CAAE,CAAC;AAE7D,MAAM,WAAW,WAAW;IACxB,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,aAAa,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACpF,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAC;CACvD;AAED,kEAAkE;AAClE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;AAExD;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAElG,qEAAqE;AACrE,MAAM,WAAW,mBAAmB;IAChC,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,qDAAqD;AACrD,MAAM,WAAW,iBAAiB;IAC9B,qCAAqC;IACrC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC1B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IACzB,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACrB"}
@@ -0,0 +1,30 @@
1
+ import type { OPFSOptions, OPFSSync } from '../types';
2
+ import type { Remote } from 'comlink';
3
+ type RemoteOPFSSync = Remote<OPFSSync>;
4
+ export interface DedicatedWorkerOptions extends OPFSOptions {
5
+ /**
6
+ * URL of the worker script, e.g. `import url from 'opfs-worker/dedicated.worker.js?url'` (Vite).
7
+ *
8
+ * Defaults to the inlined worker (no URL needed). Pass an explicit url when you
9
+ * prefer the self-contained file (strict CSP without `blob:`, or DIY hosting).
10
+ */
11
+ url?: string | URL;
12
+ /** Bring your own Worker instance (overrides `url`) */
13
+ worker?: Worker;
14
+ }
15
+ export interface RawWorker {
16
+ /** Comlink proxy to `OPFSSync` (bytes in / bytes out) */
17
+ fs: RemoteOPFSSync;
18
+ /** Underlying browser Worker */
19
+ worker: Worker;
20
+ /** Calls worker `dispose()` then `terminate()` */
21
+ dispose: () => void;
22
+ }
23
+ /**
24
+ * Internal helper: spawn a dedicated worker and wrap `OPFSSync` with Comlink.
25
+ * Prefer {@link createOPFSDedicated}; access the proxy / Worker via
26
+ * `facade.backend` / `facade.worker`.
27
+ */
28
+ export declare function createDedicatedWorker(options?: DedicatedWorkerOptions): RawWorker;
29
+ export {};
30
+ //# sourceMappingURL=createDedicatedWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDedicatedWorker.d.ts","sourceRoot":"","sources":["../../src/worker/createDedicatedWorker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAItC,KAAK,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEvC,MAAM,WAAW,sBAAuB,SAAQ,WAAW;IACvD;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACtB,yDAAyD;IACzD,EAAE,EAAE,cAAc,CAAC;IACnB,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,OAAO,EAAE,MAAM,IAAI,CAAC;CACvB;AAeD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,SAAS,CAuBrF"}
@@ -0,0 +1,37 @@
1
+ import type { OPFSAsync } from '../core/OPFSAsync';
2
+ import type { OPFSOptions } from '../types';
3
+ import type { Remote } from 'comlink';
4
+ type RemoteOPFSAsync = Remote<OPFSAsync>;
5
+ export interface SharedWorkerOptions extends OPFSOptions {
6
+ /**
7
+ * URL of the worker script, e.g. `import url from 'opfs-worker/shared.worker.js?url'` (Vite).
8
+ *
9
+ * Defaults to `new URL('./shared.worker.js', import.meta.url)`, which works when
10
+ * `opfs-worker` is served as-is (CDN, unbundled deps). When your bundler inlines
11
+ * the package into app chunks, pass the url explicitly.
12
+ */
13
+ url?: string | URL;
14
+ /** Bring your own SharedWorker instance (overrides `url`) */
15
+ worker?: SharedWorker;
16
+ /** Worker name — tabs with the same script URL + name share one instance (default: 'opfs-worker') */
17
+ name?: string;
18
+ }
19
+ export interface RawSharedWorker {
20
+ /** Comlink proxy to the `OPFSAsync` instance shared by all connected tabs */
21
+ fs: RemoteOPFSAsync;
22
+ /** Underlying browser SharedWorker */
23
+ worker: SharedWorker;
24
+ /** Closes this tab's port; the worker keeps running for other tabs */
25
+ dispose: () => void;
26
+ }
27
+ /**
28
+ * Internal helper: connect to the SharedWorker and wrap `OPFSAsync` with Comlink.
29
+ * Prefer {@link createOPFSShared}; access the proxy / SharedWorker via
30
+ * `facade.backend` / `facade.worker`.
31
+ *
32
+ * Note: `OPFSOptions` are applied via `setOptions()` on the shared instance, so
33
+ * they affect every connected tab — use the same options in all tabs.
34
+ */
35
+ export declare function createSharedWorker(options?: SharedWorkerOptions): RawSharedWorker;
36
+ export {};
37
+ //# sourceMappingURL=createSharedWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSharedWorker.d.ts","sourceRoot":"","sources":["../../src/worker/createSharedWorker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,KAAK,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAEzC,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACpD;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,qGAAqG;IACrG,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC5B,6EAA6E;IAC7E,EAAE,EAAE,eAAe,CAAC;IACpB,sCAAsC;IACtC,MAAM,EAAE,YAAY,CAAC;IACrB,sEAAsE;IACtE,OAAO,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,eAAe,CA0BrF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dedicated.worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedicated.worker.d.ts","sourceRoot":"","sources":["../../src/worker/dedicated.worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=shared.worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.worker.d.ts","sourceRoot":"","sources":["../../src/worker/shared.worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ # Backend API
2
+
3
+ Classes from `opfs-worker/pure` (also re-exported from `/sync`, `/async`, `/sharedworker`). Bytes only — no encoding helpers.
4
+
5
+ ```
6
+ BaseOPFS mkdir, stat, readDir, watch, index, importFiles, …
7
+ ├─ OPFSSync sync access handles + FDs + writeStream
8
+ └─ OPFSAsync getFile / createWritable + writeStream (no FDs)
9
+ ```
10
+
11
+ `OPFSApi` = the `OPFSSync` method surface — both backends and Comlink proxies satisfy it.
12
+
13
+ ## Shared methods (`BaseOPFS`)
14
+
15
+ Path ops: `mkdir`, `stat`, `readDir`, `exists`, `clear`, `remove`, `rename`, `copy`, `realpath`, `index`, `readBlob`, `importFiles`, `watch`, `unwatch`, `setOptions`, `dispose`.
16
+
17
+ Subclasses implement:
18
+
19
+ - `readFile` / `writeFile` / `appendFile`
20
+ - `writeStream(path, stream, onProgress?)`
21
+
22
+ ## `OPFSSync`
23
+
24
+ Dedicated-worker backend. Adds FD methods (`open` … `fsync`) and streams via chunked FD writes.
25
+
26
+ → [File descriptors](../file-descriptors.md), [dedicated guide](../guides/dedicated.md).
27
+
28
+ ## `OPFSAsync`
29
+
30
+ Promise File System API. Streams via `createWritable()`. FDs always throw `OperationNotSupportedError`. Writes need Safari 26+ (or Chrome / Firefox).
31
+
32
+ → [Async guide](../guides/async.md).
33
+
34
+ ## Comlink
35
+
36
+ Dedicated and SharedWorker facades expose the same backend surface on `fs.backend` (a Comlink proxy). For FD `read`/`write` from the main thread, transfer buffers with Comlink — the facade does that for you.
@@ -0,0 +1,82 @@
1
+ # Create helpers
2
+
3
+ Factories from the package entries. For when to pick which: [Choosing a mode](../choosing-a-mode.md).
4
+
5
+ ## Facade
6
+
7
+ | Function | From | Backend |
8
+ | ------------------------------- | ---------------------- | ----------------------------- |
9
+ | `createOPFSDedicated(options?)` | `.` or `/sync` | Dedicated worker + `OPFSSync` |
10
+ | `createOPFSAsync(options?)` | `.` or `/async` | In-process `OPFSAsync` |
11
+ | `createOPFSShared(options?)` | `.` or `/sharedworker` | SharedWorker + `OPFSAsync` |
12
+
13
+ All return [`OPFSFacade`](./facade.md).
14
+
15
+ ```typescript
16
+ import { createOPFSDedicated, createOPFSAsync, createOPFSShared } from 'opfs-worker';
17
+ ```
18
+
19
+ On the main entry only:
20
+
21
+ - `createOPFS` → `createOPFSDedicated`
22
+ - `createWorker` → same (deprecated)
23
+ - `OPFSFileSystem` → `OPFSFacade` (deprecated)
24
+
25
+ ## Backend access
26
+
27
+ Every facade exposes:
28
+
29
+ | Field | Meaning |
30
+ | ------------ | --------------------------------------------------------------------- |
31
+ | `fs.backend` | Raw [`OPFSApi`](../types.md#opfsapi) — bytes in / bytes out |
32
+ | `fs.worker` | `Worker` / `SharedWorker` when one was created; `undefined` for async |
33
+
34
+ ```typescript
35
+ const fs = createOPFSDedicated({ root: '/my-app' });
36
+ await fs.backend.writeFile('/a.bin', bytes);
37
+ fs.worker; // Worker
38
+ ```
39
+
40
+ ## Options
41
+
42
+ Passed to any `createOPFS*` (and to `setOptions()` later). Full type: [`OPFSOptions`](../types.md#opfsoptions).
43
+
44
+ | Option | Default | What it does |
45
+ | ------------------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
46
+ | `root` | `'/'` | Scope all paths under this OPFS subdirectory |
47
+ | `namespace` | `'opfs-worker:${root}'` | Stamp on every [watch](../guides/watching.md) event |
48
+ | `hashAlgorithm` | `'etag'` | File hash on `stat` / `index` / watch — `'etag'`, `'SHA-*'`, or `null`/`false` to disable. See [hashing](../guides/hashing.md) |
49
+ | `maxFileSize` | `50MB` | Skip SHA-\* hashing above this size (`etag` ignores it) |
50
+ | `broadcastChannel` | `'opfs-worker'` | Channel name, a `BroadcastChannel` instance, or `null` to disable |
51
+
52
+ ### Dedicated worker only
53
+
54
+ | Option | Type | Default | What it does |
55
+ | -------- | --------------- | -------------- | ---------------------------------------------------------------------------------- |
56
+ | `url` | `string \| URL` | inlined worker | Script URL for `opfs-worker/dedicated.worker.js` (or your own) instead of the blob |
57
+ | `worker` | `Worker` | — | Pass an existing `Worker` (overrides `url`) |
58
+
59
+ ### SharedWorker only
60
+
61
+ | Option | Type | Default | What it does |
62
+ | -------- | --------------- | ------------------- | ----------------------------------------------------------------------------------------------------- |
63
+ | `url` | `string \| URL` | next to the package | Script URL for `opfs-worker/shared.worker.js` — with Vite: `import url from '…/shared.worker.js?url'` |
64
+ | `worker` | `SharedWorker` | — | Pass an existing `SharedWorker` (overrides `url`) |
65
+ | `name` | `string` | `'opfs-worker'` | Tabs with the same script URL + name share one instance |
66
+
67
+ ```typescript
68
+ const fs = createOPFS({
69
+ root: '/my-app',
70
+ hashAlgorithm: 'SHA-256',
71
+ maxFileSize: 10 * 1024 * 1024,
72
+ });
73
+ ```
74
+
75
+ ## Prebuilt scripts
76
+
77
+ | Export | Hook up with |
78
+ | --------------------------------- | -------------------------------------------------------- |
79
+ | `opfs-worker/dedicated.worker.js` | `new Worker(url, { type: 'module' })` or `{ url }` |
80
+ | `opfs-worker/shared.worker.js` | `new SharedWorker(url, { type: 'module' })` or `{ url }` |
81
+
82
+ Walkthroughs: [dedicated](../guides/dedicated.md), [sharedworker](../guides/sharedworker.md).
@@ -0,0 +1,53 @@
1
+ # OPFSFacade
2
+
3
+ Node-like API: encodings, auto-detect by extension, path as `string` or `URL`. Usually from [`createOPFS*`](./create.md); or `new OPFSFacade({ fs, worker?, dispose })`.
4
+
5
+ `fs.promises === fs`.
6
+
7
+ ## Backend access
8
+
9
+ | Field | Notes |
10
+ | --------- | ---------------------------------------------------------------------------- |
11
+ | `backend` | Raw [`OPFSApi`](../types.md#opfsapi) — same methods without encoding helpers |
12
+ | `worker` | `Worker` / `SharedWorker` if this facade owns one; `undefined` for async |
13
+
14
+ ## File I/O
15
+
16
+ | Method | Notes |
17
+ | --------------------------------------- | --------------------------------------------------------------------------------------------- |
18
+ | `readFile` / `writeFile` / `appendFile` | Encoding as string, `{ encoding }`, or auto |
19
+ | `readBlob` | Disk-backed `Blob`, nothing copied into memory — [streaming](../guides/streaming.md) |
20
+ | `importStream` | Stream / Blob / File — [streaming](../guides/streaming.md) |
21
+ | `importFiles` | Bulk array / `Map` of `[path, data]` with rich progress — [streaming](../guides/streaming.md) |
22
+ | `readText` / `writeText` / `appendText` | UTF-8 by default |
23
+
24
+ ## Directories & metadata
25
+
26
+ | Method | Notes |
27
+ | ------------------------------ | ----------------------------------------------------- |
28
+ | `mkdir` | `{ recursive }`; numeric mode is accepted and ignored |
29
+ | `readDir` | `DirentData[]` |
30
+ | `stat` / `exists` / `realpath` | |
31
+ | `remove` | `{ recursive, force }` |
32
+ | `rename` / `copy` | `copy` takes `{ recursive, overwrite }` |
33
+ | `clear` | Empty a dir (default `/`) |
34
+ | `index` | `Map<path, FileStat>` |
35
+
36
+ ## Watch & lifecycle
37
+
38
+ | Method | Notes |
39
+ | ------------ | ----------------------------------- |
40
+ | `watch` | Returns `() => void` |
41
+ | `unwatch` | |
42
+ | `setOptions` | See [hashing](../guides/hashing.md) |
43
+ | `dispose` | Dispose the backend |
44
+
45
+ ## Node aliases
46
+
47
+ `unlink` / `rm` / `rmdir` → `remove`. `readdir` → `readDir`. `lstat` → `stat`. `chmod` is a no-op (no Unix modes in OPFS).
48
+
49
+ ## File descriptors
50
+
51
+ `open`, `read`, `write`, `close`, `fstat`, `ftruncate`, `fsync` — dedicated / `OPFSSync` only. Async throws `ENOTSUP`.
52
+
53
+ Details: [file descriptors](../file-descriptors.md).
@@ -0,0 +1,41 @@
1
+ # Choosing a mode
2
+
3
+ Sync access handles only work in a **dedicated** worker. Async writes (`createWritable`) work on the main thread and in SharedWorkers too, but Safari needs **26+** for writing.
4
+
5
+ ## Package entries
6
+
7
+ | Entry | What you get |
8
+ | --------------------------------- | --------------------------------------------------------------- |
9
+ | `opfs-worker` | Everything (plus 1.x aliases) |
10
+ | `opfs-worker/sync` | Dedicated worker only — `createOPFSDedicated`, `OPFSSync` |
11
+ | `opfs-worker/async` | No worker — `createOPFSAsync`, `OPFSAsync` |
12
+ | `opfs-worker/sharedworker` | SharedWorker helpers |
13
+ | `opfs-worker/pure` | Classes only — you own the thread |
14
+ | `opfs-worker/dedicated.worker.js` | Prebuilt dedicated Worker script |
15
+ | `opfs-worker/shared.worker.js` | Prebuilt SharedWorker script |
16
+
17
+ ## Modes
18
+
19
+ | | API | When | FD | Comlink |
20
+ | ----- | --------------------------------------------------------- | ------------------------------- | --------- | ------- |
21
+ | **1** | [`createOPFSDedicated()`](./guides/dedicated.md) | Normal `fs`-like API | yes | yes |
22
+ | **2** | [`OPFSSync` / `OPFSAsync` from `/pure`](./guides/pure.md) | Already in a worker | sync only | no |
23
+ | **3** | [`createOPFSAsync()`](./guides/async.md) | No worker | no | no |
24
+ | **4** | [`createOPFSShared()`](./guides/sharedworker.md) | One fs shared by all tabs | no | yes |
25
+
26
+ For the raw bytes API or the browser Worker, use `fs.backend` / `fs.worker` on any facade.
27
+
28
+ If size matters, import from `/sync`, `/async`, or `/sharedworker` instead of the main barrel.
29
+
30
+ ## Trade-offs
31
+
32
+ | | Dedicated (`OPFSSync`) | Async (`OPFSAsync`) |
33
+ | ------------------------- | -------------------------------------------------------------------------------------- | ------------------------------ |
34
+ | File descriptors | yes | `ENOTSUP` |
35
+ | Safari writes | yes (via the worker) | 26+ |
36
+ | SharedWorker | no | yes |
37
+ | One instance for all tabs | no (unless you build SharedWorker yourself) | Mode 4 |
38
+ | Bundle | ~80 KB inlined worker, or [prebuilt script](./guides/dedicated.md#diy-prebuilt-script) | small via `/async` |
39
+ | CSP without `blob:` | pass `url` / prebuilt script | no worker, or SharedWorker URL |
40
+
41
+ Aliases on the main entry: `createOPFS` / `createWorker` → `createOPFSDedicated`, `OPFSFileSystem` → `OPFSFacade`. See [Migration](./migration.md).