@bytecodealliance/preview2-shim 0.17.1 → 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.
- package/lib/browser/cli.js +91 -94
- package/lib/browser/clocks.js +30 -29
- package/lib/browser/filesystem.js +298 -251
- 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 +127 -0
- package/lib/io/calls.js +7 -5
- package/lib/io/worker-http.js +175 -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 +276 -262
- package/lib/io/worker-thread.js +946 -815
- package/lib/nodejs/cli.js +64 -63
- package/lib/nodejs/clocks.js +51 -45
- package/lib/nodejs/filesystem.js +788 -654
- package/lib/nodejs/http.js +693 -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 +9 -5
- package/types/cli.d.ts +11 -23
- package/types/clocks.d.ts +2 -5
- package/types/filesystem.d.ts +2 -5
- package/types/http.d.ts +3 -7
- package/types/index.d.ts +6 -15
- package/types/instantiation.d.ts +112 -0
- package/types/interfaces/wasi-cli-environment.d.ts +21 -22
- package/types/interfaces/wasi-cli-exit.d.ts +5 -6
- package/types/interfaces/wasi-cli-run.d.ts +5 -6
- package/types/interfaces/wasi-cli-stderr.d.ts +3 -5
- package/types/interfaces/wasi-cli-stdin.d.ts +3 -5
- package/types/interfaces/wasi-cli-stdout.d.ts +3 -5
- package/types/interfaces/wasi-cli-terminal-input.d.ts +5 -3
- package/types/interfaces/wasi-cli-terminal-output.d.ts +5 -3
- package/types/interfaces/wasi-cli-terminal-stderr.d.ts +7 -9
- package/types/interfaces/wasi-cli-terminal-stdin.d.ts +7 -9
- package/types/interfaces/wasi-cli-terminal-stdout.d.ts +7 -9
- package/types/interfaces/wasi-clocks-monotonic-clock.d.ts +24 -26
- package/types/interfaces/wasi-clocks-wall-clock.d.ts +23 -24
- package/types/interfaces/wasi-filesystem-preopens.d.ts +6 -8
- package/types/interfaces/wasi-filesystem-types.d.ts +34 -33
- package/types/interfaces/wasi-http-incoming-handler.d.ts +16 -19
- package/types/interfaces/wasi-http-outgoing-handler.d.ts +18 -23
- package/types/interfaces/wasi-http-types.d.ts +49 -38
- package/types/interfaces/wasi-io-error.d.ts +5 -3
- package/types/interfaces/wasi-io-poll.d.ts +27 -25
- package/types/interfaces/wasi-io-streams.d.ts +24 -21
- package/types/interfaces/wasi-random-insecure-seed.d.ts +21 -22
- package/types/interfaces/wasi-random-insecure.d.ts +19 -20
- package/types/interfaces/wasi-random-random.d.ts +23 -24
- package/types/interfaces/wasi-sockets-instance-network.d.ts +6 -8
- package/types/interfaces/wasi-sockets-ip-name-lookup.d.ts +32 -34
- package/types/interfaces/wasi-sockets-network.d.ts +5 -3
- package/types/interfaces/wasi-sockets-tcp-create-socket.d.ts +28 -33
- package/types/interfaces/wasi-sockets-tcp.d.ts +17 -23
- package/types/interfaces/wasi-sockets-udp-create-socket.d.ts +28 -33
- package/types/interfaces/wasi-sockets-udp.d.ts +20 -17
- package/types/io.d.ts +3 -7
- package/types/random.d.ts +3 -7
- package/types/sockets.d.ts +7 -15
- package/types/wasi-cli-command.d.ts +29 -29
- package/types/wasi-http-proxy.d.ts +13 -13
|
@@ -1,35 +1,35 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
} from
|
|
11
|
-
import process from
|
|
12
|
-
const { TCP, constants: TCPConstants } = process.binding(
|
|
2
|
+
createFuture,
|
|
3
|
+
createReadableStream,
|
|
4
|
+
createReadableStreamPollState,
|
|
5
|
+
createWritableStream,
|
|
6
|
+
futureDispose,
|
|
7
|
+
futureTakeValue,
|
|
8
|
+
pollStateReady,
|
|
9
|
+
verifyPollsDroppedForDrop,
|
|
10
|
+
} from './worker-thread.js';
|
|
11
|
+
import process from 'node:process';
|
|
12
|
+
const { TCP, constants: TCPConstants } = process.binding('tcp_wrap');
|
|
13
13
|
import {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
} from
|
|
32
|
-
import { Socket, Server } from
|
|
14
|
+
convertSocketError,
|
|
15
|
+
convertSocketErrorCode,
|
|
16
|
+
ipSocketAddress,
|
|
17
|
+
isIPv4MappedAddress,
|
|
18
|
+
isMulticastIpAddress,
|
|
19
|
+
isUnicastIpAddress,
|
|
20
|
+
isWildcardAddress,
|
|
21
|
+
noLookup,
|
|
22
|
+
serializeIpAddress,
|
|
23
|
+
SOCKET_STATE_BIND,
|
|
24
|
+
SOCKET_STATE_BOUND,
|
|
25
|
+
SOCKET_STATE_CLOSED,
|
|
26
|
+
SOCKET_STATE_CONNECT,
|
|
27
|
+
SOCKET_STATE_CONNECTION,
|
|
28
|
+
SOCKET_STATE_INIT,
|
|
29
|
+
SOCKET_STATE_LISTEN,
|
|
30
|
+
SOCKET_STATE_LISTENER,
|
|
31
|
+
} from './worker-sockets.js';
|
|
32
|
+
import { Socket, Server } from 'node:net';
|
|
33
33
|
|
|
34
34
|
const win = process.platform === 'win32';
|
|
35
35
|
|
|
@@ -66,226 +66,278 @@ let tcpSocketCnt = 0;
|
|
|
66
66
|
* @param {IpAddressFamily} addressFamily
|
|
67
67
|
*/
|
|
68
68
|
export function createTcpSocket() {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
69
|
+
const handle = new TCP(TCPConstants.SOCKET);
|
|
70
|
+
tcpSockets.set(++tcpSocketCnt, {
|
|
71
|
+
state: SOCKET_STATE_INIT,
|
|
72
|
+
future: null,
|
|
73
|
+
tcpSocket: null,
|
|
74
|
+
listenBacklogSize: 128,
|
|
75
|
+
handle,
|
|
76
|
+
pendingAccepts: [],
|
|
77
|
+
pollState: {
|
|
78
|
+
ready: true,
|
|
79
|
+
listener: null,
|
|
80
|
+
polls: [],
|
|
81
|
+
parentStream: null,
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
return tcpSocketCnt;
|
|
80
85
|
}
|
|
81
86
|
|
|
82
87
|
export function socketTcpFinish(id, fromState, toState) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
88
|
+
const socket = tcpSockets.get(id);
|
|
89
|
+
if (socket.state !== fromState) {
|
|
90
|
+
throw 'not-in-progress';
|
|
91
|
+
}
|
|
92
|
+
if (!socket.pollState.ready) {
|
|
93
|
+
throw 'would-block';
|
|
94
|
+
}
|
|
95
|
+
const { tag, val } = futureTakeValue(socket.future).val;
|
|
96
|
+
futureDispose(socket.future, false);
|
|
97
|
+
socket.future = null;
|
|
98
|
+
if (tag === 'err') {
|
|
99
|
+
socket.state = SOCKET_STATE_CLOSED;
|
|
100
|
+
throw val;
|
|
101
|
+
} else {
|
|
102
|
+
socket.state = toState;
|
|
103
|
+
// for the listener, we must immediately transition back to unresolved
|
|
104
|
+
if (toState === SOCKET_STATE_LISTENER) {
|
|
105
|
+
socket.pollState.ready = false;
|
|
106
|
+
}
|
|
107
|
+
return val;
|
|
108
|
+
}
|
|
98
109
|
}
|
|
99
110
|
|
|
100
111
|
export function socketTcpBindStart(id, localAddress, family) {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
112
|
+
const socket = tcpSockets.get(id);
|
|
113
|
+
if (socket.state !== SOCKET_STATE_INIT) {
|
|
114
|
+
throw 'invalid-state';
|
|
115
|
+
}
|
|
116
|
+
if (
|
|
117
|
+
family !== localAddress.tag ||
|
|
118
|
+
!isUnicastIpAddress(localAddress) ||
|
|
119
|
+
isIPv4MappedAddress(localAddress)
|
|
120
|
+
) {
|
|
121
|
+
throw 'invalid-argument';
|
|
122
|
+
}
|
|
123
|
+
socket.state = SOCKET_STATE_BIND;
|
|
124
|
+
const { handle } = socket;
|
|
125
|
+
socket.future = createFuture(
|
|
126
|
+
(async () => {
|
|
127
|
+
const address = serializeIpAddress(localAddress);
|
|
128
|
+
const port = localAddress.val.port;
|
|
129
|
+
const code =
|
|
130
|
+
localAddress.tag === 'ipv6'
|
|
131
|
+
? handle.bind6(address, port, TCPConstants.UV_TCP_IPV6ONLY)
|
|
132
|
+
: handle.bind(address, port);
|
|
133
|
+
if (code !== 0) {
|
|
134
|
+
throw convertSocketErrorCode(-code);
|
|
135
|
+
}
|
|
136
|
+
// This is a Node.js / libuv quirk to force the bind error to be thrown
|
|
137
|
+
// (specifically address-in-use).
|
|
138
|
+
{
|
|
139
|
+
const out = {};
|
|
140
|
+
const code = handle.getsockname(out);
|
|
141
|
+
if (code !== 0) {
|
|
142
|
+
throw convertSocketErrorCode(-code);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
})(),
|
|
146
|
+
socket.pollState
|
|
147
|
+
);
|
|
130
148
|
}
|
|
131
149
|
|
|
132
150
|
export function socketTcpConnectStart(id, remoteAddress, family) {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
151
|
+
const socket = tcpSockets.get(id);
|
|
152
|
+
if (
|
|
153
|
+
socket.state !== SOCKET_STATE_INIT &&
|
|
154
|
+
socket.state !== SOCKET_STATE_BOUND
|
|
155
|
+
) {
|
|
156
|
+
throw 'invalid-state';
|
|
157
|
+
}
|
|
158
|
+
if (
|
|
159
|
+
isWildcardAddress(remoteAddress) ||
|
|
160
|
+
family !== remoteAddress.tag ||
|
|
161
|
+
!isUnicastIpAddress(remoteAddress) ||
|
|
162
|
+
isMulticastIpAddress(remoteAddress) ||
|
|
163
|
+
remoteAddress.val.port === 0 ||
|
|
164
|
+
isIPv4MappedAddress(remoteAddress)
|
|
165
|
+
) {
|
|
166
|
+
throw 'invalid-argument';
|
|
167
|
+
}
|
|
168
|
+
socket.state = SOCKET_STATE_CONNECT;
|
|
169
|
+
socket.future = createFuture(
|
|
170
|
+
new Promise((resolve, reject) => {
|
|
171
|
+
const tcpSocket = (socket.tcpSocket = new Socket({
|
|
172
|
+
handle: socket.handle,
|
|
173
|
+
pauseOnCreate: true,
|
|
174
|
+
allowHalfOpen: true,
|
|
175
|
+
}));
|
|
176
|
+
function handleErr(err) {
|
|
177
|
+
tcpSocket.off('connect', handleConnect);
|
|
178
|
+
reject(convertSocketError(err));
|
|
179
|
+
}
|
|
180
|
+
function handleConnect() {
|
|
181
|
+
tcpSocket.off('error', handleErr);
|
|
182
|
+
resolve([
|
|
183
|
+
createReadableStream(tcpSocket),
|
|
184
|
+
createWritableStream(tcpSocket),
|
|
185
|
+
]);
|
|
186
|
+
}
|
|
187
|
+
tcpSocket.once('connect', handleConnect);
|
|
188
|
+
tcpSocket.once('error', handleErr);
|
|
189
|
+
tcpSocket.connect({
|
|
190
|
+
port: remoteAddress.val.port,
|
|
191
|
+
host: serializeIpAddress(remoteAddress),
|
|
192
|
+
lookup: noLookup,
|
|
193
|
+
});
|
|
194
|
+
}),
|
|
195
|
+
socket.pollState
|
|
196
|
+
);
|
|
175
197
|
}
|
|
176
198
|
|
|
177
199
|
export function socketTcpListenStart(id) {
|
|
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
|
-
|
|
200
|
+
const socket = tcpSockets.get(id);
|
|
201
|
+
if (socket.state !== SOCKET_STATE_BOUND) {
|
|
202
|
+
throw 'invalid-state';
|
|
203
|
+
}
|
|
204
|
+
const { handle } = socket;
|
|
205
|
+
socket.state = SOCKET_STATE_LISTEN;
|
|
206
|
+
socket.future = createFuture(
|
|
207
|
+
new Promise((resolve, reject) => {
|
|
208
|
+
const server = new Server({
|
|
209
|
+
pauseOnConnect: true,
|
|
210
|
+
allowHalfOpen: true,
|
|
211
|
+
});
|
|
212
|
+
function handleErr(err) {
|
|
213
|
+
server.off('listening', handleListen);
|
|
214
|
+
reject(convertSocketError(err));
|
|
215
|
+
}
|
|
216
|
+
function handleListen() {
|
|
217
|
+
server.off('error', handleErr);
|
|
218
|
+
server.on('connection', (tcpSocket) => {
|
|
219
|
+
pollStateReady(socket.pollState);
|
|
220
|
+
const pollState = createReadableStreamPollState(tcpSocket);
|
|
221
|
+
socket.pendingAccepts.push({
|
|
222
|
+
tcpSocket,
|
|
223
|
+
err: null,
|
|
224
|
+
pollState,
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
server.on('error', (err) => {
|
|
228
|
+
pollStateReady(socket.pollState);
|
|
229
|
+
socket.pendingAccepts.push({
|
|
230
|
+
tcpSocket: null,
|
|
231
|
+
err,
|
|
232
|
+
pollState: null,
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
resolve();
|
|
236
|
+
}
|
|
237
|
+
server.once('listening', handleListen);
|
|
238
|
+
server.once('error', handleErr);
|
|
239
|
+
server.listen(handle, socket.listenBacklogSize);
|
|
240
|
+
}),
|
|
241
|
+
socket.pollState
|
|
242
|
+
);
|
|
208
243
|
}
|
|
209
244
|
|
|
210
245
|
export function socketTcpAccept(id) {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
246
|
+
const socket = tcpSockets.get(id);
|
|
247
|
+
if (socket.state !== SOCKET_STATE_LISTENER) {
|
|
248
|
+
throw 'invalid-state';
|
|
249
|
+
}
|
|
250
|
+
if (socket.pendingAccepts.length === 0) {
|
|
251
|
+
throw 'would-block';
|
|
252
|
+
}
|
|
253
|
+
const accept = socket.pendingAccepts.shift();
|
|
254
|
+
if (accept.err) {
|
|
255
|
+
socket.state = SOCKET_STATE_CLOSED;
|
|
256
|
+
throw convertSocketError(accept.err);
|
|
257
|
+
}
|
|
258
|
+
if (socket.pendingAccepts.length === 0) {
|
|
259
|
+
socket.pollState.ready = false;
|
|
260
|
+
}
|
|
261
|
+
tcpSockets.set(++tcpSocketCnt, {
|
|
262
|
+
state: SOCKET_STATE_CONNECTION,
|
|
263
|
+
future: null,
|
|
264
|
+
tcpSocket: accept.tcpSocket,
|
|
265
|
+
listenBacklogSize: 128,
|
|
266
|
+
handle: accept.tcpSocket._handle,
|
|
267
|
+
pendingAccepts: [],
|
|
268
|
+
pollState: accept.pollState,
|
|
269
|
+
});
|
|
270
|
+
return [
|
|
271
|
+
tcpSocketCnt,
|
|
272
|
+
createReadableStream(accept.tcpSocket, accept.pollState),
|
|
273
|
+
createWritableStream(accept.tcpSocket),
|
|
274
|
+
];
|
|
234
275
|
}
|
|
235
276
|
|
|
236
277
|
export function socketTcpSetListenBacklogSize(id, backlogSize) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
278
|
+
const socket = tcpSockets.get(id);
|
|
279
|
+
if (
|
|
280
|
+
socket.state === SOCKET_STATE_LISTEN ||
|
|
281
|
+
socket.state === SOCKET_STATE_LISTENER
|
|
282
|
+
) {
|
|
283
|
+
throw 'not-supported';
|
|
284
|
+
}
|
|
285
|
+
if (
|
|
286
|
+
socket.state !== SOCKET_STATE_INIT &&
|
|
287
|
+
socket.state !== SOCKET_STATE_BIND &&
|
|
288
|
+
socket.state !== SOCKET_STATE_BOUND
|
|
289
|
+
) {
|
|
290
|
+
throw 'invalid-state';
|
|
291
|
+
}
|
|
292
|
+
socket.listenBacklogSize = Number(backlogSize);
|
|
250
293
|
}
|
|
251
294
|
|
|
252
295
|
export function socketTcpGetLocalAddress(id) {
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
296
|
+
const { handle } = tcpSockets.get(id);
|
|
297
|
+
const out = {};
|
|
298
|
+
const code = handle.getsockname(out);
|
|
299
|
+
if (code !== 0) {
|
|
300
|
+
throw convertSocketErrorCode(-code);
|
|
301
|
+
}
|
|
302
|
+
return ipSocketAddress(out.family.toLowerCase(), out.address, out.port);
|
|
258
303
|
}
|
|
259
304
|
|
|
260
305
|
export function socketTcpGetRemoteAddress(id) {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
306
|
+
const { handle } = tcpSockets.get(id);
|
|
307
|
+
const out = {};
|
|
308
|
+
const code = handle.getpeername(out);
|
|
309
|
+
if (code !== 0) {
|
|
310
|
+
throw convertSocketErrorCode(-code);
|
|
311
|
+
}
|
|
312
|
+
return ipSocketAddress(out.family.toLowerCase(), out.address, out.port);
|
|
266
313
|
}
|
|
267
314
|
|
|
268
315
|
export function socketTcpShutdown(id, _shutdownType) {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
316
|
+
const socket = tcpSockets.get(id);
|
|
317
|
+
if (socket.state !== SOCKET_STATE_CONNECTION) {
|
|
318
|
+
throw 'invalid-state';
|
|
319
|
+
}
|
|
320
|
+
if (win && socket.tcpSocket.destroySoon) {
|
|
321
|
+
socket.tcpSocket.destroySoon();
|
|
322
|
+
} else {
|
|
323
|
+
socket.tcpSocket.destroy();
|
|
324
|
+
}
|
|
275
325
|
}
|
|
276
326
|
|
|
277
327
|
export function socketTcpSetKeepAlive(id, { keepAlive, keepAliveIdleTime }) {
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
328
|
+
const { handle } = tcpSockets.get(id);
|
|
329
|
+
const code = handle.setKeepAlive(
|
|
330
|
+
keepAlive,
|
|
331
|
+
Number(keepAliveIdleTime / 1_000_000_000n)
|
|
332
|
+
);
|
|
333
|
+
if (code !== 0) {
|
|
334
|
+
throw convertSocketErrorCode(-code);
|
|
335
|
+
}
|
|
284
336
|
}
|
|
285
337
|
|
|
286
338
|
export function socketTcpDispose(id) {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
339
|
+
const socket = tcpSockets.get(id);
|
|
340
|
+
verifyPollsDroppedForDrop(socket.pollState, 'tcp socket');
|
|
341
|
+
socket.handle.close();
|
|
342
|
+
tcpSockets.delete(id);
|
|
291
343
|
}
|