opfs-worker 0.2.2 → 0.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/README.md +5 -3
- package/dist/assets/worker-DCm4BiWM.js.map +1 -0
- package/dist/index.cjs +349 -317
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +367 -335
- package/dist/index.js.map +1 -1
- package/dist/raw.cjs +1 -1
- package/dist/raw.cjs.map +1 -1
- package/dist/raw.js +61 -29
- package/dist/raw.js.map +1 -1
- package/dist/worker.d.ts +10 -0
- package/dist/worker.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/assets/worker-CMvl9yOu.js.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -3,59 +3,59 @@
|
|
|
3
3
|
* Copyright 2019 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
const H = Symbol("Comlink.proxy"), R = Symbol("Comlink.endpoint"), B = Symbol("Comlink.releaseProxy"),
|
|
7
|
-
canHandle: (
|
|
8
|
-
serialize(
|
|
9
|
-
const { port1:
|
|
10
|
-
return O(
|
|
6
|
+
const H = Symbol("Comlink.proxy"), R = Symbol("Comlink.endpoint"), B = Symbol("Comlink.releaseProxy"), I = Symbol("Comlink.finalizer"), p = Symbol("Comlink.thrown"), $ = (t) => typeof t == "object" && t !== null || typeof t == "function", W = {
|
|
7
|
+
canHandle: (t) => $(t) && t[H],
|
|
8
|
+
serialize(t) {
|
|
9
|
+
const { port1: e, port2: r } = new MessageChannel();
|
|
10
|
+
return O(t, e), [r, [r]];
|
|
11
11
|
},
|
|
12
|
-
deserialize(
|
|
13
|
-
return
|
|
12
|
+
deserialize(t) {
|
|
13
|
+
return t.start(), Y(t);
|
|
14
14
|
}
|
|
15
15
|
}, j = {
|
|
16
|
-
canHandle: (
|
|
17
|
-
serialize({ value:
|
|
18
|
-
let
|
|
19
|
-
return
|
|
16
|
+
canHandle: (t) => $(t) && p in t,
|
|
17
|
+
serialize({ value: t }) {
|
|
18
|
+
let e;
|
|
19
|
+
return t instanceof Error ? e = {
|
|
20
20
|
isError: !0,
|
|
21
21
|
value: {
|
|
22
|
-
message:
|
|
23
|
-
name:
|
|
24
|
-
stack:
|
|
22
|
+
message: t.message,
|
|
23
|
+
name: t.name,
|
|
24
|
+
stack: t.stack
|
|
25
25
|
}
|
|
26
|
-
} :
|
|
26
|
+
} : e = { isError: !1, value: t }, [e, []];
|
|
27
27
|
},
|
|
28
|
-
deserialize(
|
|
29
|
-
throw
|
|
28
|
+
deserialize(t) {
|
|
29
|
+
throw t.isError ? Object.assign(new Error(t.value.message), t.value) : t.value;
|
|
30
30
|
}
|
|
31
31
|
}, U = /* @__PURE__ */ new Map([
|
|
32
32
|
["proxy", W],
|
|
33
33
|
["throw", j]
|
|
34
34
|
]);
|
|
35
|
-
function V(
|
|
36
|
-
for (const r of
|
|
37
|
-
if (
|
|
35
|
+
function V(t, e) {
|
|
36
|
+
for (const r of t)
|
|
37
|
+
if (e === r || r === "*" || r instanceof RegExp && r.test(e))
|
|
38
38
|
return !0;
|
|
39
39
|
return !1;
|
|
40
40
|
}
|
|
41
|
-
function O(
|
|
42
|
-
|
|
41
|
+
function O(t, e = globalThis, r = ["*"]) {
|
|
42
|
+
e.addEventListener("message", function a(n) {
|
|
43
43
|
if (!n || !n.data)
|
|
44
44
|
return;
|
|
45
45
|
if (!V(r, n.origin)) {
|
|
46
46
|
console.warn(\`Invalid origin '\${n.origin}' for comlink proxy\`);
|
|
47
47
|
return;
|
|
48
48
|
}
|
|
49
|
-
const { id:
|
|
49
|
+
const { id: i, type: o, path: s } = Object.assign({ path: [] }, n.data), l = (n.data.argumentList || []).map(y);
|
|
50
50
|
let u;
|
|
51
51
|
try {
|
|
52
|
-
const f =
|
|
52
|
+
const f = s.slice(0, -1).reduce((h, g) => h[g], t), w = s.reduce((h, g) => h[g], t);
|
|
53
53
|
switch (o) {
|
|
54
54
|
case "GET":
|
|
55
55
|
u = w;
|
|
56
56
|
break;
|
|
57
57
|
case "SET":
|
|
58
|
-
f[
|
|
58
|
+
f[s.slice(-1)[0]] = y(n.data.value), u = !0;
|
|
59
59
|
break;
|
|
60
60
|
case "APPLY":
|
|
61
61
|
u = w.apply(f, l);
|
|
@@ -69,7 +69,7 @@ function O(e, t = globalThis, r = ["*"]) {
|
|
|
69
69
|
case "ENDPOINT":
|
|
70
70
|
{
|
|
71
71
|
const { port1: h, port2: g } = new MessageChannel();
|
|
72
|
-
O(
|
|
72
|
+
O(t, g), u = J(h, [h]);
|
|
73
73
|
}
|
|
74
74
|
break;
|
|
75
75
|
case "RELEASE":
|
|
@@ -83,138 +83,138 @@ function O(e, t = globalThis, r = ["*"]) {
|
|
|
83
83
|
}
|
|
84
84
|
Promise.resolve(u).catch((f) => ({ value: f, [p]: 0 })).then((f) => {
|
|
85
85
|
const [w, h] = A(f);
|
|
86
|
-
|
|
86
|
+
e.postMessage(Object.assign(Object.assign({}, w), { id: i }), h), o === "RELEASE" && (e.removeEventListener("message", a), L(e), I in t && typeof t[I] == "function" && t[I]());
|
|
87
87
|
}).catch((f) => {
|
|
88
88
|
const [w, h] = A({
|
|
89
89
|
value: new TypeError("Unserializable return value"),
|
|
90
90
|
[p]: 0
|
|
91
91
|
});
|
|
92
|
-
|
|
92
|
+
e.postMessage(Object.assign(Object.assign({}, w), { id: i }), h);
|
|
93
93
|
});
|
|
94
|
-
}),
|
|
94
|
+
}), e.start && e.start();
|
|
95
95
|
}
|
|
96
|
-
function G(
|
|
97
|
-
return
|
|
96
|
+
function G(t) {
|
|
97
|
+
return t.constructor.name === "MessagePort";
|
|
98
98
|
}
|
|
99
|
-
function L(
|
|
100
|
-
G(
|
|
99
|
+
function L(t) {
|
|
100
|
+
G(t) && t.close();
|
|
101
101
|
}
|
|
102
|
-
function Y(
|
|
102
|
+
function Y(t, e) {
|
|
103
103
|
const r = /* @__PURE__ */ new Map();
|
|
104
|
-
return
|
|
105
|
-
const { data:
|
|
106
|
-
if (!
|
|
104
|
+
return t.addEventListener("message", function(n) {
|
|
105
|
+
const { data: i } = n;
|
|
106
|
+
if (!i || !i.id)
|
|
107
107
|
return;
|
|
108
|
-
const o = r.get(
|
|
108
|
+
const o = r.get(i.id);
|
|
109
109
|
if (o)
|
|
110
110
|
try {
|
|
111
|
-
o(
|
|
111
|
+
o(i);
|
|
112
112
|
} finally {
|
|
113
|
-
r.delete(
|
|
113
|
+
r.delete(i.id);
|
|
114
114
|
}
|
|
115
|
-
}),
|
|
115
|
+
}), P(t, r, [], e);
|
|
116
116
|
}
|
|
117
|
-
function E(
|
|
118
|
-
if (
|
|
117
|
+
function E(t) {
|
|
118
|
+
if (t)
|
|
119
119
|
throw new Error("Proxy has been released and is not useable");
|
|
120
120
|
}
|
|
121
|
-
function z(
|
|
122
|
-
return
|
|
121
|
+
function z(t) {
|
|
122
|
+
return d(t, /* @__PURE__ */ new Map(), {
|
|
123
123
|
type: "RELEASE"
|
|
124
124
|
}).then(() => {
|
|
125
|
-
L(
|
|
125
|
+
L(t);
|
|
126
126
|
});
|
|
127
127
|
}
|
|
128
|
-
const F = /* @__PURE__ */ new WeakMap(), S = "FinalizationRegistry" in globalThis && new FinalizationRegistry((
|
|
129
|
-
const
|
|
130
|
-
F.set(
|
|
128
|
+
const F = /* @__PURE__ */ new WeakMap(), S = "FinalizationRegistry" in globalThis && new FinalizationRegistry((t) => {
|
|
129
|
+
const e = (F.get(t) || 0) - 1;
|
|
130
|
+
F.set(t, e), e === 0 && z(t);
|
|
131
131
|
});
|
|
132
|
-
function X(
|
|
133
|
-
const r = (F.get(
|
|
134
|
-
F.set(
|
|
132
|
+
function X(t, e) {
|
|
133
|
+
const r = (F.get(e) || 0) + 1;
|
|
134
|
+
F.set(e, r), S && S.register(t, e, t);
|
|
135
135
|
}
|
|
136
|
-
function q(
|
|
137
|
-
S && S.unregister(
|
|
136
|
+
function q(t) {
|
|
137
|
+
S && S.unregister(t);
|
|
138
138
|
}
|
|
139
|
-
function
|
|
139
|
+
function P(t, e, r = [], a = function() {
|
|
140
140
|
}) {
|
|
141
141
|
let n = !1;
|
|
142
|
-
const
|
|
143
|
-
get(o,
|
|
144
|
-
if (E(n),
|
|
142
|
+
const i = new Proxy(a, {
|
|
143
|
+
get(o, s) {
|
|
144
|
+
if (E(n), s === B)
|
|
145
145
|
return () => {
|
|
146
|
-
q(
|
|
146
|
+
q(i), z(t), e.clear(), n = !0;
|
|
147
147
|
};
|
|
148
|
-
if (
|
|
148
|
+
if (s === "then") {
|
|
149
149
|
if (r.length === 0)
|
|
150
|
-
return { then: () =>
|
|
151
|
-
const l =
|
|
150
|
+
return { then: () => i };
|
|
151
|
+
const l = d(t, e, {
|
|
152
152
|
type: "GET",
|
|
153
153
|
path: r.map((u) => u.toString())
|
|
154
|
-
}).then(
|
|
154
|
+
}).then(y);
|
|
155
155
|
return l.then.bind(l);
|
|
156
156
|
}
|
|
157
|
-
return
|
|
157
|
+
return P(t, e, [...r, s]);
|
|
158
158
|
},
|
|
159
|
-
set(o,
|
|
159
|
+
set(o, s, l) {
|
|
160
160
|
E(n);
|
|
161
161
|
const [u, f] = A(l);
|
|
162
|
-
return
|
|
162
|
+
return d(t, e, {
|
|
163
163
|
type: "SET",
|
|
164
|
-
path: [...r,
|
|
164
|
+
path: [...r, s].map((w) => w.toString()),
|
|
165
165
|
value: u
|
|
166
|
-
}, f).then(
|
|
166
|
+
}, f).then(y);
|
|
167
167
|
},
|
|
168
|
-
apply(o,
|
|
168
|
+
apply(o, s, l) {
|
|
169
169
|
E(n);
|
|
170
170
|
const u = r[r.length - 1];
|
|
171
171
|
if (u === R)
|
|
172
|
-
return
|
|
172
|
+
return d(t, e, {
|
|
173
173
|
type: "ENDPOINT"
|
|
174
|
-
}).then(
|
|
174
|
+
}).then(y);
|
|
175
175
|
if (u === "bind")
|
|
176
|
-
return
|
|
177
|
-
const [f, w] =
|
|
178
|
-
return
|
|
176
|
+
return P(t, e, r.slice(0, -1));
|
|
177
|
+
const [f, w] = k(l);
|
|
178
|
+
return d(t, e, {
|
|
179
179
|
type: "APPLY",
|
|
180
180
|
path: r.map((h) => h.toString()),
|
|
181
181
|
argumentList: f
|
|
182
|
-
}, w).then(
|
|
182
|
+
}, w).then(y);
|
|
183
183
|
},
|
|
184
|
-
construct(o,
|
|
184
|
+
construct(o, s) {
|
|
185
185
|
E(n);
|
|
186
|
-
const [l, u] =
|
|
187
|
-
return
|
|
186
|
+
const [l, u] = k(s);
|
|
187
|
+
return d(t, e, {
|
|
188
188
|
type: "CONSTRUCT",
|
|
189
189
|
path: r.map((f) => f.toString()),
|
|
190
190
|
argumentList: l
|
|
191
|
-
}, u).then(
|
|
191
|
+
}, u).then(y);
|
|
192
192
|
}
|
|
193
193
|
});
|
|
194
|
-
return X(
|
|
194
|
+
return X(i, t), i;
|
|
195
195
|
}
|
|
196
|
-
function K(
|
|
197
|
-
return Array.prototype.concat.apply([],
|
|
196
|
+
function K(t) {
|
|
197
|
+
return Array.prototype.concat.apply([], t);
|
|
198
198
|
}
|
|
199
|
-
function
|
|
200
|
-
const
|
|
201
|
-
return [
|
|
199
|
+
function k(t) {
|
|
200
|
+
const e = t.map(A);
|
|
201
|
+
return [e.map((r) => r[0]), K(e.map((r) => r[1]))];
|
|
202
202
|
}
|
|
203
203
|
const _ = /* @__PURE__ */ new WeakMap();
|
|
204
|
-
function J(
|
|
205
|
-
return _.set(
|
|
204
|
+
function J(t, e) {
|
|
205
|
+
return _.set(t, e), t;
|
|
206
206
|
}
|
|
207
|
-
function Q(
|
|
208
|
-
return Object.assign(
|
|
207
|
+
function Q(t) {
|
|
208
|
+
return Object.assign(t, { [H]: !0 });
|
|
209
209
|
}
|
|
210
|
-
function A(
|
|
211
|
-
for (const [
|
|
212
|
-
if (r.canHandle(
|
|
213
|
-
const [a, n] = r.serialize(
|
|
210
|
+
function A(t) {
|
|
211
|
+
for (const [e, r] of U)
|
|
212
|
+
if (r.canHandle(t)) {
|
|
213
|
+
const [a, n] = r.serialize(t);
|
|
214
214
|
return [
|
|
215
215
|
{
|
|
216
216
|
type: "HANDLER",
|
|
217
|
-
name:
|
|
217
|
+
name: e,
|
|
218
218
|
value: a
|
|
219
219
|
},
|
|
220
220
|
n
|
|
@@ -223,31 +223,31 @@ function A(e) {
|
|
|
223
223
|
return [
|
|
224
224
|
{
|
|
225
225
|
type: "RAW",
|
|
226
|
-
value:
|
|
226
|
+
value: t
|
|
227
227
|
},
|
|
228
|
-
_.get(
|
|
228
|
+
_.get(t) || []
|
|
229
229
|
];
|
|
230
230
|
}
|
|
231
|
-
function
|
|
232
|
-
switch (
|
|
231
|
+
function y(t) {
|
|
232
|
+
switch (t.type) {
|
|
233
233
|
case "HANDLER":
|
|
234
|
-
return U.get(
|
|
234
|
+
return U.get(t.name).deserialize(t.value);
|
|
235
235
|
case "RAW":
|
|
236
|
-
return
|
|
236
|
+
return t.value;
|
|
237
237
|
}
|
|
238
238
|
}
|
|
239
|
-
function
|
|
239
|
+
function d(t, e, r, a) {
|
|
240
240
|
return new Promise((n) => {
|
|
241
|
-
const
|
|
242
|
-
|
|
241
|
+
const i = Z();
|
|
242
|
+
e.set(i, n), t.start && t.start(), t.postMessage(Object.assign({ id: i }, r), a);
|
|
243
243
|
});
|
|
244
244
|
}
|
|
245
245
|
function Z() {
|
|
246
246
|
return new Array(4).fill(0).map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16)).join("-");
|
|
247
247
|
}
|
|
248
248
|
class c extends Error {
|
|
249
|
-
constructor(
|
|
250
|
-
super(
|
|
249
|
+
constructor(e, r, a) {
|
|
250
|
+
super(e), this.code = r, this.path = a, this.name = "OPFSError";
|
|
251
251
|
}
|
|
252
252
|
}
|
|
253
253
|
class ee extends c {
|
|
@@ -255,118 +255,118 @@ class ee extends c {
|
|
|
255
255
|
super("OPFS is not supported in this browser", "OPFS_NOT_SUPPORTED");
|
|
256
256
|
}
|
|
257
257
|
}
|
|
258
|
-
class
|
|
258
|
+
class T extends c {
|
|
259
259
|
constructor() {
|
|
260
260
|
super("OPFS is not mounted", "OPFS_NOT_MOUNTED");
|
|
261
261
|
}
|
|
262
262
|
}
|
|
263
|
-
class
|
|
264
|
-
constructor(
|
|
265
|
-
super(
|
|
263
|
+
class v extends c {
|
|
264
|
+
constructor(e, r) {
|
|
265
|
+
super(e, "INVALID_PATH", r);
|
|
266
266
|
}
|
|
267
267
|
}
|
|
268
|
-
class
|
|
269
|
-
constructor(
|
|
270
|
-
super(\`File not found: \${
|
|
268
|
+
class D extends c {
|
|
269
|
+
constructor(e) {
|
|
270
|
+
super(\`File not found: \${e}\`, "FILE_NOT_FOUND", e);
|
|
271
271
|
}
|
|
272
272
|
}
|
|
273
|
-
function te(
|
|
274
|
-
switch (
|
|
273
|
+
function te(t, e = "utf-8") {
|
|
274
|
+
switch (e) {
|
|
275
275
|
case "utf8":
|
|
276
276
|
case "utf-8":
|
|
277
|
-
return new TextEncoder().encode(
|
|
277
|
+
return new TextEncoder().encode(t);
|
|
278
278
|
case "utf16le":
|
|
279
279
|
case "ucs2":
|
|
280
280
|
case "ucs-2":
|
|
281
|
-
return ne(
|
|
281
|
+
return ne(t);
|
|
282
282
|
case "ascii":
|
|
283
|
-
return
|
|
283
|
+
return se(t);
|
|
284
284
|
case "latin1":
|
|
285
|
-
return
|
|
285
|
+
return ie(t);
|
|
286
286
|
case "binary":
|
|
287
|
-
return Uint8Array.from(
|
|
287
|
+
return Uint8Array.from(t, (r) => r.charCodeAt(0));
|
|
288
288
|
case "base64":
|
|
289
|
-
return Uint8Array.from(atob(
|
|
289
|
+
return Uint8Array.from(atob(t), (r) => r.charCodeAt(0));
|
|
290
290
|
case "hex":
|
|
291
|
-
if (!/^[\\da-f]+$/i.test(
|
|
291
|
+
if (!/^[\\da-f]+$/i.test(t) || t.length % 2 !== 0)
|
|
292
292
|
throw new c("Invalid hex string", "INVALID_HEX_FORMAT");
|
|
293
|
-
return Uint8Array.from(
|
|
293
|
+
return Uint8Array.from(t.match(/.{1,2}/g).map((r) => parseInt(r, 16)));
|
|
294
294
|
default:
|
|
295
|
-
return console.warn("Encoding not supported, falling back to UTF-8"), new TextEncoder().encode(
|
|
295
|
+
return console.warn("Encoding not supported, falling back to UTF-8"), new TextEncoder().encode(t);
|
|
296
296
|
}
|
|
297
297
|
}
|
|
298
|
-
function re(
|
|
299
|
-
switch (
|
|
298
|
+
function re(t, e = "utf-8") {
|
|
299
|
+
switch (e) {
|
|
300
300
|
case "utf8":
|
|
301
301
|
case "utf-8":
|
|
302
|
-
return new TextDecoder().decode(
|
|
302
|
+
return new TextDecoder().decode(t);
|
|
303
303
|
case "utf16le":
|
|
304
304
|
case "ucs2":
|
|
305
305
|
case "ucs-2":
|
|
306
|
-
return ae(
|
|
306
|
+
return ae(t);
|
|
307
307
|
case "latin1":
|
|
308
|
-
return String.fromCharCode(...
|
|
308
|
+
return String.fromCharCode(...t);
|
|
309
309
|
case "binary":
|
|
310
|
-
return String.fromCharCode(...
|
|
310
|
+
return String.fromCharCode(...t);
|
|
311
311
|
case "ascii":
|
|
312
|
-
return String.fromCharCode(...
|
|
312
|
+
return String.fromCharCode(...t.map((r) => r & 127));
|
|
313
313
|
case "base64":
|
|
314
|
-
return btoa(String.fromCharCode(...
|
|
314
|
+
return btoa(String.fromCharCode(...t));
|
|
315
315
|
case "hex":
|
|
316
|
-
return Array.from(
|
|
316
|
+
return Array.from(t).map((r) => r.toString(16).padStart(2, "0")).join("");
|
|
317
317
|
default:
|
|
318
|
-
return console.warn("Unsupported encoding, falling back to UTF-8"), new TextDecoder().decode(
|
|
318
|
+
return console.warn("Unsupported encoding, falling back to UTF-8"), new TextDecoder().decode(t);
|
|
319
319
|
}
|
|
320
320
|
}
|
|
321
|
-
function ne(
|
|
322
|
-
const
|
|
323
|
-
for (let r = 0; r <
|
|
324
|
-
const a =
|
|
325
|
-
|
|
321
|
+
function ne(t) {
|
|
322
|
+
const e = new Uint8Array(t.length * 2);
|
|
323
|
+
for (let r = 0; r < t.length; r++) {
|
|
324
|
+
const a = t.charCodeAt(r);
|
|
325
|
+
e[r * 2] = a & 255, e[r * 2 + 1] = a >> 8;
|
|
326
326
|
}
|
|
327
|
-
return
|
|
327
|
+
return e;
|
|
328
328
|
}
|
|
329
|
-
function ae(
|
|
330
|
-
|
|
331
|
-
const
|
|
332
|
-
return String.fromCharCode(...
|
|
329
|
+
function ae(t) {
|
|
330
|
+
t.length % 2 !== 0 && (console.warn("Invalid UTF-16LE buffer length, truncating last byte"), t = t.slice(0, t.length - 1));
|
|
331
|
+
const e = new Uint16Array(t.buffer, t.byteOffset, t.byteLength / 2);
|
|
332
|
+
return String.fromCharCode(...e);
|
|
333
333
|
}
|
|
334
|
-
function
|
|
335
|
-
const
|
|
336
|
-
for (let r = 0; r <
|
|
337
|
-
|
|
338
|
-
return
|
|
334
|
+
function ie(t) {
|
|
335
|
+
const e = new Uint8Array(t.length);
|
|
336
|
+
for (let r = 0; r < t.length; r++)
|
|
337
|
+
e[r] = t.charCodeAt(r) & 255;
|
|
338
|
+
return e;
|
|
339
339
|
}
|
|
340
|
-
function
|
|
341
|
-
const
|
|
342
|
-
for (let r = 0; r <
|
|
343
|
-
|
|
344
|
-
return
|
|
340
|
+
function se(t) {
|
|
341
|
+
const e = new Uint8Array(t.length);
|
|
342
|
+
for (let r = 0; r < t.length; r++)
|
|
343
|
+
e[r] = t.charCodeAt(r) & 127;
|
|
344
|
+
return e;
|
|
345
345
|
}
|
|
346
346
|
function oe() {
|
|
347
347
|
if (!("storage" in navigator) || !("getDirectory" in navigator.storage))
|
|
348
348
|
throw new ee();
|
|
349
349
|
}
|
|
350
|
-
function m(
|
|
351
|
-
return Array.isArray(
|
|
350
|
+
function m(t) {
|
|
351
|
+
return Array.isArray(t) ? t : t.split("/").filter(Boolean);
|
|
352
352
|
}
|
|
353
|
-
function
|
|
354
|
-
return typeof
|
|
353
|
+
function x(t) {
|
|
354
|
+
return typeof t == "string" ? t ?? "/" : \`/\${t.join("/")}\`;
|
|
355
355
|
}
|
|
356
|
-
function
|
|
357
|
-
const
|
|
358
|
-
return
|
|
356
|
+
function b(t) {
|
|
357
|
+
const e = m(t);
|
|
358
|
+
return e[e.length - 1] || "";
|
|
359
359
|
}
|
|
360
|
-
function M(
|
|
361
|
-
const
|
|
362
|
-
return
|
|
360
|
+
function M(t) {
|
|
361
|
+
const e = m(t);
|
|
362
|
+
return e.pop(), x(e);
|
|
363
363
|
}
|
|
364
|
-
function
|
|
365
|
-
return !
|
|
364
|
+
function C(t) {
|
|
365
|
+
return !t || t === "/" ? "/" : t.startsWith("/") ? t : \`/\${t}\`;
|
|
366
366
|
}
|
|
367
|
-
function ce(
|
|
368
|
-
const
|
|
369
|
-
for (const a of
|
|
367
|
+
function ce(t) {
|
|
368
|
+
const e = m(t), r = [];
|
|
369
|
+
for (const a of e)
|
|
370
370
|
if (!(a === "." || a === ""))
|
|
371
371
|
if (a === "..") {
|
|
372
372
|
if (r.length === 0)
|
|
@@ -374,28 +374,28 @@ function ce(e) {
|
|
|
374
374
|
r.pop();
|
|
375
375
|
} else
|
|
376
376
|
r.push(a);
|
|
377
|
-
return
|
|
377
|
+
return x(r);
|
|
378
378
|
}
|
|
379
|
-
function le(
|
|
380
|
-
return typeof
|
|
379
|
+
function le(t, e = "utf-8") {
|
|
380
|
+
return typeof t == "string" ? te(t, e) : t instanceof Uint8Array ? t : new Uint8Array(t);
|
|
381
381
|
}
|
|
382
|
-
async function ue(
|
|
383
|
-
const
|
|
382
|
+
async function ue(t) {
|
|
383
|
+
const e = await t.createSyncAccessHandle();
|
|
384
384
|
try {
|
|
385
|
-
const r =
|
|
386
|
-
return
|
|
385
|
+
const r = e.getSize(), a = new Uint8Array(r);
|
|
386
|
+
return e.read(a, { at: 0 }), a;
|
|
387
387
|
} finally {
|
|
388
|
-
|
|
388
|
+
e.close();
|
|
389
389
|
}
|
|
390
390
|
}
|
|
391
|
-
async function
|
|
391
|
+
async function N(t, e, r, a = {}) {
|
|
392
392
|
let n = null;
|
|
393
393
|
try {
|
|
394
|
-
n = await
|
|
395
|
-
const
|
|
396
|
-
n.write(
|
|
397
|
-
} catch (
|
|
398
|
-
console.error(
|
|
394
|
+
n = await t.createSyncAccessHandle();
|
|
395
|
+
const i = le(e, r), o = a.append ? n.getSize() : 0;
|
|
396
|
+
n.write(i, { at: o }), a.truncate && !a.append && n.truncate(i.byteLength), n.flush();
|
|
397
|
+
} catch (i) {
|
|
398
|
+
console.error(i);
|
|
399
399
|
const o = a.append ? "append" : "write";
|
|
400
400
|
throw new c(\`Failed to \${o} file\`, \`\${o.toUpperCase()}_FAILED\`);
|
|
401
401
|
} finally {
|
|
@@ -406,17 +406,17 @@ async function C(e, t, r, a = {}) {
|
|
|
406
406
|
}
|
|
407
407
|
}
|
|
408
408
|
}
|
|
409
|
-
async function fe(
|
|
409
|
+
async function fe(t, e = "SHA-1") {
|
|
410
410
|
try {
|
|
411
|
-
const r = new Uint8Array(
|
|
412
|
-
return Array.from(new Uint8Array(a)).map((
|
|
411
|
+
const r = new Uint8Array(t), a = await crypto.subtle.digest(e, r);
|
|
412
|
+
return Array.from(new Uint8Array(a)).map((i) => i.toString(16).padStart(2, "0")).join("");
|
|
413
413
|
} catch (r) {
|
|
414
|
-
throw console.warn(\`Failed to calculate \${
|
|
414
|
+
throw console.warn(\`Failed to calculate \${e} hash:\`, r), r;
|
|
415
415
|
}
|
|
416
416
|
}
|
|
417
|
-
async function he(
|
|
418
|
-
const
|
|
419
|
-
return new Uint8Array(
|
|
417
|
+
async function he(t) {
|
|
418
|
+
const e = await t.arrayBuffer();
|
|
419
|
+
return new Uint8Array(e);
|
|
420
420
|
}
|
|
421
421
|
class we {
|
|
422
422
|
/** Root directory handle for the file system */
|
|
@@ -433,6 +433,21 @@ class we {
|
|
|
433
433
|
scanning = !1;
|
|
434
434
|
/** Promise to prevent concurrent mount operations */
|
|
435
435
|
mountingPromise = null;
|
|
436
|
+
/**
|
|
437
|
+
* Notify about internal changes to the file system
|
|
438
|
+
*
|
|
439
|
+
* This method is called by internal operations to notify clients about
|
|
440
|
+
* changes, even when no specific paths are being watched.
|
|
441
|
+
*
|
|
442
|
+
* @param path - The path that was changed
|
|
443
|
+
* @param type - The type of change (create, change, delete)
|
|
444
|
+
*/
|
|
445
|
+
notifyInternalChange(e, r) {
|
|
446
|
+
this.watchCallback && this.watchCallback({
|
|
447
|
+
path: e,
|
|
448
|
+
type: r
|
|
449
|
+
});
|
|
450
|
+
}
|
|
436
451
|
/**
|
|
437
452
|
* Creates a new OPFSFileSystem instance
|
|
438
453
|
*
|
|
@@ -440,8 +455,8 @@ class we {
|
|
|
440
455
|
* @param watchOptions - Optional configuration for watching
|
|
441
456
|
* @throws {OPFSError} If OPFS is not supported in the current browser
|
|
442
457
|
*/
|
|
443
|
-
constructor(
|
|
444
|
-
oe(),
|
|
458
|
+
constructor(e, r) {
|
|
459
|
+
oe(), e && (this.watchCallback = e, r?.watchInterval && (this.watchInterval = r.watchInterval)), this.mount("/");
|
|
445
460
|
}
|
|
446
461
|
/**
|
|
447
462
|
* Initialize the file system within a given directory
|
|
@@ -464,12 +479,12 @@ class we {
|
|
|
464
479
|
* await fs.mount('/my-app');
|
|
465
480
|
* \`\`\`
|
|
466
481
|
*/
|
|
467
|
-
async mount(
|
|
482
|
+
async mount(e = "/") {
|
|
468
483
|
return this.mountingPromise && await this.mountingPromise, this.mountingPromise = new Promise(async (r, a) => {
|
|
469
484
|
this.root = null;
|
|
470
485
|
try {
|
|
471
486
|
const n = await navigator.storage.getDirectory();
|
|
472
|
-
|
|
487
|
+
e === "/" ? this.root = n : this.root = await this.getDirectoryHandle(e, !0, n), r(!0);
|
|
473
488
|
} catch (n) {
|
|
474
489
|
console.error(n), a(new c("Failed to initialize OPFS", "INIT_FAILED"));
|
|
475
490
|
} finally {
|
|
@@ -483,8 +498,8 @@ class we {
|
|
|
483
498
|
* @param callback - The callback function to invoke when files change
|
|
484
499
|
* @param options - Optional configuration for watching
|
|
485
500
|
*/
|
|
486
|
-
setWatchCallback(
|
|
487
|
-
this.watchCallback =
|
|
501
|
+
setWatchCallback(e, r) {
|
|
502
|
+
this.watchCallback = e, r?.watchInterval && (this.watchInterval = r.watchInterval);
|
|
488
503
|
}
|
|
489
504
|
/**
|
|
490
505
|
* Automatically mount the OPFS root if not already mounted
|
|
@@ -522,14 +537,14 @@ class we {
|
|
|
522
537
|
* const docsDir2 = await fs.getDirectoryHandle(['users', 'john', 'documents'], true);
|
|
523
538
|
* \`\`\`
|
|
524
539
|
*/
|
|
525
|
-
async getDirectoryHandle(
|
|
540
|
+
async getDirectoryHandle(e, r = !1, a = this.root) {
|
|
526
541
|
if (!a)
|
|
527
|
-
throw new
|
|
528
|
-
const n = Array.isArray(
|
|
529
|
-
let
|
|
542
|
+
throw new T();
|
|
543
|
+
const n = Array.isArray(e) ? e : m(e);
|
|
544
|
+
let i = a;
|
|
530
545
|
for (const o of n)
|
|
531
|
-
|
|
532
|
-
return
|
|
546
|
+
i = await i.getDirectoryHandle(o, { create: r });
|
|
547
|
+
return i;
|
|
533
548
|
}
|
|
534
549
|
/**
|
|
535
550
|
* Get a file handle from a path
|
|
@@ -550,14 +565,14 @@ class we {
|
|
|
550
565
|
* const fileHandle2 = await fs.getFileHandle(['config', 'settings.json'], true);
|
|
551
566
|
* \`\`\`
|
|
552
567
|
*/
|
|
553
|
-
async getFileHandle(
|
|
568
|
+
async getFileHandle(e, r = !1, a = this.root) {
|
|
554
569
|
if (!a)
|
|
555
|
-
throw new
|
|
556
|
-
const n = m(
|
|
570
|
+
throw new T();
|
|
571
|
+
const n = m(e);
|
|
557
572
|
if (n.length === 0)
|
|
558
|
-
throw new
|
|
559
|
-
const
|
|
560
|
-
return (await this.getDirectoryHandle(n, r, a)).getFileHandle(
|
|
573
|
+
throw new v("Path must not be empty", Array.isArray(e) ? e.join("/") : e);
|
|
574
|
+
const i = n.pop();
|
|
575
|
+
return (await this.getDirectoryHandle(n, r, a)).getFileHandle(i, { create: r });
|
|
561
576
|
}
|
|
562
577
|
/**
|
|
563
578
|
* Recursively list all files and directories with their stats
|
|
@@ -596,16 +611,16 @@ class we {
|
|
|
596
611
|
* }
|
|
597
612
|
* \`\`\`
|
|
598
613
|
*/
|
|
599
|
-
async index(
|
|
614
|
+
async index(e) {
|
|
600
615
|
const r = /* @__PURE__ */ new Map(), a = async (n) => {
|
|
601
|
-
const
|
|
602
|
-
for (const o of
|
|
603
|
-
const
|
|
616
|
+
const i = await this.readdir(n, { withFileTypes: !0 });
|
|
617
|
+
for (const o of i) {
|
|
618
|
+
const s = \`\${n === "/" ? "" : n}/\${o.name}\`;
|
|
604
619
|
try {
|
|
605
|
-
const l = await this.stat(
|
|
606
|
-
r.set(
|
|
620
|
+
const l = await this.stat(s, e);
|
|
621
|
+
r.set(s, l), l.isDirectory && await a(s);
|
|
607
622
|
} catch (l) {
|
|
608
|
-
console.warn(\`Skipping broken entry: \${
|
|
623
|
+
console.warn(\`Skipping broken entry: \${s}\`, l);
|
|
609
624
|
}
|
|
610
625
|
}
|
|
611
626
|
};
|
|
@@ -618,13 +633,13 @@ class we {
|
|
|
618
633
|
isDirectory: !0
|
|
619
634
|
}), await a("/"), r;
|
|
620
635
|
}
|
|
621
|
-
async readFile(
|
|
636
|
+
async readFile(e, r = "utf-8") {
|
|
622
637
|
await this.ensureMounted();
|
|
623
638
|
try {
|
|
624
|
-
const a = await this.getFileHandle(
|
|
639
|
+
const a = await this.getFileHandle(e, !1), n = await ue(a);
|
|
625
640
|
return r === "binary" ? n : re(n, r);
|
|
626
641
|
} catch (a) {
|
|
627
|
-
throw console.error(a), new
|
|
642
|
+
throw console.error(a), new D(e);
|
|
628
643
|
}
|
|
629
644
|
}
|
|
630
645
|
/**
|
|
@@ -652,10 +667,10 @@ class we {
|
|
|
652
667
|
* await fs.writeFile('/data/utf16.txt', 'Hello World', 'utf-16le');
|
|
653
668
|
* \`\`\`
|
|
654
669
|
*/
|
|
655
|
-
async writeFile(
|
|
670
|
+
async writeFile(e, r, a) {
|
|
656
671
|
await this.ensureMounted();
|
|
657
|
-
const n = await this.getFileHandle(
|
|
658
|
-
await
|
|
672
|
+
const n = await this.getFileHandle(e, !0);
|
|
673
|
+
await N(n, r, a, { truncate: !0 }), this.notifyInternalChange(e, "change");
|
|
659
674
|
}
|
|
660
675
|
/**
|
|
661
676
|
* Append data to a file
|
|
@@ -679,10 +694,10 @@ class we {
|
|
|
679
694
|
* await fs.appendFile('/data/binary.dat', additionalData);
|
|
680
695
|
* \`\`\`
|
|
681
696
|
*/
|
|
682
|
-
async appendFile(
|
|
697
|
+
async appendFile(e, r, a) {
|
|
683
698
|
await this.ensureMounted();
|
|
684
|
-
const n = await this.getFileHandle(
|
|
685
|
-
await
|
|
699
|
+
const n = await this.getFileHandle(e, !0);
|
|
700
|
+
await N(n, r, a, { append: !0 }), this.notifyInternalChange(e, "change");
|
|
686
701
|
}
|
|
687
702
|
/**
|
|
688
703
|
* Create a directory
|
|
@@ -705,22 +720,23 @@ class we {
|
|
|
705
720
|
* await fs.mkdir('/users/john/documents/projects', { recursive: true });
|
|
706
721
|
* \`\`\`
|
|
707
722
|
*/
|
|
708
|
-
async mkdir(
|
|
723
|
+
async mkdir(e, r) {
|
|
709
724
|
if (await this.ensureMounted(), !this.root)
|
|
710
|
-
throw new
|
|
711
|
-
const a = r?.recursive ?? !1, n = m(
|
|
712
|
-
let
|
|
725
|
+
throw new T();
|
|
726
|
+
const a = r?.recursive ?? !1, n = m(e);
|
|
727
|
+
let i = this.root;
|
|
713
728
|
for (let o = 0; o < n.length; o++) {
|
|
714
|
-
const
|
|
729
|
+
const s = n[o];
|
|
715
730
|
try {
|
|
716
|
-
|
|
731
|
+
i = await i.getDirectoryHandle(s, { create: a || o === n.length - 1 });
|
|
717
732
|
} catch (l) {
|
|
718
733
|
throw l.name === "NotFoundError" ? new c(
|
|
719
|
-
\`Parent directory does not exist: \${
|
|
734
|
+
\`Parent directory does not exist: \${x(n.slice(0, o + 1))}\`,
|
|
720
735
|
"ENOENT"
|
|
721
|
-
) : l.name === "TypeMismatchError" ? new c(\`Path segment is not a directory: \${
|
|
736
|
+
) : l.name === "TypeMismatchError" ? new c(\`Path segment is not a directory: \${s}\`, "ENOTDIR") : new c("Failed to create directory", "MKDIR_FAILED");
|
|
722
737
|
}
|
|
723
738
|
}
|
|
739
|
+
this.notifyInternalChange(e, "create");
|
|
724
740
|
}
|
|
725
741
|
/**
|
|
726
742
|
* Get file or directory stats
|
|
@@ -751,9 +767,17 @@ class we {
|
|
|
751
767
|
* console.log(\`Hash: \${statsWithHash.hash}\`);
|
|
752
768
|
* \`\`\`
|
|
753
769
|
*/
|
|
754
|
-
async stat(
|
|
755
|
-
await this.ensureMounted()
|
|
756
|
-
|
|
770
|
+
async stat(e, r) {
|
|
771
|
+
if (await this.ensureMounted(), e === "/")
|
|
772
|
+
return {
|
|
773
|
+
kind: "directory",
|
|
774
|
+
size: 0,
|
|
775
|
+
mtime: (/* @__PURE__ */ new Date(0)).toISOString(),
|
|
776
|
+
ctime: (/* @__PURE__ */ new Date(0)).toISOString(),
|
|
777
|
+
isFile: !1,
|
|
778
|
+
isDirectory: !0
|
|
779
|
+
};
|
|
780
|
+
const a = b(e), n = await this.getDirectoryHandle(M(e), !1), i = r?.includeHash ?? !1, o = r?.hashAlgorithm ?? "SHA-1";
|
|
757
781
|
try {
|
|
758
782
|
const l = await (await n.getFileHandle(a, { create: !1 })).getFile(), u = {
|
|
759
783
|
kind: "file",
|
|
@@ -763,16 +787,16 @@ class we {
|
|
|
763
787
|
isFile: !0,
|
|
764
788
|
isDirectory: !1
|
|
765
789
|
};
|
|
766
|
-
if (
|
|
790
|
+
if (i)
|
|
767
791
|
try {
|
|
768
792
|
const f = new Uint8Array(await l.arrayBuffer()), w = await fe(f, o);
|
|
769
793
|
u.hash = w;
|
|
770
794
|
} catch (f) {
|
|
771
|
-
console.warn(\`Failed to calculate hash for \${
|
|
795
|
+
console.warn(\`Failed to calculate hash for \${e}:\`, f);
|
|
772
796
|
}
|
|
773
797
|
return u;
|
|
774
|
-
} catch (
|
|
775
|
-
if (
|
|
798
|
+
} catch (s) {
|
|
799
|
+
if (s.name !== "TypeMismatchError" && s.name !== "NotFoundError")
|
|
776
800
|
throw new c("Failed to stat (file)", "STAT_FAILED");
|
|
777
801
|
}
|
|
778
802
|
try {
|
|
@@ -784,30 +808,30 @@ class we {
|
|
|
784
808
|
isFile: !1,
|
|
785
809
|
isDirectory: !0
|
|
786
810
|
};
|
|
787
|
-
} catch (
|
|
788
|
-
throw
|
|
811
|
+
} catch (s) {
|
|
812
|
+
throw s.name === "NotFoundError" ? new c(\`No such file or directory: \${e}\`, "ENOENT") : new c("Failed to stat (directory)", "STAT_FAILED");
|
|
789
813
|
}
|
|
790
814
|
}
|
|
791
|
-
async readdir(
|
|
815
|
+
async readdir(e, r) {
|
|
792
816
|
await this.ensureMounted();
|
|
793
|
-
const a = r?.withFileTypes ?? !1, n = await this.getDirectoryHandle(
|
|
817
|
+
const a = r?.withFileTypes ?? !1, n = await this.getDirectoryHandle(e, !1);
|
|
794
818
|
if (a) {
|
|
795
|
-
const
|
|
796
|
-
for await (const [o,
|
|
797
|
-
const l =
|
|
798
|
-
|
|
819
|
+
const i = [];
|
|
820
|
+
for await (const [o, s] of n.entries()) {
|
|
821
|
+
const l = s.kind === "file";
|
|
822
|
+
i.push({
|
|
799
823
|
name: o,
|
|
800
|
-
kind:
|
|
824
|
+
kind: s.kind,
|
|
801
825
|
isFile: l,
|
|
802
826
|
isDirectory: !l
|
|
803
827
|
});
|
|
804
828
|
}
|
|
805
|
-
return
|
|
829
|
+
return i;
|
|
806
830
|
} else {
|
|
807
|
-
const
|
|
831
|
+
const i = [];
|
|
808
832
|
for await (const [o] of n.entries())
|
|
809
|
-
|
|
810
|
-
return
|
|
833
|
+
i.push(o);
|
|
834
|
+
return i;
|
|
811
835
|
}
|
|
812
836
|
}
|
|
813
837
|
/**
|
|
@@ -824,12 +848,13 @@ class we {
|
|
|
824
848
|
* console.log(\`File exists: \${exists}\`);
|
|
825
849
|
* \`\`\`
|
|
826
850
|
*/
|
|
827
|
-
async exists(
|
|
828
|
-
await this.ensureMounted()
|
|
829
|
-
|
|
851
|
+
async exists(e) {
|
|
852
|
+
if (await this.ensureMounted(), e === "/")
|
|
853
|
+
return !0;
|
|
854
|
+
const r = b(e);
|
|
830
855
|
let a = null;
|
|
831
856
|
try {
|
|
832
|
-
a = await this.getDirectoryHandle(M(
|
|
857
|
+
a = await this.getDirectoryHandle(M(e), !1);
|
|
833
858
|
} catch (n) {
|
|
834
859
|
throw (n.name === "NotFoundError" || n.name === "TypeMismatchError") && (a = null), n;
|
|
835
860
|
}
|
|
@@ -868,16 +893,17 @@ class we {
|
|
|
868
893
|
* await fs.clear('/data');
|
|
869
894
|
* \`\`\`
|
|
870
895
|
*/
|
|
871
|
-
async clear(
|
|
896
|
+
async clear(e = "/") {
|
|
872
897
|
await this.ensureMounted();
|
|
873
898
|
try {
|
|
874
|
-
const r = await this.readdir(
|
|
899
|
+
const r = await this.readdir(e, { withFileTypes: !0 });
|
|
875
900
|
for (const a of r) {
|
|
876
|
-
const n = \`\${
|
|
901
|
+
const n = \`\${e === "/" ? "" : e}/\${a.name}\`;
|
|
877
902
|
await this.remove(n, { recursive: !0 });
|
|
878
903
|
}
|
|
904
|
+
this.notifyInternalChange(e, "change");
|
|
879
905
|
} catch (r) {
|
|
880
|
-
throw r instanceof c ? r : new c(\`Failed to clear directory: \${
|
|
906
|
+
throw r instanceof c ? r : new c(\`Failed to clear directory: \${e}\`, "CLEAR_FAILED");
|
|
881
907
|
}
|
|
882
908
|
}
|
|
883
909
|
/**
|
|
@@ -904,20 +930,24 @@ class we {
|
|
|
904
930
|
* await fs.rm('/maybe/exists', { force: true });
|
|
905
931
|
* \`\`\`
|
|
906
932
|
*/
|
|
907
|
-
async remove(
|
|
933
|
+
async remove(e, r) {
|
|
908
934
|
await this.ensureMounted();
|
|
909
|
-
const a = r?.recursive ?? !1, n = r?.force ?? !1
|
|
910
|
-
if (
|
|
911
|
-
throw new
|
|
912
|
-
const
|
|
935
|
+
const a = r?.recursive ?? !1, n = r?.force ?? !1;
|
|
936
|
+
if (e === "/")
|
|
937
|
+
throw new c("Cannot remove root directory", "EROOT");
|
|
938
|
+
const i = b(e);
|
|
939
|
+
if (!i)
|
|
940
|
+
throw new v("Invalid path", e);
|
|
941
|
+
const o = await this.getDirectoryHandle(M(e), !1);
|
|
913
942
|
try {
|
|
914
|
-
await o.removeEntry(
|
|
915
|
-
} catch (
|
|
916
|
-
if (
|
|
943
|
+
await o.removeEntry(i, { recursive: a });
|
|
944
|
+
} catch (s) {
|
|
945
|
+
if (s.name === "NotFoundError") {
|
|
917
946
|
if (!n)
|
|
918
|
-
throw new c(\`No such file or directory: \${
|
|
919
|
-
} else throw
|
|
947
|
+
throw new c(\`No such file or directory: \${e}\`, "ENOENT");
|
|
948
|
+
} else throw s.name === "InvalidModificationError" ? new c(\`Directory not empty: \${e}. Use recursive option to force removal.\`, "ENOTEMPTY") : s.name === "TypeMismatchError" && !a ? new c(\`Cannot remove directory without recursive option: \${e}\`, "EISDIR") : new c(\`Failed to remove path: \${e}\`, "RM_FAILED");
|
|
920
949
|
}
|
|
950
|
+
this.notifyInternalChange(e, "delete");
|
|
921
951
|
}
|
|
922
952
|
/**
|
|
923
953
|
* Resolve a path to an absolute path
|
|
@@ -937,15 +967,15 @@ class we {
|
|
|
937
967
|
* console.log(absolute); // '/data/file.txt'
|
|
938
968
|
* \`\`\`
|
|
939
969
|
*/
|
|
940
|
-
async realpath(
|
|
970
|
+
async realpath(e) {
|
|
941
971
|
await this.ensureMounted();
|
|
942
972
|
try {
|
|
943
|
-
const r = ce(
|
|
973
|
+
const r = ce(e);
|
|
944
974
|
if (!await this.exists(r))
|
|
945
|
-
throw new
|
|
975
|
+
throw new D(r);
|
|
946
976
|
return r;
|
|
947
977
|
} catch (r) {
|
|
948
|
-
throw r instanceof c ? r : new c(\`Failed to resolve path: \${
|
|
978
|
+
throw r instanceof c ? r : new c(\`Failed to resolve path: \${e}\`, "REALPATH_FAILED");
|
|
949
979
|
}
|
|
950
980
|
}
|
|
951
981
|
/**
|
|
@@ -964,14 +994,14 @@ class we {
|
|
|
964
994
|
* await fs.rename('/old/path/file.txt', '/new/path/renamed.txt');
|
|
965
995
|
* \`\`\`
|
|
966
996
|
*/
|
|
967
|
-
async rename(
|
|
997
|
+
async rename(e, r) {
|
|
968
998
|
await this.ensureMounted();
|
|
969
999
|
try {
|
|
970
|
-
if (!await this.exists(
|
|
971
|
-
throw new
|
|
972
|
-
await this.copy(
|
|
1000
|
+
if (!await this.exists(e))
|
|
1001
|
+
throw new D(e);
|
|
1002
|
+
await this.copy(e, r, { recursive: !0 }), await this.remove(e, { recursive: !0 }), this.notifyInternalChange(e, "delete"), this.notifyInternalChange(r, "create");
|
|
973
1003
|
} catch (a) {
|
|
974
|
-
throw a instanceof c ? a : new c(\`Failed to rename from \${
|
|
1004
|
+
throw a instanceof c ? a : new c(\`Failed to rename from \${e} to \${r}\`, "RENAME_FAILED");
|
|
975
1005
|
}
|
|
976
1006
|
}
|
|
977
1007
|
/**
|
|
@@ -999,37 +1029,38 @@ class we {
|
|
|
999
1029
|
* await fs.copy('/source', '/dest', { recursive: true, force: false });
|
|
1000
1030
|
* \`\`\`
|
|
1001
1031
|
*/
|
|
1002
|
-
async copy(
|
|
1032
|
+
async copy(e, r, a) {
|
|
1003
1033
|
await this.ensureMounted();
|
|
1004
1034
|
try {
|
|
1005
|
-
const n = a?.recursive ?? !1,
|
|
1006
|
-
if (!await this.exists(
|
|
1007
|
-
throw new c(\`Source does not exist: \${
|
|
1008
|
-
if (await this.exists(r) && !
|
|
1035
|
+
const n = a?.recursive ?? !1, i = a?.force ?? !0;
|
|
1036
|
+
if (!await this.exists(e))
|
|
1037
|
+
throw new c(\`Source does not exist: \${e}\`, "ENOENT");
|
|
1038
|
+
if (await this.exists(r) && !i)
|
|
1009
1039
|
throw new c(\`Destination already exists: \${r}\`, "EEXIST");
|
|
1010
|
-
if ((await this.stat(
|
|
1011
|
-
const u = await this.readFile(
|
|
1040
|
+
if ((await this.stat(e)).isFile) {
|
|
1041
|
+
const u = await this.readFile(e, "binary");
|
|
1012
1042
|
await this.writeFile(r, u);
|
|
1013
1043
|
} else {
|
|
1014
1044
|
if (!n)
|
|
1015
|
-
throw new c(\`Cannot copy directory without recursive option: \${
|
|
1045
|
+
throw new c(\`Cannot copy directory without recursive option: \${e}\`, "EISDIR");
|
|
1016
1046
|
await this.mkdir(r, { recursive: !0 });
|
|
1017
|
-
const u = await this.readdir(
|
|
1047
|
+
const u = await this.readdir(e, { withFileTypes: !0 });
|
|
1018
1048
|
for (const f of u) {
|
|
1019
|
-
const w = \`\${
|
|
1020
|
-
await this.copy(w, h, { recursive: !0, force:
|
|
1049
|
+
const w = \`\${e}/\${f.name}\`, h = \`\${r}/\${f.name}\`;
|
|
1050
|
+
await this.copy(w, h, { recursive: !0, force: i });
|
|
1021
1051
|
}
|
|
1022
1052
|
}
|
|
1053
|
+
this.notifyInternalChange(r, "create");
|
|
1023
1054
|
} catch (n) {
|
|
1024
|
-
throw n instanceof c ? n : new c(\`Failed to copy from \${
|
|
1055
|
+
throw n instanceof c ? n : new c(\`Failed to copy from \${e} to \${r}\`, "CP_FAILED");
|
|
1025
1056
|
}
|
|
1026
1057
|
}
|
|
1027
1058
|
/**
|
|
1028
1059
|
* Start watching a file or directory for changes
|
|
1029
1060
|
*/
|
|
1030
|
-
async watch(
|
|
1061
|
+
async watch(e) {
|
|
1031
1062
|
await this.ensureMounted();
|
|
1032
|
-
const r =
|
|
1063
|
+
const r = C(e), a = await this.buildSnapshot(r);
|
|
1033
1064
|
this.watchers.set(r, a), this.watchTimer || (this.watchTimer = setInterval(() => {
|
|
1034
1065
|
this.scanWatches();
|
|
1035
1066
|
}, this.watchInterval));
|
|
@@ -1037,46 +1068,46 @@ class we {
|
|
|
1037
1068
|
/**
|
|
1038
1069
|
* Stop watching a previously watched path
|
|
1039
1070
|
*/
|
|
1040
|
-
unwatch(
|
|
1041
|
-
const r =
|
|
1071
|
+
unwatch(e) {
|
|
1072
|
+
const r = C(e);
|
|
1042
1073
|
this.watchers.delete(r), this.watchers.size === 0 && this.watchTimer && (clearInterval(this.watchTimer), this.watchTimer = null);
|
|
1043
1074
|
}
|
|
1044
|
-
async buildSnapshot(
|
|
1075
|
+
async buildSnapshot(e) {
|
|
1045
1076
|
const r = /* @__PURE__ */ new Map(), a = async (n) => {
|
|
1046
|
-
const
|
|
1047
|
-
if (r.set(n,
|
|
1077
|
+
const i = await this.stat(n);
|
|
1078
|
+
if (r.set(n, i), i.isDirectory) {
|
|
1048
1079
|
const o = await this.readdir(n, { withFileTypes: !0 });
|
|
1049
|
-
for (const
|
|
1050
|
-
const l = \`\${n === "/" ? "" : n}/\${
|
|
1080
|
+
for (const s of o) {
|
|
1081
|
+
const l = \`\${n === "/" ? "" : n}/\${s.name}\`;
|
|
1051
1082
|
await a(l);
|
|
1052
1083
|
}
|
|
1053
1084
|
}
|
|
1054
1085
|
};
|
|
1055
|
-
return await a(
|
|
1086
|
+
return await a(e), r;
|
|
1056
1087
|
}
|
|
1057
1088
|
async scanWatches() {
|
|
1058
1089
|
if (!this.scanning) {
|
|
1059
1090
|
this.scanning = !0;
|
|
1060
1091
|
try {
|
|
1061
1092
|
await Promise.all(
|
|
1062
|
-
[...this.watchers.entries()].map(async ([
|
|
1093
|
+
[...this.watchers.entries()].map(async ([e, r]) => {
|
|
1063
1094
|
let a;
|
|
1064
1095
|
try {
|
|
1065
|
-
a = await this.buildSnapshot(
|
|
1096
|
+
a = await this.buildSnapshot(e);
|
|
1066
1097
|
} catch {
|
|
1067
1098
|
a = /* @__PURE__ */ new Map();
|
|
1068
1099
|
}
|
|
1069
1100
|
const n = [];
|
|
1070
|
-
for (const [
|
|
1071
|
-
const
|
|
1072
|
-
|
|
1101
|
+
for (const [i, o] of a) {
|
|
1102
|
+
const s = r.get(i);
|
|
1103
|
+
s ? (s.mtime !== o.mtime || s.size !== o.size) && n.push({ path: i, type: "change" }) : n.push({ path: i, type: "create" });
|
|
1073
1104
|
}
|
|
1074
|
-
for (const
|
|
1075
|
-
a.has(
|
|
1105
|
+
for (const i of r.keys())
|
|
1106
|
+
a.has(i) || n.push({ path: i, type: "delete" });
|
|
1076
1107
|
if (n.length && this.watchCallback)
|
|
1077
|
-
for (const
|
|
1078
|
-
this.watchCallback(
|
|
1079
|
-
this.watchers.set(
|
|
1108
|
+
for (const i of n)
|
|
1109
|
+
this.watchCallback(i);
|
|
1110
|
+
this.watchers.set(e, a);
|
|
1080
1111
|
})
|
|
1081
1112
|
);
|
|
1082
1113
|
} finally {
|
|
@@ -1112,21 +1143,22 @@ class we {
|
|
|
1112
1143
|
* await fs.sync(entries, { cleanBefore: true });
|
|
1113
1144
|
* \`\`\`
|
|
1114
1145
|
*/
|
|
1115
|
-
async sync(
|
|
1146
|
+
async sync(e, r) {
|
|
1116
1147
|
await this.ensureMounted();
|
|
1117
1148
|
try {
|
|
1118
1149
|
(r?.cleanBefore ?? !1) && await this.clear("/");
|
|
1119
|
-
for (const [n,
|
|
1120
|
-
const o =
|
|
1121
|
-
let
|
|
1122
|
-
|
|
1150
|
+
for (const [n, i] of e) {
|
|
1151
|
+
const o = C(n);
|
|
1152
|
+
let s;
|
|
1153
|
+
i instanceof Blob ? s = await he(i) : s = i, await this.writeFile(o, s);
|
|
1123
1154
|
}
|
|
1155
|
+
this.notifyInternalChange("/", "change");
|
|
1124
1156
|
} catch (a) {
|
|
1125
1157
|
throw a instanceof c ? a : new c("Failed to sync file system", "SYNC_FAILED");
|
|
1126
1158
|
}
|
|
1127
1159
|
}
|
|
1128
1160
|
}
|
|
1129
1161
|
typeof self < "u" && self.constructor.name === "DedicatedWorkerGlobalScope" && O(new we());
|
|
1130
|
-
//# sourceMappingURL=worker-
|
|
1131
|
-
`,i=typeof self<"u"&&self.Blob&&new Blob(["URL.revokeObjectURL(import.meta.url);",o],{type:"text/javascript;charset=utf-8"});function s(r){let
|
|
1162
|
+
//# sourceMappingURL=worker-DCm4BiWM.js.map
|
|
1163
|
+
`,i=typeof self<"u"&&self.Blob&&new Blob(["URL.revokeObjectURL(import.meta.url);",o],{type:"text/javascript;charset=utf-8"});function s(r){let e;try{if(e=i&&(self.URL||self.webkitURL).createObjectURL(i),!e)throw"";const t=new Worker(e,{type:"module",name:r?.name});return t.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(e)}),t}catch{return new Worker("data:text/javascript;charset=utf-8,"+encodeURIComponent(o),{type:"module",name:r?.name})}}function c(r,e){const t=a.wrap(new s);return r&&t.setWatchCallback(a.proxy(r),e),t}exports.DirectoryNotFoundError=n.DirectoryNotFoundError;exports.FileNotFoundError=n.FileNotFoundError;exports.OPFSError=n.OPFSError;exports.OPFSNotMountedError=n.OPFSNotMountedError;exports.OPFSNotSupportedError=n.OPFSNotSupportedError;exports.PathError=n.PathError;exports.PermissionError=n.PermissionError;exports.StorageError=n.StorageError;exports.TimeoutError=n.TimeoutError;exports.basename=n.basename;exports.calculateFileHash=n.calculateFileHash;exports.checkOPFSSupport=n.checkOPFSSupport;exports.convertBlobToUint8Array=n.convertBlobToUint8Array;exports.createBuffer=n.createBuffer;exports.decodeBuffer=n.decodeBuffer;exports.dirname=n.dirname;exports.encodeString=n.encodeString;exports.extname=n.extname;exports.joinPath=n.joinPath;exports.normalizePath=n.normalizePath;exports.readFileData=n.readFileData;exports.resolvePath=n.resolvePath;exports.splitPath=n.splitPath;exports.writeFileData=n.writeFileData;exports.createWorker=c;
|
|
1132
1164
|
//# sourceMappingURL=index.cjs.map
|