@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.
- package/README.md +107 -0
- package/dist/commands/api-keys.d.ts +15 -0
- package/dist/commands/api-keys.d.ts.map +1 -0
- package/dist/commands/api-keys.js +143 -0
- package/dist/commands/api-keys.js.map +1 -0
- package/dist/commands/dashboard.d.ts +3 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +26 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/deliveries.d.ts +22 -0
- package/dist/commands/deliveries.d.ts.map +1 -0
- package/dist/commands/deliveries.js +223 -0
- package/dist/commands/deliveries.js.map +1 -0
- package/dist/commands/destinations.d.ts +29 -0
- package/dist/commands/destinations.d.ts.map +1 -0
- package/dist/commands/destinations.js +232 -0
- package/dist/commands/destinations.js.map +1 -0
- package/dist/commands/events.d.ts +13 -0
- package/dist/commands/events.d.ts.map +1 -0
- package/dist/commands/events.js +192 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/forward.d.ts +2 -0
- package/dist/commands/forward.d.ts.map +1 -0
- package/dist/commands/forward.js +25 -0
- package/dist/commands/forward.js.map +1 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +91 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +12 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/logs.d.ts +5 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +43 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/routes.d.ts +28 -0
- package/dist/commands/routes.d.ts.map +1 -0
- package/dist/commands/routes.js +225 -0
- package/dist/commands/routes.js.map +1 -0
- package/dist/commands/sources.d.ts +30 -0
- package/dist/commands/sources.d.ts.map +1 -0
- package/dist/commands/sources.js +256 -0
- package/dist/commands/sources.js.map +1 -0
- package/dist/commands/tunnel.d.ts +6 -0
- package/dist/commands/tunnel.d.ts.map +1 -0
- package/dist/commands/tunnel.js +150 -0
- package/dist/commands/tunnel.js.map +1 -0
- package/dist/commands/tunnels.d.ts +32 -0
- package/dist/commands/tunnels.d.ts.map +1 -0
- package/dist/commands/tunnels.js +432 -0
- package/dist/commands/tunnels.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +430 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +472 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +480 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/config.d.ts +31 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +98 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/logger.d.ts +19 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +90 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/tunnel.d.ts +28 -0
- package/dist/lib/tunnel.d.ts.map +1 -0
- package/dist/lib/tunnel.js +197 -0
- package/dist/lib/tunnel.js.map +1 -0
- package/dist/tui/App.d.ts +2 -0
- package/dist/tui/App.d.ts.map +1 -0
- package/dist/tui/App.js +136 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/Dashboard.d.ts +2 -0
- package/dist/tui/Dashboard.d.ts.map +1 -0
- package/dist/tui/Dashboard.js +113 -0
- package/dist/tui/Dashboard.js.map +1 -0
- package/dist/tui/TunnelMonitor.d.ts +2 -0
- package/dist/tui/TunnelMonitor.d.ts.map +1 -0
- package/dist/tui/TunnelMonitor.js +131 -0
- package/dist/tui/TunnelMonitor.js.map +1 -0
- package/dist/tui/components/Box.d.ts +22 -0
- package/dist/tui/components/Box.d.ts.map +1 -0
- package/dist/tui/components/Box.js +27 -0
- package/dist/tui/components/Box.js.map +1 -0
- package/dist/tui/views/Analytics.d.ts +6 -0
- package/dist/tui/views/Analytics.d.ts.map +1 -0
- package/dist/tui/views/Analytics.js +104 -0
- package/dist/tui/views/Analytics.js.map +1 -0
- package/dist/tui/views/Destinations.d.ts +10 -0
- package/dist/tui/views/Destinations.d.ts.map +1 -0
- package/dist/tui/views/Destinations.js +156 -0
- package/dist/tui/views/Destinations.js.map +1 -0
- package/dist/tui/views/Events.d.ts +9 -0
- package/dist/tui/views/Events.d.ts.map +1 -0
- package/dist/tui/views/Events.js +60 -0
- package/dist/tui/views/Events.js.map +1 -0
- package/dist/tui/views/Overview.d.ts +13 -0
- package/dist/tui/views/Overview.d.ts.map +1 -0
- package/dist/tui/views/Overview.js +29 -0
- package/dist/tui/views/Overview.js.map +1 -0
- package/dist/tui/views/Sources.d.ts +10 -0
- package/dist/tui/views/Sources.d.ts.map +1 -0
- package/dist/tui/views/Sources.js +151 -0
- package/dist/tui/views/Sources.js.map +1 -0
- package/dist/tui/views/Tunnels.d.ts +10 -0
- package/dist/tui/views/Tunnels.d.ts.map +1 -0
- package/dist/tui/views/Tunnels.js +283 -0
- package/dist/tui/views/Tunnels.js.map +1 -0
- 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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|