@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
package/dist/events.js ADDED
@@ -0,0 +1,289 @@
1
+ import { WaliFileDescriptorTable } from "./filesystem.js";
2
+ const EBADF = 9n;
3
+ const EAGAIN = 11n;
4
+ const EEXIST = 17n;
5
+ const EINVAL = 22n;
6
+ const ENOENT = 2n;
7
+ const EPOLL_CTL_ADD = 1;
8
+ const EPOLL_CTL_DEL = 2;
9
+ const EPOLL_CTL_MOD = 3;
10
+ // Rust's libc definition is not packed for wasm32, so its u64 token retains
11
+ // 8-byte alignment even though musl's C header packs this structure.
12
+ const EPOLL_EVENT_BYTES = 16;
13
+ const EPOLL_DATA_OFFSET = 8;
14
+ const CLOCK_REALTIME = 0;
15
+ const CLOCK_MONOTONIC = 1;
16
+ const CLOCK_BOOTTIME = 7;
17
+ const TFD_TIMER_ABSTIME = 1;
18
+ const TFD_CLOEXEC = 0x8_0000;
19
+ const TFD_NONBLOCK = 0x800;
20
+ const MAX_TIMER_EXPIRATIONS = 0xffffffffffffffffn;
21
+ export class WaliEventHost {
22
+ memory;
23
+ descriptors;
24
+ externalPoll;
25
+ epolls = new Map();
26
+ timers = new Map();
27
+ constructor(memory, descriptors, externalPoll) {
28
+ this.memory = memory;
29
+ this.descriptors = descriptors;
30
+ this.externalPoll = externalPoll;
31
+ }
32
+ imports() {
33
+ return {
34
+ SYS_epoll_create: (size) => Number(size) > 0 ? this.createEpoll() : -EINVAL,
35
+ SYS_epoll_create1: () => this.createEpoll(),
36
+ SYS_epoll_ctl: (epollFd, operation, fd, event) => this.epollControl(Number(epollFd), Number(operation), Number(fd), Number(event)),
37
+ SYS_epoll_wait: (epollFd, events, count, timeout) => this.epollWait(Number(epollFd), Number(events), Number(count), Number(timeout)),
38
+ SYS_epoll_pwait: (epollFd, events, count, timeout) => this.epollWait(Number(epollFd), Number(events), Number(count), Number(timeout)),
39
+ SYS_eventfd: (initial) => this.createEventFd(Number(initial), 0),
40
+ SYS_eventfd2: (initial, flags) => this.createEventFd(Number(initial), Number(flags)),
41
+ SYS_timerfd_create: (clockId, flags) => this.createTimerFd(Number(clockId), Number(flags)),
42
+ SYS_timerfd_settime: (fd, flags, value, previous) => this.setTimerFd(Number(fd), Number(flags), Number(value), Number(previous)),
43
+ };
44
+ }
45
+ bytes() { return new Uint8Array(this.memory().buffer); }
46
+ view() { return new DataView(this.memory().buffer); }
47
+ range(pointer, length) {
48
+ if (pointer < 0 || length < 0 || pointer + length > this.memory().buffer.byteLength) {
49
+ throw new WebAssembly.RuntimeError("WALI event memory access is out of bounds.");
50
+ }
51
+ }
52
+ createEpoll() {
53
+ return BigInt(this.registerEpoll({ registrations: new Map() }));
54
+ }
55
+ registerEpoll(epoll, minimum = 3) {
56
+ let fd = -1;
57
+ const descriptor = {
58
+ poll: () => this.epollReady(fd) ? 0x1 : 0,
59
+ close: () => { this.epolls.delete(fd); },
60
+ fcntl: (command) => command === 3 ? 0n : [1, 2, 4].includes(command) ? 0n : -EINVAL,
61
+ duplicate: (nextMinimum) => BigInt(this.registerEpoll(epoll, nextMinimum)),
62
+ };
63
+ fd = this.descriptors.allocateSpecial(descriptor, minimum);
64
+ this.epolls.set(fd, epoll);
65
+ return fd;
66
+ }
67
+ epollControl(epollFd, operation, fd, eventPointer) {
68
+ const epoll = this.epolls.get(epollFd);
69
+ if (!epoll)
70
+ return -EBADF;
71
+ const current = epoll.registrations.get(fd);
72
+ if (operation === EPOLL_CTL_DEL) {
73
+ if (!current)
74
+ return -ENOENT;
75
+ epoll.registrations.delete(fd);
76
+ return 0n;
77
+ }
78
+ if (operation !== EPOLL_CTL_ADD && operation !== EPOLL_CTL_MOD)
79
+ return -EINVAL;
80
+ if (operation === EPOLL_CTL_ADD && current)
81
+ return -EEXIST;
82
+ if (operation === EPOLL_CTL_MOD && !current)
83
+ return -ENOENT;
84
+ this.range(eventPointer, EPOLL_EVENT_BYTES);
85
+ epoll.registrations.set(fd, {
86
+ fd,
87
+ events: this.view().getUint32(eventPointer, true),
88
+ data: this.bytes().slice(eventPointer + EPOLL_DATA_OFFSET, eventPointer + EPOLL_EVENT_BYTES),
89
+ });
90
+ return 0n;
91
+ }
92
+ epollReady(epollFd) {
93
+ const epoll = this.epolls.get(epollFd);
94
+ if (!epoll)
95
+ return false;
96
+ return [...epoll.registrations.values()].some((entry) => this.readyEvents(entry) !== 0);
97
+ }
98
+ epollWait(epollFd, pointer, count, _timeout) {
99
+ const epoll = this.epolls.get(epollFd);
100
+ if (!epoll)
101
+ return -EBADF;
102
+ if (count <= 0)
103
+ return -EINVAL;
104
+ let written = 0;
105
+ for (const registration of epoll.registrations.values()) {
106
+ if (written >= count)
107
+ break;
108
+ const ready = this.readyEvents(registration);
109
+ if (ready === 0)
110
+ continue;
111
+ const eventPointer = pointer + written * EPOLL_EVENT_BYTES;
112
+ this.range(eventPointer, EPOLL_EVENT_BYTES);
113
+ this.bytes().fill(0, eventPointer, eventPointer + EPOLL_EVENT_BYTES);
114
+ this.view().setUint32(eventPointer, ready, true);
115
+ this.bytes().set(registration.data, eventPointer + EPOLL_DATA_OFFSET);
116
+ written += 1;
117
+ }
118
+ return BigInt(written);
119
+ }
120
+ readyEvents(registration) {
121
+ const pollEvents = ((registration.events & 0x1) ? 0x1 : 0)
122
+ | ((registration.events & 0x4) ? 0x4 : 0);
123
+ const ready = this.externalPoll?.(registration.fd, pollEvents)
124
+ ?? this.descriptors.pollDescriptor(registration.fd, pollEvents);
125
+ let epollEvents = 0;
126
+ if (ready & 0x1)
127
+ epollEvents |= 0x1;
128
+ if (ready & 0x4)
129
+ epollEvents |= 0x4;
130
+ if (ready & 0x8)
131
+ epollEvents |= 0x8;
132
+ if (ready & 0x10)
133
+ epollEvents |= 0x10;
134
+ if (ready & 0x20)
135
+ epollEvents |= 0x8;
136
+ return epollEvents & (registration.events | 0x18);
137
+ }
138
+ createEventFd(initial, flags) {
139
+ if (!Number.isSafeInteger(initial) || initial < 0)
140
+ return -EINVAL;
141
+ let counter = BigInt(initial >>> 0);
142
+ const semaphore = Boolean(flags & 1);
143
+ const nonblocking = Boolean(flags & 0x800);
144
+ const descriptor = {
145
+ poll: (events) => ((events & 0x1) && counter > 0n ? 0x1 : 0) | ((events & 0x4) ? 0x4 : 0),
146
+ read: (length) => {
147
+ if (length < 8)
148
+ return -EINVAL;
149
+ if (counter === 0n)
150
+ return nonblocking ? -EAGAIN : -EAGAIN;
151
+ const value = semaphore ? 1n : counter;
152
+ counter -= value;
153
+ const bytes = new Uint8Array(8);
154
+ new DataView(bytes.buffer).setBigUint64(0, value, true);
155
+ return bytes;
156
+ },
157
+ write: (value) => {
158
+ if (value.byteLength < 8)
159
+ return -EINVAL;
160
+ const increment = new DataView(value.buffer, value.byteOffset, value.byteLength).getBigUint64(0, true);
161
+ if (increment === 0xffffffffffffffffn)
162
+ return -EINVAL;
163
+ counter += increment;
164
+ return 8n;
165
+ },
166
+ fcntl: (command) => command === 3 ? BigInt(nonblocking ? 0x800 : 0) : 0n,
167
+ };
168
+ return BigInt(this.descriptors.allocateSpecial(descriptor));
169
+ }
170
+ createTimerFd(clockId, flags) {
171
+ if (![CLOCK_REALTIME, CLOCK_MONOTONIC, CLOCK_BOOTTIME].includes(clockId))
172
+ return -EINVAL;
173
+ if ((flags & ~(TFD_CLOEXEC | TFD_NONBLOCK)) !== 0)
174
+ return -EINVAL;
175
+ return BigInt(this.registerTimer({
176
+ clockId,
177
+ nonblocking: Boolean(flags & TFD_NONBLOCK),
178
+ intervalNanoseconds: 0n,
179
+ deadlineNanoseconds: undefined,
180
+ expirations: 0n,
181
+ }, 3, Boolean(flags & TFD_CLOEXEC)));
182
+ }
183
+ registerTimer(timer, minimum = 3, initialCloseOnExec = false) {
184
+ let fd = -1;
185
+ let closeOnExec = initialCloseOnExec;
186
+ const descriptor = {
187
+ poll: (events) => {
188
+ this.updateTimer(timer);
189
+ return (events & 0x1) && timer.expirations > 0n ? 0x1 : 0;
190
+ },
191
+ read: (length) => {
192
+ if (length < 8)
193
+ return -EINVAL;
194
+ this.updateTimer(timer);
195
+ if (timer.expirations === 0n)
196
+ return -EAGAIN;
197
+ const value = timer.expirations;
198
+ timer.expirations = 0n;
199
+ const bytes = new Uint8Array(8);
200
+ new DataView(bytes.buffer).setBigUint64(0, value, true);
201
+ return bytes;
202
+ },
203
+ close: () => { this.timers.delete(fd); },
204
+ fcntl: (command, argument) => {
205
+ if (command === 1)
206
+ return BigInt(closeOnExec ? 1 : 0);
207
+ if (command === 2) {
208
+ closeOnExec = Boolean(argument & 1);
209
+ return 0n;
210
+ }
211
+ if (command === 3)
212
+ return BigInt(timer.nonblocking ? TFD_NONBLOCK : 0);
213
+ if (command === 4) {
214
+ timer.nonblocking = Boolean(argument & TFD_NONBLOCK);
215
+ return 0n;
216
+ }
217
+ return -EINVAL;
218
+ },
219
+ duplicate: (nextMinimum, nextCloseOnExec) => BigInt(this.registerTimer(timer, nextMinimum, nextCloseOnExec)),
220
+ };
221
+ fd = this.descriptors.allocateSpecial(descriptor, minimum);
222
+ this.timers.set(fd, timer);
223
+ return fd;
224
+ }
225
+ setTimerFd(fd, flags, valuePointer, previousPointer) {
226
+ const timer = this.timers.get(fd);
227
+ if (!timer)
228
+ return -EBADF;
229
+ if ((flags & ~TFD_TIMER_ABSTIME) !== 0)
230
+ return -EINVAL;
231
+ this.range(valuePointer, 32);
232
+ const interval = this.readTimespec(valuePointer);
233
+ const value = this.readTimespec(valuePointer + 16);
234
+ if (interval === undefined || value === undefined)
235
+ return -EINVAL;
236
+ this.updateTimer(timer);
237
+ if (previousPointer !== 0) {
238
+ this.range(previousPointer, 32);
239
+ this.writeTimespec(previousPointer, timer.intervalNanoseconds);
240
+ this.writeTimespec(previousPointer + 16, this.timerRemaining(timer));
241
+ }
242
+ timer.intervalNanoseconds = interval;
243
+ timer.deadlineNanoseconds = value === 0n ? undefined
244
+ : (flags & TFD_TIMER_ABSTIME) ? value : this.nowNanoseconds(timer.clockId) + value;
245
+ timer.expirations = 0n;
246
+ return 0n;
247
+ }
248
+ updateTimer(timer) {
249
+ if (timer.deadlineNanoseconds === undefined)
250
+ return;
251
+ const now = this.nowNanoseconds(timer.clockId);
252
+ if (now < timer.deadlineNanoseconds)
253
+ return;
254
+ const elapsed = now - timer.deadlineNanoseconds;
255
+ const elapsedExpirations = timer.intervalNanoseconds === 0n
256
+ ? 1n : 1n + elapsed / timer.intervalNanoseconds;
257
+ timer.expirations = timer.expirations + elapsedExpirations > MAX_TIMER_EXPIRATIONS
258
+ ? MAX_TIMER_EXPIRATIONS : timer.expirations + elapsedExpirations;
259
+ timer.deadlineNanoseconds = timer.intervalNanoseconds === 0n
260
+ ? undefined : timer.deadlineNanoseconds + elapsedExpirations * timer.intervalNanoseconds;
261
+ }
262
+ timerRemaining(timer) {
263
+ if (timer.deadlineNanoseconds === undefined)
264
+ return 0n;
265
+ const remaining = timer.deadlineNanoseconds - this.nowNanoseconds(timer.clockId);
266
+ return remaining > 0n ? remaining : 0n;
267
+ }
268
+ readTimespec(pointer) {
269
+ const seconds = this.view().getBigInt64(pointer, true);
270
+ const nanoseconds = this.view().getBigInt64(pointer + 8, true);
271
+ if (seconds < 0n || nanoseconds < 0n || nanoseconds >= 1000000000n)
272
+ return;
273
+ return seconds * 1000000000n + nanoseconds;
274
+ }
275
+ writeTimespec(pointer, nanoseconds) {
276
+ this.view().setBigInt64(pointer, nanoseconds / 1000000000n, true);
277
+ this.view().setBigInt64(pointer + 8, nanoseconds % 1000000000n, true);
278
+ }
279
+ nowNanoseconds(clockId) {
280
+ if (clockId === CLOCK_REALTIME) {
281
+ const milliseconds = typeof performance === "undefined"
282
+ ? Date.now() : performance.timeOrigin + performance.now();
283
+ return BigInt(Math.floor(milliseconds * 1_000_000));
284
+ }
285
+ const milliseconds = typeof performance === "undefined" ? Date.now() : performance.now();
286
+ return BigInt(Math.floor(milliseconds * 1_000_000));
287
+ }
288
+ }
289
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { BrowserFileSystemSnapshot } from "@volter/browser-runtime/browser-filesystem.js";
2
+ export declare const FILESYSTEM_THREAD_PAYLOAD_BYTES: number;
3
+ export declare const FILESYSTEM_ROOT_PAYLOAD_BYTES: number;
4
+ export declare const FILESYSTEM_SNAPSHOT_CHUNK_BYTES: number;
5
+ export declare const enum FilesystemOperation {
6
+ Exists = 1,
7
+ Stat = 2,
8
+ Lstat = 3,
9
+ ReadFile = 4,
10
+ WriteFile = 5,
11
+ Mkdir = 6,
12
+ Readdir = 7,
13
+ Unlink = 8,
14
+ Rmdir = 9,
15
+ Rename = 10,
16
+ Snapshot = 11,
17
+ ReplaceSnapshot = 12,
18
+ Syscall = 13,
19
+ ReadForMapping = 14,
20
+ SnapshotSize = 15,
21
+ SnapshotChunk = 16,
22
+ ReplaceSnapshotStart = 17,
23
+ ReplaceSnapshotChunk = 18,
24
+ MappingPath = 19,
25
+ WriteForMapping = 20
26
+ }
27
+ export interface WaliFilesystemChannel {
28
+ port: MessagePort;
29
+ control: SharedArrayBuffer;
30
+ payload: SharedArrayBuffer;
31
+ }
32
+ export type FilesystemWorkerMessage = {
33
+ kind: "initialize";
34
+ snapshot: BrowserFileSystemSnapshot;
35
+ memory: WebAssembly.Memory;
36
+ cwd: string;
37
+ executablePath: string;
38
+ pid: number;
39
+ updatePort?: MessagePort;
40
+ fileLocks?: {
41
+ channel: import("@volter/browser-runtime/browser-file-locks.js").BrowserFileLockChannel;
42
+ owner: string;
43
+ };
44
+ fileCoherence?: import("@volter/browser-runtime/browser-file-coherence.js").BrowserFileCoherenceChannel;
45
+ } | ({
46
+ kind: "attach";
47
+ } & WaliFilesystemChannel);
48
+ //# sourceMappingURL=filesystem-protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-protocol.d.ts","sourceRoot":"","sources":["../src/filesystem-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+CAA+C,CAAC;AAE/F,eAAO,MAAM,+BAA+B,QAAkB,CAAC;AAC/D,eAAO,MAAM,6BAA6B,QAAmB,CAAC;AAC9D,eAAO,MAAM,+BAA+B,QAAc,CAAC;AAE3D,0BAAkB,mBAAmB;IACnC,MAAM,IAAI;IACV,IAAI,IAAI;IACR,KAAK,IAAI;IACT,QAAQ,IAAI;IACZ,SAAS,IAAI;IACb,KAAK,IAAI;IACT,OAAO,IAAI;IACX,MAAM,IAAI;IACV,KAAK,IAAI;IACT,MAAM,KAAK;IACX,QAAQ,KAAK;IACb,eAAe,KAAK;IACpB,OAAO,KAAK;IACZ,cAAc,KAAK;IACnB,YAAY,KAAK;IACjB,aAAa,KAAK;IAClB,oBAAoB,KAAK;IACzB,oBAAoB,KAAK;IACzB,WAAW,KAAK;IAChB,eAAe,KAAK;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAED,MAAM,MAAM,uBAAuB,GAC/B;IACA,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,yBAAyB,CAAC;IACpC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,SAAS,CAAC,EAAE;QACV,OAAO,EAAE,OAAO,+CAA+C,EAAE,sBAAsB,CAAC;QACxF,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,aAAa,CAAC,EAAE,OAAO,mDAAmD,EAAE,2BAA2B,CAAC;CACzG,GACC,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,qBAAqB,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ export const FILESYSTEM_THREAD_PAYLOAD_BYTES = 2 * 1024 * 1024;
2
+ export const FILESYSTEM_ROOT_PAYLOAD_BYTES = 16 * 1024 * 1024;
3
+ export const FILESYSTEM_SNAPSHOT_CHUNK_BYTES = 1024 * 1024;
4
+ export var FilesystemOperation;
5
+ (function (FilesystemOperation) {
6
+ FilesystemOperation[FilesystemOperation["Exists"] = 1] = "Exists";
7
+ FilesystemOperation[FilesystemOperation["Stat"] = 2] = "Stat";
8
+ FilesystemOperation[FilesystemOperation["Lstat"] = 3] = "Lstat";
9
+ FilesystemOperation[FilesystemOperation["ReadFile"] = 4] = "ReadFile";
10
+ FilesystemOperation[FilesystemOperation["WriteFile"] = 5] = "WriteFile";
11
+ FilesystemOperation[FilesystemOperation["Mkdir"] = 6] = "Mkdir";
12
+ FilesystemOperation[FilesystemOperation["Readdir"] = 7] = "Readdir";
13
+ FilesystemOperation[FilesystemOperation["Unlink"] = 8] = "Unlink";
14
+ FilesystemOperation[FilesystemOperation["Rmdir"] = 9] = "Rmdir";
15
+ FilesystemOperation[FilesystemOperation["Rename"] = 10] = "Rename";
16
+ FilesystemOperation[FilesystemOperation["Snapshot"] = 11] = "Snapshot";
17
+ FilesystemOperation[FilesystemOperation["ReplaceSnapshot"] = 12] = "ReplaceSnapshot";
18
+ FilesystemOperation[FilesystemOperation["Syscall"] = 13] = "Syscall";
19
+ FilesystemOperation[FilesystemOperation["ReadForMapping"] = 14] = "ReadForMapping";
20
+ FilesystemOperation[FilesystemOperation["SnapshotSize"] = 15] = "SnapshotSize";
21
+ FilesystemOperation[FilesystemOperation["SnapshotChunk"] = 16] = "SnapshotChunk";
22
+ FilesystemOperation[FilesystemOperation["ReplaceSnapshotStart"] = 17] = "ReplaceSnapshotStart";
23
+ FilesystemOperation[FilesystemOperation["ReplaceSnapshotChunk"] = 18] = "ReplaceSnapshotChunk";
24
+ FilesystemOperation[FilesystemOperation["MappingPath"] = 19] = "MappingPath";
25
+ FilesystemOperation[FilesystemOperation["WriteForMapping"] = 20] = "WriteForMapping";
26
+ })(FilesystemOperation || (FilesystemOperation = {}));
27
+ //# sourceMappingURL=filesystem-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-protocol.js","sourceRoot":"","sources":["../src/filesystem-protocol.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAC/D,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAC9D,MAAM,CAAC,MAAM,+BAA+B,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3D,MAAM,CAAN,IAAkB,mBAqBjB;AArBD,WAAkB,mBAAmB;IACnC,iEAAU,CAAA;IACV,6DAAQ,CAAA;IACR,+DAAS,CAAA;IACT,qEAAY,CAAA;IACZ,uEAAa,CAAA;IACb,+DAAS,CAAA;IACT,mEAAW,CAAA;IACX,iEAAU,CAAA;IACV,+DAAS,CAAA;IACT,kEAAW,CAAA;IACX,sEAAa,CAAA;IACb,oFAAoB,CAAA;IACpB,oEAAY,CAAA;IACZ,kFAAmB,CAAA;IACnB,8EAAiB,CAAA;IACjB,gFAAkB,CAAA;IAClB,8FAAyB,CAAA;IACzB,8FAAyB,CAAA;IACzB,4EAAgB,CAAA;IAChB,oFAAoB,CAAA;AACtB,CAAC,EArBiB,mBAAmB,KAAnB,mBAAmB,QAqBpC"}
@@ -0,0 +1,65 @@
1
+ import type { BrowserFileSystemSnapshot } from "@volter/browser-runtime/browser-filesystem.js";
2
+ import type { WaliFileStat, WaliFileSystem, WaliImportHandler } from "./types.js";
3
+ import { type WaliFilesystemChannel } from "./filesystem-protocol.js";
4
+ export declare class WaliFilesystemClient implements WaliFileSystem {
5
+ private readonly channel;
6
+ private readonly control;
7
+ private readonly payload;
8
+ private readonly encoder;
9
+ private readonly decoder;
10
+ private nextRequestId;
11
+ constructor(channel: WaliFilesystemChannel);
12
+ existsSync(path: string): boolean;
13
+ statSync(path: string): WaliFileStat;
14
+ lstatSync(path: string): WaliFileStat;
15
+ readFileSync(path: string): Uint8Array;
16
+ writeFileSync(path: string, data: string | Uint8Array): void;
17
+ mkdirSync(path: string, options?: {
18
+ recursive?: boolean;
19
+ }): void;
20
+ readdirSync(path: string): string[];
21
+ unlinkSync(path: string): void;
22
+ rmdirSync(path: string): void;
23
+ renameSync(from: string, to: string): void;
24
+ toSnapshot(): BrowserFileSystemSnapshot;
25
+ private readChunked;
26
+ replaceSnapshot(snapshot: BrowserFileSystemSnapshot): void;
27
+ syscall(name: string, args: Array<number | bigint>): bigint;
28
+ readForMapping(fd: number, offset: number, length: number): Uint8Array | undefined;
29
+ mappingPath(fd: number): string | undefined;
30
+ writeForMapping(path: string, offset: number, value: Uint8Array): boolean;
31
+ private call;
32
+ }
33
+ export declare class WaliFilesystemCoordinator {
34
+ private readonly worker;
35
+ private readonly root;
36
+ private constructor();
37
+ static create(snapshot: BrowserFileSystemSnapshot, options: {
38
+ memory: WebAssembly.Memory;
39
+ cwd: string;
40
+ executablePath: string;
41
+ pid: number;
42
+ updatePort?: MessagePort;
43
+ fileLocks?: {
44
+ channel: import("@volter/browser-runtime/browser-file-locks.js").BrowserFileLockChannel;
45
+ owner: string;
46
+ };
47
+ fileCoherence?: import("@volter/browser-runtime/browser-file-coherence.js").BrowserFileCoherenceChannel;
48
+ }): Promise<WaliFilesystemCoordinator>;
49
+ createChannel(payloadBytes: number): WaliFilesystemChannel;
50
+ filesystem(): WaliFilesystemClient;
51
+ snapshot(): BrowserFileSystemSnapshot;
52
+ replaceSnapshot(snapshot: BrowserFileSystemSnapshot): void;
53
+ terminate(): void;
54
+ }
55
+ /** Process-wide ordinary file descriptors shared by every Wasm pthread. */
56
+ export declare class WaliSharedFileDescriptorHost {
57
+ private readonly client;
58
+ private readonly stdioAliasRegistry?;
59
+ constructor(client: WaliFilesystemClient, stdioAliasRegistry?: Int32Array | undefined);
60
+ imports(fallback: Record<string, WaliImportHandler>): Record<string, WaliImportHandler>;
61
+ readForMapping(fd: number, offset: number, length: number): Uint8Array | undefined;
62
+ mappingPath(fd: number): string | undefined;
63
+ writeForMapping(path: string, offset: number, value: Uint8Array): boolean;
64
+ }
65
+ //# sourceMappingURL=filesystem-remote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-remote.d.ts","sourceRoot":"","sources":["../src/filesystem-remote.ts"],"names":[],"mappings":"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"}