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.
Files changed (57) hide show
  1. package/README.md +5 -7
  2. package/bin/postinstall.js +3 -1
  3. package/dist/commands/admin-init.d.ts +5 -0
  4. package/dist/commands/admin-init.d.ts.map +1 -0
  5. package/dist/commands/admin-init.js +68 -0
  6. package/dist/commands/admin-init.js.map +1 -0
  7. package/dist/commands/agent-start.d.ts.map +1 -1
  8. package/dist/commands/agent-start.js +2 -1
  9. package/dist/commands/agent-start.js.map +1 -1
  10. package/dist/commands/init.d.ts +4 -3
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +143 -75
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/logs.d.ts.map +1 -1
  15. package/dist/commands/logs.js +3 -1
  16. package/dist/commands/logs.js.map +1 -1
  17. package/dist/commands/relay-start.d.ts +1 -0
  18. package/dist/commands/relay-start.d.ts.map +1 -1
  19. package/dist/commands/relay-start.js +65 -12
  20. package/dist/commands/relay-start.js.map +1 -1
  21. package/dist/commands/start.d.ts.map +1 -1
  22. package/dist/commands/start.js +8 -6
  23. package/dist/commands/start.js.map +1 -1
  24. package/dist/commands/status.d.ts.map +1 -1
  25. package/dist/commands/status.js +3 -1
  26. package/dist/commands/status.js.map +1 -1
  27. package/dist/index.js +15 -3
  28. package/dist/index.js.map +1 -1
  29. package/dist/lib/download-binary.d.ts +7 -0
  30. package/dist/lib/download-binary.d.ts.map +1 -0
  31. package/dist/lib/download-binary.js +112 -0
  32. package/dist/lib/download-binary.js.map +1 -0
  33. package/dist/lib/print.d.ts +2 -0
  34. package/dist/lib/print.d.ts.map +1 -1
  35. package/dist/lib/print.js +19 -3
  36. package/dist/lib/print.js.map +1 -1
  37. package/dist/lib/rathole-tunnel.d.ts +23 -0
  38. package/dist/lib/rathole-tunnel.d.ts.map +1 -0
  39. package/dist/lib/rathole-tunnel.js +125 -0
  40. package/dist/lib/rathole-tunnel.js.map +1 -0
  41. package/dist/lib/ssh.d.ts +8 -0
  42. package/dist/lib/ssh.d.ts.map +1 -0
  43. package/dist/lib/ssh.js +41 -0
  44. package/dist/lib/ssh.js.map +1 -0
  45. package/dist/lib/tailscale-tunnel.d.ts +15 -0
  46. package/dist/lib/tailscale-tunnel.d.ts.map +1 -0
  47. package/dist/lib/tailscale-tunnel.js +49 -0
  48. package/dist/lib/tailscale-tunnel.js.map +1 -0
  49. package/dist/lib/tunnel.d.ts +9 -0
  50. package/dist/lib/tunnel.d.ts.map +1 -0
  51. package/dist/lib/tunnel.js +2 -0
  52. package/dist/lib/tunnel.js.map +1 -0
  53. package/package.json +7 -6
  54. package/dist/lib/init-config.d.ts +0 -2
  55. package/dist/lib/init-config.d.ts.map +0 -1
  56. package/dist/lib/init-config.js +0 -22
  57. package/dist/lib/init-config.js.map +0 -1
@@ -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
- import { initConfigFile } from '../lib/init-config.js';
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
- initConfigFile();
28
- initDb(path.join(config.server.dataDir, 'tapflow.db'));
29
- const server = new RelayServer({ port: RELAY_PORT, uploadsDir: path.join(config.server.dataDir, 'uploads'), wsBackpressureBytes: config.server.wsBackpressureBytes });
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":"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"}
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":"AAGA,wBAAsB,SAAS,CAAC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DvE"}
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"}
@@ -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 relayUrl = (opts.relay ?? 'ws://localhost:4000').replace(/^http/, 'ws');
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":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
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 { cmdInit } from './commands/init.js';
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', 'Create the first admin account on the relay')
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) => cmdInit(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":"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"}
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"}
@@ -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
@@ -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;AAahC,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"}
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
- for (let i = 0; i < line.length; i += maxWidth) {
13
- chunks.push(line.slice(i, i + maxWidth));
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
@@ -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,SAAS,IAAI,CAAC,IAAY,EAAE,QAAgB;IAC1C,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAyB,EAAE,KAAa,EAAE,QAAkB,EAAE;IACnF,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAA;IAC9C,MAAM,IAAI,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;IAC3C,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAA;IAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAC3B,SAAS,EACT,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CACzE,CAAA;IACD,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IAEpC,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;IAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI,QAAQ,IAAI,KAAK,KAAK,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAClF,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;IAC5C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,QAAQ,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA;IACvC,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAA;AACf,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AAEzE,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,EAAE,GAA0C,IAAI,CAAA;IAEpD,OAAO;QACL,KAAK;YACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAA;YACxD,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;gBACpB,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAA;gBAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAA;YAC9D,CAAC,EAAE,EAAE,CAAC,CAAA;QACR,CAAC;QACD,IAAI,CAAC,EAAW;YACd,IAAI,EAAE;gBAAE,aAAa,CAAC,EAAE,CAAC,CAAA;YACzB,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAA;YACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,GAAG,IAAI,CAAC,CAAA;QAC/C,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAW;IAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAA;AACtC,CAAC"}
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"}
@@ -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"}