lim 0.41.0 → 0.43.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 (43) hide show
  1. package/dist/base-command.js +2 -2
  2. package/dist/base-command.js.map +1 -1
  3. package/dist/commands/tunnel/create.d.ts +21 -0
  4. package/dist/commands/tunnel/create.d.ts.map +1 -0
  5. package/dist/commands/tunnel/create.js +63 -0
  6. package/dist/commands/tunnel/create.js.map +1 -0
  7. package/dist/commands/tunnel/delete.d.ts +19 -0
  8. package/dist/commands/tunnel/delete.d.ts.map +1 -0
  9. package/dist/commands/tunnel/delete.js +30 -0
  10. package/dist/commands/tunnel/delete.js.map +1 -0
  11. package/dist/commands/tunnel/list.d.ts +16 -0
  12. package/dist/commands/tunnel/list.d.ts.map +1 -0
  13. package/dist/commands/tunnel/list.js +34 -0
  14. package/dist/commands/tunnel/list.js.map +1 -0
  15. package/dist/commands/tunnel/manage.test.d.ts +2 -0
  16. package/dist/commands/tunnel/manage.test.d.ts.map +1 -0
  17. package/dist/commands/tunnel/manage.test.js +156 -0
  18. package/dist/commands/tunnel/manage.test.js.map +1 -0
  19. package/dist/commands/tunnel/rotate.d.ts +20 -0
  20. package/dist/commands/tunnel/rotate.d.ts.map +1 -0
  21. package/dist/commands/tunnel/rotate.js +57 -0
  22. package/dist/commands/tunnel/rotate.js.map +1 -0
  23. package/dist/commands/tunnel/run.d.ts +8 -3
  24. package/dist/commands/tunnel/run.d.ts.map +1 -1
  25. package/dist/commands/tunnel/run.js +78 -61
  26. package/dist/commands/tunnel/run.js.map +1 -1
  27. package/dist/commands/tunnel/run.test.js +108 -59
  28. package/dist/commands/tunnel/run.test.js.map +1 -1
  29. package/dist/commands/tunnel/update.d.ts +20 -0
  30. package/dist/commands/tunnel/update.d.ts.map +1 -0
  31. package/dist/commands/tunnel/update.js +47 -0
  32. package/dist/commands/tunnel/update.js.map +1 -0
  33. package/dist/lib/backend.d.ts +57 -12
  34. package/dist/lib/backend.d.ts.map +1 -1
  35. package/dist/lib/backend.js +114 -23
  36. package/dist/lib/backend.js.map +1 -1
  37. package/dist/lib/backend.test.js +75 -25
  38. package/dist/lib/backend.test.js.map +1 -1
  39. package/dist/lib/tunnel-run.d.ts +9 -1
  40. package/dist/lib/tunnel-run.d.ts.map +1 -1
  41. package/dist/lib/tunnel-run.js +22 -5
  42. package/dist/lib/tunnel-run.js.map +1 -1
  43. package/package.json +3 -3
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const base_command_1 = require("../../base-command");
5
+ const backend_1 = require("../../lib/backend");
6
+ const tunnel_run_1 = require("../../lib/tunnel-run");
7
+ class TunnelRotate extends base_command_1.BaseCommand {
8
+ async run() {
9
+ const { args, flags } = await this.parse(TunnelRotate);
10
+ this.setParsedFlags(flags);
11
+ await this.withAuth(async () => {
12
+ const organizationId = await (0, backend_1.tunnelOrganization)(this.client);
13
+ const tunnel = await (0, backend_1.findTunnel)(this.client, organizationId, args.name);
14
+ if (!tunnel) {
15
+ this.error(`Tunnel ${args.name} does not exist.`);
16
+ }
17
+ // A quick tunnel's token belongs to the connector that created it: rotating it
18
+ // ends that connector, which then deletes the tunnel and leaves the new token unusable.
19
+ if (tunnel.ephemeral) {
20
+ this.error(`Tunnel ${args.name} is a quick tunnel; its token lives only as long as its connector.`);
21
+ }
22
+ const token = await (0, backend_1.rotateTunnelToken)(this.client, organizationId, tunnel, flags['expiration-months']);
23
+ if (flags.json) {
24
+ this.outputJson(token);
25
+ }
26
+ else if (flags.quiet) {
27
+ this.output(token.token);
28
+ }
29
+ else {
30
+ this.output((0, tunnel_run_1.formatIssuedToken)(`Rotated the token of tunnel ${args.name}. Connectors running with the old token exit within ` +
31
+ 'seconds; restart them with:', token));
32
+ }
33
+ });
34
+ }
35
+ }
36
+ TunnelRotate.summary = "Issue a persistent tunnel's token and revoke the old one";
37
+ TunnelRotate.description = 'Issue a new token for a persistent tunnel and print `lim tunnel run --token <token>`. The old token ' +
38
+ 'stops working at once, and connectors running with it exit within seconds; restart them with the new ' +
39
+ "one. Needs an admin's API key or login. With --quiet, prints only the token.";
40
+ TunnelRotate.examples = [
41
+ '<%= config.bin %> tunnel rotate staging',
42
+ '<%= config.bin %> tunnel rotate staging --expiration-months 3',
43
+ ];
44
+ TunnelRotate.args = {
45
+ name: core_1.Args.string({ description: 'Name of the tunnel whose token to rotate.', required: true }),
46
+ };
47
+ TunnelRotate.flags = {
48
+ ...base_command_1.BaseCommand.baseFlags,
49
+ 'expiration-months': core_1.Flags.integer({
50
+ description: 'Months until the new token expires, from 1 to 60.',
51
+ default: 12,
52
+ min: 1,
53
+ max: 60,
54
+ }),
55
+ };
56
+ exports.default = TunnelRotate;
57
+ //# sourceMappingURL=rotate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rotate.js","sourceRoot":"","sources":["../../../src/commands/tunnel/rotate.ts"],"names":[],"mappings":";;AAAA,sCAA0C;AAC1C,qDAAiD;AACjD,+CAAsF;AACtF,qDAAyD;AAEzD,MAAqB,YAAa,SAAQ,0BAAW;IAyBnD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACvD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAE3B,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,cAAc,GAAG,MAAM,IAAA,4BAAkB,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,IAAA,oBAAU,EAAC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACxE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,kBAAkB,CAAC,CAAC;YACpD,CAAC;YACD,+EAA+E;YAC/E,wFAAwF;YACxF,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrB,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,oEAAoE,CAAC,CAAC;YACtG,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,IAAA,2BAAiB,EAAC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACvG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;iBAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CACT,IAAA,8BAAiB,EACf,+BAA+B,IAAI,CAAC,IAAI,sDAAsD;oBAC5F,6BAA6B,EAC/B,KAAK,CACN,CACF,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;;AAtDM,oBAAO,GAAG,0DAA0D,CAAC;AACrE,wBAAW,GAChB,sGAAsG;IACtG,uGAAuG;IACvG,8EAA8E,CAAC;AAC1E,qBAAQ,GAAG;IAChB,yCAAyC;IACzC,+DAA+D;CAChE,CAAC;AAEK,iBAAI,GAAG;IACZ,IAAI,EAAE,WAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;CAChG,CAAC;AAEK,kBAAK,GAAG;IACb,GAAG,0BAAW,CAAC,SAAS;IACxB,mBAAmB,EAAE,YAAK,CAAC,OAAO,CAAC;QACjC,WAAW,EAAE,mDAAmD;QAChE,OAAO,EAAE,EAAE;QACX,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,EAAE;KACR,CAAC;CACH,CAAC;kBAvBiB,YAAY"}
@@ -22,9 +22,14 @@ export default class TunnelRun extends BaseCommand {
22
22
  };
