@bytecodealliance/preview2-shim 0.17.2 → 0.17.3

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.
@@ -1,57 +1,57 @@
1
1
  import {
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";
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
- earlyDispose,
47
- inputStreamCreate,
48
- ioCall,
49
- outputStreamCreate,
50
- pollableCreate,
51
- registerDispose,
52
- } from "../io/worker-io.js";
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("dispose");
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
- #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
- }
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
- instanceNetwork() {
109
- return defaultNetwork;
110
- },
108
+ instanceNetwork() {
109
+ return defaultNetwork;
110
+ },
111
111
  };
112
112
 
113
113
  export const network = { Network };
114
114
 
115
115
  class ResolveAddressStream {
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) throw this.#data;
128
- if (this.#curItem < this.#data.length) return this.#data[this.#curItem++];
129
- return undefined;
130
- }
131
- subscribe() {
132
- return pollableCreate(
133
- ioCall(SOCKET_RESOLVE_ADDRESS_SUBSCRIBE_REQUEST, this.#id, null),
134
- this
135
- );
136
- }
137
- static _resolveAddresses(network, name) {
138
- if (!mayDnsLookup(network)) throw "permanent-resolver-failure";
139
- const res = new ResolveAddressStream();
140
- res.#id = ioCall(SOCKET_RESOLVE_ADDRESS_CREATE_REQUEST, null, name);
141
- res.#finalizer = registerDispose(
142
- res,
143
- null,
144
- res.#id,
145
- resolveAddressStreamDispose
146
- );
147
- return res;
148
- }
149
- [symbolDispose]() {
150
- if (this.#finalizer) {
151
- earlyDispose(this.#finalizer);
152
- this.#finalizer = null;
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
- ioCall(SOCKET_RESOLVE_ADDRESS_DISPOSE_REQUEST, id, null);
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
- ResolveAddressStream,
165
- resolveAddresses,
174
+ ResolveAddressStream,
175
+ resolveAddresses,
166
176
  };
167
177
 
168
178
  class TcpSocket {
169
- #id;
170
- #network;
171
- #family;
172
- #finalizer;
173
- #options = {
174
- // defaults per https://nodejs.org/docs/latest/api/net.html#socketsetkeepaliveenable-initialdelay
175
- keepAlive: false,
176
- // Node.js doesn't give us the ability to detect the OS default,
177
- // therefore we hardcode the default value instead of using the OS default,
178
- // since we would never be able to report it as a return value otherwise.
179
- // We could make this configurable as a global JCO implementation configuration
180
- // instead.
181
- keepAliveIdleTime: 7200_000_000_000n,
182
-
183
- // The following options are NOT configurable in Node.js!
184
- // Any configurations set will respond correctly, but underneath retain
185
- // system / Node.js defaults.
186
- keepAliveInterval: 1_000_000_000n,
187
- keepAliveCount: 10,
188
- hopLimit: 1,
189
-
190
- // For sendBufferSize and receiveBufferSize we can at least
191
- // use the system defaults, but still we can't support setting them.
192
- sendBufferSize: undefined,
193
- receiveBufferSize: undefined,
194
- };
195
- /**
196
- * @param {IpAddressFamily} addressFamily
197
- * @param {number} id
198
- * @returns {TcpSocket}
199
- */
200
- static _create(addressFamily, id) {
201
- const socket = new TcpSocket();
202
- socket.#id = id;
203
- socket.#family = addressFamily;
204
- socket.#finalizer = registerDispose(socket, null, id, socketTcpDispose);
205
- return socket;
206
- }
207
- startBind(network, localAddress) {
208
- if (!mayTcp(network)) throw "access-denied";
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) throw "invalid-argument";
220
- if (!mayTcp(network)) throw "access-denied";
221
- ioCall(SOCKET_TCP_CONNECT_START, this.#id, {
222
- remoteAddress,
223
- family: this.#family,
224
- });
225
- this.#network = network;
226
- }
227
- finishConnect() {
228
- const [inputStreamId, outputStreamId] = ioCall(
229
- SOCKET_TCP_CONNECT_FINISH,
230
- this.#id,
231
- null
232
- );
233
- return [
234
- inputStreamCreate(SOCKET_TCP, inputStreamId),
235
- outputStreamCreate(SOCKET_TCP, outputStreamId),
236
- ];
237
- }
238
- startListen() {
239
- if (!mayTcp(this.#network)) throw "access-denied";
240
- ioCall(SOCKET_TCP_LISTEN_START, this.#id, null);
241
- }
242
- finishListen() {
243
- ioCall(SOCKET_TCP_LISTEN_FINISH, this.#id, null);
244
- }
245
- accept() {
246
- if (!mayTcp(this.#network)) throw "access-denied";
247
- const [socketId, inputStreamId, outputStreamId] = ioCall(
248
- SOCKET_TCP_ACCEPT,
249
- this.#id,
250
- null
251
- );
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) throw "invalid-argument";
274
- ioCall(SOCKET_TCP_SET_LISTEN_BACKLOG_SIZE, this.#id, value);
275
- }
276
- keepAliveEnabled() {
277
- return this.#options.keepAlive;
278
- }
279
- setKeepAliveEnabled(value) {
280
- this.#options.keepAlive = value;
281
- ioCall(SOCKET_TCP_SET_KEEP_ALIVE, this.#id, {
282
- keepAlive: value,
283
- keepAliveIdleTime: this.#options.keepAliveIdleTime,
284
- });
285
- }
286
- keepAliveIdleTime() {
287
- return this.#options.keepAliveIdleTime;
288
- }
289
- setKeepAliveIdleTime(value) {
290
- if (value < 1n) throw "invalid-argument";
291
- if (value < 1_000_000_000n) value = 1_000_000_000n;
292
- if (value !== this.#options.keepAliveIdleTime) {
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
- keepAlive: true,
297
- keepAliveIdleTime: this.#options.keepAliveIdleTime,
304
+ keepAlive: value,
305
+ keepAliveIdleTime: this.#options.keepAliveIdleTime,
298
306
  });
299
- }
300
- }
301
- }
302
- keepAliveInterval() {
303
- return this.#options.keepAliveInterval;
304
- }
305
- setKeepAliveInterval(value) {
306
- if (value < 1n) throw "invalid-argument";
307
- this.#options.keepAliveInterval = value;
308
- }
309
- keepAliveCount() {
310
- return this.#options.keepAliveCount;
311
- }
312
- setKeepAliveCount(value) {
313
- if (value < 1) throw "invalid-argument";
314
- this.#options.keepAliveCount = value;
315
- }
316
- hopLimit() {
317
- return this.#options.hopLimit;
318
- }
319
- setHopLimit(value) {
320
- if (value < 1) throw "invalid-argument";
321
- this.#options.hopLimit = value;
322
- }
323
- receiveBufferSize() {
324
- if (!this.#options.receiveBufferSize)
325
- this.#options.receiveBufferSize = ioCall(
326
- SOCKET_GET_DEFAULT_RECEIVE_BUFFER_SIZE,
327
- null,
328
- null
329
- );
330
- return this.#options.receiveBufferSize;
331
- }
332
- setReceiveBufferSize(value) {
333
- if (value === 0n) throw "invalid-argument";
334
- this.#options.receiveBufferSize = value;
335
- }
336
- sendBufferSize() {
337
- if (!this.#options.sendBufferSize)
338
- this.#options.sendBufferSize = ioCall(
339
- SOCKET_GET_DEFAULT_SEND_BUFFER_SIZE,
340
- null,
341
- null
342
- );
343
- return this.#options.sendBufferSize;
344
- }
345
- setSendBufferSize(value) {
346
- if (value === 0n) throw "invalid-argument";
347
- this.#options.sendBufferSize = value;
348
- }
349
- subscribe() {
350
- return pollableCreate(ioCall(SOCKET_TCP_SUBSCRIBE, this.#id, null), this);
351
- }
352
- shutdown(shutdownType) {
353
- ioCall(SOCKET_TCP_SHUTDOWN, this.#id, shutdownType);
354
- }
355
- [symbolDispose]() {
356
- if (this.#finalizer) {
357
- earlyDispose(this.#finalizer);
358
- this.#finalizer = null;
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
- ioCall(SOCKET_TCP_DISPOSE, id, null);
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
- createTcpSocket(addressFamily) {
372
- if (addressFamily !== "ipv4" && addressFamily !== "ipv6")
373
- throw "not-supported";
374
- return tcpSocketCreate(
375
- addressFamily,
376
- ioCall(SOCKET_TCP_CREATE_HANDLE, null, null)
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
- TcpSocket,
424
+ TcpSocket,
383
425
  };
384
426
 
385
427
  class UdpSocket {
386
- #id;
387
- #network;
388
- #family;
389
- #finalizer;
390
- static _create(addressFamily) {
391
- if (addressFamily !== "ipv4" && addressFamily !== "ipv6")
392
- throw "not-supported";
393
- const socket = new UdpSocket();
394
- socket.#id = ioCall(SOCKET_UDP_CREATE_HANDLE, null, {
395
- family: addressFamily,
396
- // we always set the unicastHopLimit, because there is no
397
- // getter but only a setter for this in Node.js, so it is the
398
- // only way to guarantee the consistent value
399
- unicastHopLimit: 64,
400
- });
401
- socket.#family = addressFamily;
402
- socket.#finalizer = registerDispose(
403
- socket,
404
- null,
405
- socket.#id,
406
- socketUdpDispose
407
- );
408
- return socket;
409
- }
410
- startBind(network, localAddress) {
411
- if (!mayUdp(network)) throw "access-denied";
412
- ioCall(SOCKET_UDP_BIND_START, this.#id, {
413
- localAddress,
414
- family: this.#family,
415
- });
416
- this.#network = network;
417
- }
418
- finishBind() {
419
- ioCall(SOCKET_UDP_BIND_FINISH, this.#id, null);
420
- }
421
- stream(remoteAddress) {
422
- if (!mayUdp(this.#network)) throw "access-denied";
423
- const [incomingDatagramStreamId, outgoingDatagramStreamId] = ioCall(
424
- SOCKET_UDP_STREAM,
425
- this.#id,
426
- remoteAddress
427
- );
428
- return [
429
- incomingDatagramStreamCreate(incomingDatagramStreamId),
430
- outgoingDatagramStreamCreate(outgoingDatagramStreamId),
431
- ];
432
- }
433
- localAddress() {
434
- return ioCall(SOCKET_UDP_GET_LOCAL_ADDRESS, this.#id);
435
- }
436
- remoteAddress() {
437
- return ioCall(SOCKET_UDP_GET_REMOTE_ADDRESS, this.#id);
438
- }
439
- addressFamily() {
440
- return this.#family;
441
- }
442
- unicastHopLimit() {
443
- return ioCall(SOCKET_UDP_GET_UNICAST_HOP_LIMIT, this.#id);
444
- }
445
- setUnicastHopLimit(value) {
446
- if (value < 1) throw "invalid-argument";
447
- ioCall(SOCKET_UDP_SET_UNICAST_HOP_LIMIT, this.#id, value);
448
- }
449
- receiveBufferSize() {
450
- return ioCall(SOCKET_UDP_GET_RECEIVE_BUFFER_SIZE, this.#id);
451
- }
452
- setReceiveBufferSize(value) {
453
- if (value === 0n) throw "invalid-argument";
454
- ioCall(SOCKET_UDP_SET_RECEIVE_BUFFER_SIZE, this.#id, value);
455
- }
456
- sendBufferSize() {
457
- return ioCall(SOCKET_UDP_GET_SEND_BUFFER_SIZE, this.#id);
458
- }
459
- setSendBufferSize(value) {
460
- if (value === 0n) throw "invalid-argument";
461
- ioCall(SOCKET_UDP_SET_SEND_BUFFER_SIZE, this.#id, value);
462
- }
463
- subscribe() {
464
- return pollableCreate(ioCall(SOCKET_UDP_SUBSCRIBE, this.#id, null), this);
465
- }
466
- [symbolDispose]() {
467
- if (this.#finalizer) {
468
- earlyDispose(this.#finalizer);
469
- this.#finalizer = null;
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
- ioCall(SOCKET_UDP_DISPOSE, id, null);
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
- #id;
483
- #finalizer;
484
- static _create(id) {
485
- const stream = new IncomingDatagramStream();
486
- stream.#id = id;
487
- stream.#finalizer = registerDispose(
488
- stream,
489
- null,
490
- id,
491
- incomingDatagramStreamDispose
492
- );
493
- return stream;
494
- }
495
- receive(maxResults) {
496
- return ioCall(
497
- SOCKET_INCOMING_DATAGRAM_STREAM_RECEIVE,
498
- this.#id,
499
- maxResults
500
- );
501
- }
502
- subscribe() {
503
- return pollableCreate(
504
- ioCall(SOCKET_DATAGRAM_STREAM_SUBSCRIBE, this.#id, null),
505
- this
506
- );
507
- }
508
- [symbolDispose]() {
509
- if (this.#finalizer) {
510
- earlyDispose(this.#finalizer);
511
- this.#finalizer = null;
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
- ioCall(SOCKET_DATAGRAM_STREAM_DISPOSE, id, null);
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
- #id = 0;
525
- #finalizer;
526
- static _create(id) {
527
- const stream = new OutgoingDatagramStream();
528
- stream.#id = id;
529
- stream.#finalizer = registerDispose(
530
- stream,
531
- null,
532
- id,
533
- outgoingDatagramStreamDispose
534
- );
535
- return stream;
536
- }
537
- checkSend() {
538
- return ioCall(SOCKET_OUTGOING_DATAGRAM_STREAM_CHECK_SEND, this.#id, null);
539
- }
540
- send(datagrams) {
541
- return ioCall(SOCKET_OUTGOING_DATAGRAM_STREAM_SEND, this.#id, datagrams);
542
- }
543
- subscribe() {
544
- return pollableCreate(
545
- ioCall(SOCKET_DATAGRAM_STREAM_SUBSCRIBE, this.#id, null),
546
- this
547
- );
548
- }
549
- [symbolDispose]() {
550
- if (this.#finalizer) {
551
- earlyDispose(this.#finalizer);
552
- this.#finalizer = null;
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
- ioCall(SOCKET_DATAGRAM_STREAM_DISPOSE, id, null);
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
- createUdpSocket,
628
+ createUdpSocket,
565
629
  };
566
630
 
567
631
  export const udp = {
568
- UdpSocket,
569
- OutgoingDatagramStream,
570
- IncomingDatagramStream,
632
+ UdpSocket,
633
+ OutgoingDatagramStream,
634
+ IncomingDatagramStream,
571
635
  };