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,20 @@
1
+ import { BaseCommand } from '../../base-command';
2
+ export default class TunnelUpdate extends BaseCommand {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static args: {
7
+ name: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
8
+ };
9
+ static flags: {
10
+ selector: import("@oclif/core/lib/interfaces").OptionFlag<string[], import("@oclif/core/lib/interfaces").CustomOptions>;
11
+ 'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
12
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
13
+ quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
14
+ create: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
15
+ workspace: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
16
+ daemon: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
17
+ };
18
+ run(): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/tunnel/update.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIjD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,WAAW;IACnD,MAAM,CAAC,OAAO,SAA6C;IAC3D,MAAM,CAAC,WAAW,SAEgF;IAClG,MAAM,CAAC,QAAQ,WAEb;IAEF,MAAM,CAAC,IAAI;;MAET;IAEF,MAAM,CAAC,KAAK;;;;;;;;MASV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAsB3B"}
@@ -0,0 +1,47 @@
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_process_1 = require("../../lib/tunnel-process");
7
+ class TunnelUpdate extends base_command_1.BaseCommand {
8
+ async run() {
9
+ const { args, flags } = await this.parse(TunnelUpdate);
10
+ this.setParsedFlags(flags);
11
+ const selectors = (0, tunnel_process_1.parseTunnelSelectors)(flags.selector);
12
+ await this.withAuth(async () => {
13
+ const organizationId = await (0, backend_1.tunnelOrganization)(this.client);
14
+ const tunnel = await (0, backend_1.findTunnel)(this.client, organizationId, args.name);
15
+ if (!tunnel) {
16
+ this.error(`Tunnel ${args.name} does not exist.`);
17
+ }
18
+ const updated = await (0, backend_1.updateTunnelSelectors)(this.client, organizationId, tunnel, [...selectors]);
19
+ if (flags.json) {
20
+ this.outputJson(updated);
21
+ return;
22
+ }
23
+ this.output(`Updated the selectors of tunnel ${args.name}. Instances attached from now on get them; restart the ` +
24
+ 'connector to apply them to attached instances.');
25
+ });
26
+ }
27
+ }
28
+ TunnelUpdate.summary = "Replace a persistent tunnel's selectors";
29
+ TunnelUpdate.description = "Replace a persistent tunnel's selectors. Instances attached after the change get the new ones; " +
30
+ "restart the connector to apply them to attached instances. Needs an admin's API key or login.";
31
+ TunnelUpdate.examples = [
32
+ '<%= config.bin %> tunnel update staging --selector localhost:3000 --selector localhost:4000',
33
+ ];
34
+ TunnelUpdate.args = {
35
+ name: core_1.Args.string({ description: 'Name of the tunnel to update.', required: true }),
36
+ };
37
+ TunnelUpdate.flags = {
38
+ ...base_command_1.BaseCommand.baseFlags,
39
+ selector: core_1.Flags.string({
40
+ description: 'Destination instances reach through the connector, as localhost:port, IPv4:port, [IPv6]:port, or ' +
41
+ 'an exact or *. wildcard domain. Repeat for more selectors; they replace the current ones.',
42
+ multiple: true,
43
+ required: true,
44
+ }),
45
+ };
46
+ exports.default = TunnelUpdate;
47
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/tunnel/update.ts"],"names":[],"mappings":";;AAAA,sCAA0C;AAC1C,qDAAiD;AACjD,+CAA0F;AAC1F,6DAAgE;AAEhE,MAAqB,YAAa,SAAQ,0BAAW;IAwBnD,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;QAC3B,MAAM,SAAS,GAAG,IAAA,qCAAoB,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEvD,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,MAAM,OAAO,GAAG,MAAM,IAAA,+BAAqB,EAAC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;YACjG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBACzB,OAAO;YACT,CAAC;YACD,IAAI,CAAC,MAAM,CACT,mCAAmC,IAAI,CAAC,IAAI,yDAAyD;gBACnG,gDAAgD,CACnD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;;AA5CM,oBAAO,GAAG,yCAAyC,CAAC;AACpD,wBAAW,GAChB,iGAAiG;IACjG,+FAA+F,CAAC;AAC3F,qBAAQ,GAAG;IAChB,6FAA6F;CAC9F,CAAC;AAEK,iBAAI,GAAG;IACZ,IAAI,EAAE,WAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,+BAA+B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;CACpF,CAAC;AAEK,kBAAK,GAAG;IACb,GAAG,0BAAW,CAAC,SAAS;IACxB,QAAQ,EAAE,YAAK,CAAC,MAAM,CAAC;QACrB,WAAW,EACT,mGAAmG;YACnG,2FAA2F;QAC7F,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;KACf,CAAC;CACH,CAAC;kBAtBiB,YAAY"}
@@ -24,26 +24,71 @@ export interface PersistentTunnel {
24
24
  id: string;
25
25
  name: string;
26
26
  ephemeral: boolean;
27
+ online: boolean;
28
+ selectors: string[];
29
+ hostname?: string;
30
+ tokenExpiresAt?: string;
31
+ instances: {
32
+ id: string;
33
+ platform: string;
34
+ state: string;
35
+ }[];
27
36
  }
37
+ /** A tunnel token as the backend returns it, once: Limrun never stores it. */
38
+ export interface TunnelToken {
39
+ token: string;
40
+ expiresAt: string;
41
+ }
42
+ /**
43
+ * Resolves the organization a credential manages tunnels for. It must be an
44
+ * organization key or login, so a user token's default organization does not
45
+ * count. A tunnel token belongs in `lim tunnel run --token`: the backend
46
+ * accepts no signed token.
47
+ */
48
+ export declare function tunnelOrganization(client: Limrun): Promise<string>;
28
49
  /**
29
- * Resolves the organization and, when the credential is a tunnel key, the
30
- * one tunnel it runs: a tunnel key's only scope is tunnel:<id>:connect. A
31
- * connector needs an organization key, so a user token's default
32
- * organization does not count.
50
+ * Reads the organization and tunnel a tunnel token names, without verifying
51
+ * it; undefined when the token is no tunnel token. Its only scope is
52
+ * tunnel:<id>:connect.
33
53
  */
34
- export declare function whoAmITunnel(client: Limrun): Promise<{
54
+ export declare function tunnelTokenClaims(token: string): {
35
55
  organizationId: string;
36
- tunnelId?: string;
37
- }>;
56
+ tunnelId: string;
57
+ } | undefined;
58
+ /** Lists an organization's tunnels. */
59
+ export declare function listTunnels(client: Limrun, organizationId: string): Promise<PersistentTunnel[]>;
38
60
  /** Finds an organization's tunnel by the name instances use. */
39
61
  export declare function findTunnel(client: Limrun, organizationId: string, name: string): Promise<PersistentTunnel | undefined>;
40
- /** Creates a throwaway tunnel that goes away when its connector does. */
41
- export declare function createQuickTunnel(client: Limrun, organizationId: string, name: string, selectors: string[]): Promise<PersistentTunnel>;
42
62
  /**
43
- * Deletes a throwaway tunnel this CLI created. The hub deletes it when its
44
- * connector says bye, so a missing tunnel is the normal case.
63
+ * Creates a tunnel with the token its connector runs with: only tunnel tokens
64
+ * connect. The token is returned only here.
65
+ */
66
+ export declare function createTunnel(client: Limrun, organizationId: string, request: {
67
+ name: string;
68
+ selectors: string[];
69
+ expirationMonths: number;
70
+ ephemeral?: boolean;
71
+ }): Promise<{
72
+ tunnel: PersistentTunnel;
73
+ token: TunnelToken;
74
+ }>;
75
+ /**
76
+ * Creates a quick tunnel that goes away when its connector does. Its token
77
+ * goes with the tunnel, so it lasts a month, the shortest the API takes.
78
+ */
79
+ export declare function createQuickTunnel(client: Limrun, organizationId: string, name: string, selectors: string[]): Promise<{
80
+ tunnel: PersistentTunnel;
81
+ token: string;
82
+ }>;
83
+ /** Replaces a tunnel's selectors. Instances attached after the change get them. */
84
+ export declare function updateTunnelSelectors(client: Limrun, organizationId: string, tunnel: PersistentTunnel, selectors: string[]): Promise<PersistentTunnel>;
85
+ /** Issues a tunnel's token, which revokes the one it had. */
86
+ export declare function rotateTunnelToken(client: Limrun, organizationId: string, tunnel: PersistentTunnel, expirationMonths: number): Promise<TunnelToken>;
87
+ /**
88
+ * Deletes a tunnel, which revokes its token. A tunnel already gone is fine:
89
+ * the hub deletes a quick tunnel when its connector says bye.
45
90
  */
46
- export declare function deleteQuickTunnel(client: Limrun, organizationId: string, tunnelId: string): Promise<void>;
91
+ export declare function deleteTunnel(client: Limrun, organizationId: string, tunnelId: string): Promise<void>;
47
92
  /** Fetches a secret's data, or undefined when it does not exist. */
48
93
  export declare function getSecret(client: Limrun, organizationId: string, secretType: string, secretName: string): Promise<SecretData | undefined>;
49
94
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/lib/backend.ts"],"names":[],"mappings":"AAAA,OAAO,MAAwD,MAAM,aAAa,CAAC;AAEnF;;;;;GAKG;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,2BAA2B,sBAAsB,CAAC;AAU/D;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5D;AAgBD,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CASzG;AAMD,gEAAgE;AAChE,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAQvC;AAED,yEAAyE;AACzE,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAS3B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CASf;AAQD,oEAAoE;AACpE,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAcjC;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,eAAe,CAAC,CAgB1B"}
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/lib/backend.ts"],"names":[],"mappings":"AAAA,OAAO,MAAwD,MAAM,aAAa,CAAC;AAEnF;;;;;GAKG;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,2BAA2B,sBAAsB,CAAC;AAU/D;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5D;AAeD,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC9D;AAED,8EAA8E;AAC9E,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAaxE;AAYD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAoBzG;AAUD,uCAAuC;AACvC,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAQrG;AAED,gEAAgE;AAChE,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAEvC;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5F,OAAO,CAAC;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC,CAgB3D;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAQtD;AAED,mFAAmF;AACnF,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAM3B;AAED,6DAA6D;AAC7D,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,gBAAgB,EACxB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,WAAW,CAAC,CAQtB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS1G;AAQD,oEAAoE;AACpE,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAcjC;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,eAAe,CAAC,CAgB1B"}
@@ -2,10 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.androidSigningKeySecretType = void 0;
4
4
  exports.whoAmI = whoAmI;
5
- exports.whoAmITunnel = whoAmITunnel;
5
+ exports.tunnelOrganization = tunnelOrganization;
6
+ exports.tunnelTokenClaims = tunnelTokenClaims;
7
+ exports.listTunnels = listTunnels;
6
8
  exports.findTunnel = findTunnel;
9
+ exports.createTunnel = createTunnel;
7
10
  exports.createQuickTunnel = createQuickTunnel;
8
- exports.deleteQuickTunnel = deleteQuickTunnel;
11
+ exports.updateTunnelSelectors = updateTunnelSelectors;
12
+ exports.rotateTunnelToken = rotateTunnelToken;
13
+ exports.deleteTunnel = deleteTunnel;
9
14
  exports.getSecret = getSecret;
10
15
  exports.putSecret = putSecret;
11
16
  const api_1 = require("@limrun/api");
@@ -40,26 +45,65 @@ async function fetchWhoAmI(client) {
40
45
  }
41
46
  }