23
23
  run(): Promise<void>;
24
24
  /**
25
- * The tunnel to run: the one a tunnel key names, the one --name names, or
26
- * a throwaway tunnel that --name and --selector create.
25
+ * Runs the connector with the tunnel's token until Ctrl+C or a terminal
26
+ * error, and deletes a quick tunnel this command created on the way out.
27
27
  */
28
- private resolveTunnel;
28
+ private serve;
29
+ /**
30
+ * Creates the quick tunnel --name and --selector ask for, with its own
31
+ * token, using the admin's credential.
32
+ */
33
+ private createQuick;
29
34
  }
30
35
  //# sourceMappingURL=run.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/tunnel/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAajD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,OAAO,SAA+D;IAC7E,MAAM,CAAC,WAAW,SAQL;IACb,MAAM,CAAC,QAAQ,WAKb;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;;;;;;MAmCV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA2D1B;;;OAGG;YACW,aAAa;CAwC5B"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/tunnel/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAmBjD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,OAAO,SAA+D;IAC7E,MAAM,CAAC,WAAW,SAOyD;IAC3E,MAAM,CAAC,QAAQ,WAIb;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;;;;;;MAqCV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA8C1B;;;OAGG;YACW,KAAK;IAmDnB;;;OAGG;YACW,WAAW;CAyB1B"}
