@limrun/api 0.60.0 → 0.61.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/CHANGELOG.md +27 -0
- package/destination-tunnel-dialer.d.mts +8 -0
- package/destination-tunnel-dialer.d.mts.map +1 -1
- package/destination-tunnel-dialer.d.ts +8 -0
- package/destination-tunnel-dialer.d.ts.map +1 -1
- package/destination-tunnel-dialer.js +6 -5
- package/destination-tunnel-dialer.js.map +1 -1
- package/destination-tunnel-dialer.mjs +5 -5
- package/destination-tunnel-dialer.mjs.map +1 -1
- package/internal/destination-tunnel-wire-reader.d.mts +2 -0
- package/internal/destination-tunnel-wire-reader.d.mts.map +1 -1
- package/internal/destination-tunnel-wire-reader.d.ts +2 -0
- package/internal/destination-tunnel-wire-reader.d.ts.map +1 -1
- package/internal/destination-tunnel-wire-reader.js +17 -0
- package/internal/destination-tunnel-wire-reader.js.map +1 -1
- package/internal/destination-tunnel-wire-reader.mjs +15 -0
- package/internal/destination-tunnel-wire-reader.mjs.map +1 -1
- package/package.json +1 -1
- package/src/destination-tunnel-dialer.ts +6 -5
- package/src/internal/destination-tunnel-wire-reader.ts +17 -0
- package/src/tunnel-connector.ts +129 -39
- package/src/version.ts +1 -1
- package/tunnel-connector.d.mts +20 -9
- package/tunnel-connector.d.mts.map +1 -1
- package/tunnel-connector.d.ts +20 -9
- package/tunnel-connector.d.ts.map +1 -1
- package/tunnel-connector.js +94 -27
- package/tunnel-connector.js.map +1 -1
- package/tunnel-connector.mjs +96 -29
- package/tunnel-connector.mjs.map +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
package/tunnel-connector.js
CHANGED
|
@@ -12,7 +12,7 @@ const destination_tunnel_dialer_1 = require("./destination-tunnel-dialer.js");
|
|
|
12
12
|
const destination_tunnel_1 = require("./destination-tunnel.js");
|
|
13
13
|
const tunnel_1 = require("./tunnel.js");
|
|
14
14
|
const version_1 = require("./version.js");
|
|
15
|
-
const CONTROL_PROTOCOL_VERSION =
|
|
15
|
+
const CONTROL_PROTOCOL_VERSION = 2;
|
|
16
16
|
const CONTROL_HANDSHAKE_TIMEOUT_MS = 15000;
|
|
17
17
|
const CONTROL_PING_INTERVAL_MS = 15000;
|
|
18
18
|
const CONTROL_DEAD_PEER_MS = 45000;
|
|
@@ -28,21 +28,23 @@ const MAX_REJECTION_REASON_CHARS = 200;
|
|
|
28
28
|
/** Every tunnel WebSocket counts as instance activity, so retries must end. */
|
|
29
29
|
const ATTACH_GIVE_UP_MS = 5 * 60000;
|
|
30
30
|
const TAKEN_OVER_MESSAGE = 'another connector for this tunnel took the instance over';
|
|
31
|
+
/** A token this close to its expiry is not dialed with; the hub refreshes it at half its life. */
|
|
32
|
+
const TOKEN_EXPIRY_MARGIN_MS = 5000;
|
|
33
|
+
/** How long before its key expires the connector starts warning, and how often. */
|
|
34
|
+
const KEY_WARNING_WINDOW_MS = 14 * 24 * 60 * 60000;
|
|
35
|
+
const KEY_WARNING_EVERY_MS = 24 * 60 * 60000;
|
|
31
36
|
/**
|
|
32
|
-
* Serve a persistent tunnel: hold
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
37
|
+
* Serve a persistent tunnel: hold it through one control WebSocket to the
|
|
38
|
+
* Limrun API and open a destination tunnel to every instance created with
|
|
39
|
+
* `spec.tunnel` set to its name, with a short-lived token the API hands out
|
|
40
|
+
* for each. Instance tunnels stay up while the control channel reconnects,
|
|
41
|
+
* so an API outage never becomes a tunnel outage; one that drops re-dials
|
|
42
|
+
* once the API sends a fresh token.
|
|
36
43
|
*/
|
|
37
44
|
function runTunnel(options) {
|
|
38
|
-
const selectors = (0, destination_tunnel_1.validateDestinationTunnelSelectors)(options.selectors);
|
|
39
|
-
const dialOptions = {
|
|
40
|
-
...(0, destination_tunnel_dialer_1.destinationTunnelDialOptions)({ selectors, ...(options.inspection ? { inspection: options.inspection } : {}) }, options.logLevel ?? 'warn'),
|
|
41
|
-
name: options.name,
|
|
42
|
-
};
|
|
43
45
|
// Reject a bad inspection config now rather than on every attach.
|
|
44
|
-
(0, destination_tunnel_1.normalizeDestinationTunnelInspection)(
|
|
45
|
-
const controlURL = (0, destination_tunnel_url_1.deriveTunnelConnectURL)(options.baseURL, options.organizationId, options.
|
|
46
|
+
(0, destination_tunnel_1.normalizeDestinationTunnelInspection)((0, destination_tunnel_dialer_1.destinationTunnelInspection)(options.inspection));
|
|
47
|
+
const controlURL = (0, destination_tunnel_url_1.deriveTunnelConnectURL)(options.baseURL, options.organizationId, options.tunnelId);
|
|
46
48
|
const client = {
|
|
47
49
|
hostname: options.hostname ?? os_1.default.hostname(),
|
|
48
50
|
version: options.clientVersion ?? version_1.VERSION,
|
|
@@ -58,6 +60,9 @@ function runTunnel(options) {
|
|
|
58
60
|
let replace = options.replace ?? false;
|
|
59
61
|
// When the last confirmed lease runs out; zero while on standby.
|
|
60
62
|
let leaseExpiresAt = 0;
|
|
63
|
+
// The tunnel's name, from the first active; instances set it in spec.tunnel.
|
|
64
|
+
let tunnelName;
|
|
65
|
+
let lastKeyWarning = 0;
|
|
61
66
|
let announcedSession;
|
|
62
67
|
let announcedHolder;
|
|
63
68
|
let resolveClosed;
|
|
@@ -106,13 +111,22 @@ function runTunnel(options) {
|
|
|
106
111
|
if (!shutdown())
|
|
107
112
|
return;
|
|
108
113
|
ws?.terminate();
|
|
109
|
-
rejectClosed(new Error(`tunnel ${options.
|
|
114
|
+
rejectClosed(new Error(`tunnel ${tunnelName ?? options.tunnelId}: ${detail}`));
|
|
110
115
|
};
|
|
111
|
-
const
|
|
112
|
-
|
|
116
|
+
const dialOptions = (attachment) => ({
|
|
117
|
+
...(0, destination_tunnel_dialer_1.destinationTunnelDialOptions)({ selectors: attachment.selectors, ...(options.inspection ? { inspection: options.inspection } : {}) }, options.logLevel ?? 'warn'),
|
|
118
|
+
...(tunnelName === undefined ? {} : { name: tunnelName }),
|
|
119
|
+
});
|
|
120
|
+
const tokenUsable = (attachment) => Date.now() < attachment.tokenExpiresAt - TOKEN_EXPIRY_MARGIN_MS;
|
|
121
|
+
// Tells the platform and the caller that the connector gave up on an instance.
|
|
122
|
+
const reportGivenUp = (instanceId, code, message) => {
|
|
113
123
|
send({ type: 'attachFailed', instanceId, code, message, terminal: true });
|
|
114
124
|
emit({ type: 'attachFailed', instanceId, code, message });
|
|
115
125
|
};
|
|
126
|
+
const giveUp = (instanceId, attachment, code, message) => {
|
|
127
|
+
forget(instanceId, attachment);
|
|
128
|
+
reportGivenUp(instanceId, code, message);
|
|
129
|
+
};
|
|
116
130
|
const scheduleAttachRetry = (instanceId, attachment, reason) => {
|
|
117
131
|
const delayMs = jittered(attachment.backoffMs);
|
|
118
132
|
const maxMs = attachment.lastTunnelId === undefined ? ATTACH_FIRST_MAX_BACKOFF_MS : ATTACH_MAX_BACKOFF_MS;
|
|
@@ -134,7 +148,8 @@ function runTunnel(options) {
|
|
|
134
148
|
const takenOver = async (attachment) => {
|
|
135
149
|
try {
|
|
136
150
|
const active = (await (0, destination_tunnel_management_1.getDestinationTunnelStatus)(attachment.url, attachment.token)).active;
|
|
137
|
-
return (active
|
|
151
|
+
return (active !== undefined &&
|
|
152
|
+
active.name === tunnelName &&
|
|
138
153
|
active.state !== 'stopping' &&
|
|
139
154
|
active.tunnelId !== attachment.lastTunnelId);
|
|
140
155
|
}
|
|
@@ -170,7 +185,7 @@ function runTunnel(options) {
|
|
|
170
185
|
retryAfterFailure(instanceId, attachment, 'already_active', 'the previous tunnel is still stopping');
|
|
171
186
|
return;
|
|
172
187
|
}
|
|
173
|
-
if (active.name !==
|
|
188
|
+
if (active.name !== tunnelName) {
|
|
174
189
|
giveUp(instanceId, attachment, 'instance_busy', 'the instance already has another tunnel');
|
|
175
190
|
return;
|
|
176
191
|
}
|
|
@@ -204,6 +219,12 @@ function runTunnel(options) {
|
|
|
204
219
|
retryAfterFailure(instanceId, attachment, 'not_holder', 'this connector does not hold the tunnel');
|
|
205
220
|
return;
|
|
206
221
|
}
|
|
222
|
+
// A token past its life is refused; the API sends a fresh one at half
|
|
223
|
+
// life, so this only waits while the control channel is down.
|
|
224
|
+
if (!tokenUsable(attachment)) {
|
|
225
|
+
retryAfterFailure(instanceId, attachment, 'token_expired', 'waiting for a fresh tunnel token');
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
207
228
|
let tunnel;
|
|
208
229
|
try {
|
|
209
230
|
if (attachment.lastTunnelId !== undefined && (await takenOver(attachment))) {
|
|
@@ -214,7 +235,7 @@ function runTunnel(options) {
|
|
|
214
235
|
}
|
|
215
236
|
if (attachment.done)
|
|
216
237
|
return;
|
|
217
|
-
tunnel = await (0, destination_tunnel_dialer_1.startDestinationTcpTunnel)((0, destination_tunnel_url_1.deriveDestinationTunnelURL)(attachment.url), attachment.token, dialOptions);
|
|
238
|
+
tunnel = await (0, destination_tunnel_dialer_1.startDestinationTcpTunnel)((0, destination_tunnel_url_1.deriveDestinationTunnelURL)(attachment.url), attachment.token, dialOptions(attachment));
|
|
218
239
|
}
|
|
219
240
|
catch (error) {
|
|
220
241
|
if (attachment.done)
|
|
@@ -268,17 +289,26 @@ function runTunnel(options) {
|
|
|
268
289
|
if (stopped)
|
|
269
290
|
return;
|
|
270
291
|
switch (message.type) {
|
|
271
|
-
case 'active':
|
|
292
|
+
case 'active': {
|
|
272
293
|
replace = false;
|
|
273
294
|
leaseExpiresAt = Date.now() + message.leaseSeconds * 1000;
|
|
274
295
|
controlBackoffMs = CONTROL_INITIAL_BACKOFF_MS;
|
|
275
296
|
sessionId = message.sessionId;
|
|
297
|
+
tunnelName = message.name;
|
|
276
298
|
announcedHolder = undefined;
|
|
277
299
|
if (announcedSession !== message.sessionId) {
|
|
278
300
|
announcedSession = message.sessionId;
|
|
279
|
-
emit({ type: 'active', sessionId: message.sessionId });
|
|
301
|
+
emit({ type: 'active', sessionId: message.sessionId, name: message.name });
|
|
302
|
+
}
|
|
303
|
+
const now = Date.now();
|
|
304
|
+
if (message.keyExpiresAt !== undefined &&
|
|
305
|
+
Date.parse(message.keyExpiresAt) - now < KEY_WARNING_WINDOW_MS &&
|
|
306
|
+
now - lastKeyWarning >= KEY_WARNING_EVERY_MS) {
|
|
307
|
+
lastKeyWarning = now;
|
|
308
|
+
emit({ type: 'keyExpiring', expiresAt: message.keyExpiresAt });
|
|
280
309
|
}
|
|
281
310
|
return;
|
|
311
|
+
}
|
|
282
312
|
case 'standby': {
|
|
283
313
|
leaseExpiresAt = 0;
|
|
284
314
|
controlBackoffMs = CONTROL_INITIAL_BACKOFF_MS;
|
|
@@ -291,20 +321,47 @@ function runTunnel(options) {
|
|
|
291
321
|
}
|
|
292
322
|
return;
|
|
293
323
|
}
|
|
324
|
+
case 'token': {
|
|
325
|
+
// A fresh token at half its life, or after a resume. An instance this
|
|
326
|
+
// connector gave up on stays given up.
|
|
327
|
+
const attachment = instances.get(message.instanceId);
|
|
328
|
+
if (attachment) {
|
|
329
|
+
attachment.token = message.token;
|
|
330
|
+
attachment.tokenExpiresAt = Date.now() + message.expiresInSeconds * 1000;
|
|
331
|
+
}
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
294
334
|
case 'attach': {
|
|
335
|
+
// Expiry is relative, so this host's clock never matters.
|
|
336
|
+
const tokenExpiresAt = Date.now() + message.expiresInSeconds * 1000;
|
|
295
337
|
const existing = instances.get(message.instanceId);
|
|
296
338
|
if (existing) {
|
|
297
|
-
//
|
|
339
|
+
// A new holder session re-attaches every instance, including ones
|
|
340
|
+
// this connector still serves; a live tunnel only needs confirming.
|
|
341
|
+
// The instance keeps the selectors it first got.
|
|
298
342
|
existing.url = message.url;
|
|
299
343
|
existing.token = message.token;
|
|
344
|
+
existing.tokenExpiresAt = tokenExpiresAt;
|
|
300
345
|
if (existing.tunnel) {
|
|
301
346
|
send({ type: 'attached', instanceId: message.instanceId, tunnelId: existing.tunnel.tunnelId });
|
|
302
347
|
}
|
|
303
348
|
return;
|
|
304
349
|
}
|
|
350
|
+
// The instance itself refuses what its platform cannot route, such
|
|
351
|
+
// as Android routes below port 1024.
|
|
352
|
+
let selectors;
|
|
353
|
+
try {
|
|
354
|
+
selectors = (0, destination_tunnel_1.validateDestinationTunnelSelectors)(message.selectors);
|
|
355
|
+
}
|
|
356
|
+
catch (error) {
|
|
357
|
+
reportGivenUp(message.instanceId, 'invalid_selectors', errorMessage(error));
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
305
360
|
const attachment = {
|
|
306
361
|
url: message.url,
|
|
307
362
|
token: message.token,
|
|
363
|
+
tokenExpiresAt,
|
|
364
|
+
selectors,
|
|
308
365
|
mayReclaim: true,
|
|
309
366
|
failingSince: Date.now(),
|
|
310
367
|
backoffMs: ATTACH_INITIAL_BACKOFF_MS,
|
|
@@ -399,7 +456,6 @@ function runTunnel(options) {
|
|
|
399
456
|
send({
|
|
400
457
|
type: 'hello',
|
|
401
458
|
version: CONTROL_PROTOCOL_VERSION,
|
|
402
|
-
selectors,
|
|
403
459
|
replace,
|
|
404
460
|
...(sessionId === undefined ? {} : { sessionId }),
|
|
405
461
|
attached: Array.from(instances)
|
|
@@ -500,11 +556,13 @@ function decodeControlServerMessage(value) {
|
|
|
500
556
|
const type = (0, destination_tunnel_wire_reader_1.readString)(message, 'type');
|
|
501
557
|
switch (type) {
|
|
502
558
|
case 'active': {
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
559
|
+
return {
|
|
560
|
+
type,
|
|
561
|
+
sessionId: (0, destination_tunnel_wire_reader_1.readNonEmptyString)(message, 'sessionId'),
|
|
562
|
+
leaseSeconds: (0, destination_tunnel_wire_reader_1.readPositiveInteger)(message, 'leaseSeconds'),
|
|
563
|
+
name: (0, destination_tunnel_wire_reader_1.readNonEmptyString)(message, 'name'),
|
|
564
|
+
...(0, destination_tunnel_wire_reader_1.readOptionalString)(message, 'keyExpiresAt'),
|
|
565
|
+
};
|
|
508
566
|
}
|
|
509
567
|
case 'standby': {
|
|
510
568
|
const holder = (0, destination_tunnel_wire_reader_1.readRecord)(message['holder'], 'holder');
|
|
@@ -518,7 +576,16 @@ function decodeControlServerMessage(value) {
|
|
|
518
576
|
type,
|
|
519
577
|
instanceId: (0, destination_tunnel_wire_reader_1.readNonEmptyString)(message, 'instanceId'),
|
|
520
578
|
url: (0, destination_tunnel_wire_reader_1.readNonEmptyString)(message, 'url'),
|
|
579
|
+
selectors: (0, destination_tunnel_wire_reader_1.readStringArray)(message, 'selectors'),
|
|
580
|
+
token: (0, destination_tunnel_wire_reader_1.readNonEmptyString)(message, 'token'),
|
|
581
|
+
expiresInSeconds: (0, destination_tunnel_wire_reader_1.readPositiveInteger)(message, 'expiresInSeconds'),
|
|
582
|
+
};
|
|
583
|
+
case 'token':
|
|
584
|
+
return {
|
|
585
|
+
type,
|
|
586
|
+
instanceId: (0, destination_tunnel_wire_reader_1.readNonEmptyString)(message, 'instanceId'),
|
|
521
587
|
token: (0, destination_tunnel_wire_reader_1.readNonEmptyString)(message, 'token'),
|
|
588
|
+
expiresInSeconds: (0, destination_tunnel_wire_reader_1.readPositiveInteger)(message, 'expiresInSeconds'),
|
|
522
589
|
};
|
|
523
590
|
case 'detach':
|
|
524
591
|
return {
|
package/tunnel-connector.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel-connector.js","sourceRoot":"","sources":["src/tunnel-connector.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tunnel-connector.js","sourceRoot":"","sources":["src/tunnel-connector.ts"],"names":[],"mappings":"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"}
|
package/tunnel-connector.mjs
CHANGED
|
@@ -3,12 +3,12 @@ import { WebSocket } from 'ws';
|
|
|
3
3
|
import { nodeProxyTransport } from "./internal/proxy-transport.mjs";
|
|
4
4
|
import { deriveDestinationTunnelURL, deriveTunnelConnectURL } from "./internal/destination-tunnel-url.mjs";
|
|
5
5
|
import { getDestinationTunnelStatus, stopDestinationTunnel, } from "./internal/destination-tunnel-management.mjs";
|
|
6
|
-
import { DestinationTunnelProtocolError,
|
|
7
|
-
import { DestinationTunnelSessionError, destinationTunnelDialOptions, startDestinationTcpTunnel, } from "./destination-tunnel-dialer.mjs";
|
|
6
|
+
import { DestinationTunnelProtocolError, readPositiveInteger, readStringArray, readNonEmptyString, readOptionalString, readRecord, readString, toBuffer, } from "./internal/destination-tunnel-wire-reader.mjs";
|
|
7
|
+
import { DestinationTunnelSessionError, destinationTunnelDialOptions, destinationTunnelInspection, startDestinationTcpTunnel, } from "./destination-tunnel-dialer.mjs";
|
|
8
8
|
import { normalizeDestinationTunnelInspection, validateDestinationTunnelSelectors, } from "./destination-tunnel.mjs";
|
|
9
9
|
import { upgradeStatus } from "./tunnel.mjs";
|
|
10
10
|
import { VERSION } from "./version.mjs";
|
|
11
|
-
const CONTROL_PROTOCOL_VERSION =
|
|
11
|
+
const CONTROL_PROTOCOL_VERSION = 2;
|
|
12
12
|
const CONTROL_HANDSHAKE_TIMEOUT_MS = 15000;
|
|
13
13
|
const CONTROL_PING_INTERVAL_MS = 15000;
|
|
14
14
|
const CONTROL_DEAD_PEER_MS = 45000;
|
|
@@ -24,21 +24,23 @@ const MAX_REJECTION_REASON_CHARS = 200;
|
|
|
24
24
|
/** Every tunnel WebSocket counts as instance activity, so retries must end. */
|
|
25
25
|
const ATTACH_GIVE_UP_MS = 5 * 60000;
|
|
26
26
|
const TAKEN_OVER_MESSAGE = 'another connector for this tunnel took the instance over';
|
|
27
|
+
/** A token this close to its expiry is not dialed with; the hub refreshes it at half its life. */
|
|
28
|
+
const TOKEN_EXPIRY_MARGIN_MS = 5000;
|
|
29
|
+
/** How long before its key expires the connector starts warning, and how often. */
|
|
30
|
+
const KEY_WARNING_WINDOW_MS = 14 * 24 * 60 * 60000;
|
|
31
|
+
const KEY_WARNING_EVERY_MS = 24 * 60 * 60000;
|
|
27
32
|
/**
|
|
28
|
-
* Serve a persistent tunnel: hold
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
33
|
+
* Serve a persistent tunnel: hold it through one control WebSocket to the
|
|
34
|
+
* Limrun API and open a destination tunnel to every instance created with
|
|
35
|
+
* `spec.tunnel` set to its name, with a short-lived token the API hands out
|
|
36
|
+
* for each. Instance tunnels stay up while the control channel reconnects,
|
|
37
|
+
* so an API outage never becomes a tunnel outage; one that drops re-dials
|
|
38
|
+
* once the API sends a fresh token.
|
|
32
39
|
*/
|
|
33
40
|
export function runTunnel(options) {
|
|
34
|
-
const selectors = validateDestinationTunnelSelectors(options.selectors);
|
|
35
|
-
const dialOptions = {
|
|
36
|
-
...destinationTunnelDialOptions({ selectors, ...(options.inspection ? { inspection: options.inspection } : {}) }, options.logLevel ?? 'warn'),
|
|
37
|
-
name: options.name,
|
|
38
|
-
};
|
|
39
41
|
// Reject a bad inspection config now rather than on every attach.
|
|
40
|
-
normalizeDestinationTunnelInspection(
|
|
41
|
-
const controlURL = deriveTunnelConnectURL(options.baseURL, options.organizationId, options.
|
|
42
|
+
normalizeDestinationTunnelInspection(destinationTunnelInspection(options.inspection));
|
|
43
|
+
const controlURL = deriveTunnelConnectURL(options.baseURL, options.organizationId, options.tunnelId);
|
|
42
44
|
const client = {
|
|
43
45
|
hostname: options.hostname ?? os.hostname(),
|
|
44
46
|
version: options.clientVersion ?? VERSION,
|
|
@@ -54,6 +56,9 @@ export function runTunnel(options) {
|
|
|
54
56
|
let replace = options.replace ?? false;
|
|
55
57
|
// When the last confirmed lease runs out; zero while on standby.
|
|
56
58
|
let leaseExpiresAt = 0;
|
|
59
|
+
// The tunnel's name, from the first active; instances set it in spec.tunnel.
|
|
60
|
+
let tunnelName;
|
|
61
|
+
let lastKeyWarning = 0;
|
|
57
62
|
let announcedSession;
|
|
58
63
|
let announcedHolder;
|
|
59
64
|
let resolveClosed;
|
|
@@ -102,13 +107,22 @@ export function runTunnel(options) {
|
|
|
102
107
|
if (!shutdown())
|
|
103
108
|
return;
|
|
104
109
|
ws?.terminate();
|
|
105
|
-
rejectClosed(new Error(`tunnel ${options.
|
|
110
|
+
rejectClosed(new Error(`tunnel ${tunnelName ?? options.tunnelId}: ${detail}`));
|
|
106
111
|
};
|
|
107
|
-
const
|
|
108
|
-
|
|
112
|
+
const dialOptions = (attachment) => ({
|
|
113
|
+
...destinationTunnelDialOptions({ selectors: attachment.selectors, ...(options.inspection ? { inspection: options.inspection } : {}) }, options.logLevel ?? 'warn'),
|
|
114
|
+
...(tunnelName === undefined ? {} : { name: tunnelName }),
|
|
115
|
+
});
|
|
116
|
+
const tokenUsable = (attachment) => Date.now() < attachment.tokenExpiresAt - TOKEN_EXPIRY_MARGIN_MS;
|
|
117
|
+
// Tells the platform and the caller that the connector gave up on an instance.
|
|
118
|
+
const reportGivenUp = (instanceId, code, message) => {
|
|
109
119
|
send({ type: 'attachFailed', instanceId, code, message, terminal: true });
|
|
110
120
|
emit({ type: 'attachFailed', instanceId, code, message });
|
|
111
121
|
};
|
|
122
|
+
const giveUp = (instanceId, attachment, code, message) => {
|
|
123
|
+
forget(instanceId, attachment);
|
|
124
|
+
reportGivenUp(instanceId, code, message);
|
|
125
|
+
};
|
|
112
126
|
const scheduleAttachRetry = (instanceId, attachment, reason) => {
|
|
113
127
|
const delayMs = jittered(attachment.backoffMs);
|
|
114
128
|
const maxMs = attachment.lastTunnelId === undefined ? ATTACH_FIRST_MAX_BACKOFF_MS : ATTACH_MAX_BACKOFF_MS;
|
|
@@ -130,7 +144,8 @@ export function runTunnel(options) {
|
|
|
130
144
|
const takenOver = async (attachment) => {
|
|
131
145
|
try {
|
|
132
146
|
const active = (await getDestinationTunnelStatus(attachment.url, attachment.token)).active;
|
|
133
|
-
return (active
|
|
147
|
+
return (active !== undefined &&
|
|
148
|
+
active.name === tunnelName &&
|
|
134
149
|
active.state !== 'stopping' &&
|
|
135
150
|
active.tunnelId !== attachment.lastTunnelId);
|
|
136
151
|
}
|
|
@@ -166,7 +181,7 @@ export function runTunnel(options) {
|
|
|
166
181
|
retryAfterFailure(instanceId, attachment, 'already_active', 'the previous tunnel is still stopping');
|
|
167
182
|
return;
|
|
168
183
|
}
|
|
169
|
-
if (active.name !==
|
|
184
|
+
if (active.name !== tunnelName) {
|
|
170
185
|
giveUp(instanceId, attachment, 'instance_busy', 'the instance already has another tunnel');
|
|
171
186
|
return;
|
|
172
187
|
}
|
|
@@ -200,6 +215,12 @@ export function runTunnel(options) {
|
|
|
200
215
|
retryAfterFailure(instanceId, attachment, 'not_holder', 'this connector does not hold the tunnel');
|
|
201
216
|
return;
|
|
202
217
|
}
|
|
218
|
+
// A token past its life is refused; the API sends a fresh one at half
|
|
219
|
+
// life, so this only waits while the control channel is down.
|
|
220
|
+
if (!tokenUsable(attachment)) {
|
|
221
|
+
retryAfterFailure(instanceId, attachment, 'token_expired', 'waiting for a fresh tunnel token');
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
203
224
|
let tunnel;
|
|
204
225
|
try {
|
|
205
226
|
if (attachment.lastTunnelId !== undefined && (await takenOver(attachment))) {
|
|
@@ -210,7 +231,7 @@ export function runTunnel(options) {
|
|
|
210
231
|
}
|
|
211
232
|
if (attachment.done)
|
|
212
233
|
return;
|
|
213
|
-
tunnel = await startDestinationTcpTunnel(deriveDestinationTunnelURL(attachment.url), attachment.token, dialOptions);
|
|
234
|
+
tunnel = await startDestinationTcpTunnel(deriveDestinationTunnelURL(attachment.url), attachment.token, dialOptions(attachment));
|
|
214
235
|
}
|
|
215
236
|
catch (error) {
|
|
216
237
|
if (attachment.done)
|
|
@@ -264,17 +285,26 @@ export function runTunnel(options) {
|
|
|
264
285
|
if (stopped)
|
|
265
286
|
return;
|
|
266
287
|
switch (message.type) {
|
|
267
|
-
case 'active':
|
|
288
|
+
case 'active': {
|
|
268
289
|
replace = false;
|
|
269
290
|
leaseExpiresAt = Date.now() + message.leaseSeconds * 1000;
|
|
270
291
|
controlBackoffMs = CONTROL_INITIAL_BACKOFF_MS;
|
|
271
292
|
sessionId = message.sessionId;
|
|
293
|
+
tunnelName = message.name;
|
|
272
294
|
announcedHolder = undefined;
|
|
273
295
|
if (announcedSession !== message.sessionId) {
|
|
274
296
|
announcedSession = message.sessionId;
|
|
275
|
-
emit({ type: 'active', sessionId: message.sessionId });
|
|
297
|
+
emit({ type: 'active', sessionId: message.sessionId, name: message.name });
|
|
298
|
+
}
|
|
299
|
+
const now = Date.now();
|
|
300
|
+
if (message.keyExpiresAt !== undefined &&
|
|
301
|
+
Date.parse(message.keyExpiresAt) - now < KEY_WARNING_WINDOW_MS &&
|
|
302
|
+
now - lastKeyWarning >= KEY_WARNING_EVERY_MS) {
|
|
303
|
+
lastKeyWarning = now;
|
|
304
|
+
emit({ type: 'keyExpiring', expiresAt: message.keyExpiresAt });
|
|
276
305
|
}
|
|
277
306
|
return;
|
|
307
|
+
}
|
|
278
308
|
case 'standby': {
|
|
279
309
|
leaseExpiresAt = 0;
|
|
280
310
|
controlBackoffMs = CONTROL_INITIAL_BACKOFF_MS;
|
|
@@ -287,20 +317,47 @@ export function runTunnel(options) {
|
|
|
287
317
|
}
|
|
288
318
|
return;
|
|
289
319
|
}
|
|
320
|
+
case 'token': {
|
|
321
|
+
// A fresh token at half its life, or after a resume. An instance this
|
|
322
|
+
// connector gave up on stays given up.
|
|
323
|
+
const attachment = instances.get(message.instanceId);
|
|
324
|
+
if (attachment) {
|
|
325
|
+
attachment.token = message.token;
|
|
326
|
+
attachment.tokenExpiresAt = Date.now() + message.expiresInSeconds * 1000;
|
|
327
|
+
}
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
290
330
|
case 'attach': {
|
|
331
|
+
// Expiry is relative, so this host's clock never matters.
|
|
332
|
+
const tokenExpiresAt = Date.now() + message.expiresInSeconds * 1000;
|
|
291
333
|
const existing = instances.get(message.instanceId);
|
|
292
334
|
if (existing) {
|
|
293
|
-
//
|
|
335
|
+
// A new holder session re-attaches every instance, including ones
|
|
336
|
+
// this connector still serves; a live tunnel only needs confirming.
|
|
337
|
+
// The instance keeps the selectors it first got.
|
|
294
338
|
existing.url = message.url;
|
|
295
339
|
existing.token = message.token;
|
|
340
|
+
existing.tokenExpiresAt = tokenExpiresAt;
|
|
296
341
|
if (existing.tunnel) {
|
|
297
342
|
send({ type: 'attached', instanceId: message.instanceId, tunnelId: existing.tunnel.tunnelId });
|
|
298
343
|
}
|
|
299
344
|
return;
|
|
300
345
|
}
|
|
346
|
+
// The instance itself refuses what its platform cannot route, such
|
|
347
|
+
// as Android routes below port 1024.
|
|
348
|
+
let selectors;
|
|
349
|
+
try {
|
|
350
|
+
selectors = validateDestinationTunnelSelectors(message.selectors);
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
reportGivenUp(message.instanceId, 'invalid_selectors', errorMessage(error));
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
301
356
|
const attachment = {
|
|
302
357
|
url: message.url,
|
|
303
358
|
token: message.token,
|
|
359
|
+
tokenExpiresAt,
|
|
360
|
+
selectors,
|
|
304
361
|
mayReclaim: true,
|
|
305
362
|
failingSince: Date.now(),
|
|
306
363
|
backoffMs: ATTACH_INITIAL_BACKOFF_MS,
|
|
@@ -395,7 +452,6 @@ export function runTunnel(options) {
|
|
|
395
452
|
send({
|
|
396
453
|
type: 'hello',
|
|
397
454
|
version: CONTROL_PROTOCOL_VERSION,
|
|
398
|
-
selectors,
|
|
399
455
|
replace,
|
|
400
456
|
...(sessionId === undefined ? {} : { sessionId }),
|
|
401
457
|
attached: Array.from(instances)
|
|
@@ -496,11 +552,13 @@ function decodeControlServerMessage(value) {
|
|
|
496
552
|
const type = readString(message, 'type');
|
|
497
553
|
switch (type) {
|
|
498
554
|
case 'active': {
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
555
|
+
return {
|
|
556
|
+
type,
|
|
557
|
+
sessionId: readNonEmptyString(message, 'sessionId'),
|
|
558
|
+
leaseSeconds: readPositiveInteger(message, 'leaseSeconds'),
|
|
559
|
+
name: readNonEmptyString(message, 'name'),
|
|
560
|
+
...readOptionalString(message, 'keyExpiresAt'),
|
|
561
|
+
};
|
|
504
562
|
}
|
|
505
563
|
case 'standby': {
|
|
506
564
|
const holder = readRecord(message['holder'], 'holder');
|
|
@@ -514,7 +572,16 @@ function decodeControlServerMessage(value) {
|
|
|
514
572
|
type,
|
|
515
573
|
instanceId: readNonEmptyString(message, 'instanceId'),
|
|
516
574
|
url: readNonEmptyString(message, 'url'),
|
|
575
|
+
selectors: readStringArray(message, 'selectors'),
|
|
576
|
+
token: readNonEmptyString(message, 'token'),
|
|
577
|
+
expiresInSeconds: readPositiveInteger(message, 'expiresInSeconds'),
|
|
578
|
+
};
|
|
579
|
+
case 'token':
|
|
580
|
+
return {
|
|
581
|
+
type,
|
|
582
|
+
instanceId: readNonEmptyString(message, 'instanceId'),
|
|
517
583
|
token: readNonEmptyString(message, 'token'),
|
|
584
|
+
expiresInSeconds: readPositiveInteger(message, 'expiresInSeconds'),
|
|
518
585
|
};
|
|
519
586
|
case 'detach':
|
|
520
587
|
return {
|