@bytecodealliance/preview2-shim 0.17.7 → 0.17.9
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.
- package/README.md +18 -18
- package/lib/browser/cli.js +71 -71
- package/lib/browser/clocks.js +34 -30
- package/lib/browser/config.js +3 -3
- package/lib/browser/environment.js +15 -15
- package/lib/browser/filesystem.js +382 -396
- package/lib/browser/http.js +683 -144
- package/lib/browser/index.js +7 -7
- package/lib/browser/io.js +199 -133
- package/lib/browser/random.js +42 -44
- package/lib/browser/sockets.js +52 -52
- package/lib/common/instantiation.js +147 -151
- package/lib/io/calls.js +7 -9
- package/lib/io/worker-http.js +167 -178
- package/lib/io/worker-io.js +338 -406
- package/lib/io/worker-socket-tcp.js +259 -271
- package/lib/io/worker-socket-udp.js +437 -491
- package/lib/io/worker-sockets.js +230 -251
- package/lib/io/worker-thread.js +774 -822
- package/lib/nodejs/cli.js +53 -65
- package/lib/nodejs/clocks.js +49 -52
- package/lib/nodejs/filesystem.js +726 -785
- package/lib/nodejs/http.js +651 -697
- package/lib/nodejs/index.js +7 -7
- package/lib/nodejs/io.js +1 -1
- package/lib/nodejs/random.js +32 -32
- package/lib/nodejs/sockets.js +468 -538
- package/lib/synckit/index.js +85 -94
- package/package.json +11 -10
|
@@ -1,37 +1,37 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
} from
|
|
11
|
-
import process from
|
|
12
|
-
const { TCP, constants: TCPConstants } = process.binding(
|
|
2
|
+
createFuture,
|
|
3
|
+
createReadableStream,
|
|
4
|
+
createReadableStreamPollState,
|
|
5
|
+
createWritableStream,
|
|
6
|
+
futureDispose,
|
|
7
|
+
futureTakeValue,
|
|
8
|
+
pollStateReady,
|
|
9
|
+
verifyPollsDroppedForDrop,
|
|
10
|
+
} from "./worker-thread.js";
|
|
11
|
+
import process from "node:process";
|
|
12
|
+
const { TCP, constants: TCPConstants } = process.binding("tcp_wrap");
|
|
13
13
|
import {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
} from
|
|
32
|
-
import { Socket, Server } from
|
|
14
|
+
convertSocketError,
|
|
15
|
+
convertSocketErrorCode,
|
|
16
|
+
ipSocketAddress,
|
|
17
|
+
isIPv4MappedAddress,
|
|
18
|
+
isMulticastIpAddress,
|
|
19
|
+
isUnicastIpAddress,
|
|
20
|
+
isWildcardAddress,
|
|
21
|
+
noLookup,
|
|
22
|
+
serializeIpAddress,
|
|
23
|
+
SOCKET_STATE_BIND,
|
|
24
|
+
SOCKET_STATE_BOUND,
|
|
25
|
+
SOCKET_STATE_CLOSED,
|
|
26
|
+
SOCKET_STATE_CONNECT,
|
|
27
|
+
SOCKET_STATE_CONNECTION,
|
|
28
|
+
SOCKET_STATE_INIT,
|
|
29
|
+
SOCKET_STATE_LISTEN,
|
|
30
|
+
SOCKET_STATE_LISTENER,
|
|
31
|
+
} from "./worker-sockets.js";
|
|
32
|
+
import { Socket, Server } from "node:net";
|
|
33
33
|
|
|
34
|
-
const win = process.platform ===
|
|
34
|
+
const win = process.platform === "win32";
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
37
|
* @typedef {import("../../types/interfaces/wasi-sockets-network.js").IpSocketAddress} IpSocketAddress
|
|
@@ -66,278 +66,266 @@ let tcpSocketCnt = 0;
|
|
|
66
66
|
* @param {IpAddressFamily} addressFamily
|
|
67
67
|
*/
|
|
68
68
|
export function createTcpSocket() {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
69
|
+
const handle = new TCP(TCPConstants.SOCKET);
|
|
70
|
+
tcpSockets.set(++tcpSocketCnt, {
|
|
71
|
+
state: SOCKET_STATE_INIT,
|
|
72
|
+
future: null,
|
|
73
|
+
tcpSocket: null,
|
|
74
|
+
listenBacklogSize: 128,
|
|
75
|
+
handle,
|
|
76
|
+
pendingAccepts: [],
|
|
77
|
+
pollState: {
|
|
78
|
+
ready: true,
|
|
79
|
+
listener: null,
|
|
80
|
+
polls: [],
|
|
81
|
+
parentStream: null,
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
return tcpSocketCnt;
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
export function socketTcpFinish(id, fromState, toState) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
return val;
|
|
88
|
+
const socket = tcpSockets.get(id);
|
|
89
|
+
if (socket.state !== fromState) {
|
|
90
|
+
throw "not-in-progress";
|
|
91
|
+
}
|
|
92
|
+
if (!socket.pollState.ready) {
|
|
93
|
+
throw "would-block";
|
|
94
|
+
}
|
|
95
|
+
const { tag, val } = futureTakeValue(socket.future).val;
|
|
96
|
+
futureDispose(socket.future, false);
|
|
97
|
+
socket.future = null;
|
|
98
|
+
if (tag === "err") {
|
|
99
|
+
socket.state = SOCKET_STATE_CLOSED;
|
|
100
|
+
throw val;
|
|
101
|
+
} else {
|
|
102
|
+
socket.state = toState;
|
|
103
|
+
// for the listener, we must immediately transition back to unresolved
|
|
104
|
+
if (toState === SOCKET_STATE_LISTENER) {
|
|
105
|
+
socket.pollState.ready = false;
|
|
108
106
|
}
|
|
107
|
+
return val;
|
|
108
|
+
}
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
export function socketTcpBindStart(id, localAddress, family) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
112
|
+
const socket = tcpSockets.get(id);
|
|
113
|
+
if (socket.state !== SOCKET_STATE_INIT) {
|
|
114
|
+
throw "invalid-state";
|
|
115
|
+
}
|
|
116
|
+
if (
|
|
117
|
+
family !== localAddress.tag ||
|
|
118
|
+
!isUnicastIpAddress(localAddress) ||
|
|
119
|
+
isIPv4MappedAddress(localAddress)
|
|
120
|
+
) {
|
|
121
|
+
throw "invalid-argument";
|
|
122
|
+
}
|
|
123
|
+
socket.state = SOCKET_STATE_BIND;
|
|
124
|
+
const { handle } = socket;
|
|
125
|
+
socket.future = createFuture(
|
|
126
|
+
(async () => {
|
|
127
|
+
const address = serializeIpAddress(localAddress);
|
|
128
|
+
const port = localAddress.val.port;
|
|
129
|
+
const code =
|
|
130
|
+
localAddress.tag === "ipv6"
|
|
131
|
+
? handle.bind6(address, port, TCPConstants.UV_TCP_IPV6ONLY)
|
|
132
|
+
: handle.bind(address, port);
|
|
133
|
+
if (code !== 0) {
|
|
134
|
+
throw convertSocketErrorCode(-code);
|
|
135
|
+
}
|
|
136
|
+
// This is a Node.js / libuv quirk to force the bind error to be thrown
|
|
137
|
+
// (specifically address-in-use).
|
|
138
|
+
{
|
|
139
|
+
const out = {};
|
|
140
|
+
const code = handle.getsockname(out);
|
|
141
|
+
if (code !== 0) {
|
|
142
|
+
throw convertSocketErrorCode(-code);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
})(),
|
|
146
|
+
socket.pollState,
|
|
147
|
+
);
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
export function socketTcpConnectStart(id, remoteAddress, family) {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
host: serializeIpAddress(remoteAddress),
|
|
192
|
-
lookup: noLookup,
|
|
193
|
-
});
|
|
194
|
-
}),
|
|
195
|
-
socket.pollState
|
|
196
|
-
);
|
|
151
|
+
const socket = tcpSockets.get(id);
|
|
152
|
+
if (socket.state !== SOCKET_STATE_INIT && socket.state !== SOCKET_STATE_BOUND) {
|
|
153
|
+
throw "invalid-state";
|
|
154
|
+
}
|
|
155
|
+
if (
|
|
156
|
+
isWildcardAddress(remoteAddress) ||
|
|
157
|
+
family !== remoteAddress.tag ||
|
|
158
|
+
!isUnicastIpAddress(remoteAddress) ||
|
|
159
|
+
isMulticastIpAddress(remoteAddress) ||
|
|
160
|
+
remoteAddress.val.port === 0 ||
|
|
161
|
+
isIPv4MappedAddress(remoteAddress)
|
|
162
|
+
) {
|
|
163
|
+
throw "invalid-argument";
|
|
164
|
+
}
|
|
165
|
+
socket.state = SOCKET_STATE_CONNECT;
|
|
166
|
+
socket.future = createFuture(
|
|
167
|
+
new Promise((resolve, reject) => {
|
|
168
|
+
const tcpSocket = (socket.tcpSocket = new Socket({
|
|
169
|
+
handle: socket.handle,
|
|
170
|
+
pauseOnCreate: true,
|
|
171
|
+
allowHalfOpen: true,
|
|
172
|
+
}));
|
|
173
|
+
function handleErr(err) {
|
|
174
|
+
tcpSocket.off("connect", handleConnect);
|
|
175
|
+
reject(convertSocketError(err));
|
|
176
|
+
}
|
|
177
|
+
function handleConnect() {
|
|
178
|
+
tcpSocket.off("error", handleErr);
|
|
179
|
+
resolve([createReadableStream(tcpSocket), createWritableStream(tcpSocket)]);
|
|
180
|
+
}
|
|
181
|
+
tcpSocket.once("connect", handleConnect);
|
|
182
|
+
tcpSocket.once("error", handleErr);
|
|
183
|
+
tcpSocket.connect({
|
|
184
|
+
port: remoteAddress.val.port,
|
|
185
|
+
host: serializeIpAddress(remoteAddress),
|
|
186
|
+
lookup: noLookup,
|
|
187
|
+
});
|
|
188
|
+
}),
|
|
189
|
+
socket.pollState,
|
|
190
|
+
);
|
|
197
191
|
}
|
|
198
192
|
|
|
199
193
|
export function socketTcpListenStart(id) {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
194
|
+
const socket = tcpSockets.get(id);
|
|
195
|
+
if (socket.state !== SOCKET_STATE_BOUND) {
|
|
196
|
+
throw "invalid-state";
|
|
197
|
+
}
|
|
198
|
+
const { handle } = socket;
|
|
199
|
+
socket.state = SOCKET_STATE_LISTEN;
|
|
200
|
+
socket.future = createFuture(
|
|
201
|
+
new Promise((resolve, reject) => {
|
|
202
|
+
const server = new Server({
|
|
203
|
+
pauseOnConnect: true,
|
|
204
|
+
allowHalfOpen: true,
|
|
205
|
+
});
|
|
206
|
+
function handleErr(err) {
|
|
207
|
+
server.off("listening", handleListen);
|
|
208
|
+
reject(convertSocketError(err));
|
|
209
|
+
}
|
|
210
|
+
function handleListen() {
|
|
211
|
+
server.off("error", handleErr);
|
|
212
|
+
server.on("connection", (tcpSocket) => {
|
|
213
|
+
pollStateReady(socket.pollState);
|
|
214
|
+
const pollState = createReadableStreamPollState(tcpSocket);
|
|
215
|
+
socket.pendingAccepts.push({
|
|
216
|
+
tcpSocket,
|
|
217
|
+
err: null,
|
|
218
|
+
pollState,
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
server.on("error", (err) => {
|
|
222
|
+
pollStateReady(socket.pollState);
|
|
223
|
+
socket.pendingAccepts.push({
|
|
224
|
+
tcpSocket: null,
|
|
225
|
+
err,
|
|
226
|
+
pollState: null,
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
resolve();
|
|
230
|
+
}
|
|
231
|
+
server.once("listening", handleListen);
|
|
232
|
+
server.once("error", handleErr);
|
|
233
|
+
server.listen(handle, socket.listenBacklogSize);
|
|
234
|
+
}),
|
|
235
|
+
socket.pollState,
|
|
236
|
+
);
|
|
243
237
|
}
|
|
244
238
|
|
|
245
239
|
export function socketTcpAccept(id) {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
240
|
+
const socket = tcpSockets.get(id);
|
|
241
|
+
if (socket.state !== SOCKET_STATE_LISTENER) {
|
|
242
|
+
throw "invalid-state";
|
|
243
|
+
}
|
|
244
|
+
if (socket.pendingAccepts.length === 0) {
|
|
245
|
+
throw "would-block";
|
|
246
|
+
}
|
|
247
|
+
const accept = socket.pendingAccepts.shift();
|
|
248
|
+
if (accept.err) {
|
|
249
|
+
socket.state = SOCKET_STATE_CLOSED;
|
|
250
|
+
throw convertSocketError(accept.err);
|
|
251
|
+
}
|
|
252
|
+
if (socket.pendingAccepts.length === 0) {
|
|
253
|
+
socket.pollState.ready = false;
|
|
254
|
+
}
|
|
255
|
+
tcpSockets.set(++tcpSocketCnt, {
|
|
256
|
+
state: SOCKET_STATE_CONNECTION,
|
|
257
|
+
future: null,
|
|
258
|
+
tcpSocket: accept.tcpSocket,
|
|
259
|
+
listenBacklogSize: 128,
|
|
260
|
+
handle: accept.tcpSocket._handle,
|
|
261
|
+
pendingAccepts: [],
|
|
262
|
+
pollState: accept.pollState,
|
|
263
|
+
});
|
|
264
|
+
return [
|
|
265
|
+
tcpSocketCnt,
|
|
266
|
+
createReadableStream(accept.tcpSocket, accept.pollState),
|
|
267
|
+
createWritableStream(accept.tcpSocket),
|
|
268
|
+
];
|
|
275
269
|
}
|
|
276
270
|
|
|
277
271
|
export function socketTcpSetListenBacklogSize(id, backlogSize) {
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
throw 'invalid-state';
|
|
291
|
-
}
|
|
292
|
-
socket.listenBacklogSize = Number(backlogSize);
|
|
272
|
+
const socket = tcpSockets.get(id);
|
|
273
|
+
if (socket.state === SOCKET_STATE_LISTEN || socket.state === SOCKET_STATE_LISTENER) {
|
|
274
|
+
throw "not-supported";
|
|
275
|
+
}
|
|
276
|
+
if (
|
|
277
|
+
socket.state !== SOCKET_STATE_INIT &&
|
|
278
|
+
socket.state !== SOCKET_STATE_BIND &&
|
|
279
|
+
socket.state !== SOCKET_STATE_BOUND
|
|
280
|
+
) {
|
|
281
|
+
throw "invalid-state";
|
|
282
|
+
}
|
|
283
|
+
socket.listenBacklogSize = Number(backlogSize);
|
|
293
284
|
}
|
|
294
285
|
|
|
295
286
|
export function socketTcpGetLocalAddress(id) {
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
287
|
+
const { handle } = tcpSockets.get(id);
|
|
288
|
+
const out = {};
|
|
289
|
+
const code = handle.getsockname(out);
|
|
290
|
+
if (code !== 0) {
|
|
291
|
+
throw convertSocketErrorCode(-code);
|
|
292
|
+
}
|
|
293
|
+
return ipSocketAddress(out.family.toLowerCase(), out.address, out.port);
|
|
303
294
|
}
|
|
304
295
|
|
|
305
296
|
export function socketTcpGetRemoteAddress(id) {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
297
|
+
const { handle } = tcpSockets.get(id);
|
|
298
|
+
const out = {};
|
|
299
|
+
const code = handle.getpeername(out);
|
|
300
|
+
if (code !== 0) {
|
|
301
|
+
throw convertSocketErrorCode(-code);
|
|
302
|
+
}
|
|
303
|
+
return ipSocketAddress(out.family.toLowerCase(), out.address, out.port);
|
|
313
304
|
}
|
|
314
305
|
|
|
315
306
|
export function socketTcpShutdown(id, _shutdownType) {
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
307
|
+
const socket = tcpSockets.get(id);
|
|
308
|
+
if (socket.state !== SOCKET_STATE_CONNECTION) {
|
|
309
|
+
throw "invalid-state";
|
|
310
|
+
}
|
|
311
|
+
if (win && socket.tcpSocket.destroySoon) {
|
|
312
|
+
socket.tcpSocket.destroySoon();
|
|
313
|
+
} else {
|
|
314
|
+
socket.tcpSocket.destroy();
|
|
315
|
+
}
|
|
325
316
|
}
|
|
326
317
|
|
|
327
318
|
export function socketTcpSetKeepAlive(id, { keepAlive, keepAliveIdleTime }) {
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
if (code !== 0) {
|
|
334
|
-
throw convertSocketErrorCode(-code);
|
|
335
|
-
}
|
|
319
|
+
const { handle } = tcpSockets.get(id);
|
|
320
|
+
const code = handle.setKeepAlive(keepAlive, Number(keepAliveIdleTime / 1_000_000_000n));
|
|
321
|
+
if (code !== 0) {
|
|
322
|
+
throw convertSocketErrorCode(-code);
|
|
323
|
+
}
|
|
336
324
|
}
|
|
337
325
|
|
|
338
326
|
export function socketTcpDispose(id) {
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
327
|
+
const socket = tcpSockets.get(id);
|
|
328
|
+
verifyPollsDroppedForDrop(socket.pollState, "tcp socket");
|
|
329
|
+
socket.handle.close();
|
|
330
|
+
tcpSockets.delete(id);
|
|
343
331
|
}
|