@instantapihq/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 +163 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +386 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
package/README.md
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# Instant API CLI
|
|
2
|
+
|
|
3
|
+
Share your local server with the internet, like ngrok but integrated with Instant API.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @instantapihq/cli
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or use directly with npx:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx @instantapihq/cli expose http://localhost:3000/api
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
### Expose Local Server
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
instant-api expose http://localhost:3000/api/users
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
You get:
|
|
26
|
+
- ✅ Public URL instantly
|
|
27
|
+
- ✅ Requests forwarded to your local server
|
|
28
|
+
- ✅ Works with any framework (Express, NestJS, Flask, FastAPI, etc.)
|
|
29
|
+
- ✅ Supports SSE/streaming
|
|
30
|
+
- ✅ Press Ctrl+C to stop
|
|
31
|
+
|
|
32
|
+
### Quick Test (No Auth)
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# 1 hour temporary tunnel, perfect for quick tests
|
|
36
|
+
instant-api expose http://localhost:3000/api
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Persistent Tunnel (With Auth)
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# 1. Sign up and get API key
|
|
43
|
+
export INSTANT_API_KEY=ik_your_key_here
|
|
44
|
+
|
|
45
|
+
# 2. Expose with no time limit
|
|
46
|
+
instant-api expose http://localhost:3000/api
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Options
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
instant-api expose <targetUrl> [options]
|
|
53
|
+
|
|
54
|
+
Options:
|
|
55
|
+
--backend, -b Backend URL [default: "http://localhost:3001"]
|
|
56
|
+
--help, -h Show help
|
|
57
|
+
--version, -v Show version
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Examples
|
|
61
|
+
|
|
62
|
+
### Expose Express Server
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Terminal 1: Start your server
|
|
66
|
+
npm run dev # Running on http://localhost:3000
|
|
67
|
+
|
|
68
|
+
# Terminal 2: Expose an endpoint
|
|
69
|
+
instant-api expose http://localhost:3000/api/users/create
|
|
70
|
+
|
|
71
|
+
# Output:
|
|
72
|
+
# 🚀 Instant API - Framework Mode
|
|
73
|
+
# ✓ Tunnel registered successfully!
|
|
74
|
+
#
|
|
75
|
+
# Public URL: http://localhost:3001/t/clx123...
|
|
76
|
+
# Target URL: http://localhost:3000/api/users/create
|
|
77
|
+
#
|
|
78
|
+
# Waiting for requests...
|
|
79
|
+
|
|
80
|
+
# Terminal 3: Test it
|
|
81
|
+
curl -X POST http://localhost:3001/t/clx123... \
|
|
82
|
+
-H "Content-Type: application/json" \
|
|
83
|
+
-d '{"name": "John Doe"}'
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Expose Streaming Endpoint
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# Your SSE endpoint
|
|
90
|
+
instant-api expose http://localhost:3000/events
|
|
91
|
+
|
|
92
|
+
# Test streaming
|
|
93
|
+
curl -N http://localhost:3001/t/clx123...
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Configure API Key
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# Save API key to config file
|
|
100
|
+
instant-api config --api-key ik_your_key_here
|
|
101
|
+
|
|
102
|
+
# View current config
|
|
103
|
+
instant-api config
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## How It Works
|
|
107
|
+
|
|
108
|
+
1. **Register**: CLI registers your target URL with the backend
|
|
109
|
+
2. **Poll**: CLI continuously polls for incoming requests
|
|
110
|
+
3. **Forward**: Requests are forwarded to your local server
|
|
111
|
+
4. **Respond**: Your server's response is sent back through the tunnel
|
|
112
|
+
|
|
113
|
+
## Features
|
|
114
|
+
|
|
115
|
+
- ✅ **No signup for quick tests** - 1 hour temporary tunnels
|
|
116
|
+
- ✅ **Streaming support** - SSE and WebSocket
|
|
117
|
+
- ✅ **All HTTP methods** - GET, POST, PUT, DELETE, etc.
|
|
118
|
+
- ✅ **Header forwarding** - Preserves important headers
|
|
119
|
+
- ✅ **Error handling** - Clear error messages
|
|
120
|
+
- ✅ **Auto-reconnect** - Handles network issues
|
|
121
|
+
|
|
122
|
+
## Requirements
|
|
123
|
+
|
|
124
|
+
- Node.js 18+
|
|
125
|
+
- Instant API backend running (or production URL)
|
|
126
|
+
- Your local server running
|
|
127
|
+
|
|
128
|
+
## Development
|
|
129
|
+
|
|
130
|
+
Build from source:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
# Clone repo
|
|
134
|
+
git clone https://github.com/treadiehq/instantapi.git
|
|
135
|
+
cd instantapi/cli
|
|
136
|
+
|
|
137
|
+
# Build
|
|
138
|
+
npm install
|
|
139
|
+
npm run build
|
|
140
|
+
|
|
141
|
+
# Test locally
|
|
142
|
+
node dist/index.js expose http://localhost:3000
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Troubleshooting
|
|
146
|
+
|
|
147
|
+
**Connection refused:**
|
|
148
|
+
- Make sure your local server is running
|
|
149
|
+
- Check the target URL is correct
|
|
150
|
+
|
|
151
|
+
**Backend not responding:**
|
|
152
|
+
- Verify backend is running at the correct URL
|
|
153
|
+
- Use `--backend` flag if needed
|
|
154
|
+
|
|
155
|
+
**Tunnel expired:**
|
|
156
|
+
- Without auth, tunnels last 1 hour
|
|
157
|
+
- Sign up and set API key for longer tunnels
|
|
158
|
+
|
|
159
|
+
## License
|
|
160
|
+
|
|
161
|
+
FSL-1.1-MIT - See [LICENSE](../LICENSE)
|
|
162
|
+
|
|
163
|
+
Built by [Treadie, Inc.](https://treadie.com)
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
const axios_1 = __importDefault(require("axios"));
|
|
41
|
+
const yargs_1 = __importDefault(require("yargs"));
|
|
42
|
+
const helpers_1 = require("yargs/helpers");
|
|
43
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const os = __importStar(require("os"));
|
|
47
|
+
let isShuttingDown = false;
|
|
48
|
+
// Get API key from environment or config file
|
|
49
|
+
function getApiKey() {
|
|
50
|
+
// First check environment variable
|
|
51
|
+
const envKey = process.env.INSTANT_API_KEY;
|
|
52
|
+
if (envKey) {
|
|
53
|
+
return envKey;
|
|
54
|
+
}
|
|
55
|
+
// Check config file in home directory
|
|
56
|
+
const configPath = path.join(os.homedir(), '.instant-api-config.json');
|
|
57
|
+
if (fs.existsSync(configPath)) {
|
|
58
|
+
try {
|
|
59
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
60
|
+
return config.apiKey;
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.warn(chalk_1.default.yellow('Warning: Failed to read config file'));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
// Save API key to config file
|
|
69
|
+
function saveApiKey(apiKey) {
|
|
70
|
+
const configPath = path.join(os.homedir(), '.instant-api-config.json');
|
|
71
|
+
const config = { apiKey };
|
|
72
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
73
|
+
console.log(chalk_1.default.green(`✓ API key saved to ${configPath}`));
|
|
74
|
+
}
|
|
75
|
+
// Get auth headers (optional - can work without API key with 1hr restrictions)
|
|
76
|
+
function getAuthHeaders(warnIfMissing = false) {
|
|
77
|
+
const apiKey = getApiKey();
|
|
78
|
+
if (apiKey) {
|
|
79
|
+
return {
|
|
80
|
+
'x-api-key': apiKey,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// Warn user about 1hr limitation
|
|
84
|
+
if (warnIfMissing) {
|
|
85
|
+
console.log(chalk_1.default.yellow('\n⚠️ Running without authentication - tunnel will have temporary restrictions'));
|
|
86
|
+
console.log(chalk_1.default.gray(' To use for longer than 1 hour, create an account and set your API key:'));
|
|
87
|
+
console.log(chalk_1.default.gray(' 1. Sign up at your-instance.com'));
|
|
88
|
+
console.log(chalk_1.default.gray(' 2. Generate an API key'));
|
|
89
|
+
console.log(chalk_1.default.gray(' 3. Run: npx instant-api config --api-key ik_...\n'));
|
|
90
|
+
}
|
|
91
|
+
return {};
|
|
92
|
+
}
|
|
93
|
+
function detectSDKMetadata() {
|
|
94
|
+
const metadataPath = path.join(process.cwd(), '.instant-api-sdk.json');
|
|
95
|
+
if (fs.existsSync(metadataPath)) {
|
|
96
|
+
try {
|
|
97
|
+
const content = fs.readFileSync(metadataPath, 'utf-8');
|
|
98
|
+
return JSON.parse(content);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
function resolveTargetUrl(input) {
|
|
107
|
+
// Check if it's already a full URL
|
|
108
|
+
try {
|
|
109
|
+
new URL(input);
|
|
110
|
+
return input;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Not a URL, might be a function name
|
|
114
|
+
const sdkMetadata = detectSDKMetadata();
|
|
115
|
+
if (sdkMetadata && sdkMetadata.functions.includes(input)) {
|
|
116
|
+
// It's a function name - construct URL
|
|
117
|
+
const url = `http://localhost:${sdkMetadata.port}/fn/${input}`;
|
|
118
|
+
console.log(chalk_1.default.gray(`Detected SDK function: ${input}`));
|
|
119
|
+
console.log(chalk_1.default.gray(`Resolved to: ${url}\n`));
|
|
120
|
+
return url;
|
|
121
|
+
}
|
|
122
|
+
// Assume it's a malformed URL, try to use it anyway
|
|
123
|
+
return input;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async function exposeRoute(targetUrl, backendUrl) {
|
|
127
|
+
console.log(chalk_1.default.blue('🚀 Instant API - Framework Mode\n'));
|
|
128
|
+
// Check if this is SDK/Function mode (requires API key)
|
|
129
|
+
const isFunctionMode = targetUrl.includes('/fn/');
|
|
130
|
+
const apiKey = getApiKey();
|
|
131
|
+
if (isFunctionMode && !apiKey) {
|
|
132
|
+
console.error(chalk_1.default.red('✗ Function mode requires an API key'));
|
|
133
|
+
console.log(chalk_1.default.yellow('\nTo use function mode:'));
|
|
134
|
+
console.log(chalk_1.default.gray(' 1. Sign up at your-instance.com'));
|
|
135
|
+
console.log(chalk_1.default.gray(' 2. Generate an API key'));
|
|
136
|
+
console.log(chalk_1.default.gray(' 3. Run: npx instant-api config --api-key ik_...'));
|
|
137
|
+
console.log(chalk_1.default.gray('\n Or set environment variable: export INSTANT_API_KEY=ik_...\n'));
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
const authHeaders = getAuthHeaders(!isFunctionMode);
|
|
141
|
+
try {
|
|
142
|
+
// Register tunnel with backend
|
|
143
|
+
console.log(chalk_1.default.gray(`Registering tunnel for ${targetUrl}...`));
|
|
144
|
+
const registerResponse = await axios_1.default.post(`${backendUrl}/api/tunnels/register`, { targetUrl }, { headers: authHeaders });
|
|
145
|
+
const { id, publicUrl } = registerResponse.data;
|
|
146
|
+
console.log(chalk_1.default.green('✓ Tunnel registered successfully!\n'));
|
|
147
|
+
console.log(chalk_1.default.bold('Public URL:'), chalk_1.default.cyan(publicUrl));
|
|
148
|
+
console.log(chalk_1.default.bold('Target URL:'), chalk_1.default.yellow(targetUrl));
|
|
149
|
+
console.log(chalk_1.default.bold('Tunnel ID:'), chalk_1.default.gray(id));
|
|
150
|
+
console.log(chalk_1.default.gray('\nPress Ctrl+C to stop the tunnel\n'));
|
|
151
|
+
// Set up graceful shutdown
|
|
152
|
+
process.on('SIGINT', async () => {
|
|
153
|
+
if (isShuttingDown)
|
|
154
|
+
return;
|
|
155
|
+
isShuttingDown = true;
|
|
156
|
+
console.log(chalk_1.default.yellow('\n\n🛑 Shutting down tunnel...'));
|
|
157
|
+
try {
|
|
158
|
+
await axios_1.default.delete(`${backendUrl}/api/tunnels/${id}`, { headers: authHeaders });
|
|
159
|
+
console.log(chalk_1.default.green('✓ Tunnel deactivated'));
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
console.log(chalk_1.default.gray('(Tunnel cleanup skipped)'));
|
|
163
|
+
}
|
|
164
|
+
process.exit(0);
|
|
165
|
+
});
|
|
166
|
+
// Start polling loop
|
|
167
|
+
let requestCount = 0;
|
|
168
|
+
console.log(chalk_1.default.gray('Waiting for requests...\n'));
|
|
169
|
+
while (!isShuttingDown) {
|
|
170
|
+
try {
|
|
171
|
+
// Poll for new requests
|
|
172
|
+
const pollResponse = await axios_1.default.post(`${backendUrl}/api/tunnels/${id}/poll`, { maxWaitMs: 25000 }, { timeout: 30000, headers: authHeaders });
|
|
173
|
+
const { requestId, method, path, headers, body, isStreaming } = pollResponse.data;
|
|
174
|
+
if (!requestId) {
|
|
175
|
+
// No request received, continue polling
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
requestCount++;
|
|
179
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
180
|
+
console.log(chalk_1.default.cyan(`[${timestamp}]`), chalk_1.default.bold(`${method} ${path}`), isStreaming ? chalk_1.default.magenta('[STREAMING]') : '', chalk_1.default.gray(`(#${requestCount})`));
|
|
181
|
+
// Handle streaming vs standard requests
|
|
182
|
+
if (isStreaming) {
|
|
183
|
+
// Streaming request (SSE/WebSocket fallback)
|
|
184
|
+
try {
|
|
185
|
+
const localResponse = await (0, axios_1.default)({
|
|
186
|
+
method: 'get',
|
|
187
|
+
url: targetUrl + (path || ''),
|
|
188
|
+
headers: { ...headers, accept: 'text/event-stream' },
|
|
189
|
+
responseType: 'stream',
|
|
190
|
+
timeout: 300000, // 5 minute timeout for streams
|
|
191
|
+
});
|
|
192
|
+
let sequence = 0;
|
|
193
|
+
// Stream chunks to backend
|
|
194
|
+
localResponse.data.on('data', async (chunk) => {
|
|
195
|
+
try {
|
|
196
|
+
await axios_1.default.post(`${backendUrl}/api/tunnels/${id}/stream`, {
|
|
197
|
+
requestId,
|
|
198
|
+
sequence: sequence++,
|
|
199
|
+
chunk: chunk.toString(),
|
|
200
|
+
}, { headers: authHeaders });
|
|
201
|
+
}
|
|
202
|
+
catch (streamError) {
|
|
203
|
+
console.log(chalk_1.default.gray(` └─`), chalk_1.default.red('Stream error'), chalk_1.default.red(streamError));
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
localResponse.data.on('end', async () => {
|
|
207
|
+
// Send EOF signal
|
|
208
|
+
await axios_1.default.post(`${backendUrl}/api/tunnels/${id}/stream`, {
|
|
209
|
+
requestId,
|
|
210
|
+
eof: true,
|
|
211
|
+
}, { headers: authHeaders });
|
|
212
|
+
console.log(chalk_1.default.gray(` └─`), chalk_1.default.green('Stream completed'));
|
|
213
|
+
});
|
|
214
|
+
localResponse.data.on('error', async (streamError) => {
|
|
215
|
+
console.log(chalk_1.default.gray(` └─`), chalk_1.default.red('✗'), chalk_1.default.red(streamError.message));
|
|
216
|
+
// Mark as failed
|
|
217
|
+
await axios_1.default.post(`${backendUrl}/api/tunnels/${id}/stream`, {
|
|
218
|
+
requestId,
|
|
219
|
+
eof: true,
|
|
220
|
+
}, { headers: authHeaders });
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
catch (localError) {
|
|
224
|
+
const errorMessage = localError.code === 'ECONNREFUSED'
|
|
225
|
+
? 'Connection refused - is your local server running?'
|
|
226
|
+
: localError.message;
|
|
227
|
+
console.log(chalk_1.default.gray(` └─`), chalk_1.default.red('✗'), chalk_1.default.red(errorMessage));
|
|
228
|
+
// Mark as failed
|
|
229
|
+
await axios_1.default.post(`${backendUrl}/api/tunnels/${id}/stream`, {
|
|
230
|
+
requestId,
|
|
231
|
+
eof: true,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
// Standard request-response
|
|
237
|
+
try {
|
|
238
|
+
const localResponse = await (0, axios_1.default)({
|
|
239
|
+
method: method?.toLowerCase(),
|
|
240
|
+
url: targetUrl + (path || ''),
|
|
241
|
+
headers: headers || {},
|
|
242
|
+
data: body,
|
|
243
|
+
validateStatus: () => true, // Accept any status code
|
|
244
|
+
timeout: 25000,
|
|
245
|
+
});
|
|
246
|
+
// Send response back to backend
|
|
247
|
+
await axios_1.default.post(`${backendUrl}/api/tunnels/${id}/respond`, {
|
|
248
|
+
requestId,
|
|
249
|
+
statusCode: localResponse.status,
|
|
250
|
+
headers: localResponse.headers,
|
|
251
|
+
body: localResponse.data,
|
|
252
|
+
}, { headers: authHeaders });
|
|
253
|
+
const statusColor = localResponse.status >= 200 && localResponse.status < 300
|
|
254
|
+
? chalk_1.default.green
|
|
255
|
+
: localResponse.status >= 400
|
|
256
|
+
? chalk_1.default.red
|
|
257
|
+
: chalk_1.default.yellow;
|
|
258
|
+
console.log(chalk_1.default.gray(` └─`), statusColor(`${localResponse.status}`), chalk_1.default.gray(`${JSON.stringify(localResponse.data).substring(0, 100)}${JSON.stringify(localResponse.data).length > 100 ? '...' : ''}`));
|
|
259
|
+
}
|
|
260
|
+
catch (localError) {
|
|
261
|
+
// Local request failed
|
|
262
|
+
const errorMessage = localError.code === 'ECONNREFUSED'
|
|
263
|
+
? 'Connection refused - is your local server running?'
|
|
264
|
+
: localError.message;
|
|
265
|
+
console.log(chalk_1.default.gray(` └─`), chalk_1.default.red('✗'), chalk_1.default.red(errorMessage));
|
|
266
|
+
// Send error response back
|
|
267
|
+
await axios_1.default.post(`${backendUrl}/api/tunnels/${id}/respond`, {
|
|
268
|
+
requestId,
|
|
269
|
+
statusCode: 502,
|
|
270
|
+
headers: { 'content-type': 'application/json' },
|
|
271
|
+
body: {
|
|
272
|
+
error: 'Bad Gateway',
|
|
273
|
+
message: errorMessage,
|
|
274
|
+
},
|
|
275
|
+
}, { headers: authHeaders });
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
catch (pollError) {
|
|
280
|
+
if (isShuttingDown)
|
|
281
|
+
break;
|
|
282
|
+
// Handle polling errors
|
|
283
|
+
if (pollError.code === 'ECONNABORTED') {
|
|
284
|
+
// Timeout is expected, continue
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
if (axios_1.default.isAxiosError(pollError)) {
|
|
288
|
+
const axiosError = pollError;
|
|
289
|
+
if (axiosError.response?.status === 404) {
|
|
290
|
+
console.log(chalk_1.default.red('\n✗ Tunnel not found or expired'));
|
|
291
|
+
break;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
console.error(chalk_1.default.red('Poll error:'), pollError.message);
|
|
295
|
+
// Wait a bit before retrying
|
|
296
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
302
|
+
const axiosError = error;
|
|
303
|
+
if (axiosError.code === 'ECONNREFUSED') {
|
|
304
|
+
console.error(chalk_1.default.red('\n✗ Could not connect to Instant API backend'));
|
|
305
|
+
console.error(chalk_1.default.gray(` Make sure the backend is running at ${backendUrl}`));
|
|
306
|
+
}
|
|
307
|
+
else if (axiosError.response) {
|
|
308
|
+
console.error(chalk_1.default.red('\n✗ Error:'), axiosError.response.data || axiosError.message);
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
console.error(chalk_1.default.red('\n✗ Error:'), axiosError.message);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
console.error(chalk_1.default.red('\n✗ Unexpected error:'), error.message);
|
|
316
|
+
}
|
|
317
|
+
process.exit(1);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// CLI setup with yargs
|
|
321
|
+
(0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
322
|
+
.command('expose <targetUrl>', 'Expose a local HTTP endpoint to the internet', (yargs) => {
|
|
323
|
+
return yargs
|
|
324
|
+
.positional('targetUrl', {
|
|
325
|
+
describe: 'Local URL to expose (e.g., http://localhost:3000/api/users)',
|
|
326
|
+
type: 'string',
|
|
327
|
+
demandOption: true,
|
|
328
|
+
})
|
|
329
|
+
.option('backend', {
|
|
330
|
+
alias: 'b',
|
|
331
|
+
describe: 'Instant API backend URL',
|
|
332
|
+
type: 'string',
|
|
333
|
+
default: 'http://localhost:3001',
|
|
334
|
+
});
|
|
335
|
+
}, (argv) => {
|
|
336
|
+
const inputUrl = argv.targetUrl;
|
|
337
|
+
const backendUrl = argv.backend;
|
|
338
|
+
// Resolve target URL (handles both full URLs and function names)
|
|
339
|
+
const targetUrl = resolveTargetUrl(inputUrl);
|
|
340
|
+
// Validate final targetUrl format
|
|
341
|
+
try {
|
|
342
|
+
new URL(targetUrl);
|
|
343
|
+
}
|
|
344
|
+
catch {
|
|
345
|
+
console.error(chalk_1.default.red('✗ Invalid target URL format'));
|
|
346
|
+
console.error(chalk_1.default.gray(' Example: http://localhost:3000/api/users'));
|
|
347
|
+
console.error(chalk_1.default.gray(' Or function name: myFunction (if SDK is running)'));
|
|
348
|
+
process.exit(1);
|
|
349
|
+
}
|
|
350
|
+
exposeRoute(targetUrl, backendUrl);
|
|
351
|
+
})
|
|
352
|
+
.command('config', 'Configure Instant API CLI', (yargs) => {
|
|
353
|
+
return yargs.option('api-key', {
|
|
354
|
+
describe: 'Set your Instant API key',
|
|
355
|
+
type: 'string',
|
|
356
|
+
});
|
|
357
|
+
}, (argv) => {
|
|
358
|
+
const apiKey = argv['api-key'];
|
|
359
|
+
if (apiKey) {
|
|
360
|
+
if (!apiKey.startsWith('ik_')) {
|
|
361
|
+
console.error(chalk_1.default.red('✗ Invalid API key format. Should start with "ik_"'));
|
|
362
|
+
process.exit(1);
|
|
363
|
+
}
|
|
364
|
+
saveApiKey(apiKey);
|
|
365
|
+
console.log(chalk_1.default.green('\n✓ Configuration saved!'));
|
|
366
|
+
console.log(chalk_1.default.gray('\nYou can now use: npx instant-api expose <url>'));
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
// Show current config
|
|
370
|
+
const currentKey = getApiKey();
|
|
371
|
+
if (currentKey) {
|
|
372
|
+
console.log(chalk_1.default.green('API Key:'), chalk_1.default.gray(currentKey.substring(0, 10) + '...'));
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
console.log(chalk_1.default.yellow('No API key configured'));
|
|
376
|
+
console.log(chalk_1.default.gray('\nSet one with: npx instant-api config --api-key ik_...'));
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
})
|
|
380
|
+
.demandCommand(1, 'You need to specify a command')
|
|
381
|
+
.help()
|
|
382
|
+
.alias('help', 'h')
|
|
383
|
+
.version('1.0.0')
|
|
384
|
+
.alias('version', 'v')
|
|
385
|
+
.parse();
|
|
386
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@instantapihq/cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "CLI for Instant API - expose local routes to the internet",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"instant-api": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"dev": "tsc --watch",
|
|
16
|
+
"start": "node dist/index.js",
|
|
17
|
+
"prepublishOnly": "npm run build"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"api",
|
|
21
|
+
"tunnel",
|
|
22
|
+
"ngrok",
|
|
23
|
+
"proxy",
|
|
24
|
+
"instant-api",
|
|
25
|
+
"cli",
|
|
26
|
+
"expose",
|
|
27
|
+
"localhost"
|
|
28
|
+
],
|
|
29
|
+
"author": "Treadie, Inc.",
|
|
30
|
+
"license": "FSL-1.1-MIT",
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/treadiehq/instantapi.git",
|
|
34
|
+
"directory": "cli"
|
|
35
|
+
},
|
|
36
|
+
"homepage": "https://github.com/treadiehq/instantapi#readme",
|
|
37
|
+
"bugs": {
|
|
38
|
+
"url": "https://github.com/treadiehq/instantapi/issues"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"axios": "^1.6.2",
|
|
42
|
+
"chalk": "^4.1.2",
|
|
43
|
+
"yargs": "^17.7.2"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/node": "^20.10.5",
|
|
47
|
+
"@types/yargs": "^17.0.32",
|
|
48
|
+
"typescript": "^5.3.3"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|