@bytecodealliance/preview2-shim 0.18.1 → 0.19.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 (81) hide show
  1. package/dist/browser/cli.d.ts +16 -0
  2. package/dist/browser/cli.js +109 -0
  3. package/dist/browser/clocks.d.ts +3 -0
  4. package/dist/browser/clocks.js +36 -0
  5. package/dist/browser/config.d.ts +2 -0
  6. package/{lib → dist}/browser/config.js +2 -4
  7. package/dist/browser/environment.d.ts +5 -0
  8. package/dist/browser/environment.js +24 -0
  9. package/dist/browser/filesystem.d.ts +132 -0
  10. package/dist/browser/filesystem.js +464 -0
  11. package/dist/browser/http.d.ts +4 -0
  12. package/dist/browser/http.js +643 -0
  13. package/dist/browser/index.d.ts +7 -0
  14. package/dist/browser/index.js +7 -0
  15. package/dist/browser/io.d.ts +58 -0
  16. package/dist/browser/io.js +205 -0
  17. package/dist/browser/random.d.ts +4 -0
  18. package/dist/browser/random.js +49 -0
  19. package/dist/browser/sockets.d.ts +8 -0
  20. package/dist/browser/sockets.js +66 -0
  21. package/dist/common/instantiation.d.ts +97 -0
  22. package/dist/common/instantiation.js +227 -0
  23. package/dist/io/calls.d.ts +91 -0
  24. package/{lib → dist}/io/calls.js +4 -19
  25. package/dist/io/worker-http.d.ts +17 -0
  26. package/dist/io/worker-http.js +192 -0
  27. package/dist/io/worker-io.d.ts +84 -0
  28. package/dist/io/worker-io.js +375 -0
  29. package/dist/io/worker-socket-tcp.d.ts +34 -0
  30. package/dist/io/worker-socket-tcp.js +251 -0
  31. package/dist/io/worker-socket-udp.d.ts +54 -0
  32. package/dist/io/worker-socket-udp.js +492 -0
  33. package/dist/io/worker-sockets.d.ts +32 -0
  34. package/dist/io/worker-sockets.js +265 -0
  35. package/dist/io/worker-thread.d.ts +73 -0
  36. package/dist/io/worker-thread.js +791 -0
  37. package/dist/nodejs/cli.d.ts +30 -0
  38. package/dist/nodejs/cli.js +86 -0
  39. package/dist/nodejs/clocks.d.ts +3 -0
  40. package/dist/nodejs/clocks.js +61 -0
  41. package/dist/nodejs/filesystem.d.ts +113 -0
  42. package/dist/nodejs/filesystem.js +758 -0
  43. package/dist/nodejs/http.d.ts +82 -0
  44. package/dist/nodejs/http.js +674 -0
  45. package/dist/nodejs/index.d.ts +7 -0
  46. package/dist/nodejs/index.js +7 -0
  47. package/dist/nodejs/io.d.ts +1 -0
  48. package/dist/nodejs/io.js +1 -0
  49. package/dist/nodejs/random.d.ts +4 -0
  50. package/dist/nodejs/random.js +42 -0
  51. package/dist/nodejs/sockets.d.ts +21 -0
  52. package/dist/nodejs/sockets.js +482 -0
  53. package/dist/synckit/index.d.ts +2 -0
  54. package/dist/synckit/index.js +117 -0
  55. package/package.json +26 -13
  56. package/types/instantiation.d.ts +7 -7
  57. package/lib/browser/cli.js +0 -135
  58. package/lib/browser/clocks.js +0 -39
  59. package/lib/browser/environment.js +0 -29
  60. package/lib/browser/filesystem.js +0 -503
  61. package/lib/browser/http.js +0 -707
  62. package/lib/browser/index.js +0 -9
  63. package/lib/browser/io.js +0 -262
  64. package/lib/browser/random.js +0 -56
  65. package/lib/browser/sockets.js +0 -88
  66. package/lib/common/instantiation.js +0 -253
  67. package/lib/io/worker-http.js +0 -206
  68. package/lib/io/worker-io.js +0 -468
  69. package/lib/io/worker-socket-tcp.js +0 -331
  70. package/lib/io/worker-socket-udp.js +0 -587
  71. package/lib/io/worker-sockets.js +0 -364
  72. package/lib/io/worker-thread.js +0 -1051
  73. package/lib/nodejs/cli.js +0 -109
  74. package/lib/nodejs/clocks.js +0 -67
  75. package/lib/nodejs/filesystem.js +0 -829
  76. package/lib/nodejs/http.js +0 -764
  77. package/lib/nodejs/index.js +0 -9
  78. package/lib/nodejs/io.js +0 -1
  79. package/lib/nodejs/random.js +0 -49
  80. package/lib/nodejs/sockets.js +0 -565
  81. package/lib/synckit/index.js +0 -127
