tapflow 0.3.1 → 0.4.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.
- package/README.md +5 -7
- package/bin/postinstall.js +3 -1
- package/dist/commands/admin-init.d.ts +5 -0
- package/dist/commands/admin-init.d.ts.map +1 -0
- package/dist/commands/admin-init.js +68 -0
- package/dist/commands/admin-init.js.map +1 -0
- package/dist/commands/agent-start.d.ts.map +1 -1
- package/dist/commands/agent-start.js +2 -1
- package/dist/commands/agent-start.js.map +1 -1
- package/dist/commands/init.d.ts +4 -3
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +143 -75
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +3 -1
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/relay-start.d.ts +1 -0
- package/dist/commands/relay-start.d.ts.map +1 -1
- package/dist/commands/relay-start.js +65 -12
- package/dist/commands/relay-start.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +8 -6
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +3 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/index.js +15 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/download-binary.d.ts +7 -0
- package/dist/lib/download-binary.d.ts.map +1 -0
- package/dist/lib/download-binary.js +112 -0
- package/dist/lib/download-binary.js.map +1 -0
- package/dist/lib/print.d.ts +2 -0
- package/dist/lib/print.d.ts.map +1 -1
- package/dist/lib/print.js +19 -3
- package/dist/lib/print.js.map +1 -1
- package/dist/lib/rathole-tunnel.d.ts +23 -0
- package/dist/lib/rathole-tunnel.d.ts.map +1 -0
- package/dist/lib/rathole-tunnel.js +125 -0
- package/dist/lib/rathole-tunnel.js.map +1 -0
- package/dist/lib/ssh.d.ts +8 -0
- package/dist/lib/ssh.d.ts.map +1 -0
- package/dist/lib/ssh.js +41 -0
- package/dist/lib/ssh.js.map +1 -0
- package/dist/lib/tailscale-tunnel.d.ts +15 -0
- package/dist/lib/tailscale-tunnel.d.ts.map +1 -0
- package/dist/lib/tailscale-tunnel.js +49 -0
- package/dist/lib/tailscale-tunnel.js.map +1 -0
- package/dist/lib/tunnel.d.ts +9 -0
- package/dist/lib/tunnel.d.ts.map +1 -0
- package/dist/lib/tunnel.js +2 -0
- package/dist/lib/tunnel.js.map +1 -0
- package/package.json +7 -6
- package/dist/lib/init-config.d.ts +0 -2
- package/dist/lib/init-config.d.ts.map +0 -1
- package/dist/lib/init-config.js +0 -22
- package/dist/lib/init-config.js.map +0 -1
package/dist/commands/start.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { RelayServer, initDb, config } from '@tapflowio/relay';
|
|
2
2
|
import { AgentRegistry } from '@tapflowio/agent-core';
|
|
3
|
+
import fs from 'fs';
|
|
3
4
|
import path from 'path';
|
|
4
5
|
import '@tapflowio/ios-agent';
|
|
5
6
|
import '@tapflowio/android-agent';
|
|
6
|
-
import { banner, createSpinner, step } from '../lib/print.js';
|
|
7
|
-
|
|
8
|
-
const RELAY_PORT = 4000;
|
|
7
|
+
import { banner, createSpinner, step, warn } from '../lib/print.js';
|
|
8
|
+
const RELAY_PORT = config.local.port;
|
|
9
9
|
export async function cmdStart(opts) {
|
|
10
10
|
const relayUrl = `ws://localhost:${RELAY_PORT}`;
|
|
11
11
|
const explicit = opts.platform;
|
|
@@ -24,9 +24,11 @@ export async function cmdStart(opts) {
|
|
|
24
24
|
platformsToRun = [explicit];
|
|
25
25
|
}
|
|
26
26
|
// ── 1. Relay (always local) ───────────────────────────────────────────────
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
if (!fs.existsSync(path.join(process.cwd(), 'tapflow.config.json'))) {
|
|
28
|
+
warn('tapflow.config.json not found — using defaults. Run tapflow init to configure.');
|
|
29
|
+
}
|
|
30
|
+
initDb(path.join(config.local.dataDir, 'tapflow.db'));
|
|
31
|
+
const server = new RelayServer({ port: RELAY_PORT, uploadsDir: path.join(config.local.dataDir, 'uploads'), wsBackpressureBytes: config.local.wsBackpressureBytes });
|
|
30
32
|
await server.start();
|
|
31
33
|
step(`Relay started on ws://localhost:${RELAY_PORT}`);
|
|
32
34
|
// ── 2. Agent availability check ───────────────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,sBAAsB,CAAA;AAC7B,OAAO,0BAA0B,CAAA;AACjC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAIA,wBAAsB,SAAS,CAAC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DvE"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { WebSocket } from 'ws';
|
|
2
|
+
import { config } from '@tapflowio/relay';
|
|
2
3
|
import { DIM, BOLD, GREEN, YELLOW, RED, R } from '../lib/print.js';
|
|
3
4
|
export async function cmdStatus(opts) {
|
|
4
|
-
const
|
|
5
|
+
const defaultRelay = config.relay.url ?? `ws://localhost:${config.local.port}`;
|
|
6
|
+
const relayUrl = (opts.relay ?? defaultRelay).replace(/^http/, 'ws');
|
|
5
7
|
console.log(`\n Connecting to ${relayUrl}…\n`);
|
|
6
8
|
console.log(` ${DIM}● agent ◉ in use ○ idle${R}\n`);
|
|
7
9
|
await new Promise((resolve, reject) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAC9B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAA;AAElE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAwB;IACtD,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAA;AAElE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAwB;IACtD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,kBAAkB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;IAC9E,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAEpE,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,KAAK,CAAC,CAAA;IAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAA;IAEtD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAA;QAClC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,EAAE,CAAC,SAAS,EAAE,CAAA;YACd,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,QAAQ,eAAe,CAAC,CAAC,CAAA;QAC7E,CAAC,EAAE,IAAI,CAAC,CAAA;QAER,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,CAAA;QAErE,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;gBACvC,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe;oBAAE,OAAM;gBAExC,YAAY,CAAC,OAAO,CAAC,CAAA;gBACrB,EAAE,CAAC,KAAK,EAAE,CAAA;gBAEV,MAAM,QAAQ,GAAyH,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAA;gBAEzJ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAA;gBACnD,CAAC;qBAAM,CAAC;oBACN,IAAI,YAAY,GAAG,CAAC,CAAA;oBACpB,IAAI,cAAc,GAAG,CAAC,CAAA;oBAEtB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;wBAC/B,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAA;wBACxH,MAAM,cAAc,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;wBAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,SAAS,GAAG,CAAC,GAAG,cAAc,EAAE,CAAC,CAAA;wBACtF,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;4BAC3C,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAA;4BAClC,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAA;4BACvD,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,MAAM,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;4BAC9D,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,KAAK,MAAM,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,CAAA;4BACjD,YAAY,EAAE,CAAA;4BACd,IAAI,QAAQ;gCAAE,cAAc,EAAE,CAAA;wBAChC,CAAC;wBACD,OAAO,CAAC,GAAG,EAAE,CAAA;oBACf,CAAC;oBAED,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,QAAQ,CAAC,MAAM,eAAe,YAAY,gBAAgB,cAAc,qBAAqB,CAAC,IAAI,CAAC,CAAA;gBAC5H,CAAC;gBAED,OAAO,EAAE,CAAA;YACX,CAAC;YAAC,MAAM,CAAC,CAAC,uCAAuC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACrB,YAAY,CAAC,OAAO,CAAC,CAAA;YACrB,MAAM,CAAC,GAAG,CAAC,CAAA;QACb,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;QACtB,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,CAAA;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,8 @@ import { dirname, join } from 'path';
|
|
|
4
4
|
import { cac } from 'cac';
|
|
5
5
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
6
|
const { version } = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
|
|
7
|
-
import {
|
|
7
|
+
import { cmdInitConfig } from './commands/init.js';
|
|
8
|
+
import { cmdAdminInit } from './commands/admin-init.js';
|
|
8
9
|
import { cmdDoctor } from './commands/doctor.js';
|
|
9
10
|
import { cmdDevices } from './commands/devices.js';
|
|
10
11
|
import { cmdBoot } from './commands/boot.js';
|
|
@@ -20,9 +21,19 @@ process.on('unhandledRejection', (err) => {
|
|
|
20
21
|
});
|
|
21
22
|
const cli = cac('tapflow');
|
|
22
23
|
cli
|
|
23
|
-
.command('init', '
|
|
24
|
+
.command('init', 'Scaffold tapflow.config.json interactively')
|
|
25
|
+
.option('--tunnel <provider>', 'Tunnel provider: tailscale or rathole')
|
|
26
|
+
.option('--force', 'Overwrite existing tapflow.config.json')
|
|
27
|
+
.action((opts) => cmdInitConfig(opts));
|
|
28
|
+
cli
|
|
29
|
+
.command('admin <subcommand>', 'Admin account commands (subcommand: init)')
|
|
24
30
|
.option('--relay <url>', 'Relay URL (default: http://localhost:4000)')
|
|
25
|
-
.action((opts) =>
|
|
31
|
+
.action((subcommand, opts) => {
|
|
32
|
+
if (subcommand === 'init')
|
|
33
|
+
return cmdAdminInit(opts);
|
|
34
|
+
console.error(`Unknown subcommand: admin ${subcommand}`);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
});
|
|
26
37
|
cli
|
|
27
38
|
.command('doctor', 'Check system prerequisites')
|
|
28
39
|
.action(() => cmdDoctor());
|
|
@@ -40,6 +51,7 @@ cli
|
|
|
40
51
|
cli
|
|
41
52
|
.command('relay <subcommand>', 'Relay server commands (subcommand: start)')
|
|
42
53
|
.option('--port <n>', 'Port to listen on (default: 4000)')
|
|
54
|
+
.option('--tunnel <provider>', 'Tunnel provider to use (e.g. rathole). Requires tunnel config in tapflow.config.json')
|
|
43
55
|
.action((subcommand, opts) => {
|
|
44
56
|
if (subcommand === 'start')
|
|
45
57
|
return cmdRelayStart(opts);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAEzB,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AACzD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAwB,CAAA;AACnH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const RATHOLE_VERSION = "v0.5.0";
|
|
2
|
+
type Platform = 'darwin' | 'linux';
|
|
3
|
+
export declare function cachedBinaryPath(platform: Platform, arch: string): string;
|
|
4
|
+
export declare function extractZip(zipPath: string, outPath: string): Promise<string>;
|
|
5
|
+
export declare function downloadBinary(platform: Platform, arch: string): Promise<string>;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=download-binary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download-binary.d.ts","sourceRoot":"","sources":["../../src/lib/download-binary.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe,WAAW,CAAA;AAIvC,KAAK,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAA;AAOlC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKzE;AAqDD,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqB5E;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBtF"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import https from 'https';
|
|
4
|
+
import os from 'os';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
export const RATHOLE_VERSION = 'v0.5.0';
|
|
7
|
+
const CACHE_DIR = path.join(os.homedir(), '.tapflow', 'bin');
|
|
8
|
+
function normalizeArch(arch) {
|
|
9
|
+
if (arch === 'arm64' || arch === 'aarch64')
|
|
10
|
+
return 'arm64';
|
|
11
|
+
return 'x64';
|
|
12
|
+
}
|
|
13
|
+
export function cachedBinaryPath(platform, arch) {
|
|
14
|
+
const a = platform === 'linux'
|
|
15
|
+
? (arch === 'arm64' || arch === 'aarch64' ? 'aarch64' : 'x86_64')
|
|
16
|
+
: normalizeArch(arch);
|
|
17
|
+
return path.join(CACHE_DIR, `rathole-${platform}-${a}`);
|
|
18
|
+
}
|
|
19
|
+
function releaseUrl(platform, arch) {
|
|
20
|
+
const base = `https://github.com/rathole-org/rathole/releases/download/${RATHOLE_VERSION}`;
|
|
21
|
+
if (platform === 'darwin') {
|
|
22
|
+
// v0.5.0 기준 aarch64-apple-darwin 없음 — x86_64로 통일 (Rosetta 2 실행)
|
|
23
|
+
return `${base}/rathole-x86_64-apple-darwin.zip`;
|
|
24
|
+
}
|
|
25
|
+
const a = arch === 'arm64' || arch === 'aarch64' ? 'aarch64' : 'x86_64';
|
|
26
|
+
// aarch64는 musl, x86_64는 gnu
|
|
27
|
+
const suffix = a === 'aarch64' ? 'unknown-linux-musl' : 'unknown-linux-gnu';
|
|
28
|
+
return `${base}/rathole-${a}-${suffix}.zip`;
|
|
29
|
+
}
|
|
30
|
+
function fetchZip(url, dest) {
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
const follow = (u, redirectCount = 0) => {
|
|
33
|
+
if (redirectCount > 5) {
|
|
34
|
+
reject(new Error('Too many redirects'));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
https.get(u, (res) => {
|
|
38
|
+
if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
|
|
39
|
+
res.resume(); // 이전 response body 소비 (socket hang 방지)
|
|
40
|
+
follow(res.headers.location, redirectCount + 1);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (res.statusCode !== 200) {
|
|
44
|
+
res.resume();
|
|
45
|
+
reject(new Error(`Failed to download rathole: HTTP ${res.statusCode}`));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const total = parseInt(res.headers['content-length'] ?? '0', 10);
|
|
49
|
+
let downloaded = 0;
|
|
50
|
+
process.stdout.write(` Downloading rathole (0%)`);
|
|
51
|
+
res.on('data', (chunk) => {
|
|
52
|
+
downloaded += chunk.length;
|
|
53
|
+
if (total > 0) {
|
|
54
|
+
const pct = Math.floor((downloaded / total) * 100);
|
|
55
|
+
process.stdout.write(`\r Downloading rathole (${pct}%)`);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
const ws = fs.createWriteStream(dest);
|
|
59
|
+
res.pipe(ws);
|
|
60
|
+
ws.on('finish', () => {
|
|
61
|
+
process.stdout.write('\r Downloading rathole (100%)\n');
|
|
62
|
+
resolve();
|
|
63
|
+
});
|
|
64
|
+
ws.on('error', reject);
|
|
65
|
+
res.on('error', reject);
|
|
66
|
+
}).on('error', reject);
|
|
67
|
+
};
|
|
68
|
+
follow(url);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
export function extractZip(zipPath, outPath) {
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
const outDir = path.dirname(outPath);
|
|
74
|
+
fs.mkdirSync(outDir, { recursive: true });
|
|
75
|
+
const proc = spawn('unzip', ['-o', '-j', zipPath, 'rathole', '-d', outDir]);
|
|
76
|
+
let stderr = '';
|
|
77
|
+
proc.stderr?.on('data', (d) => { stderr += d.toString(); });
|
|
78
|
+
proc.on('exit', (code) => {
|
|
79
|
+
if (code !== 0) {
|
|
80
|
+
reject(new Error(`unzip failed (code ${code}): ${stderr}`));
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// unzip extracts as 'rathole', rename to target path
|
|
84
|
+
const extracted = path.join(outDir, 'rathole');
|
|
85
|
+
if (extracted !== outPath) {
|
|
86
|
+
fs.renameSync(extracted, outPath);
|
|
87
|
+
}
|
|
88
|
+
fs.chmodSync(outPath, 0o755);
|
|
89
|
+
resolve(outPath);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
export async function downloadBinary(platform, arch) {
|
|
94
|
+
const dest = cachedBinaryPath(platform, arch);
|
|
95
|
+
if (fs.existsSync(dest))
|
|
96
|
+
return dest;
|
|
97
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
98
|
+
const url = releaseUrl(platform, arch);
|
|
99
|
+
const zipPath = `${dest}.zip`;
|
|
100
|
+
try {
|
|
101
|
+
await fetchZip(url, zipPath);
|
|
102
|
+
await extractZip(zipPath, dest);
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
try {
|
|
106
|
+
fs.unlinkSync(zipPath);
|
|
107
|
+
}
|
|
108
|
+
catch { /* already gone */ }
|
|
109
|
+
}
|
|
110
|
+
return dest;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=download-binary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download-binary.js","sourceRoot":"","sources":["../../src/lib/download-binary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAA;AAEvC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,CAAA;AAI5D,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,OAAO,CAAA;IAC1D,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAkB,EAAE,IAAY;IAC/D,MAAM,CAAC,GAAG,QAAQ,KAAK,OAAO;QAC5B,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;QACjE,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,QAAQ,IAAI,CAAC,EAAE,CAAC,CAAA;AACzD,CAAC;AAED,SAAS,UAAU,CAAC,QAAkB,EAAE,IAAY;IAClD,MAAM,IAAI,GAAG,4DAA4D,eAAe,EAAE,CAAA;IAC1F,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,gEAAgE;QAChE,OAAO,GAAG,IAAI,kCAAkC,CAAA;IAClD,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAA;IACvE,6BAA6B;IAC7B,MAAM,MAAM,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,mBAAmB,CAAA;IAC3E,OAAO,GAAG,IAAI,YAAY,CAAC,IAAI,MAAM,MAAM,CAAA;AAC7C,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,IAAY;IACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,aAAa,GAAG,CAAC,EAAE,EAAE;YAC9C,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAAC,OAAM;YAAC,CAAC;YAC1E,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE;gBACnB,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;oBAC5F,GAAG,CAAC,MAAM,EAAE,CAAA,CAAC,uCAAuC;oBACpD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,CAAC,CAAC,CAAA;oBAC/C,OAAM;gBACR,CAAC;gBACD,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAC3B,GAAG,CAAC,MAAM,EAAE,CAAA;oBACZ,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;oBACvE,OAAM;gBACR,CAAC;gBACD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAA;gBAChE,IAAI,UAAU,GAAG,CAAC,CAAA;gBAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAA;gBAClD,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;oBAC/B,UAAU,IAAI,KAAK,CAAC,MAAM,CAAA;oBAC1B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;wBACd,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAA;wBAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,GAAG,IAAI,CAAC,CAAA;oBAC3D,CAAC;gBACH,CAAC,CAAC,CAAA;gBACF,MAAM,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;gBACrC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACZ,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;oBACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAA;oBACxD,OAAO,EAAE,CAAA;gBACX,CAAC,CAAC,CAAA;gBACF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;gBACtB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACzB,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACxB,CAAC,CAAA;QACD,MAAM,CAAC,GAAG,CAAC,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,OAAe;IACzD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACpC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;QAC3E,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA,CAAC,CAAC,CAAC,CAAA;QAClE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACvB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,IAAI,MAAM,MAAM,EAAE,CAAC,CAAC,CAAA;gBAC3D,OAAM;YACR,CAAC;YACD,qDAAqD;YACrD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YAC9C,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBAC1B,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YACnC,CAAC;YACD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YAC5B,OAAO,CAAC,OAAO,CAAC,CAAA;QAClB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAkB,EAAE,IAAY;IACnE,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAEpC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAErD,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IACtC,MAAM,OAAO,GAAG,GAAG,IAAI,MAAM,CAAA;IAE7B,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QAC5B,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IACjC,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
|
package/dist/lib/print.d.ts
CHANGED
|
@@ -4,10 +4,12 @@ export declare const DIM = "\u001B[2m";
|
|
|
4
4
|
export declare const GREEN = "\u001B[32m";
|
|
5
5
|
export declare const RED = "\u001B[31m";
|
|
6
6
|
export declare const YELLOW = "\u001B[33m";
|
|
7
|
+
export declare function wrap(line: string, maxWidth: number): string[];
|
|
7
8
|
export declare function banner(type: 'success' | 'error', title: string, lines?: string[]): void;
|
|
8
9
|
export declare function createSpinner(msg: string): {
|
|
9
10
|
start(): void;
|
|
10
11
|
stop(ok: boolean): void;
|
|
11
12
|
};
|
|
12
13
|
export declare function step(msg: string): void;
|
|
14
|
+
export declare function warn(msg: string): void;
|
|
13
15
|
//# sourceMappingURL=print.d.ts.map
|
package/dist/lib/print.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"print.d.ts","sourceRoot":"","sources":["../../src/lib/print.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,CAAC,cAAY,CAAA;AAC1B,eAAO,MAAM,IAAI,cAAY,CAAA;AAC7B,eAAO,MAAM,GAAG,cAAY,CAAA;AAC5B,eAAO,MAAM,KAAK,eAAa,CAAA;AAC/B,eAAO,MAAM,GAAG,eAAa,CAAA;AAC7B,eAAO,MAAM,MAAM,eAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"print.d.ts","sourceRoot":"","sources":["../../src/lib/print.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,CAAC,cAAY,CAAA;AAC1B,eAAO,MAAM,IAAI,cAAY,CAAA;AAC7B,eAAO,MAAM,GAAG,cAAY,CAAA;AAC5B,eAAO,MAAM,KAAK,eAAa,CAAA;AAC/B,eAAO,MAAM,GAAG,eAAa,CAAA;AAC7B,eAAO,MAAM,MAAM,eAAa,CAAA;AAIhC,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAuB7D;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,IAAI,CAkB3F;AAID,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM;;aAY5B,OAAO;EAMnB;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC"}
|
package/dist/lib/print.js
CHANGED
|
@@ -5,13 +5,26 @@ export const GREEN = '\x1b[32m';
|
|
|
5
5
|
export const RED = '\x1b[31m';
|
|
6
6
|
export const YELLOW = '\x1b[33m';
|
|
7
7
|
const MAX_WIDTH = 72;
|
|
8
|
-
function wrap(line, maxWidth) {
|
|
8
|
+
export function wrap(line, maxWidth) {
|
|
9
|
+
if (!Number.isInteger(maxWidth) || maxWidth < 1) {
|
|
10
|
+
throw new Error('maxWidth must be a positive integer');
|
|
11
|
+
}
|
|
9
12
|
if (line.length <= maxWidth)
|
|
10
13
|
return [line];
|
|
11
14
|
const chunks = [];
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
let remaining = line;
|
|
16
|
+
while (remaining.length > maxWidth) {
|
|
17
|
+
const breakAt = remaining.lastIndexOf(' ', maxWidth);
|
|
18
|
+
if (breakAt > 0) {
|
|
19
|
+
chunks.push(remaining.slice(0, breakAt));
|
|
20
|
+
remaining = remaining.slice(breakAt + 1).trimStart();
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
chunks.push(remaining.slice(0, maxWidth));
|
|
24
|
+
remaining = remaining.slice(maxWidth);
|
|
14
25
|
}
|
|
26
|
+
if (remaining.length > 0)
|
|
27
|
+
chunks.push(remaining);
|
|
15
28
|
return chunks;
|
|
16
29
|
}
|
|
17
30
|
export function banner(type, title, lines = []) {
|
|
@@ -52,4 +65,7 @@ export function createSpinner(msg) {
|
|
|
52
65
|
export function step(msg) {
|
|
53
66
|
console.log(` ${DIM}→${R} ${msg}`);
|
|
54
67
|
}
|
|
68
|
+
export function warn(msg) {
|
|
69
|
+
console.warn(`${YELLOW}${BOLD} ⚠ ${msg}${R}`);
|
|
70
|
+
}
|
|
55
71
|
//# sourceMappingURL=print.js.map
|
package/dist/lib/print.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"print.js","sourceRoot":"","sources":["../../src/lib/print.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;AAC1B,MAAM,CAAC,MAAM,IAAI,GAAG,SAAS,CAAA;AAC7B,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,CAAA;AAC5B,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAA;AAC/B,MAAM,CAAC,MAAM,GAAG,GAAG,UAAU,CAAA;AAC7B,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAA;AAEhC,MAAM,SAAS,GAAG,EAAE,CAAA;AAEpB,
|
|
1
|
+
{"version":3,"file":"print.js","sourceRoot":"","sources":["../../src/lib/print.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type SshConfig } from './ssh.js';
|
|
2
|
+
import type { TunnelPlugin } from './tunnel.js';
|
|
3
|
+
export interface RatholeTunnelOptions {
|
|
4
|
+
serverAddr: string;
|
|
5
|
+
publicUrl: string;
|
|
6
|
+
token: string;
|
|
7
|
+
ssh?: SshConfig;
|
|
8
|
+
}
|
|
9
|
+
export declare class RatholeTunnel implements TunnelPlugin {
|
|
10
|
+
private opts;
|
|
11
|
+
name: string;
|
|
12
|
+
private proc;
|
|
13
|
+
private clientConfigPath;
|
|
14
|
+
private serverConfigPath;
|
|
15
|
+
private sshCfg;
|
|
16
|
+
constructor(opts: RatholeTunnelOptions);
|
|
17
|
+
setupServer(): Promise<void>;
|
|
18
|
+
start(relayPort: number): Promise<{
|
|
19
|
+
publicUrl: string;
|
|
20
|
+
}>;
|
|
21
|
+
stop(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=rathole-tunnel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rathole-tunnel.d.ts","sourceRoot":"","sources":["../../src/lib/rathole-tunnel.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,UAAU,CAAA;AAE7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AA6B/C,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,SAAS,CAAA;CAChB;AAED,qBAAa,aAAc,YAAW,YAAY;IAOpC,OAAO,CAAC,IAAI;IANxB,IAAI,SAAY;IAChB,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,MAAM,CAAyB;gBAEnB,IAAI,EAAE,oBAAoB;IAIxC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC5B,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAqCxD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAiB5B"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { sshExec, scpUpload } from './ssh.js';
|
|
6
|
+
import { downloadBinary } from './download-binary.js';
|
|
7
|
+
const REMOTE_DIR = '/tmp/tapflow';
|
|
8
|
+
const REMOTE_BINARY = `${REMOTE_DIR}/rathole`;
|
|
9
|
+
const REMOTE_SERVER_TOML = `${REMOTE_DIR}/rathole-server.toml`;
|
|
10
|
+
const REMOTE_PID_FILE = '/tmp/tapflow-rathole.pid';
|
|
11
|
+
function serverToml(serverAddr, token) {
|
|
12
|
+
return [
|
|
13
|
+
'[server]',
|
|
14
|
+
`bind_addr = "${serverAddr}"`,
|
|
15
|
+
'',
|
|
16
|
+
'[server.services.tapflow-relay]',
|
|
17
|
+
`token = "${token}"`,
|
|
18
|
+
`bind_addr = "0.0.0.0:4000"`,
|
|
19
|
+
].join('\n');
|
|
20
|
+
}
|
|
21
|
+
function clientToml(serverAddr, token, relayPort) {
|
|
22
|
+
return [
|
|
23
|
+
'[client]',
|
|
24
|
+
`remote_addr = "${serverAddr}"`,
|
|
25
|
+
'',
|
|
26
|
+
'[client.services.tapflow-relay]',
|
|
27
|
+
`token = "${token}"`,
|
|
28
|
+
`local_addr = "127.0.0.1:${relayPort}"`,
|
|
29
|
+
].join('\n');
|
|
30
|
+
}
|
|
31
|
+
export class RatholeTunnel {
|
|
32
|
+
opts;
|
|
33
|
+
name = 'rathole';
|
|
34
|
+
proc = null;
|
|
35
|
+
clientConfigPath = null;
|
|
36
|
+
serverConfigPath = null;
|
|
37
|
+
sshCfg = null;
|
|
38
|
+
constructor(opts) {
|
|
39
|
+
this.opts = opts;
|
|
40
|
+
this.sshCfg = opts.ssh ?? null;
|
|
41
|
+
}
|
|
42
|
+
async setupServer() {
|
|
43
|
+
if (!this.sshCfg)
|
|
44
|
+
return;
|
|
45
|
+
const ssh = this.sshCfg;
|
|
46
|
+
// 원격 디렉토리 생성
|
|
47
|
+
await sshExec(ssh, `mkdir -p ${REMOTE_DIR}`);
|
|
48
|
+
// 기존 server 프로세스 먼저 정리 (binary 파일 잠금 해제)
|
|
49
|
+
await sshExec(ssh, `kill $(cat ${REMOTE_PID_FILE} 2>/dev/null) 2>/dev/null; true`);
|
|
50
|
+
// rathole binary 확인 — PATH 또는 REMOTE_BINARY 경로
|
|
51
|
+
const hasRathole = await sshExec(ssh, `which rathole 2>/dev/null || ls ${REMOTE_BINARY} 2>/dev/null || echo ""`).then((out) => out.length > 0, () => false);
|
|
52
|
+
if (!hasRathole) {
|
|
53
|
+
const vpsArch = await sshExec(ssh, 'uname -m').catch(() => 'x86_64');
|
|
54
|
+
const linuxBinary = await downloadBinary('linux', vpsArch.trim());
|
|
55
|
+
await scpUpload(ssh, linuxBinary, REMOTE_BINARY);
|
|
56
|
+
await sshExec(ssh, `chmod +x ${REMOTE_BINARY}`);
|
|
57
|
+
}
|
|
58
|
+
const remoteRathole = hasRathole
|
|
59
|
+
? (await sshExec(ssh, `which rathole 2>/dev/null || echo "${REMOTE_BINARY}"`).catch(() => REMOTE_BINARY)).trim()
|
|
60
|
+
: REMOTE_BINARY;
|
|
61
|
+
// server.toml 생성 → 업로드
|
|
62
|
+
const toml = serverToml(this.opts.serverAddr, this.opts.token);
|
|
63
|
+
this.serverConfigPath = path.join(os.tmpdir(), `tapflow-rathole-server-${process.pid}.toml`);
|
|
64
|
+
fs.writeFileSync(this.serverConfigPath, toml, 'utf-8');
|
|
65
|
+
await scpUpload(ssh, this.serverConfigPath, REMOTE_SERVER_TOML);
|
|
66
|
+
await sshExec(ssh, `nohup ${remoteRathole} --server ${REMOTE_SERVER_TOML} > /tmp/tapflow-rathole.log 2>&1 & echo $! > ${REMOTE_PID_FILE}`);
|
|
67
|
+
}
|
|
68
|
+
async start(relayPort) {
|
|
69
|
+
if (!this.opts.token)
|
|
70
|
+
throw new Error('TAPFLOW_TUNNEL_TOKEN is required for tunnel mode');
|
|
71
|
+
if (!this.opts.serverAddr)
|
|
72
|
+
throw new Error('tunnel.serverAddr is required in tapflow.config.json');
|
|
73
|
+
const darwinBinary = await downloadBinary('darwin', process.arch);
|
|
74
|
+
const toml = clientToml(this.opts.serverAddr, this.opts.token, relayPort);
|
|
75
|
+
this.clientConfigPath = path.join(os.tmpdir(), `tapflow-rathole-client-${process.pid}.toml`);
|
|
76
|
+
fs.mkdirSync(path.dirname(this.clientConfigPath), { recursive: true });
|
|
77
|
+
fs.writeFileSync(this.clientConfigPath, toml, 'utf-8');
|
|
78
|
+
return new Promise((resolve, reject) => {
|
|
79
|
+
this.proc = spawn(darwinBinary, ['--client', this.clientConfigPath], { stdio: ['ignore', 'ignore', 'pipe'] });
|
|
80
|
+
let resolved = false;
|
|
81
|
+
this.proc.stderr?.on('data', (chunk) => {
|
|
82
|
+
const line = chunk.toString();
|
|
83
|
+
if (!resolved && (line.includes('established') || line.includes('Tunnel') || line.includes('Connected') || line.includes('INFO'))) {
|
|
84
|
+
resolved = true;
|
|
85
|
+
resolve({ publicUrl: this.opts.publicUrl });
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
// stderr에 아무것도 안 나와도 프로세스가 살아있으면 연결된 것으로 간주
|
|
89
|
+
setTimeout(() => {
|
|
90
|
+
if (!resolved && this.proc && !this.proc.killed) {
|
|
91
|
+
resolved = true;
|
|
92
|
+
resolve({ publicUrl: this.opts.publicUrl });
|
|
93
|
+
}
|
|
94
|
+
}, 3000);
|
|
95
|
+
this.proc.on('exit', (code) => {
|
|
96
|
+
if (!resolved)
|
|
97
|
+
reject(new Error(`rathole process exited with code ${code}`));
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
async stop() {
|
|
102
|
+
if (this.proc) {
|
|
103
|
+
this.proc.kill();
|
|
104
|
+
this.proc = null;
|
|
105
|
+
}
|
|
106
|
+
if (this.clientConfigPath) {
|
|
107
|
+
try {
|
|
108
|
+
fs.unlinkSync(this.clientConfigPath);
|
|
109
|
+
}
|
|
110
|
+
catch { /* already gone */ }
|
|
111
|
+
this.clientConfigPath = null;
|
|
112
|
+
}
|
|
113
|
+
if (this.serverConfigPath) {
|
|
114
|
+
try {
|
|
115
|
+
fs.unlinkSync(this.serverConfigPath);
|
|
116
|
+
}
|
|
117
|
+
catch { /* already gone */ }
|
|
118
|
+
this.serverConfigPath = null;
|
|
119
|
+
}
|
|
120
|
+
if (this.sshCfg) {
|
|
121
|
+
await sshExec(this.sshCfg, `kill $(cat ${REMOTE_PID_FILE} 2>/dev/null) 2>/dev/null; rm -f ${REMOTE_PID_FILE}; true`).catch(() => { });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=rathole-tunnel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rathole-tunnel.js","sourceRoot":"","sources":["../../src/lib/rathole-tunnel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface SshConfig {
|
|
2
|
+
host: string;
|
|
3
|
+
user: string;
|
|
4
|
+
keyPath?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function sshExec(ssh: SshConfig, cmd: string): Promise<string>;
|
|
7
|
+
export declare function scpUpload(ssh: SshConfig, localPath: string, remotePath: string): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=ssh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/lib/ssh.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAUD,wBAAgB,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYpE;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc9F"}
|
package/dist/lib/ssh.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
function sshArgs(ssh) {
|
|
3
|
+
return [
|
|
4
|
+
'-o', 'StrictHostKeyChecking=no',
|
|
5
|
+
'-o', 'BatchMode=yes',
|
|
6
|
+
...(ssh.keyPath ? ['-i', ssh.keyPath] : []),
|
|
7
|
+
];
|
|
8
|
+
}
|
|
9
|
+
export function sshExec(ssh, cmd) {
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
const proc = spawn('ssh', [...sshArgs(ssh), `${ssh.user}@${ssh.host}`, cmd]);
|
|
12
|
+
let stdout = '';
|
|
13
|
+
let stderr = '';
|
|
14
|
+
proc.stdout?.on('data', (d) => { stdout += d.toString(); });
|
|
15
|
+
proc.stderr?.on('data', (d) => { stderr += d.toString(); });
|
|
16
|
+
proc.on('exit', (code) => {
|
|
17
|
+
if (code === 0)
|
|
18
|
+
resolve(stdout.trim());
|
|
19
|
+
else
|
|
20
|
+
reject(new Error(stderr.trim() || `ssh exited with code ${code}`));
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export function scpUpload(ssh, localPath, remotePath) {
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
const proc = spawn('scp', [
|
|
27
|
+
...sshArgs(ssh),
|
|
28
|
+
localPath,
|
|
29
|
+
`${ssh.user}@${ssh.host}:${remotePath}`,
|
|
30
|
+
]);
|
|
31
|
+
let stderr = '';
|
|
32
|
+
proc.stderr?.on('data', (d) => { stderr += d.toString(); });
|
|
33
|
+
proc.on('exit', (code) => {
|
|
34
|
+
if (code === 0)
|
|
35
|
+
resolve();
|
|
36
|
+
else
|
|
37
|
+
reject(new Error(stderr.trim() || `scp exited with code ${code}`));
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=ssh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/lib/ssh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAQrC,SAAS,OAAO,CAAC,GAAc;IAC7B,OAAO;QACL,IAAI,EAAE,0BAA0B;QAChC,IAAI,EAAE,eAAe;QACrB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAA;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAc,EAAE,GAAW;IACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAA;QAC5E,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA,CAAC,CAAC,CAAC,CAAA;QAClE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA,CAAC,CAAC,CAAC,CAAA;QAClE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACvB,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;;gBACjC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,wBAAwB,IAAI,EAAE,CAAC,CAAC,CAAA;QACzE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAc,EAAE,SAAiB,EAAE,UAAkB;IAC7E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE;YACxB,GAAG,OAAO,CAAC,GAAG,CAAC;YACf,SAAS;YACT,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,UAAU,EAAE;SACxC,CAAC,CAAA;QACF,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA,CAAC,CAAC,CAAC,CAAA;QAClE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACvB,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAA;;gBACpB,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,wBAAwB,IAAI,EAAE,CAAC,CAAC,CAAA;QACzE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TunnelPlugin } from './tunnel.js';
|
|
2
|
+
export interface TailscaleTunnelOptions {
|
|
3
|
+
publicUrl?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare class TailscaleTunnel implements TunnelPlugin {
|
|
6
|
+
private opts;
|
|
7
|
+
name: string;
|
|
8
|
+
constructor(opts: TailscaleTunnelOptions);
|
|
9
|
+
setupServer(): Promise<void>;
|
|
10
|
+
start(relayPort: number): Promise<{
|
|
11
|
+
publicUrl: string;
|
|
12
|
+
}>;
|
|
13
|
+
stop(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=tailscale-tunnel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailscale-tunnel.d.ts","sourceRoot":"","sources":["../../src/lib/tailscale-tunnel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAU/C,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,qBAAa,eAAgB,YAAW,YAAY;IAGtC,OAAO,CAAC,IAAI;IAFxB,IAAI,SAAc;gBAEE,IAAI,EAAE,sBAAsB;IAE1C,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAyCxD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B"}
|