@hooklink/cli 0.1.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 +235 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +74 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/connect.d.ts +3 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +169 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/endpoints.d.ts +3 -0
- package/dist/commands/endpoints.d.ts.map +1 -0
- package/dist/commands/endpoints.js +58 -0
- package/dist/commands/endpoints.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +82 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +3 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +17 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +77 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +43 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/core/http-forwarder.d.ts +10 -0
- package/dist/core/http-forwarder.d.ts.map +1 -0
- package/dist/core/http-forwarder.js +98 -0
- package/dist/core/http-forwarder.js.map +1 -0
- package/dist/core/websocket-client.d.ts +30 -0
- package/dist/core/websocket-client.d.ts.map +1 -0
- package/dist/core/websocket-client.js +167 -0
- package/dist/core/websocket-client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +69 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/api.d.ts +21 -0
- package/dist/utils/api.d.ts.map +1 -0
- package/dist/utils/api.js +62 -0
- package/dist/utils/api.js.map +1 -0
- package/dist/utils/config.d.ts +15 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +58 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +50 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/sentry.d.ts +2 -0
- package/dist/utils/sentry.d.ts.map +1 -0
- package/dist/utils/sentry.js +21 -0
- package/dist/utils/sentry.js.map +1 -0
- package/package.json +64 -0
package/README.md
ADDED
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# HookLink CLI
|
|
2
|
+
|
|
3
|
+
Forward webhooks to your local development machine via WebSocket tunnel.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @hooklink/cli
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or use locally:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install
|
|
15
|
+
npm run build
|
|
16
|
+
npm link
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
1. **Login with your API key:**
|
|
22
|
+
```bash
|
|
23
|
+
hooklink login
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
2. **View your endpoints:**
|
|
27
|
+
```bash
|
|
28
|
+
hooklink endpoints
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
3. **Connect and start forwarding:**
|
|
32
|
+
```bash
|
|
33
|
+
hooklink connect myapp --target http://localhost:3000
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Commands
|
|
37
|
+
|
|
38
|
+
### `hooklink login`
|
|
39
|
+
|
|
40
|
+
Authenticate with your HookLink API key.
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Interactive prompt
|
|
44
|
+
hooklink login
|
|
45
|
+
|
|
46
|
+
# With API key flag
|
|
47
|
+
hooklink login --key hlk_your_api_key_here
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### `hooklink logout`
|
|
51
|
+
|
|
52
|
+
Clear stored credentials.
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
hooklink logout
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### `hooklink connect [endpoint]`
|
|
59
|
+
|
|
60
|
+
Connect to HookLink and forward webhooks to your local server.
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Connect to specific endpoint
|
|
64
|
+
hooklink connect myapp --target http://localhost:3000
|
|
65
|
+
|
|
66
|
+
# Use port shorthand
|
|
67
|
+
hooklink connect myapp --port 3000
|
|
68
|
+
|
|
69
|
+
# Connect to first active endpoint
|
|
70
|
+
hooklink connect --port 8080
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Options:**
|
|
74
|
+
- `-t, --target <url>` - Local target URL (default: http://localhost:3000)
|
|
75
|
+
- `-p, --port <port>` - Local port (alternative to --target)
|
|
76
|
+
|
|
77
|
+
### `hooklink status`
|
|
78
|
+
|
|
79
|
+
Show current configuration and connection status.
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
hooklink status
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### `hooklink endpoints`
|
|
86
|
+
|
|
87
|
+
List all your endpoints.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
hooklink endpoints
|
|
91
|
+
# or
|
|
92
|
+
hooklink ls
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### `hooklink logs`
|
|
96
|
+
|
|
97
|
+
View recent webhook request logs.
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# Show recent logs
|
|
101
|
+
hooklink logs
|
|
102
|
+
|
|
103
|
+
# Filter by endpoint
|
|
104
|
+
hooklink logs --endpoint myapp
|
|
105
|
+
|
|
106
|
+
# Limit number of logs
|
|
107
|
+
hooklink logs --limit 50
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Options:**
|
|
111
|
+
- `-e, --endpoint <keyword>` - Filter by endpoint keyword
|
|
112
|
+
- `-l, --limit <number>` - Number of logs to fetch (default: 20)
|
|
113
|
+
|
|
114
|
+
### `hooklink config`
|
|
115
|
+
|
|
116
|
+
View or modify CLI configuration.
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
# List all configuration
|
|
120
|
+
hooklink config
|
|
121
|
+
|
|
122
|
+
# Get specific value
|
|
123
|
+
hooklink config --get apiUrl
|
|
124
|
+
|
|
125
|
+
# Set configuration value
|
|
126
|
+
hooklink config --set apiUrl=https://api.hooklink.net
|
|
127
|
+
hooklink config --set defaultPort=8080
|
|
128
|
+
|
|
129
|
+
# Delete configuration value
|
|
130
|
+
hooklink config --delete defaultPort
|
|
131
|
+
|
|
132
|
+
# Reset all configuration
|
|
133
|
+
hooklink config --reset
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Configuration
|
|
137
|
+
|
|
138
|
+
Configuration is stored in `~/.config/hooklink/config.json` (or OS-specific config directory).
|
|
139
|
+
|
|
140
|
+
**Available configuration keys:**
|
|
141
|
+
- `apiKey` - Your HookLink API key (use `hooklink login` instead)
|
|
142
|
+
- `apiUrl` - API base URL (default: https://api.hooklink.net)
|
|
143
|
+
- `wsUrl` - WebSocket server URL (default: wss://api.hooklink.net/ws)
|
|
144
|
+
- `defaultEndpoint` - Default endpoint keyword to connect to
|
|
145
|
+
- `defaultPort` - Default local port (default: 3000)
|
|
146
|
+
|
|
147
|
+
## How It Works
|
|
148
|
+
|
|
149
|
+
1. The CLI establishes a WebSocket connection to the HookLink server
|
|
150
|
+
2. When a webhook arrives at your public URL, the server forwards it through the WebSocket
|
|
151
|
+
3. The CLI receives the webhook and forwards it to your local server
|
|
152
|
+
4. The response from your local server is sent back through the WebSocket
|
|
153
|
+
5. HookLink returns the response to the original webhook sender
|
|
154
|
+
|
|
155
|
+
## Development
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
# Install dependencies
|
|
159
|
+
npm install
|
|
160
|
+
|
|
161
|
+
# Build TypeScript
|
|
162
|
+
npm run build
|
|
163
|
+
|
|
164
|
+
# Watch mode for development
|
|
165
|
+
npm run dev
|
|
166
|
+
|
|
167
|
+
# Link locally for testing
|
|
168
|
+
npm link
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Troubleshooting
|
|
172
|
+
|
|
173
|
+
### Connection Issues
|
|
174
|
+
|
|
175
|
+
- Ensure you're logged in: `hooklink login`
|
|
176
|
+
- Check your endpoint is active: `hooklink endpoints`
|
|
177
|
+
- Verify your local server is running
|
|
178
|
+
- Check WebSocket URL: `hooklink config --get wsUrl`
|
|
179
|
+
|
|
180
|
+
### Authentication Errors
|
|
181
|
+
|
|
182
|
+
- Verify your API key is valid: `hooklink status`
|
|
183
|
+
- Re-login if needed: `hooklink logout && hooklink login`
|
|
184
|
+
|
|
185
|
+
### Request Not Forwarding
|
|
186
|
+
|
|
187
|
+
- Check logs: `hooklink logs`
|
|
188
|
+
- Ensure your endpoint URL matches the webhook source
|
|
189
|
+
- Verify source whitelist settings in the dashboard
|
|
190
|
+
|
|
191
|
+
## Examples
|
|
192
|
+
|
|
193
|
+
### Basic Usage
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
# Login
|
|
197
|
+
hooklink login --key hlk_your_api_key
|
|
198
|
+
|
|
199
|
+
# Start forwarding to localhost:3000
|
|
200
|
+
hooklink connect myapp
|
|
201
|
+
|
|
202
|
+
# Start forwarding to different port
|
|
203
|
+
hooklink connect myapp --port 8080
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Custom Configuration
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
# Set custom API URL (for self-hosted)
|
|
210
|
+
hooklink config --set apiUrl=https://api.yourdomain.com
|
|
211
|
+
hooklink config --set wsUrl=wss://ws.yourdomain.com
|
|
212
|
+
|
|
213
|
+
# Set default port
|
|
214
|
+
hooklink config --set defaultPort=8080
|
|
215
|
+
|
|
216
|
+
# Now connect uses your defaults
|
|
217
|
+
hooklink connect myapp
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Viewing Logs
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
# View recent logs
|
|
224
|
+
hooklink logs
|
|
225
|
+
|
|
226
|
+
# View logs for specific endpoint
|
|
227
|
+
hooklink logs --endpoint myapp
|
|
228
|
+
|
|
229
|
+
# View more logs
|
|
230
|
+
hooklink logs --limit 100
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## License
|
|
234
|
+
|
|
235
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,aAAa,SAqEtB,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.configCommand = void 0;
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const config_1 = require("../utils/config");
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
exports.configCommand = new commander_1.Command('config')
|
|
12
|
+
.description('View or modify CLI configuration')
|
|
13
|
+
.option('-s, --set <key=value>', 'Set a configuration value')
|
|
14
|
+
.option('-g, --get <key>', 'Get a configuration value')
|
|
15
|
+
.option('-d, --delete <key>', 'Delete a configuration value')
|
|
16
|
+
.option('-l, --list', 'List all configuration values')
|
|
17
|
+
.option('--reset', 'Reset all configuration to defaults')
|
|
18
|
+
.action((options) => {
|
|
19
|
+
if (options.set) {
|
|
20
|
+
const [key, value] = options.set.split('=');
|
|
21
|
+
if (!key || !value) {
|
|
22
|
+
logger_1.Logger.error('Invalid format. Use: --set key=value');
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
const validKeys = ['apiUrl', 'wsUrl', 'defaultEndpoint', 'defaultPort'];
|
|
26
|
+
if (!validKeys.includes(key)) {
|
|
27
|
+
logger_1.Logger.error(`Invalid config key. Valid keys: ${validKeys.join(', ')}`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
const parsedValue = key === 'defaultPort' ? parseInt(value) : value;
|
|
31
|
+
config_1.config.set(key, parsedValue);
|
|
32
|
+
logger_1.Logger.success(`Set ${key} = ${value}`);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (options.get) {
|
|
36
|
+
const value = config_1.config.get(options.get);
|
|
37
|
+
if (value === undefined) {
|
|
38
|
+
logger_1.Logger.warning(`Key "${options.get}" not found`);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
logger_1.Logger.log(`${options.get} = ${value}`);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (options.delete) {
|
|
45
|
+
if (options.delete === 'apiKey') {
|
|
46
|
+
logger_1.Logger.error('Cannot delete apiKey. Use: hooklink logout');
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
config_1.config.delete(options.delete);
|
|
50
|
+
logger_1.Logger.success(`Deleted ${options.delete}`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (options.reset) {
|
|
54
|
+
config_1.config.clear();
|
|
55
|
+
logger_1.Logger.success('Configuration reset to defaults');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// Default: list all
|
|
59
|
+
const allConfig = config_1.config.getAll();
|
|
60
|
+
logger_1.Logger.log('');
|
|
61
|
+
logger_1.Logger.log(chalk_1.default.bold('Configuration:'));
|
|
62
|
+
Object.entries(allConfig).forEach(([key, value]) => {
|
|
63
|
+
if (key === 'apiKey' && value) {
|
|
64
|
+
logger_1.Logger.log(` ${key.padEnd(20)} ${chalk_1.default.gray('***hidden***')}`);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
logger_1.Logger.log(` ${key.padEnd(20)} ${chalk_1.default.cyan(value?.toString() || 'not set')}`);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
logger_1.Logger.log('');
|
|
71
|
+
logger_1.Logger.log(` ${chalk_1.default.gray('Path:')} ${config_1.config.getPath()}`);
|
|
72
|
+
logger_1.Logger.log('');
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,4CAAyC;AACzC,4CAAyC;AAG5B,QAAA,aAAa,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,uBAAuB,EAAE,2BAA2B,CAAC;KAC5D,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,CAAC;KACtD,MAAM,CAAC,oBAAoB,EAAE,8BAA8B,CAAC;KAC5D,MAAM,CAAC,YAAY,EAAE,+BAA+B,CAAC;KACrD,MAAM,CAAC,SAAS,EAAE,qCAAqC,CAAC;KACxD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;IAClB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,eAAM,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC;QACxE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,eAAM,CAAC,KAAK,CACV,mCAAmC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1D,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACpE,eAAM,CAAC,GAAG,CAAC,GAAmB,EAAE,WAAoB,CAAC,CAAC;QACtD,eAAM,CAAC,OAAO,CAAC,OAAO,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,eAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAmB,CAAC,CAAC;QACtD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,eAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,CAAC,GAAG,aAAa,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QACD,eAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAChC,eAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,eAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAsB,CAAC,CAAC;QAC9C,eAAM,CAAC,OAAO,CAAC,WAAW,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,oBAAoB;IACpB,MAAM,SAAS,GAAG,eAAM,CAAC,MAAM,EAAE,CAAC;IAClC,eAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACf,eAAM,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACzC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACjD,IAAI,GAAG,KAAK,QAAQ,IAAI,KAAK,EAAE,CAAC;YAC9B,eAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,eAAK,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC,CAAC,CAAC;IACH,eAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACf,eAAM,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,eAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC3D,eAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,cAAc,SA8KvB,CAAC"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.connectCommand = void 0;
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const ora_1 = __importDefault(require("ora"));
|
|
9
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
10
|
+
const config_1 = require("../utils/config");
|
|
11
|
+
const api_1 = require("../utils/api");
|
|
12
|
+
const logger_1 = require("../utils/logger");
|
|
13
|
+
const websocket_client_1 = require("../core/websocket-client");
|
|
14
|
+
const http_forwarder_1 = require("../core/http-forwarder");
|
|
15
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
16
|
+
exports.connectCommand = new commander_1.Command('connect')
|
|
17
|
+
.description('Connect to HookLink and forward webhooks to local server')
|
|
18
|
+
.argument('[endpoint]', 'Endpoint keyword to connect to')
|
|
19
|
+
.option('-t, --target <url>', 'Override local target URL (uses endpoint\'s configured URL by default)')
|
|
20
|
+
.option('-p, --port <port>', 'Override local port (alternative to --target)', parseInt)
|
|
21
|
+
.action(async (endpointKeyword, options) => {
|
|
22
|
+
// Check authentication
|
|
23
|
+
let apiKey = config_1.config.get('apiKey');
|
|
24
|
+
if (!apiKey) {
|
|
25
|
+
// Welcome message
|
|
26
|
+
logger_1.Logger.log('');
|
|
27
|
+
logger_1.Logger.log(chalk_1.default.cyan.bold('👋 Welcome to HookLink!'));
|
|
28
|
+
logger_1.Logger.log('');
|
|
29
|
+
logger_1.Logger.log('To get started, you\'ll need an API key.');
|
|
30
|
+
logger_1.Logger.log(chalk_1.default.gray('You can create one at: ') + chalk_1.default.cyan('https://hooklink.net/dashboard/keys'));
|
|
31
|
+
logger_1.Logger.log('');
|
|
32
|
+
// Prompt for API key
|
|
33
|
+
const answers = await inquirer_1.default.prompt([
|
|
34
|
+
{
|
|
35
|
+
type: 'password',
|
|
36
|
+
name: 'apiKey',
|
|
37
|
+
message: 'Please paste your API key:',
|
|
38
|
+
mask: '*',
|
|
39
|
+
validate: (input) => {
|
|
40
|
+
if (!input || input.trim().length === 0) {
|
|
41
|
+
return 'API key is required';
|
|
42
|
+
}
|
|
43
|
+
if (!input.startsWith('hlk_')) {
|
|
44
|
+
return 'Invalid API key format (should start with hlk_)';
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
]);
|
|
50
|
+
apiKey = answers.apiKey;
|
|
51
|
+
// Verify and save the API key
|
|
52
|
+
const spinner = (0, ora_1.default)('Verifying API key...').start();
|
|
53
|
+
try {
|
|
54
|
+
// Temporarily set API key for verification
|
|
55
|
+
config_1.config.set('apiKey', apiKey);
|
|
56
|
+
const isValid = await api_1.api.verifyApiKey();
|
|
57
|
+
if (!isValid) {
|
|
58
|
+
spinner.fail('Invalid API key');
|
|
59
|
+
config_1.config.delete('apiKey');
|
|
60
|
+
logger_1.Logger.error('Please check your API key and try again');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
// Get user info
|
|
64
|
+
const user = await api_1.api.getCurrentUser();
|
|
65
|
+
spinner.succeed(`Authenticated as ${chalk_1.default.cyan(user.user.email)}`);
|
|
66
|
+
logger_1.Logger.success('API key saved for future use');
|
|
67
|
+
logger_1.Logger.log('');
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
spinner.fail('Authentication failed');
|
|
71
|
+
config_1.config.delete('apiKey');
|
|
72
|
+
logger_1.Logger.error(error instanceof Error ? error.message : 'Unknown error');
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Determine target URL
|
|
77
|
+
let targetUrl = options.target;
|
|
78
|
+
if (!targetUrl && options.port) {
|
|
79
|
+
targetUrl = `http://localhost:${options.port}`;
|
|
80
|
+
}
|
|
81
|
+
if (!targetUrl) {
|
|
82
|
+
targetUrl = config_1.config.get('defaultPort')
|
|
83
|
+
? `http://localhost:${config_1.config.get('defaultPort')}`
|
|
84
|
+
: 'http://localhost:3000';
|
|
85
|
+
}
|
|
86
|
+
const spinner = (0, ora_1.default)('Fetching endpoints...').start();
|
|
87
|
+
try {
|
|
88
|
+
// Get endpoints
|
|
89
|
+
const endpoints = await api_1.api.getEndpoints();
|
|
90
|
+
if (endpoints.length === 0) {
|
|
91
|
+
spinner.fail('No endpoints found');
|
|
92
|
+
logger_1.Logger.info('Create an endpoint at: https://hooklink.net/dashboard/endpoints');
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
// Find endpoint
|
|
96
|
+
let endpoint = endpoints.find((e) => e.keyword === endpointKeyword);
|
|
97
|
+
if (!endpoint && endpointKeyword) {
|
|
98
|
+
spinner.fail(`Endpoint "${endpointKeyword}" not found`);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
if (!endpoint) {
|
|
102
|
+
// Use first active endpoint
|
|
103
|
+
endpoint = endpoints.find((e) => e.is_active);
|
|
104
|
+
if (!endpoint) {
|
|
105
|
+
endpoint = endpoints[0];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
spinner.succeed(`Connected to endpoint: ${chalk_1.default.cyan(endpoint.name)}`);
|
|
109
|
+
// Use endpoint's local_target_url if not overridden
|
|
110
|
+
if (!options.target && !options.port) {
|
|
111
|
+
targetUrl = endpoint.local_target_url || targetUrl;
|
|
112
|
+
logger_1.Logger.info(`Using target URL from endpoint: ${chalk_1.default.cyan(targetUrl)}`);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
logger_1.Logger.info(`Overriding endpoint target with: ${chalk_1.default.cyan(targetUrl)}`);
|
|
116
|
+
}
|
|
117
|
+
// Display connection info
|
|
118
|
+
logger_1.Logger.log('');
|
|
119
|
+
logger_1.Logger.log(chalk_1.default.bold('Connection Details:'));
|
|
120
|
+
logger_1.Logger.log(` Endpoint: ${chalk_1.default.cyan(endpoint.name)}`);
|
|
121
|
+
logger_1.Logger.log(` Keyword: ${chalk_1.default.cyan(endpoint.keyword)}`);
|
|
122
|
+
logger_1.Logger.log(` Type: ${chalk_1.default.cyan(endpoint.endpoint_type)}`);
|
|
123
|
+
logger_1.Logger.log(` Local Target: ${chalk_1.default.cyan(targetUrl)}`);
|
|
124
|
+
logger_1.Logger.log('');
|
|
125
|
+
logger_1.Logger.info('Waiting for webhooks...');
|
|
126
|
+
logger_1.Logger.log('');
|
|
127
|
+
// Create HTTP forwarder
|
|
128
|
+
const forwarder = new http_forwarder_1.HttpForwarder(targetUrl);
|
|
129
|
+
// Create WebSocket client
|
|
130
|
+
const wsUrl = config_1.config.get('wsUrl') || 'ws://localhost:3001/ws';
|
|
131
|
+
const wsClient = new websocket_client_1.WebSocketClient({
|
|
132
|
+
wsUrl,
|
|
133
|
+
apiKey: apiKey,
|
|
134
|
+
endpointId: endpoint.id,
|
|
135
|
+
onRequest: async (request) => {
|
|
136
|
+
return await forwarder.forward(request);
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
// Handle events
|
|
140
|
+
wsClient.on('connected', () => {
|
|
141
|
+
logger_1.Logger.success('WebSocket connected');
|
|
142
|
+
});
|
|
143
|
+
wsClient.on('disconnected', () => {
|
|
144
|
+
logger_1.Logger.warning('WebSocket disconnected');
|
|
145
|
+
});
|
|
146
|
+
wsClient.on('error', (error) => {
|
|
147
|
+
logger_1.Logger.error(`WebSocket error: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
148
|
+
});
|
|
149
|
+
// Handle graceful shutdown
|
|
150
|
+
process.on('SIGINT', () => {
|
|
151
|
+
logger_1.Logger.log('');
|
|
152
|
+
logger_1.Logger.info('Shutting down...');
|
|
153
|
+
wsClient.disconnect();
|
|
154
|
+
process.exit(0);
|
|
155
|
+
});
|
|
156
|
+
process.on('SIGTERM', () => {
|
|
157
|
+
wsClient.disconnect();
|
|
158
|
+
process.exit(0);
|
|
159
|
+
});
|
|
160
|
+
// Connect
|
|
161
|
+
await wsClient.connect();
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
spinner.fail('Connection failed');
|
|
165
|
+
logger_1.Logger.error(error instanceof Error ? error.message : 'Unknown error');
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
//# sourceMappingURL=connect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../src/commands/endpoints.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,gBAAgB,SAiDzB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.endpointsCommand = void 0;
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const cli_table3_1 = __importDefault(require("cli-table3"));
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const config_1 = require("../utils/config");
|
|
11
|
+
const api_1 = require("../utils/api");
|
|
12
|
+
const logger_1 = require("../utils/logger");
|
|
13
|
+
exports.endpointsCommand = new commander_1.Command('endpoints')
|
|
14
|
+
.description('List all your endpoints')
|
|
15
|
+
.alias('ls')
|
|
16
|
+
.action(async () => {
|
|
17
|
+
const apiKey = config_1.config.get('apiKey');
|
|
18
|
+
if (!apiKey) {
|
|
19
|
+
logger_1.Logger.error('You must login first. Run: hooklink login');
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const endpoints = await api_1.api.getEndpoints();
|
|
24
|
+
if (endpoints.length === 0) {
|
|
25
|
+
logger_1.Logger.info('No endpoints found');
|
|
26
|
+
logger_1.Logger.info('Create one at: https://hooklink.net/dashboard/endpoints');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const table = new cli_table3_1.default({
|
|
30
|
+
head: [
|
|
31
|
+
chalk_1.default.cyan('Keyword'),
|
|
32
|
+
chalk_1.default.cyan('Name'),
|
|
33
|
+
chalk_1.default.cyan('Type'),
|
|
34
|
+
chalk_1.default.cyan('Status'),
|
|
35
|
+
chalk_1.default.cyan('Created'),
|
|
36
|
+
],
|
|
37
|
+
colWidths: [20, 30, 12, 12, 20],
|
|
38
|
+
});
|
|
39
|
+
endpoints.forEach((endpoint) => {
|
|
40
|
+
table.push([
|
|
41
|
+
endpoint.keyword,
|
|
42
|
+
endpoint.name,
|
|
43
|
+
endpoint.endpoint_type,
|
|
44
|
+
endpoint.is_active ? chalk_1.default.green('Active') : chalk_1.default.gray('Inactive'),
|
|
45
|
+
new Date(endpoint.created_at).toLocaleDateString(),
|
|
46
|
+
]);
|
|
47
|
+
});
|
|
48
|
+
logger_1.Logger.log('');
|
|
49
|
+
logger_1.Logger.log(table.toString());
|
|
50
|
+
logger_1.Logger.log('');
|
|
51
|
+
logger_1.Logger.info(`Total: ${endpoints.length} endpoint(s)`);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
logger_1.Logger.error(`Failed to fetch endpoints: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=endpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../../src/commands/endpoints.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AACpC,4DAA+B;AAC/B,kDAA0B;AAC1B,4CAAyC;AACzC,sCAAmC;AACnC,4CAAyC;AAE5B,QAAA,gBAAgB,GAAG,IAAI,mBAAO,CAAC,WAAW,CAAC;KACrD,WAAW,CAAC,yBAAyB,CAAC;KACtC,KAAK,CAAC,IAAI,CAAC;KACX,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,GAAG,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,eAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,SAAG,CAAC,YAAY,EAAE,CAAC;QAE3C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,eAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAClC,eAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,oBAAK,CAAC;YACtB,IAAI,EAAE;gBACJ,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC;gBACrB,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC;gBAClB,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC;gBAClB,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACpB,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC;aACtB;YACD,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;SAChC,CAAC,CAAC;QAEH,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC7B,KAAK,CAAC,IAAI,CAAC;gBACT,QAAQ,CAAC,OAAO;gBAChB,QAAQ,CAAC,IAAI;gBACb,QAAQ,CAAC,aAAa;gBACtB,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC;gBACnE,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE;aACnD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,eAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACf,eAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7B,eAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACf,eAAM,CAAC,IAAI,CAAC,UAAU,SAAS,CAAC,MAAM,cAAc,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,eAAM,CAAC,KAAK,CAAC,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACvG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,YAAY,SA0ErB,CAAC"}
|