@bytecodealliance/preview2-shim 0.17.8 → 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 +32 -32
- 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 +578 -576
- package/lib/browser/index.js +7 -7
- package/lib/browser/io.js +187 -181
- 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
package/lib/nodejs/sockets.js
CHANGED
|
@@ -1,57 +1,57 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
} from
|
|
2
|
+
SOCKET_DATAGRAM_STREAM_DISPOSE,
|
|
3
|
+
SOCKET_DATAGRAM_STREAM_SUBSCRIBE,
|
|
4
|
+
SOCKET_INCOMING_DATAGRAM_STREAM_RECEIVE,
|
|
5
|
+
SOCKET_OUTGOING_DATAGRAM_STREAM_CHECK_SEND,
|
|
6
|
+
SOCKET_OUTGOING_DATAGRAM_STREAM_SEND,
|
|
7
|
+
SOCKET_RESOLVE_ADDRESS_CREATE_REQUEST,
|
|
8
|
+
SOCKET_RESOLVE_ADDRESS_DISPOSE_REQUEST,
|
|
9
|
+
SOCKET_RESOLVE_ADDRESS_SUBSCRIBE_REQUEST,
|
|
10
|
+
SOCKET_RESOLVE_ADDRESS_TAKE_REQUEST,
|
|
11
|
+
SOCKET_GET_DEFAULT_RECEIVE_BUFFER_SIZE,
|
|
12
|
+
SOCKET_GET_DEFAULT_SEND_BUFFER_SIZE,
|
|
13
|
+
SOCKET_TCP_ACCEPT,
|
|
14
|
+
SOCKET_TCP_BIND_FINISH,
|
|
15
|
+
SOCKET_TCP_BIND_START,
|
|
16
|
+
SOCKET_TCP_CONNECT_FINISH,
|
|
17
|
+
SOCKET_TCP_CONNECT_START,
|
|
18
|
+
SOCKET_TCP_CREATE_HANDLE,
|
|
19
|
+
SOCKET_TCP_DISPOSE,
|
|
20
|
+
SOCKET_TCP_GET_LOCAL_ADDRESS,
|
|
21
|
+
SOCKET_TCP_GET_REMOTE_ADDRESS,
|
|
22
|
+
SOCKET_TCP_IS_LISTENING,
|
|
23
|
+
SOCKET_TCP_LISTEN_FINISH,
|
|
24
|
+
SOCKET_TCP_LISTEN_START,
|
|
25
|
+
SOCKET_TCP_SET_KEEP_ALIVE,
|
|
26
|
+
SOCKET_TCP_SET_LISTEN_BACKLOG_SIZE,
|
|
27
|
+
SOCKET_TCP_SHUTDOWN,
|
|
28
|
+
SOCKET_TCP_SUBSCRIBE,
|
|
29
|
+
SOCKET_TCP,
|
|
30
|
+
SOCKET_UDP_BIND_FINISH,
|
|
31
|
+
SOCKET_UDP_BIND_START,
|
|
32
|
+
SOCKET_UDP_CREATE_HANDLE,
|
|
33
|
+
SOCKET_UDP_DISPOSE,
|
|
34
|
+
SOCKET_UDP_GET_LOCAL_ADDRESS,
|
|
35
|
+
SOCKET_UDP_GET_RECEIVE_BUFFER_SIZE,
|
|
36
|
+
SOCKET_UDP_GET_REMOTE_ADDRESS,
|
|
37
|
+
SOCKET_UDP_GET_SEND_BUFFER_SIZE,
|
|
38
|
+
SOCKET_UDP_GET_UNICAST_HOP_LIMIT,
|
|
39
|
+
SOCKET_UDP_SET_RECEIVE_BUFFER_SIZE,
|
|
40
|
+
SOCKET_UDP_SET_SEND_BUFFER_SIZE,
|
|
41
|
+
SOCKET_UDP_SET_UNICAST_HOP_LIMIT,
|
|
42
|
+
SOCKET_UDP_STREAM,
|
|
43
|
+
SOCKET_UDP_SUBSCRIBE,
|
|
44
|
+
} from "../io/calls.js";
|
|
45
45
|
import {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
} from
|
|
46
|
+
earlyDispose,
|
|
47
|
+
inputStreamCreate,
|
|
48
|
+
ioCall,
|
|
49
|
+
outputStreamCreate,
|
|
50
|
+
pollableCreate,
|
|
51
|
+
registerDispose,
|
|
52
|
+
} from "../io/worker-io.js";
|
|
53
53
|
|
|
54
|
-
const symbolDispose = Symbol.dispose || Symbol.for(
|
|
54
|
+
const symbolDispose = Symbol.dispose || Symbol.for("dispose");
|
|
55
55
|
|
|
56
56
|
/**
|
|
57
57
|
* @typedef {import("../../types/interfaces/wasi-sockets-network").IpSocketAddress} IpSocketAddress
|
|
@@ -60,28 +60,28 @@ const symbolDispose = Symbol.dispose || Symbol.for('dispose');
|
|
|
60
60
|
|
|
61
61
|
// Network class privately stores capabilities
|
|
62
62
|
class Network {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
63
|
+
#allowDnsLookup = true;
|
|
64
|
+
#allowTcp = true;
|
|
65
|
+
#allowUdp = true;
|
|
66
|
+
|
|
67
|
+
static _denyDnsLookup(network = defaultNetwork) {
|
|
68
|
+
network.#allowDnsLookup = false;
|
|
69
|
+
}
|
|
70
|
+
static _denyTcp(network = defaultNetwork) {
|
|
71
|
+
network.#allowTcp = false;
|
|
72
|
+
}
|
|
73
|
+
static _denyUdp(network = defaultNetwork) {
|
|
74
|
+
network.#allowUdp = false;
|
|
75
|
+
}
|
|
76
|
+
static _mayDnsLookup(network = defaultNetwork) {
|
|
77
|
+
return network.#allowDnsLookup;
|
|
78
|
+
}
|
|
79
|
+
static _mayTcp(network = defaultNetwork) {
|
|
80
|
+
return network.#allowTcp;
|
|
81
|
+
}
|
|
82
|
+
static _mayUdp(network = defaultNetwork) {
|
|
83
|
+
return network.#allowUdp;
|
|
84
|
+
}
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
export const _denyDnsLookup = Network._denyDnsLookup;
|
|
@@ -105,531 +105,461 @@ delete Network._mayUdp;
|
|
|
105
105
|
const defaultNetwork = new Network();
|
|
106
106
|
|
|
107
107
|
export const instanceNetwork = {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
108
|
+
instanceNetwork() {
|
|
109
|
+
return defaultNetwork;
|
|
110
|
+
},
|
|
111
111
|
};
|
|
112
112
|
|
|
113
113
|
export const network = { Network };
|
|
114
114
|
|
|
115
115
|
class ResolveAddressStream {
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
null,
|
|
154
|
-
res.#id,
|
|
155
|
-
resolveAddressStreamDispose
|
|
156
|
-
);
|
|
157
|
-
return res;
|
|
158
|
-
}
|
|
159
|
-
[symbolDispose]() {
|
|
160
|
-
if (this.#finalizer) {
|
|
161
|
-
earlyDispose(this.#finalizer);
|
|
162
|
-
this.#finalizer = null;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
116
|
+
#id;
|
|
117
|
+
#data;
|
|
118
|
+
#curItem = 0;
|
|
119
|
+
#error = false;
|
|
120
|
+
#finalizer;
|
|
121
|
+
resolveNextAddress() {
|
|
122
|
+
if (!this.#data) {
|
|
123
|
+
const res = ioCall(SOCKET_RESOLVE_ADDRESS_TAKE_REQUEST, this.#id, null);
|
|
124
|
+
this.#data = res.val;
|
|
125
|
+
this.#error = res.tag === "err";
|
|
126
|
+
}
|
|
127
|
+
if (this.#error) {
|
|
128
|
+
throw this.#data;
|
|
129
|
+
}
|
|
130
|
+
if (this.#curItem < this.#data.length) {
|
|
131
|
+
return this.#data[this.#curItem++];
|
|
132
|
+
}
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
subscribe() {
|
|
136
|
+
return pollableCreate(ioCall(SOCKET_RESOLVE_ADDRESS_SUBSCRIBE_REQUEST, this.#id, null), this);
|
|
137
|
+
}
|
|
138
|
+
static _resolveAddresses(network, name) {
|
|
139
|
+
if (!mayDnsLookup(network)) {
|
|
140
|
+
throw "permanent-resolver-failure";
|
|
141
|
+
}
|
|
142
|
+
const res = new ResolveAddressStream();
|
|
143
|
+
res.#id = ioCall(SOCKET_RESOLVE_ADDRESS_CREATE_REQUEST, null, name);
|
|
144
|
+
res.#finalizer = registerDispose(res, null, res.#id, resolveAddressStreamDispose);
|
|
145
|
+
return res;
|
|
146
|
+
}
|
|
147
|
+
[symbolDispose]() {
|
|
148
|
+
if (this.#finalizer) {
|
|
149
|
+
earlyDispose(this.#finalizer);
|
|
150
|
+
this.#finalizer = null;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
165
153
|
}
|
|
166
154
|
function resolveAddressStreamDispose(id) {
|
|
167
|
-
|
|
155
|
+
ioCall(SOCKET_RESOLVE_ADDRESS_DISPOSE_REQUEST, id, null);
|
|
168
156
|
}
|
|
169
157
|
|
|
170
158
|
const resolveAddresses = ResolveAddressStream._resolveAddresses;
|
|
171
159
|
delete ResolveAddressStream._resolveAddresses;
|
|
172
160
|
|
|
173
161
|
export const ipNameLookup = {
|
|
174
|
-
|
|
175
|
-
|
|
162
|
+
ResolveAddressStream,
|
|
163
|
+
resolveAddresses,
|
|
176
164
|
};
|
|
177
165
|
|
|
178
166
|
class TcpSocket {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
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
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
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
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
167
|
+
#id;
|
|
168
|
+
#network;
|
|
169
|
+
#family;
|
|
170
|
+
#finalizer;
|
|
171
|
+
#options = {
|
|
172
|
+
// defaults per https://nodejs.org/docs/latest/api/net.html#socketsetkeepaliveenable-initialdelay
|
|
173
|
+
keepAlive: false,
|
|
174
|
+
// Node.js doesn't give us the ability to detect the OS default,
|
|
175
|
+
// therefore we hardcode the default value instead of using the OS default,
|
|
176
|
+
// since we would never be able to report it as a return value otherwise.
|
|
177
|
+
// We could make this configurable as a global JCO implementation configuration
|
|
178
|
+
// instead.
|
|
179
|
+
keepAliveIdleTime: 7200_000_000_000n,
|
|
180
|
+
|
|
181
|
+
// The following options are NOT configurable in Node.js!
|
|
182
|
+
// Any configurations set will respond correctly, but underneath retain
|
|
183
|
+
// system / Node.js defaults.
|
|
184
|
+
keepAliveInterval: 1_000_000_000n,
|
|
185
|
+
keepAliveCount: 10,
|
|
186
|
+
hopLimit: 1,
|
|
187
|
+
|
|
188
|
+
// For sendBufferSize and receiveBufferSize we can at least
|
|
189
|
+
// use the system defaults, but still we can't support setting them.
|
|
190
|
+
sendBufferSize: undefined,
|
|
191
|
+
receiveBufferSize: undefined,
|
|
192
|
+
};
|
|
193
|
+
/**
|
|
194
|
+
* @param {IpAddressFamily} addressFamily
|
|
195
|
+
* @param {number} id
|
|
196
|
+
* @returns {TcpSocket}
|
|
197
|
+
*/
|
|
198
|
+
static _create(addressFamily, id) {
|
|
199
|
+
const socket = new TcpSocket();
|
|
200
|
+
socket.#id = id;
|
|
201
|
+
socket.#family = addressFamily;
|
|
202
|
+
socket.#finalizer = registerDispose(socket, null, id, socketTcpDispose);
|
|
203
|
+
return socket;
|
|
204
|
+
}
|
|
205
|
+
startBind(network, localAddress) {
|
|
206
|
+
if (!mayTcp(network)) {
|
|
207
|
+
throw "access-denied";
|
|
208
|
+
}
|
|
209
|
+
ioCall(SOCKET_TCP_BIND_START, this.#id, {
|
|
210
|
+
localAddress,
|
|
211
|
+
family: this.#family,
|
|
212
|
+
});
|
|
213
|
+
this.#network = network;
|
|
214
|
+
}
|
|
215
|
+
finishBind() {
|
|
216
|
+
ioCall(SOCKET_TCP_BIND_FINISH, this.#id, null);
|
|
217
|
+
}
|
|
218
|
+
startConnect(network, remoteAddress) {
|
|
219
|
+
if (this.#network && network !== this.#network) {
|
|
220
|
+
throw "invalid-argument";
|
|
221
|
+
}
|
|
222
|
+
if (!mayTcp(network)) {
|
|
223
|
+
throw "access-denied";
|
|
224
|
+
}
|
|
225
|
+
ioCall(SOCKET_TCP_CONNECT_START, this.#id, {
|
|
226
|
+
remoteAddress,
|
|
227
|
+
family: this.#family,
|
|
228
|
+
});
|
|
229
|
+
this.#network = network;
|
|
230
|
+
}
|
|
231
|
+
finishConnect() {
|
|
232
|
+
const [inputStreamId, outputStreamId] = ioCall(SOCKET_TCP_CONNECT_FINISH, this.#id, null);
|
|
233
|
+
return [
|
|
234
|
+
inputStreamCreate(SOCKET_TCP, inputStreamId),
|
|
235
|
+
outputStreamCreate(SOCKET_TCP, outputStreamId),
|
|
236
|
+
];
|
|
237
|
+
}
|
|
238
|
+
startListen() {
|
|
239
|
+
if (!mayTcp(this.#network)) {
|
|
240
|
+
throw "access-denied";
|
|
241
|
+
}
|
|
242
|
+
ioCall(SOCKET_TCP_LISTEN_START, this.#id, null);
|
|
243
|
+
}
|
|
244
|
+
finishListen() {
|
|
245
|
+
ioCall(SOCKET_TCP_LISTEN_FINISH, this.#id, null);
|
|
246
|
+
}
|
|
247
|
+
accept() {
|
|
248
|
+
if (!mayTcp(this.#network)) {
|
|
249
|
+
throw "access-denied";
|
|
250
|
+
}
|
|
251
|
+
const [socketId, inputStreamId, outputStreamId] = ioCall(SOCKET_TCP_ACCEPT, this.#id, null);
|
|
252
|
+
const socket = tcpSocketCreate(this.#family, socketId);
|
|
253
|
+
Object.assign(socket.#options, this.#options);
|
|
254
|
+
return [
|
|
255
|
+
socket,
|
|
256
|
+
inputStreamCreate(SOCKET_TCP, inputStreamId),
|
|
257
|
+
outputStreamCreate(SOCKET_TCP, outputStreamId),
|
|
258
|
+
];
|
|
259
|
+
}
|
|
260
|
+
localAddress() {
|
|
261
|
+
return ioCall(SOCKET_TCP_GET_LOCAL_ADDRESS, this.#id, null);
|
|
262
|
+
}
|
|
263
|
+
remoteAddress() {
|
|
264
|
+
return ioCall(SOCKET_TCP_GET_REMOTE_ADDRESS, this.#id, null);
|
|
265
|
+
}
|
|
266
|
+
isListening() {
|
|
267
|
+
return ioCall(SOCKET_TCP_IS_LISTENING, this.#id, null);
|
|
268
|
+
}
|
|
269
|
+
addressFamily() {
|
|
270
|
+
return this.#family;
|
|
271
|
+
}
|
|
272
|
+
setListenBacklogSize(value) {
|
|
273
|
+
if (value === 0n) {
|
|
274
|
+
throw "invalid-argument";
|
|
275
|
+
}
|
|
276
|
+
ioCall(SOCKET_TCP_SET_LISTEN_BACKLOG_SIZE, this.#id, value);
|
|
277
|
+
}
|
|
278
|
+
keepAliveEnabled() {
|
|
279
|
+
return this.#options.keepAlive;
|
|
280
|
+
}
|
|
281
|
+
setKeepAliveEnabled(value) {
|
|
282
|
+
this.#options.keepAlive = value;
|
|
283
|
+
ioCall(SOCKET_TCP_SET_KEEP_ALIVE, this.#id, {
|
|
284
|
+
keepAlive: value,
|
|
285
|
+
keepAliveIdleTime: this.#options.keepAliveIdleTime,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
keepAliveIdleTime() {
|
|
289
|
+
return this.#options.keepAliveIdleTime;
|
|
290
|
+
}
|
|
291
|
+
setKeepAliveIdleTime(value) {
|
|
292
|
+
if (value < 1n) {
|
|
293
|
+
throw "invalid-argument";
|
|
294
|
+
}
|
|
295
|
+
if (value < 1_000_000_000n) {
|
|
296
|
+
value = 1_000_000_000n;
|
|
297
|
+
}
|
|
298
|
+
if (value !== this.#options.keepAliveIdleTime) {
|
|
299
|
+
this.#options.keepAliveIdleTime = value;
|
|
300
|
+
if (this.#options.keepAlive) {
|
|
303
301
|
ioCall(SOCKET_TCP_SET_KEEP_ALIVE, this.#id, {
|
|
304
|
-
|
|
305
|
-
|
|
302
|
+
keepAlive: true,
|
|
303
|
+
keepAliveIdleTime: this.#options.keepAliveIdleTime,
|
|
306
304
|
});
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
this.#options.sendBufferSize = ioCall(
|
|
374
|
-
SOCKET_GET_DEFAULT_SEND_BUFFER_SIZE,
|
|
375
|
-
null,
|
|
376
|
-
null
|
|
377
|
-
);
|
|
378
|
-
}
|
|
379
|
-
return this.#options.sendBufferSize;
|
|
380
|
-
}
|
|
381
|
-
setSendBufferSize(value) {
|
|
382
|
-
if (value === 0n) {
|
|
383
|
-
throw 'invalid-argument';
|
|
384
|
-
}
|
|
385
|
-
this.#options.sendBufferSize = value;
|
|
386
|
-
}
|
|
387
|
-
subscribe() {
|
|
388
|
-
return pollableCreate(
|
|
389
|
-
ioCall(SOCKET_TCP_SUBSCRIBE, this.#id, null),
|
|
390
|
-
this
|
|
391
|
-
);
|
|
392
|
-
}
|
|
393
|
-
shutdown(shutdownType) {
|
|
394
|
-
ioCall(SOCKET_TCP_SHUTDOWN, this.#id, shutdownType);
|
|
395
|
-
}
|
|
396
|
-
[symbolDispose]() {
|
|
397
|
-
if (this.#finalizer) {
|
|
398
|
-
earlyDispose(this.#finalizer);
|
|
399
|
-
this.#finalizer = null;
|
|
400
|
-
}
|
|
401
|
-
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
keepAliveInterval() {
|
|
309
|
+
return this.#options.keepAliveInterval;
|
|
310
|
+
}
|
|
311
|
+
setKeepAliveInterval(value) {
|
|
312
|
+
if (value < 1n) {
|
|
313
|
+
throw "invalid-argument";
|
|
314
|
+
}
|
|
315
|
+
this.#options.keepAliveInterval = value;
|
|
316
|
+
}
|
|
317
|
+
keepAliveCount() {
|
|
318
|
+
return this.#options.keepAliveCount;
|
|
319
|
+
}
|
|
320
|
+
setKeepAliveCount(value) {
|
|
321
|
+
if (value < 1) {
|
|
322
|
+
throw "invalid-argument";
|
|
323
|
+
}
|
|
324
|
+
this.#options.keepAliveCount = value;
|
|
325
|
+
}
|
|
326
|
+
hopLimit() {
|
|
327
|
+
return this.#options.hopLimit;
|
|
328
|
+
}
|
|
329
|
+
setHopLimit(value) {
|
|
330
|
+
if (value < 1) {
|
|
331
|
+
throw "invalid-argument";
|
|
332
|
+
}
|
|
333
|
+
this.#options.hopLimit = value;
|
|
334
|
+
}
|
|
335
|
+
receiveBufferSize() {
|
|
336
|
+
if (!this.#options.receiveBufferSize) {
|
|
337
|
+
this.#options.receiveBufferSize = ioCall(SOCKET_GET_DEFAULT_RECEIVE_BUFFER_SIZE, null, null);
|
|
338
|
+
}
|
|
339
|
+
return this.#options.receiveBufferSize;
|
|
340
|
+
}
|
|
341
|
+
setReceiveBufferSize(value) {
|
|
342
|
+
if (value === 0n) {
|
|
343
|
+
throw "invalid-argument";
|
|
344
|
+
}
|
|
345
|
+
this.#options.receiveBufferSize = value;
|
|
346
|
+
}
|
|
347
|
+
sendBufferSize() {
|
|
348
|
+
if (!this.#options.sendBufferSize) {
|
|
349
|
+
this.#options.sendBufferSize = ioCall(SOCKET_GET_DEFAULT_SEND_BUFFER_SIZE, null, null);
|
|
350
|
+
}
|
|
351
|
+
return this.#options.sendBufferSize;
|
|
352
|
+
}
|
|
353
|
+
setSendBufferSize(value) {
|
|
354
|
+
if (value === 0n) {
|
|
355
|
+
throw "invalid-argument";
|
|
356
|
+
}
|
|
357
|
+
this.#options.sendBufferSize = value;
|
|
358
|
+
}
|
|
359
|
+
subscribe() {
|
|
360
|
+
return pollableCreate(ioCall(SOCKET_TCP_SUBSCRIBE, this.#id, null), this);
|
|
361
|
+
}
|
|
362
|
+
shutdown(shutdownType) {
|
|
363
|
+
ioCall(SOCKET_TCP_SHUTDOWN, this.#id, shutdownType);
|
|
364
|
+
}
|
|
365
|
+
[symbolDispose]() {
|
|
366
|
+
if (this.#finalizer) {
|
|
367
|
+
earlyDispose(this.#finalizer);
|
|
368
|
+
this.#finalizer = null;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
402
371
|
}
|
|
403
372
|
|
|
404
373
|
function socketTcpDispose(id) {
|
|
405
|
-
|
|
374
|
+
ioCall(SOCKET_TCP_DISPOSE, id, null);
|
|
406
375
|
}
|
|
407
376
|
|
|
408
377
|
const tcpSocketCreate = TcpSocket._create;
|
|
409
378
|
delete TcpSocket._create;
|
|
410
379
|
|
|
411
380
|
export const tcpCreateSocket = {
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
ioCall(SOCKET_TCP_CREATE_HANDLE, null, null)
|
|
419
|
-
);
|
|
420
|
-
},
|
|
381
|
+
createTcpSocket(addressFamily) {
|
|
382
|
+
if (addressFamily !== "ipv4" && addressFamily !== "ipv6") {
|
|
383
|
+
throw "not-supported";
|
|
384
|
+
}
|
|
385
|
+
return tcpSocketCreate(addressFamily, ioCall(SOCKET_TCP_CREATE_HANDLE, null, null));
|
|
386
|
+
},
|
|
421
387
|
};
|
|
422
388
|
|
|
423
389
|
export const tcp = {
|
|
424
|
-
|
|
390
|
+
TcpSocket,
|
|
425
391
|
};
|
|
426
392
|
|
|
427
393
|
class UdpSocket {
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
);
|
|
521
|
-
}
|
|
522
|
-
[symbolDispose]() {
|
|
523
|
-
if (this.#finalizer) {
|
|
524
|
-
earlyDispose(this.#finalizer);
|
|
525
|
-
this.#finalizer = null;
|
|
526
|
-
}
|
|
527
|
-
}
|
|
394
|
+
#id;
|
|
395
|
+
#network;
|
|
396
|
+
#family;
|
|
397
|
+
#finalizer;
|
|
398
|
+
static _create(addressFamily) {
|
|
399
|
+
if (addressFamily !== "ipv4" && addressFamily !== "ipv6") {
|
|
400
|
+
throw "not-supported";
|
|
401
|
+
}
|
|
402
|
+
const socket = new UdpSocket();
|
|
403
|
+
socket.#id = ioCall(SOCKET_UDP_CREATE_HANDLE, null, {
|
|
404
|
+
family: addressFamily,
|
|
405
|
+
// we always set the unicastHopLimit, because there is no
|
|
406
|
+
// getter but only a setter for this in Node.js, so it is the
|
|
407
|
+
// only way to guarantee the consistent value
|
|
408
|
+
unicastHopLimit: 64,
|
|
409
|
+
});
|
|
410
|
+
socket.#family = addressFamily;
|
|
411
|
+
socket.#finalizer = registerDispose(socket, null, socket.#id, socketUdpDispose);
|
|
412
|
+
return socket;
|
|
413
|
+
}
|
|
414
|
+
startBind(network, localAddress) {
|
|
415
|
+
if (!mayUdp(network)) {
|
|
416
|
+
throw "access-denied";
|
|
417
|
+
}
|
|
418
|
+
ioCall(SOCKET_UDP_BIND_START, this.#id, {
|
|
419
|
+
localAddress,
|
|
420
|
+
family: this.#family,
|
|
421
|
+
});
|
|
422
|
+
this.#network = network;
|
|
423
|
+
}
|
|
424
|
+
finishBind() {
|
|
425
|
+
ioCall(SOCKET_UDP_BIND_FINISH, this.#id, null);
|
|
426
|
+
}
|
|
427
|
+
stream(remoteAddress) {
|
|
428
|
+
if (!mayUdp(this.#network)) {
|
|
429
|
+
throw "access-denied";
|
|
430
|
+
}
|
|
431
|
+
const [incomingDatagramStreamId, outgoingDatagramStreamId] = ioCall(
|
|
432
|
+
SOCKET_UDP_STREAM,
|
|
433
|
+
this.#id,
|
|
434
|
+
remoteAddress,
|
|
435
|
+
);
|
|
436
|
+
return [
|
|
437
|
+
incomingDatagramStreamCreate(incomingDatagramStreamId),
|
|
438
|
+
outgoingDatagramStreamCreate(outgoingDatagramStreamId),
|
|
439
|
+
];
|
|
440
|
+
}
|
|
441
|
+
localAddress() {
|
|
442
|
+
return ioCall(SOCKET_UDP_GET_LOCAL_ADDRESS, this.#id);
|
|
443
|
+
}
|
|
444
|
+
remoteAddress() {
|
|
445
|
+
return ioCall(SOCKET_UDP_GET_REMOTE_ADDRESS, this.#id);
|
|
446
|
+
}
|
|
447
|
+
addressFamily() {
|
|
448
|
+
return this.#family;
|
|
449
|
+
}
|
|
450
|
+
unicastHopLimit() {
|
|
451
|
+
return ioCall(SOCKET_UDP_GET_UNICAST_HOP_LIMIT, this.#id);
|
|
452
|
+
}
|
|
453
|
+
setUnicastHopLimit(value) {
|
|
454
|
+
if (value < 1) {
|
|
455
|
+
throw "invalid-argument";
|
|
456
|
+
}
|
|
457
|
+
ioCall(SOCKET_UDP_SET_UNICAST_HOP_LIMIT, this.#id, value);
|
|
458
|
+
}
|
|
459
|
+
receiveBufferSize() {
|
|
460
|
+
return ioCall(SOCKET_UDP_GET_RECEIVE_BUFFER_SIZE, this.#id);
|
|
461
|
+
}
|
|
462
|
+
setReceiveBufferSize(value) {
|
|
463
|
+
if (value === 0n) {
|
|
464
|
+
throw "invalid-argument";
|
|
465
|
+
}
|
|
466
|
+
ioCall(SOCKET_UDP_SET_RECEIVE_BUFFER_SIZE, this.#id, value);
|
|
467
|
+
}
|
|
468
|
+
sendBufferSize() {
|
|
469
|
+
return ioCall(SOCKET_UDP_GET_SEND_BUFFER_SIZE, this.#id);
|
|
470
|
+
}
|
|
471
|
+
setSendBufferSize(value) {
|
|
472
|
+
if (value === 0n) {
|
|
473
|
+
throw "invalid-argument";
|
|
474
|
+
}
|
|
475
|
+
ioCall(SOCKET_UDP_SET_SEND_BUFFER_SIZE, this.#id, value);
|
|
476
|
+
}
|
|
477
|
+
subscribe() {
|
|
478
|
+
return pollableCreate(ioCall(SOCKET_UDP_SUBSCRIBE, this.#id, null), this);
|
|
479
|
+
}
|
|
480
|
+
[symbolDispose]() {
|
|
481
|
+
if (this.#finalizer) {
|
|
482
|
+
earlyDispose(this.#finalizer);
|
|
483
|
+
this.#finalizer = null;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
528
486
|
}
|
|
529
487
|
|
|
530
488
|
function socketUdpDispose(id) {
|
|
531
|
-
|
|
489
|
+
ioCall(SOCKET_UDP_DISPOSE, id, null);
|
|
532
490
|
}
|
|
533
491
|
|
|
534
492
|
const createUdpSocket = UdpSocket._create;
|
|
535
493
|
delete UdpSocket._create;
|
|
536
494
|
|
|
537
495
|
class IncomingDatagramStream {
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
subscribe() {
|
|
559
|
-
return pollableCreate(
|
|
560
|
-
ioCall(SOCKET_DATAGRAM_STREAM_SUBSCRIBE, this.#id, null),
|
|
561
|
-
this
|
|
562
|
-
);
|
|
563
|
-
}
|
|
564
|
-
[symbolDispose]() {
|
|
565
|
-
if (this.#finalizer) {
|
|
566
|
-
earlyDispose(this.#finalizer);
|
|
567
|
-
this.#finalizer = null;
|
|
568
|
-
}
|
|
569
|
-
}
|
|
496
|
+
#id;
|
|
497
|
+
#finalizer;
|
|
498
|
+
static _create(id) {
|
|
499
|
+
const stream = new IncomingDatagramStream();
|
|
500
|
+
stream.#id = id;
|
|
501
|
+
stream.#finalizer = registerDispose(stream, null, id, incomingDatagramStreamDispose);
|
|
502
|
+
return stream;
|
|
503
|
+
}
|
|
504
|
+
receive(maxResults) {
|
|
505
|
+
return ioCall(SOCKET_INCOMING_DATAGRAM_STREAM_RECEIVE, this.#id, maxResults);
|
|
506
|
+
}
|
|
507
|
+
subscribe() {
|
|
508
|
+
return pollableCreate(ioCall(SOCKET_DATAGRAM_STREAM_SUBSCRIBE, this.#id, null), this);
|
|
509
|
+
}
|
|
510
|
+
[symbolDispose]() {
|
|
511
|
+
if (this.#finalizer) {
|
|
512
|
+
earlyDispose(this.#finalizer);
|
|
513
|
+
this.#finalizer = null;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
570
516
|
}
|
|
571
517
|
|
|
572
518
|
function incomingDatagramStreamDispose(id) {
|
|
573
|
-
|
|
519
|
+
ioCall(SOCKET_DATAGRAM_STREAM_DISPOSE, id, null);
|
|
574
520
|
}
|
|
575
521
|
|
|
576
522
|
const incomingDatagramStreamCreate = IncomingDatagramStream._create;
|
|
577
523
|
delete IncomingDatagramStream._create;
|
|
578
524
|
|
|
579
525
|
class OutgoingDatagramStream {
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
this.#id,
|
|
604
|
-
datagrams
|
|
605
|
-
);
|
|
606
|
-
}
|
|
607
|
-
subscribe() {
|
|
608
|
-
return pollableCreate(
|
|
609
|
-
ioCall(SOCKET_DATAGRAM_STREAM_SUBSCRIBE, this.#id, null),
|
|
610
|
-
this
|
|
611
|
-
);
|
|
612
|
-
}
|
|
613
|
-
[symbolDispose]() {
|
|
614
|
-
if (this.#finalizer) {
|
|
615
|
-
earlyDispose(this.#finalizer);
|
|
616
|
-
this.#finalizer = null;
|
|
617
|
-
}
|
|
618
|
-
}
|
|
526
|
+
#id = 0;
|
|
527
|
+
#finalizer;
|
|
528
|
+
static _create(id) {
|
|
529
|
+
const stream = new OutgoingDatagramStream();
|
|
530
|
+
stream.#id = id;
|
|
531
|
+
stream.#finalizer = registerDispose(stream, null, id, outgoingDatagramStreamDispose);
|
|
532
|
+
return stream;
|
|
533
|
+
}
|
|
534
|
+
checkSend() {
|
|
535
|
+
return ioCall(SOCKET_OUTGOING_DATAGRAM_STREAM_CHECK_SEND, this.#id, null);
|
|
536
|
+
}
|
|
537
|
+
send(datagrams) {
|
|
538
|
+
return ioCall(SOCKET_OUTGOING_DATAGRAM_STREAM_SEND, this.#id, datagrams);
|
|
539
|
+
}
|
|
540
|
+
subscribe() {
|
|
541
|
+
return pollableCreate(ioCall(SOCKET_DATAGRAM_STREAM_SUBSCRIBE, this.#id, null), this);
|
|
542
|
+
}
|
|
543
|
+
[symbolDispose]() {
|
|
544
|
+
if (this.#finalizer) {
|
|
545
|
+
earlyDispose(this.#finalizer);
|
|
546
|
+
this.#finalizer = null;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
619
549
|
}
|
|
620
550
|
function outgoingDatagramStreamDispose(id) {
|
|
621
|
-
|
|
551
|
+
ioCall(SOCKET_DATAGRAM_STREAM_DISPOSE, id, null);
|
|
622
552
|
}
|
|
623
553
|
|
|
624
554
|
const outgoingDatagramStreamCreate = OutgoingDatagramStream._create;
|
|
625
555
|
delete OutgoingDatagramStream._create;
|
|
626
556
|
|
|
627
557
|
export const udpCreateSocket = {
|
|
628
|
-
|
|
558
|
+
createUdpSocket,
|
|
629
559
|
};
|
|
630
560
|
|
|
631
561
|
export const udp = {
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
562
|
+
UdpSocket,
|
|
563
|
+
OutgoingDatagramStream,
|
|
564
|
+
IncomingDatagramStream,
|
|
635
565
|
};
|