@hookbase/cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +107 -0
  2. package/dist/commands/api-keys.d.ts +15 -0
  3. package/dist/commands/api-keys.d.ts.map +1 -0
  4. package/dist/commands/api-keys.js +143 -0
  5. package/dist/commands/api-keys.js.map +1 -0
  6. package/dist/commands/dashboard.d.ts +3 -0
  7. package/dist/commands/dashboard.d.ts.map +1 -0
  8. package/dist/commands/dashboard.js +26 -0
  9. package/dist/commands/dashboard.js.map +1 -0
  10. package/dist/commands/deliveries.d.ts +22 -0
  11. package/dist/commands/deliveries.d.ts.map +1 -0
  12. package/dist/commands/deliveries.js +223 -0
  13. package/dist/commands/deliveries.js.map +1 -0
  14. package/dist/commands/destinations.d.ts +29 -0
  15. package/dist/commands/destinations.d.ts.map +1 -0
  16. package/dist/commands/destinations.js +232 -0
  17. package/dist/commands/destinations.js.map +1 -0
  18. package/dist/commands/events.d.ts +13 -0
  19. package/dist/commands/events.d.ts.map +1 -0
  20. package/dist/commands/events.js +192 -0
  21. package/dist/commands/events.js.map +1 -0
  22. package/dist/commands/forward.d.ts +2 -0
  23. package/dist/commands/forward.d.ts.map +1 -0
  24. package/dist/commands/forward.js +25 -0
  25. package/dist/commands/forward.js.map +1 -0
  26. package/dist/commands/login.d.ts +2 -0
  27. package/dist/commands/login.d.ts.map +1 -0
  28. package/dist/commands/login.js +91 -0
  29. package/dist/commands/login.js.map +1 -0
  30. package/dist/commands/logout.d.ts +2 -0
  31. package/dist/commands/logout.d.ts.map +1 -0
  32. package/dist/commands/logout.js +12 -0
  33. package/dist/commands/logout.js.map +1 -0
  34. package/dist/commands/logs.d.ts +5 -0
  35. package/dist/commands/logs.d.ts.map +1 -0
  36. package/dist/commands/logs.js +43 -0
  37. package/dist/commands/logs.js.map +1 -0
  38. package/dist/commands/routes.d.ts +28 -0
  39. package/dist/commands/routes.d.ts.map +1 -0
  40. package/dist/commands/routes.js +225 -0
  41. package/dist/commands/routes.js.map +1 -0
  42. package/dist/commands/sources.d.ts +30 -0
  43. package/dist/commands/sources.d.ts.map +1 -0
  44. package/dist/commands/sources.js +256 -0
  45. package/dist/commands/sources.js.map +1 -0
  46. package/dist/commands/tunnel.d.ts +6 -0
  47. package/dist/commands/tunnel.d.ts.map +1 -0
  48. package/dist/commands/tunnel.js +150 -0
  49. package/dist/commands/tunnel.js.map +1 -0
  50. package/dist/commands/tunnels.d.ts +32 -0
  51. package/dist/commands/tunnels.d.ts.map +1 -0
  52. package/dist/commands/tunnels.js +432 -0
  53. package/dist/commands/tunnels.js.map +1 -0
  54. package/dist/index.d.ts +3 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +430 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/lib/api.d.ts +472 -0
  59. package/dist/lib/api.d.ts.map +1 -0
  60. package/dist/lib/api.js +480 -0
  61. package/dist/lib/api.js.map +1 -0
  62. package/dist/lib/config.d.ts +31 -0
  63. package/dist/lib/config.d.ts.map +1 -0
  64. package/dist/lib/config.js +98 -0
  65. package/dist/lib/config.js.map +1 -0
  66. package/dist/lib/logger.d.ts +19 -0
  67. package/dist/lib/logger.d.ts.map +1 -0
  68. package/dist/lib/logger.js +90 -0
  69. package/dist/lib/logger.js.map +1 -0
  70. package/dist/lib/tunnel.d.ts +28 -0
  71. package/dist/lib/tunnel.d.ts.map +1 -0
  72. package/dist/lib/tunnel.js +197 -0
  73. package/dist/lib/tunnel.js.map +1 -0
  74. package/dist/tui/App.d.ts +2 -0
  75. package/dist/tui/App.d.ts.map +1 -0
  76. package/dist/tui/App.js +136 -0
  77. package/dist/tui/App.js.map +1 -0
  78. package/dist/tui/Dashboard.d.ts +2 -0
  79. package/dist/tui/Dashboard.d.ts.map +1 -0
  80. package/dist/tui/Dashboard.js +113 -0
  81. package/dist/tui/Dashboard.js.map +1 -0
  82. package/dist/tui/TunnelMonitor.d.ts +2 -0
  83. package/dist/tui/TunnelMonitor.d.ts.map +1 -0
  84. package/dist/tui/TunnelMonitor.js +131 -0
  85. package/dist/tui/TunnelMonitor.js.map +1 -0
  86. package/dist/tui/components/Box.d.ts +22 -0
  87. package/dist/tui/components/Box.d.ts.map +1 -0
  88. package/dist/tui/components/Box.js +27 -0
  89. package/dist/tui/components/Box.js.map +1 -0
  90. package/dist/tui/views/Analytics.d.ts +6 -0
  91. package/dist/tui/views/Analytics.d.ts.map +1 -0
  92. package/dist/tui/views/Analytics.js +104 -0
  93. package/dist/tui/views/Analytics.js.map +1 -0
  94. package/dist/tui/views/Destinations.d.ts +10 -0
  95. package/dist/tui/views/Destinations.d.ts.map +1 -0
  96. package/dist/tui/views/Destinations.js +156 -0
  97. package/dist/tui/views/Destinations.js.map +1 -0
  98. package/dist/tui/views/Events.d.ts +9 -0
  99. package/dist/tui/views/Events.d.ts.map +1 -0
  100. package/dist/tui/views/Events.js +60 -0
  101. package/dist/tui/views/Events.js.map +1 -0
  102. package/dist/tui/views/Overview.d.ts +13 -0
  103. package/dist/tui/views/Overview.d.ts.map +1 -0
  104. package/dist/tui/views/Overview.js +29 -0
  105. package/dist/tui/views/Overview.js.map +1 -0
  106. package/dist/tui/views/Sources.d.ts +10 -0
  107. package/dist/tui/views/Sources.d.ts.map +1 -0
  108. package/dist/tui/views/Sources.js +151 -0
  109. package/dist/tui/views/Sources.js.map +1 -0
  110. package/dist/tui/views/Tunnels.d.ts +10 -0
  111. package/dist/tui/views/Tunnels.d.ts.map +1 -0
  112. package/dist/tui/views/Tunnels.js +283 -0
  113. package/dist/tui/views/Tunnels.js.map +1 -0
  114. package/package.json +62 -0
