@bytecodealliance/preview2-shim 0.20.0 → 0.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1725 @@
1
+ import { createReadStream, createWriteStream, read } from "node:fs";
2
+ import process, { hrtime, nextTick, stderr, stdout } from "node:process";
3
+ import { PassThrough, Readable } from "node:stream";
4
+ import { parentPort, workerData } from "node:worker_threads";
5
+ import { Agent, createServer, request } from "node:http";
6
+ import { Agent as Agent$1, request as request$1 } from "node:https";
7
+ import { Server, Socket, isIP } from "node:net";
8
+ import { lookup } from "node:dns/promises";
9
+ import { createSocket } from "node:dgram";
10
+ import { ALL, BADFAMILY, CANCELLED, CONNREFUSED, NODATA, NOMEM, NONAME, NOTFOUND, REFUSED, SERVFAIL, TIMEOUT, V4MAPPED } from "node:dns";
11
+ import { EACCES, EADDRINUSE, EADDRNOTAVAIL, EALREADY, EBADF, ECONNABORTED, ECONNREFUSED, ECONNRESET, EINVAL, ENOBUFS, ENOMEM, ENOTCONN, ENOTSUP, EPERM, EWOULDBLOCK } from "node:constants";
12
+ //#region \0rolldown/runtime.js
13
+ var __defProp = Object.defineProperty;
14
+ var __exportAll = (all, no_symbols) => {
15
+ let target = {};
16
+ for (var name in all) __defProp(target, name, {
17
+ get: all[name],
18
+ enumerable: true
19
+ });
20
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
21
+ return target;
22
+ };
23
+ //#endregion
24
+ //#region dist/synckit/index.js
25
+ function extractProperties(object) {
26
+ if (object && typeof object === "object") {
27
+ const properties = {};
28
+ for (const key in object) properties[key] = object[key];
29
+ return properties;
30
+ }
31
+ }
32
+ function runAsWorker(fn) {
33
+ if (!workerData) return;
34
+ const { workerPort, debug } = workerData;
35
+ try {
36
+ parentPort?.on("message", ({ sharedBuffer, cid, args }) => {
37
+ (async () => {
38
+ const sharedBufferView = new Int32Array(sharedBuffer);
39
+ let msg;
40
+ try {
41
+ msg = {
42
+ cid,
43
+ result: await fn(...args)
44
+ };
45
+ } catch (error) {
46
+ msg = {
47
+ cid,
48
+ error,
49
+ properties: extractProperties(error)
50
+ };
51
+ }
52
+ workerPort.postMessage(msg);
53
+ Atomics.add(sharedBufferView, 0, 1);
54
+ Atomics.notify(sharedBufferView, 0);
55
+ })();
56
+ });
57
+ } catch (error) {
58
+ parentPort?.on("message", ({ sharedBuffer, cid }) => {
59
+ const sharedBufferView = new Int32Array(sharedBuffer);
60
+ workerPort.postMessage({
61
+ cid,
62
+ error,
63
+ properties: extractProperties(error)
64
+ });
65
+ Atomics.add(sharedBufferView, 0, 1);
66
+ Atomics.notify(sharedBufferView, 0);
67
+ });
68
+ }
69
+ return debug;
70
+ }
71
+ //#endregion
72
+ //#region dist/io/calls.js
73
+ var calls_exports = /* @__PURE__ */ __exportAll({
74
+ CALL_MASK: () => CALL_MASK,
75
+ CALL_SHIFT: () => 24,
76
+ CALL_TYPE_MASK: () => CALL_TYPE_MASK,
77
+ CLOCKS: () => CLOCKS,
78
+ CLOCKS_DURATION_SUBSCRIBE: () => CLOCKS_DURATION_SUBSCRIBE,
79
+ CLOCKS_INSTANT_SUBSCRIBE: () => CLOCKS_INSTANT_SUBSCRIBE,
80
+ FILE: () => FILE,
81
+ FUTURE_DISPOSE: () => FUTURE_DISPOSE,
82
+ FUTURE_SUBSCRIBE: () => FUTURE_SUBSCRIBE,
83
+ FUTURE_TAKE_VALUE: () => FUTURE_TAKE_VALUE,
84
+ HTTP: () => HTTP,
85
+ HTTP_CREATE_REQUEST: () => HTTP_CREATE_REQUEST,
86
+ HTTP_OUTGOING_BODY_DISPOSE: () => HTTP_OUTGOING_BODY_DISPOSE,
87
+ HTTP_OUTPUT_STREAM_FINISH: () => HTTP_OUTPUT_STREAM_FINISH,
88
+ HTTP_SERVER_CLEAR_OUTGOING_RESPONSE: () => HTTP_SERVER_CLEAR_OUTGOING_RESPONSE,
89
+ HTTP_SERVER_GET_ADDRESS: () => HTTP_SERVER_GET_ADDRESS,
90
+ HTTP_SERVER_INCOMING_HANDLER: () => HTTP_SERVER_INCOMING_HANDLER,
91
+ HTTP_SERVER_SET_OUTGOING_RESPONSE: () => HTTP_SERVER_SET_OUTGOING_RESPONSE,
92
+ HTTP_SERVER_START: () => HTTP_SERVER_START,
93
+ HTTP_SERVER_STOP: () => HTTP_SERVER_STOP,
94
+ INPUT_STREAM_BLOCKING_READ: () => INPUT_STREAM_BLOCKING_READ,
95
+ INPUT_STREAM_BLOCKING_SKIP: () => INPUT_STREAM_BLOCKING_SKIP,
96
+ INPUT_STREAM_CREATE: () => INPUT_STREAM_CREATE,
97
+ INPUT_STREAM_DISPOSE: () => INPUT_STREAM_DISPOSE,
98
+ INPUT_STREAM_READ: () => INPUT_STREAM_READ,
99
+ INPUT_STREAM_SKIP: () => INPUT_STREAM_SKIP,
100
+ INPUT_STREAM_SUBSCRIBE: () => INPUT_STREAM_SUBSCRIBE,
101
+ OUTPUT_STREAM_BLOCKING_FLUSH: () => OUTPUT_STREAM_BLOCKING_FLUSH,
102
+ OUTPUT_STREAM_BLOCKING_SPLICE: () => OUTPUT_STREAM_BLOCKING_SPLICE,
103
+ OUTPUT_STREAM_BLOCKING_WRITE_AND_FLUSH: () => OUTPUT_STREAM_BLOCKING_WRITE_AND_FLUSH,
104
+ OUTPUT_STREAM_BLOCKING_WRITE_ZEROES_AND_FLUSH: () => OUTPUT_STREAM_BLOCKING_WRITE_ZEROES_AND_FLUSH,
105
+ OUTPUT_STREAM_CHECK_WRITE: () => OUTPUT_STREAM_CHECK_WRITE,
106
+ OUTPUT_STREAM_CREATE: () => OUTPUT_STREAM_CREATE,
107
+ OUTPUT_STREAM_DISPOSE: () => OUTPUT_STREAM_DISPOSE,
108
+ OUTPUT_STREAM_FLUSH: () => OUTPUT_STREAM_FLUSH,
109
+ OUTPUT_STREAM_GET_TOTAL_BYTES: () => OUTPUT_STREAM_GET_TOTAL_BYTES,
110
+ OUTPUT_STREAM_SPLICE: () => OUTPUT_STREAM_SPLICE,
111
+ OUTPUT_STREAM_SUBSCRIBE: () => OUTPUT_STREAM_SUBSCRIBE,
112
+ OUTPUT_STREAM_WRITE: () => OUTPUT_STREAM_WRITE,
113
+ OUTPUT_STREAM_WRITE_ZEROES: () => OUTPUT_STREAM_WRITE_ZEROES,
114
+ POLL_POLLABLE_BLOCK: () => POLL_POLLABLE_BLOCK,
115
+ POLL_POLLABLE_DISPOSE: () => POLL_POLLABLE_DISPOSE,
116
+ POLL_POLLABLE_READY: () => POLL_POLLABLE_READY,
117
+ POLL_POLL_LIST: () => POLL_POLL_LIST,
118
+ SOCKET_DATAGRAM_STREAM_DISPOSE: () => SOCKET_DATAGRAM_STREAM_DISPOSE,
119
+ SOCKET_DATAGRAM_STREAM_SUBSCRIBE: () => SOCKET_DATAGRAM_STREAM_SUBSCRIBE,
120
+ SOCKET_GET_DEFAULT_RECEIVE_BUFFER_SIZE: () => SOCKET_GET_DEFAULT_RECEIVE_BUFFER_SIZE,
121
+ SOCKET_GET_DEFAULT_SEND_BUFFER_SIZE: () => SOCKET_GET_DEFAULT_SEND_BUFFER_SIZE,
122
+ SOCKET_INCOMING_DATAGRAM_STREAM_RECEIVE: () => SOCKET_INCOMING_DATAGRAM_STREAM_RECEIVE,
123
+ SOCKET_OUTGOING_DATAGRAM_STREAM_CHECK_SEND: () => SOCKET_OUTGOING_DATAGRAM_STREAM_CHECK_SEND,
124
+ SOCKET_OUTGOING_DATAGRAM_STREAM_SEND: () => SOCKET_OUTGOING_DATAGRAM_STREAM_SEND,
125
+ SOCKET_RESOLVE_ADDRESS_CREATE_REQUEST: () => SOCKET_RESOLVE_ADDRESS_CREATE_REQUEST,
126
+ SOCKET_RESOLVE_ADDRESS_DISPOSE_REQUEST: () => SOCKET_RESOLVE_ADDRESS_DISPOSE_REQUEST,
127
+ SOCKET_RESOLVE_ADDRESS_SUBSCRIBE_REQUEST: () => SOCKET_RESOLVE_ADDRESS_SUBSCRIBE_REQUEST,
128
+ SOCKET_RESOLVE_ADDRESS_TAKE_REQUEST: () => SOCKET_RESOLVE_ADDRESS_TAKE_REQUEST,
129
+ SOCKET_TCP: () => SOCKET_TCP,
130
+ SOCKET_TCP_ACCEPT: () => SOCKET_TCP_ACCEPT,
131
+ SOCKET_TCP_BIND_FINISH: () => SOCKET_TCP_BIND_FINISH,
132
+ SOCKET_TCP_BIND_START: () => SOCKET_TCP_BIND_START,
133
+ SOCKET_TCP_CONNECT_FINISH: () => SOCKET_TCP_CONNECT_FINISH,
134
+ SOCKET_TCP_CONNECT_START: () => SOCKET_TCP_CONNECT_START,
135
+ SOCKET_TCP_CREATE_HANDLE: () => SOCKET_TCP_CREATE_HANDLE,
136
+ SOCKET_TCP_DISPOSE: () => SOCKET_TCP_DISPOSE,
137
+ SOCKET_TCP_GET_LOCAL_ADDRESS: () => SOCKET_TCP_GET_LOCAL_ADDRESS,
138
+ SOCKET_TCP_GET_REMOTE_ADDRESS: () => SOCKET_TCP_GET_REMOTE_ADDRESS,
139
+ SOCKET_TCP_IS_LISTENING: () => SOCKET_TCP_IS_LISTENING,
140
+ SOCKET_TCP_LISTEN_FINISH: () => SOCKET_TCP_LISTEN_FINISH,
141
+ SOCKET_TCP_LISTEN_START: () => SOCKET_TCP_LISTEN_START,
142
+ SOCKET_TCP_SET_KEEP_ALIVE: () => SOCKET_TCP_SET_KEEP_ALIVE,
143
+ SOCKET_TCP_SET_LISTEN_BACKLOG_SIZE: () => SOCKET_TCP_SET_LISTEN_BACKLOG_SIZE,
144
+ SOCKET_TCP_SHUTDOWN: () => SOCKET_TCP_SHUTDOWN,
145
+ SOCKET_TCP_SUBSCRIBE: () => SOCKET_TCP_SUBSCRIBE,
146
+ SOCKET_UDP: () => SOCKET_UDP,
147
+ SOCKET_UDP_BIND_FINISH: () => SOCKET_UDP_BIND_FINISH,
148
+ SOCKET_UDP_BIND_START: () => SOCKET_UDP_BIND_START,
149
+ SOCKET_UDP_CREATE_HANDLE: () => SOCKET_UDP_CREATE_HANDLE,
150
+ SOCKET_UDP_DISPOSE: () => SOCKET_UDP_DISPOSE,
151
+ SOCKET_UDP_GET_LOCAL_ADDRESS: () => SOCKET_UDP_GET_LOCAL_ADDRESS,
152
+ SOCKET_UDP_GET_RECEIVE_BUFFER_SIZE: () => SOCKET_UDP_GET_RECEIVE_BUFFER_SIZE,
153
+ SOCKET_UDP_GET_REMOTE_ADDRESS: () => SOCKET_UDP_GET_REMOTE_ADDRESS,
154
+ SOCKET_UDP_GET_SEND_BUFFER_SIZE: () => SOCKET_UDP_GET_SEND_BUFFER_SIZE,
155
+ SOCKET_UDP_GET_UNICAST_HOP_LIMIT: () => SOCKET_UDP_GET_UNICAST_HOP_LIMIT,
156
+ SOCKET_UDP_SET_RECEIVE_BUFFER_SIZE: () => SOCKET_UDP_SET_RECEIVE_BUFFER_SIZE,
157
+ SOCKET_UDP_SET_SEND_BUFFER_SIZE: () => SOCKET_UDP_SET_SEND_BUFFER_SIZE,
158
+ SOCKET_UDP_SET_UNICAST_HOP_LIMIT: () => SOCKET_UDP_SET_UNICAST_HOP_LIMIT,
159
+ SOCKET_UDP_STREAM: () => SOCKET_UDP_STREAM,
160
+ SOCKET_UDP_SUBSCRIBE: () => SOCKET_UDP_SUBSCRIBE,
161
+ STDERR: () => STDERR,
162
+ STDIN: () => STDIN,
163
+ STDOUT: () => STDOUT,
164
+ reverseMap: () => reverseMap
165
+ });
166
+ let call_id = 0;
167
+ const CALL_MASK = 4278190080;
168
+ const CALL_TYPE_MASK = 16777215;
169
+ let cnt = 0;
170
+ const STDIN = ++cnt;
171
+ const STDOUT = ++cnt;
172
+ const STDERR = ++cnt;
173
+ const FILE = ++cnt;
174
+ const HTTP = ++cnt;
175
+ const SOCKET_TCP = ++cnt;
176
+ const SOCKET_UDP = ++cnt;
177
+ const CLOCKS = ++cnt;
178
+ const INPUT_STREAM_CREATE = ++call_id << 24;
179
+ const INPUT_STREAM_READ = ++call_id << 24;
180
+ const INPUT_STREAM_BLOCKING_READ = ++call_id << 24;
181
+ const INPUT_STREAM_SKIP = ++call_id << 24;
182
+ const INPUT_STREAM_BLOCKING_SKIP = ++call_id << 24;
183
+ const INPUT_STREAM_SUBSCRIBE = ++call_id << 24;
184
+ const INPUT_STREAM_DISPOSE = ++call_id << 24;
185
+ const OUTPUT_STREAM_CREATE = ++call_id << 24;
186
+ const OUTPUT_STREAM_CHECK_WRITE = ++call_id << 24;
187
+ const OUTPUT_STREAM_WRITE = ++call_id << 24;
188
+ const OUTPUT_STREAM_BLOCKING_WRITE_AND_FLUSH = ++call_id << 24;
189
+ const OUTPUT_STREAM_FLUSH = ++call_id << 24;
190
+ const OUTPUT_STREAM_BLOCKING_FLUSH = ++call_id << 24;
191
+ const OUTPUT_STREAM_WRITE_ZEROES = ++call_id << 24;
192
+ const OUTPUT_STREAM_BLOCKING_WRITE_ZEROES_AND_FLUSH = ++call_id << 24;
193
+ const OUTPUT_STREAM_SPLICE = ++call_id << 24;
194
+ const OUTPUT_STREAM_BLOCKING_SPLICE = ++call_id << 24;
195
+ const OUTPUT_STREAM_SUBSCRIBE = ++call_id << 24;
196
+ const OUTPUT_STREAM_DISPOSE = ++call_id << 24;
197
+ const OUTPUT_STREAM_GET_TOTAL_BYTES = ++call_id << 24;
198
+ const POLL_POLLABLE_READY = ++call_id << 24;
199
+ const POLL_POLLABLE_BLOCK = ++call_id << 24;
200
+ const POLL_POLLABLE_DISPOSE = ++call_id << 24;
201
+ const POLL_POLL_LIST = ++call_id << 24;
202
+ const FUTURE_DISPOSE = ++call_id << 24;
203
+ const FUTURE_TAKE_VALUE = ++call_id << 24;
204
+ const FUTURE_SUBSCRIBE = ++call_id << 24;
205
+ const HTTP_CREATE_REQUEST = ++call_id << 24;
206
+ const HTTP_OUTPUT_STREAM_FINISH = ++call_id << 24;
207
+ const HTTP_SERVER_START = ++call_id << 24;
208
+ const HTTP_SERVER_STOP = ++call_id << 24;
209
+ const HTTP_SERVER_INCOMING_HANDLER = ++call_id << 24;
210
+ const HTTP_SERVER_SET_OUTGOING_RESPONSE = ++call_id << 24;
211
+ const HTTP_SERVER_CLEAR_OUTGOING_RESPONSE = ++call_id << 24;
212
+ const HTTP_SERVER_GET_ADDRESS = ++call_id << 24;
213
+ const HTTP_OUTGOING_BODY_DISPOSE = ++call_id << 24;
214
+ const CLOCKS_DURATION_SUBSCRIBE = ++call_id << 24;
215
+ const CLOCKS_INSTANT_SUBSCRIBE = ++call_id << 24;
216
+ const SOCKET_TCP_CREATE_HANDLE = ++call_id << 24;
217
+ const SOCKET_TCP_BIND_START = ++call_id << 24;
218
+ const SOCKET_TCP_BIND_FINISH = ++call_id << 24;
219
+ const SOCKET_TCP_CONNECT_START = ++call_id << 24;
220
+ const SOCKET_TCP_CONNECT_FINISH = ++call_id << 24;
221
+ const SOCKET_TCP_SUBSCRIBE = ++call_id << 24;
222
+ const SOCKET_TCP_LISTEN_START = ++call_id << 24;
223
+ const SOCKET_TCP_LISTEN_FINISH = ++call_id << 24;
224
+ const SOCKET_TCP_IS_LISTENING = ++call_id << 24;
225
+ const SOCKET_TCP_ACCEPT = ++call_id << 24;
226
+ const SOCKET_TCP_GET_LOCAL_ADDRESS = ++call_id << 24;
227
+ const SOCKET_TCP_GET_REMOTE_ADDRESS = ++call_id << 24;
228
+ const SOCKET_TCP_SET_KEEP_ALIVE = ++call_id << 24;
229
+ const SOCKET_TCP_SET_LISTEN_BACKLOG_SIZE = ++call_id << 24;
230
+ const SOCKET_TCP_SHUTDOWN = ++call_id << 24;
231
+ const SOCKET_TCP_DISPOSE = ++call_id << 24;
232
+ const SOCKET_UDP_CREATE_HANDLE = ++call_id << 24;
233
+ const SOCKET_UDP_BIND_START = ++call_id << 24;
234
+ const SOCKET_UDP_BIND_FINISH = ++call_id << 24;
235
+ const SOCKET_UDP_STREAM = ++call_id << 24;
236
+ const SOCKET_UDP_SUBSCRIBE = ++call_id << 24;
237
+ const SOCKET_UDP_DISPOSE = ++call_id << 24;
238
+ const SOCKET_UDP_GET_LOCAL_ADDRESS = ++call_id << 24;
239
+ const SOCKET_UDP_GET_RECEIVE_BUFFER_SIZE = ++call_id << 24;
240
+ const SOCKET_UDP_GET_REMOTE_ADDRESS = ++call_id << 24;
241
+ const SOCKET_UDP_GET_SEND_BUFFER_SIZE = ++call_id << 24;
242
+ const SOCKET_UDP_GET_UNICAST_HOP_LIMIT = ++call_id << 24;
243
+ const SOCKET_UDP_SET_RECEIVE_BUFFER_SIZE = ++call_id << 24;
244
+ const SOCKET_UDP_SET_SEND_BUFFER_SIZE = ++call_id << 24;
245
+ const SOCKET_UDP_SET_UNICAST_HOP_LIMIT = ++call_id << 24;
246
+ const SOCKET_INCOMING_DATAGRAM_STREAM_RECEIVE = ++call_id << 24;
247
+ const SOCKET_OUTGOING_DATAGRAM_STREAM_CHECK_SEND = ++call_id << 24;
248
+ const SOCKET_OUTGOING_DATAGRAM_STREAM_SEND = ++call_id << 24;
249
+ const SOCKET_DATAGRAM_STREAM_SUBSCRIBE = ++call_id << 24;
250
+ const SOCKET_DATAGRAM_STREAM_DISPOSE = ++call_id << 24;
251
+ const SOCKET_GET_DEFAULT_SEND_BUFFER_SIZE = ++call_id << 24;
252
+ const SOCKET_GET_DEFAULT_RECEIVE_BUFFER_SIZE = ++call_id << 24;
253
+ const SOCKET_RESOLVE_ADDRESS_CREATE_REQUEST = ++call_id << 24;
254
+ const SOCKET_RESOLVE_ADDRESS_TAKE_REQUEST = ++call_id << 24;
255
+ const SOCKET_RESOLVE_ADDRESS_SUBSCRIBE_REQUEST = ++call_id << 24;
256
+ const SOCKET_RESOLVE_ADDRESS_DISPOSE_REQUEST = ++call_id << 24;
257
+ const reverseMap = {};
258
+ for (const name of Object.getOwnPropertyNames(calls_exports)) {
259
+ if (name === "reverseMap") continue;
260
+ reverseMap[calls_exports[name]] = name;
261
+ }
262
+ //#endregion
263
+ //#region dist/io/worker-http.js
264
+ const agentOptions = { keepAlive: true };
265
+ const httpAgent = new Agent(agentOptions);
266
+ const httpsAgent = new Agent$1(agentOptions);
267
+ const servers = /* @__PURE__ */ new Map();
268
+ let responseCnt = 0;
269
+ const responses = /* @__PURE__ */ new Map();
270
+ async function stopHttpServer(id) {
271
+ await new Promise((resolve) => servers.get(id).close(resolve));
272
+ }
273
+ function clearOutgoingResponse(id) {
274
+ responses.delete(id);
275
+ }
276
+ async function getHttpServerAddress(id) {
277
+ return servers.get(id).address();
278
+ }
279
+ async function setOutgoingResponse(id, { statusCode, headers, streamId }) {
280
+ const response = responses.get(id);
281
+ const textDecoder = new TextDecoder();
282
+ response.writeHead(statusCode, Object.fromEntries(headers.map(([key, val]) => [key, textDecoder.decode(val)])));
283
+ response.flushHeaders();
284
+ const { stream } = getStreamOrThrow(streamId);
285
+ stream.pipe(response);
286
+ responses.delete(id);
287
+ }
288
+ async function startHttpServer(id, { port, host }) {
289
+ const server = createServer((req, res) => {
290
+ if (!parentPort) throw {
291
+ tag: "internal-error",
292
+ val: "Unable to post message. Likely running in main thread."
293
+ };
294
+ const streamId = createReadableStream(req);
295
+ const responseId = ++responseCnt;
296
+ parentPort.postMessage({
297
+ type: HTTP_SERVER_INCOMING_HANDLER,
298
+ id,
299
+ payload: {
300
+ responseId,
301
+ method: req.method,
302
+ host: req.headers.host || host || "localhost",
303
+ pathWithQuery: req.url,
304
+ headers: Object.entries(req.headersDistinct).flatMap(([key, val]) => val?.map((val) => [key, val])),
305
+ streamId
306
+ }
307
+ });
308
+ responses.set(responseId, res);
309
+ });
310
+ await new Promise((resolve, reject) => {
311
+ server.listen(port, host, resolve);
312
+ server.on("error", reject);
313
+ });
314
+ servers.set(id, server);
315
+ }
316
+ async function createHttpRequest(method, scheme, authority, pathWithQuery, headers, bodyId, connectTimeout, betweenBytesTimeout, firstByteTimeout) {
317
+ let stream = null;
318
+ if (bodyId) try {
319
+ ({stream} = getStreamOrThrow(bodyId));
320
+ } catch (e) {
321
+ if (e.tag === "closed") throw {
322
+ tag: "internal-error",
323
+ val: "Unexpected closed body stream"
324
+ };
325
+ if (e.tag === "last-operation-failed") throw {
326
+ tag: "internal-error",
327
+ val: e.val
328
+ };
329
+ throw e;
330
+ }
331
+ try {
332
+ let req;
333
+ switch (scheme) {
334
+ case "http:":
335
+ req = request({
336
+ agent: httpAgent,
337
+ method,
338
+ host: authority.split(":")[0],
339
+ port: authority.split(":")[1],
340
+ path: pathWithQuery,
341
+ timeout: connectTimeout && Number(connectTimeout / 1000000n)
342
+ });
343
+ break;
344
+ case "https:":
345
+ req = request$1({
346
+ agent: httpsAgent,
347
+ method,
348
+ host: authority.split(":")[0],
349
+ port: authority.split(":")[1],
350
+ path: pathWithQuery,
351
+ timeout: connectTimeout && Number(connectTimeout / 1000000n)
352
+ });
353
+ break;
354
+ default: throw { tag: "HTTP-protocol-error" };
355
+ }
356
+ for (const [key, value] of headers) req.appendHeader(key, value);
357
+ req.flushHeaders();
358
+ if (stream) stream.pipe(req);
359
+ else req.end();
360
+ const res = await new Promise((resolve, reject) => {
361
+ req.once("timeout", () => {
362
+ reject({ tag: "connection-timeout" });
363
+ req.destroy();
364
+ });
365
+ req.once("response", resolve);
366
+ req.once("close", () => reject);
367
+ req.once("error", reject);
368
+ });
369
+ if (firstByteTimeout) res.setTimeout(Number(firstByteTimeout / 1000000n));
370
+ if (betweenBytesTimeout) res.once("readable", () => {
371
+ res.setTimeout(Number(betweenBytesTimeout / 1000000n));
372
+ });
373
+ const bodyStreamId = createReadableStream(res);
374
+ return {
375
+ status: res.statusCode,
376
+ headers: Array.from(Object.entries(res.headers)),
377
+ bodyStreamId
378
+ };
379
+ } catch (e) {
380
+ if (e?.tag) throw e;
381
+ const err = getFirstError(e);
382
+ switch (err.code) {
383
+ case "ECONNRESET": throw { tag: "HTTP-protocol-error" };
384
+ case "ENOTFOUND": throw {
385
+ tag: "DNS-error",
386
+ val: {
387
+ rcode: err.code,
388
+ infoCode: err.errno < 0 ? -err.errno : err.errno
389
+ }
390
+ };
391
+ case "ECONNREFUSED": throw { tag: "connection-refused" };
392
+ }
393
+ throw {
394
+ tag: "internal-error",
395
+ val: err.toString()
396
+ };
397
+ }
398
+ }
399
+ function getFirstError(e) {
400
+ if (typeof e !== "object" || e === null) return e;
401
+ if (e.cause) return getFirstError(e.cause);
402
+ if (e instanceof AggregateError) return getFirstError(e.errors[0]);
403
+ return e;
404
+ }
405
+ //#endregion
406
+ //#region dist/io/worker-sockets.js
407
+ let stateCnt = 0;
408
+ const SOCKET_STATE_INIT = ++stateCnt;
409
+ const SOCKET_STATE_BIND = ++stateCnt;
410
+ const SOCKET_STATE_BOUND = ++stateCnt;
411
+ const SOCKET_STATE_LISTEN = ++stateCnt;
412
+ const SOCKET_STATE_LISTENER = ++stateCnt;
413
+ const SOCKET_STATE_CONNECT = ++stateCnt;
414
+ const SOCKET_STATE_CONNECTION = ++stateCnt;
415
+ const SOCKET_STATE_CLOSED = ++stateCnt;
416
+ const dnsLookupOptions = {
417
+ verbatim: true,
418
+ all: true,
419
+ hints: V4MAPPED | ALL
420
+ };
421
+ function noLookup(ip, _opts, cb) {
422
+ cb(null, ip);
423
+ }
424
+ function socketResolveAddress(name) {
425
+ const isIpNum = isIP(name[0] === "[" && name[name.length - 1] === "]" ? name.slice(1, -1) : name);
426
+ if (isIpNum > 0) return Promise.resolve([{
427
+ tag: "ipv" + isIpNum,
428
+ val: (isIpNum === 4 ? ipv4ToTuple : ipv6ToTuple)(name)
429
+ }]);
430
+ let parsedUrl = null;
431
+ try {
432
+ parsedUrl = new URL(`https://${name}`);
433
+ if (parsedUrl.port.length || parsedUrl.username.length || parsedUrl.password.length || parsedUrl.pathname !== "/" || parsedUrl.search.length || parsedUrl.hash.length) parsedUrl = null;
434
+ } catch {}
435
+ if (!parsedUrl) throw "invalid-argument";
436
+ return lookup(name, dnsLookupOptions).then((addresses) => {
437
+ return (Array.isArray(addresses) ? addresses : [addresses]).map(({ address, family }) => {
438
+ return [{
439
+ tag: "ipv" + family,
440
+ val: (family === 4 ? ipv4ToTuple : ipv6ToTuple)(address)
441
+ }];
442
+ });
443
+ }, (err) => {
444
+ switch (err.code) {
445
+ case NODATA:
446
+ case BADFAMILY:
447
+ case NONAME:
448
+ case NOTFOUND: throw "name-unresolvable";
449
+ case TIMEOUT:
450
+ case REFUSED:
451
+ case CONNREFUSED:
452
+ case SERVFAIL:
453
+ case NOMEM:
454
+ case CANCELLED: throw "temporary-resolver-failure";
455
+ default: throw "permanent-resolver-failure";
456
+ }
457
+ });
458
+ }
459
+ function convertSocketError(err) {
460
+ switch (err?.code) {
461
+ case "EBADF":
462
+ case "ENOTCONN":
463
+ case "ERR_SOCKET_DGRAM_NOT_CONNECTED": return "invalid-state";
464
+ case "EACCES":
465
+ case "EPERM": return "access-denied";
466
+ case "ENOTSUP": return "not-supported";
467
+ case "EINVAL": return "invalid-argument";
468
+ case "ENOMEM":
469
+ case "ENOBUFS": return "out-of-memory";
470
+ case "EALREADY": return "concurrency-conflict";
471
+ case "EWOULDBLOCK": return "would-block";
472
+ case "EADDRNOTAVAIL": return "address-not-bindable";
473
+ case "EADDRINUSE": return "address-in-use";
474
+ case "ECONNREFUSED": return "connection-refused";
475
+ case "ECONNRESET": return "connection-reset";
476
+ case "ECONNABORTED": return "connection-aborted";
477
+ default: return "unknown";
478
+ }
479
+ }
480
+ function convertSocketErrorCode(code) {
481
+ switch (code) {
482
+ case 4053:
483
+ case 4083:
484
+ case ENOTCONN:
485
+ case EBADF: return "invalid-state";
486
+ case EACCES:
487
+ case EPERM: return "access-denied";
488
+ case ENOTSUP: return "not-supported";
489
+ case EINVAL: return "invalid-argument";
490
+ case ENOMEM:
491
+ case ENOBUFS: return "out-of-memory";
492
+ case EALREADY: return "concurrency-conflict";
493
+ case EWOULDBLOCK: return "would-block";
494
+ case 4090:
495
+ case EADDRNOTAVAIL: return "address-not-bindable";
496
+ case 4091:
497
+ case EADDRINUSE: return "address-in-use";
498
+ case ECONNREFUSED: return "connection-refused";
499
+ case ECONNRESET: return "connection-reset";
500
+ case ECONNABORTED: return "connection-aborted";
501
+ default: return "unknown";
502
+ }
503
+ }
504
+ function tupleToIPv6(arr) {
505
+ if (arr.length !== 8) return null;
506
+ return arr.map((segment) => segment.toString(16)).join(":");
507
+ }
508
+ function tupleToIpv4(arr) {
509
+ if (arr.length !== 4) return null;
510
+ return arr.map((segment) => segment.toString(10)).join(".");
511
+ }
512
+ function isMulticastIpAddress(ipSocketAddress) {
513
+ return ipSocketAddress.tag === "ipv4" && ipSocketAddress.val.address[0] === 224 || ipSocketAddress.tag === "ipv6" && ipSocketAddress.val.address[0] === 65280;
514
+ }
515
+ function isIPv4MappedAddress(ipSocketAddress) {
516
+ return ipSocketAddress.tag === "ipv6" && ipSocketAddress.val.address[5] === 65535;
517
+ }
518
+ function isUnicastIpAddress(ipSocketAddress) {
519
+ return !isMulticastIpAddress(ipSocketAddress) && !isBroadcastIpAddress(ipSocketAddress);
520
+ }
521
+ function isWildcardAddress(ipSocketAddress) {
522
+ const { address } = ipSocketAddress.val;
523
+ if (ipSocketAddress.tag === "ipv4") return address[0] === 0 && address[1] === 0 && address[2] === 0 && address[3] === 0;
524
+ else return address[0] === 0 && address[1] === 0 && address[2] === 0 && address[3] === 0 && address[4] === 0 && address[5] === 0 && address[6] === 0 && address[7] === 0;
525
+ }
526
+ function isBroadcastIpAddress(ipSocketAddress) {
527
+ const { address } = ipSocketAddress.val;
528
+ return ipSocketAddress.tag === "ipv4" && address[0] === 255 && address[1] === 255 && address[2] === 255 && address[3] === 255;
529
+ }
530
+ function serializeIpAddress(addr) {
531
+ if (addr.tag === "ipv4") return tupleToIpv4(addr.val.address);
532
+ return tupleToIPv6(addr.val.address);
533
+ }
534
+ function ipv6ToTuple(ipv6) {
535
+ const [lhs, rhs = ""] = ipv6.includes("::") ? ipv6.split("::") : [ipv6];
536
+ const lhsParts = lhs === "" ? [] : lhs.split(":");
537
+ const rhsParts = rhs === "" ? [] : rhs.split(":");
538
+ return [
539
+ ...lhsParts,
540
+ ...Array(8 - lhsParts.length - rhsParts.length).fill(0),
541
+ ...rhsParts
542
+ ].map((segment) => parseInt(segment, 16));
543
+ }
544
+ function ipv4ToTuple(ipv4) {
545
+ return ipv4.split(".").map((segment) => parseInt(segment, 10));
546
+ }
547
+ function ipSocketAddress(family, addr, port) {
548
+ if (family === "ipv4") return {
549
+ tag: "ipv4",
550
+ val: {
551
+ port,
552
+ address: ipv4ToTuple(addr)
553
+ }
554
+ };
555
+ return {
556
+ tag: "ipv6",
557
+ val: {
558
+ port,
559
+ flowInfo: 0,
560
+ address: ipv6ToTuple(addr),
561
+ scopeId: 0
562
+ }
563
+ };
564
+ }
565
+ let _recvBufferSize;
566
+ let _sendBufferSize;
567
+ async function getDefaultBufferSizes() {
568
+ var s = createSocket({ type: "udp4" });
569
+ s.bind(0);
570
+ await new Promise((resolve, reject) => {
571
+ s.once("error", reject);
572
+ s.once("listening", resolve);
573
+ });
574
+ _recvBufferSize = BigInt(s.getRecvBufferSize());
575
+ _sendBufferSize = BigInt(s.getSendBufferSize());
576
+ s.close();
577
+ }
578
+ async function getDefaultSendBufferSize() {
579
+ if (!_sendBufferSize) await getDefaultBufferSizes();
580
+ return _sendBufferSize;
581
+ }
582
+ async function getDefaultReceiveBufferSize() {
583
+ if (!_recvBufferSize) await getDefaultBufferSizes();
584
+ return _recvBufferSize;
585
+ }
586
+ //#endregion
587
+ //#region dist/io/worker-socket-tcp.js
588
+ const { TCP, constants: TCPConstants } = process.binding("tcp_wrap");
589
+ const win = process.platform === "win32";
590
+ const tcpSockets = /* @__PURE__ */ new Map();
591
+ let tcpSocketCnt = 0;
592
+ function createTcpSocket() {
593
+ const handle = new TCP(TCPConstants.SOCKET);
594
+ tcpSockets.set(++tcpSocketCnt, {
595
+ state: SOCKET_STATE_INIT,
596
+ future: null,
597
+ tcpSocket: null,
598
+ listenBacklogSize: 128,
599
+ handle,
600
+ pendingAccepts: [],
601
+ pollState: {
602
+ ready: true,
603
+ listener: null,
604
+ polls: [],
605
+ parentStream: null
606
+ }
607
+ });
608
+ return tcpSocketCnt;
609
+ }
610
+ function socketTcpFinish(id, fromState, toState) {
611
+ const socket = tcpSockets.get(id);
612
+ if (socket.state !== fromState) throw "not-in-progress";
613
+ if (!socket.pollState?.ready) throw "would-block";
614
+ const { tag, val } = futureTakeValue(socket.future)?.val ?? {};
615
+ futureDispose(socket.future, false);
616
+ socket.future = null;
617
+ if (tag === "err") {
618
+ socket.state = SOCKET_STATE_CLOSED;
619
+ throw val;
620
+ } else {
621
+ socket.state = toState;
622
+ if (toState === SOCKET_STATE_LISTENER) socket.pollState.ready = false;
623
+ return val;
624
+ }
625
+ }
626
+ function socketTcpBindStart(id, localAddress, family) {
627
+ const socket = tcpSockets.get(id);
628
+ if (socket.state !== SOCKET_STATE_INIT) throw "invalid-state";
629
+ if (family !== localAddress.tag || !isUnicastIpAddress(localAddress) || isIPv4MappedAddress(localAddress)) throw "invalid-argument";
630
+ socket.state = SOCKET_STATE_BIND;
631
+ const { handle } = socket;
632
+ socket.future = createFuture((async () => {
633
+ const address = serializeIpAddress(localAddress);
634
+ const port = localAddress.val.port;
635
+ const code = localAddress.tag === "ipv6" ? handle.bind6(address, port, TCPConstants.UV_TCP_IPV6ONLY) : handle.bind(address, port);
636
+ if (code !== 0) throw convertSocketErrorCode(-code);
637
+ {
638
+ const code = handle.getsockname({});
639
+ if (code !== 0) throw convertSocketErrorCode(-code);
640
+ }
641
+ })(), socket.pollState);
642
+ }
643
+ function socketTcpConnectStart(id, remoteAddress, family) {
644
+ const socket = tcpSockets.get(id);
645
+ if (socket.state !== SOCKET_STATE_INIT && socket.state !== SOCKET_STATE_BOUND) throw "invalid-state";
646
+ if (isWildcardAddress(remoteAddress) || family !== remoteAddress.tag || !isUnicastIpAddress(remoteAddress) || isMulticastIpAddress(remoteAddress) || remoteAddress.val.port === 0 || isIPv4MappedAddress(remoteAddress)) throw "invalid-argument";
647
+ socket.state = SOCKET_STATE_CONNECT;
648
+ socket.future = createFuture(new Promise((resolve, reject) => {
649
+ const tcpSocket = socket.tcpSocket = new Socket({
650
+ handle: socket.handle,
651
+ pauseOnCreate: true,
652
+ allowHalfOpen: true
653
+ });
654
+ function handleErr(err) {
655
+ tcpSocket.off("connect", handleConnect);
656
+ reject(convertSocketError(err));
657
+ }
658
+ function handleConnect() {
659
+ tcpSocket.off("error", handleErr);
660
+ resolve([createReadableStream(tcpSocket), createWritableStream(tcpSocket)]);
661
+ }
662
+ tcpSocket.once("connect", handleConnect);
663
+ tcpSocket.once("error", handleErr);
664
+ tcpSocket.connect({
665
+ port: remoteAddress.val.port,
666
+ host: serializeIpAddress(remoteAddress) ?? void 0,
667
+ lookup: noLookup
668
+ });
669
+ }), socket.pollState);
670
+ }
671
+ function socketTcpListenStart(id) {
672
+ const socket = tcpSockets.get(id);
673
+ if (socket.state !== SOCKET_STATE_BOUND) throw "invalid-state";
674
+ const { handle } = socket;
675
+ socket.state = SOCKET_STATE_LISTEN;
676
+ socket.future = createFuture(new Promise((resolve, reject) => {
677
+ const server = new Server({
678
+ pauseOnConnect: true,
679
+ allowHalfOpen: true
680
+ });
681
+ function handleErr(err) {
682
+ server.off("listening", handleListen);
683
+ reject(convertSocketError(err));
684
+ }
685
+ function handleListen() {
686
+ server.off("error", handleErr);
687
+ server.on("connection", (tcpSocket) => {
688
+ pollStateReady(socket.pollState);
689
+ const pollState = createReadableStreamPollState(tcpSocket);
690
+ socket.pendingAccepts.push({
691
+ tcpSocket,
692
+ err: null,
693
+ pollState
694
+ });
695
+ });
696
+ server.on("error", (err) => {
697
+ pollStateReady(socket.pollState);
698
+ socket.pendingAccepts.push({
699
+ tcpSocket: null,
700
+ err,
701
+ pollState: null
702
+ });
703
+ });
704
+ resolve();
705
+ }
706
+ server.once("listening", handleListen);
707
+ server.once("error", handleErr);
708
+ server.listen(handle, socket.listenBacklogSize);
709
+ }), socket.pollState);
710
+ }
711
+ function socketTcpAccept(id) {
712
+ const socket = tcpSockets.get(id);
713
+ if (socket.state !== SOCKET_STATE_LISTENER) throw "invalid-state";
714
+ if (socket.pendingAccepts.length === 0) throw "would-block";
715
+ const accept = socket.pendingAccepts.shift();
716
+ if (!accept || accept.err) {
717
+ socket.state = SOCKET_STATE_CLOSED;
718
+ throw convertSocketError(accept?.err);
719
+ }
720
+ if (socket.pollState && socket.pendingAccepts.length === 0) socket.pollState.ready = false;
721
+ tcpSockets.set(++tcpSocketCnt, {
722
+ state: SOCKET_STATE_CONNECTION,
723
+ future: null,
724
+ tcpSocket: accept.tcpSocket,
725
+ listenBacklogSize: 128,
726
+ handle: accept.tcpSocket?._handle,
727
+ pendingAccepts: [],
728
+ pollState: accept.pollState
729
+ });
730
+ return [
731
+ tcpSocketCnt,
732
+ createReadableStream(accept.tcpSocket, accept.pollState ?? void 0),
733
+ createWritableStream(accept.tcpSocket)
734
+ ];
735
+ }
736
+ function socketTcpSetListenBacklogSize(id, backlogSize) {
737
+ const socket = tcpSockets.get(id);
738
+ if (socket.state === SOCKET_STATE_LISTEN || socket.state === SOCKET_STATE_LISTENER) throw "not-supported";
739
+ if (socket.state !== SOCKET_STATE_INIT && socket.state !== SOCKET_STATE_BIND && socket.state !== SOCKET_STATE_BOUND) throw "invalid-state";
740
+ socket.listenBacklogSize = Number(backlogSize);
741
+ }
742
+ function socketTcpGetLocalAddress(id) {
743
+ const { handle } = tcpSockets.get(id);
744
+ const out = {};
745
+ const code = handle.getsockname(out);
746
+ if (code !== 0) throw convertSocketErrorCode(-code);
747
+ return ipSocketAddress(out.family.toLowerCase(), out.address, out.port);
748
+ }
749
+ function socketTcpGetRemoteAddress(id) {
750
+ const { handle } = tcpSockets.get(id);
751
+ const out = {};
752
+ const code = handle.getpeername(out);
753
+ if (code !== 0) throw convertSocketErrorCode(-code);
754
+ return ipSocketAddress(out.family.toLowerCase(), out.address, out.port);
755
+ }
756
+ function socketTcpShutdown(id, _shutdownType) {
757
+ const socket = tcpSockets.get(id);
758
+ if (socket.state !== SOCKET_STATE_CONNECTION) throw "invalid-state";
759
+ if (win && socket.tcpSocket?.destroySoon) socket.tcpSocket.destroySoon();
760
+ else socket.tcpSocket?.destroy();
761
+ }
762
+ function socketTcpSetKeepAlive(id, { keepAlive, keepAliveIdleTime }) {
763
+ const { handle } = tcpSockets.get(id);
764
+ const code = handle.setKeepAlive(keepAlive, Number(keepAliveIdleTime / 1000000000n));
765
+ if (code !== 0) throw convertSocketErrorCode(-code);
766
+ }
767
+ function socketTcpDispose(id) {
768
+ const socket = tcpSockets.get(id);
769
+ verifyPollsDroppedForDrop(socket.pollState, "tcp socket");
770
+ socket.handle.close();
771
+ tcpSockets.delete(id);
772
+ }
773
+ //#endregion
774
+ //#region dist/io/worker-socket-udp.js
775
+ let udpSocketCnt = 0;
776
+ let datagramStreamCnt = 0;
777
+ const udpSockets = /* @__PURE__ */ new Map();
778
+ const datagramStreams = /* @__PURE__ */ new Map();
779
+ function createUdpSocket({ family, unicastHopLimit }) {
780
+ const udpSocket = createSocket({
781
+ type: family === "ipv6" ? "udp6" : "udp4",
782
+ reuseAddr: false,
783
+ ipv6Only: family === "ipv6",
784
+ lookup: noLookup
785
+ });
786
+ udpSockets.set(++udpSocketCnt, {
787
+ state: SOCKET_STATE_INIT,
788
+ remoteAddress: null,
789
+ remotePort: null,
790
+ sendBufferSize: null,
791
+ receiveBufferSize: null,
792
+ unicastHopLimit,
793
+ udpSocket,
794
+ future: null,
795
+ serializedLocalAddress: null,
796
+ pollState: {
797
+ ready: true,
798
+ listener: () => null,
799
+ polls: [],
800
+ parentStream: null
801
+ },
802
+ incomingDatagramStream: null,
803
+ outgoingDatagramStream: null
804
+ });
805
+ return udpSocketCnt;
806
+ }
807
+ function createIncomingDatagramStream(socket) {
808
+ const id = ++datagramStreamCnt;
809
+ const pollState = {
810
+ ready: false,
811
+ listener: null,
812
+ polls: [],
813
+ parentStream: null
814
+ };
815
+ const datagramStream = {
816
+ id,
817
+ active: true,
818
+ error: null,
819
+ socket,
820
+ queue: [],
821
+ cleanup,
822
+ pollState
823
+ };
824
+ const { udpSocket } = socket;
825
+ datagramStreams.set(id, datagramStream);
826
+ function cleanup() {
827
+ udpSocket.off("message", onMessage);
828
+ udpSocket.off("error", onError);
829
+ }
830
+ function onMessage(data, rinfo) {
831
+ const family = rinfo.family.toLowerCase();
832
+ datagramStream.queue?.push({
833
+ data,
834
+ remoteAddress: ipSocketAddress(family, rinfo.address, rinfo.port)
835
+ });
836
+ if (!pollState.ready) pollStateReady(pollState);
837
+ }
838
+ function onError(err) {
839
+ datagramStream.error = err;
840
+ pollStateReady(datagramStream.pollState);
841
+ }
842
+ udpSocket.on("message", onMessage);
843
+ udpSocket.once("error", onError);
844
+ return datagramStream;
845
+ }
846
+ function createOutgoingDatagramStream(socket) {
847
+ const id = ++datagramStreamCnt;
848
+ const datagramStream = {
849
+ id,
850
+ active: true,
851
+ error: null,
852
+ socket,
853
+ cleanup,
854
+ pollState: {
855
+ ready: true,
856
+ listener: null,
857
+ polls: [],
858
+ parentStream: null
859
+ }
860
+ };
861
+ const { udpSocket } = socket;
862
+ datagramStreams.set(id, datagramStream);
863
+ udpSocket.on("error", onError);
864
+ function onError(err) {
865
+ datagramStream.error = err;
866
+ pollStateReady(datagramStream.pollState);
867
+ }
868
+ function cleanup() {
869
+ udpSocket.off("error", onError);
870
+ }
871
+ return datagramStream;
872
+ }
873
+ function socketUdpBindStart(id, localAddress, family) {
874
+ const socket = udpSockets.get(id);
875
+ if (family !== localAddress.tag || isIPv4MappedAddress(localAddress)) throw "invalid-argument";
876
+ const serializedLocalAddress = serializeIpAddress(localAddress);
877
+ if (socket.state !== SOCKET_STATE_INIT) throw "invalid-state";
878
+ socket.state = SOCKET_STATE_BIND;
879
+ const { udpSocket } = socket;
880
+ socket.future = createFuture(new Promise((resolve, reject) => {
881
+ function bindOk() {
882
+ resolve();
883
+ udpSocket.off("error", bindErr);
884
+ }
885
+ function bindErr(err) {
886
+ reject(convertSocketError(err));
887
+ udpSocket.off("listening", bindOk);
888
+ }
889
+ udpSocket.once("listening", bindOk);
890
+ udpSocket.once("error", bindErr);
891
+ udpSocket.bind(localAddress.val.port, serializedLocalAddress ?? void 0);
892
+ }), socket.pollState);
893
+ }
894
+ function socketUdpBindFinish(id) {
895
+ const socket = udpSockets.get(id);
896
+ if (socket.state !== SOCKET_STATE_BIND) throw "not-in-progress";
897
+ if (!socket.pollState.ready) throw "would-block";
898
+ const { tag, val } = futureTakeValue(socket.future)?.val ?? {};
899
+ futureDispose(socket.future, false);
900
+ socket.future = null;
901
+ if (tag === "err") {
902
+ socket.state = SOCKET_STATE_CLOSED;
903
+ throw val;
904
+ } else {
905
+ socket.udpSocket.setTTL(socket.unicastHopLimit);
906
+ if (socket.sendBufferSize) socket.udpSocket.setRecvBufferSize(socket.sendBufferSize);
907
+ if (socket.receiveBufferSize) socket.udpSocket.setSendBufferSize(socket.receiveBufferSize);
908
+ socket.state = SOCKET_STATE_BOUND;
909
+ return val;
910
+ }
911
+ }
912
+ function socketUdpGetLocalAddress(id) {
913
+ const { udpSocket } = udpSockets.get(id);
914
+ let address, family, port;
915
+ try {
916
+ ({address, family, port} = udpSocket.address());
917
+ } catch (err) {
918
+ throw convertSocketError(err);
919
+ }
920
+ return ipSocketAddress(family.toLowerCase(), address, port);
921
+ }
922
+ /**
923
+ * @param {number} id
924
+ * @returns {IpSocketAddress}
925
+ */
926
+ function socketUdpGetRemoteAddress(id) {
927
+ const { udpSocket } = udpSockets.get(id);
928
+ let address, family, port;
929
+ try {
930
+ ({address, family, port} = udpSocket.remoteAddress());
931
+ } catch (err) {
932
+ throw convertSocketError(err);
933
+ }
934
+ return ipSocketAddress(family.toLowerCase(), address, port);
935
+ }
936
+ function socketUdpStream(id, remoteAddress) {
937
+ const socket = udpSockets.get(id);
938
+ const { udpSocket } = socket;
939
+ if (socket.state !== SOCKET_STATE_BOUND && socket.state !== SOCKET_STATE_CONNECTION) throw "invalid-state";
940
+ if (socket.state === SOCKET_STATE_INIT && !remoteAddress) throw "invalid-state";
941
+ if (remoteAddress && (remoteAddress.val.port === 0 || isWildcardAddress(remoteAddress) || remoteAddress.tag === "ipv6" && isIPv4MappedAddress(remoteAddress))) throw "invalid-argument";
942
+ if (socket.state === SOCKET_STATE_CONNECTION) {
943
+ socketDatagramStreamClear(socket.incomingDatagramStream);
944
+ socketDatagramStreamClear(socket.outgoingDatagramStream);
945
+ try {
946
+ udpSocket.disconnect();
947
+ } catch (e) {
948
+ throw convertSocketErrorCode(e);
949
+ }
950
+ }
951
+ if (remoteAddress) {
952
+ const serializedRemoteAddress = serializeIpAddress(remoteAddress);
953
+ socket.remoteAddress = serializedRemoteAddress;
954
+ socket.remotePort = remoteAddress.val.port;
955
+ return new Promise((resolve, reject) => {
956
+ function connectOk() {
957
+ if (socket.state === SOCKET_STATE_INIT) {
958
+ socket.udpSocket.setTTL(socket.unicastHopLimit);
959
+ socket.udpSocket.setRecvBufferSize(socket.sendBufferSize);
960
+ socket.udpSocket.setSendBufferSize(socket.receiveBufferSize);
961
+ }
962
+ udpSocket.off("error", connectErr);
963
+ socket.state = SOCKET_STATE_CONNECTION;
964
+ resolve([(socket.incomingDatagramStream = createIncomingDatagramStream(socket)).id, (socket.outgoingDatagramStream = createOutgoingDatagramStream(socket)).id]);
965
+ }
966
+ function connectErr(err) {
967
+ udpSocket.off("connect", connectOk);
968
+ reject(convertSocketError(err));
969
+ }
970
+ udpSocket.once("connect", connectOk);
971
+ udpSocket.once("error", connectErr);
972
+ udpSocket.connect(remoteAddress.val.port, serializedRemoteAddress ?? void 0);
973
+ });
974
+ } else {
975
+ socket.state = SOCKET_STATE_BOUND;
976
+ socket.remoteAddress = null;
977
+ socket.remotePort = null;
978
+ return [(socket.incomingDatagramStream = createIncomingDatagramStream(socket)).id, (socket.outgoingDatagramStream = createOutgoingDatagramStream(socket)).id];
979
+ }
980
+ }
981
+ function socketUdpSetReceiveBufferSize(id, bufferSize) {
982
+ const socket = udpSockets.get(id);
983
+ const buf = Number(bufferSize);
984
+ if (socket.state !== SOCKET_STATE_INIT && socket.state !== SOCKET_STATE_BIND) try {
985
+ socket.udpSocket.setRecvBufferSize(buf);
986
+ } catch (err) {
987
+ throw convertSocketError(err);
988
+ }
989
+ socket.receiveBufferSize = buf;
990
+ }
991
+ function socketUdpSetSendBufferSize(id, bufferSize) {
992
+ const socket = udpSockets.get(id);
993
+ const buf = Number(bufferSize);
994
+ if (socket.state !== SOCKET_STATE_INIT && socket.state !== SOCKET_STATE_BIND) try {
995
+ socket.udpSocket.setSendBufferSize(buf);
996
+ } catch (err) {
997
+ throw convertSocketError(err);
998
+ }
999
+ socket.sendBufferSize = buf;
1000
+ }
1001
+ function socketUdpSetUnicastHopLimit(id, hopLimit) {
1002
+ const socket = udpSockets.get(id);
1003
+ if (socket.state !== SOCKET_STATE_INIT && socket.state !== SOCKET_STATE_BIND) try {
1004
+ socket.udpSocket.setTTL(hopLimit);
1005
+ } catch (err) {
1006
+ throw convertSocketError(err);
1007
+ }
1008
+ socket.unicastHopLimit = hopLimit;
1009
+ }
1010
+ async function socketUdpGetReceiveBufferSize(id) {
1011
+ const socket = udpSockets.get(id);
1012
+ if (socket.receiveBufferSize) return BigInt(socket.receiveBufferSize);
1013
+ if (socket.state !== SOCKET_STATE_INIT && socket.state !== SOCKET_STATE_BIND) try {
1014
+ return BigInt(socket.receiveBufferSize = socket.udpSocket.getRecvBufferSize());
1015
+ } catch (err) {
1016
+ throw convertSocketError(err);
1017
+ }
1018
+ else {
1019
+ const receiveBufferSize = await getDefaultReceiveBufferSize();
1020
+ socket.receiveBufferSize = Number(receiveBufferSize);
1021
+ return receiveBufferSize;
1022
+ }
1023
+ }
1024
+ async function socketUdpGetSendBufferSize(id) {
1025
+ const socket = udpSockets.get(id);
1026
+ if (socket.sendBufferSize) return BigInt(socket.sendBufferSize);
1027
+ if (socket.state !== SOCKET_STATE_INIT && socket.state !== SOCKET_STATE_BIND) try {
1028
+ return BigInt(socket.sendBufferSize = socket.udpSocket.getSendBufferSize());
1029
+ } catch (err) {
1030
+ throw convertSocketError(err);
1031
+ }
1032
+ else {
1033
+ const sendBufferSize = await getDefaultSendBufferSize();
1034
+ socket.sendBufferSize = Number(sendBufferSize);
1035
+ return sendBufferSize;
1036
+ }
1037
+ }
1038
+ function socketUdpGetUnicastHopLimit(id) {
1039
+ const { unicastHopLimit } = udpSockets.get(id);
1040
+ return unicastHopLimit;
1041
+ }
1042
+ function socketUdpDispose(id) {
1043
+ const { udpSocket } = udpSockets.get(id);
1044
+ return new Promise((resolve) => {
1045
+ udpSocket.close(() => {
1046
+ udpSockets.delete(id);
1047
+ resolve(0);
1048
+ });
1049
+ });
1050
+ }
1051
+ function socketIncomingDatagramStreamReceive(id, maxResults) {
1052
+ const datagramStream = datagramStreams.get(id);
1053
+ if (!datagramStream.active) throw new Error("wasi-io trap: attempt to receive on inactive incoming datagram stream");
1054
+ if (maxResults === 0n || datagramStream.queue?.length === 0) return [];
1055
+ if (datagramStream.error) throw convertSocketError(datagramStream.error);
1056
+ return datagramStream.queue?.splice(0, Number(maxResults));
1057
+ }
1058
+ async function socketOutgoingDatagramStreamSend(id, datagrams) {
1059
+ const { active, socket } = datagramStreams.get(id);
1060
+ if (!active) throw new Error("wasi-io trap: writing to inactive outgoing datagram stream");
1061
+ const { udpSocket } = socket;
1062
+ let sendQueue = [];
1063
+ let sendQueueAddress = null;
1064
+ let sendQueuePort = null;
1065
+ let datagramsSent = 0;
1066
+ for (const { data, remoteAddress } of datagrams) {
1067
+ const address = remoteAddress ? serializeIpAddress(remoteAddress) : socket.remoteAddress;
1068
+ const port = remoteAddress?.val.port ?? socket.remotePort;
1069
+ let sendLastBatch = true;
1070
+ if (sendQueue.length > 0) if (sendQueueAddress === address && sendQueuePort === port) sendQueue.push(data);
1071
+ else sendLastBatch = true;
1072
+ else {
1073
+ sendQueueAddress = address;
1074
+ sendQueuePort = port;
1075
+ sendQueue.push(data);
1076
+ }
1077
+ if (sendLastBatch) {
1078
+ if (await doSendBatch()) return BigInt(datagramsSent);
1079
+ sendQueue = [];
1080
+ sendQueuePort = port;
1081
+ sendQueueAddress = address;
1082
+ }
1083
+ }
1084
+ if (sendQueue.length) {
1085
+ if (await doSendBatch()) return BigInt(datagramsSent);
1086
+ }
1087
+ if (datagramsSent !== datagrams.length) throw new Error("wasi-io trap: expected to have sent all the datagrams");
1088
+ return BigInt(datagramsSent);
1089
+ function doSendBatch() {
1090
+ return new Promise((resolve, reject) => {
1091
+ if (socket.remoteAddress) {
1092
+ if (sendQueueAddress !== socket.remoteAddress || sendQueuePort !== socket.remotePort) {
1093
+ reject("invalid-argument");
1094
+ return;
1095
+ }
1096
+ udpSocket.send(sendQueue, handler);
1097
+ } else {
1098
+ if (!sendQueueAddress) {
1099
+ reject("invalid-argument");
1100
+ return;
1101
+ }
1102
+ udpSocket.send(sendQueue, sendQueuePort, sendQueueAddress, handler);
1103
+ }
1104
+ function handler(err, _sentBytes) {
1105
+ if (err) {
1106
+ if (datagramsSent > 0) resolve(datagramsSent);
1107
+ else reject(convertSocketError(err));
1108
+ return;
1109
+ }
1110
+ datagramsSent += sendQueue.length;
1111
+ resolve(false);
1112
+ }
1113
+ });
1114
+ }
1115
+ }
1116
+ function checkSend(socket) {
1117
+ try {
1118
+ return Math.floor((socket.udpSocket.getSendBufferSize() - socket.udpSocket.getSendQueueSize()) / 1500);
1119
+ } catch (err) {
1120
+ throw convertSocketError(err);
1121
+ }
1122
+ }
1123
+ function pollSend(socket) {
1124
+ socket.pollState.ready = false;
1125
+ setTimeout(() => {
1126
+ if (checkSend(socket) > 0) pollStateReady(socket.pollState);
1127
+ else pollSend(socket);
1128
+ });
1129
+ }
1130
+ function socketOutgoingDatagramStreamCheckSend(id) {
1131
+ const { active, socket } = datagramStreams.get(id);
1132
+ if (!active) throw new Error("wasi-io trap: check send on inactive outgoing datagram stream");
1133
+ const remaining = checkSend(socket);
1134
+ if (remaining <= 0) pollSend(socket);
1135
+ return BigInt(remaining);
1136
+ }
1137
+ function socketDatagramStreamClear(datagramStream) {
1138
+ datagramStream.active = false;
1139
+ if (datagramStream.cleanup) {
1140
+ datagramStream.cleanup();
1141
+ datagramStream.cleanup = null;
1142
+ }
1143
+ }
1144
+ function socketDatagramStreamDispose(id) {
1145
+ const datagramStream = datagramStreams.get(id);
1146
+ datagramStream.active = false;
1147
+ if (datagramStream.cleanup) {
1148
+ datagramStream.cleanup();
1149
+ datagramStream.cleanup = () => null;
1150
+ }
1151
+ verifyPollsDroppedForDrop(datagramStream.pollState, "datagram stream");
1152
+ datagramStreams.delete(id);
1153
+ }
1154
+ //#endregion
1155
+ //#region dist/io/worker-thread.js
1156
+ function log(msg) {
1157
+ if (debug) process._rawDebug(msg);
1158
+ }
1159
+ let pollCnt = 0;
1160
+ let streamCnt = 0;
1161
+ let futureCnt = 0;
1162
+ /** @type {Map<number, PollState>} */
1163
+ const polls = /* @__PURE__ */ new Map();
1164
+ /** @type {Map<number, Stream>} */
1165
+ const streams = /* @__PURE__ */ new Map();
1166
+ /** @type {Map<number, Future>} */
1167
+ const futures = /* @__PURE__ */ new Map();
1168
+ function createReadableStreamPollState(nodeStream) {
1169
+ const pollState = {
1170
+ ready: true,
1171
+ listener: null,
1172
+ polls: [],
1173
+ parentStream: nodeStream
1174
+ };
1175
+ function pollDone() {
1176
+ pollStateReady(pollState);
1177
+ nodeStream.off("end", pollDone);
1178
+ nodeStream.off("close", pollDone);
1179
+ nodeStream.off("error", pollDone);
1180
+ }
1181
+ nodeStream.on("end", pollDone);
1182
+ nodeStream.on("close", pollDone);
1183
+ nodeStream.on("error", pollDone);
1184
+ return pollState;
1185
+ }
1186
+ /**
1187
+ * @param {NodeJS.ReadableStream | NodeJS.WritableStream} stream
1188
+ */
1189
+ function createReadableStream(nodeStream, pollState = createReadableStreamPollState(nodeStream)) {
1190
+ const stream = {
1191
+ stream: nodeStream,
1192
+ flushPromise: null,
1193
+ pollState
1194
+ };
1195
+ streams.set(++streamCnt, stream);
1196
+ return streamCnt;
1197
+ }
1198
+ function createWritableStream(nodeStream) {
1199
+ const pollState = {
1200
+ ready: true,
1201
+ listener: null,
1202
+ polls: [],
1203
+ parentStream: null
1204
+ };
1205
+ const stream = {
1206
+ stream: nodeStream,
1207
+ flushPromise: null,
1208
+ pollState
1209
+ };
1210
+ streams.set(++streamCnt, stream);
1211
+ function pollReady() {
1212
+ pollStateReady(pollState);
1213
+ }
1214
+ function pollDone() {
1215
+ pollStateReady(pollState);
1216
+ nodeStream.off("drain", pollReady);
1217
+ nodeStream.off("finish", pollDone);
1218
+ nodeStream.off("error", pollDone);
1219
+ nodeStream.off("close", pollDone);
1220
+ }
1221
+ nodeStream.on("drain", pollReady);
1222
+ nodeStream.on("finish", pollDone);
1223
+ nodeStream.on("error", pollDone);
1224
+ nodeStream.on("close", pollDone);
1225
+ return streamCnt;
1226
+ }
1227
+ createWritableStream(stdout);
1228
+ createWritableStream(stderr);
1229
+ /**
1230
+ * @param {number} streamId
1231
+ * @param {NodeJS.ReadableStream | NodeJS.WritableStream} stream
1232
+ */
1233
+ function streamError(err) {
1234
+ return {
1235
+ tag: "last-operation-failed",
1236
+ val: {
1237
+ code: err.code,
1238
+ message: err.message,
1239
+ stack: err.stack
1240
+ }
1241
+ };
1242
+ }
1243
+ /**
1244
+ * @param {number} streamId
1245
+ * @returns {{ stream: NodeJS.ReadableStream | NodeJS.WritableStream, polls: number[] }}
1246
+ */
1247
+ function getStreamOrThrow(streamId) {
1248
+ if (!streamId) throw new Error("wasi-io trap: no stream id provided");
1249
+ const stream = streams.get(streamId);
1250
+ if (!stream) throw { tag: "closed" };
1251
+ if (stream.stream.errored) throw streamError(stream.stream.errored);
1252
+ if (stream.stream.closed) throw { tag: "closed" };
1253
+ return stream;
1254
+ }
1255
+ /**
1256
+ * @param {number} call
1257
+ * @param {number | null} id
1258
+ * @param {any} payload
1259
+ * @returns {Promise<any>}
1260
+ */
1261
+ function handle(call, id, payload) {
1262
+ if (uncaughtException) throw uncaughtException;
1263
+ switch (call) {
1264
+ case HTTP_CREATE_REQUEST: {
1265
+ const { method, scheme, authority, pathWithQuery, headers, body, connectTimeout, betweenBytesTimeout, firstByteTimeout } = payload;
1266
+ return createFuture(createHttpRequest(method, scheme, authority, pathWithQuery, headers, body, connectTimeout, betweenBytesTimeout, firstByteTimeout), void 0);
1267
+ }
1268
+ case OUTPUT_STREAM_CREATE | HTTP: {
1269
+ const stream = new PassThrough();
1270
+ stream["contentLength"] = payload;
1271
+ stream["bytesRemaining"] = payload;
1272
+ return createWritableStream(stream);
1273
+ }
1274
+ case OUTPUT_STREAM_SUBSCRIBE | HTTP:
1275
+ case OUTPUT_STREAM_FLUSH | HTTP:
1276
+ case OUTPUT_STREAM_BLOCKING_WRITE_AND_FLUSH | HTTP: {
1277
+ const { stream } = getStreamOrThrow(id);
1278
+ if (call === (OUTPUT_STREAM_BLOCKING_WRITE_AND_FLUSH | HTTP)) {
1279
+ stream.bytesRemaining -= payload.byteLength;
1280
+ if (stream.bytesRemaining < 0) throw {
1281
+ tag: "last-operation-failed",
1282
+ val: {
1283
+ tag: "HTTP-request-body-size",
1284
+ val: stream.contentLength - stream.bytesRemaining
1285
+ }
1286
+ };
1287
+ }
1288
+ return handle(call & ~HTTP, id, payload);
1289
+ }
1290
+ case OUTPUT_STREAM_WRITE | HTTP: {
1291
+ const { stream } = getStreamOrThrow(id);
1292
+ stream.bytesRemaining -= payload.byteLength;
1293
+ if (stream.bytesRemaining < 0) throw {
1294
+ tag: "last-operation-failed",
1295
+ val: {
1296
+ tag: "HTTP-request-body-size",
1297
+ val: stream.contentLength - stream.bytesRemaining
1298
+ }
1299
+ };
1300
+ return handle(OUTPUT_STREAM_WRITE, id, payload);
1301
+ }
1302
+ case OUTPUT_STREAM_DISPOSE | HTTP: throw new Error("wasi-io trap: Output stream dispose not implemented as an IO-call for HTTP");
1303
+ case HTTP_OUTPUT_STREAM_FINISH: {
1304
+ let stream;
1305
+ try {
1306
+ ({stream} = getStreamOrThrow(id));
1307
+ } catch (e) {
1308
+ if (e.tag === "closed") throw {
1309
+ tag: "internal-error",
1310
+ val: "stream closed"
1311
+ };
1312
+ if (e.tag === "last-operation-failed") throw {
1313
+ tag: "internal-error",
1314
+ val: e.val.message
1315
+ };
1316
+ }
1317
+ if (stream.bytesRemaining > 0) throw {
1318
+ tag: "HTTP-request-body-size",
1319
+ val: stream.contentLength - stream.bytesRemaining
1320
+ };
1321
+ if (stream.bytesRemaining < 0) throw {
1322
+ tag: "HTTP-request-body-size",
1323
+ val: stream.contentLength - stream.bytesRemaining
1324
+ };
1325
+ stream.end();
1326
+ return;
1327
+ }
1328
+ case HTTP_OUTGOING_BODY_DISPOSE:
1329
+ if (debug && !streams.has(id)) console.warn(`wasi-io: stream ${id} not found to dispose`);
1330
+ streams.delete(id);
1331
+ return;
1332
+ case HTTP_SERVER_START: return startHttpServer(id, payload);
1333
+ case HTTP_SERVER_STOP: return stopHttpServer(id);
1334
+ case HTTP_SERVER_SET_OUTGOING_RESPONSE: return setOutgoingResponse(id, payload);
1335
+ case HTTP_SERVER_CLEAR_OUTGOING_RESPONSE: return clearOutgoingResponse(id);
1336
+ case HTTP_SERVER_GET_ADDRESS: return getHttpServerAddress(id);
1337
+ case SOCKET_RESOLVE_ADDRESS_CREATE_REQUEST: return createFuture(socketResolveAddress(payload), void 0);
1338
+ case SOCKET_RESOLVE_ADDRESS_SUBSCRIBE_REQUEST: return createPoll(futures.get(id).pollState);
1339
+ case SOCKET_RESOLVE_ADDRESS_DISPOSE_REQUEST:
1340
+ futureDispose(id, true);
1341
+ return;
1342
+ case SOCKET_RESOLVE_ADDRESS_TAKE_REQUEST: {
1343
+ const val = futureTakeValue(id);
1344
+ if (val === void 0) throw "would-block";
1345
+ return val.val;
1346
+ }
1347
+ case SOCKET_TCP_ACCEPT: return socketTcpAccept(id);
1348
+ case SOCKET_TCP_CREATE_HANDLE: return createTcpSocket();
1349
+ case SOCKET_TCP_BIND_START: return socketTcpBindStart(id, payload.localAddress, payload.family);
1350
+ case SOCKET_TCP_BIND_FINISH: return socketTcpFinish(id, SOCKET_STATE_BIND, SOCKET_STATE_BOUND);
1351
+ case SOCKET_TCP_CONNECT_START: return socketTcpConnectStart(id, payload.remoteAddress, payload.family);
1352
+ case SOCKET_TCP_CONNECT_FINISH: return socketTcpFinish(id, SOCKET_STATE_CONNECT, SOCKET_STATE_CONNECTION);
1353
+ case SOCKET_TCP_LISTEN_START: return socketTcpListenStart(id);
1354
+ case SOCKET_TCP_LISTEN_FINISH: return socketTcpFinish(id, SOCKET_STATE_LISTEN, SOCKET_STATE_LISTENER);
1355
+ case SOCKET_TCP_IS_LISTENING: return tcpSockets.get(id)?.state === SOCKET_STATE_LISTENER;
1356
+ case SOCKET_GET_DEFAULT_SEND_BUFFER_SIZE: return getDefaultSendBufferSize();
1357
+ case SOCKET_GET_DEFAULT_RECEIVE_BUFFER_SIZE: return getDefaultReceiveBufferSize();
1358
+ case SOCKET_TCP_SET_LISTEN_BACKLOG_SIZE: return socketTcpSetListenBacklogSize(id, void 0);
1359
+ case SOCKET_TCP_GET_LOCAL_ADDRESS: return socketTcpGetLocalAddress(id);
1360
+ case SOCKET_TCP_GET_REMOTE_ADDRESS: return socketTcpGetRemoteAddress(id);
1361
+ case SOCKET_TCP_SHUTDOWN: return socketTcpShutdown(id, payload);
1362
+ case SOCKET_TCP_SUBSCRIBE: return createPoll(tcpSockets.get(id)?.pollState);
1363
+ case SOCKET_TCP_SET_KEEP_ALIVE: return socketTcpSetKeepAlive(id, payload);
1364
+ case SOCKET_TCP_DISPOSE: return socketTcpDispose(id);
1365
+ case SOCKET_UDP_CREATE_HANDLE: return createUdpSocket(payload);
1366
+ case SOCKET_UDP_BIND_START: return socketUdpBindStart(id, payload.localAddress, payload.family);
1367
+ case SOCKET_UDP_BIND_FINISH: return socketUdpBindFinish(id);
1368
+ case SOCKET_UDP_STREAM: return socketUdpStream(id, payload);
1369
+ case SOCKET_UDP_SUBSCRIBE: return createPoll(udpSockets.get(id)?.pollState);
1370
+ case SOCKET_UDP_GET_LOCAL_ADDRESS: return socketUdpGetLocalAddress(id);
1371
+ case SOCKET_UDP_GET_REMOTE_ADDRESS: return socketUdpGetRemoteAddress(id);
1372
+ case SOCKET_UDP_SET_RECEIVE_BUFFER_SIZE: return socketUdpSetReceiveBufferSize(id, payload);
1373
+ case SOCKET_UDP_SET_SEND_BUFFER_SIZE: return socketUdpSetSendBufferSize(id, payload);
1374
+ case SOCKET_UDP_SET_UNICAST_HOP_LIMIT: return socketUdpSetUnicastHopLimit(id, payload);
1375
+ case SOCKET_UDP_GET_RECEIVE_BUFFER_SIZE: return socketUdpGetReceiveBufferSize(id);
1376
+ case SOCKET_UDP_GET_SEND_BUFFER_SIZE: return socketUdpGetSendBufferSize(id);
1377
+ case SOCKET_UDP_GET_UNICAST_HOP_LIMIT: return socketUdpGetUnicastHopLimit(id);
1378
+ case SOCKET_UDP_DISPOSE: return socketUdpDispose(id);
1379
+ case SOCKET_INCOMING_DATAGRAM_STREAM_RECEIVE: return socketIncomingDatagramStreamReceive(id, payload);
1380
+ case SOCKET_OUTGOING_DATAGRAM_STREAM_CHECK_SEND: return socketOutgoingDatagramStreamCheckSend(id);
1381
+ case SOCKET_OUTGOING_DATAGRAM_STREAM_SEND: return socketOutgoingDatagramStreamSend(id, payload);
1382
+ case SOCKET_DATAGRAM_STREAM_SUBSCRIBE: return createPoll(datagramStreams.get(id)?.pollState);
1383
+ case SOCKET_DATAGRAM_STREAM_DISPOSE: return socketDatagramStreamDispose(id);
1384
+ case OUTPUT_STREAM_BLOCKING_FLUSH | STDOUT:
1385
+ case OUTPUT_STREAM_BLOCKING_FLUSH | STDERR: return;
1386
+ case OUTPUT_STREAM_DISPOSE | STDOUT:
1387
+ case OUTPUT_STREAM_DISPOSE | STDERR: return;
1388
+ case INPUT_STREAM_CREATE | STDIN: return createReadableStream(new Readable({ read(n) {
1389
+ if (n <= 0) {
1390
+ this.push(null);
1391
+ return;
1392
+ }
1393
+ let buf = Buffer.allocUnsafeSlow(n);
1394
+ read(0, buf, 0, n, null, (err, bytesRead) => {
1395
+ if (err) {
1396
+ if (err.code === "EAGAIN") {
1397
+ nextTick(() => void this._read(n));
1398
+ return;
1399
+ }
1400
+ this.destroy(err);
1401
+ } else if (bytesRead > 0) {
1402
+ if (bytesRead !== buf.length) {
1403
+ const dst = Buffer.allocUnsafeSlow(bytesRead);
1404
+ buf.copy(dst, 0, 0, bytesRead);
1405
+ buf = dst;
1406
+ }
1407
+ this.push(buf);
1408
+ } else this.push(null);
1409
+ });
1410
+ } }));
1411
+ case CLOCKS_DURATION_SUBSCRIBE: payload = hrtime.bigint() + payload;
1412
+ case CLOCKS_INSTANT_SUBSCRIBE: {
1413
+ const pollState = {
1414
+ ready: false,
1415
+ listener: null,
1416
+ polls: [],
1417
+ parentStream: null
1418
+ };
1419
+ subscribeInstant(pollState, payload);
1420
+ return createPoll(pollState);
1421
+ }
1422
+ case INPUT_STREAM_CREATE | FILE: {
1423
+ const { fd, offset } = payload;
1424
+ return createReadableStream(createReadStream(null, {
1425
+ fd,
1426
+ autoClose: false,
1427
+ highWaterMark: 64 * 1024,
1428
+ start: Number(offset)
1429
+ }));
1430
+ }
1431
+ case OUTPUT_STREAM_CREATE | FILE: {
1432
+ const { fd, offset } = payload;
1433
+ return createWritableStream(createWriteStream(null, {
1434
+ fd,
1435
+ autoClose: false,
1436
+ emitClose: false,
1437
+ highWaterMark: 64 * 1024,
1438
+ start: Number(offset)
1439
+ }));
1440
+ }
1441
+ }
1442
+ switch (call & CALL_MASK) {
1443
+ case INPUT_STREAM_READ: {
1444
+ const stream = getStreamOrThrow(id);
1445
+ if (!stream.pollState.ready) return /* @__PURE__ */ new Uint8Array();
1446
+ const res = stream.stream.read(Math.min(stream.stream.readableLength, Number(payload)));
1447
+ if (res) return res;
1448
+ if (stream.stream.readableEnded) throw { tag: "closed" };
1449
+ return /* @__PURE__ */ new Uint8Array();
1450
+ }
1451
+ case INPUT_STREAM_BLOCKING_READ: {
1452
+ const { pollState } = streams.get(id);
1453
+ pollStateCheck(pollState);
1454
+ if (pollState.ready) return handle(INPUT_STREAM_READ | call & CALL_TYPE_MASK, id, payload);
1455
+ return new Promise((resolve) => void (pollState.listener = resolve)).then(() => handle(INPUT_STREAM_READ | call & CALL_TYPE_MASK, id, payload));
1456
+ }
1457
+ case INPUT_STREAM_SKIP: return handle(INPUT_STREAM_READ | call & CALL_TYPE_MASK, id, new Uint8Array(Number(payload)));
1458
+ case INPUT_STREAM_BLOCKING_SKIP: return handle(INPUT_STREAM_BLOCKING_READ | call & CALL_TYPE_MASK, id, new Uint8Array(Number(payload)));
1459
+ case INPUT_STREAM_SUBSCRIBE: return createPoll(streams.get(id).pollState);
1460
+ case INPUT_STREAM_DISPOSE:
1461
+ verifyPollsDroppedForDrop(streams.get(id).pollState, "input stream");
1462
+ streams.delete(id);
1463
+ return;
1464
+ case OUTPUT_STREAM_CHECK_WRITE: {
1465
+ const { stream, pollState } = getStreamOrThrow(id);
1466
+ const bytes = stream.writableHighWaterMark - stream.writableLength;
1467
+ if (bytes === 0) pollState.ready = false;
1468
+ return BigInt(bytes);
1469
+ }
1470
+ case OUTPUT_STREAM_WRITE: {
1471
+ const { stream } = getStreamOrThrow(id);
1472
+ if (payload.byteLength > stream.writableHighWaterMark - stream.writableLength) throw new Error("wasi-io trap: attempt to write too many bytes");
1473
+ stream.write(payload);
1474
+ return;
1475
+ }
1476
+ case OUTPUT_STREAM_BLOCKING_WRITE_AND_FLUSH: {
1477
+ const stream = getStreamOrThrow(id);
1478
+ if (stream.flushPromise) return stream.flushPromise.then(() => handle(call, id, payload));
1479
+ if (payload.byteLength > stream.stream.writableHighWaterMark - stream.stream.writableLength) throw new Error("wasi-io trap: Cannot write more than permitted writable length");
1480
+ stream.pollState.ready = false;
1481
+ return stream.flushPromise = new Promise((resolve, reject) => {
1482
+ if (stream.stream === stdout || stream.stream === stderr) {
1483
+ stream.stream.write(payload);
1484
+ stream.flushPromise = null;
1485
+ pollStateReady(stream.pollState);
1486
+ resolve(BigInt(payload.byteLength));
1487
+ } else stream.stream.write(payload, (err) => {
1488
+ stream.flushPromise = null;
1489
+ pollStateReady(stream.pollState);
1490
+ if (err) {
1491
+ reject(streamError(err));
1492
+ return;
1493
+ }
1494
+ resolve(BigInt(payload.byteLength));
1495
+ });
1496
+ });
1497
+ }
1498
+ case OUTPUT_STREAM_FLUSH: {
1499
+ const stream = getStreamOrThrow(id);
1500
+ if (stream.flushPromise) return;
1501
+ stream.pollState.ready = false;
1502
+ stream.flushPromise = new Promise((resolve, reject) => {
1503
+ if (stream.stream === stdout || stream.stream === stderr) {
1504
+ stream.flushPromise = null;
1505
+ pollStateReady(stream.pollState);
1506
+ resolve();
1507
+ } else stream.stream.write(new Uint8Array([]), (err) => {
1508
+ stream.flushPromise = null;
1509
+ pollStateReady(stream.pollState);
1510
+ if (err) {
1511
+ reject(streamError(err));
1512
+ return;
1513
+ }
1514
+ resolve();
1515
+ });
1516
+ });
1517
+ return stream.flushPromise;
1518
+ }
1519
+ case OUTPUT_STREAM_BLOCKING_FLUSH: {
1520
+ const stream = getStreamOrThrow(id);
1521
+ if (stream.flushPromise) return stream.flushPromise;
1522
+ return new Promise((resolve, reject) => {
1523
+ if (stream.stream === stdout || stream.stream === stderr) resolve();
1524
+ else stream.stream.write(new Uint8Array([]), (err) => err ? reject(streamError(err)) : resolve());
1525
+ });
1526
+ }
1527
+ case OUTPUT_STREAM_WRITE_ZEROES: return handle(OUTPUT_STREAM_WRITE | call & CALL_TYPE_MASK, id, new Uint8Array(Number(payload)));
1528
+ case OUTPUT_STREAM_BLOCKING_WRITE_ZEROES_AND_FLUSH: return handle(OUTPUT_STREAM_BLOCKING_WRITE_AND_FLUSH | call & CALL_TYPE_MASK, id, new Uint8Array(Number(payload)));
1529
+ case OUTPUT_STREAM_SPLICE: {
1530
+ const outputStream = getStreamOrThrow(id);
1531
+ const inputStream = getStreamOrThrow(payload.src);
1532
+ let bytesRemaining = Number(payload.len);
1533
+ let chunk;
1534
+ while (bytesRemaining > 0 && (chunk = inputStream.stream.read(Math.min(outputStream.writableHighWaterMark - outputStream.writableLength, bytesRemaining)))) {
1535
+ bytesRemaining -= chunk.byteLength;
1536
+ outputStream.stream.write(chunk);
1537
+ }
1538
+ if (inputStream.stream.errored) throw streamError(inputStream.stream.errored);
1539
+ if (outputStream.stream.errored) throw streamError(outputStream.stream.errored);
1540
+ return payload.len - BigInt(bytesRemaining);
1541
+ }
1542
+ case OUTPUT_STREAM_SUBSCRIBE: return createPoll(streams.get(id).pollState);
1543
+ case OUTPUT_STREAM_BLOCKING_SPLICE: {
1544
+ const outputStream = getStreamOrThrow(id);
1545
+ let promise = Promise.resolve();
1546
+ let resolve, reject;
1547
+ if (outputStream.stream.writableNeedDrain) promise = new Promise((_resolve, _reject) => {
1548
+ outputStream.stream.once("drain", resolve = _resolve).once("error", reject = _reject);
1549
+ }).then(() => {
1550
+ outputStream.stream.off("error", reject);
1551
+ }, (err) => {
1552
+ outputStream.stream.off("drain", resolve);
1553
+ throw streamError(err);
1554
+ });
1555
+ const inputStream = getStreamOrThrow(payload.src);
1556
+ if (!inputStream.stream.readable) promise = promise.then(() => new Promise((_resolve, _reject) => {
1557
+ inputStream.stream.once("readable", resolve = _resolve).once("error", reject = _reject);
1558
+ }).then(() => {
1559
+ inputStream.stream.off("error", reject);
1560
+ }, (err) => {
1561
+ inputStream.stream.off("readable", resolve);
1562
+ throw streamError(err);
1563
+ }));
1564
+ return promise.then(() => handle(OUTPUT_STREAM_SPLICE, id, payload));
1565
+ }
1566
+ case OUTPUT_STREAM_DISPOSE: {
1567
+ const stream = streams.get(id);
1568
+ verifyPollsDroppedForDrop(stream.pollState, "output stream");
1569
+ stream.stream.end();
1570
+ streams.delete(id);
1571
+ return;
1572
+ }
1573
+ case POLL_POLLABLE_READY: return polls.get(id).ready;
1574
+ case POLL_POLLABLE_BLOCK: payload = [id];
1575
+ case POLL_POLL_LIST: {
1576
+ if (payload.length === 0) throw new Error("wasi-io trap: attempt to poll on empty list");
1577
+ const doneList = [];
1578
+ const pollList = payload.map((pollId) => polls.get(pollId));
1579
+ for (const [idx, pollState] of pollList.entries()) {
1580
+ pollStateCheck(pollState);
1581
+ if (pollState.ready) doneList.push(idx);
1582
+ }
1583
+ if (doneList.length > 0) return new Uint32Array(doneList);
1584
+ let readyPromiseResolve;
1585
+ const readyPromise = new Promise((resolve) => void (readyPromiseResolve = resolve));
1586
+ for (const poll of pollList) poll.listener = readyPromiseResolve;
1587
+ return readyPromise.then(() => {
1588
+ for (const [idx, pollState] of pollList.entries()) {
1589
+ pollState.listener = null;
1590
+ if (pollState.ready) doneList.push(idx);
1591
+ }
1592
+ return new Uint32Array(doneList);
1593
+ });
1594
+ }
1595
+ case POLL_POLLABLE_DISPOSE:
1596
+ if (!polls.delete(id)) throw new Error(`wasi-io trap: Disposed a poll ${id} that does not exist`);
1597
+ return;
1598
+ case FUTURE_TAKE_VALUE: return futureTakeValue(id);
1599
+ case FUTURE_SUBSCRIBE: {
1600
+ const { pollState } = futures.get(id);
1601
+ const pollId = ++pollCnt;
1602
+ polls.set(pollId, pollState);
1603
+ return pollId;
1604
+ }
1605
+ case FUTURE_DISPOSE:
1606
+ futureDispose(id, true);
1607
+ return;
1608
+ default: throw new Error(`wasi-io trap: Unknown call ${call} (${reverseMap[call]}) with type ${reverseMap[call & CALL_TYPE_MASK]}`);
1609
+ }
1610
+ }
1611
+ /**
1612
+ * @param {PollState} pollState
1613
+ */
1614
+ function createPoll(pollState) {
1615
+ const pollId = ++pollCnt;
1616
+ pollState.polls.push(pollId);
1617
+ polls.set(pollId, pollState);
1618
+ return pollId;
1619
+ }
1620
+ function subscribeInstant(pollState, instant) {
1621
+ const duration = instant - hrtime.bigint();
1622
+ if (duration <= 0) return pollStateReady(pollState);
1623
+ function cb() {
1624
+ if (hrtime.bigint() < instant) return subscribeInstant(pollState, instant);
1625
+ pollStateReady(pollState);
1626
+ }
1627
+ if (duration < 1e7) setImmediate(cb);
1628
+ else setTimeout(cb, Number(duration) / 1e6);
1629
+ }
1630
+ /**
1631
+ * @param {PollState} pollState
1632
+ * @param {string} polledResourceDebugName
1633
+ */
1634
+ function verifyPollsDroppedForDrop(pollState, polledResourceDebugName) {
1635
+ for (const pollId of pollState.polls) if (polls.get(pollId)) throw new Error(`wasi-io trap: Cannot drop ${polledResourceDebugName} as it has a child poll resource which has not yet been dropped`);
1636
+ }
1637
+ /**
1638
+ * @param {PollState} pollState
1639
+ * @param {bool} finished
1640
+ */
1641
+ function pollStateReady(pollState) {
1642
+ if (pollState.ready && pollState.listener) uncaughtException = /* @__PURE__ */ new Error("wasi-io trap: poll already ready with listener attached");
1643
+ pollState.ready = true;
1644
+ if (pollState.listener) {
1645
+ pollState.listener();
1646
+ pollState.listener = null;
1647
+ }
1648
+ }
1649
+ /**
1650
+ * @param {PollState} pollState
1651
+ */
1652
+ function pollStateCheck(pollState) {
1653
+ if (pollState.ready && pollState.parentStream) {
1654
+ const stream = pollState.parentStream;
1655
+ if (stream.read(0) !== null) throw new Error("wasi-io trap: got data for a null read");
1656
+ if (pollState.ready && stream.readableLength === 0 && !stream.readableEnded && !stream.errored) {
1657
+ pollState.ready = false;
1658
+ stream.once("readable", () => {
1659
+ pollStateReady(pollState);
1660
+ });
1661
+ }
1662
+ }
1663
+ }
1664
+ /**
1665
+ *
1666
+ * @param {Promise<any>} promise
1667
+ * @param {PollState | undefined} pollState
1668
+ * @returns {number}
1669
+ */
1670
+ function createFuture(promise, pollState) {
1671
+ const futureId = ++futureCnt;
1672
+ if (pollState) pollState.ready = false;
1673
+ else pollState = {
1674
+ ready: false,
1675
+ listener: null,
1676
+ polls: [],
1677
+ parent: null
1678
+ };
1679
+ const future = {
1680
+ tag: "ok",
1681
+ val: null
1682
+ };
1683
+ futures.set(futureId, {
1684
+ future,
1685
+ pollState
1686
+ });
1687
+ promise.then((value) => {
1688
+ pollStateReady(pollState);
1689
+ future.val = value;
1690
+ }, (value) => {
1691
+ pollStateReady(pollState);
1692
+ future.tag = "err";
1693
+ future.val = value;
1694
+ });
1695
+ return futureId;
1696
+ }
1697
+ /**
1698
+ * @param {number} id
1699
+ * @returns {undefined | { tag: 'ok', val: any } | { tag: 'err', val: undefined }}
1700
+ * @throws {undefined}
1701
+ */
1702
+ function futureTakeValue(id) {
1703
+ const future = futures.get(id);
1704
+ if (!future.pollState.ready) return;
1705
+ if (!future.future) return {
1706
+ tag: "err",
1707
+ val: void 0
1708
+ };
1709
+ const out = {
1710
+ tag: "ok",
1711
+ val: future.future
1712
+ };
1713
+ future.future = null;
1714
+ return out;
1715
+ }
1716
+ function futureDispose(id, ownsState) {
1717
+ const { pollState } = futures.get(id);
1718
+ if (ownsState) verifyPollsDroppedForDrop(pollState, "future");
1719
+ futures.delete(id);
1720
+ }
1721
+ let uncaughtException;
1722
+ process.on("uncaughtException", (err) => uncaughtException = err);
1723
+ const debug = runAsWorker(handle);
1724
+ //#endregion
1725
+ export { createFuture, createReadableStream, createReadableStreamPollState, createWritableStream, futureDispose, futureTakeValue, futures, getStreamOrThrow, log, pollStateReady, polls, streams, verifyPollsDroppedForDrop };