42
47
  /**
43
- * Resolves the organization and, when the credential is a tunnel key, the
44
- * one tunnel it runs: a tunnel key's only scope is tunnel:<id>:connect. A
45
- * connector needs an organization key, so a user token's default
46
- * organization does not count.
48
+ * Resolves the organization a credential manages tunnels for. It must be an
49
+ * organization key or login, so a user token's default organization does not
50
+ * count. A tunnel token belongs in `lim tunnel run --token`: the backend
51
+ * accepts no signed token.
47
52
  */
48
- async function whoAmITunnel(client) {
53
+ async function tunnelOrganization(client) {
54
+ if ((client.apiKey ?? '').startsWith(SIGNED_TOKEN_PREFIX)) {
55
+ throw new Error('The API key is a signed token. Pass a tunnel token to lim tunnel run with --token or ' +
56
+ 'LIM_TUNNEL_TOKEN; managing tunnels needs an organization API key or login.');
57
+ }
49
58
  const body = await fetchWhoAmI(client);
50
59
  const organizationId = body.organization?.id;
51
60
  if (!organizationId) {
52
- throw new Error('Running a tunnel needs an API key: a tunnel key from the console, or an admin key.');
61
+ throw new Error('Managing tunnels needs an organization API key or login.');
53
62
  }
54
- const [scope, ...rest] = body.scopes ?? [];
55
- const match = rest.length === 0 ? /^tunnel:(tunnel_[0-9a-z]+):connect$/.exec(scope ?? '') : null;
56
- return match ? { organizationId, tunnelId: match[1] } : { organizationId };
63
+ return organizationId;
64
+ }
65
+ /** The tunnel a credential's scopes name, when its only scope connects one. */
66
+ function onlyTunnelOf(scopes) {
67
+ const [scope, ...rest] = Array.isArray(scopes) ? scopes : [];
68
+ const match = rest.length === 0 && typeof scope === 'string' ? /^tunnel:(tunnel_[0-9a-z]+):connect$/.exec(scope) : null;
69
+ return match?.[1];
70
+ }
71
+ const SIGNED_TOKEN_PREFIX = 'lim_st_';
72
+ /**
73
+ * Reads the organization and tunnel a tunnel token names, without verifying
74
+ * it; undefined when the token is no tunnel token. Its only scope is
75
+ * tunnel:<id>:connect.
76
+ */
77
+ function tunnelTokenClaims(token) {
78
+ const payload = token.slice(SIGNED_TOKEN_PREFIX.length).split('.')[1];
79
+ if (!token.startsWith(SIGNED_TOKEN_PREFIX) || !payload) {
80
+ return undefined;
81
+ }
82
+ let claims;
83
+ try {
84
+ claims = JSON.parse(Buffer.from(payload, 'base64url').toString('utf8'));
85
+ }
86
+ catch {
87
+ return undefined;
88
+ }
89
+ if (typeof claims !== 'object' || claims === null) {
90
+ return undefined;
91
+ }
92
+ const { sub, scopes } = claims;
93
+ const tunnelId = onlyTunnelOf(scopes);
94
+ if (!tunnelId || typeof sub !== 'string' || sub === '') {
95
+ return undefined;
96
+ }
97
+ return { organizationId: sub, tunnelId };
57
98
  }
58
99
  function tunnelsPath(organizationId) {
59
100
  return `/v1/organizations/${encodeURIComponent(organizationId)}/tunnels`;
60
101
  }
61
- /** Finds an organization's tunnel by the name instances use. */
62
- async function findTunnel(client, organizationId, name) {
102
+ function tunnelPath(organizationId, tunnelId) {
103
+ return `${tunnelsPath(organizationId)}/${encodeURIComponent(tunnelId)}`;
104
+ }
105
+ /** Lists an organization's tunnels. */
106
+ async function listTunnels(client, organizationId) {
63
107
  let body;
64
108
  try {
65
109
  body = await client.get(tunnelsPath(organizationId));
@@ -67,27 +111,74 @@ async function findTunnel(client, organizationId, name) {
67
111
  catch (err) {
68
112
  rethrow(err, 'Failed to list tunnels');
69
113
  }
70
- return body.tunnels?.find((tunnel) => tunnel.name === name);
114
+ return body.tunnels ?? [];
71
115
  }
72
- /** Creates a throwaway tunnel that goes away when its connector does. */
73
- async function createQuickTunnel(client, organizationId, name, selectors) {
116
+ /** Finds an organization's tunnel by the name instances use. */
117
+ async function findTunnel(client, organizationId, name) {
118
+ return (await listTunnels(client, organizationId)).find((tunnel) => tunnel.name === name);
119
+ }
120
+ /**
121
+ * Creates a tunnel with the token its connector runs with: only tunnel tokens
122
+ * connect. The token is returned only here.
123
+ */
124
+ async function createTunnel(client, organizationId, request) {
125
+ const { name, selectors, expirationMonths, ephemeral } = request;
126
+ let body;
74
127
  try {
75
- const body = await client.post(tunnelsPath(organizationId), {
76
- body: { name, selectors, ephemeral: true },
128
+ body = await client.post(tunnelsPath(organizationId), {
129
+ body: { name, selectors, ...(ephemeral && { ephemeral }), token: { expirationMonths } },
77
130
  });
78
- return body.tunnel;
79
131
  }
80
132
  catch (err) {
81
133
  rethrow(err, `Failed to create tunnel ${name}`);
82
134
  }
135
+ if (!body.token?.token) {
136
+ // Nothing can run a tunnel without its token, so it goes at once.
137
+ await deleteTunnel(client, organizationId, body.tunnel.id).catch(() => { });
138
+ throw new Error(`Limrun created tunnel ${name} but returned no token to run it with.`);
139
+ }
140
+ return { tunnel: body.tunnel, token: body.token };
141
+ }
142
+ /**
143
+ * Creates a quick tunnel that goes away when its connector does. Its token
144
+ * goes with the tunnel, so it lasts a month, the shortest the API takes.
145
+ */
146
+ async function createQuickTunnel(client, organizationId, name, selectors) {
147
+ const created = await createTunnel(client, organizationId, {
148
+ name,
149
+ selectors,
150
+ expirationMonths: 1,
151
+ ephemeral: true,
152
+ });
153
+ return { tunnel: created.tunnel, token: created.token.token };
154
+ }
155
+ /** Replaces a tunnel's selectors. Instances attached after the change get them. */
156
+ async function updateTunnelSelectors(client, organizationId, tunnel, selectors) {
157
+ try {
158
+ return await client.patch(tunnelPath(organizationId, tunnel.id), { body: { selectors } });
159
+ }
160
+ catch (err) {
161
+ rethrow(err, `Failed to update tunnel ${tunnel.name}`);
162
+ }
163
+ }
164
+ /** Issues a tunnel's token, which revokes the one it had. */
165
+ async function rotateTunnelToken(client, organizationId, tunnel, expirationMonths) {
166
+ try {
167
+ return await client.post(`${tunnelPath(organizationId, tunnel.id)}/token`, {
168
+ body: { expirationMonths },
169
+ });
170
+ }
171
+ catch (err) {
172
+ rethrow(err, `Failed to rotate the token of tunnel ${tunnel.name}`);
173
+ }
83
174
  }
84
175
  /**
85
- * Deletes a throwaway tunnel this CLI created. The hub deletes it when its
86
- * connector says bye, so a missing tunnel is the normal case.
176
+ * Deletes a tunnel, which revokes its token. A tunnel already gone is fine:
177
+ * the hub deletes a quick tunnel when its connector says bye.
87
178
  */
88
- async function deleteQuickTunnel(client, organizationId, tunnelId) {
179
+ async function deleteTunnel(client, organizationId, tunnelId) {
89
180
  try {
90
- await client.delete(`${tunnelsPath(organizationId)}/${encodeURIComponent(tunnelId)}`);
181
+ await client.delete(tunnelPath(organizationId, tunnelId));
91
182
  }
92
183
  catch (err) {
93
184
  if (err instanceof api_1.NotFoundError) {
@@ -1 +1 @@
1
- {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/lib/backend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/lib/backend.ts"],"names":[],"mappings":";;;AAiCA,wBAOC;AAuCD,gDAaC;AAiBD,8CAoBC;AAWD,kCAQC;AAGD,gCAMC;AAMD,oCAoBC;AAMD,8CAaC;AAGD,sDAWC;AAGD,8CAaC;AAMD,oCASC;AASD,8BAmBC;AASD,8BAsBC;AAlTD,qCAAmF;AAiBtE,QAAA,2BAA2B,GAAG,mBAAmB,CAAC;AAE/D,oFAAoF;AACpF,SAAS,OAAO,CAAC,GAAY,EAAE,OAAe;IAC5C,IAAI,GAAG,YAAY,yBAAmB,IAAI,CAAC,CAAC,GAAG,YAAY,cAAQ,CAAC,EAAE,CAAC;QACrE,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,MAAM,CAAC,MAAc;IACzC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,mBAAmB,EAAE,EAAE,CAAC;IACnF,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAOD,KAAK,UAAU,WAAW,CAAC,MAAc;IACvC,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,EAAE,oCAAoC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAoBD;;;;;GAKG;AACI,KAAK,UAAU,kBAAkB,CAAC,MAAc;IACrD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CACb,uFAAuF;YACrF,4EAA4E,CAC/E,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;IAC7C,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,+EAA+E;AAC/E,SAAS,YAAY,CAAC,MAAe;IACnC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,MAAM,KAAK,GACT,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,qCAAqC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5G,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,mBAAmB,GAAG,SAAS,CAAC;AAEtC;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACvD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAA6C,CAAC;IACtE,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACvD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,WAAW,CAAC,cAAsB;IACzC,OAAO,qBAAqB,kBAAkB,CAAC,cAAc,CAAC,UAAU,CAAC;AAC3E,CAAC;AAED,SAAS,UAAU,CAAC,cAAsB,EAAE,QAAgB;IAC1D,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,uCAAuC;AAChC,KAAK,UAAU,WAAW,CAAC,MAAc,EAAE,cAAsB;IACtE,IAAI,IAAsC,CAAC;IAC3C,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,gEAAgE;AACzD,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,cAAsB,EACtB,IAAY;IAEZ,OAAO,CAAC,MAAM,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC5F,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,cAAsB,EACtB,OAA6F;IAE7F,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACjE,IAAI,IAAuD,CAAC;IAC5D,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE;YACpD,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,gBAAgB,EAAE,EAAE;SACxF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,EAAE,2BAA2B,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QACvB,kEAAkE;QAClE,MAAM,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,wCAAwC,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AACpD,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,cAAsB,EACtB,IAAY,EACZ,SAAmB;IAEnB,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE;QACzD,IAAI;QACJ,SAAS;QACT,gBAAgB,EAAE,CAAC;QACnB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;AAChE,CAAC;AAED,mFAAmF;AAC5E,KAAK,UAAU,qBAAqB,CACzC,MAAc,EACd,cAAsB,EACtB,MAAwB,EACxB,SAAmB;IAEnB,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,EAAE,2BAA2B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,6DAA6D;AACtD,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,cAAsB,EACtB,MAAwB,EACxB,gBAAwB;IAExB,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE;YACzE,IAAI,EAAE,EAAE,gBAAgB,EAAE;SAC3B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,EAAE,wCAAwC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,YAAY,CAAC,MAAc,EAAE,cAAsB,EAAE,QAAgB;IACzF,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,mBAAa,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,2BAA2B,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,cAAsB,EAAE,UAAkB,EAAE,UAAkB;IAChF,OAAO,qBAAqB,kBAAkB,CAAC,cAAc,CAAC,YAAY,kBAAkB,CAC1F,UAAU,CACX,IAAI,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,oEAAoE;AAC7D,KAAK,UAAU,SAAS,CAC7B,MAAc,EACd,cAAsB,EACtB,UAAkB,EAClB,UAAkB;IAElB,IAAI,IAA2B,CAAC;IAChC,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,mBAAa,EAAE,CAAC;YACjC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,uBAAuB,UAAU,WAAW,UAAU,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,UAAU,uBAAuB,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,SAAS,CAC7B,MAAc,EACd,cAAsB,EACtB,UAAkB,EAClB,UAAkB,EAClB,IAAgB;IAEhB,IAAI,IAA8C,CAAC;IACnD,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM;aACrC,GAAG,CAA2C,UAAU,CAAC,cAAc,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE;YACjG,IAAI,EAAE,EAAE,IAAI,EAAE;SACf,CAAC;aACD,YAAY,EAAE,CAAC,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,EAAE,uBAAuB,UAAU,WAAW,UAAU,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,UAAU,uBAAuB,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;AAC/E,CAAC"}
@@ -57,26 +57,39 @@ describe('backend client', () => {
57
57
  };
58
58
  }
59
59
  describe('tunnels', () => {
60
- it('reads the one tunnel a tunnel key runs from its scopes', async () => {
61
- fetchMock.mockResolvedValue(mockResponse(200, {
62
- type: 'organization',
63
- organization: { id: 'org_1' },
64
- scopes: ['tunnel:tunnel_01h455vb4pex5vsknk084sn02q:connect'],
65
- }));
66
- await expect((0, backend_1.whoAmITunnel)(client)).resolves.toEqual({
67
- organizationId: 'org_1',
68
- tunnelId: 'tunnel_01h455vb4pex5vsknk084sn02q',
69
- });
60
+ // A signed token's header and signature do not matter here; only the
61
+ // payload's claims are read.
62
+ function signedToken(claims) {
63
+ return `lim_st_eyJhbGciOiJFZERTQSJ9.${Buffer.from(JSON.stringify(claims)).toString('base64url')}.c2ln`;
64
+ }
65
+ it('reads the organization and tunnel a tunnel token names', () => {
66
+ expect((0, backend_1.tunnelTokenClaims)(signedToken({ sub: 'org_1', scopes: ['tunnel:tunnel_01h455vb4pex5vsknk084sn02q:connect'] }))).toEqual({ organizationId: 'org_1', tunnelId: 'tunnel_01h455vb4pex5vsknk084sn02q' });
70
67
  });
71
68
  it.each([
72
- ['an admin key', ['*:*:all']],
73
- ['a key that runs every tunnel', ['tunnel:*:connect']],
74
- ['a key with more than its tunnel', ['tunnel:tunnel_01h455vb4pex5vsknk084sn02q:connect', 'ios:*:read']],
75
- ])('names no tunnel for %s', async (_, scopes) => {
76
- fetchMock.mockResolvedValue(mockResponse(200, { organization: { id: 'org_1' }, scopes }));
77
- await expect((0, backend_1.whoAmITunnel)(client)).resolves.toEqual({ organizationId: 'org_1' });
78
- });
79
- it('finds a tunnel by name and creates a throwaway one', async () => {
69
+ ['a payload that is null', null],
70
+ ['an instance token', { sub: 'org_1', scopes: ['ios:ios_euna_x:all'] }],
71
+ ['a token for every tunnel', { sub: 'org_1', scopes: ['tunnel:*:connect'] }],
72
+ [
73
+ 'a token with more than its tunnel',
74
+ { sub: 'org_1', scopes: ['tunnel:tunnel_01h455vb4pex5vsknk084sn02q:connect', 'ios:*:read'] },
75
+ ],
76
+ ])('reads no tunnel from %s', (_, claims) => {
77
+ expect((0, backend_1.tunnelTokenClaims)(signedToken(claims))).toBeUndefined();
78
+ });
79
+ it("asks whoami for the organization of an admin's key", async () => {
80
+ fetchMock.mockResolvedValue(mockResponse(200, { organization: { id: 'org_1' } }));
81
+ await expect((0, backend_1.tunnelOrganization)(client)).resolves.toBe('org_1');
82
+ });
83
+ it('refuses a signed token as the API key, without a call', async () => {
84
+ const tokenClient = new api_1.default({
85
+ apiKey: signedToken({ sub: 'org_1', scopes: ['tunnel:tunnel_01h455vb4pex5vsknk084sn02q:connect'] }),
86
+ baseURL: apiEndpoint,
87
+ maxRetries: 0,
88
+ });
89
+ await expect((0, backend_1.tunnelOrganization)(tokenClient)).rejects.toThrow('--token or LIM_TUNNEL_TOKEN');
90
+ expect(fetchMock).not.toHaveBeenCalled();
91
+ });
92
+ it('finds a tunnel by name and creates a quick one', async () => {
80
93
  fetchMock.mockResolvedValueOnce(mockResponse(200, { tunnels: [{ id: 'tunnel_1', name: 'staging', ephemeral: false }] }));
81
94
  await expect((0, backend_1.findTunnel)(client, 'org_1', 'staging')).resolves.toEqual({
82
95
  id: 'tunnel_1',
@@ -84,26 +97,63 @@ describe('backend client', () => {
84
97
  ephemeral: false,
85
98
  });
86
99
  expect(requestOf(fetchMock.mock.calls[0]).url).toBe(`${apiEndpoint}/v1/organizations/org_1/tunnels`);
87
- fetchMock.mockResolvedValueOnce(mockResponse(201, { tunnel: { id: 'tunnel_2', name: 'scratch', ephemeral: true } }));
88
- await expect((0, backend_1.createQuickTunnel)(client, 'org_1', 'scratch', ['localhost:3000'])).resolves.toMatchObject({
89
- id: 'tunnel_2',
90
- ephemeral: true,
100
+ fetchMock.mockResolvedValueOnce(mockResponse(201, {
101
+ tunnel: { id: 'tunnel_2', name: 'scratch', ephemeral: true },
102
+ token: { token: 'lim_st_quick', expiresAt: '2026-11-09T00:00:00Z' },
103
+ }));
104
+ await expect((0, backend_1.createQuickTunnel)(client, 'org_1', 'scratch', ['localhost:3000'])).resolves.toEqual({
105
+ tunnel: { id: 'tunnel_2', name: 'scratch', ephemeral: true },
106
+ token: 'lim_st_quick',
91
107
  });
92
108
  const [, init] = fetchMock.mock.calls[1];
93
109
  expect(JSON.parse(String(init.body))).toEqual({
94
110
  name: 'scratch',
95
111
  selectors: ['localhost:3000'],
96
112
  ephemeral: true,
113
+ token: { expirationMonths: 1 },
114
+ });
115
+ // Without its token the tunnel could not run, so the create fails and
116
+ // the tunnel goes at once.
117
+ fetchMock.mockResolvedValueOnce(mockResponse(201, { tunnel: { id: 'tunnel_3', name: 'other', ephemeral: true } }));
118
+ fetchMock.mockResolvedValueOnce(new Response(null, { status: 204 }));
119
+ await expect((0, backend_1.createQuickTunnel)(client, 'org_1', 'other', ['localhost:3000'])).rejects.toThrow('returned no token');
120
+ const [deleteURL, deleteInit] = fetchMock.mock.calls[3];
121
+ expect(deleteURL).toBe(`${apiEndpoint}/v1/organizations/org_1/tunnels/tunnel_3`);
122
+ expect(deleteInit.method).toBe('DELETE');
123
+ });
124
+ it('replaces selectors and rotates the token of a tunnel by its ID', async () => {
125
+ const tunnel = {
126
+ id: 'tunnel_1',
127
+ name: 'staging',
128
+ ephemeral: false,
129
+ online: true,
130
+ selectors: [],
131
+ instances: [],
132
+ };
133
+ fetchMock.mockResolvedValueOnce(mockResponse(200, { ...tunnel, selectors: ['localhost:4000'] }));
134
+ await (0, backend_1.updateTunnelSelectors)(client, 'org_1', tunnel, ['localhost:4000']);
135
+ const [updateURL, updateInit] = fetchMock.mock.calls[0];
136
+ expect(updateURL).toBe(`${apiEndpoint}/v1/organizations/org_1/tunnels/tunnel_1`);
137
+ expect(updateInit.method).toBe('PATCH');
138
+ expect(JSON.parse(String(updateInit.body))).toEqual({ selectors: ['localhost:4000'] });
139
+ fetchMock.mockResolvedValueOnce(mockResponse(201, { token: 'lim_st_new', expiresAt: '2027-10-10T00:00:00Z' }));
140
+ await expect((0, backend_1.rotateTunnelToken)(client, 'org_1', tunnel, 3)).resolves.toEqual({
141
+ token: 'lim_st_new',
142
+ expiresAt: '2027-10-10T00:00:00Z',
97
143
  });
144
+ const [rotateURL, rotateInit] = fetchMock.mock.calls[1];
145
+ expect(rotateURL).toBe(`${apiEndpoint}/v1/organizations/org_1/tunnels/tunnel_1/token`);
146
+ expect(rotateInit.method).toBe('POST');
147
+ expect(JSON.parse(String(rotateInit.body))).toEqual({ expirationMonths: 3 });
98
148
  });
99
- it('deletes a throwaway tunnel by ID, and a tunnel the hub already removed is fine', async () => {
149
+ it('deletes a quick tunnel by ID, and a tunnel the hub already removed is fine', async () => {
100
150
  fetchMock.mockResolvedValueOnce(new Response(null, { status: 204 }));
101
- await (0, backend_1.deleteQuickTunnel)(client, 'org_1', 'tunnel_2');
151
+ await (0, backend_1.deleteTunnel)(client, 'org_1', 'tunnel_2');
102
152
  const [url, init] = fetchMock.mock.calls[0];
103
153
  expect(url).toBe(`${apiEndpoint}/v1/organizations/org_1/tunnels/tunnel_2`);
104
154
  expect(init.method).toBe('DELETE');
105
155
  fetchMock.mockResolvedValueOnce(mockResponse(404, { message: 'tunnel not found' }));
106
- await expect((0, backend_1.deleteQuickTunnel)(client, 'org_1', 'tunnel_2')).resolves.toBeUndefined();
156
+ await expect((0, backend_1.deleteTunnel)(client, 'org_1', 'tunnel_2')).resolves.toBeUndefined();
107
157
  });
108
158
  });
109
159
  describe('whoAmI', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"backend.test.js","sourceRoot":"","sources":["../../src/lib/backend.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"backend.test.js","sourceRoot":"","sources":["../../src/lib/backend.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,15 @@
1
1
  import type { TunnelConnectorEvent } from '@limrun/api';
2
2
  /**
3
3
  * One human-readable log line per connector event. name is undefined until
4
- * the first active, for a connector started with a tunnel key alone.
4
+ * the first active, for a connector started with a tunnel token alone.
5
5
  */
6
6
  export declare function formatTunnelConnectorEvent(name: string | undefined, event: TunnelConnectorEvent, ephemeral?: boolean): string;
7
+ /**
8
+ * The lines that hand over a tunnel token after `create` or `rotate`: the
9
+ * connector command with the token, which Limrun shows only this once.
10
+ */
11
+ export declare function formatIssuedToken(lead: string, token: {
12
+ token: string;
13
+ expiresAt: string;
14
+ }): string;
7
15
  //# sourceMappingURL=tunnel-run.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel-run.d.ts","sourceRoot":"","sources":["../../src/lib/tunnel-run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,oBAAoB,EAC3B,SAAS,UAAQ,GAChB,MAAM,CAmCR"}
1
+ {"version":3,"file":"tunnel-run.d.ts","sourceRoot":"","sources":["../../src/lib/tunnel-run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,oBAAoB,EAC3B,SAAS,UAAQ,GAChB,MAAM,CAoCR;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAQnG"}