@volter/browser-wali 0.1.0

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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +20 -0
  3. package/dist/browser-wali-command.d.ts +22 -0
  4. package/dist/browser-wali-command.d.ts.map +1 -0
  5. package/dist/browser-wali-command.js +44 -0
  6. package/dist/browser-wali-command.js.map +1 -0
  7. package/dist/capabilities.d.ts +3 -0
  8. package/dist/capabilities.d.ts.map +1 -0
  9. package/dist/capabilities.js +23 -0
  10. package/dist/capabilities.js.map +1 -0
  11. package/dist/coherent-file-locks.d.ts +23 -0
  12. package/dist/coherent-file-locks.d.ts.map +1 -0
  13. package/dist/coherent-file-locks.js +134 -0
  14. package/dist/coherent-file-locks.js.map +1 -0
  15. package/dist/events.d.ts +30 -0
  16. package/dist/events.d.ts.map +1 -0
  17. package/dist/events.js +289 -0
  18. package/dist/events.js.map +1 -0
  19. package/dist/filesystem-protocol.d.ts +48 -0
  20. package/dist/filesystem-protocol.d.ts.map +1 -0
  21. package/dist/filesystem-protocol.js +27 -0
  22. package/dist/filesystem-protocol.js.map +1 -0
  23. package/dist/filesystem-remote.d.ts +65 -0
  24. package/dist/filesystem-remote.d.ts.map +1 -0
  25. package/dist/filesystem-remote.js +271 -0
  26. package/dist/filesystem-remote.js.map +1 -0
  27. package/dist/filesystem-worker.d.ts +2 -0
  28. package/dist/filesystem-worker.d.ts.map +1 -0
  29. package/dist/filesystem-worker.js +269 -0
  30. package/dist/filesystem-worker.js.map +1 -0
  31. package/dist/filesystem.d.ts +115 -0
  32. package/dist/filesystem.d.ts.map +1 -0
  33. package/dist/filesystem.js +1179 -0
  34. package/dist/filesystem.js.map +1 -0
  35. package/dist/index.d.ts +20 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +18 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/inspect.d.ts +7 -0
  40. package/dist/inspect.d.ts.map +1 -0
  41. package/dist/inspect.js +32 -0
  42. package/dist/inspect.js.map +1 -0
  43. package/dist/local-sockets.d.ts +13 -0
  44. package/dist/local-sockets.d.ts.map +1 -0
  45. package/dist/local-sockets.js +139 -0
  46. package/dist/local-sockets.js.map +1 -0
  47. package/dist/loopback-host.d.ts +14 -0
  48. package/dist/loopback-host.d.ts.map +1 -0
  49. package/dist/loopback-host.js +476 -0
  50. package/dist/loopback-host.js.map +1 -0
  51. package/dist/loopback-protocol.d.ts +41 -0
  52. package/dist/loopback-protocol.d.ts.map +1 -0
  53. package/dist/loopback-protocol.js +2 -0
  54. package/dist/loopback-protocol.js.map +1 -0
  55. package/dist/memory.d.ts +39 -0
  56. package/dist/memory.d.ts.map +1 -0
  57. package/dist/memory.js +520 -0
  58. package/dist/memory.js.map +1 -0
  59. package/dist/module-layout.d.ts +9 -0
  60. package/dist/module-layout.d.ts.map +1 -0
  61. package/dist/module-layout.js +105 -0
  62. package/dist/module-layout.js.map +1 -0
  63. package/dist/network-protocol.d.ts +43 -0
  64. package/dist/network-protocol.d.ts.map +1 -0
  65. package/dist/network-protocol.js +26 -0
  66. package/dist/network-protocol.js.map +1 -0
  67. package/dist/network-worker.d.ts +2 -0
  68. package/dist/network-worker.d.ts.map +1 -0
  69. package/dist/network-worker.js +943 -0
  70. package/dist/network-worker.js.map +1 -0
  71. package/dist/network.d.ts +52 -0
  72. package/dist/network.d.ts.map +1 -0
  73. package/dist/network.js +427 -0
  74. package/dist/network.js.map +1 -0
  75. package/dist/process-adapter.d.ts +14 -0
  76. package/dist/process-adapter.d.ts.map +1 -0
  77. package/dist/process-adapter.js +45 -0
  78. package/dist/process-adapter.js.map +1 -0
  79. package/dist/process-bridge.d.ts +54 -0
  80. package/dist/process-bridge.d.ts.map +1 -0
  81. package/dist/process-bridge.js +150 -0
  82. package/dist/process-bridge.js.map +1 -0
  83. package/dist/program.d.ts +49 -0
  84. package/dist/program.d.ts.map +1 -0
  85. package/dist/program.js +204 -0
  86. package/dist/program.js.map +1 -0
  87. package/dist/runtime.d.ts +9 -0
  88. package/dist/runtime.d.ts.map +1 -0
  89. package/dist/runtime.js +528 -0
  90. package/dist/runtime.js.map +1 -0
  91. package/dist/shared-pipes.d.ts +44 -0
  92. package/dist/shared-pipes.d.ts.map +1 -0
  93. package/dist/shared-pipes.js +306 -0
  94. package/dist/shared-pipes.js.map +1 -0
  95. package/dist/snapshot-filesystem.d.ts +31 -0
  96. package/dist/snapshot-filesystem.d.ts.map +1 -0
  97. package/dist/snapshot-filesystem.js +247 -0
  98. package/dist/snapshot-filesystem.js.map +1 -0
  99. package/dist/stdin.d.ts +36 -0
  100. package/dist/stdin.d.ts.map +1 -0
  101. package/dist/stdin.js +143 -0
  102. package/dist/stdin.js.map +1 -0
  103. package/dist/symlink.d.ts +8 -0
  104. package/dist/symlink.d.ts.map +1 -0
  105. package/dist/symlink.js +66 -0
  106. package/dist/symlink.js.map +1 -0
  107. package/dist/system.d.ts +41 -0
  108. package/dist/system.d.ts.map +1 -0
  109. package/dist/system.js +305 -0
  110. package/dist/system.js.map +1 -0
  111. package/dist/thread-coordinator-worker.d.ts +25 -0
  112. package/dist/thread-coordinator-worker.d.ts.map +1 -0
  113. package/dist/thread-coordinator-worker.js +49 -0
  114. package/dist/thread-coordinator-worker.js.map +1 -0
  115. package/dist/thread-worker.d.ts +2 -0
  116. package/dist/thread-worker.d.ts.map +1 -0
  117. package/dist/thread-worker.js +725 -0
  118. package/dist/thread-worker.js.map +1 -0
  119. package/dist/threads.d.ts +44 -0
  120. package/dist/threads.d.ts.map +1 -0
  121. package/dist/threads.js +154 -0
  122. package/dist/threads.js.map +1 -0
  123. package/dist/types.d.ts +112 -0
  124. package/dist/types.d.ts.map +1 -0
  125. package/dist/types.js +2 -0
  126. package/dist/types.js.map +1 -0
  127. package/dist/websocket-peer.d.ts +38 -0
  128. package/dist/websocket-peer.d.ts.map +1 -0
  129. package/dist/websocket-peer.js +407 -0
  130. package/dist/websocket-peer.js.map +1 -0
  131. package/dist/worker-program-protocol.d.ts +71 -0
  132. package/dist/worker-program-protocol.d.ts.map +1 -0
  133. package/dist/worker-program-protocol.js +2 -0
  134. package/dist/worker-program-protocol.js.map +1 -0
  135. package/dist/worker-program-worker.d.ts +2 -0
  136. package/dist/worker-program-worker.d.ts.map +1 -0
  137. package/dist/worker-program-worker.js +109 -0
  138. package/dist/worker-program-worker.js.map +1 -0
  139. package/dist/worker-program.d.ts +58 -0
  140. package/dist/worker-program.d.ts.map +1 -0
  141. package/dist/worker-program.js +425 -0
  142. package/dist/worker-program.js.map +1 -0
  143. package/package.json +23 -0
