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
@@ -0,0 +1,49 @@
1
+ import { execSync } from 'child_process';
2
+ export class TailscaleTunnel {
3
+ opts;
4
+ name = 'tailscale';
5
+ constructor(opts) {
6
+ this.opts = opts;
7
+ }
8
+ async setupServer() {
9
+ // no-op — Tailscale manages its own network layer
10
+ }
11
+ async start(relayPort) {
12
+ if (this.opts.publicUrl)
13
+ return { publicUrl: this.opts.publicUrl };
14
+ try {
15
+ execSync('tailscale version', { stdio: 'pipe' });
16
+ }
17
+ catch {
18
+ throw new Error('Tailscale is not installed or not in PATH.\n' +
19
+ 'Install: brew install tailscale (macOS) · https://tailscale.com/download\n' +
20
+ 'Then run: sudo tailscale up');
21
+ }
22
+ let status;
23
+ try {
24
+ const raw = execSync('tailscale status --json', { stdio: 'pipe' }).toString();
25
+ status = JSON.parse(raw);
26
+ }
27
+ catch {
28
+ throw new Error('Failed to query Tailscale status. Run: tailscale up');
29
+ }
30
+ if (status.BackendState !== 'Running') {
31
+ throw new Error(`Tailscale is not connected (state: ${status.BackendState ?? 'unknown'}).\n` +
32
+ 'Run: tailscale up');
33
+ }
34
+ const dnsName = status.Self?.DNSName?.replace(/\.$/, '');
35
+ if (dnsName)
36
+ return { publicUrl: `http://${dnsName}:${relayPort}` };
37
+ const ips = status.Self?.TailscaleIPs ?? [];
38
+ const ip = ips.find(a => !a.includes(':')) ?? ips[0];
39
+ if (ip) {
40
+ const host = ip.includes(':') ? `[${ip}]` : ip;
41
+ return { publicUrl: `http://${host}:${relayPort}` };
42
+ }
43
+ throw new Error('Could not determine Tailscale IP. Make sure Tailscale is connected: tailscale up');
44
+ }
45
+ async stop() {
46
+ // no-op — tapflow does not manage the Tailscale lifecycle
47
+ }
48
+ }
49
+ //# sourceMappingURL=tailscale-tunnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailscale-tunnel.js","sourceRoot":"","sources":["../../src/lib/tailscale-tunnel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAexC,MAAM,OAAO,eAAe;IAGN;IAFpB,IAAI,GAAG,WAAW,CAAA;IAElB,YAAoB,IAA4B;QAA5B,SAAI,GAAJ,IAAI,CAAwB;IAAG,CAAC;IAEpD,KAAK,CAAC,WAAW;QACf,kDAAkD;IACpD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,SAAiB;QAC3B,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;QAElE,IAAI,CAAC;YACH,QAAQ,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,8CAA8C;gBAC9C,6EAA6E;gBAC7E,6BAA6B,CAC9B,CAAA;QACH,CAAC;QAED,IAAI,MAAuB,CAAA;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,QAAQ,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;YAC7E,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAA;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;QACxE,CAAC;QAED,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CACb,sCAAsC,MAAM,CAAC,YAAY,IAAI,SAAS,MAAM;gBAC5E,mBAAmB,CACpB,CAAA;QACH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACxD,IAAI,OAAO;YAAE,OAAO,EAAE,SAAS,EAAE,UAAU,OAAO,IAAI,SAAS,EAAE,EAAE,CAAA;QAEnE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,YAAY,IAAI,EAAE,CAAA;QAC3C,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;QACpD,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YAC9C,OAAO,EAAE,SAAS,EAAE,UAAU,IAAI,IAAI,SAAS,EAAE,EAAE,CAAA;QACrD,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAA;IACrG,CAAC;IAED,KAAK,CAAC,IAAI;QACR,0DAA0D;IAC5D,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ export interface TunnelPlugin {
2
+ name: string;
3
+ setupServer(): Promise<void>;
4
+ start(relayPort: number): Promise<{
5
+ publicUrl: string;
6
+ }>;
7
+ stop(): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=tunnel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/lib/tunnel.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tunnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/lib/tunnel.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "tapflow",
3
- "version": "0.3.1",
4
- "description": "Self-hosted iOS/Android simulator streaming for QA teams",
3
+ "version": "0.4.0",
4
+ "description": "Self-hosted iOS/Android simulator streaming for the whole team",
5
5
  "keywords": [
6
6
  "ios",
7
7
  "android",
@@ -43,13 +43,14 @@
43
43
  }
44
44
  },
45
45
  "dependencies": {
46
+ "@clack/prompts": "^1.5.0",
46
47
  "cac": "^6.7.14",
47
48
  "ws": "^8.0.0",
48
49
  "zod": "^4.4.3",
49
- "@tapflowio/agent-core": "0.3.1",
50
- "@tapflowio/android-agent": "0.3.1",
51
- "@tapflowio/ios-agent": "0.3.1",
52
- "@tapflowio/relay": "0.3.1"
50
+ "@tapflowio/agent-core": "0.4.0",
51
+ "@tapflowio/android-agent": "0.4.0",
52
+ "@tapflowio/ios-agent": "0.4.0",
53
+ "@tapflowio/relay": "0.4.0"
53
54
  },
54
55
  "devDependencies": {
55
56
  "@types/node": "^20.0.0",
@@ -1,2 +0,0 @@
1
- export declare function initConfigFile(): void;
2
- //# sourceMappingURL=init-config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init-config.d.ts","sourceRoot":"","sources":["../../src/lib/init-config.ts"],"names":[],"mappings":"AAiBA,wBAAgB,cAAc,IAAI,IAAI,CAKrC"}
@@ -1,22 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- const DEFAULT_CONFIG = {
4
- server: {
5
- port: 4000,
6
- dataDir: '.tapflow-data',
7
- },
8
- smtp: {
9
- host: '',
10
- port: 587,
11
- secure: false,
12
- user: '',
13
- pass: '',
14
- },
15
- };
16
- export function initConfigFile() {
17
- const configPath = path.join(process.cwd(), 'tapflow.config.json');
18
- if (!fs.existsSync(configPath)) {
19
- fs.writeFileSync(configPath, JSON.stringify(DEFAULT_CONFIG, null, 2) + '\n', 'utf-8');
20
- }
21
- }
22
- //# sourceMappingURL=init-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init-config.js","sourceRoot":"","sources":["../../src/lib/init-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,MAAM,cAAc,GAAG;IACrB,MAAM,EAAE;QACN,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,eAAe;KACzB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;KACT;CACF,CAAA;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,qBAAqB,CAAC,CAAA;IAClE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAA;IACvF,CAAC;AACH,CAAC"}