@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/io/worker-sockets.js
CHANGED
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
import { isIP } from
|
|
2
|
-
import { lookup } from
|
|
3
|
-
import { Socket } from
|
|
1
|
+
import { isIP } from 'node:net';
|
|
2
|
+
import { lookup } from 'node:dns/promises';
|
|
3
|
+
import { Socket } from 'node:dgram';
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
} from
|
|
5
|
+
ALL,
|
|
6
|
+
BADFAMILY,
|
|
7
|
+
CANCELLED,
|
|
8
|
+
CONNREFUSED,
|
|
9
|
+
NODATA,
|
|
10
|
+
NOMEM,
|
|
11
|
+
NONAME,
|
|
12
|
+
NOTFOUND,
|
|
13
|
+
REFUSED,
|
|
14
|
+
SERVFAIL,
|
|
15
|
+
TIMEOUT,
|
|
16
|
+
V4MAPPED,
|
|
17
|
+
} from 'node:dns';
|
|
18
18
|
import {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
} from
|
|
19
|
+
EACCES,
|
|
20
|
+
EADDRINUSE,
|
|
21
|
+
EADDRNOTAVAIL,
|
|
22
|
+
EALREADY,
|
|
23
|
+
EBADF,
|
|
24
|
+
ECONNABORTED,
|
|
25
|
+
ECONNREFUSED,
|
|
26
|
+
ECONNRESET,
|
|
27
|
+
EINVAL,
|
|
28
|
+
ENOBUFS,
|
|
29
|
+
ENOMEM,
|
|
30
|
+
ENOTCONN,
|
|
31
|
+
ENOTSUP,
|
|
32
|
+
EPERM,
|
|
33
|
+
EWOULDBLOCK,
|
|
34
|
+
} from 'node:constants';
|
|
35
35
|
|
|
36
36
|
let stateCnt = 0;
|
|
37
37
|
export const SOCKET_STATE_INIT = ++stateCnt;
|
|
@@ -44,157 +44,164 @@ export const SOCKET_STATE_CONNECTION = ++stateCnt;
|
|
|
44
44
|
export const SOCKET_STATE_CLOSED = ++stateCnt;
|
|
45
45
|
|
|
46
46
|
const dnsLookupOptions = {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
verbatim: true,
|
|
48
|
+
all: true,
|
|
49
|
+
hints: V4MAPPED | ALL,
|
|
50
50
|
};
|
|
51
51
|
|
|
52
52
|
export function noLookup(ip, _opts, cb) {
|
|
53
|
-
|
|
53
|
+
cb(null, ip);
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
export function socketResolveAddress(name) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
parsedUrl =
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
(
|
|
88
|
-
|
|
89
|
-
[
|
|
90
|
-
{
|
|
91
|
-
tag: "ipv" + family,
|
|
92
|
-
val: (family === 4 ? ipv4ToTuple : ipv6ToTuple)(address),
|
|
93
|
-
},
|
|
94
|
-
];
|
|
95
|
-
});
|
|
96
|
-
},
|
|
97
|
-
(err) => {
|
|
98
|
-
switch (err.code) {
|
|
99
|
-
// TODO: verify these more carefully
|
|
100
|
-
case NODATA:
|
|
101
|
-
case BADFAMILY:
|
|
102
|
-
case NONAME:
|
|
103
|
-
case NOTFOUND:
|
|
104
|
-
throw "name-unresolvable";
|
|
105
|
-
case TIMEOUT:
|
|
106
|
-
case REFUSED:
|
|
107
|
-
case CONNREFUSED:
|
|
108
|
-
case SERVFAIL:
|
|
109
|
-
case NOMEM:
|
|
110
|
-
case CANCELLED:
|
|
111
|
-
throw "temporary-resolver-failure";
|
|
112
|
-
default:
|
|
113
|
-
throw "permanent-resolver-failure";
|
|
114
|
-
}
|
|
57
|
+
const isIpNum = isIP(
|
|
58
|
+
name[0] === '[' && name[name.length - 1] === ']'
|
|
59
|
+
? name.slice(1, -1)
|
|
60
|
+
: name
|
|
61
|
+
);
|
|
62
|
+
if (isIpNum > 0) {
|
|
63
|
+
return Promise.resolve([
|
|
64
|
+
{
|
|
65
|
+
tag: 'ipv' + isIpNum,
|
|
66
|
+
val: (isIpNum === 4 ? ipv4ToTuple : ipv6ToTuple)(name),
|
|
67
|
+
},
|
|
68
|
+
]);
|
|
69
|
+
}
|
|
70
|
+
// verify it is a valid domain name using the URL parser
|
|
71
|
+
let parsedUrl = null;
|
|
72
|
+
try {
|
|
73
|
+
parsedUrl = new URL(`https://${name}`);
|
|
74
|
+
if (
|
|
75
|
+
parsedUrl.port.length ||
|
|
76
|
+
parsedUrl.username.length ||
|
|
77
|
+
parsedUrl.password.length ||
|
|
78
|
+
parsedUrl.pathname !== '/' ||
|
|
79
|
+
parsedUrl.search.length ||
|
|
80
|
+
parsedUrl.hash.length
|
|
81
|
+
) {
|
|
82
|
+
parsedUrl = null;
|
|
83
|
+
}
|
|
84
|
+
} catch {
|
|
85
|
+
// empty
|
|
86
|
+
}
|
|
87
|
+
if (!parsedUrl) {
|
|
88
|
+
throw 'invalid-argument';
|
|
115
89
|
}
|
|
116
|
-
|
|
90
|
+
|
|
91
|
+
return lookup(name, dnsLookupOptions).then(
|
|
92
|
+
(addresses) => {
|
|
93
|
+
return addresses.map(({ address, family }) => {
|
|
94
|
+
[
|
|
95
|
+
{
|
|
96
|
+
tag: 'ipv' + family,
|
|
97
|
+
val: (family === 4 ? ipv4ToTuple : ipv6ToTuple)(
|
|
98
|
+
address
|
|
99
|
+
),
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
});
|
|
103
|
+
},
|
|
104
|
+
(err) => {
|
|
105
|
+
switch (err.code) {
|
|
106
|
+
// TODO: verify these more carefully
|
|
107
|
+
case NODATA:
|
|
108
|
+
case BADFAMILY:
|
|
109
|
+
case NONAME:
|
|
110
|
+
case NOTFOUND:
|
|
111
|
+
throw 'name-unresolvable';
|
|
112
|
+
case TIMEOUT:
|
|
113
|
+
case REFUSED:
|
|
114
|
+
case CONNREFUSED:
|
|
115
|
+
case SERVFAIL:
|
|
116
|
+
case NOMEM:
|
|
117
|
+
case CANCELLED:
|
|
118
|
+
throw 'temporary-resolver-failure';
|
|
119
|
+
default:
|
|
120
|
+
throw 'permanent-resolver-failure';
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
);
|
|
117
124
|
}
|
|
118
125
|
|
|
119
126
|
export function convertSocketError(err) {
|
|
120
|
-
|
|
121
|
-
case
|
|
122
|
-
case
|
|
123
|
-
case
|
|
124
|
-
|
|
125
|
-
case
|
|
126
|
-
case
|
|
127
|
-
|
|
128
|
-
case
|
|
129
|
-
|
|
130
|
-
case
|
|
131
|
-
|
|
132
|
-
case
|
|
133
|
-
case
|
|
134
|
-
|
|
135
|
-
case
|
|
136
|
-
|
|
137
|
-
case
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
case
|
|
141
|
-
|
|
142
|
-
case
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
case
|
|
146
|
-
|
|
147
|
-
case
|
|
148
|
-
|
|
149
|
-
case
|
|
150
|
-
|
|
127
|
+
switch (err?.code) {
|
|
128
|
+
case 'EBADF':
|
|
129
|
+
case 'ENOTCONN':
|
|
130
|
+
case 'ERR_SOCKET_DGRAM_NOT_CONNECTED':
|
|
131
|
+
return 'invalid-state';
|
|
132
|
+
case 'EACCES':
|
|
133
|
+
case 'EPERM':
|
|
134
|
+
return 'access-denied';
|
|
135
|
+
case 'ENOTSUP':
|
|
136
|
+
return 'not-supported';
|
|
137
|
+
case 'EINVAL':
|
|
138
|
+
return 'invalid-argument';
|
|
139
|
+
case 'ENOMEM':
|
|
140
|
+
case 'ENOBUFS':
|
|
141
|
+
return 'out-of-memory';
|
|
142
|
+
case 'EALREADY':
|
|
143
|
+
return 'concurrency-conflict';
|
|
144
|
+
case 'EWOULDBLOCK':
|
|
145
|
+
return 'would-block';
|
|
146
|
+
// TODO: return "new-socket-limit";
|
|
147
|
+
case 'EADDRNOTAVAIL':
|
|
148
|
+
return 'address-not-bindable';
|
|
149
|
+
case 'EADDRINUSE':
|
|
150
|
+
return 'address-in-use';
|
|
151
|
+
// TODO: return "remote-unreachable";
|
|
152
|
+
case 'ECONNREFUSED':
|
|
153
|
+
return 'connection-refused';
|
|
154
|
+
case 'ECONNRESET':
|
|
155
|
+
return 'connection-reset';
|
|
156
|
+
case 'ECONNABORTED':
|
|
157
|
+
return 'connection-aborted';
|
|
151
158
|
default:
|
|
152
|
-
|
|
153
|
-
|
|
159
|
+
return 'unknown';
|
|
160
|
+
}
|
|
154
161
|
}
|
|
155
162
|
|
|
156
163
|
export function convertSocketErrorCode(code) {
|
|
157
|
-
|
|
164
|
+
switch (code) {
|
|
158
165
|
case 4053: // windows
|
|
159
166
|
case 4083:
|
|
160
167
|
case ENOTCONN:
|
|
161
168
|
case EBADF:
|
|
162
|
-
|
|
169
|
+
return 'invalid-state';
|
|
163
170
|
case EACCES:
|
|
164
171
|
case EPERM:
|
|
165
|
-
|
|
172
|
+
return 'access-denied';
|
|
166
173
|
case ENOTSUP:
|
|
167
|
-
|
|
174
|
+
return 'not-supported';
|
|
168
175
|
case EINVAL:
|
|
169
|
-
|
|
176
|
+
return 'invalid-argument';
|
|
170
177
|
case ENOMEM:
|
|
171
178
|
case ENOBUFS:
|
|
172
|
-
|
|
179
|
+
return 'out-of-memory';
|
|
173
180
|
case EALREADY:
|
|
174
|
-
|
|
181
|
+
return 'concurrency-conflict';
|
|
175
182
|
case EWOULDBLOCK:
|
|
176
|
-
|
|
177
|
-
|
|
183
|
+
return 'would-block';
|
|
184
|
+
// TODO: return "new-socket-limit";
|
|
178
185
|
case 4090: // windows
|
|
179
186
|
case EADDRNOTAVAIL:
|
|
180
|
-
|
|
187
|
+
return 'address-not-bindable';
|
|
181
188
|
case 4091: // windows
|
|
182
189
|
case EADDRINUSE:
|
|
183
|
-
|
|
184
|
-
|
|
190
|
+
return 'address-in-use';
|
|
191
|
+
// TODO: return "remote-unreachable";
|
|
185
192
|
case ECONNREFUSED:
|
|
186
|
-
|
|
193
|
+
return 'connection-refused';
|
|
187
194
|
case ECONNRESET:
|
|
188
|
-
|
|
195
|
+
return 'connection-reset';
|
|
189
196
|
case ECONNABORTED:
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
197
|
+
return 'connection-aborted';
|
|
198
|
+
// TODO: return "datagram-too-large";
|
|
199
|
+
// TODO: return "name-unresolvable";
|
|
200
|
+
// TODO: return "temporary-resolver-failure";
|
|
194
201
|
default:
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
202
|
+
// process._rawDebug('unknown error code', code);
|
|
203
|
+
return 'unknown';
|
|
204
|
+
}
|
|
198
205
|
}
|
|
199
206
|
|
|
200
207
|
/**
|
|
@@ -205,17 +212,17 @@ export function convertSocketErrorCode(code) {
|
|
|
205
212
|
*/
|
|
206
213
|
|
|
207
214
|
export function tupleToIPv6(arr) {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
215
|
+
if (arr.length !== 8) {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
return arr.map((segment) => segment.toString(16)).join(':');
|
|
212
219
|
}
|
|
213
220
|
|
|
214
221
|
export function tupleToIpv4(arr) {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
222
|
+
if (arr.length !== 4) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
return arr.map((segment) => segment.toString(10)).join('.');
|
|
219
226
|
}
|
|
220
227
|
|
|
221
228
|
/**
|
|
@@ -223,12 +230,12 @@ export function tupleToIpv4(arr) {
|
|
|
223
230
|
* @returns {boolean}
|
|
224
231
|
*/
|
|
225
232
|
export function isMulticastIpAddress(ipSocketAddress) {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
233
|
+
return (
|
|
234
|
+
(ipSocketAddress.tag === 'ipv4' &&
|
|
235
|
+
ipSocketAddress.val.address[0] === 0xe0) ||
|
|
236
|
+
(ipSocketAddress.tag === 'ipv6' &&
|
|
237
|
+
ipSocketAddress.val.address[0] === 0xff00)
|
|
238
|
+
);
|
|
232
239
|
}
|
|
233
240
|
|
|
234
241
|
/**
|
|
@@ -236,9 +243,10 @@ export function isMulticastIpAddress(ipSocketAddress) {
|
|
|
236
243
|
* @returns {boolean}
|
|
237
244
|
*/
|
|
238
245
|
export function isIPv4MappedAddress(ipSocketAddress) {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
246
|
+
return (
|
|
247
|
+
ipSocketAddress.tag === 'ipv6' &&
|
|
248
|
+
ipSocketAddress.val.address[5] === 0xffff
|
|
249
|
+
);
|
|
242
250
|
}
|
|
243
251
|
|
|
244
252
|
/**
|
|
@@ -246,10 +254,10 @@ export function isIPv4MappedAddress(ipSocketAddress) {
|
|
|
246
254
|
* @returns {boolean}
|
|
247
255
|
*/
|
|
248
256
|
export function isUnicastIpAddress(ipSocketAddress) {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
257
|
+
return (
|
|
258
|
+
!isMulticastIpAddress(ipSocketAddress) &&
|
|
259
|
+
!isBroadcastIpAddress(ipSocketAddress)
|
|
260
|
+
);
|
|
253
261
|
}
|
|
254
262
|
|
|
255
263
|
/**
|
|
@@ -257,25 +265,26 @@ export function isUnicastIpAddress(ipSocketAddress) {
|
|
|
257
265
|
* @returns {boolean}
|
|
258
266
|
*/
|
|
259
267
|
export function isWildcardAddress(ipSocketAddress) {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
268
|
+
const { address } = ipSocketAddress.val;
|
|
269
|
+
if (ipSocketAddress.tag === 'ipv4') {
|
|
270
|
+
return (
|
|
271
|
+
address[0] === 0 &&
|
|
272
|
+
address[1] === 0 &&
|
|
273
|
+
address[2] === 0 &&
|
|
274
|
+
address[3] === 0
|
|
275
|
+
);
|
|
276
|
+
} else {
|
|
277
|
+
return (
|
|
278
|
+
address[0] === 0 &&
|
|
279
|
+
address[1] === 0 &&
|
|
280
|
+
address[2] === 0 &&
|
|
281
|
+
address[3] === 0 &&
|
|
282
|
+
address[4] === 0 &&
|
|
283
|
+
address[5] === 0 &&
|
|
284
|
+
address[6] === 0 &&
|
|
285
|
+
address[7] === 0
|
|
286
|
+
);
|
|
287
|
+
}
|
|
279
288
|
}
|
|
280
289
|
|
|
281
290
|
/**
|
|
@@ -283,14 +292,14 @@ export function isWildcardAddress(ipSocketAddress) {
|
|
|
283
292
|
* @returns {boolean}
|
|
284
293
|
*/
|
|
285
294
|
export function isBroadcastIpAddress(ipSocketAddress) {
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
295
|
+
const { address } = ipSocketAddress.val;
|
|
296
|
+
return (
|
|
297
|
+
ipSocketAddress.tag === 'ipv4' &&
|
|
298
|
+
address[0] === 0xff &&
|
|
299
|
+
address[1] === 0xff &&
|
|
300
|
+
address[2] === 0xff &&
|
|
301
|
+
address[3] === 0xff
|
|
302
|
+
);
|
|
294
303
|
}
|
|
295
304
|
|
|
296
305
|
/**
|
|
@@ -300,23 +309,25 @@ export function isBroadcastIpAddress(ipSocketAddress) {
|
|
|
300
309
|
* @returns {string}
|
|
301
310
|
*/
|
|
302
311
|
export function serializeIpAddress(addr) {
|
|
303
|
-
|
|
304
|
-
|
|
312
|
+
if (addr.tag === 'ipv4') {
|
|
313
|
+
return tupleToIpv4(addr.val.address);
|
|
314
|
+
}
|
|
315
|
+
return tupleToIPv6(addr.val.address);
|
|
305
316
|
}
|
|
306
317
|
|
|
307
318
|
export function ipv6ToTuple(ipv6) {
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
319
|
+
const [lhs, rhs = ''] = ipv6.includes('::') ? ipv6.split('::') : [ipv6];
|
|
320
|
+
const lhsParts = lhs === '' ? [] : lhs.split(':');
|
|
321
|
+
const rhsParts = rhs === '' ? [] : rhs.split(':');
|
|
322
|
+
return [
|
|
323
|
+
...lhsParts,
|
|
324
|
+
...Array(8 - lhsParts.length - rhsParts.length).fill(0),
|
|
325
|
+
...rhsParts,
|
|
326
|
+
].map((segment) => parseInt(segment, 16));
|
|
316
327
|
}
|
|
317
328
|
|
|
318
329
|
export function ipv4ToTuple(ipv4) {
|
|
319
|
-
|
|
330
|
+
return ipv4.split('.').map((segment) => parseInt(segment, 10));
|
|
320
331
|
}
|
|
321
332
|
|
|
322
333
|
/**
|
|
@@ -326,46 +337,49 @@ export function ipv4ToTuple(ipv4) {
|
|
|
326
337
|
* @returns {IpSocketAddress}
|
|
327
338
|
*/
|
|
328
339
|
export function ipSocketAddress(family, addr, port) {
|
|
329
|
-
|
|
340
|
+
if (family === 'ipv4') {
|
|
341
|
+
return {
|
|
342
|
+
tag: 'ipv4',
|
|
343
|
+
val: {
|
|
344
|
+
port,
|
|
345
|
+
address: ipv4ToTuple(addr),
|
|
346
|
+
},
|
|
347
|
+
};
|
|
348
|
+
}
|
|
330
349
|
return {
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
350
|
+
tag: 'ipv6',
|
|
351
|
+
val: {
|
|
352
|
+
port,
|
|
353
|
+
flowInfo: 0,
|
|
354
|
+
address: ipv6ToTuple(addr),
|
|
355
|
+
scopeId: 0,
|
|
356
|
+
},
|
|
336
357
|
};
|
|
337
|
-
return {
|
|
338
|
-
tag: "ipv6",
|
|
339
|
-
val: {
|
|
340
|
-
port,
|
|
341
|
-
flowInfo: 0,
|
|
342
|
-
address: ipv6ToTuple(addr),
|
|
343
|
-
scopeId: 0
|
|
344
|
-
}
|
|
345
|
-
};
|
|
346
358
|
}
|
|
347
359
|
|
|
348
360
|
let _recvBufferSize, _sendBufferSize;
|
|
349
|
-
async function getDefaultBufferSizes
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
361
|
+
async function getDefaultBufferSizes() {
|
|
362
|
+
var s = new Socket({ type: 'udp4' });
|
|
363
|
+
s.bind(0);
|
|
364
|
+
await new Promise((resolve, reject) => {
|
|
365
|
+
s.once('error', reject);
|
|
366
|
+
s.once('listening', resolve);
|
|
367
|
+
});
|
|
368
|
+
_recvBufferSize = BigInt(s.getRecvBufferSize());
|
|
369
|
+
_sendBufferSize = BigInt(s.getSendBufferSize());
|
|
370
|
+
s.close();
|
|
359
371
|
}
|
|
360
372
|
|
|
361
|
-
export async function getDefaultSendBufferSize
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
373
|
+
export async function getDefaultSendBufferSize() {
|
|
374
|
+
if (!_sendBufferSize) {
|
|
375
|
+
await getDefaultBufferSizes();
|
|
376
|
+
}
|
|
377
|
+
return _sendBufferSize;
|
|
365
378
|
}
|
|
366
379
|
|
|
367
|
-
export async function getDefaultReceiveBufferSize
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
380
|
+
export async function getDefaultReceiveBufferSize() {
|
|
381
|
+
if (!_recvBufferSize) {
|
|
382
|
+
await getDefaultBufferSizes();
|
|
383
|
+
}
|
|
384
|
+
return _recvBufferSize;
|
|
371
385
|
}
|