@@ -11,8 +11,7 @@ const VERSION = require('../../../package.json').version;
11
11
  class TunnelRun extends base_command_1.BaseCommand {
12
12
  async run() {
13
13
  const { flags } = await this.parse(TunnelRun);
14
- // The tunnel key is an API key; it wins over a key already in the shell.
15
- this.setParsedFlags(flags.token ? { ...flags, 'api-key': flags.token } : flags);
14
+ this.setParsedFlags(flags);
16
15
  let inspection;
17
16
  try {
18
17
  inspection = (0, tunnel_inspection_flags_1.tunnelInspectionContext)(flags);
@@ -21,16 +20,46 @@ class TunnelRun extends base_command_1.BaseCommand {
21
20
  this.error(error instanceof Error ? error.message : String(error));
22
21
  }
23
22
  const selectors = flags.selector?.length ? (0, tunnel_process_1.parseTunnelSelectors)(flags.selector) : undefined;
23
+ // A tunnel token names its organization and tunnel and is the only
24
+ // credential the connector needs. --api-key, LIM_API_KEY and lim login
25
+ // stay an admin's, which only create quick tunnels.
26
+ if (flags.token) {
27
+ const claims = (0, backend_1.tunnelTokenClaims)(flags.token);
28
+ if (!claims) {
29
+ this.error('--token takes a tunnel token, as printed by `lim tunnel create`; this is not one.');
30
+ }
31
+ if (flags.name || selectors) {
32
+ this.error("A tunnel token runs its own tunnel as created; drop --name and --selector, and change the tunnel's " +
33
+ 'selectors with `lim tunnel update`.');
34
+ }
35
+ await this.serve({ ...claims, token: flags.token, created: false }, flags, inspection);
36
+ return;
37
+ }
38
+ if (!flags.name) {
39
+ this.error("Run with the tunnel's token (--token or LIM_TUNNEL_TOKEN), or pass --name and --selector for a " +
40
+ 'quick tunnel.');
41
+ }
42
+ const name = flags.name;
24
43
  await this.withAuth(async () => {
25
- const { organizationId, tunnelId: keyTunnelId } = await (0, backend_1.whoAmITunnel)(this.client);
26
- const tunnel = await this.resolveTunnel(organizationId, keyTunnelId, flags.name, selectors);
27
- // A tunnel key's tunnel learns its name from the first active.
28
- let name = flags.name;
44
+ const organizationId = await (0, backend_1.tunnelOrganization)(this.client);
45
+ const tunnel = await this.createQuick(organizationId, name, selectors);
46
+ await this.serve({ organizationId, tunnelId: tunnel.id, token: tunnel.token, created: true }, flags, inspection);
47
+ });
48
+ }
49
+ /**
50
+ * Runs the connector with the tunnel's token until Ctrl+C or a terminal
51
+ * error, and deletes a quick tunnel this command created on the way out.
52
+ */
53
+ async serve(tunnel, flags, inspection) {
54
+ // A tunnel token's tunnel learns its name from the first active.
55
+ let name = flags.name;
56
+ let stop;
57
+ try {
29
58
  const connector = (0, api_1.runTunnel)({
30
- apiKey: this.client.apiKey ?? '',
59
+ token: tunnel.token,
31
60
  baseURL: this.client.baseURL,
32
- organizationId,
33
- tunnelId: tunnel.id,
61
+ organizationId: tunnel.organizationId,
62
+ tunnelId: tunnel.tunnelId,
34
63
  inspection: (0, tunnel_inspection_flags_1.tunnelInspectionConfig)(inspection),
35
64
  replace: flags.replace,
36
65
  clientVersion: VERSION,
@@ -43,89 +72,77 @@ class TunnelRun extends base_command_1.BaseCommand {
43
72
  this.info((0, tunnel_run_1.formatTunnelConnectorEvent)(name, event, tunnel.created));
44
73
  },
45
74
  });
46
- // close() says bye, which also takes a throwaway tunnel away.
47
- const stop = () => void connector.close();
75
+ // close() says bye, which also takes a quick tunnel away.
76
+ stop = () => void connector.close();
48
77
  process.once('SIGINT', stop);
49
78
  process.once('SIGTERM', stop);
50
- try {
51
- await connector.closed;
52
- }
53
- catch (error) {
54
- this.error(error instanceof Error ? error.message : String(error));
55
- }
56
- finally {
79
+ await connector.closed;
80
+ }
81
+ catch (error) {
82
+ this.error(error instanceof Error ? error.message : String(error));
83
+ }
84
+ finally {
85
+ if (stop) {
57
86
  process.off('SIGINT', stop);
58
87
  process.off('SIGTERM', stop);
59
- // A connector stopped while connecting, refused, or out of retries
60
- // never said bye, so its throwaway tunnel would hold the name until
61
- // the hub sweeps it.
62
- if (tunnel.created) {
63
- await (0, backend_1.deleteQuickTunnel)(this.client, organizationId, tunnel.id).catch((error) => this.warn(`${error instanceof Error ? error.message : String(error)}; it goes away within ten minutes.`));
64
- }
65
88
  }
66
- });
89
+ // A connector stopped while connecting, refused, or out of retries
90
+ // never said bye, so its quick tunnel would hold the name until the
91
+ // hub sweeps it.
92
+ if (tunnel.created) {
93
+ await (0, backend_1.deleteTunnel)(this.client, tunnel.organizationId, tunnel.tunnelId).catch((error) => this.warn(`${error instanceof Error ? error.message : String(error)}; it goes away within ten minutes.`));
94
+ }
95
+ }
67
96
  }
68
97
  /**
69
- * The tunnel to run: the one a tunnel key names, the one --name names, or
70
- * a throwaway tunnel that --name and --selector create.
98
+ * Creates the quick tunnel --name and --selector ask for, with its own
99
+ * token, using the admin's credential.
71
100
  */
72
- async resolveTunnel(organizationId, keyTunnelId, name, selectors) {
73
- if (keyTunnelId) {
74
- if (name || selectors) {
75
- this.error("A tunnel key runs its own tunnel as created; drop --name and --selector, and edit the tunnel's " +
76
- 'selectors in the console.');
77
- }
78
- return { id: keyTunnelId, created: false };
79
- }
80
- if (!name) {
81
- this.error("Run with the tunnel's key (--token), or pass --name with an admin's credential.");
82
- }
101
+ async createQuick(organizationId, name, selectors) {
83
102
  const existing = await (0, backend_1.findTunnel)(this.client, organizationId, name);
84
103
  if (existing?.ephemeral) {
85
- // A throwaway tunnel is its creator's alone and goes when it stops.
86
- this.error(`Tunnel ${name} is another connector's throwaway tunnel; pick another name.`);
104
+ // A quick tunnel is its creator's alone and goes when it stops.
105
+ this.error(`Tunnel ${name} is another connector's quick tunnel; pick another name.`);
87
106
  }
88
107
  if (existing) {
89
- if (selectors) {
90
- this.error(`Tunnel ${name} has its own selectors; edit them in the console instead of passing --selector.`);
91
- }
92
- return { id: existing.id, created: false };
108
+ this.error(`Tunnel ${name} runs with its own token (--token). If you no longer have it, issue a new one with ` +
109
+ `lim tunnel rotate ${name}.`);
93
110
  }
94
111
  if (!selectors) {
95
- this.error(`Tunnel ${name} does not exist. Create it in the console (Network > New tunnel), or pass --selector to ` +
96
- 'run a throwaway tunnel.');
112
+ this.error(`Tunnel ${name} does not exist. Create it with lim tunnel create ${name} --selector <destination>, or pass --selector to ` +
113
+ 'run a quick tunnel.');
97
114
  }
98
115
  const created = await (0, backend_1.createQuickTunnel)(this.client, organizationId, name, selectors);
99
- return { id: created.id, created: true };
116
+ return { id: created.tunnel.id, token: created.token };
100
117
  }
101
118
  }
102
119
  TunnelRun.summary = 'Serve a persistent tunnel to every instance that names it';
103
- TunnelRun.description = 'Run the connector of a tunnel created in the console (Network > New tunnel) or the API, and open ' +
120
+ TunnelRun.description = 'Run the connector of a tunnel created with `lim tunnel create` or in the console (Network), and open ' +
104
121
  'a destination tunnel to every iOS and Android instance created with --tunnel <name>, until Ctrl+C. ' +
105
- 'Run it with the tunnel key the console shows (--token); the key names its tunnel, and the ' +
106
- "tunnel's selectors decide which destinations instances reach through this machine. An admin's " +
107
- 'login runs any tunnel with --name, and --name with --selector runs a throwaway tunnel that goes ' +
108
- 'away when this connector exits. Instance tunnels stay up while the connection to Limrun ' +
109
- 'reconnects. One connector holds a tunnel at a time: others wait on standby, and --replace takes ' +
110
- 'it over.';
122
+ 'Run it with the tunnel token (--token or LIM_TUNNEL_TOKEN); the token names its tunnel, and the ' +
123
+ "tunnel's selectors decide which destinations instances reach through this machine. With an " +
124
+ "admin's login, --name and --selector run a quick tunnel that goes away when this connector " +
125
+ 'exits. Instance tunnels stay up while the connection to Limrun reconnects. One connector holds a ' +
126
+ 'tunnel at a time: others wait on standby, and --replace takes it over.';
111
127
  TunnelRun.examples = [
112
- '<%= config.bin %> tunnel run --token <tunnel key>',
113
- '<%= config.bin %> tunnel run --name staging',
128
+ '<%= config.bin %> tunnel run --token <tunnel token>',
114
129
  '<%= config.bin %> tunnel run --name scratch --selector localhost:3000',
115
130
  '<%= config.bin %> ios create --tunnel staging',
116
131
  ];
117
132
  TunnelRun.flags = {
118
133
  ...base_command_1.BaseCommand.baseFlags,
119
134
  token: core_1.Flags.string({
120
- description: 'Tunnel key from the console (Network > New tunnel). Takes precedence over --api-key and LIM_API_KEY.',
135
+ description: 'Tunnel token printed by `lim tunnel create` or `lim tunnel rotate`, or shown in the console.',
136
+ env: 'LIM_TUNNEL_TOKEN',
121
137
  }),
122
138
  name: core_1.Flags.string({
123
- description: "Tunnel to run with an admin's credential. A tunnel key runs its own tunnel and needs no name.",
139
+ description: "Name of a quick tunnel to run with --selector and an admin's login. A tunnel token runs its own " +
140
+ 'tunnel and needs no name.',
124
141
  }),
125
142
  selector: core_1.Flags.string({
126
- description: 'Run a throwaway tunnel with this destination, as localhost:port, IPv4:port, [IPv6]:port, or a ' +
127
- 'private exact or *. wildcard domain, when --name names no tunnel yet. A tunnel created in the ' +
128
- 'console keeps its own selectors. Repeat for more selectors.',
143
+ description: 'Run a quick tunnel with this destination, as localhost:port, IPv4:port, [IPv6]:port, or a ' +
144
+ 'an exact or *. wildcard domain. A created tunnel keeps its own selectors. ' +
145
+ 'Repeat for more selectors.',
129
146
  multiple: true,
130
147
  }),
131
148
  replace: core_1.Flags.boolean({
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/tunnel/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/tunnel/run.ts"],"names":[],"mappings":"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"}
@@ -10,11 +10,19 @@ const backend_1 = require("../../lib/backend");
10
10
  const tunnel_run_1 = require("../../lib/tunnel-run");
11
11
  jest.mock('@limrun/api', () => ({ ...jest.requireActual('@limrun/api'), runTunnel: jest.fn() }));
12
12
  jest.mock('../../lib/backend', () => ({
13
- whoAmITunnel: jest.fn(),
13
+ tunnelOrganization: jest.fn(),
14
14
  findTunnel: jest.fn(),
15
15
  createQuickTunnel: jest.fn(),
16
- deleteQuickTunnel: jest.fn(async () => { }),
16
+ deleteTunnel: jest.fn(async () => { }),
17
+ tunnelTokenClaims: jest.requireActual('../../lib/backend').tunnelTokenClaims,
17
18
  }));
19
+ // A tunnel token's header and signature do not matter to the CLI; only the
20
+ // payload's claims are read.
21
+ const tunnelToken = `lim_st_eyJhbGciOiJFZERTQSJ9.${Buffer.from(JSON.stringify({ sub: 'org_1', scopes: ['tunnel:tunnel_01h455vb4pex5vsknk084sn02q:connect'] })).toString('base64url')}.c2ln`;
22
+ /** A tunnel as the backend lists it, with the fields a test cares about. */
23
+ function tunnelFixture(fields) {
24
+ return { online: false, selectors: [], instances: [], ...fields };
25
+ }
18
26
  beforeEach(() => jest.clearAllMocks());
19
27
  describe('tunnel run flags', () => {
20
28
  test('need neither a name nor selectors, with inspection on by default', async () => {
@@ -24,12 +32,31 @@ describe('tunnel run flags', () => {
24
32
  expect(flags.selector).toBeUndefined();
25
33
  expect(run_1.default.flags).not.toHaveProperty('har');
26
34
  });
35
+ test('read the tunnel token from LIM_TUNNEL_TOKEN, never from LIM_API_KEY', async () => {
36
+ const saved = { token: process.env['LIM_TUNNEL_TOKEN'], key: process.env['LIM_API_KEY'] };
37
+ process.env['LIM_TUNNEL_TOKEN'] = tunnelToken;
38
+ process.env['LIM_API_KEY'] = 'lim_admin';
39
+ try {
40
+ const { flags } = await core_1.Parser.parse([], { flags: run_1.default.flags });
41
+ expect(flags.token).toBe(tunnelToken);
42
+ expect(flags['api-key']).toBe('lim_admin');
43
+ }
44
+ finally {
45
+ for (const [name, value] of [
46
+ ['LIM_TUNNEL_TOKEN', saved.token],
47
+ ['LIM_API_KEY', saved.key],
48
+ ]) {
49
+ if (value === undefined)
50
+ delete process.env[name];
51
+ else
52
+ process.env[name] = value;
53
+ }
54
+ }
55
+ });
27
56
  });
28
57
  describe('tunnel run command', () => {
29
- function setup(flags, { keyTunnelId, closed = Promise.resolve() } = {}) {
30
- jest
31
- .mocked(backend_1.whoAmITunnel)
32
- .mockResolvedValue({ organizationId: 'org_1', ...(keyTunnelId ? { tunnelId: keyTunnelId } : {}) });
58
+ function setup(flags, { closed = Promise.resolve() } = {}) {
59
+ jest.mocked(backend_1.tunnelOrganization).mockResolvedValue('org_1');
33
60
  const close = jest.fn(async () => { });
34
61
  jest.mocked(api_1.runTunnel).mockReturnValue({ closed, close });
35
62
  const info = jest.fn();
@@ -61,15 +88,18 @@ describe('tunnel run command', () => {
61
88
  function options() {
62
89
  return jest.mocked(api_1.runTunnel).mock.calls[0][0];
63
90
  }
64
- test('runs the tunnel a tunnel key names, with the mapped options', async () => {
65
- const { command, info } = setup({}, { keyTunnelId: 'tunnel_1' });
91
+ test('runs the tunnel a tunnel token names with that token alone', async () => {
92
+ const { command, info } = setup({ token: tunnelToken });
66
93
  await command.run();
94
+ // The admin's key in the shell is never used: no backend call, and the
95
+ // connector runs with the tunnel token.
96
+ expect(backend_1.tunnelOrganization).not.toHaveBeenCalled();
67
97
  expect(backend_1.findTunnel).not.toHaveBeenCalled();
68
98
  expect(options()).toMatchObject({
69
- apiKey: 'lim_key',
99
+ token: tunnelToken,
70
100
  baseURL: 'https://api.example.test',
71
101
  organizationId: 'org_1',
72
- tunnelId: 'tunnel_1',
102
+ tunnelId: 'tunnel_01h455vb4pex5vsknk084sn02q',
73
103
  inspection: { enabled: true, captureBodies: true, maxBodyBytes: 1024, persist: true, ttlSeconds: 3600 },
74
104
  replace: true,
75
105
  logLevel: 'warn',
@@ -80,81 +110,99 @@ describe('tunnel run command', () => {
80
110
  expect(info).toHaveBeenCalledWith('Tunnel staging is active. Instances created with --tunnel staging attach here; press Ctrl+C to stop.');
81
111
  expect(info).toHaveBeenCalledWith('Standby: ci-1 holds tunnel staging. Waiting for it to go away; use --replace to take it over.');
82
112
  });
83
- test('runs with the key --token passes, over one in the shell', async () => {
84
- const { command } = setup({ token: 'lim_tunnel_key' }, { keyTunnelId: 'tunnel_1' });
85
- await command.run();
86
- expect(command.setParsedFlags).toHaveBeenCalledWith(expect.objectContaining({ token: 'lim_tunnel_key', 'api-key': 'lim_tunnel_key' }));
87
- });
88
- test('runs the tunnel an admin names', async () => {
89
- jest.mocked(backend_1.findTunnel).mockResolvedValue({ id: 'tunnel_2', name: 'staging', ephemeral: false });
90
- const { command } = setup({ name: 'staging' });
91
- await command.run();
92
- expect(backend_1.findTunnel).toHaveBeenCalledWith(expect.anything(), 'org_1', 'staging');
93
- expect(options()).toMatchObject({ tunnelId: 'tunnel_2' });
94
- expect(backend_1.createQuickTunnel).not.toHaveBeenCalled();
95
- expect(backend_1.deleteQuickTunnel).not.toHaveBeenCalled();
113
+ test.each([
114
+ ['an API key', 'lim_' + 'k'.repeat(48)],
115
+ ['a signed token for an instance', 'lim_st_e30.e30.c2ln'],
116
+ ])('refuses %s passed as --token', async (_, token) => {
117
+ const { command } = setup({ token });
118
+ await expect(command.run()).rejects.toThrow('--token takes a tunnel token');
119
+ expect(backend_1.tunnelOrganization).not.toHaveBeenCalled();
96
120
  });
97
- test('creates a throwaway tunnel for --name with --selector', async () => {
121
+ test("creates a quick tunnel for --name with --selector and runs it with the tunnel's token", async () => {
98
122
  jest.mocked(backend_1.findTunnel).mockResolvedValue(undefined);
99
- jest.mocked(backend_1.createQuickTunnel).mockResolvedValue({ id: 'tunnel_3', name: 'scratch', ephemeral: true });
123
+ jest.mocked(backend_1.createQuickTunnel).mockResolvedValue({
124
+ tunnel: tunnelFixture({ id: 'tunnel_3', name: 'scratch', ephemeral: true }),
125
+ token: 'lim_st_quick',
126
+ });
100
127
  const { command, info } = setup({ name: 'scratch', selector: ['localhost:3000'] });
101
128
  await command.run();
102
129
  expect(backend_1.createQuickTunnel).toHaveBeenCalledWith(expect.anything(), 'org_1', 'scratch', ['localhost:3000']);
103
- expect(options()).toMatchObject({ tunnelId: 'tunnel_3' });
130
+ // Only tunnel tokens connect, so the admin's login never reaches the hub.
131
+ expect(options()).toMatchObject({ tunnelId: 'tunnel_3', token: 'lim_st_quick' });
104
132
  options().onEvent({ type: 'active', sessionId: 's1', name: 'scratch' });
105
133
  expect(info).toHaveBeenCalledWith(expect.stringContaining('goes away when this connector exits'));
106
- expect(backend_1.deleteQuickTunnel).toHaveBeenCalledWith(expect.anything(), 'org_1', 'tunnel_3');
134
+ expect(backend_1.deleteTunnel).toHaveBeenCalledWith(expect.anything(), 'org_1', 'tunnel_3');
135
+ });
136
+ test('deletes its quick tunnel when the connector cannot start', async () => {
137
+ jest.mocked(backend_1.findTunnel).mockResolvedValue(undefined);
138
+ jest.mocked(backend_1.createQuickTunnel).mockResolvedValue({
139
+ tunnel: tunnelFixture({ id: 'tunnel_3', name: 'scratch', ephemeral: true }),
140
+ token: 'lim_st_quick',
141
+ });
142
+ const { command } = setup({ name: 'scratch', selector: ['localhost:3000'] });
143
+ jest.mocked(api_1.runTunnel).mockImplementation(() => {
144
+ throw new Error('invalid header value');
145
+ });
146
+ await expect(command.run()).rejects.toThrow('invalid header value');
147
+ expect(backend_1.deleteTunnel).toHaveBeenCalledWith(expect.anything(), 'org_1', 'tunnel_3');
107
148
  });
108
- test('deletes its throwaway tunnel when the connector fails', async () => {
149
+ test('deletes its quick tunnel when the connector fails', async () => {
109
150
  jest.mocked(backend_1.findTunnel).mockResolvedValue(undefined);
110
- jest.mocked(backend_1.createQuickTunnel).mockResolvedValue({ id: 'tunnel_3', name: 'scratch', ephemeral: true });
151
+ jest.mocked(backend_1.createQuickTunnel).mockResolvedValue({
152
+ tunnel: tunnelFixture({ id: 'tunnel_3', name: 'scratch', ephemeral: true }),
153
+ token: 'lim_st_quick',
154
+ });
111
155
  const { command } = setup({ name: 'scratch', selector: ['localhost:3000'] }, { closed: Promise.reject(new Error('tunnel scratch: unauthorized')) });
112
156
  await expect(command.run()).rejects.toThrow('tunnel scratch: unauthorized');
113
- expect(backend_1.deleteQuickTunnel).toHaveBeenCalledWith(expect.anything(), 'org_1', 'tunnel_3');
157
+ expect(backend_1.deleteTunnel).toHaveBeenCalledWith(expect.anything(), 'org_1', 'tunnel_3');
114
158
  });
115
159
  test.each([
116
160
  [
117
- 'a tunnel key with selectors',
118
- { selector: ['localhost:3000'] },
119
- 'tunnel_1',
120
- 'A tunnel key runs its own tunnel as created',
161
+ 'a tunnel token with selectors',
162
+ { token: tunnelToken, selector: ['localhost:3000'] },
163
+ 'A tunnel token runs its own tunnel as created',
164
+ ],
165
+ [
166
+ 'a tunnel token with a name',
167
+ { token: tunnelToken, name: 'b' },
168
+ 'A tunnel token runs its own tunnel as created',
121
169
  ],
122
- ['a tunnel key with a name', { name: 'b' }, 'tunnel_1', 'A tunnel key runs its own tunnel as created'],
123
170
  [
124
- 'no key and no name',
171
+ 'no token and no name',
125
172
  {},
126
- undefined,
127
- "Run with the tunnel's key (--token), or pass --name with an admin's credential.",
173
+ "Run with the tunnel's token (--token or LIM_TUNNEL_TOKEN), or pass --name and --selector for a quick tunnel.",
128
174
  ],
129
175
  [
130
176
  'a name that does not exist without selectors',
131
177
  { name: 'missing' },
132
- undefined,
133
- 'Tunnel missing does not exist. Create it in the console (Network > New tunnel), or pass --selector to ' +
134
- 'run a throwaway tunnel.',
178
+ 'Tunnel missing does not exist. Create it with lim tunnel create missing --selector <destination>, or ' +
179
+ 'pass --selector to run a quick tunnel.',
135
180
  ],
136
- ])('refuses %s', async (_, flags, keyTunnelId, message) => {
181
+ ])('refuses %s', async (_, flags, message) => {
137
182
  jest.mocked(backend_1.findTunnel).mockResolvedValue(undefined);
138
- const { command } = setup(flags, keyTunnelId ? { keyTunnelId } : {});
183
+ const { command } = setup(flags);
139
184
  await expect(command.run()).rejects.toThrow(message);
140
185
  expect(api_1.runTunnel).not.toHaveBeenCalled();
141
186
  });
142
- test('refuses selectors for a tunnel that has its own', async () => {
143
- jest.mocked(backend_1.findTunnel).mockResolvedValue({ id: 'tunnel_2', name: 'staging', ephemeral: false });
144
- const { command } = setup({ name: 'staging', selector: ['localhost:3000'] });
145
- await expect(command.run()).rejects.toThrow('Tunnel staging has its own selectors');
187
+ test.each([[{ name: 'staging' }], [{ name: 'staging', selector: ['localhost:3000'] }]])('refuses to run a console-created tunnel without its token (%j)', async (flags) => {
188
+ jest
189
+ .mocked(backend_1.findTunnel)
190
+ .mockResolvedValue(tunnelFixture({ id: 'tunnel_2', name: 'staging', ephemeral: false }));
191
+ const { command } = setup(flags);
192
+ await expect(command.run()).rejects.toThrow('Tunnel staging runs with its own token (--token)');
193
+ expect(api_1.runTunnel).not.toHaveBeenCalled();
194
+ expect(backend_1.createQuickTunnel).not.toHaveBeenCalled();
146
195
  });
147
- test.each([[{ name: 'scratch' }], [{ name: 'scratch', selector: ['localhost:3000'] }]])("refuses another connector's throwaway tunnel (%j)", async (flags) => {
148
- jest.mocked(backend_1.findTunnel).mockResolvedValue({ id: 'tunnel_3', name: 'scratch', ephemeral: true });
196
+ test.each([[{ name: 'scratch' }], [{ name: 'scratch', selector: ['localhost:3000'] }]])("refuses another connector's quick tunnel (%j)", async (flags) => {
197
+ jest
198
+ .mocked(backend_1.findTunnel)
199
+ .mockResolvedValue(tunnelFixture({ id: 'tunnel_3', name: 'scratch', ephemeral: true }));
149
200
  const { command } = setup(flags);
150
- await expect(command.run()).rejects.toThrow("Tunnel scratch is another connector's throwaway tunnel");
201
+ await expect(command.run()).rejects.toThrow("Tunnel scratch is another connector's quick tunnel");
151
202
  expect(api_1.runTunnel).not.toHaveBeenCalled();
152
203
  });
153
204
  test('fails with the terminal connector error', async () => {
154
- const { command } = setup({}, {
155
- keyTunnelId: 'tunnel_1',
156
- closed: Promise.reject(new Error('tunnel staging: the tunnel was deleted')),
157
- });
205
+ const { command } = setup({ token: tunnelToken }, { closed: Promise.reject(new Error('tunnel staging: the tunnel was deleted')) });
158
206
  await expect(command.run()).rejects.toThrow('tunnel staging: the tunnel was deleted');
159
207
  });
160
208
  });
@@ -165,9 +213,9 @@ describe('tunnel run event lines', () => {
165
213
  'Tunnel staging is active. Instances created with --tunnel staging attach here; press Ctrl+C to stop.',
166
214
  ],
167
215
  [
168
- { type: 'keyExpiring', expiresAt: '2026-10-20T00:00:00Z' },
169
- 'The key this connector runs with expires at 2026-10-20T00:00:00Z. Issue a new key for tunnel staging ' +
170
- 'in the console (Network) and restart the connector with it.',
216
+ { type: 'tokenExpiring', expiresAt: '2026-10-20T00:00:00Z' },
217
+ 'The token this connector runs with expires at 2026-10-20T00:00:00Z. Issue a new one with ' +
218
+ 'lim tunnel rotate staging and restart the connector with it.',
171
219
  ],
172
220
  [
173
221
  { type: 'standby', holder: { hostname: 'ci-1', since: '2026-10-08T10:00:00Z' } },
@@ -197,9 +245,10 @@ describe('tunnel run event lines', () => {
197
245
  test('names the tunnel generically before the first active', () => {
198
246
  expect((0, tunnel_run_1.formatTunnelConnectorEvent)(undefined, { type: 'standby', holder: { hostname: 'ci-1' } })).toBe('Standby: ci-1 holds the tunnel. Waiting for it to go away; use --replace to take it over.');
199
247
  });
200
- test('says a throwaway tunnel goes with its connector', () => {
248
+ test('says a quick tunnel goes with its connector, and restarts for a new token', () => {
201
249
  expect((0, tunnel_run_1.formatTunnelConnectorEvent)('scratch', { type: 'active', sessionId: 's1', name: 'scratch' }, true)).toBe('Tunnel scratch is active. Instances created with --tunnel scratch attach here; press Ctrl+C to stop. ' +
202
- 'It is a throwaway tunnel and goes away when this connector exits.');
250
+ 'It is a quick tunnel and goes away when this connector exits.');
251
+ expect((0, tunnel_run_1.formatTunnelConnectorEvent)('scratch', { type: 'tokenExpiring', expiresAt: '2026-10-20T00:00:00Z' }, true)).toBe('The token of quick tunnel scratch expires at 2026-10-20T00:00:00Z. Restart the connector to get a new one.');
203
252
  });
204
253
  });
205
254
  //# sourceMappingURL=run.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.test.js","sourceRoot":"","sources":["../../../src/commands/tunnel/run.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.test.js","sourceRoot":"","sources":["../../../src/commands/tunnel/run.test.ts"],"names":[],"mappings":"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"}