decipher-tunnel 1.0.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 (57) hide show
  1. package/dist/commands/forward/index.d.ts +3 -0
  2. package/dist/commands/forward/index.d.ts.map +1 -0
  3. package/dist/commands/forward/index.js +115 -0
  4. package/dist/commands/forward/index.js.map +1 -0
  5. package/dist/commands/kill/index.d.ts +3 -0
  6. package/dist/commands/kill/index.d.ts.map +1 -0
  7. package/dist/commands/kill/index.js +31 -0
  8. package/dist/commands/kill/index.js.map +1 -0
  9. package/dist/commands/list/index.d.ts +3 -0
  10. package/dist/commands/list/index.d.ts.map +1 -0
  11. package/dist/commands/list/index.js +26 -0
  12. package/dist/commands/list/index.js.map +1 -0
  13. package/dist/commands/login/index.d.ts +3 -0
  14. package/dist/commands/login/index.d.ts.map +1 -0
  15. package/dist/commands/login/index.js +95 -0
  16. package/dist/commands/login/index.js.map +1 -0
  17. package/dist/commands/logout/index.d.ts +3 -0
  18. package/dist/commands/logout/index.d.ts.map +1 -0
  19. package/dist/commands/logout/index.js +38 -0
  20. package/dist/commands/logout/index.js.map +1 -0
  21. package/dist/commands/me/index.d.ts +3 -0
  22. package/dist/commands/me/index.d.ts.map +1 -0
  23. package/dist/commands/me/index.js +19 -0
  24. package/dist/commands/me/index.js.map +1 -0
  25. package/dist/config/index.d.ts +14 -0
  26. package/dist/config/index.d.ts.map +1 -0
  27. package/dist/config/index.js +75 -0
  28. package/dist/config/index.js.map +1 -0
  29. package/dist/constants.d.ts +2 -0
  30. package/dist/constants.d.ts.map +1 -0
  31. package/dist/constants.js +5 -0
  32. package/dist/constants.js.map +1 -0
  33. package/dist/env.d.ts +2 -0
  34. package/dist/env.d.ts.map +1 -0
  35. package/dist/env.js +5 -0
  36. package/dist/env.js.map +1 -0
  37. package/dist/index.d.ts +3 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +27 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/logger.d.ts +8 -0
  42. package/dist/logger.d.ts.map +1 -0
  43. package/dist/logger.js +83 -0
  44. package/dist/logger.js.map +1 -0
  45. package/dist/middleware/requireAuth.d.ts +6 -0
  46. package/dist/middleware/requireAuth.d.ts.map +1 -0
  47. package/dist/middleware/requireAuth.js +22 -0
  48. package/dist/middleware/requireAuth.js.map +1 -0
  49. package/dist/types/NgrokToken.d.ts +9 -0
  50. package/dist/types/NgrokToken.d.ts.map +1 -0
  51. package/dist/types/NgrokToken.js +3 -0
  52. package/dist/types/NgrokToken.js.map +1 -0
  53. package/dist/ui.d.ts +12 -0
  54. package/dist/ui.d.ts.map +1 -0
  55. package/dist/ui.js +31 -0
  56. package/dist/ui.js.map +1 -0
  57. package/package.json +59 -0
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const forwardCommand: Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/forward/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4HpC,eAAO,MAAM,cAAc,SAIJ,CAAC"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.forwardCommand = void 0;
7
+ const commander_1 = require("commander");
8
+ const ngrok_1 = __importDefault(require("@ngrok/ngrok"));
9
+ const http_1 = __importDefault(require("http"));
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const config_1 = require("../../config");
12
+ const ui_1 = require("../../ui");
13
+ const constants_1 = require("../../constants");
14
+ const requireAuth_1 = require("../../middleware/requireAuth");
15
+ function timestamp() {
16
+ return chalk_1.default.dim(new Date().toLocaleTimeString());
17
+ }
18
+ /** Logging proxy that forwards requests to the local server and logs them. */
19
+ function createLoggingProxy(targetPort) {
20
+ return new Promise((resolve) => {
21
+ const proxy = http_1.default.createServer((req, res) => {
22
+ const start = Date.now();
23
+ console.log(` ${timestamp()} ${chalk_1.default.cyan("-->")} ${chalk_1.default.bold(req.method)} ${req.url}`);
24
+ const headers = { ...req.headers, host: `localhost:${targetPort}` };
25
+ const proxyReq = http_1.default.request({
26
+ hostname: "localhost",
27
+ port: targetPort,
28
+ path: req.url,
29
+ method: req.method,
30
+ headers,
31
+ }, (proxyRes) => {
32
+ const elapsed = Date.now() - start;
33
+ const status = proxyRes.statusCode || 200;
34
+ const statusColor = status < 400 ? chalk_1.default.green : chalk_1.default.red;
35
+ console.log(` ${timestamp()} ${chalk_1.default.cyan("<--")} ${statusColor(status)} ${chalk_1.default.bold(req.method)} ${req.url} ${(0, ui_1.dim)(`${elapsed}ms`)}`);
36
+ // Strip hop-by-hop headers that must not be forwarded through a proxy
37
+ const responseHeaders = { ...proxyRes.headers };
38
+ delete responseHeaders["transfer-encoding"];
39
+ delete responseHeaders["connection"];
40
+ delete responseHeaders["keep-alive"];
41
+ res.writeHead(status, responseHeaders);
42
+ proxyRes.pipe(res);
43
+ });
44
+ proxyReq.on("error", (err) => {
45
+ const elapsed = Date.now() - start;
46
+ if (err.code === "ECONNREFUSED") {
47
+ console.log(` ${timestamp()} ${chalk_1.default.cyan("<--")} ${chalk_1.default.red("502")} ${chalk_1.default.bold(req.method)} ${req.url} ${(0, ui_1.dim)(`${elapsed}ms`)} ${chalk_1.default.red(`— local server not running on port ${targetPort}`)}`);
48
+ }
49
+ else {
50
+ console.log(` ${timestamp()} ${chalk_1.default.cyan("<--")} ${chalk_1.default.red("502")} ${chalk_1.default.bold(req.method)} ${req.url} ${(0, ui_1.dim)(`${elapsed}ms`)} ${chalk_1.default.red(`— ${err.message}`)}`);
51
+ }
52
+ res.writeHead(502, { "Content-Type": "text/plain" });
53
+ res.end(`Failed to reach localhost:${targetPort}`);
54
+ });
55
+ req.pipe(proxyReq);
56
+ });
57
+ // Listen on a random available port
58
+ proxy.listen(0, "127.0.0.1", () => {
59
+ const addr = proxy.address();
60
+ resolve(addr.port);
61
+ });
62
+ });
63
+ }
64
+ async function forwardAction(opts) {
65
+ const config = (0, config_1.readConfig)();
66
+ const existing = (0, config_1.getActiveTunnel)();
67
+ if (existing) {
68
+ (0, ui_1.error)(`A tunnel is already running on port ${chalk_1.default.bold(existing.port)} (PID ${existing.pid})`);
69
+ (0, ui_1.info)(`Public URL: ${chalk_1.default.underline(existing.url)}`);
70
+ console.log();
71
+ (0, ui_1.info)("Run " + chalk_1.default.bold.cyan(`\`${constants_1.CLI_NAME} kill\``) + " to stop it.");
72
+ process.exit(1);
73
+ }
74
+ const proxyPort = await createLoggingProxy(opts.port);
75
+ const isProduction = true;
76
+ const sanitizedEmail = config.email.replace(/[@.]/g, '-');
77
+ const domain = isProduction
78
+ ? `${config.userId}.tunnel.getdecipher.com`
79
+ : `${sanitizedEmail}-latosha-brashiest-ernestina.ngrok-free.dev`;
80
+ const listener = await ngrok_1.default.forward({
81
+ addr: `127.0.0.1:${proxyPort}`,
82
+ authtoken: config.ngrokToken,
83
+ domain,
84
+ });
85
+ const url = listener.url() || "";
86
+ (0, config_1.writeTunnelState)({
87
+ pid: process.pid,
88
+ port: opts.port,
89
+ url,
90
+ startedAt: new Date().toISOString(),
91
+ });
92
+ (0, ui_1.banner)("Tunnel Active");
93
+ (0, ui_1.label)("Public URL", chalk_1.default.underline(url));
94
+ (0, ui_1.label)("Forwarding", `http://localhost:${opts.port}`);
95
+ console.log();
96
+ (0, ui_1.divider)();
97
+ console.log((0, ui_1.dim)(" Waiting for requests... Press Ctrl+C to stop."));
98
+ (0, ui_1.divider)();
99
+ console.log();
100
+ const cleanup = async () => {
101
+ (0, config_1.clearTunnelState)();
102
+ console.log();
103
+ (0, ui_1.success)("Tunnel closed.");
104
+ await ngrok_1.default.disconnect();
105
+ process.exit(0);
106
+ };
107
+ process.on("SIGINT", cleanup);
108
+ process.on("SIGTERM", cleanup);
109
+ }
110
+ exports.forwardCommand = new commander_1.Command("forward")
111
+ .description("Expose a local server through a Decipher Tunnel")
112
+ .requiredOption("-p, --port <number>", "Local port to tunnel", parseInt)
113
+ .hook("preAction", requireAuth_1.requireAuth)
114
+ .action(forwardAction);
115
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/forward/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const killCommand: Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/kill/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BpC,eAAO,MAAM,WAAW,SAGJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.killCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const config_1 = require("../../config");
6
+ const ui_1 = require("../../ui");
7
+ const requireAuth_1 = require("../../middleware/requireAuth");
8
+ function killAction() {
9
+ const tunnel = (0, config_1.getActiveTunnel)();
10
+ if (!tunnel) {
11
+ (0, ui_1.error)("No active tunnel to kill.");
12
+ process.exit(1);
13
+ }
14
+ (0, ui_1.banner)("Kill Tunnel");
15
+ (0, ui_1.info)(`Stopping tunnel on port ${tunnel.port} (PID ${tunnel.pid})...`);
16
+ try {
17
+ process.kill(tunnel.pid, "SIGTERM");
18
+ (0, config_1.clearTunnelState)();
19
+ (0, ui_1.success)("Tunnel stopped.");
20
+ }
21
+ catch {
22
+ (0, config_1.clearTunnelState)();
23
+ (0, ui_1.success)("Tunnel process already exited. Cleaned up state.");
24
+ }
25
+ console.log();
26
+ }
27
+ exports.killCommand = new commander_1.Command("kill")
28
+ .description("Stop the active tunnel")
29
+ .hook("preAction", requireAuth_1.requireAuth)
30
+ .action(killAction);
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/kill/index.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,yCAAiE;AACjE,iCAAwD;AACxD,8DAA2D;AAE3D,SAAS,UAAU;IAClB,MAAM,MAAM,GAAG,IAAA,wBAAe,GAAE,CAAC;IAEjC,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,IAAA,UAAK,EAAC,2BAA2B,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,IAAA,WAAM,EAAC,aAAa,CAAC,CAAC;IACtB,IAAA,SAAI,EAAC,2BAA2B,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;IAEtE,IAAI,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACpC,IAAA,yBAAgB,GAAE,CAAC;QACnB,IAAA,YAAO,EAAC,iBAAiB,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACR,IAAA,yBAAgB,GAAE,CAAC;QACnB,IAAA,YAAO,EAAC,kDAAkD,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;AACf,CAAC;AAEY,QAAA,WAAW,GAAG,IAAI,mBAAO,CAAC,MAAM,CAAC;KAC5C,WAAW,CAAC,wBAAwB,CAAC;KACrC,IAAI,CAAC,WAAW,EAAE,yBAAW,CAAC;KAC9B,MAAM,CAAC,UAAU,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const listCommand: Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/list/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,eAAO,MAAM,WAAW,SAGJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const config_1 = require("../../config");
6
+ const ui_1 = require("../../ui");
7
+ const requireAuth_1 = require("../../middleware/requireAuth");
8
+ function listAction() {
9
+ const tunnel = (0, config_1.getActiveTunnel)();
10
+ (0, ui_1.banner)("Active Tunnels");
11
+ if (!tunnel) {
12
+ (0, ui_1.info)("No active tunnels.");
13
+ console.log();
14
+ return;
15
+ }
16
+ (0, ui_1.label)("Public URL", tunnel.url);
17
+ (0, ui_1.label)("Local Port", String(tunnel.port));
18
+ (0, ui_1.label)("PID", String(tunnel.pid));
19
+ (0, ui_1.label)("Started", new Date(tunnel.startedAt).toLocaleString());
20
+ console.log();
21
+ }
22
+ exports.listCommand = new commander_1.Command("list")
23
+ .description("List active tunnels")
24
+ .hook("preAction", requireAuth_1.requireAuth)
25
+ .action(listAction);
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/list/index.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,yCAA+C;AAC/C,iCAAoD;AACpD,8DAA2D;AAE3D,SAAS,UAAU;IAClB,MAAM,MAAM,GAAG,IAAA,wBAAe,GAAE,CAAC;IAEjC,IAAA,WAAM,EAAC,gBAAgB,CAAC,CAAC;IAEzB,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,IAAA,SAAI,EAAC,oBAAoB,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO;IACR,CAAC;IAED,IAAA,UAAK,EAAC,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAChC,IAAA,UAAK,EAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,IAAA,UAAK,EAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,IAAA,UAAK,EAAC,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,EAAE,CAAC;AACf,CAAC;AAEY,QAAA,WAAW,GAAG,IAAI,mBAAO,CAAC,MAAM,CAAC;KAC5C,WAAW,CAAC,qBAAqB,CAAC;KAClC,IAAI,CAAC,WAAW,EAAE,yBAAW,CAAC;KAC9B,MAAM,CAAC,UAAU,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const loginCommand: Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/login/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2FpC,eAAO,MAAM,YAAY,SAEJ,CAAC"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loginCommand = void 0;
7
+ const commander_1 = require("commander");
8
+ const child_process_1 = require("child_process");
9
+ const readline_1 = __importDefault(require("readline"));
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const env_1 = require("../../env");
12
+ const config_1 = require("../../config");
13
+ const ui_1 = require("../../ui");
14
+ function openBrowser(url) {
15
+ const platform = process.platform;
16
+ let cmd;
17
+ if (platform === "darwin") {
18
+ cmd = `open "${url}"`;
19
+ }
20
+ else if (platform === "win32") {
21
+ cmd = `start "${url}"`;
22
+ }
23
+ else {
24
+ cmd = `xdg-open "${url}"`;
25
+ }
26
+ (0, child_process_1.exec)(cmd, (err) => {
27
+ if (err) {
28
+ (0, ui_1.warn)("Could not open browser automatically.");
29
+ (0, ui_1.info)("Open this URL manually: " + chalk_1.default.underline(url));
30
+ }
31
+ });
32
+ }
33
+ function prompt(rl, message) {
34
+ return new Promise((resolve) => {
35
+ rl.question(message, (answer) => {
36
+ resolve(answer.trim());
37
+ });
38
+ });
39
+ }
40
+ async function loginAction() {
41
+ const existing = (0, config_1.readConfig)();
42
+ if (existing) {
43
+ (0, ui_1.info)("Already logged in as " + chalk_1.default.bold(existing.email));
44
+ process.exit(0);
45
+ }
46
+ const loginUrl = `${env_1.APP_DOMAIN}/tunnel-login`;
47
+ (0, ui_1.banner)("Login");
48
+ (0, ui_1.info)("Opening browser to: " + chalk_1.default.underline(loginUrl));
49
+ console.log();
50
+ openBrowser(loginUrl);
51
+ const rl = readline_1.default.createInterface({
52
+ input: process.stdin,
53
+ output: process.stdout,
54
+ });
55
+ try {
56
+ while (true) {
57
+ const token = await prompt(rl, chalk_1.default.cyan(" ? ") + "Paste your token here: ");
58
+ if (!token) {
59
+ continue;
60
+ }
61
+ try {
62
+ const res = await fetch(`${env_1.APP_DOMAIN}/api/tunnel/me`, {
63
+ headers: { "TUNNEL-TOKEN": token },
64
+ });
65
+ if (res.ok) {
66
+ const data = (await res.json());
67
+ (0, config_1.writeConfig)(data);
68
+ console.log();
69
+ (0, ui_1.success)("Logged in as " + chalk_1.default.bold(data.email));
70
+ console.log();
71
+ break;
72
+ }
73
+ else if (res.status === 404) {
74
+ (0, ui_1.error)("Bad token, try again.");
75
+ console.log();
76
+ }
77
+ else {
78
+ (0, ui_1.error)(`Unexpected response ${(0, ui_1.dim)(`(${res.status})`)}, try again.`);
79
+ console.log();
80
+ }
81
+ }
82
+ catch (err) {
83
+ (0, ui_1.error)(`Network error: ${err instanceof Error ? err.message : err}`);
84
+ console.log();
85
+ }
86
+ }
87
+ }
88
+ finally {
89
+ rl.close();
90
+ }
91
+ }
92
+ exports.loginCommand = new commander_1.Command("login")
93
+ .description("Authenticate with Decipher and store your tunnel credentials")
94
+ .action(loginAction);
95
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/login/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const logoutCommand: Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/logout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgCpC,eAAO,MAAM,aAAa,SAGJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.logoutCommand = void 0;
7
+ const commander_1 = require("commander");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const env_1 = require("../../env");
10
+ const config_1 = require("../../config");
11
+ const ui_1 = require("../../ui");
12
+ const requireAuth_1 = require("../../middleware/requireAuth");
13
+ async function logoutAction() {
14
+ const config = (0, config_1.readConfig)();
15
+ (0, ui_1.banner)("Logout");
16
+ try {
17
+ const res = await fetch(`${env_1.APP_DOMAIN}/api/tunnel/logout`, {
18
+ method: "POST",
19
+ headers: { "TUNNEL-TOKEN": config.token },
20
+ });
21
+ if (!res.ok) {
22
+ (0, ui_1.error)(`Logout failed ${(0, ui_1.dim)(`(${res.status})`)}. Please try again.`);
23
+ process.exit(1);
24
+ }
25
+ }
26
+ catch (err) {
27
+ (0, ui_1.error)(`Network error: ${err instanceof Error ? err.message : err}. Please try again.`);
28
+ process.exit(1);
29
+ }
30
+ (0, config_1.deleteConfig)();
31
+ (0, ui_1.success)("Logged out " + chalk_1.default.bold(config.email));
32
+ console.log();
33
+ }
34
+ exports.logoutCommand = new commander_1.Command("logout")
35
+ .description("Log out and revoke your tunnel credentials")
36
+ .hook("preAction", requireAuth_1.requireAuth)
37
+ .action(logoutAction);
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/logout/index.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,mCAAuC;AACvC,yCAAwD;AACxD,iCAAuD;AACvD,8DAA2D;AAE3D,KAAK,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAG,CAAC;IAE7B,IAAA,WAAM,EAAC,QAAQ,CAAC,CAAC;IAEjB,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,gBAAU,oBAAoB,EAAE;YAC1D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,KAAK,EAAE;SACzC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACb,IAAA,UAAK,EAAC,iBAAiB,IAAA,QAAG,EAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAA,UAAK,EAAC,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,IAAA,qBAAY,GAAE,CAAC;IACf,IAAA,YAAO,EAAC,aAAa,GAAG,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,EAAE,CAAC;AACf,CAAC;AAEY,QAAA,aAAa,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC;KAChD,WAAW,CAAC,4CAA4C,CAAC;KACzD,IAAI,CAAC,WAAW,EAAE,yBAAW,CAAC;KAC9B,MAAM,CAAC,YAAY,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const meCommand: Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/me/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,eAAO,MAAM,SAAS,SAGJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.meCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const config_1 = require("../../config");
6
+ const ui_1 = require("../../ui");
7
+ const requireAuth_1 = require("../../middleware/requireAuth");
8
+ function meAction() {
9
+ const config = (0, config_1.readConfig)();
10
+ (0, ui_1.banner)("Profile");
11
+ (0, ui_1.label)("Email", config.email);
12
+ (0, ui_1.label)("User ID", config.userId);
13
+ console.log();
14
+ }
15
+ exports.meCommand = new commander_1.Command("me")
16
+ .description("Display the currently logged-in user")
17
+ .hook("preAction", requireAuth_1.requireAuth)
18
+ .action(meAction);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/me/index.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,yCAA0C;AAC1C,iCAAyC;AACzC,8DAA2D;AAE3D,SAAS,QAAQ;IAChB,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAG,CAAC;IAE7B,IAAA,WAAM,EAAC,SAAS,CAAC,CAAC;IAClB,IAAA,UAAK,EAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAA,UAAK,EAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,EAAE,CAAC;AACf,CAAC;AAEY,QAAA,SAAS,GAAG,IAAI,mBAAO,CAAC,IAAI,CAAC;KACxC,WAAW,CAAC,sCAAsC,CAAC;KACnD,IAAI,CAAC,WAAW,EAAE,yBAAW,CAAC;KAC9B,MAAM,CAAC,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import NgrokToken from "../types/NgrokToken";
2
+ export declare function readConfig(): NgrokToken | null;
3
+ export declare function writeConfig(config: NgrokToken): void;
4
+ export declare function deleteConfig(): void;
5
+ export interface TunnelState {
6
+ pid: number;
7
+ port: number;
8
+ url: string;
9
+ startedAt: string;
10
+ }
11
+ export declare function getActiveTunnel(): TunnelState | null;
12
+ export declare function writeTunnelState(state: TunnelState): void;
13
+ export declare function clearTunnelState(): void;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAK7C,wBAAgB,UAAU,IAAI,UAAU,GAAG,IAAI,CAO9C;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAGpD;AAED,wBAAgB,YAAY,IAAI,IAAI,CAMnC;AAID,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CAClB;AAaD,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAapD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAGzD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAMvC"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.readConfig = readConfig;
7
+ exports.writeConfig = writeConfig;
8
+ exports.deleteConfig = deleteConfig;
9
+ exports.getActiveTunnel = getActiveTunnel;
10
+ exports.writeTunnelState = writeTunnelState;
11
+ exports.clearTunnelState = clearTunnelState;
12
+ const fs_1 = __importDefault(require("fs"));
13
+ const path_1 = __importDefault(require("path"));
14
+ const os_1 = __importDefault(require("os"));
15
+ const CONFIG_DIR = path_1.default.join(os_1.default.homedir(), ".decipher");
16
+ const CONFIG_PATH = path_1.default.join(CONFIG_DIR, "config.json");
17
+ function readConfig() {
18
+ try {
19
+ const data = fs_1.default.readFileSync(CONFIG_PATH, "utf-8");
20
+ return JSON.parse(data);
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ function writeConfig(config) {
27
+ fs_1.default.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
28
+ fs_1.default.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), { mode: 0o600 });
29
+ }
30
+ function deleteConfig() {
31
+ try {
32
+ fs_1.default.unlinkSync(CONFIG_PATH);
33
+ }
34
+ catch {
35
+ // already gone
36
+ }
37
+ }
38
+ const TUNNEL_STATE_PATH = path_1.default.join(CONFIG_DIR, "tunnel.json");
39
+ function isProcessRunning(pid) {
40
+ try {
41
+ process.kill(pid, 0);
42
+ return true;
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ }
48
+ function getActiveTunnel() {
49
+ try {
50
+ const data = fs_1.default.readFileSync(TUNNEL_STATE_PATH, "utf-8");
51
+ const state = JSON.parse(data);
52
+ if (isProcessRunning(state.pid)) {
53
+ return state;
54
+ }
55
+ // Stale state — process no longer running
56
+ clearTunnelState();
57
+ return null;
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ function writeTunnelState(state) {
64
+ fs_1.default.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
65
+ fs_1.default.writeFileSync(TUNNEL_STATE_PATH, JSON.stringify(state, null, 2), { mode: 0o600 });
66
+ }
67
+ function clearTunnelState() {
68
+ try {
69
+ fs_1.default.unlinkSync(TUNNEL_STATE_PATH);
70
+ }
71
+ catch {
72
+ // already gone
73
+ }
74
+ }
75
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":";;;;;AAQA,gCAOC;AAED,kCAGC;AAED,oCAMC;AAsBD,0CAaC;AAED,4CAGC;AAED,4CAMC;AA5ED,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAGpB,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AACxD,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,SAAgB,UAAU;IACzB,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,SAAgB,WAAW,CAAC,MAAkB;IAC7C,YAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,SAAgB,YAAY;IAC3B,IAAI,CAAC;QACJ,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACR,eAAe;IAChB,CAAC;AACF,CAAC;AAWD,MAAM,iBAAiB,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAE/D,SAAS,gBAAgB,CAAC,GAAW;IACpC,IAAI,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED,SAAgB,eAAe;IAC9B,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,YAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC;QAC9C,IAAI,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACd,CAAC;QACD,0CAA0C;QAC1C,gBAAgB,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,SAAgB,gBAAgB,CAAC,KAAkB;IAClD,YAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,YAAE,CAAC,aAAa,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,SAAgB,gBAAgB;IAC/B,IAAI,CAAC;QACJ,YAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACR,eAAe;IAChB,CAAC;AACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const CLI_NAME = "decipher-tunnel";
2
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,oBAAoB,CAAC"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CLI_NAME = void 0;
4
+ exports.CLI_NAME = "decipher-tunnel";
5
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,QAAQ,GAAG,iBAAiB,CAAC"}
package/dist/env.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare const APP_DOMAIN = "https://app.getdecipher.com";
2
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,UAAU,gCAAgC,CAAC"}
package/dist/env.js ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.APP_DOMAIN = void 0;
4
+ exports.APP_DOMAIN = "https://app.getdecipher.com";
5
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":";;;AACa,QAAA,UAAU,GAAG,6BAA6B,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import "./env";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,OAAO,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ require("./env");
5
+ const commander_1 = require("commander");
6
+ const constants_1 = require("./constants");
7
+ const forward_1 = require("./commands/forward");
8
+ const login_1 = require("./commands/login");
9
+ const me_1 = require("./commands/me");
10
+ const logout_1 = require("./commands/logout");
11
+ const list_1 = require("./commands/list");
12
+ const kill_1 = require("./commands/kill");
13
+ const program = new commander_1.Command();
14
+ program
15
+ .name(constants_1.CLI_NAME)
16
+ .description("Decipher local tunnel CLI")
17
+ .configureHelp({
18
+ subcommandTerm: (cmd) => cmd.name(),
19
+ });
20
+ program.addCommand(forward_1.forwardCommand);
21
+ program.addCommand(login_1.loginCommand);
22
+ program.addCommand(logout_1.logoutCommand);
23
+ program.addCommand(me_1.meCommand);
24
+ program.addCommand(list_1.listCommand);
25
+ program.addCommand(kill_1.killCommand);
26
+ program.parse();
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,iBAAe;AACf,yCAAoC;AACpC,2CAAuC;AACvC,gDAAoD;AACpD,4CAAgD;AAChD,sCAA0C;AAC1C,8CAAkD;AAClD,0CAA8C;AAC9C,0CAA8C;AAE9C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACL,IAAI,CAAC,oBAAQ,CAAC;KACd,WAAW,CAAC,2BAA2B,CAAC;KACxC,aAAa,CAAC;IACd,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE;CACnC,CAAC,CAAC;AAEJ,OAAO,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,cAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,kBAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,kBAAW,CAAC,CAAC;AAEhC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ declare const logger: {
2
+ info: (...args: unknown[]) => void;
3
+ warn: (...args: unknown[]) => void;
4
+ error: (...args: unknown[]) => void;
5
+ flush: () => Promise<void>;
6
+ };
7
+ export default logger;
8
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAsEA,QAAA,MAAM,MAAM;oBACK,OAAO,EAAE;oBACT,OAAO,EAAE;qBACR,OAAO,EAAE;;CAS1B,CAAC;AAEF,eAAe,MAAM,CAAC"}
package/dist/logger.js ADDED
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const crypto_1 = __importDefault(require("crypto"));
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const config_1 = require("./config");
11
+ const AXIOM_TOKEN = "REPLACE_ME";
12
+ const AXIOM_DATASET = "REPLACE_ME";
13
+ const CONFIG_DIR = path_1.default.join(os_1.default.homedir(), ".decipher");
14
+ const INSTALL_ID_PATH = path_1.default.join(CONFIG_DIR, "installation-id");
15
+ function getInstallationId() {
16
+ try {
17
+ return fs_1.default.readFileSync(INSTALL_ID_PATH, "utf-8").trim();
18
+ }
19
+ catch {
20
+ const id = crypto_1.default.randomUUID();
21
+ fs_1.default.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
22
+ fs_1.default.writeFileSync(INSTALL_ID_PATH, id, { mode: 0o600 });
23
+ return id;
24
+ }
25
+ }
26
+ const installationId = getInstallationId();
27
+ let axiomClient = null;
28
+ async function getAxiom() {
29
+ if (!axiomClient) {
30
+ const { Axiom } = await import("@axiomhq/js");
31
+ axiomClient = new Axiom({ token: AXIOM_TOKEN });
32
+ }
33
+ return axiomClient;
34
+ }
35
+ function getContext() {
36
+ const config = (0, config_1.readConfig)();
37
+ return {
38
+ installationId,
39
+ email: config?.email ?? "unknown",
40
+ };
41
+ }
42
+ function serializeArg(arg) {
43
+ if (arg instanceof Error) {
44
+ return JSON.stringify({ message: arg.message, stack: arg.stack });
45
+ }
46
+ if (typeof arg === "object") {
47
+ return JSON.stringify(arg);
48
+ }
49
+ return String(arg);
50
+ }
51
+ async function send(level, args) {
52
+ try {
53
+ const axiom = await getAxiom();
54
+ const message = args.map(serializeArg).join(" ");
55
+ axiom.ingest(AXIOM_DATASET, [
56
+ {
57
+ level,
58
+ message,
59
+ ...getContext(),
60
+ timestamp: new Date().toISOString(),
61
+ },
62
+ ]);
63
+ }
64
+ catch {
65
+ // Silent — never surface logging errors to the user
66
+ }
67
+ }
68
+ const logger = {
69
+ info: (...args) => { send("info", args); },
70
+ warn: (...args) => { send("warn", args); },
71
+ error: (...args) => { send("error", args); },
72
+ flush: async () => {
73
+ try {
74
+ const axiom = await getAxiom();
75
+ await axiom.flush();
76
+ }
77
+ catch {
78
+ // Silent
79
+ }
80
+ },
81
+ };
82
+ exports.default = logger;
83
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";;;;;AAAA,oDAA4B;AAC5B,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AACpB,qCAAsC;AAEtC,MAAM,WAAW,GAAG,YAAY,CAAC;AACjC,MAAM,aAAa,GAAG,YAAY,CAAC;AAEnC,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AACxD,MAAM,eAAe,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;AAEjE,SAAS,iBAAiB;IACzB,IAAI,CAAC;QACJ,OAAO,YAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,EAAE,GAAG,gBAAM,CAAC,UAAU,EAAE,CAAC;QAC/B,YAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,YAAE,CAAC,aAAa,CAAC,eAAe,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAED,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;AAE3C,IAAI,WAAW,GAAmG,IAAI,CAAC;AAEvH,KAAK,UAAU,QAAQ;IACtB,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAC9C,WAAW,GAAG,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,WAAW,CAAC;AACpB,CAAC;AAED,SAAS,UAAU;IAClB,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,OAAO;QACN,cAAc;QACd,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,SAAS;KACjC,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAY;IACjC,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,KAAa,EAAE,IAAe;IACjD,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjD,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE;YAC3B;gBACC,KAAK;gBACL,OAAO;gBACP,GAAG,UAAU,EAAE;gBACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACnC;SACD,CAAC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACR,oDAAoD;IACrD,CAAC;AACF,CAAC;AAED,MAAM,MAAM,GAAG;IACd,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACrD,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACvD,KAAK,EAAE,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACJ,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACR,SAAS;QACV,CAAC;IACF,CAAC;CACD,CAAC;AAEF,kBAAe,MAAM,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Commander preAction hook that exits early if the user is not logged in.
3
+ * Usage: command.hook('preAction', requireAuth)
4
+ */
5
+ export declare function requireAuth(): void;
6
+ //# sourceMappingURL=requireAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requireAuth.d.ts","sourceRoot":"","sources":["../../src/middleware/requireAuth.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAMlC"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.requireAuth = requireAuth;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const config_1 = require("../config");
9
+ const ui_1 = require("../ui");
10
+ const constants_1 = require("../constants");
11
+ /**
12
+ * Commander preAction hook that exits early if the user is not logged in.
13
+ * Usage: command.hook('preAction', requireAuth)
14
+ */
15
+ function requireAuth() {
16
+ const config = (0, config_1.readConfig)();
17
+ if (!config) {
18
+ (0, ui_1.error)("Not logged in. Run " + chalk_1.default.bold.cyan(`\`${constants_1.CLI_NAME} login\``) + " first.");
19
+ process.exit(1);
20
+ }
21
+ }
22
+ //# sourceMappingURL=requireAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requireAuth.js","sourceRoot":"","sources":["../../src/middleware/requireAuth.ts"],"names":[],"mappings":";;;;;AASA,kCAMC;AAfD,kDAA0B;AAC1B,sCAAuC;AACvC,8BAA8B;AAC9B,4CAAwC;AAExC;;;GAGG;AACH,SAAgB,WAAW;IAC1B,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,IAAA,UAAK,EAAC,qBAAqB,GAAG,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,oBAAQ,UAAU,CAAC,GAAG,SAAS,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface NgrokToken {
2
+ token: string;
3
+ email: string;
4
+ userId: string;
5
+ ngrokToken: string;
6
+ created_at: string;
7
+ }
8
+ export default NgrokToken;
9
+ //# sourceMappingURL=NgrokToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NgrokToken.d.ts","sourceRoot":"","sources":["../../src/types/NgrokToken.ts"],"names":[],"mappings":"AAAA,UAAU,UAAU;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,eAAe,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=NgrokToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NgrokToken.js","sourceRoot":"","sources":["../../src/types/NgrokToken.ts"],"names":[],"mappings":""}
package/dist/ui.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ import chalk from "chalk";
2
+ export declare const brand: chalk.Chalk;
3
+ export declare const dim: chalk.Chalk;
4
+ export declare const bold: chalk.Chalk;
5
+ export declare const success: (msg: string) => void;
6
+ export declare const error: (msg: string) => void;
7
+ export declare const info: (msg: string) => void;
8
+ export declare const warn: (msg: string) => void;
9
+ export declare const label: (key: string, value: string) => void;
10
+ export declare function banner(title: string): void;
11
+ export declare function divider(): void;
12
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,eAAO,MAAM,KAAK,aAAuB,CAAC;AAC1C,eAAO,MAAM,GAAG,aAAY,CAAC;AAC7B,eAAO,MAAM,IAAI,aAAa,CAAC;AAE/B,eAAO,MAAM,OAAO,GAAI,KAAK,MAAM,SAA2C,CAAC;AAC/E,eAAO,MAAM,KAAK,GAAI,KAAK,MAAM,SAA2C,CAAC;AAC7E,eAAO,MAAM,IAAI,GAAI,KAAK,MAAM,SAA0C,CAAC;AAC3E,eAAO,MAAM,IAAI,GAAI,KAAK,MAAM,SAA4C,CAAC;AAE7E,eAAO,MAAM,KAAK,GAAI,KAAK,MAAM,EAAE,OAAO,MAAM,SACM,CAAC;AAEvD,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI1C;AAED,wBAAgB,OAAO,IAAI,IAAI,CAE9B"}
package/dist/ui.js ADDED
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.label = exports.warn = exports.info = exports.error = exports.success = exports.bold = exports.dim = exports.brand = void 0;
7
+ exports.banner = banner;
8
+ exports.divider = divider;
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ exports.brand = chalk_1.default.hex("#6C5CE7");
11
+ exports.dim = chalk_1.default.dim;
12
+ exports.bold = chalk_1.default.bold;
13
+ const success = (msg) => console.log(chalk_1.default.green(" + ") + msg);
14
+ exports.success = success;
15
+ const error = (msg) => console.error(chalk_1.default.red(" x ") + msg);
16
+ exports.error = error;
17
+ const info = (msg) => console.log(chalk_1.default.cyan(" * ") + msg);
18
+ exports.info = info;
19
+ const warn = (msg) => console.log(chalk_1.default.yellow(" ! ") + msg);
20
+ exports.warn = warn;
21
+ const label = (key, value) => console.log((0, exports.dim)(" " + key.padEnd(12)) + (0, exports.bold)(value));
22
+ exports.label = label;
23
+ function banner(title) {
24
+ console.log();
25
+ console.log(" " + (0, exports.brand)(">>") + (0, exports.bold)(" Decipher Tunnel ") + (0, exports.brand)("<<") + " " + (0, exports.dim)(title));
26
+ console.log();
27
+ }
28
+ function divider() {
29
+ console.log((0, exports.dim)(" " + "-".repeat(46)));
30
+ }
31
+ //# sourceMappingURL=ui.js.map
package/dist/ui.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":";;;;;;AAcA,wBAIC;AAED,0BAEC;AAtBD,kDAA0B;AAEb,QAAA,KAAK,GAAG,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC7B,QAAA,GAAG,GAAG,eAAK,CAAC,GAAG,CAAC;AAChB,QAAA,IAAI,GAAG,eAAK,CAAC,IAAI,CAAC;AAExB,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;AAAlE,QAAA,OAAO,WAA2D;AACxE,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;AAAhE,QAAA,KAAK,SAA2D;AACtE,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;AAA9D,QAAA,IAAI,QAA0D;AACpE,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;AAAhE,QAAA,IAAI,QAA4D;AAEtE,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE,CACnD,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,IAAA,YAAI,EAAC,KAAK,CAAC,CAAC,CAAC;AAD1C,QAAA,KAAK,SACqC;AAEvD,SAAgB,MAAM,CAAC,KAAa;IACnC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAA,aAAK,EAAC,IAAI,CAAC,GAAG,IAAA,YAAI,EAAC,mBAAmB,CAAC,GAAG,IAAA,aAAK,EAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAA,WAAG,EAAC,KAAK,CAAC,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,EAAE,CAAC;AACf,CAAC;AAED,SAAgB,OAAO;IACtB,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "decipher-tunnel",
3
+ "version": "1.0.0",
4
+ "bin": {
5
+ "decipher-tunnel": "./dist/index.js"
6
+ },
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "default": "./dist/index.js"
16
+ }
17
+ },
18
+ "scripts": {
19
+ "build": "tsc -p tsconfig.json",
20
+ "check-types": "tsc -p tsconfig.json --noEmit",
21
+ "clean": "rm -rf dist tsconfig.tsbuildinfo",
22
+ "prepublishOnly": "npm run build",
23
+ "dev": "nodemon -e ts,js --exec ts-node -r tsconfig-paths/register ./src/index.ts"
24
+ },
25
+ "author": "Decipher AI",
26
+ "license": "UNLICENSED",
27
+ "description": "Decipher Tunnel CLI — expose local servers through secure tunnels for Decipher session replay and debugging.",
28
+ "keywords": [
29
+ "decipher",
30
+ "tunnel",
31
+ "ngrok",
32
+ "local-tunnel",
33
+ "debugging",
34
+ "session-replay",
35
+ "cli"
36
+ ],
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/decipherai/decipher.git",
40
+ "directory": "local-tunnel-bin"
41
+ },
42
+ "homepage": "https://getdecipher.com",
43
+ "engines": {
44
+ "node": ">=18"
45
+ },
46
+ "dependencies": {
47
+ "@axiomhq/js": "^1.4.0",
48
+ "@ngrok/ngrok": "^1.4.1",
49
+ "chalk": "^4.1.2",
50
+ "commander": "^12.1.0"
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "^24.5.0",
54
+ "nodemon": "^3.1.10",
55
+ "ts-node": "^10.9.2",
56
+ "tsconfig-paths": "^4.2.0",
57
+ "typescript": "^5.4.3"
58
+ }
59
+ }