@bytecodealliance/preview2-shim 0.18.1 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/cli.d.ts +16 -0
- package/dist/browser/cli.js +109 -0
- package/dist/browser/clocks.d.ts +3 -0
- package/dist/browser/clocks.js +36 -0
- package/dist/browser/config.d.ts +2 -0
- package/{lib → dist}/browser/config.js +2 -4
- package/dist/browser/environment.d.ts +5 -0
- package/dist/browser/environment.js +24 -0
- package/dist/browser/filesystem.d.ts +132 -0
- package/dist/browser/filesystem.js +464 -0
- package/dist/browser/http.d.ts +4 -0
- package/dist/browser/http.js +643 -0
- package/dist/browser/index.d.ts +7 -0
- package/dist/browser/index.js +7 -0
- package/dist/browser/io.d.ts +58 -0
- package/dist/browser/io.js +205 -0
- package/dist/browser/random.d.ts +4 -0
- package/dist/browser/random.js +49 -0
- package/dist/browser/sockets.d.ts +8 -0
- package/dist/browser/sockets.js +66 -0
- package/dist/common/instantiation.d.ts +97 -0
- package/dist/common/instantiation.js +227 -0
- package/dist/io/calls.d.ts +91 -0
- package/{lib → dist}/io/calls.js +4 -19
- package/dist/io/worker-http.d.ts +17 -0
- package/dist/io/worker-http.js +192 -0
- package/dist/io/worker-io.d.ts +84 -0
- package/dist/io/worker-io.js +375 -0
- package/dist/io/worker-socket-tcp.d.ts +34 -0
- package/dist/io/worker-socket-tcp.js +251 -0
- package/dist/io/worker-socket-udp.d.ts +54 -0
- package/dist/io/worker-socket-udp.js +492 -0
- package/dist/io/worker-sockets.d.ts +32 -0
- package/dist/io/worker-sockets.js +265 -0
- package/dist/io/worker-thread.d.ts +73 -0
- package/dist/io/worker-thread.js +791 -0
- package/dist/nodejs/cli.d.ts +30 -0
- package/dist/nodejs/cli.js +86 -0
- package/dist/nodejs/clocks.d.ts +3 -0
- package/dist/nodejs/clocks.js +61 -0
- package/dist/nodejs/filesystem.d.ts +113 -0
- package/dist/nodejs/filesystem.js +758 -0
- package/dist/nodejs/http.d.ts +82 -0
- package/dist/nodejs/http.js +674 -0
- package/dist/nodejs/index.d.ts +7 -0
- package/dist/nodejs/index.js +7 -0
- package/dist/nodejs/io.d.ts +1 -0
- package/dist/nodejs/io.js +1 -0
- package/dist/nodejs/random.d.ts +4 -0
- package/dist/nodejs/random.js +42 -0
- package/dist/nodejs/sockets.d.ts +21 -0
- package/dist/nodejs/sockets.js +482 -0
- package/dist/synckit/index.d.ts +2 -0
- package/dist/synckit/index.js +117 -0
- package/package.json +26 -13
- package/types/instantiation.d.ts +7 -7
- package/lib/browser/cli.js +0 -135
- package/lib/browser/clocks.js +0 -39
- package/lib/browser/environment.js +0 -29
- package/lib/browser/filesystem.js +0 -503
- package/lib/browser/http.js +0 -707
- package/lib/browser/index.js +0 -9
- package/lib/browser/io.js +0 -262
- package/lib/browser/random.js +0 -56
- package/lib/browser/sockets.js +0 -88
- package/lib/common/instantiation.js +0 -253
- package/lib/io/worker-http.js +0 -206
- package/lib/io/worker-io.js +0 -468
- package/lib/io/worker-socket-tcp.js +0 -331
- package/lib/io/worker-socket-udp.js +0 -587
- package/lib/io/worker-sockets.js +0 -364
- package/lib/io/worker-thread.js +0 -1051
- package/lib/nodejs/cli.js +0 -109
- package/lib/nodejs/clocks.js +0 -67
- package/lib/nodejs/filesystem.js +0 -829
- package/lib/nodejs/http.js +0 -764
- package/lib/nodejs/index.js +0 -9
- package/lib/nodejs/io.js +0 -1
- package/lib/nodejs/random.js +0 -49
- package/lib/nodejs/sockets.js +0 -565
- package/lib/synckit/index.js +0 -127
package/lib/nodejs/index.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import * as clocks from "./clocks.js";
|
|
2
|
-
import * as filesystem from "./filesystem.js";
|
|
3
|
-
import * as http from "./http.js";
|
|
4
|
-
import * as io from "./io.js";
|
|
5
|
-
import * as random from "./random.js";
|
|
6
|
-
import * as sockets from "./sockets.js";
|
|
7
|
-
import * as cli from "./cli.js";
|
|
8
|
-
|
|
9
|
-
export { clocks, filesystem, http, io, random, sockets, cli };
|
package/lib/nodejs/io.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { error, streams, poll } from "../io/worker-io.js";
|
package/lib/nodejs/random.js
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { randomBytes, randomFillSync } from "node:crypto";
|
|
2
|
-
|
|
3
|
-
export const insecure = {
|
|
4
|
-
getInsecureRandomBytes: getRandomBytes,
|
|
5
|
-
getInsecureRandomU64() {
|
|
6
|
-
return new BigUint64Array(randomBytes(8).buffer)[0];
|
|
7
|
-
},
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
let insecureSeedValue1, insecureSeedValue2;
|
|
11
|
-
|
|
12
|
-
export const insecureSeed = {
|
|
13
|
-
insecureSeed() {
|
|
14
|
-
if (insecureSeedValue1 === undefined) {
|
|
15
|
-
insecureSeedValue1 = random.getRandomU64();
|
|
16
|
-
insecureSeedValue2 = random.getRandomU64();
|
|
17
|
-
}
|
|
18
|
-
return [insecureSeedValue1, insecureSeedValue2];
|
|
19
|
-
},
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
export const random = {
|
|
23
|
-
getRandomBytes,
|
|
24
|
-
|
|
25
|
-
getRandomU64() {
|
|
26
|
-
return new BigUint64Array(randomBytes(8).buffer)[0];
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
function getRandomBytes(len) {
|
|
31
|
-
return randomBytes(Number(len));
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
getRandomBytes[Symbol.for("cabiLower")] = ({ memory, realloc }) => {
|
|
35
|
-
let buf32 = new Uint32Array(memory.buffer);
|
|
36
|
-
return function randomBytes(len, retptr) {
|
|
37
|
-
len = Number(len);
|
|
38
|
-
const ptr = realloc(0, 0, 1, len);
|
|
39
|
-
randomFillSync(memory.buffer, ptr, len);
|
|
40
|
-
if (memory.buffer !== buf32.buffer) {
|
|
41
|
-
buf32 = new Uint32Array(memory.buffer);
|
|
42
|
-
}
|
|
43
|
-
if (retptr % 4) {
|
|
44
|
-
throw new Error("wasi-io trap: retptr not aligned");
|
|
45
|
-
}
|
|
46
|
-
buf32[retptr >> 2] = ptr;
|
|
47
|
-
buf32[(retptr >> 2) + 1] = len;
|
|
48
|
-
};
|
|
49
|
-
};
|
package/lib/nodejs/sockets.js
DELETED
|
@@ -1,565 +0,0 @@
|
|
|
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";
|
|
45
|
-
import {
|
|
46
|
-
earlyDispose,
|
|
47
|
-
inputStreamCreate,
|
|
48
|
-
ioCall,
|
|
49
|
-
outputStreamCreate,
|
|
50
|
-
pollableCreate,
|
|
51
|
-
registerDispose,
|
|
52
|
-
} from "../io/worker-io.js";
|
|
53
|
-
|
|
54
|
-
const symbolDispose = Symbol.dispose || Symbol.for("dispose");
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* @typedef {import("../../types/interfaces/wasi-sockets-network").IpSocketAddress} IpSocketAddress
|
|
58
|
-
* @typedef {import("../../types/interfaces/wasi-sockets-network").IpAddressFamily} IpAddressFamily
|
|
59
|
-
*/
|
|
60
|
-
|
|
61
|
-
// Network class privately stores capabilities
|
|
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
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export const _denyDnsLookup = Network._denyDnsLookup;
|
|
88
|
-
delete Network._denyDnsLookup;
|
|
89
|
-
|
|
90
|
-
export const _denyTcp = Network._denyTcp;
|
|
91
|
-
delete Network._denyTcp;
|
|
92
|
-
|
|
93
|
-
export const _denyUdp = Network._denyUdp;
|
|
94
|
-
delete Network._denyUdp;
|
|
95
|
-
|
|
96
|
-
const mayDnsLookup = Network._mayDnsLookup;
|
|
97
|
-
delete Network._mayDnsLookup;
|
|
98
|
-
|
|
99
|
-
const mayTcp = Network._mayTcp;
|
|
100
|
-
delete Network._mayTcp;
|
|
101
|
-
|
|
102
|
-
const mayUdp = Network._mayUdp;
|
|
103
|
-
delete Network._mayUdp;
|
|
104
|
-
|
|
105
|
-
const defaultNetwork = new Network();
|
|
106
|
-
|
|
107
|
-
export const instanceNetwork = {
|
|
108
|
-
instanceNetwork() {
|
|
109
|
-
return defaultNetwork;
|
|
110
|
-
},
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
export const network = { Network };
|
|
114
|
-
|
|
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) {
|
|
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
|
-
}
|
|
153
|
-
}
|
|
154
|
-
function resolveAddressStreamDispose(id) {
|
|
155
|
-
ioCall(SOCKET_RESOLVE_ADDRESS_DISPOSE_REQUEST, id, null);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
const resolveAddresses = ResolveAddressStream._resolveAddresses;
|
|
159
|
-
delete ResolveAddressStream._resolveAddresses;
|
|
160
|
-
|
|
161
|
-
export const ipNameLookup = {
|
|
162
|
-
ResolveAddressStream,
|
|
163
|
-
resolveAddresses,
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
class TcpSocket {
|
|
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) {
|
|
301
|
-
ioCall(SOCKET_TCP_SET_KEEP_ALIVE, this.#id, {
|
|
302
|
-
keepAlive: true,
|
|
303
|
-
keepAliveIdleTime: this.#options.keepAliveIdleTime,
|
|
304
|
-
});
|
|
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
|
-
}
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
function socketTcpDispose(id) {
|
|
374
|
-
ioCall(SOCKET_TCP_DISPOSE, id, null);
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
const tcpSocketCreate = TcpSocket._create;
|
|
378
|
-
delete TcpSocket._create;
|
|
379
|
-
|
|
380
|
-
export const tcpCreateSocket = {
|
|
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
|
-
},
|
|
387
|
-
};
|
|
388
|
-
|
|
389
|
-
export const tcp = {
|
|
390
|
-
TcpSocket,
|
|
391
|
-
};
|
|
392
|
-
|
|
393
|
-
class UdpSocket {
|
|
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
|
-
}
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
function socketUdpDispose(id) {
|
|
489
|
-
ioCall(SOCKET_UDP_DISPOSE, id, null);
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
const createUdpSocket = UdpSocket._create;
|
|
493
|
-
delete UdpSocket._create;
|
|
494
|
-
|
|
495
|
-
class IncomingDatagramStream {
|
|
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
|
-
}
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
function incomingDatagramStreamDispose(id) {
|
|
519
|
-
ioCall(SOCKET_DATAGRAM_STREAM_DISPOSE, id, null);
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
const incomingDatagramStreamCreate = IncomingDatagramStream._create;
|
|
523
|
-
delete IncomingDatagramStream._create;
|
|
524
|
-
|
|
525
|
-
class OutgoingDatagramStream {
|
|
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
|
-
}
|
|
549
|
-
}
|
|
550
|
-
function outgoingDatagramStreamDispose(id) {
|
|
551
|
-
ioCall(SOCKET_DATAGRAM_STREAM_DISPOSE, id, null);
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
const outgoingDatagramStreamCreate = OutgoingDatagramStream._create;
|
|
555
|
-
delete OutgoingDatagramStream._create;
|
|
556
|
-
|
|
557
|
-
export const udpCreateSocket = {
|
|
558
|
-
createUdpSocket,
|
|
559
|
-
};
|
|
560
|
-
|
|
561
|
-
export const udp = {
|
|
562
|
-
UdpSocket,
|
|
563
|
-
OutgoingDatagramStream,
|
|
564
|
-
IncomingDatagramStream,
|
|
565
|
-
};
|