@@ -0,0 +1,265 @@
1
+ import { isIP } from "node:net";
2
+ import { lookup } from "node:dns/promises";
3
+ import { createSocket } from "node:dgram";
4
+ import { ALL, BADFAMILY, CANCELLED, CONNREFUSED, NODATA, NOMEM, NONAME, NOTFOUND, REFUSED, SERVFAIL, TIMEOUT, V4MAPPED, } from "node:dns";
5
+ import { EACCES, EADDRINUSE, EADDRNOTAVAIL, EALREADY, EBADF, ECONNABORTED, ECONNREFUSED, ECONNRESET, EINVAL, ENOBUFS, ENOMEM, ENOTCONN, ENOTSUP, EPERM, EWOULDBLOCK, } from "node:constants";
6
+ let stateCnt = 0;
7
+ export const SOCKET_STATE_INIT = ++stateCnt;
8
+ export const SOCKET_STATE_BIND = ++stateCnt;
9
+ export const SOCKET_STATE_BOUND = ++stateCnt;
10
+ export const SOCKET_STATE_LISTEN = ++stateCnt;
11
+ export const SOCKET_STATE_LISTENER = ++stateCnt;
12
+ export const SOCKET_STATE_CONNECT = ++stateCnt;
13
+ export const SOCKET_STATE_CONNECTION = ++stateCnt;
14
+ export const SOCKET_STATE_CLOSED = ++stateCnt;
15
+ const dnsLookupOptions = {
16
+ verbatim: true,
17
+ all: true,
18
+ hints: V4MAPPED | ALL,
19
+ };
20
+ export function noLookup(ip, _opts, cb) {
21
+ cb(null, ip);
22
+ }
23
+ export function socketResolveAddress(name) {
24
+ const isIpNum = isIP(name[0] === "[" && name[name.length - 1] === "]" ? name.slice(1, -1) : name);
25
+ if (isIpNum > 0) {
26
+ return Promise.resolve([
27
+ {
28
+ tag: "ipv" + isIpNum,
29
+ val: (isIpNum === 4 ? ipv4ToTuple : ipv6ToTuple)(name),
30
+ },
31
+ ]);
32
+ }
33
+ // verify it is a valid domain name using the URL parser
34
+ let parsedUrl = null;
35
+ try {
36
+ parsedUrl = new URL(`https://${name}`);
37
+ if (parsedUrl.port.length ||
38
+ parsedUrl.username.length ||
39
+ parsedUrl.password.length ||
40
+ parsedUrl.pathname !== "/" ||
41
+ parsedUrl.search.length ||
42
+ parsedUrl.hash.length) {
43
+ parsedUrl = null;
44
+ }
45
+ }
46
+ catch {
47
+ // empty
48
+ }
49
+ if (!parsedUrl) {
50
+ throw "invalid-argument";
51
+ }
52
+ return lookup(name, dnsLookupOptions).then((addresses) => {
53
+ return (Array.isArray(addresses) ? addresses : [addresses]).map(({ address, family }) => {
54
+ return [
55
+ {
56
+ tag: "ipv" + family,
57
+ val: (family === 4 ? ipv4ToTuple : ipv6ToTuple)(address),
58
+ },
59
+ ];
60
+ });
61
+ }, (err) => {
62
+ switch (err.code) {
63
+ // TODO: verify these more carefully
64
+ case NODATA:
65
+ case BADFAMILY:
66
+ case NONAME:
67
+ case NOTFOUND:
68
+ throw "name-unresolvable";
69
+ case TIMEOUT:
70
+ case REFUSED:
71
+ case CONNREFUSED:
72
+ case SERVFAIL:
73
+ case NOMEM:
74
+ case CANCELLED:
75
+ throw "temporary-resolver-failure";
76
+ default:
77
+ throw "permanent-resolver-failure";
78
+ }
79
+ });
80
+ }
81
+ export function convertSocketError(err) {
82
+ switch (err?.code) {
83
+ case "EBADF":
84
+ case "ENOTCONN":
85
+ case "ERR_SOCKET_DGRAM_NOT_CONNECTED":
86
+ return "invalid-state";
87
+ case "EACCES":
88
+ case "EPERM":
89
+ return "access-denied";
90
+ case "ENOTSUP":
91
+ return "not-supported";
92
+ case "EINVAL":
93
+ return "invalid-argument";
94
+ case "ENOMEM":
95
+ case "ENOBUFS":
96
+ return "out-of-memory";
97
+ case "EALREADY":
98
+ return "concurrency-conflict";
99
+ case "EWOULDBLOCK":
100
+ return "would-block";
101
+ // TODO: return "new-socket-limit";
102
+ case "EADDRNOTAVAIL":
103
+ return "address-not-bindable";
104
+ case "EADDRINUSE":
105
+ return "address-in-use";
106
+ // TODO: return "remote-unreachable";
107
+ case "ECONNREFUSED":
108
+ return "connection-refused";
109
+ case "ECONNRESET":
110
+ return "connection-reset";
111
+ case "ECONNABORTED":
112
+ return "connection-aborted";
113
+ default:
114
+ return "unknown";
115
+ }
116
+ }
117
+ export function convertSocketErrorCode(code) {
118
+ switch (code) {
119
+ case 4053: // windows
120
+ case 4083:
121
+ case ENOTCONN:
122
+ case EBADF:
123
+ return "invalid-state";
124
+ case EACCES:
125
+ case EPERM:
126
+ return "access-denied";
127
+ case ENOTSUP:
128
+ return "not-supported";
129
+ case EINVAL:
130
+ return "invalid-argument";
131
+ case ENOMEM:
132
+ case ENOBUFS:
133
+ return "out-of-memory";
134
+ case EALREADY:
135
+ return "concurrency-conflict";
136
+ case EWOULDBLOCK:
137
+ return "would-block";
138
+ // TODO: return "new-socket-limit";
139
+ case 4090: // windows
140
+ case EADDRNOTAVAIL:
141
+ return "address-not-bindable";
142
+ case 4091: // windows
143
+ case EADDRINUSE:
144
+ return "address-in-use";
145
+ // TODO: return "remote-unreachable";
146
+ case ECONNREFUSED:
147
+ return "connection-refused";
148
+ case ECONNRESET:
149
+ return "connection-reset";
150
+ case ECONNABORTED:
151
+ return "connection-aborted";
152
+ // TODO: return "datagram-too-large";
153
+ // TODO: return "name-unresolvable";
154
+ // TODO: return "temporary-resolver-failure";
155
+ default:
156
+ // process._rawDebug('unknown error code', code);
157
+ return "unknown";
158
+ }
159
+ }
160
+ export function tupleToIPv6(arr) {
161
+ if (arr.length !== 8) {
162
+ return null;
163
+ }
164
+ return arr.map((segment) => segment.toString(16)).join(":");
165
+ }
166
+ export function tupleToIpv4(arr) {
167
+ if (arr.length !== 4) {
168
+ return null;
169
+ }
170
+ return arr.map((segment) => segment.toString(10)).join(".");
171
+ }
172
+ export function isMulticastIpAddress(ipSocketAddress) {
173
+ return ((ipSocketAddress.tag === "ipv4" && ipSocketAddress.val.address[0] === 0xe0) ||
174
+ (ipSocketAddress.tag === "ipv6" && ipSocketAddress.val.address[0] === 0xff00));
175
+ }
176
+ export function isIPv4MappedAddress(ipSocketAddress) {
177
+ return ipSocketAddress.tag === "ipv6" && ipSocketAddress.val.address[5] === 0xffff;
178
+ }
179
+ export function isUnicastIpAddress(ipSocketAddress) {
180
+ return !isMulticastIpAddress(ipSocketAddress) && !isBroadcastIpAddress(ipSocketAddress);
181
+ }
182
+ export function isWildcardAddress(ipSocketAddress) {
183
+ const { address } = ipSocketAddress.val;
184
+ if (ipSocketAddress.tag === "ipv4") {
185
+ return address[0] === 0 && address[1] === 0 && address[2] === 0 && address[3] === 0;
186
+ }
187
+ else {
188
+ return (address[0] === 0 &&
189
+ address[1] === 0 &&
190
+ address[2] === 0 &&
191
+ address[3] === 0 &&
192
+ address[4] === 0 &&
193
+ address[5] === 0 &&
194
+ address[6] === 0 &&
195
+ address[7] === 0);
196
+ }
197
+ }
198
+ export function isBroadcastIpAddress(ipSocketAddress) {
199
+ const { address } = ipSocketAddress.val;
200
+ return (ipSocketAddress.tag === "ipv4" &&
201
+ address[0] === 0xff &&
202
+ address[1] === 0xff &&
203
+ address[2] === 0xff &&
204
+ address[3] === 0xff);
205
+ }
206
+ export function serializeIpAddress(addr) {
207
+ if (addr.tag === "ipv4") {
208
+ return tupleToIpv4(addr.val.address);
209
+ }
210
+ return tupleToIPv6(addr.val.address);
211
+ }
212
+ export function ipv6ToTuple(ipv6) {
213
+ const [lhs, rhs = ""] = ipv6.includes("::") ? ipv6.split("::") : [ipv6];
214
+ const lhsParts = lhs === "" ? [] : lhs.split(":");
215
+ const rhsParts = rhs === "" ? [] : rhs.split(":");
216
+ return [...lhsParts, ...Array(8 - lhsParts.length - rhsParts.length).fill(0), ...rhsParts].map((segment) => parseInt(segment, 16));
217
+ }
218
+ export function ipv4ToTuple(ipv4) {
219
+ return ipv4.split(".").map((segment) => parseInt(segment, 10));
220
+ }
221
+ export function ipSocketAddress(family, addr, port) {
222
+ if (family === "ipv4") {
223
+ return {
224
+ tag: "ipv4",
225
+ val: {
226
+ port,
227
+ address: ipv4ToTuple(addr),
228
+ },
229
+ };
230
+ }
231
+ return {
232
+ tag: "ipv6",
233
+ val: {
234
+ port,
235
+ flowInfo: 0,
236
+ address: ipv6ToTuple(addr),
237
+ scopeId: 0,
238
+ },
239
+ };
240
+ }
241
+ let _recvBufferSize;
242
+ let _sendBufferSize;
243
+ async function getDefaultBufferSizes() {
244
+ var s = createSocket({ type: "udp4" });
245
+ s.bind(0);
246
+ await new Promise((resolve, reject) => {
247
+ s.once("error", reject);
248
+ s.once("listening", resolve);
249
+ });
250
+ _recvBufferSize = BigInt(s.getRecvBufferSize());
251
+ _sendBufferSize = BigInt(s.getSendBufferSize());
252
+ s.close();
253
+ }
254
+ export async function getDefaultSendBufferSize() {
255
+ if (!_sendBufferSize) {
256
+ await getDefaultBufferSizes();
257
+ }
258
+ return _sendBufferSize;
259
+ }
260
+ export async function getDefaultReceiveBufferSize() {
261
+ if (!_recvBufferSize) {
262
+ await getDefaultBufferSizes();
263
+ }
264
+ return _recvBufferSize;
265
+ }
@@ -0,0 +1,73 @@
1
+ export declare function log(msg: any): void;
2
+ export interface PollState {
3
+ ready: boolean;
4
+ listener: (() => void) | null;
5
+ polls: number[];
6
+ parentStream: null | NodeJS.ReadableStream;
7
+ }
8
+ export interface Stream {
9
+ stream: NodeJS.ReadableStream | NodeJS.WritableStream;
10
+ flushPromise: Promise<void> | null;
11
+ pollState: any;
12
+ }
13
+ export interface Future {
14
+ future: {
15
+ tag: "ok" | "err";
16
+ val: any;
17
+ };
18
+ pollState: any;
19
+ }
20
+ /** @type {Map<number, PollState>} */
21
+ export declare const polls: Map<any, any>;
22
+ /** @type {Map<number, Stream>} */
23
+ export declare const streams: Map<any, any>;
24
+ /** @type {Map<number, Future>} */
25
+ export declare const futures: Map<any, any>;
26
+ export declare function createReadableStreamPollState(nodeStream: any): {
27
+ ready: boolean;
28
+ listener: null;
29
+ polls: never[];
30
+ parentStream: any;
31
+ };
32
+ /**
33
+ * @param {NodeJS.ReadableStream | NodeJS.WritableStream} stream
34
+ */
35
+ export declare function createReadableStream(nodeStream: any, pollState?: {
36
+ ready: boolean;
37
+ listener: null;
38
+ polls: never[];
39
+ parentStream: any;
40
+ }): number;
41
+ export declare function createWritableStream(nodeStream: any): number;
42
+ /**
43
+ * @param {number} streamId
44
+ * @returns {{ stream: NodeJS.ReadableStream | NodeJS.WritableStream, polls: number[] }}
45
+ */
46
+ export declare function getStreamOrThrow(streamId: any): any;
47
+ /**
48
+ * @param {PollState} pollState
49
+ * @param {string} polledResourceDebugName
50
+ */
51
+ export declare function verifyPollsDroppedForDrop(pollState: any, polledResourceDebugName: any): void;
52
+ /**
53
+ * @param {PollState} pollState
54
+ * @param {bool} finished
55
+ */
56
+ export declare function pollStateReady(pollState: any): void;
57
+ /**
58
+ *
59
+ * @param {Promise<any>} promise
60
+ * @param {PollState | undefined} pollState
61
+ * @returns {number}
62
+ */
63
+ export declare function createFuture(promise: any, pollState: any): number;
64
+ /**
65
+ * @param {number} id
66
+ * @returns {undefined | { tag: 'ok', val: any } | { tag: 'err', val: undefined }}
67
+ * @throws {undefined}
68
+ */
69
+ export declare function futureTakeValue(id: any): {
70
+ tag: string;
71
+ val: any;
72
+ } | undefined;
73
+ export declare function futureDispose(id: any, ownsState: any): undefined;