@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,476 @@
1
+ import { WaliWebSocketPeer } from "./websocket-peer.js";
2
+ const MAX_ACTIVE_CONNECTIONS = 32;
3
+ const MAX_REQUEST_BYTES = 16 * 1024 * 1024;
4
+ const MAX_RESPONSE_BYTES = 32 * 1024 * 1024;
5
+ const MAX_HEADER_BYTES = 64 * 1024;
6
+ const MAX_HEADERS = 128;
7
+ const RESPONSE_TIMEOUT_MS = 30_000;
8
+ /** Registers WALI listening sockets as ordinary servers in the browser port table. */
9
+ export class BrowserWaliLoopbackHost {
10
+ bridge;
11
+ webSocketRegistry;
12
+ nextConnection = 1;
13
+ constructor(bridge, webSocketRegistry) {
14
+ this.bridge = bridge;
15
+ this.webSocketRegistry = webSocketRegistry;
16
+ }
17
+ attach(port) {
18
+ const registered = new Set();
19
+ const pending = new Map();
20
+ const outgoing = new Map();
21
+ const webSockets = new Map();
22
+ const webSocketRegistrations = new Map();
23
+ let closed = false;
24
+ const activeConnections = () => pending.size + outgoing.size + webSockets.size;
25
+ const send = (message) => {
26
+ if (!closed)
27
+ port.postMessage(message);
28
+ };
29
+ const unregister = (virtualPort) => {
30
+ if (!registered.delete(virtualPort))
31
+ return;
32
+ webSocketRegistrations.get(virtualPort)?.();
33
+ webSocketRegistrations.delete(virtualPort);
34
+ for (const [connectionId, active] of webSockets) {
35
+ if (active.port === virtualPort) {
36
+ active.peer.terminate("WALI WebSocket server stopped.");
37
+ webSockets.delete(connectionId);
38
+ }
39
+ }
40
+ this.bridge.unregisterServer(virtualPort);
41
+ };
42
+ const openWebSocket = (virtualPort, path, protocols, handlers) => {
43
+ if (closed)
44
+ throw new Error("WALI loopback host is closed.");
45
+ if (activeConnections() >= MAX_ACTIVE_CONNECTIONS) {
46
+ throw new Error("WALI loopback concurrency exceeded.");
47
+ }
48
+ const connectionId = this.nextConnection++;
49
+ const peer = new WaliWebSocketPeer({
50
+ path,
51
+ port: virtualPort,
52
+ protocols,
53
+ handlers,
54
+ send: (bytes) => send({ type: "data", connectionId, bytes }),
55
+ disconnect: () => send({ type: "peer-close", connectionId }),
56
+ finished: () => webSockets.delete(connectionId),
57
+ });
58
+ webSockets.set(connectionId, { port: virtualPort, peer });
59
+ send({ type: "incoming", connectionId, port: virtualPort, bytes: peer.handshake });
60
+ return peer;
61
+ };
62
+ const request = (virtualPort, method, url, headers, body) => {
63
+ if (closed)
64
+ return Promise.reject(new Error("WALI loopback host is closed."));
65
+ if (activeConnections() >= MAX_ACTIVE_CONNECTIONS) {
66
+ return Promise.reject(new Error("WALI loopback concurrency exceeded."));
67
+ }
68
+ const bytes = serializeRequest(method, url, headers, body);
69
+ if (bytes.byteLength > MAX_REQUEST_BYTES)
70
+ return Promise.reject(new Error("WALI loopback request exceeds 16 MiB."));
71
+ const connectionId = this.nextConnection++;
72
+ return new Promise((resolve, reject) => {
73
+ const timeout = window.setTimeout(() => {
74
+ pending.delete(connectionId);
75
+ send({ type: "peer-close", connectionId });
76
+ reject(new Error("WALI loopback response timed out."));
77
+ }, RESPONSE_TIMEOUT_MS);
78
+ pending.set(connectionId, { method, chunks: [], byteLength: 0, resolve, reject, timeout });
79
+ send({ type: "incoming", connectionId, port: virtualPort, bytes });
80
+ });
81
+ };
82
+ const finish = (connectionId, error, response) => {
83
+ const active = pending.get(connectionId);
84
+ if (!active)
85
+ return;
86
+ pending.delete(connectionId);
87
+ window.clearTimeout(active.timeout);
88
+ send({ type: "peer-close", connectionId });
89
+ if (error)
90
+ active.reject(error);
91
+ else
92
+ active.resolve(response);
93
+ };
94
+ const finishOutgoing = (connectionId) => {
95
+ const active = outgoing.get(connectionId);
96
+ if (!active)
97
+ return;
98
+ outgoing.delete(connectionId);
99
+ window.clearTimeout(active.timeout);
100
+ send({ type: "peer-close", connectionId });
101
+ };
102
+ const dispatchOutgoing = async (connectionId, peerClosed) => {
103
+ const active = outgoing.get(connectionId);
104
+ if (!active || active.handling)
105
+ return;
106
+ try {
107
+ const parsed = parseRequest(active.chunks, active.byteLength, peerClosed);
108
+ if (!parsed) {
109
+ if (peerClosed)
110
+ finishOutgoing(connectionId);
111
+ return;
112
+ }
113
+ active.handling = true;
114
+ const response = await this.bridge.handleRequest(active.port, parsed.method, parsed.url, parsed.headers, parsed.body?.buffer.slice(parsed.body.byteOffset, parsed.body.byteOffset + parsed.body.byteLength));
115
+ if (!outgoing.has(connectionId))
116
+ return;
117
+ const bytes = serializeResponse({
118
+ statusCode: response.statusCode,
119
+ headers: response.headers,
120
+ ...(response.statusMessage !== undefined ? { statusMessage: response.statusMessage } : {}),
121
+ ...(response.body ? { body: Uint8Array.from(response.body) } : {}),
122
+ });
123
+ if (bytes.byteLength > MAX_RESPONSE_BYTES)
124
+ throw new Error("Browser loopback response exceeds 32 MiB.");
125
+ send({ type: "data", connectionId, bytes });
126
+ }
127
+ catch {
128
+ // The native client observes EOF when a browser-local peer rejects or
129
+ // cannot parse its request.
130
+ }
131
+ finally {
132
+ finishOutgoing(connectionId);
133
+ }
134
+ };
135
+ port.onmessage = (event) => {
136
+ const message = event.data;
137
+ if (message.type === "listen") {
138
+ let result = 0;
139
+ if (!validPort(message.port) || this.bridge.getServerPorts().includes(message.port))
140
+ result = -98;
141
+ else {
142
+ try {
143
+ const server = {
144
+ listening: true,
145
+ address: () => ({ port: message.port, address: "0.0.0.0", family: "IPv4" }),
146
+ handleRequest: (method, url, headers, body) => request(message.port, method, url, headers, body),
147
+ };
148
+ this.bridge.registerServer(server, message.port);
149
+ if (this.webSocketRegistry) {
150
+ webSocketRegistrations.set(message.port, this.webSocketRegistry.register(message.port, {
151
+ open: (path, protocols, handlers) => openWebSocket(message.port, path, protocols, handlers),
152
+ }));
153
+ }
154
+ registered.add(message.port);
155
+ }
156
+ catch {
157
+ webSocketRegistrations.get(message.port)?.();
158
+ webSocketRegistrations.delete(message.port);
159
+ this.bridge.unregisterServer(message.port);
160
+ result = -98;
161
+ }
162
+ }
163
+ send({ type: "ack", requestId: message.requestId, result });
164
+ return;
165
+ }
166
+ if (message.type === "connect") {
167
+ let result = 0;
168
+ if (!validPort(message.port) || !Number.isSafeInteger(message.connectionId)
169
+ || !this.bridge.getServerPorts().includes(message.port)
170
+ || activeConnections() >= MAX_ACTIVE_CONNECTIONS || outgoing.has(message.connectionId)) {
171
+ result = -111;
172
+ }
173
+ else {
174
+ const timeout = window.setTimeout(() => finishOutgoing(message.connectionId), RESPONSE_TIMEOUT_MS);
175
+ outgoing.set(message.connectionId, {
176
+ port: message.port,
177
+ chunks: [],
178
+ byteLength: 0,
179
+ timeout,
180
+ handling: false,
181
+ });
182
+ }
183
+ send({ type: "ack", requestId: message.requestId, result });
184
+ return;
185
+ }
186
+ if (message.type === "unlisten") {
187
+ unregister(message.port);
188
+ return;
189
+ }
190
+ const response = pending.get(message.connectionId);
191
+ const outbound = outgoing.get(message.connectionId);
192
+ const webSocket = webSockets.get(message.connectionId)?.peer;
193
+ if (!response && !outbound && !webSocket)
194
+ return;
195
+ try {
196
+ if (message.type === "outgoing") {
197
+ if (webSocket) {
198
+ webSocket.receive(message.bytes);
199
+ return;
200
+ }
201
+ if (outbound) {
202
+ outbound.chunks.push(message.bytes.slice());
203
+ outbound.byteLength += message.bytes.byteLength;
204
+ if (outbound.byteLength > MAX_REQUEST_BYTES)
205
+ throw new Error("WALI loopback request exceeds 16 MiB.");
206
+ void dispatchOutgoing(message.connectionId, false);
207
+ return;
208
+ }
209
+ if (!response)
210
+ return;
211
+ response.chunks.push(message.bytes.slice());
212
+ response.byteLength += message.bytes.byteLength;
213
+ if (response.byteLength > MAX_RESPONSE_BYTES) {
214
+ finish(message.connectionId, new Error("WALI loopback response exceeds 32 MiB."));
215
+ return;
216
+ }
217
+ const parsed = parseResponse(response.method, response.chunks, response.byteLength, false);
218
+ if (parsed)
219
+ finish(message.connectionId, undefined, parsed);
220
+ }
221
+ else if (message.type === "closed") {
222
+ if (webSocket) {
223
+ webSocket.peerClosed();
224
+ return;
225
+ }
226
+ if (outbound) {
227
+ void dispatchOutgoing(message.connectionId, true);
228
+ return;
229
+ }
230
+ if (!response)
231
+ return;
232
+ const parsed = parseResponse(response.method, response.chunks, response.byteLength, true);
233
+ finish(message.connectionId, parsed ? undefined : new Error("WALI server closed before returning a complete HTTP response."), parsed);
234
+ }
235
+ }
236
+ catch (error) {
237
+ if (webSocket)
238
+ webSocket.terminate(error instanceof Error ? error.message : String(error));
239
+ else if (response)
240
+ finish(message.connectionId, error);
241
+ else
242
+ finishOutgoing(message.connectionId);
243
+ }
244
+ };
245
+ port.start();
246
+ return () => {
247
+ if (closed)
248
+ return;
249
+ closed = true;
250
+ for (const virtualPort of [...registered])
251
+ unregister(virtualPort);
252
+ for (const active of pending.values()) {
253
+ window.clearTimeout(active.timeout);
254
+ active.reject(new Error("WALI loopback server stopped."));
255
+ }
256
+ pending.clear();
257
+ for (const active of outgoing.values())
258
+ window.clearTimeout(active.timeout);
259
+ outgoing.clear();
260
+ for (const active of webSockets.values())
261
+ active.peer.terminate("WALI loopback host stopped.");
262
+ webSockets.clear();
263
+ for (const release of webSocketRegistrations.values())
264
+ release();
265
+ webSocketRegistrations.clear();
266
+ port.close();
267
+ };
268
+ }
269
+ }
270
+ function parseRequest(chunks, byteLength, closed) {
271
+ const bytes = concatenate(chunks, byteLength);
272
+ const boundary = indexOf(bytes, [13, 10, 13, 10]);
273
+ if (boundary < 0)
274
+ return;
275
+ if (boundary > MAX_HEADER_BYTES)
276
+ throw new Error("WALI loopback request headers exceed 64 KiB.");
277
+ const head = new TextDecoder("utf-8", { fatal: true }).decode(bytes.subarray(0, boundary));
278
+ const lines = head.split("\r\n");
279
+ const request = /^([!#$%&'*+.^_`|~0-9A-Za-z-]+) ([^\s]+) HTTP\/1\.[01]$/u.exec(lines.shift() ?? "");
280
+ if (!request)
281
+ throw new Error("WALI loopback client sent an invalid HTTP request line.");
282
+ if (lines.length > MAX_HEADERS)
283
+ throw new Error("WALI loopback request has too many headers.");
284
+ const headers = {};
285
+ for (const line of lines) {
286
+ const separator = line.indexOf(":");
287
+ if (separator <= 0)
288
+ throw new Error("WALI loopback client sent an invalid HTTP header.");
289
+ const name = line.slice(0, separator).trim().toLowerCase();
290
+ const value = line.slice(separator + 1).trim();
291
+ if (!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(name) || /[\u0000\r\n]/u.test(value)) {
292
+ throw new Error("WALI loopback client sent an invalid HTTP header.");
293
+ }
294
+ headers[name] = headers[name] === undefined ? value : `${headers[name]}, ${value}`;
295
+ }
296
+ const rawTarget = request[2];
297
+ const url = rawTarget.startsWith("http://") || rawTarget.startsWith("https://")
298
+ ? (() => { const parsed = new URL(rawTarget); return `${parsed.pathname}${parsed.search}`; })()
299
+ : rawTarget;
300
+ if (!url.startsWith("/") || url.length > 16_384)
301
+ throw new Error("Invalid WALI loopback request target.");
302
+ const bodyStart = boundary + 4;
303
+ const transferEncoding = headers["transfer-encoding"]?.toLowerCase();
304
+ if (transferEncoding && headers["content-length"] !== undefined) {
305
+ throw new Error("Ambiguous WALI loopback request framing.");
306
+ }
307
+ if (transferEncoding?.includes("chunked")) {
308
+ const body = decodeChunked(bytes.subarray(bodyStart));
309
+ if (!body)
310
+ return;
311
+ delete headers["transfer-encoding"];
312
+ headers["content-length"] = String(body.byteLength);
313
+ return { method: request[1], url, headers, body };
314
+ }
315
+ if (transferEncoding)
316
+ throw new Error("Unsupported WALI loopback request transfer encoding.");
317
+ const contentLength = headers["content-length"];
318
+ if (contentLength !== undefined) {
319
+ const length = Number(contentLength);
320
+ if (!Number.isSafeInteger(length) || length < 0 || length > MAX_REQUEST_BYTES) {
321
+ throw new Error("Invalid WALI loopback request Content-Length.");
322
+ }
323
+ if (bytes.byteLength - bodyStart < length)
324
+ return;
325
+ return { method: request[1], url, headers, body: bytes.slice(bodyStart, bodyStart + length) };
326
+ }
327
+ if (bytes.byteLength === bodyStart)
328
+ return { method: request[1], url, headers };
329
+ if (!closed)
330
+ return;
331
+ return { method: request[1], url, headers, body: bytes.slice(bodyStart) };
332
+ }
333
+ function serializeResponse(response) {
334
+ if (!Number.isInteger(response.statusCode) || response.statusCode < 100 || response.statusCode > 599) {
335
+ throw new Error("Invalid browser loopback response status.");
336
+ }
337
+ const body = response.body ?? new Uint8Array();
338
+ const headers = {};
339
+ for (const [name, value] of Object.entries(response.headers)) {
340
+ if (!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(name))
341
+ continue;
342
+ const normalized = (Array.isArray(value) ? value.join(", ") : value).replace(/[\u0000\r\n]/gu, "");
343
+ headers[name.toLowerCase()] = normalized;
344
+ }
345
+ delete headers["transfer-encoding"];
346
+ headers["content-length"] = String(body.byteLength);
347
+ headers.connection = "close";
348
+ const reason = (response.statusMessage || "OK").replace(/[\u0000\r\n]/gu, "");
349
+ const head = new TextEncoder().encode(`HTTP/1.1 ${response.statusCode} ${reason}\r\n${Object.entries(headers)
350
+ .map(([name, value]) => `${name}: ${value}`).join("\r\n")}\r\n\r\n`);
351
+ const bytes = new Uint8Array(head.byteLength + body.byteLength);
352
+ bytes.set(head);
353
+ bytes.set(body, head.byteLength);
354
+ return bytes;
355
+ }
356
+ function serializeRequest(method, url, headers, body) {
357
+ const encoder = new TextEncoder();
358
+ const payload = typeof body === "string" ? encoder.encode(body) : body ?? new Uint8Array();
359
+ const normalized = {};
360
+ for (const [name, value] of Object.entries(headers)) {
361
+ if (!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(name) || /[\u0000\r\n]/u.test(value)) {
362
+ throw new Error("Invalid WALI loopback request header.");
363
+ }
364
+ normalized[name.toLowerCase()] = value;
365
+ }
366
+ normalized.host ??= "localhost";
367
+ normalized.connection = "close";
368
+ if (payload.byteLength > 0)
369
+ normalized["content-length"] = String(payload.byteLength);
370
+ const head = encoder.encode(`${method} ${url} HTTP/1.1\r\n${Object.entries(normalized)
371
+ .map(([name, value]) => `${name}: ${value}`).join("\r\n")}\r\n\r\n`);
372
+ const result = new Uint8Array(head.byteLength + payload.byteLength);
373
+ result.set(head);
374
+ result.set(payload, head.byteLength);
375
+ return result;
376
+ }
377
+ function parseResponse(method, chunks, byteLength, closed) {
378
+ const bytes = concatenate(chunks, byteLength);
379
+ const boundary = indexOf(bytes, [13, 10, 13, 10]);
380
+ if (boundary < 0)
381
+ return;
382
+ const head = new TextDecoder("utf-8", { fatal: true }).decode(bytes.subarray(0, boundary));
383
+ const lines = head.split("\r\n");
384
+ const status = /^HTTP\/1\.[01] ([1-5][0-9]{2})(?: (.*))?$/u.exec(lines.shift() ?? "");
385
+ if (!status)
386
+ throw new Error("WALI loopback server returned an invalid HTTP status line.");
387
+ const headers = {};
388
+ for (const line of lines) {
389
+ const separator = line.indexOf(":");
390
+ if (separator <= 0)
391
+ throw new Error("WALI loopback server returned an invalid HTTP header.");
392
+ const name = line.slice(0, separator).trim().toLowerCase();
393
+ const value = line.slice(separator + 1).trim();
394
+ const existing = headers[name];
395
+ headers[name] = existing === undefined ? value : Array.isArray(existing) ? [...existing, value] : [existing, value];
396
+ }
397
+ const statusCode = Number(status[1]);
398
+ const bodyStart = boundary + 4;
399
+ const bodyForbidden = method === "HEAD" || statusCode < 200 || statusCode === 204 || statusCode === 304;
400
+ if (bodyForbidden)
401
+ return { statusCode, statusMessage: status[2] || "", headers };
402
+ const transferEncoding = header(headers, "transfer-encoding")?.toLowerCase();
403
+ if (transferEncoding?.includes("chunked")) {
404
+ const decoded = decodeChunked(bytes.subarray(bodyStart));
405
+ if (!decoded)
406
+ return;
407
+ return { statusCode, statusMessage: status[2] || "", headers, body: decoded };
408
+ }
409
+ const contentLength = header(headers, "content-length");
410
+ if (contentLength !== undefined) {
411
+ const length = Number(contentLength);
412
+ if (!Number.isSafeInteger(length) || length < 0 || length > MAX_RESPONSE_BYTES)
413
+ throw new Error("Invalid WALI loopback Content-Length.");
414
+ if (bytes.byteLength - bodyStart < length)
415
+ return;
416
+ return { statusCode, statusMessage: status[2] || "", headers, body: bytes.slice(bodyStart, bodyStart + length) };
417
+ }
418
+ if (!closed)
419
+ return;
420
+ return { statusCode, statusMessage: status[2] || "", headers, body: bytes.slice(bodyStart) };
421
+ }
422
+ function decodeChunked(bytes) {
423
+ const chunks = [];
424
+ let total = 0;
425
+ let offset = 0;
426
+ for (;;) {
427
+ const lineEnd = indexOf(bytes, [13, 10], offset);
428
+ if (lineEnd < 0)
429
+ return;
430
+ const line = new TextDecoder().decode(bytes.subarray(offset, lineEnd)).split(";", 1)[0] ?? "";
431
+ const length = Number.parseInt(line, 16);
432
+ if (!Number.isSafeInteger(length) || length < 0)
433
+ throw new Error("Invalid WALI loopback chunk length.");
434
+ offset = lineEnd + 2;
435
+ if (length === 0) {
436
+ if (bytes.byteLength < offset + 2)
437
+ return;
438
+ return concatenate(chunks, total);
439
+ }
440
+ if (bytes.byteLength < offset + length + 2)
441
+ return;
442
+ chunks.push(bytes.slice(offset, offset + length));
443
+ total += length;
444
+ if (total > MAX_RESPONSE_BYTES || bytes[offset + length] !== 13 || bytes[offset + length + 1] !== 10) {
445
+ throw new Error("Invalid WALI loopback chunked response.");
446
+ }
447
+ offset += length + 2;
448
+ }
449
+ }
450
+ function concatenate(chunks, length) {
451
+ const result = new Uint8Array(length);
452
+ let offset = 0;
453
+ for (const chunk of chunks) {
454
+ result.set(chunk, offset);
455
+ offset += chunk.byteLength;
456
+ }
457
+ return result;
458
+ }
459
+ function indexOf(bytes, needle, start = 0) {
460
+ outer: for (let index = start; index <= bytes.byteLength - needle.length; index += 1) {
461
+ for (let offset = 0; offset < needle.length; offset += 1) {
462
+ if (bytes[index + offset] !== needle[offset])
463
+ continue outer;
464
+ }
465
+ return index;
466
+ }
467
+ return -1;
468
+ }
469
+ function header(headers, name) {
470
+ const value = headers[name];
471
+ return Array.isArray(value) ? value[0] : value;
472
+ }
473
+ function validPort(port) {
474
+ return Number.isSafeInteger(port) && port > 0 && port <= 65_535;
475
+ }
476
+ //# sourceMappingURL=loopback-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loopback-host.js","sourceRoot":"","sources":["../src/loopback-host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export type WaliLoopbackWorkerMessage = {
2
+ type: "listen";
3
+ requestId: number;
4
+ port: number;
5
+ } | {
6
+ type: "connect";
7
+ requestId: number;
8
+ connectionId: number;
9
+ port: number;
10
+ } | {
11
+ type: "unlisten";
12
+ port: number;
13
+ } | {
14
+ type: "outgoing";
15
+ connectionId: number;
16
+ bytes: Uint8Array;
17
+ } | {
18
+ type: "closed";
19
+ connectionId: number;
20
+ };
21
+ export type WaliLoopbackHostMessage = {
22
+ type: "ack";
23
+ requestId: number;
24
+ result: number;
25
+ } | {
26
+ type: "incoming";
27
+ connectionId: number;
28
+ port: number;
29
+ bytes: Uint8Array;
30
+ } | {
31
+ type: "data";
32
+ connectionId: number;
33
+ bytes: Uint8Array;
34
+ } | {
35
+ type: "peer-close";
36
+ connectionId: number;
37
+ };
38
+ export interface WaliLoopbackAttachment {
39
+ attach(port: MessagePort): () => void;
40
+ }
41
+ //# sourceMappingURL=loopback-protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loopback-protocol.d.ts","sourceRoot":"","sources":["../src/loopback-protocol.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GACjC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7C,MAAM,MAAM,uBAAuB,GAC/B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAC3E;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,IAAI,CAAC;CACvC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loopback-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loopback-protocol.js","sourceRoot":"","sources":["../src/loopback-protocol.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ import type { WaliImportHandler } from "./types.js";
2
+ export declare function createWaliSharedMmapRegistry(): SharedArrayBuffer;
3
+ export declare function createWaliAllocatorControl(): SharedArrayBuffer;
4
+ export declare class WaliMemoryManager {
5
+ private readonly memory;
6
+ private readonly readFile;
7
+ private readonly fileKey?;
8
+ private readonly writeSharedFile?;
9
+ private readonly mappings;
10
+ private readonly allocatorState;
11
+ private allocatorInitialized;
12
+ constructor(memory: () => WebAssembly.Memory, readFile: (fd: number, offset: number, length: number) => Uint8Array | undefined, sharedMmapCursor?: SharedArrayBuffer, fileKey?: ((fd: number) => string | undefined) | undefined, writeSharedFile?: ((key: string, offset: number, value: Uint8Array) => boolean) | undefined, sharedMmapRegistry?: SharedArrayBuffer);
13
+ private readonly sharedRegistry;
14
+ allocatorControl(): SharedArrayBuffer;
15
+ imports(): Record<string, WaliImportHandler>;
16
+ private brk;
17
+ private mmap;
18
+ private mprotect;
19
+ private munmap;
20
+ private mremap;
21
+ private madvise;
22
+ private msync;
23
+ private flushMapping;
24
+ private claimSharedMapping;
25
+ private releaseSharedMapping;
26
+ private lockSharedRegistry;
27
+ private unlockSharedRegistry;
28
+ private reserve;
29
+ private initializeAllocator;
30
+ private release;
31
+ private reserveTail;
32
+ private firstFreeRangeSlot;
33
+ private collapseFreeTail;
34
+ private lockAllocator;
35
+ private unlockAllocator;
36
+ private overlaps;
37
+ private ensureCapacity;
38
+ }
39
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA6CpD,wBAAgB,4BAA4B,IAAI,iBAAiB,CAGhE;AAED,wBAAgB,0BAA0B,IAAI,iBAAiB,CAE9D;AAED,qBAAa,iBAAiB;IAM1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAEzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IATnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAa;IAC5C,OAAO,CAAC,oBAAoB,CAAS;gBAGlB,MAAM,EAAE,MAAM,WAAW,CAAC,MAAM,EAChC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,EACjG,gBAAgB,CAAC,EAAE,iBAAiB,EACnB,OAAO,CAAC,GAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,aAAA,EAC5C,eAAe,CAAC,GAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,KAAK,OAAO,aAAA,EAC9F,kBAAkB,CAAC,EAAE,iBAAiB;IAcxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IAExD,gBAAgB,IAAI,iBAAiB;IAKrC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAgB5C,OAAO,CAAC,GAAG;IAaX,OAAO,CAAC,IAAI;IA6CZ,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,MAAM;IA8Bd,OAAO,CAAC,MAAM;IA6Dd,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,kBAAkB;IAiD1B,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,OAAO;IA4Bf,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,OAAO;IAuCf,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,cAAc;CAWvB"}