@@ -0,0 +1,150 @@
1
+ import * as api from '../lib/api.js';
2
+ import * as config from '../lib/config.js';
3
+ import * as logger from '../lib/logger.js';
4
+ import { TunnelClient } from '../lib/tunnel.js';
5
+ export async function tunnelCommand(port, options) {
6
+ // Check auth
7
+ if (!config.isAuthenticated()) {
8
+ logger.error('Not logged in. Run "webhookrelay login" first.');
9
+ process.exit(1);
10
+ }
11
+ const org = config.getCurrentOrg();
12
+ if (!org) {
13
+ logger.error('No organization selected.');
14
+ process.exit(1);
15
+ }
16
+ const localPort = parseInt(port, 10);
17
+ if (isNaN(localPort) || localPort < 1 || localPort > 65535) {
18
+ logger.error('Invalid port number');
19
+ process.exit(1);
20
+ }
21
+ // Check if port is accessible
22
+ const spinner = logger.spinner(`Checking localhost:${localPort}...`);
23
+ try {
24
+ const testResult = await fetch(`http://localhost:${localPort}`, {
25
+ method: 'HEAD',
26
+ signal: AbortSignal.timeout(2000),
27
+ }).catch(() => null);
28
+ if (!testResult) {
29
+ spinner.warn(`localhost:${localPort} not responding (tunnel will still work)`);
30
+ }
31
+ else {
32
+ spinner.succeed(`localhost:${localPort} is accessible`);
33
+ }
34
+ }
35
+ catch {
36
+ spinner.warn(`Could not verify localhost:${localPort} (tunnel will still work)`);
37
+ }
38
+ // Create or find tunnel
39
+ const createSpinner = logger.spinner('Setting up tunnel...');
40
+ // First check for existing tunnels
41
+ const existingResult = await api.getTunnels();
42
+ let tunnelInfo;
43
+ if (existingResult.data?.tunnels && existingResult.data.tunnels.length > 0) {
44
+ // Reuse existing tunnel if available
45
+ const existing = existingResult.data.tunnels.find(t => t.status === 'disconnected');
46
+ if (existing) {
47
+ // Need to get the full tunnel with auth token by creating a new one or using the existing
48
+ // For now, create a new one
49
+ }
50
+ }
51
+ // Create new tunnel
52
+ const tunnelName = options.name || `tunnel-${localPort}`;
53
+ const result = await api.createTunnel(tunnelName, options.subdomain);
54
+ if (result.error) {
55
+ createSpinner.fail('Failed to create tunnel');
56
+ logger.error(result.error);
57
+ process.exit(1);
58
+ }
59
+ if (!result.data) {
60
+ createSpinner.fail('Failed to create tunnel');
61
+ process.exit(1);
62
+ }
63
+ tunnelInfo = result.data;
64
+ createSpinner.succeed('Tunnel created');
65
+ logger.log('');
66
+ logger.box('Tunnel Info', [
67
+ `Public URL: ${logger.cyan(tunnelInfo.tunnelUrl)}`,
68
+ `Local: ${logger.dimText(`http://localhost:${localPort}`)}`,
69
+ `Subdomain: ${tunnelInfo.tunnel.subdomain}`,
70
+ ].join('\n'));
71
+ logger.log('');
72
+ // Connect to tunnel
73
+ const connectSpinner = logger.spinner('Connecting...');
74
+ const client = new TunnelClient({
75
+ wsUrl: tunnelInfo.wsUrl,
76
+ localPort,
77
+ onConnect: () => {
78
+ connectSpinner.succeed('Connected!');
79
+ logger.log('');
80
+ logger.success(`Forwarding ${tunnelInfo.tunnelUrl} → localhost:${localPort}`);
81
+ logger.log('');
82
+ logger.dim('Press Ctrl+C to stop the tunnel');
83
+ logger.log('');
84
+ logger.log(logger.dimText('─'.repeat(60)));
85
+ logger.log(logger.dimText('Incoming requests:'));
86
+ },
87
+ onDisconnect: () => {
88
+ logger.warn('Disconnected from tunnel server');
89
+ },
90
+ onRequest: (method, path, status, duration) => {
91
+ logger.requestLog(method, path, status, duration);
92
+ },
93
+ onError: (error) => {
94
+ logger.error(`WebSocket error: ${error.message}`);
95
+ },
96
+ });
97
+ try {
98
+ await client.connect();
99
+ }
100
+ catch (error) {
101
+ connectSpinner.fail('Failed to connect');
102
+ logger.error(error instanceof Error ? error.message : 'Connection failed');
103
+ process.exit(1);
104
+ }
105
+ // Handle shutdown
106
+ const shutdown = async () => {
107
+ logger.log('');
108
+ logger.info('Shutting down tunnel...');
109
+ client.close();
110
+ // Delete the tunnel
111
+ if (tunnelInfo) {
112
+ await api.deleteTunnel(tunnelInfo.tunnel.id);
113
+ }
114
+ logger.success('Tunnel closed');
115
+ process.exit(0);
116
+ };
117
+ process.on('SIGINT', shutdown);
118
+ process.on('SIGTERM', shutdown);
119
+ // Keep the process running
120
+ await new Promise(() => { });
121
+ }
122
+ export async function tunnelListCommand() {
123
+ if (!config.isAuthenticated()) {
124
+ logger.error('Not logged in. Run "webhookrelay login" first.');
125
+ process.exit(1);
126
+ }
127
+ const spinner = logger.spinner('Fetching tunnels...');
128
+ const result = await api.getTunnels();
129
+ if (result.error) {
130
+ spinner.fail('Failed to fetch tunnels');
131
+ logger.error(result.error);
132
+ return;
133
+ }
134
+ spinner.stop();
135
+ const tunnels = result.data?.tunnels || [];
136
+ if (tunnels.length === 0) {
137
+ logger.info('No tunnels found');
138
+ logger.dim('Run "webhookrelay tunnel <port>" to create one');
139
+ return;
140
+ }
141
+ logger.table(['Name', 'Subdomain', 'Status', 'Requests'], tunnels.map(t => [
142
+ t.name,
143
+ t.subdomain,
144
+ t.status === 'connected' ? logger.green(t.status) :
145
+ t.status === 'error' ? logger.red(t.status) :
146
+ logger.dimText(t.status),
147
+ t.total_requests.toString(),
148
+ ]));
149
+ }
150
+ //# sourceMappingURL=tunnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/commands/tunnel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export declare function tunnelsListCommand(options: {
2
+ json?: boolean;
3
+ }): Promise<void>;
4
+ export declare function tunnelsCreateCommand(options: {
5
+ name?: string;
6
+ subdomain?: string;
7
+ yes?: boolean;
8
+ json?: boolean;
9
+ }): Promise<void>;
10
+ export declare function tunnelsConnectCommand(tunnelId: string, port: string, options: {
11
+ json?: boolean;
12
+ }): Promise<void>;
13
+ export declare function tunnelsStartCommand(port: string, options: {
14
+ name?: string;
15
+ subdomain?: string;
16
+ json?: boolean;
17
+ }): Promise<void>;
18
+ export declare function tunnelsDisconnectCommand(tunnelId: string, options: {
19
+ yes?: boolean;
20
+ json?: boolean;
21
+ }): Promise<void>;
22
+ export declare function tunnelsDeleteCommand(tunnelId: string, options: {
23
+ yes?: boolean;
24
+ json?: boolean;
25
+ }): Promise<void>;
26
+ export declare function tunnelsStatusCommand(tunnelId: string, options: {
27
+ json?: boolean;
28
+ }): Promise<void>;
29
+ export declare function tunnelsGetCommand(tunnelId: string, options: {
30
+ json?: boolean;
31
+ }): Promise<void>;
32
+ //# sourceMappingURL=tunnels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnels.d.ts","sourceRoot":"","sources":["../../src/commands/tunnels.ts"],"names":[],"mappings":"AA2BA,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CnF;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiEhB;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAiHf;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7D,OAAO,CAAC,IAAI,CAAC,CAiHf;AAED,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GACzC,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GACzC,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CA6Cf;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CA4Cf"}
@@ -0,0 +1,432 @@
1
+ import { input, confirm } from '@inquirer/prompts';
2
+ import * as api from '../lib/api.js';
3
+ import * as config from '../lib/config.js';
4
+ import * as logger from '../lib/logger.js';
5
+ import { TunnelClient } from '../lib/tunnel.js';
6
+ function requireAuth() {
7
+ if (!config.isAuthenticated()) {
8
+ logger.error('Not logged in. Run "hookbase login" first.');
9
+ process.exit(1);
10
+ }
11
+ return true;
12
+ }
13
+ function formatStatus(status) {
14
+ switch (status) {
15
+ case 'connected':
16
+ return logger.green('connected');
17
+ case 'disconnected':
18
+ return logger.dimText('disconnected');
19
+ case 'error':
20
+ return logger.red('error');
21
+ default:
22
+ return logger.dimText(status);
23
+ }
24
+ }
25
+ export async function tunnelsListCommand(options) {
26
+ requireAuth();
27
+ const spinner = logger.spinner('Fetching tunnels...');
28
+ const result = await api.getTunnels();
29
+ if (result.error) {
30
+ spinner.fail('Failed to fetch tunnels');
31
+ logger.error(result.error);
32
+ return;
33
+ }
34
+ spinner.stop();
35
+ const tunnels = result.data?.tunnels || [];
36
+ if (options.json) {
37
+ console.log(JSON.stringify(tunnels, null, 2));
38
+ return;
39
+ }
40
+ if (tunnels.length === 0) {
41
+ logger.info('No tunnels found');
42
+ logger.dim('Create one with "hookbase tunnels create" or "hookbase tunnels start <port>"');
43
+ return;
44
+ }
45
+ const apiUrl = config.getApiUrl();
46
+ const tunnelDomain = `${apiUrl}/t`;
47
+ logger.table(['ID', 'Name', 'Subdomain', 'Status', 'Requests', 'Last Connected'], tunnels.map(t => [
48
+ t.id.slice(0, 8) + '...',
49
+ t.name,
50
+ t.subdomain,
51
+ formatStatus(t.status),
52
+ String(t.total_requests),
53
+ t.last_connected_at ? new Date(t.last_connected_at).toLocaleDateString() : 'Never',
54
+ ]));
55
+ logger.log('');
56
+ logger.dim(`Tunnel URL format: ${tunnelDomain}/<subdomain>`);
57
+ }
58
+ export async function tunnelsCreateCommand(options) {
59
+ requireAuth();
60
+ let name = options.name;
61
+ let subdomain = options.subdomain;
62
+ // Interactive mode
63
+ if (!name) {
64
+ name = await input({
65
+ message: 'Tunnel name:',
66
+ validate: (value) => value.length > 0 || 'Name is required',
67
+ });
68
+ const customSubdomain = await confirm({
69
+ message: 'Set a custom subdomain? (Pro feature)',
70
+ default: false,
71
+ });
72
+ if (customSubdomain) {
73
+ subdomain = await input({
74
+ message: 'Subdomain:',
75
+ validate: (value) => /^[a-z0-9-]+$/.test(value) || 'Subdomain must be lowercase letters, numbers, and hyphens',
76
+ });
77
+ }
78
+ }
79
+ if (!options.yes && !options.name) {
80
+ const confirmed = await confirm({
81
+ message: `Create tunnel "${name}"${subdomain ? ` with subdomain "${subdomain}"` : ''}?`,
82
+ default: true,
83
+ });
84
+ if (!confirmed) {
85
+ logger.info('Cancelled');
86
+ return;
87
+ }
88
+ }
89
+ const spinner = logger.spinner('Creating tunnel...');
90
+ const result = await api.createTunnel(name, subdomain);
91
+ if (result.error) {
92
+ spinner.fail('Failed to create tunnel');
93
+ logger.error(result.error);
94
+ return;
95
+ }
96
+ spinner.succeed('Tunnel created');
97
+ if (options.json) {
98
+ console.log(JSON.stringify(result.data, null, 2));
99
+ return;
100
+ }
101
+ const tunnelInfo = result.data;
102
+ if (tunnelInfo) {
103
+ logger.log('');
104
+ logger.box('Tunnel Created', [
105
+ `ID: ${tunnelInfo.tunnel.id}`,
106
+ `Name: ${tunnelInfo.tunnel.name}`,
107
+ `Subdomain: ${tunnelInfo.tunnel.subdomain}`,
108
+ `URL: ${tunnelInfo.tunnelUrl}`,
109
+ ``,
110
+ `Connect with: hookbase tunnels connect ${tunnelInfo.tunnel.id} <port>`,
111
+ ].join('\n'));
112
+ }
113
+ }
114
+ export async function tunnelsConnectCommand(tunnelId, port, options) {
115
+ requireAuth();
116
+ const localPort = parseInt(port, 10);
117
+ if (isNaN(localPort) || localPort < 1 || localPort > 65535) {
118
+ logger.error('Invalid port number');
119
+ process.exit(1);
120
+ }
121
+ // First get the tunnel info
122
+ const spinner = logger.spinner('Fetching tunnel...');
123
+ const tunnelResult = await api.getTunnel(tunnelId);
124
+ if (tunnelResult.error) {
125
+ spinner.fail('Failed to fetch tunnel');
126
+ logger.error(tunnelResult.error);
127
+ return;
128
+ }
129
+ const tunnel = tunnelResult.data?.tunnel;
130
+ if (!tunnel) {
131
+ spinner.fail('Tunnel not found');
132
+ return;
133
+ }
134
+ if (tunnel.status === 'connected') {
135
+ spinner.fail('Tunnel is already connected');
136
+ logger.dim('Use "hookbase tunnels disconnect" first or use a different tunnel');
137
+ return;
138
+ }
139
+ // Regenerate token to get the auth token
140
+ const tokenResult = await api.regenerateTunnelToken(tunnelId);
141
+ if (tokenResult.error) {
142
+ spinner.fail('Failed to get tunnel token');
143
+ logger.error(tokenResult.error);
144
+ return;
145
+ }
146
+ spinner.stop();
147
+ const authToken = tokenResult.data?.authToken;
148
+ if (!authToken) {
149
+ logger.error('Failed to get auth token');
150
+ return;
151
+ }
152
+ // Build WebSocket URL
153
+ const apiUrl = config.getApiUrl();
154
+ const wsUrl = apiUrl
155
+ .replace('https://', 'wss://')
156
+ .replace('http://', 'ws://') +
157
+ `/tunnels/${tunnel.subdomain}/ws?tunnelId=${tunnel.id}&token=${authToken}`;
158
+ const tunnelUrl = `${apiUrl}/t/${tunnel.subdomain}`;
159
+ logger.log('');
160
+ logger.box('Tunnel Info', [
161
+ `Public URL: ${logger.cyan(tunnelUrl)}`,
162
+ `Local: ${logger.dimText(`http://localhost:${localPort}`)}`,
163
+ `Subdomain: ${tunnel.subdomain}`,
164
+ ].join('\n'));
165
+ logger.log('');
166
+ // Connect
167
+ const connectSpinner = logger.spinner('Connecting...');
168
+ const client = new TunnelClient({
169
+ wsUrl,
170
+ localPort,
171
+ onConnect: () => {
172
+ connectSpinner.succeed('Connected!');
173
+ logger.log('');
174
+ logger.success(`Forwarding ${tunnelUrl} → localhost:${localPort}`);
175
+ logger.log('');
176
+ logger.dim('Press Ctrl+C to stop the tunnel');
177
+ logger.log('');
178
+ logger.log(logger.dimText('─'.repeat(60)));
179
+ logger.log(logger.dimText('Incoming requests:'));
180
+ },
181
+ onDisconnect: () => {
182
+ logger.warn('Disconnected from tunnel server');
183
+ },
184
+ onRequest: (method, path, status, duration) => {
185
+ logger.requestLog(method, path, status, duration);
186
+ },
187
+ onError: (error) => {
188
+ logger.error(`WebSocket error: ${error.message}`);
189
+ },
190
+ });
191
+ try {
192
+ await client.connect();
193
+ }
194
+ catch (error) {
195
+ connectSpinner.fail('Failed to connect');
196
+ logger.error(error instanceof Error ? error.message : 'Connection failed');
197
+ process.exit(1);
198
+ }
199
+ // Handle shutdown
200
+ const shutdown = async () => {
201
+ logger.log('');
202
+ logger.info('Disconnecting from tunnel...');
203
+ client.close();
204
+ logger.success('Disconnected');
205
+ process.exit(0);
206
+ };
207
+ process.on('SIGINT', shutdown);
208
+ process.on('SIGTERM', shutdown);
209
+ // Keep the process running
210
+ await new Promise(() => { });
211
+ }
212
+ export async function tunnelsStartCommand(port, options) {
213
+ requireAuth();
214
+ const org = config.getCurrentOrg();
215
+ if (!org) {
216
+ logger.error('No organization selected.');
217
+ process.exit(1);
218
+ }
219
+ const localPort = parseInt(port, 10);
220
+ if (isNaN(localPort) || localPort < 1 || localPort > 65535) {
221
+ logger.error('Invalid port number');
222
+ process.exit(1);
223
+ }
224
+ // Check if port is accessible
225
+ const spinner = logger.spinner(`Checking localhost:${localPort}...`);
226
+ try {
227
+ const testResult = await fetch(`http://localhost:${localPort}`, {
228
+ method: 'HEAD',
229
+ signal: AbortSignal.timeout(2000),
230
+ }).catch(() => null);
231
+ if (!testResult) {
232
+ spinner.warn(`localhost:${localPort} not responding (tunnel will still work)`);
233
+ }
234
+ else {
235
+ spinner.succeed(`localhost:${localPort} is accessible`);
236
+ }
237
+ }
238
+ catch {
239
+ spinner.warn(`Could not verify localhost:${localPort} (tunnel will still work)`);
240
+ }
241
+ // Create new tunnel
242
+ const createSpinner = logger.spinner('Creating tunnel...');
243
+ const tunnelName = options.name || `tunnel-${localPort}`;
244
+ const result = await api.createTunnel(tunnelName, options.subdomain);
245
+ if (result.error) {
246
+ createSpinner.fail('Failed to create tunnel');
247
+ logger.error(result.error);
248
+ process.exit(1);
249
+ }
250
+ if (!result.data) {
251
+ createSpinner.fail('Failed to create tunnel');
252
+ process.exit(1);
253
+ }
254
+ const tunnelInfo = result.data;
255
+ createSpinner.succeed('Tunnel created');
256
+ logger.log('');
257
+ logger.box('Tunnel Info', [
258
+ `Public URL: ${logger.cyan(tunnelInfo.tunnelUrl)}`,
259
+ `Local: ${logger.dimText(`http://localhost:${localPort}`)}`,
260
+ `Subdomain: ${tunnelInfo.tunnel.subdomain}`,
261
+ ].join('\n'));
262
+ logger.log('');
263
+ // Connect
264
+ const connectSpinner = logger.spinner('Connecting...');
265
+ const client = new TunnelClient({
266
+ wsUrl: tunnelInfo.wsUrl,
267
+ localPort,
268
+ onConnect: () => {
269
+ connectSpinner.succeed('Connected!');
270
+ logger.log('');
271
+ logger.success(`Forwarding ${tunnelInfo.tunnelUrl} → localhost:${localPort}`);
272
+ logger.log('');
273
+ logger.dim('Press Ctrl+C to stop the tunnel');
274
+ logger.log('');
275
+ logger.log(logger.dimText('─'.repeat(60)));
276
+ logger.log(logger.dimText('Incoming requests:'));
277
+ },
278
+ onDisconnect: () => {
279
+ logger.warn('Disconnected from tunnel server');
280
+ },
281
+ onRequest: (method, path, status, duration) => {
282
+ logger.requestLog(method, path, status, duration);
283
+ },
284
+ onError: (error) => {
285
+ logger.error(`WebSocket error: ${error.message}`);
286
+ },
287
+ });
288
+ try {
289
+ await client.connect();
290
+ }
291
+ catch (error) {
292
+ connectSpinner.fail('Failed to connect');
293
+ logger.error(error instanceof Error ? error.message : 'Connection failed');
294
+ process.exit(1);
295
+ }
296
+ // Handle shutdown
297
+ const shutdown = async () => {
298
+ logger.log('');
299
+ logger.info('Shutting down tunnel...');
300
+ client.close();
301
+ // Delete the tunnel
302
+ await api.deleteTunnel(tunnelInfo.tunnel.id);
303
+ logger.success('Tunnel closed');
304
+ process.exit(0);
305
+ };
306
+ process.on('SIGINT', shutdown);
307
+ process.on('SIGTERM', shutdown);
308
+ // Keep the process running
309
+ await new Promise(() => { });
310
+ }
311
+ export async function tunnelsDisconnectCommand(tunnelId, options) {
312
+ requireAuth();
313
+ if (!options.yes) {
314
+ const confirmed = await confirm({
315
+ message: `Disconnect tunnel ${tunnelId}?`,
316
+ default: true,
317
+ });
318
+ if (!confirmed) {
319
+ logger.info('Cancelled');
320
+ return;
321
+ }
322
+ }
323
+ const spinner = logger.spinner('Disconnecting tunnel...');
324
+ const result = await api.disconnectTunnel(tunnelId);
325
+ if (result.error) {
326
+ spinner.fail('Failed to disconnect tunnel');
327
+ logger.error(result.error);
328
+ return;
329
+ }
330
+ spinner.succeed('Tunnel disconnected');
331
+ if (options.json) {
332
+ console.log(JSON.stringify({ success: true, tunnelId }, null, 2));
333
+ }
334
+ }
335
+ export async function tunnelsDeleteCommand(tunnelId, options) {
336
+ requireAuth();
337
+ if (!options.yes) {
338
+ const confirmed = await confirm({
339
+ message: `Are you sure you want to delete tunnel ${tunnelId}? This cannot be undone.`,
340
+ default: false,
341
+ });
342
+ if (!confirmed) {
343
+ logger.info('Cancelled');
344
+ return;
345
+ }
346
+ }
347
+ const spinner = logger.spinner('Deleting tunnel...');
348
+ const result = await api.deleteTunnel(tunnelId);
349
+ if (result.error) {
350
+ spinner.fail('Failed to delete tunnel');
351
+ logger.error(result.error);
352
+ return;
353
+ }
354
+ spinner.succeed('Tunnel deleted');
355
+ if (options.json) {
356
+ console.log(JSON.stringify({ success: true, tunnelId }, null, 2));
357
+ }
358
+ }
359
+ export async function tunnelsStatusCommand(tunnelId, options) {
360
+ requireAuth();
361
+ const spinner = logger.spinner('Fetching tunnel status...');
362
+ const result = await api.getTunnelStatus(tunnelId);
363
+ if (result.error) {
364
+ spinner.fail('Failed to fetch tunnel status');
365
+ logger.error(result.error);
366
+ return;
367
+ }
368
+ spinner.stop();
369
+ const { tunnel, liveStatus } = result.data || {};
370
+ if (options.json) {
371
+ console.log(JSON.stringify(result.data, null, 2));
372
+ return;
373
+ }
374
+ if (!tunnel) {
375
+ logger.error('Tunnel not found');
376
+ return;
377
+ }
378
+ const apiUrl = config.getApiUrl();
379
+ const tunnelUrl = `${apiUrl}/t/${tunnel.subdomain}`;
380
+ logger.log('');
381
+ logger.log(logger.bold('Tunnel Status'));
382
+ logger.log('');
383
+ logger.log(`ID: ${tunnel.id}`);
384
+ logger.log(`Name: ${tunnel.name}`);
385
+ logger.log(`Subdomain: ${tunnel.subdomain}`);
386
+ logger.log(`URL: ${tunnelUrl}`);
387
+ logger.log(`Status: ${formatStatus(tunnel.status)}`);
388
+ logger.log(`Total Requests: ${tunnel.total_requests}`);
389
+ logger.log(`Last Connected: ${tunnel.last_connected_at ? new Date(tunnel.last_connected_at).toLocaleString() : 'Never'}`);
390
+ if (liveStatus && typeof liveStatus === 'object') {
391
+ logger.log('');
392
+ logger.log(logger.bold('Live Status:'));
393
+ logger.log(JSON.stringify(liveStatus, null, 2));
394
+ }
395
+ }
396
+ export async function tunnelsGetCommand(tunnelId, options) {
397
+ requireAuth();
398
+ const spinner = logger.spinner('Fetching tunnel...');
399
+ const result = await api.getTunnel(tunnelId);
400
+ if (result.error) {
401
+ spinner.fail('Failed to fetch tunnel');
402
+ logger.error(result.error);
403
+ return;
404
+ }
405
+ spinner.stop();
406
+ const tunnel = result.data?.tunnel;
407
+ if (options.json) {
408
+ console.log(JSON.stringify(tunnel, null, 2));
409
+ return;
410
+ }
411
+ if (!tunnel) {
412
+ logger.error('Tunnel not found');
413
+ return;
414
+ }
415
+ const apiUrl = config.getApiUrl();
416
+ const tunnelUrl = `${apiUrl}/t/${tunnel.subdomain}`;
417
+ logger.log('');
418
+ logger.log(logger.bold('Tunnel Details'));
419
+ logger.log('');
420
+ logger.log(`ID: ${tunnel.id}`);
421
+ logger.log(`Name: ${tunnel.name}`);
422
+ logger.log(`Subdomain: ${tunnel.subdomain}`);
423
+ logger.log(`URL: ${tunnelUrl}`);
424
+ logger.log(`Status: ${formatStatus(tunnel.status)}`);
425
+ logger.log(`Total Requests: ${tunnel.total_requests}`);
426
+ logger.log(`Last Connected: ${tunnel.last_connected_at ? new Date(tunnel.last_connected_at).toLocaleString() : 'Never'}`);
427
+ logger.log('');
428
+ if (tunnel.status === 'disconnected') {
429
+ logger.dim(`Connect with: hookbase tunnels connect ${tunnel.id} <port>`);
430
+ }
431
+ }
432
+ //# sourceMappingURL=tunnels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnels.js","sourceRoot":"","sources":["../../src/commands/tunnels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}