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