@@ -0,0 +1,271 @@
1
+ import { FILESYSTEM_ROOT_PAYLOAD_BYTES, FILESYSTEM_SNAPSHOT_CHUNK_BYTES, FilesystemOperation, } from "./filesystem-protocol.js";
2
+ export class WaliFilesystemClient {
3
+ channel;
4
+ control;
5
+ payload;
6
+ encoder = new TextEncoder();
7
+ decoder = new TextDecoder();
8
+ nextRequestId = 1;
9
+ constructor(channel) {
10
+ this.channel = channel;
11
+ this.control = new Int32Array(channel.control);
12
+ this.payload = new Uint8Array(channel.payload);
13
+ }
14
+ existsSync(path) { return this.call(FilesystemOperation.Exists, { path }); }
15
+ statSync(path) { return hydrateStat(this.call(FilesystemOperation.Stat, { path })); }
16
+ lstatSync(path) { return hydrateStat(this.call(FilesystemOperation.Lstat, { path })); }
17
+ readFileSync(path) {
18
+ return decodeBase64(this.call(FilesystemOperation.ReadFile, { path }).content);
19
+ }
20
+ writeFileSync(path, data) {
21
+ const bytes = typeof data === "string" ? this.encoder.encode(data) : data;
22
+ this.call(FilesystemOperation.WriteFile, { path, content: encodeBase64(bytes) });
23
+ }
24
+ mkdirSync(path, options) {
25
+ this.call(FilesystemOperation.Mkdir, { path, recursive: options?.recursive === true });
26
+ }
27
+ readdirSync(path) { return this.call(FilesystemOperation.Readdir, { path }); }
28
+ unlinkSync(path) { this.call(FilesystemOperation.Unlink, { path }); }
29
+ rmdirSync(path) { this.call(FilesystemOperation.Rmdir, { path }); }
30
+ renameSync(from, to) { this.call(FilesystemOperation.Rename, { from, to }); }
31
+ toSnapshot() {
32
+ return JSON.parse(this.decoder.decode(this.readChunked(FilesystemOperation.SnapshotSize)));
33
+ }
34
+ readChunked(sizeOperation) {
35
+ const { length } = this.call(sizeOperation);
36
+ if (!Number.isSafeInteger(length) || length < 0)
37
+ throw remoteError(-5);
38
+ const encoded = new Uint8Array(length);
39
+ for (let offset = 0; offset < length; offset += FILESYSTEM_SNAPSHOT_CHUNK_BYTES) {
40
+ const expected = Math.min(FILESYSTEM_SNAPSHOT_CHUNK_BYTES, length - offset);
41
+ const { content } = this.call(FilesystemOperation.SnapshotChunk, {
42
+ offset,
43
+ length: expected,
44
+ });
45
+ const chunk = decodeBase64(content);
46
+ if (chunk.byteLength !== expected)
47
+ throw remoteError(-5);
48
+ encoded.set(chunk, offset);
49
+ }
50
+ return encoded;
51
+ }
52
+ replaceSnapshot(snapshot) {
53
+ const encoded = this.encoder.encode(JSON.stringify(snapshot));
54
+ this.call(FilesystemOperation.ReplaceSnapshotStart, { length: encoded.byteLength });
55
+ for (let offset = 0; offset < encoded.byteLength; offset += FILESYSTEM_SNAPSHOT_CHUNK_BYTES) {
56
+ const chunk = encoded.subarray(offset, offset + FILESYSTEM_SNAPSHOT_CHUNK_BYTES);
57
+ this.call(FilesystemOperation.ReplaceSnapshotChunk, {
58
+ offset,
59
+ content: encodeBase64(chunk),
60
+ });
61
+ }
62
+ }
63
+ syscall(name, args) {
64
+ const result = this.call(FilesystemOperation.Syscall, {
65
+ name,
66
+ args: args.map((value) => String(value)),
67
+ }, isBlockingFileLock(name, args) ? null : 30_000);
68
+ return BigInt(result.result);
69
+ }
70
+ readForMapping(fd, offset, length) {
71
+ const result = this.call(FilesystemOperation.ReadForMapping, { fd, offset, length });
72
+ return result.content === undefined ? undefined : decodeBase64(result.content);
73
+ }
74
+ mappingPath(fd) {
75
+ return this.call(FilesystemOperation.MappingPath, { fd }).path;
76
+ }
77
+ writeForMapping(path, offset, value) {
78
+ return this.call(FilesystemOperation.WriteForMapping, {
79
+ path, offset, content: encodeBase64(value),
80
+ }).written;
81
+ }
82
+ call(operation, input = {}, timeoutMs = 30_000) {
83
+ const encoded = this.encoder.encode(JSON.stringify(input));
84
+ if (encoded.byteLength > this.payload.byteLength)
85
+ throw remoteError(-90);
86
+ if (Atomics.load(this.control, 0) !== 0)
87
+ throw new Error("Concurrent WALI filesystem RPC on one channel.");
88
+ const requestId = this.nextRequestId;
89
+ this.nextRequestId = requestId >= 0x3fff_fffd ? 1 : requestId + 2;
90
+ this.control.fill(0);
91
+ this.payload.set(encoded);
92
+ Atomics.store(this.control, 1, operation);
93
+ Atomics.store(this.control, 3, encoded.byteLength);
94
+ Atomics.store(this.control, 0, requestId);
95
+ this.channel.port.postMessage(requestId);
96
+ const deadline = timeoutMs === null ? undefined : Date.now() + timeoutMs;
97
+ for (;;) {
98
+ const state = Atomics.load(this.control, 0);
99
+ if (state === requestId + 1)
100
+ break;
101
+ if (state !== requestId && state !== -requestId) {
102
+ throw new Error(`Invalid WALI filesystem RPC state ${state} for request ${requestId}.`);
103
+ }
104
+ const remaining = deadline === undefined ? undefined : Math.max(0, deadline - Date.now());
105
+ if (remaining === 0 && state === requestId
106
+ && Atomics.compareExchange(this.control, 0, requestId, 0) === requestId) {
107
+ throw remoteError(-110);
108
+ }
109
+ Atomics.wait(this.control, 0, state, state === -requestId ? undefined : remaining);
110
+ }
111
+ const result = Atomics.load(this.control, 2);
112
+ const outputLength = Atomics.load(this.control, 4);
113
+ const output = outputLength > 0
114
+ ? JSON.parse(this.decoder.decode(this.payload.slice(0, outputLength)))
115
+ : undefined;
116
+ Atomics.store(this.control, 0, 0);
117
+ if (result < 0)
118
+ throw remoteError(result);
119
+ return output;
120
+ }
121
+ }
122
+ function isBlockingFileLock(name, args) {
123
+ if (name === "SYS_flock") {
124
+ const operation = Number(args[1] ?? 0);
125
+ return (operation & 4) === 0 && (operation & 8) === 0;
126
+ }
127
+ if (name !== "SYS_fcntl")
128
+ return false;
129
+ const command = Number(args[1] ?? 0);
130
+ return command === 7 || command === 38;
131
+ }
132
+ export class WaliFilesystemCoordinator {
133
+ worker;
134
+ root;
135
+ constructor(worker, root) {
136
+ this.worker = worker;
137
+ this.root = root;
138
+ }
139
+ static async create(snapshot, options) {
140
+ const worker = new Worker(new URL("./filesystem-worker.js", import.meta.url), {
141
+ type: "module", name: "wali-filesystem",
142
+ });
143
+ await new Promise((resolve, reject) => {
144
+ const onMessage = (event) => {
145
+ if (event.data.kind === "ready") {
146
+ worker.removeEventListener("message", onMessage);
147
+ resolve();
148
+ }
149
+ if (event.data.kind === "error") {
150
+ worker.removeEventListener("message", onMessage);
151
+ reject(new Error(event.data.message));
152
+ }
153
+ };
154
+ worker.addEventListener("message", onMessage);
155
+ worker.addEventListener("error", (event) => reject(event.error ?? new Error(event.message)), { once: true });
156
+ const transfers = [
157
+ ...(options.updatePort ? [options.updatePort] : []),
158
+ ...(options.fileLocks ? [options.fileLocks.channel.port] : []),
159
+ ...(options.fileCoherence ? [options.fileCoherence.port] : []),
160
+ ];
161
+ worker.postMessage({ kind: "initialize", snapshot, ...options }, transfers);
162
+ });
163
+ const rootChannel = createChannel(FILESYSTEM_ROOT_PAYLOAD_BYTES);
164
+ worker.postMessage({ kind: "attach", ...rootChannel.server }, [rootChannel.server.port]);
165
+ return new WaliFilesystemCoordinator(worker, new WaliFilesystemClient(rootChannel.client));
166
+ }
167
+ createChannel(payloadBytes) {
168
+ const channel = createChannel(payloadBytes);
169
+ this.worker.postMessage({ kind: "attach", ...channel.server }, [channel.server.port]);
170
+ return channel.client;
171
+ }
172
+ filesystem() { return this.root; }
173
+ snapshot() { return this.root.toSnapshot(); }
174
+ replaceSnapshot(snapshot) { this.root.replaceSnapshot(snapshot); }
175
+ terminate() { this.worker.terminate(); }
176
+ }
177
+ const SHARED_FILE_FD_LIMIT = 10_000;
178
+ const PATH_SYSCALLS = new Set([
179
+ "SYS_open", "SYS_openat", "SYS_stat", "SYS_lstat", "SYS_newfstatat", "SYS_access",
180
+ "SYS_faccessat", "SYS_faccessat2", "SYS_chmod", "SYS_fchmodat", "SYS_chdir", "SYS_getcwd",
181
+ "SYS_mkdir", "SYS_mkdirat", "SYS_statfs", "SYS_rmdir", "SYS_unlink", "SYS_unlinkat",
182
+ "SYS_rename", "SYS_utimensat", "SYS_symlink", "SYS_symlinkat", "SYS_readlink", "SYS_readlinkat",
183
+ "SYS_inotify_init", "SYS_inotify_init1",
184
+ ]);
185
+ const FD_SYSCALLS = new Set([
186
+ "SYS_close", "SYS_read", "SYS_pread64", "SYS_write", "SYS_pwrite64", "SYS_readv", "SYS_writev",
187
+ "SYS_lseek", "SYS_fstat", "SYS_fchmod", "SYS_fchdir", "SYS_fstatfs", "SYS_inotify_add_watch",
188
+ "SYS_inotify_rm_watch", "SYS_dup", "SYS_dup2", "SYS_dup3", "SYS_fcntl", "SYS_getdents64",
189
+ "SYS_fsync", "SYS_fdatasync", "SYS_flock", "SYS_ftruncate",
190
+ ]);
191
+ /** Process-wide ordinary file descriptors shared by every Wasm pthread. */
192
+ export class WaliSharedFileDescriptorHost {
193
+ client;
194
+ stdioAliasRegistry;
195
+ constructor(client, stdioAliasRegistry) {
196
+ this.client = client;
197
+ this.stdioAliasRegistry = stdioAliasRegistry;
198
+ }
199
+ imports(fallback) {
200
+ const imports = {};
201
+ for (const name of PATH_SYSCALLS) {
202
+ imports[name] = (...args) => this.client.syscall(name, args);
203
+ }
204
+ for (const name of FD_SYSCALLS) {
205
+ imports[name] = (...args) => {
206
+ const fd = Number(args[0]);
207
+ const alias = this.stdioAliasRegistry && fd >= 0 && fd < this.stdioAliasRegistry.length
208
+ ? Atomics.load(this.stdioAliasRegistry, fd)
209
+ : -1;
210
+ if (fd < 3 || fd >= SHARED_FILE_FD_LIMIT || alias === 0 || alias === 1 || alias === 2) {
211
+ return fallback[name]?.(...args) ?? -9n;
212
+ }
213
+ return this.client.syscall(name, args);
214
+ };
215
+ }
216
+ return { ...fallback, ...imports };
217
+ }
218
+ readForMapping(fd, offset, length) {
219
+ if (fd < 3 || fd >= SHARED_FILE_FD_LIMIT)
220
+ return;
221
+ return this.client.readForMapping(fd, offset, length);
222
+ }
223
+ mappingPath(fd) {
224
+ if (fd < 3 || fd >= SHARED_FILE_FD_LIMIT)
225
+ return;
226
+ return this.client.mappingPath(fd);
227
+ }
228
+ writeForMapping(path, offset, value) {
229
+ return this.client.writeForMapping(path, offset, value);
230
+ }
231
+ }
232
+ function createChannel(payloadBytes) {
233
+ const ports = new MessageChannel();
234
+ const control = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 8);
235
+ const payload = new SharedArrayBuffer(payloadBytes);
236
+ ports.port1.start();
237
+ return {
238
+ client: { port: ports.port1, control, payload },
239
+ server: { port: ports.port2, control, payload },
240
+ };
241
+ }
242
+ function hydrateStat(stat) {
243
+ return {
244
+ isFile: () => stat.file,
245
+ isDirectory: () => stat.directory,
246
+ isSymbolicLink: () => stat.symbolicLink === true,
247
+ size: stat.size,
248
+ ...optional(stat, "mode", "mtimeMs", "atimeMs", "ctimeMs", "nlink", "uid", "gid", "dev", "ino", "rdev", "blksize", "blocks"),
249
+ };
250
+ }
251
+ function optional(value, ...keys) {
252
+ return Object.fromEntries(keys.flatMap((key) => value[key] === undefined ? [] : [[key, value[key]]]));
253
+ }
254
+ function remoteError(result) {
255
+ const code = { 2: "ENOENT", 9: "EBADF", 13: "EACCES", 17: "EEXIST", 20: "ENOTDIR",
256
+ 21: "EISDIR", 22: "EINVAL", 24: "EMFILE", 28: "ENOSPC", 29: "ESPIPE", 34: "ERANGE",
257
+ 38: "ENOSYS", 39: "ENOTEMPTY", 90: "EMSGSIZE", 110: "ETIMEDOUT" }[-result] ?? "EIO";
258
+ return Object.assign(new Error(code), { code });
259
+ }
260
+ function encodeBase64(value) {
261
+ let binary = "";
262
+ for (let offset = 0; offset < value.byteLength; offset += 32_768) {
263
+ binary += String.fromCharCode(...value.subarray(offset, offset + 32_768));
264
+ }
265
+ return btoa(binary);
266
+ }
267
+ function decodeBase64(value) {
268
+ const binary = atob(value);
269
+ return Uint8Array.from(binary, (character) => character.charCodeAt(0));
270
+ }
271
+ //# sourceMappingURL=filesystem-remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-remote.js","sourceRoot":"","sources":["../src/filesystem-remote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=filesystem-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-worker.d.ts","sourceRoot":"","sources":["../src/filesystem-worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,269 @@
1
+ import { SnapshotWaliFileSystem } from "./snapshot-filesystem.js";
2
+ import { WaliFileDescriptorTable } from "./filesystem.js";
3
+ import { createProcessFilesystemPatch } from "./process-bridge.js";
4
+ import { BrowserFileLockClient } from "@volter/browser-runtime/browser-file-locks.js";
5
+ import { BrowserFileCoherenceClient } from "@volter/browser-runtime/browser-file-coherence.js";
6
+ import { WaliCoherentFileLockClient } from "./coherent-file-locks.js";
7
+ import { FILESYSTEM_SNAPSHOT_CHUNK_BYTES, FilesystemOperation, } from "./filesystem-protocol.js";
8
+ const scope = globalThis;
9
+ let filesystem = new SnapshotWaliFileSystem();
10
+ let descriptors;
11
+ const encoder = new TextEncoder();
12
+ const decoder = new TextDecoder();
13
+ scope.onmessage = (event) => {
14
+ if (event.data.kind === "initialize") {
15
+ filesystem = SnapshotWaliFileSystem.fromSnapshot(event.data.snapshot);
16
+ const lockClient = event.data.fileLocks
17
+ ? new BrowserFileLockClient(event.data.fileLocks.channel) : undefined;
18
+ descriptors = new WaliFileDescriptorTable({
19
+ filesystem,
20
+ cwd: event.data.cwd,
21
+ stdin: new Uint8Array(),
22
+ executablePath: event.data.executablePath,
23
+ memory: () => event.data.memory,
24
+ emit: () => -9n,
25
+ descriptorMaximum: 9_999,
26
+ pid: event.data.pid,
27
+ ...(lockClient && event.data.fileLocks ? {
28
+ fileLocks: event.data.fileCoherence
29
+ ? new WaliCoherentFileLockClient(lockClient, new BrowserFileCoherenceClient(event.data.fileCoherence), filesystem)
30
+ : lockClient,
31
+ lockOwner: event.data.fileLocks.owner,
32
+ } : {}),
33
+ });
34
+ if (event.data.updatePort) {
35
+ let synchronizedSnapshot = filesystem.toSnapshot();
36
+ let updateTimer;
37
+ const updatePort = event.data.updatePort;
38
+ updatePort.start();
39
+ const flushUpdates = () => {
40
+ updateTimer = undefined;
41
+ const nextSnapshot = filesystem.toSnapshot();
42
+ const patch = createProcessFilesystemPatch(synchronizedSnapshot, nextSnapshot);
43
+ synchronizedSnapshot = nextSnapshot;
44
+ if (patch.files.length > 0 || patch.removed.length > 0) {
45
+ updatePort.postMessage({ type: "filesystem", patch });
46
+ }
47
+ };
48
+ filesystem.setMutationHandler(() => {
49
+ updateTimer ??= setTimeout(flushUpdates, 100);
50
+ });
51
+ }
52
+ scope.postMessage({ kind: "ready" });
53
+ return;
54
+ }
55
+ attach(event.data);
56
+ };
57
+ function attach(channel) {
58
+ const control = new Int32Array(channel.control);
59
+ const payload = new Uint8Array(channel.payload);
60
+ const state = {};
61
+ channel.port.onmessage = (event) => { void dispatch(control, payload, state, event.data); };
62
+ channel.port.start();
63
+ }
64
+ async function dispatch(control, payload, state, requestId) {
65
+ if (Atomics.load(control, 0) !== requestId)
66
+ return;
67
+ let result = -38;
68
+ let output = new Uint8Array();
69
+ try {
70
+ const operation = Atomics.load(control, 1);
71
+ const inputLength = Atomics.load(control, 3);
72
+ const input = inputLength > 0
73
+ ? JSON.parse(decoder.decode(payload.slice(0, inputLength)))
74
+ : {};
75
+ const response = await operate(operation, input, state);
76
+ output = response === undefined ? new Uint8Array() : encoder.encode(JSON.stringify(response));
77
+ result = 0;
78
+ }
79
+ catch (error) {
80
+ result = negativeErrno(error);
81
+ }
82
+ if (output.byteLength > payload.byteLength) {
83
+ result = -90;
84
+ output = new Uint8Array();
85
+ }
86
+ // A timed-out caller may already have retired this generation and begun a
87
+ // later request. Never let a stale completion overwrite its response.
88
+ if (Atomics.compareExchange(control, 0, requestId, -requestId) !== requestId)
89
+ return;
90
+ if (output.byteLength > 0)
91
+ payload.set(output);
92
+ Atomics.store(control, 2, result);
93
+ Atomics.store(control, 4, output.byteLength);
94
+ Atomics.store(control, 0, requestId + 1);
95
+ Atomics.notify(control, 0);
96
+ }
97
+ async function operate(operation, input, state) {
98
+ const path = () => requiredString(input.path);
99
+ if (operation === FilesystemOperation.Exists)
100
+ return filesystem.existsSync(path());
101
+ if (operation === FilesystemOperation.Stat || operation === FilesystemOperation.Lstat) {
102
+ const stat = operation === FilesystemOperation.Lstat ? filesystem.lstatSync(path()) : filesystem.statSync(path());
103
+ return {
104
+ file: stat.isFile(), directory: stat.isDirectory(), symbolicLink: stat.isSymbolicLink?.(),
105
+ size: stat.size, mode: stat.mode,
106
+ mtimeMs: stat.mtimeMs, atimeMs: stat.atimeMs, ctimeMs: stat.ctimeMs, nlink: stat.nlink,
107
+ uid: stat.uid, gid: stat.gid, dev: stat.dev, ino: stat.ino, rdev: stat.rdev,
108
+ blksize: stat.blksize, blocks: stat.blocks,
109
+ };
110
+ }
111
+ if (operation === FilesystemOperation.ReadFile)
112
+ return { content: encodeBase64(filesystem.readFileSync(path())) };
113
+ if (operation === FilesystemOperation.WriteFile) {
114
+ filesystem.writeFileSync(path(), decodeBase64(requiredString(input.content)));
115
+ return;
116
+ }
117
+ if (operation === FilesystemOperation.Mkdir) {
118
+ filesystem.mkdirSync(path(), { recursive: input.recursive === true });
119
+ return;
120
+ }
121
+ if (operation === FilesystemOperation.Readdir)
122
+ return filesystem.readdirSync(path());
123
+ if (operation === FilesystemOperation.Unlink) {
124
+ filesystem.unlinkSync(path());
125
+ return;
126
+ }
127
+ if (operation === FilesystemOperation.Rmdir) {
128
+ filesystem.rmdirSync(path());
129
+ return;
130
+ }
131
+ if (operation === FilesystemOperation.Rename) {
132
+ filesystem.renameSync(requiredString(input.from), requiredString(input.to));
133
+ return;
134
+ }
135
+ if (operation === FilesystemOperation.Snapshot)
136
+ return filesystem.toSnapshot();
137
+ if (operation === FilesystemOperation.SnapshotSize) {
138
+ state.snapshot = encoder.encode(JSON.stringify(filesystem.toSnapshot()));
139
+ return { length: state.snapshot.byteLength };
140
+ }
141
+ if (operation === FilesystemOperation.SnapshotChunk) {
142
+ const offset = requiredNumber(input.offset);
143
+ const length = requiredNumber(input.length);
144
+ if (!state.snapshot || offset < 0 || length < 0 || length > FILESYSTEM_SNAPSHOT_CHUNK_BYTES
145
+ || offset + length > state.snapshot.byteLength) {
146
+ throw Object.assign(new Error("EINVAL"), { code: "EINVAL" });
147
+ }
148
+ const content = encodeBase64(state.snapshot.subarray(offset, offset + length));
149
+ if (offset + length === state.snapshot.byteLength)
150
+ delete state.snapshot;
151
+ return { content };
152
+ }
153
+ if (operation === FilesystemOperation.ReplaceSnapshot) {
154
+ filesystem.replaceSnapshot(input.snapshot);
155
+ return;
156
+ }
157
+ if (operation === FilesystemOperation.ReplaceSnapshotStart) {
158
+ const length = requiredNumber(input.length);
159
+ if (length <= 0 || length > 256 * 1024 * 1024) {
160
+ throw Object.assign(new Error("EINVAL"), { code: "EINVAL" });
161
+ }
162
+ state.replacement = { bytes: new Uint8Array(length), offset: 0 };
163
+ return;
164
+ }
165
+ if (operation === FilesystemOperation.ReplaceSnapshotChunk) {
166
+ const offset = requiredNumber(input.offset);
167
+ const chunk = decodeBase64(requiredString(input.content));
168
+ const replacement = state.replacement;
169
+ if (!replacement || offset !== replacement.offset || chunk.byteLength > FILESYSTEM_SNAPSHOT_CHUNK_BYTES
170
+ || offset + chunk.byteLength > replacement.bytes.byteLength) {
171
+ throw Object.assign(new Error("EINVAL"), { code: "EINVAL" });
172
+ }
173
+ replacement.bytes.set(chunk, offset);
174
+ replacement.offset += chunk.byteLength;
175
+ if (replacement.offset === replacement.bytes.byteLength) {
176
+ const snapshot = JSON.parse(decoder.decode(replacement.bytes));
177
+ filesystem.replaceSnapshot(snapshot);
178
+ delete state.replacement;
179
+ }
180
+ return;
181
+ }
182
+ if (operation === FilesystemOperation.Syscall) {
183
+ if (!descriptors)
184
+ throw Object.assign(new Error("EIO"), { code: "EIO" });
185
+ const name = requiredString(input.name);
186
+ const handler = descriptors.imports()[name];
187
+ if (!handler)
188
+ throw Object.assign(new Error("ENOSYS"), { code: "ENOSYS" });
189
+ const args = Array.isArray(input.args) ? input.args.map((value) => BigInt(requiredString(value))) : [];
190
+ return { result: String(await invokeSyscall(name, handler, args)) };
191
+ }
192
+ if (operation === FilesystemOperation.ReadForMapping) {
193
+ if (!descriptors)
194
+ throw Object.assign(new Error("EIO"), { code: "EIO" });
195
+ const value = descriptors.readForMapping(requiredNumber(input.fd), requiredNumber(input.offset), requiredNumber(input.length));
196
+ return value ? { content: encodeBase64(value) } : {};
197
+ }
198
+ if (operation === FilesystemOperation.MappingPath) {
199
+ if (!descriptors)
200
+ throw Object.assign(new Error("EIO"), { code: "EIO" });
201
+ const value = descriptors.mappingPath(requiredNumber(input.fd));
202
+ return value ? { path: value } : {};
203
+ }
204
+ if (operation === FilesystemOperation.WriteForMapping) {
205
+ if (!descriptors)
206
+ throw Object.assign(new Error("EIO"), { code: "EIO" });
207
+ return { written: descriptors.writeForMapping(requiredString(input.path), requiredNumber(input.offset), decodeBase64(requiredString(input.content))) };
208
+ }
209
+ throw Object.assign(new Error("ENOSYS"), { code: "ENOSYS" });
210
+ }
211
+ async function invokeSyscall(name, handler, args) {
212
+ let nonblockingArgs;
213
+ if (name === "SYS_flock") {
214
+ const operation = Number(args[1] ?? 0);
215
+ if ((operation & 4) === 0 && (operation & 8) === 0) {
216
+ nonblockingArgs = [...args];
217
+ nonblockingArgs[1] = BigInt(operation | 4);
218
+ }
219
+ }
220
+ else if (name === "SYS_fcntl") {
221
+ const command = Number(args[1] ?? 0);
222
+ if (command === 7 || command === 38) {
223
+ nonblockingArgs = [...args];
224
+ nonblockingArgs[1] = BigInt(command === 7 ? 6 : 37);
225
+ }
226
+ }
227
+ if (!nonblockingArgs)
228
+ return handler(...args) ?? 0;
229
+ for (;;) {
230
+ const result = handler(...nonblockingArgs) ?? 0;
231
+ if (BigInt(result) !== -11n)
232
+ return result;
233
+ // A blocking advisory lock must not block this worker: it owns the shared
234
+ // descriptor table for every pthread, including the holder that must
235
+ // write and unlock the file. Yield between nonblocking attempts so those
236
+ // syscalls can make progress on their own per-thread RPC channels.
237
+ await new Promise((resolve) => setTimeout(resolve, 5));
238
+ }
239
+ }
240
+ function requiredString(value) {
241
+ if (typeof value !== "string")
242
+ throw Object.assign(new Error("EINVAL"), { code: "EINVAL" });
243
+ return value;
244
+ }
245
+ function requiredNumber(value) {
246
+ if (typeof value !== "number" || !Number.isSafeInteger(value))
247
+ throw Object.assign(new Error("EINVAL"), { code: "EINVAL" });
248
+ return value;
249
+ }
250
+ function negativeErrno(error) {
251
+ const message = error instanceof Error ? error.message : String(error);
252
+ const name = typeof error === "object" && error !== null && "code" in error ? String(error.code)
253
+ : /\b(E[A-Z]+)\b/u.exec(message)?.[1] ?? "EIO";
254
+ return -({ ENOENT: 2, EBADF: 9, EACCES: 13, EEXIST: 17, ENOTDIR: 20, EISDIR: 21,
255
+ EINVAL: 22, EMFILE: 24, ENOSPC: 28, ESPIPE: 29, ERANGE: 34, ENOSYS: 38,
256
+ ENOTEMPTY: 39, EMSGSIZE: 90 }[name] ?? 5);
257
+ }
258
+ function encodeBase64(value) {
259
+ let binary = "";
260
+ for (let offset = 0; offset < value.byteLength; offset += 32_768) {
261
+ binary += String.fromCharCode(...value.subarray(offset, offset + 32_768));
262
+ }
263
+ return btoa(binary);
264
+ }
265
+ function decodeBase64(value) {
266
+ const binary = atob(value);
267
+ return Uint8Array.from(binary, (character) => character.charCodeAt(0));
268
+ }
269
+ //# sourceMappingURL=filesystem-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-worker.js","sourceRoot":"","sources":["../src/filesystem-worker.ts"],"names":[],"mappings":"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"}