@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.
Files changed (34) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/destination-tunnel-dialer.d.mts +8 -0
  3. package/destination-tunnel-dialer.d.mts.map +1 -1
  4. package/destination-tunnel-dialer.d.ts +8 -0
  5. package/destination-tunnel-dialer.d.ts.map +1 -1
  6. package/destination-tunnel-dialer.js +6 -5
  7. package/destination-tunnel-dialer.js.map +1 -1
  8. package/destination-tunnel-dialer.mjs +5 -5
  9. package/destination-tunnel-dialer.mjs.map +1 -1
  10. package/internal/destination-tunnel-wire-reader.d.mts +2 -0
  11. package/internal/destination-tunnel-wire-reader.d.mts.map +1 -1
  12. package/internal/destination-tunnel-wire-reader.d.ts +2 -0
  13. package/internal/destination-tunnel-wire-reader.d.ts.map +1 -1
  14. package/internal/destination-tunnel-wire-reader.js +17 -0
  15. package/internal/destination-tunnel-wire-reader.js.map +1 -1
  16. package/internal/destination-tunnel-wire-reader.mjs +15 -0
  17. package/internal/destination-tunnel-wire-reader.mjs.map +1 -1
  18. package/package.json +1 -1
  19. package/src/destination-tunnel-dialer.ts +6 -5
  20. package/src/internal/destination-tunnel-wire-reader.ts +17 -0
  21. package/src/tunnel-connector.ts +129 -39
  22. package/src/version.ts +1 -1
  23. package/tunnel-connector.d.mts +20 -9
  24. package/tunnel-connector.d.mts.map +1 -1
  25. package/tunnel-connector.d.ts +20 -9
  26. package/tunnel-connector.d.ts.map +1 -1
  27. package/tunnel-connector.js +94 -27
  28. package/tunnel-connector.js.map +1 -1
  29. package/tunnel-connector.mjs +96 -29
  30. package/tunnel-connector.mjs.map +1 -1
  31. package/version.d.mts +1 -1
  32. package/version.d.ts +1 -1
  33. package/version.js +1 -1
  34. package/version.mjs +1 -1
@@ -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 = 1;
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 the name through one control WebSocket to
33
- * the Limrun API and open a destination tunnel to every instance created
34
- * with `spec.tunnel` set to it. Instance tunnels stay up while the control
35
- * channel reconnects, so an API outage never becomes a tunnel outage.
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)(dialOptions.inspection ?? {});
45
- const controlURL = (0, destination_tunnel_url_1.deriveTunnelConnectURL)(options.baseURL, options.organizationId, options.name);
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.name}: ${detail}`));
114
+ rejectClosed(new Error(`tunnel ${tunnelName ?? options.tunnelId}: ${detail}`));
110
115
  };
111
- const giveUp = (instanceId, attachment, code, message) => {
112
- forget(instanceId, attachment);
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?.name === options.name &&
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 !== options.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
- // Resume replays attaches; a live tunnel only needs confirming.
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
- const leaseSeconds = (0, destination_tunnel_wire_reader_1.readInteger)(message, 'leaseSeconds');
504
- if (leaseSeconds < 1) {
505
- throw new destination_tunnel_wire_reader_1.DestinationTunnelProtocolError('leaseSeconds must be positive');
506
- }
507
- return { type, sessionId: (0, destination_tunnel_wire_reader_1.readNonEmptyString)(message, 'sessionId'), leaseSeconds };
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 {
@@ -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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"}
@@ -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, readInteger, readNonEmptyString, readOptionalString, readRecord, readString, toBuffer, } from "./internal/destination-tunnel-wire-reader.mjs";
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 = 1;
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 the name through one control WebSocket to
29
- * the Limrun API and open a destination tunnel to every instance created
30
- * with `spec.tunnel` set to it. Instance tunnels stay up while the control
31
- * channel reconnects, so an API outage never becomes a tunnel outage.
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(dialOptions.inspection ?? {});
41
- const controlURL = deriveTunnelConnectURL(options.baseURL, options.organizationId, options.name);
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.name}: ${detail}`));
110
+ rejectClosed(new Error(`tunnel ${tunnelName ?? options.tunnelId}: ${detail}`));
106
111
  };
107
- const giveUp = (instanceId, attachment, code, message) => {
108
- forget(instanceId, attachment);
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?.name === options.name &&
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 !== options.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
- // Resume replays attaches; a live tunnel only needs confirming.
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
- const leaseSeconds = readInteger(message, 'leaseSeconds');
500
- if (leaseSeconds < 1) {
501
- throw new DestinationTunnelProtocolError('leaseSeconds must be positive');
502
- }
503
- return { type, sessionId: readNonEmptyString(message, 'sessionId'), leaseSeconds };
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 {