@decipher-sdk/decipher-tunnel 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +80 -0
- package/dist/commands/forward/index.d.ts +3 -0
- package/dist/commands/forward/index.d.ts.map +1 -0
- package/dist/commands/forward/index.js +115 -0
- package/dist/commands/forward/index.js.map +1 -0
- package/dist/commands/kill/index.d.ts +3 -0
- package/dist/commands/kill/index.d.ts.map +1 -0
- package/dist/commands/kill/index.js +31 -0
- package/dist/commands/kill/index.js.map +1 -0
- package/dist/commands/list/index.d.ts +3 -0
- package/dist/commands/list/index.d.ts.map +1 -0
- package/dist/commands/list/index.js +26 -0
- package/dist/commands/list/index.js.map +1 -0
- package/dist/commands/login/index.d.ts +3 -0
- package/dist/commands/login/index.d.ts.map +1 -0
- package/dist/commands/login/index.js +95 -0
- package/dist/commands/login/index.js.map +1 -0
- package/dist/commands/logout/index.d.ts +3 -0
- package/dist/commands/logout/index.d.ts.map +1 -0
- package/dist/commands/logout/index.js +38 -0
- package/dist/commands/logout/index.js.map +1 -0
- package/dist/commands/me/index.d.ts +3 -0
- package/dist/commands/me/index.d.ts.map +1 -0
- package/dist/commands/me/index.js +19 -0
- package/dist/commands/me/index.js.map +1 -0
- package/dist/config/index.d.ts +14 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +75 -0
- package/dist/config/index.js.map +1 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +5 -0
- package/dist/constants.js.map +1 -0
- package/dist/env.d.ts +2 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +5 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +8 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +88 -0
- package/dist/logger.js.map +1 -0
- package/dist/middleware/requireAuth.d.ts +6 -0
- package/dist/middleware/requireAuth.d.ts.map +1 -0
- package/dist/middleware/requireAuth.js +22 -0
- package/dist/middleware/requireAuth.js.map +1 -0
- package/dist/types/NgrokToken.d.ts +9 -0
- package/dist/types/NgrokToken.d.ts.map +1 -0
- package/dist/types/NgrokToken.js +3 -0
- package/dist/types/NgrokToken.js.map +1 -0
- package/dist/ui.d.ts +12 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +31 -0
- package/dist/ui.js.map +1 -0
- package/package.json +51 -0
package/README.md
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Decipher Tunnel CLI
|
|
2
|
+
|
|
3
|
+
Expose your local development server to the internet so Decipher can run tests against it.
|
|
4
|
+
|
|
5
|
+
## Why
|
|
6
|
+
|
|
7
|
+
Decipher's test runner needs a publicly reachable URL to interact with your app. `decipher-tunnel` creates a secure tunnel from a public URL to your local machine using ngrok, so you can run Decipher tests without deploying.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install @decipher-sdk/decipher-tunnel -g
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Commands
|
|
16
|
+
|
|
17
|
+
### `login`
|
|
18
|
+
|
|
19
|
+
Authenticate with your Decipher account. Opens a browser window where you copy a token and paste it back into the terminal.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
decipher-tunnel login
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### `logout`
|
|
26
|
+
|
|
27
|
+
Revoke your credentials and remove stored authentication.
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
decipher-tunnel logout
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### `forward`
|
|
34
|
+
|
|
35
|
+
Start a tunnel to expose a local port.
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
decipher-tunnel forward -p <port>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
| Flag | Description |
|
|
42
|
+
| --------------------- | ----------------------------------- |
|
|
43
|
+
| `-p, --port <number>` | **(required)** Local port to tunnel |
|
|
44
|
+
|
|
45
|
+
While running, all proxied requests are logged:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
[12:34:56] --> GET /api/users
|
|
49
|
+
[12:34:56] <-- 200 GET /api/users 42ms
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Only one tunnel can be active at a time. Use `kill` to stop a running tunnel before starting a new one.
|
|
53
|
+
|
|
54
|
+
### `me`
|
|
55
|
+
|
|
56
|
+
Show the currently authenticated user.
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
decipher-tunnel me
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### `list`
|
|
63
|
+
|
|
64
|
+
Show the active tunnel (public URL, local port, PID, start time).
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
decipher-tunnel list
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### `kill`
|
|
71
|
+
|
|
72
|
+
Stop the active tunnel.
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
decipher-tunnel kill
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Requirements
|
|
79
|
+
|
|
80
|
+
- Node.js >= 18
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":";;;;;;AAAA,yCAAoC;AACpC,iDAAqC;AACrC,wDAAgC;AAChC,kDAA0B;AAC1B,mCAAuC;AACvC,yCAAuD;AAEvD,iCAAmE;AAEnE,SAAS,WAAW,CAAC,GAAW;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,GAAW,CAAC;IAChB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC3B,GAAG,GAAG,SAAS,GAAG,GAAG,CAAC;IACvB,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,GAAG,GAAG,UAAU,GAAG,GAAG,CAAC;IACxB,CAAC;SAAM,CAAC;QACP,GAAG,GAAG,aAAa,GAAG,GAAG,CAAC;IAC3B,CAAC;IACD,IAAA,oBAAI,EAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE;QACjB,IAAI,GAAG,EAAE,CAAC;YACT,IAAA,SAAI,EAAC,uCAAuC,CAAC,CAAC;YAC9C,IAAA,SAAI,EAAC,0BAA0B,GAAG,eAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACzD,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,EAAsB,EAAE,OAAe;IACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW;IACzB,MAAM,QAAQ,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC9B,IAAI,QAAQ,EAAE,CAAC;QACd,IAAA,SAAI,EAAC,uBAAuB,GAAG,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,gBAAU,eAAe,CAAC;IAE9C,IAAA,WAAM,EAAC,OAAO,CAAC,CAAC;IAChB,IAAA,SAAI,EAAC,sBAAsB,GAAG,eAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEtB,MAAM,EAAE,GAAG,kBAAQ,CAAC,eAAe,CAAC;QACnC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACtB,CAAC,CAAC;IAEH,IAAI,CAAC;QACJ,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,EAAE,EAAE,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,yBAAyB,CAAC,CAAC;YAE/E,IAAI,CAAC,KAAK,EAAE,CAAC;gBACZ,SAAS;YACV,CAAC;YAED,IAAI,CAAC;gBACJ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,gBAAU,gBAAgB,EAAE;oBACtD,OAAO,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE;iBAClC,CAAC,CAAC;gBAEH,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAe,CAAC;oBAC9C,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;oBAClB,OAAO,CAAC,GAAG,EAAE,CAAC;oBACd,IAAA,YAAO,EAAC,eAAe,GAAG,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;oBAClD,OAAO,CAAC,GAAG,EAAE,CAAC;oBACd,MAAM;gBACP,CAAC;qBAAM,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC/B,IAAA,UAAK,EAAC,uBAAuB,CAAC,CAAC;oBAC/B,OAAO,CAAC,GAAG,EAAE,CAAC;gBACf,CAAC;qBAAM,CAAC;oBACP,IAAA,UAAK,EAAC,uBAAuB,IAAA,QAAG,EAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,CAAC;oBACnE,OAAO,CAAC,GAAG,EAAE,CAAC;gBACf,CAAC;YACF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,IAAA,UAAK,EAAC,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;gBACpE,OAAO,CAAC,GAAG,EAAE,CAAC;YACf,CAAC;QACF,CAAC;IACF,CAAC;YAAS,CAAC;QACV,EAAE,CAAC,KAAK,EAAE,CAAC;IACZ,CAAC;AACF,CAAC;AAEY,QAAA,YAAY,GAAG,IAAI,mBAAO,CAAC,OAAO,CAAC;KAC9C,WAAW,CAAC,8DAA8D,CAAC;KAC3E,MAAM,CAAC,WAAW,CAAC,CAAC"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,oBAAoB,CAAC"}
|
|
@@ -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 @@
|
|
|
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
package/dist/env.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":";;;AACa,QAAA,UAAU,GAAG,6BAA6B,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -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,28 @@
|
|
|
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
|
+
.version("1.0.0", "-v, --version")
|
|
18
|
+
.configureHelp({
|
|
19
|
+
subcommandTerm: (cmd) => cmd.name(),
|
|
20
|
+
});
|
|
21
|
+
program.addCommand(forward_1.forwardCommand);
|
|
22
|
+
program.addCommand(login_1.loginCommand);
|
|
23
|
+
program.addCommand(logout_1.logoutCommand);
|
|
24
|
+
program.addCommand(me_1.meCommand);
|
|
25
|
+
program.addCommand(list_1.listCommand);
|
|
26
|
+
program.addCommand(kill_1.killCommand);
|
|
27
|
+
program.parse();
|
|
28
|
+
//# 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,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC;KACjC,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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAwEA,QAAA,MAAM,MAAM;oBACK,OAAO,EAAE;oBACT,OAAO,EAAE;qBACR,OAAO,EAAE;;CAU1B,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
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 = process.env.AXIOM_TOKEN || "";
|
|
12
|
+
const AXIOM_DATASET = process.env.AXIOM_DATASET || "";
|
|
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
|
+
const enabled = Boolean(AXIOM_TOKEN && AXIOM_DATASET);
|
|
28
|
+
let axiomClient = null;
|
|
29
|
+
async function getAxiom() {
|
|
30
|
+
if (!axiomClient) {
|
|
31
|
+
const { Axiom } = await import("@axiomhq/js");
|
|
32
|
+
axiomClient = new Axiom({ token: AXIOM_TOKEN });
|
|
33
|
+
}
|
|
34
|
+
return axiomClient;
|
|
35
|
+
}
|
|
36
|
+
function getContext() {
|
|
37
|
+
const config = (0, config_1.readConfig)();
|
|
38
|
+
return {
|
|
39
|
+
installationId,
|
|
40
|
+
email: config?.email ?? "unknown",
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function serializeArg(arg) {
|
|
44
|
+
if (arg instanceof Error) {
|
|
45
|
+
return JSON.stringify({ message: arg.message, stack: arg.stack });
|
|
46
|
+
}
|
|
47
|
+
if (typeof arg === "object") {
|
|
48
|
+
return JSON.stringify(arg);
|
|
49
|
+
}
|
|
50
|
+
return String(arg);
|
|
51
|
+
}
|
|
52
|
+
async function send(level, args) {
|
|
53
|
+
if (!enabled)
|
|
54
|
+
return;
|
|
55
|
+
try {
|
|
56
|
+
const axiom = await getAxiom();
|
|
57
|
+
const message = args.map(serializeArg).join(" ");
|
|
58
|
+
axiom.ingest(AXIOM_DATASET, [
|
|
59
|
+
{
|
|
60
|
+
level,
|
|
61
|
+
message,
|
|
62
|
+
...getContext(),
|
|
63
|
+
timestamp: new Date().toISOString(),
|
|
64
|
+
},
|
|
65
|
+
]);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Silent — never surface logging errors to the user
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const logger = {
|
|
72
|
+
info: (...args) => { send("info", args); },
|
|
73
|
+
warn: (...args) => { send("warn", args); },
|
|
74
|
+
error: (...args) => { send("error", args); },
|
|
75
|
+
flush: async () => {
|
|
76
|
+
if (!enabled)
|
|
77
|
+
return;
|
|
78
|
+
try {
|
|
79
|
+
const axiom = await getAxiom();
|
|
80
|
+
await axiom.flush();
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Silent
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
exports.default = logger;
|
|
88
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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
|
package/dist/ui.d.ts.map
ADDED
|
@@ -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,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@decipher-sdk/decipher-tunnel",
|
|
3
|
+
"version": "0.0.1",
|
|
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 testing on local urls.",
|
|
28
|
+
"keywords": [
|
|
29
|
+
"decipher",
|
|
30
|
+
"tunnel",
|
|
31
|
+
"ngrok",
|
|
32
|
+
"local-tunnel"
|
|
33
|
+
],
|
|
34
|
+
"homepage": "https://getdecipher.com",
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=18"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@axiomhq/js": "^1.4.0",
|
|
40
|
+
"@ngrok/ngrok": "^1.4.1",
|
|
41
|
+
"chalk": "^4.1.2",
|
|
42
|
+
"commander": "^12.1.0"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^24.5.0",
|
|
46
|
+
"nodemon": "^3.1.10",
|
|
47
|
+
"ts-node": "^10.9.2",
|
|
48
|
+
"tsconfig-paths": "^4.2.0",
|
|
49
|
+
"typescript": "^5.4.3"
|
|
50
|
+
}
|
|
51
|
+
}
|