devportal-tunnel 1.0.0 → 1.0.1
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 +108 -15
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +41 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/start.d.ts +1 -0
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +146 -58
- package/dist/commands/start.js.map +1 -1
- package/dist/index.js +26 -2
- package/dist/index.js.map +1 -1
- package/dist/utils/config.d.ts +8 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +76 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/tunnelClient.d.ts +35 -0
- package/dist/utils/tunnelClient.d.ts.map +1 -0
- package/dist/utils/tunnelClient.js +212 -0
- package/dist/utils/tunnelClient.js.map +1 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,16 +1,24 @@
|
|
|
1
|
-
# DevPortal
|
|
1
|
+
# DevPortal CLI
|
|
2
2
|
|
|
3
3
|
Expose your localhost to the internet with a single command.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
|
+
### From npm (after publishing)
|
|
7
8
|
```bash
|
|
8
9
|
npm install -g devportal
|
|
9
10
|
```
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
### From source
|
|
13
|
+
```bash
|
|
14
|
+
git clone <repo>
|
|
15
|
+
cd cli
|
|
16
|
+
npm install
|
|
17
|
+
npm run build
|
|
18
|
+
npm link
|
|
19
|
+
```
|
|
12
20
|
|
|
13
|
-
|
|
21
|
+
## Quick Start
|
|
14
22
|
|
|
15
23
|
```bash
|
|
16
24
|
# Expose port 3000
|
|
@@ -22,21 +30,37 @@ devportal 3000 --subdomain my-api
|
|
|
22
30
|
# Password protected
|
|
23
31
|
devportal 3000 --password secret123
|
|
24
32
|
|
|
25
|
-
# Show QR code for mobile
|
|
33
|
+
# Show QR code for mobile testing
|
|
26
34
|
devportal 3000 --qr
|
|
27
35
|
|
|
28
36
|
# Temporary demo link (expires in 2 hours)
|
|
29
37
|
devportal 3000 --demo
|
|
38
|
+
|
|
39
|
+
# Run in local simulation mode (no server needed)
|
|
40
|
+
devportal 3000 --local
|
|
30
41
|
```
|
|
31
42
|
|
|
32
|
-
|
|
43
|
+
## Commands
|
|
44
|
+
|
|
45
|
+
### Start a tunnel
|
|
46
|
+
```bash
|
|
47
|
+
devportal <port> [options]
|
|
48
|
+
|
|
49
|
+
Options:
|
|
50
|
+
-s, --subdomain <name> Custom subdomain for your URL
|
|
51
|
+
-p, --password <pass> Password protect the tunnel
|
|
52
|
+
--demo Create a temporary link (2 hours)
|
|
53
|
+
--qr Display QR code in terminal
|
|
54
|
+
--auth-header <header> Add authorization header to forwarded requests
|
|
55
|
+
--local Run in simulation mode (no server required)
|
|
56
|
+
```
|
|
33
57
|
|
|
58
|
+
### List active tunnels
|
|
34
59
|
```bash
|
|
35
60
|
devportal ls
|
|
36
61
|
```
|
|
37
62
|
|
|
38
63
|
### Stop a tunnel
|
|
39
|
-
|
|
40
64
|
```bash
|
|
41
65
|
# Stop specific tunnel
|
|
42
66
|
devportal stop <tunnel-id>
|
|
@@ -46,7 +70,6 @@ devportal stop --all
|
|
|
46
70
|
```
|
|
47
71
|
|
|
48
72
|
### Replay requests
|
|
49
|
-
|
|
50
73
|
```bash
|
|
51
74
|
# Replay a captured request
|
|
52
75
|
devportal replay <request-id>
|
|
@@ -59,13 +82,23 @@ devportal replay <request-id> --body '{"test": true}'
|
|
|
59
82
|
```
|
|
60
83
|
|
|
61
84
|
### Stream logs
|
|
62
|
-
|
|
63
85
|
```bash
|
|
64
86
|
devportal logs <tunnel-id>
|
|
65
87
|
```
|
|
66
88
|
|
|
67
|
-
###
|
|
89
|
+
### Configuration
|
|
90
|
+
```bash
|
|
91
|
+
# View current config
|
|
92
|
+
devportal config
|
|
68
93
|
|
|
94
|
+
# Set server URL (for self-hosted)
|
|
95
|
+
devportal config server https://your-server.com
|
|
96
|
+
|
|
97
|
+
# Reset to defaults
|
|
98
|
+
devportal config reset
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Device info
|
|
69
102
|
```bash
|
|
70
103
|
devportal whoami
|
|
71
104
|
```
|
|
@@ -74,15 +107,72 @@ devportal whoami
|
|
|
74
107
|
|
|
75
108
|
DevPortal stores configuration in `~/.devportal/`:
|
|
76
109
|
|
|
77
|
-
|
|
78
|
-
|
|
110
|
+
```
|
|
111
|
+
~/.devportal/
|
|
112
|
+
├── config.json # Server URL, WebSocket URL
|
|
113
|
+
├── device.json # Unique device ID
|
|
114
|
+
└── tunnels.json # Active tunnel information
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Self-Hosted Server
|
|
118
|
+
|
|
119
|
+
To use your own DevPortal server:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# Set your server URL
|
|
123
|
+
devportal config server https://tunnel.your-domain.com
|
|
124
|
+
|
|
125
|
+
# Now tunnels will use your server
|
|
126
|
+
devportal 3000
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## How It Works
|
|
130
|
+
|
|
131
|
+
1. **CLI connects** to the DevPortal server via WebSocket
|
|
132
|
+
2. **Server assigns** a public URL (e.g., `https://my-app.devportal.live`)
|
|
133
|
+
3. **Requests arrive** at the public URL
|
|
134
|
+
4. **Server forwards** requests through the WebSocket to CLI
|
|
135
|
+
5. **CLI proxies** requests to your local server
|
|
136
|
+
6. **Response travels** back through the tunnel
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
Internet Request
|
|
140
|
+
│
|
|
141
|
+
▼
|
|
142
|
+
[DevPortal Server] ◄──WSS──► [CLI Client] ──► [localhost:3000]
|
|
143
|
+
│ │
|
|
144
|
+
└──────── Response ◄─────────┘
|
|
145
|
+
```
|
|
79
146
|
|
|
80
147
|
## Publishing to npm
|
|
81
148
|
|
|
82
|
-
1.
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
149
|
+
1. **Update package.json** with your details:
|
|
150
|
+
```json
|
|
151
|
+
{
|
|
152
|
+
"name": "devportal",
|
|
153
|
+
"author": "Your Name",
|
|
154
|
+
"repository": {
|
|
155
|
+
"type": "git",
|
|
156
|
+
"url": "https://github.com/yourusername/devportal"
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
2. **Login and publish**:
|
|
162
|
+
```bash
|
|
163
|
+
npm login
|
|
164
|
+
npm publish
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
3. **For scoped package** (if name is taken):
|
|
168
|
+
```json
|
|
169
|
+
{
|
|
170
|
+
"name": "@yourusername/devportal"
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
```bash
|
|
174
|
+
npm publish --access public
|
|
175
|
+
```
|
|
86
176
|
|
|
87
177
|
## Development
|
|
88
178
|
|
|
@@ -95,6 +185,9 @@ npm run dev 3000
|
|
|
95
185
|
|
|
96
186
|
# Build
|
|
97
187
|
npm run build
|
|
188
|
+
|
|
189
|
+
# Link globally for testing
|
|
190
|
+
npm link
|
|
98
191
|
```
|
|
99
192
|
|
|
100
193
|
## License
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkClF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
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 = configCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const config_1 = require("../utils/config");
|
|
9
|
+
async function configCommand(action, value) {
|
|
10
|
+
if (!action) {
|
|
11
|
+
// Show current config
|
|
12
|
+
const config = (0, config_1.getConfig)();
|
|
13
|
+
console.log(chalk_1.default.bold('Current Configuration'));
|
|
14
|
+
console.log();
|
|
15
|
+
console.log(chalk_1.default.gray('Server URL: '), chalk_1.default.white(config.serverUrl));
|
|
16
|
+
console.log(chalk_1.default.gray('WebSocket URL: '), chalk_1.default.white(config.wsUrl));
|
|
17
|
+
console.log();
|
|
18
|
+
console.log(chalk_1.default.gray('Config file: ~/.devportal/config.json'));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
switch (action) {
|
|
22
|
+
case 'server':
|
|
23
|
+
if (!value) {
|
|
24
|
+
console.log(chalk_1.default.red('Please provide a server URL'));
|
|
25
|
+
console.log(chalk_1.default.gray('Usage: devportal config server <url>'));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
(0, config_1.setServerUrl)(value);
|
|
29
|
+
console.log(chalk_1.default.green('Server URL updated'));
|
|
30
|
+
console.log(chalk_1.default.gray('Server: '), chalk_1.default.white(value));
|
|
31
|
+
break;
|
|
32
|
+
case 'reset':
|
|
33
|
+
(0, config_1.setServerUrl)('https://devportal.live');
|
|
34
|
+
console.log(chalk_1.default.green('Config reset to defaults'));
|
|
35
|
+
break;
|
|
36
|
+
default:
|
|
37
|
+
console.log(chalk_1.default.red(`Unknown config action: ${action}`));
|
|
38
|
+
console.log(chalk_1.default.gray('Available actions: server, reset'));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":";;;;;AAGA,sCAkCC;AArCD,kDAA0B;AAC1B,4CAA0D;AAEnD,KAAK,UAAU,aAAa,CAAC,MAAe,EAAE,KAAc;IACjE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,sBAAsB;QACtB,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,eAAK,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,eAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;gBAChE,OAAO;YACT,CAAC;YACD,IAAA,qBAAY,EAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3D,MAAM;QAER,KAAK,OAAO;YACV,IAAA,qBAAY,EAAC,wBAAwB,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACrD,MAAM;QAER;YACE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAChE,CAAC;AACH,CAAC"}
|
package/dist/commands/start.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAWA,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA+HpF"}
|
package/dist/commands/start.js
CHANGED
|
@@ -40,12 +40,14 @@ exports.startTunnel = startTunnel;
|
|
|
40
40
|
const chalk_1 = __importDefault(require("chalk"));
|
|
41
41
|
const ora_1 = __importDefault(require("ora"));
|
|
42
42
|
const http = __importStar(require("http"));
|
|
43
|
+
const tunnelClient_1 = require("../utils/tunnelClient");
|
|
43
44
|
const tunnels_1 = require("../utils/tunnels");
|
|
44
45
|
const device_1 = require("../utils/device");
|
|
46
|
+
const config_1 = require("../utils/config");
|
|
45
47
|
// @ts-ignore - qrcode-terminal doesn't have types
|
|
46
48
|
const qrcode = __importStar(require("qrcode-terminal"));
|
|
47
49
|
async function startTunnel(port, options) {
|
|
48
|
-
const spinner = (0, ora_1.default)('
|
|
50
|
+
const spinner = (0, ora_1.default)('Connecting to DevPortal...').start();
|
|
49
51
|
// Check if local server is running
|
|
50
52
|
const isPortOpen = await checkPort(port);
|
|
51
53
|
if (!isPortOpen) {
|
|
@@ -54,58 +56,161 @@ async function startTunnel(port, options) {
|
|
|
54
56
|
console.log(chalk_1.default.gray(` Example: npm run dev`));
|
|
55
57
|
console.log();
|
|
56
58
|
}
|
|
57
|
-
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
const config = (0, config_1.getConfig)();
|
|
60
|
+
const deviceId = (0, device_1.getDeviceId)();
|
|
61
|
+
// Use local simulation if no server configured or --local flag
|
|
62
|
+
if (options.local || !config.serverUrl) {
|
|
63
|
+
spinner.text = 'Starting local simulation mode...';
|
|
64
|
+
await startSimulatedTunnel(port, options, spinner);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// Connect to real server
|
|
68
|
+
try {
|
|
69
|
+
const client = new tunnelClient_1.TunnelClient({
|
|
70
|
+
serverUrl: config.serverUrl,
|
|
71
|
+
wsUrl: config.wsUrl,
|
|
72
|
+
deviceId,
|
|
73
|
+
localPort: port,
|
|
74
|
+
subdomain: options.subdomain,
|
|
75
|
+
password: options.password,
|
|
76
|
+
demo: options.demo,
|
|
77
|
+
authHeader: options.authHeader,
|
|
78
|
+
});
|
|
79
|
+
// Handle events
|
|
80
|
+
client.on('request', ({ method, path }) => {
|
|
81
|
+
const methodColor = getMethodColor(method);
|
|
82
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
83
|
+
process.stdout.write(chalk_1.default.gray(timestamp) + ' ');
|
|
84
|
+
process.stdout.write(methodColor(method.padEnd(7)));
|
|
85
|
+
process.stdout.write(chalk_1.default.white(path) + ' ');
|
|
86
|
+
});
|
|
87
|
+
client.on('response', ({ status }) => {
|
|
88
|
+
const statusColor = status < 300 ? chalk_1.default.green : status < 400 ? chalk_1.default.yellow : chalk_1.default.red;
|
|
89
|
+
console.log(statusColor(status.toString()));
|
|
90
|
+
});
|
|
91
|
+
client.on('error', (error) => {
|
|
92
|
+
console.error(chalk_1.default.red('Error:'), error.message);
|
|
93
|
+
});
|
|
94
|
+
client.on('disconnected', () => {
|
|
95
|
+
console.log(chalk_1.default.yellow('\nConnection lost. Reconnecting...'));
|
|
96
|
+
});
|
|
97
|
+
spinner.text = 'Establishing tunnel...';
|
|
98
|
+
const tunnelInfo = await client.connect();
|
|
99
|
+
spinner.succeed(chalk_1.default.green('Tunnel established'));
|
|
100
|
+
console.log();
|
|
101
|
+
// Display tunnel info
|
|
102
|
+
console.log(chalk_1.default.gray(' Local server: '), chalk_1.default.white(`http://localhost:${port}`));
|
|
103
|
+
console.log(chalk_1.default.gray(' Public URL: '), chalk_1.default.cyan.underline(tunnelInfo.url));
|
|
104
|
+
console.log(chalk_1.default.gray(' Tunnel ID: '), chalk_1.default.white(tunnelInfo.id));
|
|
105
|
+
if (options.password) {
|
|
106
|
+
console.log(chalk_1.default.gray(' Password: '), chalk_1.default.yellow('Protected'));
|
|
107
|
+
}
|
|
108
|
+
if (tunnelInfo.expiresAt) {
|
|
109
|
+
const expiresIn = Math.round((new Date(tunnelInfo.expiresAt).getTime() - Date.now()) / 60000);
|
|
110
|
+
console.log(chalk_1.default.gray(' Expires in: '), chalk_1.default.yellow(`${expiresIn} minutes`));
|
|
111
|
+
}
|
|
112
|
+
console.log();
|
|
113
|
+
console.log(chalk_1.default.gray(' Dashboard: '), chalk_1.default.underline(`${config.serverUrl}/dashboard/${deviceId}`));
|
|
114
|
+
console.log();
|
|
115
|
+
// Show QR code if requested
|
|
116
|
+
if (options.qr) {
|
|
117
|
+
console.log(chalk_1.default.gray(' Scan to open on mobile:'));
|
|
118
|
+
console.log();
|
|
119
|
+
qrcode.generate(tunnelInfo.url, { small: true });
|
|
120
|
+
console.log();
|
|
121
|
+
}
|
|
122
|
+
// Save tunnel info locally
|
|
123
|
+
const storedTunnel = {
|
|
124
|
+
id: tunnelInfo.id,
|
|
125
|
+
name: tunnelInfo.name,
|
|
126
|
+
url: tunnelInfo.url,
|
|
127
|
+
localPort: port,
|
|
128
|
+
status: 'live',
|
|
129
|
+
createdAt: new Date().toISOString(),
|
|
130
|
+
pid: process.pid,
|
|
131
|
+
};
|
|
132
|
+
(0, tunnels_1.addTunnel)(storedTunnel);
|
|
133
|
+
console.log(chalk_1.default.gray(' Forwarding requests... (Press Ctrl+C to stop)'));
|
|
134
|
+
console.log();
|
|
135
|
+
// Handle shutdown
|
|
136
|
+
process.on('SIGINT', () => {
|
|
137
|
+
console.log();
|
|
138
|
+
console.log(chalk_1.default.yellow('Stopping tunnel...'));
|
|
139
|
+
client.stop();
|
|
140
|
+
process.exit(0);
|
|
141
|
+
});
|
|
142
|
+
// Keep process alive
|
|
143
|
+
await new Promise(() => { });
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
spinner.fail(chalk_1.default.red('Failed to connect'));
|
|
147
|
+
console.log();
|
|
148
|
+
console.log(chalk_1.default.red('Error:'), error.message);
|
|
149
|
+
console.log();
|
|
150
|
+
console.log(chalk_1.default.gray('Troubleshooting:'));
|
|
151
|
+
console.log(chalk_1.default.gray(' 1. Check your internet connection'));
|
|
152
|
+
console.log(chalk_1.default.gray(' 2. Verify the server URL in ~/.devportal/config.json'));
|
|
153
|
+
console.log(chalk_1.default.gray(' 3. Try running with --local for simulation mode'));
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async function startSimulatedTunnel(port, options, spinner) {
|
|
61
158
|
// Simulate connection delay
|
|
62
|
-
await sleep(
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
localPort: port,
|
|
68
|
-
status: 'live',
|
|
69
|
-
createdAt: new Date().toISOString(),
|
|
70
|
-
pid: process.pid,
|
|
71
|
-
};
|
|
72
|
-
(0, tunnels_1.addTunnel)(tunnel);
|
|
73
|
-
spinner.succeed(chalk_1.default.green('Tunnel established'));
|
|
159
|
+
await sleep(1000);
|
|
160
|
+
const name = options.subdomain || generateTunnelName();
|
|
161
|
+
const tunnelId = `t-${Date.now().toString(36)}`;
|
|
162
|
+
const url = `https://${name}.devportal.local`;
|
|
163
|
+
spinner.succeed(chalk_1.default.green('Tunnel established (simulation mode)'));
|
|
74
164
|
console.log();
|
|
75
|
-
// Display tunnel info
|
|
76
165
|
console.log(chalk_1.default.gray(' Local server: '), chalk_1.default.white(`http://localhost:${port}`));
|
|
77
166
|
console.log(chalk_1.default.gray(' Public URL: '), chalk_1.default.cyan.underline(url));
|
|
78
167
|
console.log(chalk_1.default.gray(' Tunnel ID: '), chalk_1.default.white(tunnelId));
|
|
79
|
-
if (options.password) {
|
|
80
|
-
console.log(chalk_1.default.gray(' Password: '), chalk_1.default.yellow('Protected'));
|
|
81
|
-
}
|
|
82
|
-
if (options.demo) {
|
|
83
|
-
console.log(chalk_1.default.gray(' Expires: '), chalk_1.default.yellow('2 hours'));
|
|
84
|
-
}
|
|
85
168
|
console.log();
|
|
86
|
-
console.log(chalk_1.default.
|
|
169
|
+
console.log(chalk_1.default.yellow(' ⚠ Running in simulation mode'));
|
|
170
|
+
console.log(chalk_1.default.gray(' Configure server URL to enable real tunneling'));
|
|
87
171
|
console.log();
|
|
88
|
-
// Show QR code if requested
|
|
89
172
|
if (options.qr) {
|
|
90
|
-
console.log(chalk_1.default.gray(' Scan to open on mobile:'));
|
|
91
|
-
console.log();
|
|
92
173
|
qrcode.generate(url, { small: true });
|
|
93
174
|
console.log();
|
|
94
175
|
}
|
|
95
|
-
|
|
96
|
-
console.log(chalk_1.default.gray(' Waiting for requests... (Press Ctrl+C to stop)'));
|
|
176
|
+
console.log(chalk_1.default.gray(' Simulating requests... (Press Ctrl+C to stop)'));
|
|
97
177
|
console.log();
|
|
98
|
-
|
|
99
|
-
simulateRequests();
|
|
100
|
-
// Handle shutdown
|
|
178
|
+
simulateRequests(port);
|
|
101
179
|
process.on('SIGINT', () => {
|
|
102
180
|
console.log();
|
|
103
181
|
console.log(chalk_1.default.yellow('Tunnel stopped'));
|
|
104
182
|
process.exit(0);
|
|
105
183
|
});
|
|
106
|
-
// Keep process alive
|
|
107
184
|
await new Promise(() => { });
|
|
108
185
|
}
|
|
186
|
+
function simulateRequests(port) {
|
|
187
|
+
const methods = ['GET', 'POST', 'PUT', 'DELETE'];
|
|
188
|
+
const paths = ['/api/users', '/api/auth', '/api/data', '/webhook', '/health'];
|
|
189
|
+
const statuses = [200, 200, 200, 201, 400, 401, 404];
|
|
190
|
+
const logRequest = () => {
|
|
191
|
+
const method = methods[Math.floor(Math.random() * methods.length)];
|
|
192
|
+
const path = paths[Math.floor(Math.random() * paths.length)];
|
|
193
|
+
const status = statuses[Math.floor(Math.random() * statuses.length)];
|
|
194
|
+
const duration = Math.floor(Math.random() * 200) + 20;
|
|
195
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
196
|
+
const methodColor = getMethodColor(method);
|
|
197
|
+
const statusColor = status < 300 ? chalk_1.default.green : status < 400 ? chalk_1.default.yellow : chalk_1.default.red;
|
|
198
|
+
console.log(chalk_1.default.gray(timestamp), methodColor(method.padEnd(7)), chalk_1.default.white(path.padEnd(20)), statusColor(status.toString()), chalk_1.default.gray(`${duration}ms`));
|
|
199
|
+
const nextInterval = Math.floor(Math.random() * 6000) + 2000;
|
|
200
|
+
setTimeout(logRequest, nextInterval);
|
|
201
|
+
};
|
|
202
|
+
setTimeout(logRequest, 2000);
|
|
203
|
+
}
|
|
204
|
+
function getMethodColor(method) {
|
|
205
|
+
const colors = {
|
|
206
|
+
GET: chalk_1.default.green,
|
|
207
|
+
POST: chalk_1.default.blue,
|
|
208
|
+
PUT: chalk_1.default.yellow,
|
|
209
|
+
DELETE: chalk_1.default.red,
|
|
210
|
+
PATCH: chalk_1.default.magenta,
|
|
211
|
+
};
|
|
212
|
+
return colors[method] || chalk_1.default.white;
|
|
213
|
+
}
|
|
109
214
|
async function checkPort(port) {
|
|
110
215
|
return new Promise((resolve) => {
|
|
111
216
|
const req = http.request({ host: 'localhost', port, timeout: 1000 }, () => {
|
|
@@ -119,29 +224,12 @@ async function checkPort(port) {
|
|
|
119
224
|
function sleep(ms) {
|
|
120
225
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
121
226
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
const
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
const status = statuses[Math.floor(Math.random() * statuses.length)];
|
|
130
|
-
const duration = Math.floor(Math.random() * 200) + 20;
|
|
131
|
-
const methodColor = {
|
|
132
|
-
GET: chalk_1.default.green,
|
|
133
|
-
POST: chalk_1.default.blue,
|
|
134
|
-
PUT: chalk_1.default.yellow,
|
|
135
|
-
DELETE: chalk_1.default.red,
|
|
136
|
-
}[method] || chalk_1.default.white;
|
|
137
|
-
const statusColor = status < 300 ? chalk_1.default.green : status < 400 ? chalk_1.default.yellow : chalk_1.default.red;
|
|
138
|
-
const timestamp = new Date().toLocaleTimeString();
|
|
139
|
-
console.log(chalk_1.default.gray(timestamp), methodColor(method.padEnd(6)), chalk_1.default.white(path.padEnd(20)), statusColor(status.toString()), chalk_1.default.gray(`${duration}ms`));
|
|
140
|
-
// Schedule next request (random interval 2-8 seconds)
|
|
141
|
-
const nextInterval = Math.floor(Math.random() * 6000) + 2000;
|
|
142
|
-
setTimeout(logRequest, nextInterval);
|
|
143
|
-
};
|
|
144
|
-
// Start after initial delay
|
|
145
|
-
setTimeout(logRequest, 3000);
|
|
227
|
+
const adjectives = ['purple', 'cosmic', 'hidden', 'crystal', 'silent', 'golden', 'frozen', 'blazing', 'lunar', 'neon'];
|
|
228
|
+
const nouns = ['horizon', 'lake', 'forest', 'ocean', 'canyon', 'river', 'meadow', 'summit', 'valley', 'storm'];
|
|
229
|
+
function generateTunnelName() {
|
|
230
|
+
const adj = adjectives[Math.floor(Math.random() * adjectives.length)];
|
|
231
|
+
const noun = nouns[Math.floor(Math.random() * nouns.length)];
|
|
232
|
+
const num = Math.floor(Math.random() * 900) + 100;
|
|
233
|
+
return `${adj}-${noun}-${num}`;
|
|
146
234
|
}
|
|
147
235
|
//# sourceMappingURL=start.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -11,7 +11,9 @@ const list_1 = require("./commands/list");
|
|
|
11
11
|
const stop_1 = require("./commands/stop");
|
|
12
12
|
const replay_1 = require("./commands/replay");
|
|
13
13
|
const logs_1 = require("./commands/logs");
|
|
14
|
+
const config_1 = require("./commands/config");
|
|
14
15
|
const device_1 = require("./utils/device");
|
|
16
|
+
const config_2 = require("./utils/config");
|
|
15
17
|
const program = new commander_1.Command();
|
|
16
18
|
// ASCII art logo
|
|
17
19
|
const logo = `
|
|
@@ -34,6 +36,7 @@ program
|
|
|
34
36
|
.option('--demo', 'Create a temporary link that expires in 2 hours')
|
|
35
37
|
.option('--qr', 'Display QR code in terminal')
|
|
36
38
|
.option('--auth-header <header>', 'Add authorization header to requests')
|
|
39
|
+
.option('--local', 'Run in local simulation mode (no server required)')
|
|
37
40
|
.action(async (port, options) => {
|
|
38
41
|
if (port && !isNaN(parseInt(port))) {
|
|
39
42
|
await (0, start_1.startTunnel)(parseInt(port), options);
|
|
@@ -42,6 +45,19 @@ program
|
|
|
42
45
|
program.help();
|
|
43
46
|
}
|
|
44
47
|
});
|
|
48
|
+
// Start command: devportal start <port> (alias for default)
|
|
49
|
+
program
|
|
50
|
+
.command('start [port]')
|
|
51
|
+
.description('Start a tunnel to expose your local port')
|
|
52
|
+
.option('-s, --subdomain <name>', 'Custom subdomain for your URL')
|
|
53
|
+
.option('-p, --password <pass>', 'Password protect the tunnel')
|
|
54
|
+
.option('--demo', 'Create a temporary link that expires in 2 hours')
|
|
55
|
+
.option('--qr', 'Display QR code in terminal')
|
|
56
|
+
.option('--auth-header <header>', 'Add authorization header to requests')
|
|
57
|
+
.option('--local', 'Run in local simulation mode (no server required)')
|
|
58
|
+
.action(async (port = '3000', options) => {
|
|
59
|
+
await (0, start_1.startTunnel)(parseInt(port), options);
|
|
60
|
+
});
|
|
45
61
|
// List tunnels: devportal ls
|
|
46
62
|
program
|
|
47
63
|
.command('ls')
|
|
@@ -74,14 +90,22 @@ program
|
|
|
74
90
|
.action(async (tunnelId) => {
|
|
75
91
|
await (0, logs_1.showLogs)(tunnelId);
|
|
76
92
|
});
|
|
93
|
+
// Config command
|
|
94
|
+
program
|
|
95
|
+
.command('config [action] [value]')
|
|
96
|
+
.description('View or update configuration')
|
|
97
|
+
.action(async (action, value) => {
|
|
98
|
+
await (0, config_1.configCommand)(action, value);
|
|
99
|
+
});
|
|
77
100
|
// Device info command
|
|
78
101
|
program
|
|
79
102
|
.command('whoami')
|
|
80
|
-
.description('Show current device ID')
|
|
103
|
+
.description('Show current device ID and dashboard URL')
|
|
81
104
|
.action(() => {
|
|
82
105
|
const deviceId = (0, device_1.getDeviceId)();
|
|
106
|
+
const config = (0, config_2.getConfig)();
|
|
83
107
|
console.log(chalk_1.default.gray('Device ID:'), chalk_1.default.cyan(deviceId));
|
|
84
|
-
console.log(chalk_1.default.gray('Dashboard:'), chalk_1.default.underline(
|
|
108
|
+
console.log(chalk_1.default.gray('Dashboard:'), chalk_1.default.underline(`${config.serverUrl}/dashboard/${deviceId}`));
|
|
85
109
|
});
|
|
86
110
|
program.parse();
|
|
87
111
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,4CAA+C;AAC/C,0CAA8C;AAC9C,0CAA6C;AAC7C,8CAAkD;AAClD,0CAA2C;AAC3C,2CAA6C;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,4CAA+C;AAC/C,0CAA8C;AAC9C,0CAA6C;AAC7C,8CAAkD;AAClD,0CAA2C;AAC3C,8CAAkD;AAClD,2CAA6C;AAC7C,2CAA2C;AAE3C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,iBAAiB;AACjB,MAAM,IAAI,GAAG;EACX,eAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC;EACvD,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,iCAAiC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC;EACjG,eAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC;CACxD,CAAC;AAEF,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,6DAA6D,CAAC;KAC1E,OAAO,CAAC,OAAO,CAAC;KAChB,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;IACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC;AAEL,iCAAiC;AACjC,OAAO;KACJ,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,EAAE,MAAM,CAAC;KAClD,MAAM,CAAC,wBAAwB,EAAE,+BAA+B,CAAC;KACjE,MAAM,CAAC,uBAAuB,EAAE,6BAA6B,CAAC;KAC9D,MAAM,CAAC,QAAQ,EAAE,iDAAiD,CAAC;KACnE,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC;KAC7C,MAAM,CAAC,wBAAwB,EAAE,sCAAsC,CAAC;KACxE,MAAM,CAAC,SAAS,EAAE,mDAAmD,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAC9B,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,IAAA,mBAAW,EAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,4DAA4D;AAC5D,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,wBAAwB,EAAE,+BAA+B,CAAC;KACjE,MAAM,CAAC,uBAAuB,EAAE,6BAA6B,CAAC;KAC9D,MAAM,CAAC,QAAQ,EAAE,iDAAiD,CAAC;KACnE,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC;KAC7C,MAAM,CAAC,wBAAwB,EAAE,sCAAsC,CAAC;KACxE,MAAM,CAAC,SAAS,EAAE,mDAAmD,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,EAAE,OAAO,EAAE,EAAE;IACvC,MAAM,IAAA,mBAAW,EAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEL,6BAA6B;AAC7B,OAAO;KACJ,OAAO,CAAC,IAAI,CAAC;KACb,KAAK,CAAC,MAAM,CAAC;KACb,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,IAAA,kBAAW,GAAE,CAAC;AACtB,CAAC,CAAC,CAAC;AAEL,mCAAmC;AACnC,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,qBAAqB,CAAC;KAClC,MAAM,CAAC,WAAW,EAAE,yBAAyB,CAAC;KAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAClC,MAAM,IAAA,iBAAU,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC;AAEL,+CAA+C;AAC/C,OAAO;KACJ,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,2BAA2B,CAAC;KACxC,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC;KAC3D,MAAM,CAAC,mBAAmB,EAAE,uBAAuB,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;IACnC,MAAM,IAAA,sBAAa,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEL,yCAAyC;AACzC,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;IACzB,MAAM,IAAA,eAAQ,EAAC,QAAQ,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEL,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,yBAAyB,CAAC;KAClC,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;IAC9B,MAAM,IAAA,sBAAa,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEL,sBAAsB;AACtB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,QAAQ,GAAG,IAAA,oBAAW,GAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,eAAK,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,SAAS,cAAc,QAAQ,EAAE,CAAC,CAAC,CAAC;AACtG,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface Config {
|
|
2
|
+
serverUrl: string;
|
|
3
|
+
wsUrl: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function getConfig(): Config;
|
|
6
|
+
export declare function saveConfig(config: Partial<Config>): void;
|
|
7
|
+
export declare function setServerUrl(url: string): void;
|
|
8
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AASD,wBAAgB,SAAS,IAAI,MAAM,CAYlC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAOxD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAS9C"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getConfig = getConfig;
|
|
37
|
+
exports.saveConfig = saveConfig;
|
|
38
|
+
exports.setServerUrl = setServerUrl;
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const device_1 = require("./device");
|
|
42
|
+
const CONFIG_FILE = path.join((0, device_1.getConfigDir)(), 'config.json');
|
|
43
|
+
const DEFAULT_CONFIG = {
|
|
44
|
+
serverUrl: 'https://tunnel.stylnode.in',
|
|
45
|
+
wsUrl: 'wss://tunnel.stylnode.in/ws',
|
|
46
|
+
};
|
|
47
|
+
function getConfig() {
|
|
48
|
+
if (!fs.existsSync(CONFIG_FILE)) {
|
|
49
|
+
saveConfig(DEFAULT_CONFIG);
|
|
50
|
+
return DEFAULT_CONFIG;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const config = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'));
|
|
54
|
+
return { ...DEFAULT_CONFIG, ...config };
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return DEFAULT_CONFIG;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function saveConfig(config) {
|
|
61
|
+
const currentConfig = fs.existsSync(CONFIG_FILE)
|
|
62
|
+
? JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'))
|
|
63
|
+
: {};
|
|
64
|
+
const newConfig = { ...currentConfig, ...config };
|
|
65
|
+
fs.writeFileSync(CONFIG_FILE, JSON.stringify(newConfig, null, 2));
|
|
66
|
+
}
|
|
67
|
+
function setServerUrl(url) {
|
|
68
|
+
// Derive WebSocket URL from HTTP URL (same host, /ws path)
|
|
69
|
+
const wsUrl = url.replace('https://', 'wss://').replace('http://', 'ws://');
|
|
70
|
+
const wsWithPath = wsUrl.replace(/\/$/, '') + '/ws';
|
|
71
|
+
saveConfig({
|
|
72
|
+
serverUrl: url.replace(/\/$/, ''),
|
|
73
|
+
wsUrl: wsWithPath,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,8BAYC;AAED,gCAOC;AAED,oCASC;AAhDD,uCAAyB;AACzB,2CAA6B;AAC7B,qCAAwC;AAOxC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAA,qBAAY,GAAE,EAAE,aAAa,CAAC,CAAC;AAE7D,MAAM,cAAc,GAAW;IAC7B,SAAS,EAAE,4BAA4B;IACvC,KAAK,EAAE,6BAA6B;CACrC,CAAC;AAEF,SAAgB,SAAS;IACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,UAAU,CAAC,cAAc,CAAC,CAAC;QAC3B,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QACjE,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC;IACxB,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,MAAuB;IAChD,MAAM,aAAa,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAC9C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,SAAS,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,EAAE,CAAC;IAClD,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAgB,YAAY,CAAC,GAAW;IACtC,2DAA2D;IAC3D,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC5E,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;IAEpD,UAAU,CAAC;QACT,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QACjC,KAAK,EAAE,UAAU;KAClB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
export interface TunnelConfig {
|
|
3
|
+
serverUrl: string;
|
|
4
|
+
wsUrl: string;
|
|
5
|
+
deviceId: string;
|
|
6
|
+
localPort: number;
|
|
7
|
+
subdomain?: string;
|
|
8
|
+
password?: string;
|
|
9
|
+
demo?: boolean;
|
|
10
|
+
authHeader?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface TunnelInfo {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
url: string;
|
|
16
|
+
expiresAt: string | null;
|
|
17
|
+
}
|
|
18
|
+
export declare class TunnelClient extends EventEmitter {
|
|
19
|
+
private ws;
|
|
20
|
+
private config;
|
|
21
|
+
private reconnectAttempts;
|
|
22
|
+
private maxReconnectAttempts;
|
|
23
|
+
private reconnectDelay;
|
|
24
|
+
private isConnected;
|
|
25
|
+
private tunnelInfo;
|
|
26
|
+
constructor(config: TunnelConfig);
|
|
27
|
+
connect(): Promise<TunnelInfo>;
|
|
28
|
+
private handleMessage;
|
|
29
|
+
private handleIncomingRequest;
|
|
30
|
+
private makeLocalRequest;
|
|
31
|
+
private send;
|
|
32
|
+
stop(): void;
|
|
33
|
+
getTunnelInfo(): TunnelInfo | null;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=tunnelClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnelClient.d.ts","sourceRoot":"","sources":["../../src/utils/tunnelClient.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAA2B;gBAEjC,MAAM,EAAE,YAAY;IAK1B,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;YA8DtB,aAAa;YA+Bb,qBAAqB;IAgDnC,OAAO,CAAC,gBAAgB;IAwExB,OAAO,CAAC,IAAI;IAMZ,IAAI,IAAI,IAAI;IAOZ,aAAa,IAAI,UAAU,GAAG,IAAI;CAGnC"}
|
|
@@ -0,0 +1,212 @@
|
|
|
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.TunnelClient = void 0;
|
|
7
|
+
const ws_1 = __importDefault(require("ws"));
|
|
8
|
+
const http_1 = __importDefault(require("http"));
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const events_1 = require("events");
|
|
11
|
+
class TunnelClient extends events_1.EventEmitter {
|
|
12
|
+
constructor(config) {
|
|
13
|
+
super();
|
|
14
|
+
this.ws = null;
|
|
15
|
+
this.reconnectAttempts = 0;
|
|
16
|
+
this.maxReconnectAttempts = 5;
|
|
17
|
+
this.reconnectDelay = 1000;
|
|
18
|
+
this.isConnected = false;
|
|
19
|
+
this.tunnelInfo = null;
|
|
20
|
+
this.config = config;
|
|
21
|
+
}
|
|
22
|
+
async connect() {
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
try {
|
|
25
|
+
this.ws = new ws_1.default(this.config.wsUrl);
|
|
26
|
+
this.ws.on('open', () => {
|
|
27
|
+
this.isConnected = true;
|
|
28
|
+
this.reconnectAttempts = 0;
|
|
29
|
+
// Register tunnel
|
|
30
|
+
this.send({
|
|
31
|
+
type: 'register',
|
|
32
|
+
deviceId: this.config.deviceId,
|
|
33
|
+
localPort: this.config.localPort,
|
|
34
|
+
subdomain: this.config.subdomain,
|
|
35
|
+
password: this.config.password,
|
|
36
|
+
demo: this.config.demo,
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
this.ws.on('message', async (data) => {
|
|
40
|
+
try {
|
|
41
|
+
const message = JSON.parse(data.toString());
|
|
42
|
+
await this.handleMessage(message, resolve, reject);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.error('Failed to parse message:', error);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
this.ws.on('close', () => {
|
|
49
|
+
this.isConnected = false;
|
|
50
|
+
this.emit('disconnected');
|
|
51
|
+
if (this.reconnectAttempts < this.maxReconnectAttempts) {
|
|
52
|
+
this.reconnectAttempts++;
|
|
53
|
+
console.log(chalk_1.default.yellow(`Reconnecting... (attempt ${this.reconnectAttempts})`));
|
|
54
|
+
setTimeout(() => this.connect(), this.reconnectDelay * this.reconnectAttempts);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
this.ws.on('error', (error) => {
|
|
58
|
+
if (!this.isConnected) {
|
|
59
|
+
reject(error);
|
|
60
|
+
}
|
|
61
|
+
this.emit('error', error);
|
|
62
|
+
});
|
|
63
|
+
// Ping to keep connection alive
|
|
64
|
+
const pingInterval = setInterval(() => {
|
|
65
|
+
if (this.isConnected && this.ws?.readyState === ws_1.default.OPEN) {
|
|
66
|
+
this.send({ type: 'ping' });
|
|
67
|
+
}
|
|
68
|
+
}, 30000);
|
|
69
|
+
this.on('disconnected', () => clearInterval(pingInterval));
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
reject(error);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async handleMessage(message, resolve, reject) {
|
|
77
|
+
switch (message.type) {
|
|
78
|
+
case 'registered':
|
|
79
|
+
this.tunnelInfo = message.tunnel;
|
|
80
|
+
this.emit('registered', message.tunnel);
|
|
81
|
+
resolve(message.tunnel);
|
|
82
|
+
break;
|
|
83
|
+
case 'request':
|
|
84
|
+
await this.handleIncomingRequest(message);
|
|
85
|
+
break;
|
|
86
|
+
case 'error':
|
|
87
|
+
console.error(chalk_1.default.red('Server error:'), message.message);
|
|
88
|
+
reject(new Error(message.message));
|
|
89
|
+
break;
|
|
90
|
+
case 'pong':
|
|
91
|
+
// Connection alive
|
|
92
|
+
break;
|
|
93
|
+
case 'stopped':
|
|
94
|
+
this.emit('stopped', message.tunnelId);
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async handleIncomingRequest(message) {
|
|
99
|
+
const { requestId, method, path, headers, query, body } = message;
|
|
100
|
+
// Log the request
|
|
101
|
+
this.emit('request', { method, path, requestId });
|
|
102
|
+
// Build URL with query params
|
|
103
|
+
let url = `http://localhost:${this.config.localPort}${path}`;
|
|
104
|
+
if (query && Object.keys(query).length > 0) {
|
|
105
|
+
const params = new URLSearchParams(query);
|
|
106
|
+
url += `?${params.toString()}`;
|
|
107
|
+
}
|
|
108
|
+
// Add auth header if configured
|
|
109
|
+
const requestHeaders = { ...headers };
|
|
110
|
+
if (this.config.authHeader) {
|
|
111
|
+
const [key, value] = this.config.authHeader.split(': ');
|
|
112
|
+
if (key && value) {
|
|
113
|
+
requestHeaders[key] = value;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
const response = await this.makeLocalRequest(method, url, requestHeaders, body);
|
|
118
|
+
this.emit('response', { method, path, status: response.status, requestId });
|
|
119
|
+
// Send response back to server
|
|
120
|
+
this.send({
|
|
121
|
+
type: 'response',
|
|
122
|
+
requestId,
|
|
123
|
+
status: response.status,
|
|
124
|
+
headers: response.headers,
|
|
125
|
+
body: response.body,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
this.emit('error', error);
|
|
130
|
+
// Send error response
|
|
131
|
+
this.send({
|
|
132
|
+
type: 'response',
|
|
133
|
+
requestId,
|
|
134
|
+
status: 502,
|
|
135
|
+
headers: { 'content-type': 'application/json' },
|
|
136
|
+
body: JSON.stringify({ error: 'Failed to connect to local server', message: error.message }),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
makeLocalRequest(method, url, headers, body) {
|
|
141
|
+
return new Promise((resolve, reject) => {
|
|
142
|
+
const urlObj = new URL(url);
|
|
143
|
+
const options = {
|
|
144
|
+
hostname: urlObj.hostname,
|
|
145
|
+
port: urlObj.port || 80,
|
|
146
|
+
path: urlObj.pathname + urlObj.search,
|
|
147
|
+
method,
|
|
148
|
+
headers,
|
|
149
|
+
timeout: 30000,
|
|
150
|
+
};
|
|
151
|
+
const req = http_1.default.request(options, (res) => {
|
|
152
|
+
const chunks = [];
|
|
153
|
+
res.on('data', (chunk) => chunks.push(chunk));
|
|
154
|
+
res.on('end', () => {
|
|
155
|
+
const bodyBuffer = Buffer.concat(chunks);
|
|
156
|
+
const responseHeaders = {};
|
|
157
|
+
// Convert headers
|
|
158
|
+
for (const [key, value] of Object.entries(res.headers)) {
|
|
159
|
+
if (value) {
|
|
160
|
+
responseHeaders[key] = Array.isArray(value) ? value.join(', ') : value;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Check if body is binary
|
|
164
|
+
const contentType = responseHeaders['content-type'] || '';
|
|
165
|
+
const isBinary = !contentType.includes('text') &&
|
|
166
|
+
!contentType.includes('json') &&
|
|
167
|
+
!contentType.includes('xml') &&
|
|
168
|
+
!contentType.includes('javascript');
|
|
169
|
+
let bodyString;
|
|
170
|
+
if (isBinary) {
|
|
171
|
+
bodyString = bodyBuffer.toString('base64');
|
|
172
|
+
responseHeaders['x-body-encoding'] = 'base64';
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
bodyString = bodyBuffer.toString('utf-8');
|
|
176
|
+
}
|
|
177
|
+
resolve({
|
|
178
|
+
status: res.statusCode || 500,
|
|
179
|
+
headers: responseHeaders,
|
|
180
|
+
body: bodyString,
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
req.on('error', reject);
|
|
185
|
+
req.on('timeout', () => reject(new Error('Request timeout')));
|
|
186
|
+
if (body) {
|
|
187
|
+
// Decode base64 body if it was encoded
|
|
188
|
+
const bodyBuffer = body.startsWith('ey') || body.includes('=')
|
|
189
|
+
? Buffer.from(body, 'base64')
|
|
190
|
+
: Buffer.from(body);
|
|
191
|
+
req.write(bodyBuffer);
|
|
192
|
+
}
|
|
193
|
+
req.end();
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
send(data) {
|
|
197
|
+
if (this.ws?.readyState === ws_1.default.OPEN) {
|
|
198
|
+
this.ws.send(JSON.stringify(data));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
stop() {
|
|
202
|
+
if (this.tunnelInfo) {
|
|
203
|
+
this.send({ type: 'stop', tunnelId: this.tunnelInfo.id });
|
|
204
|
+
}
|
|
205
|
+
this.ws?.close();
|
|
206
|
+
}
|
|
207
|
+
getTunnelInfo() {
|
|
208
|
+
return this.tunnelInfo;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
exports.TunnelClient = TunnelClient;
|
|
212
|
+
//# sourceMappingURL=tunnelClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnelClient.js","sourceRoot":"","sources":["../../src/utils/tunnelClient.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "devportal-tunnel",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Expose your localhost to the internet with a single command",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
7
|
+
"devportal": "./dist/index.js",
|
|
7
8
|
"devportal-tunnel": "./dist/index.js"
|
|
8
9
|
},
|
|
9
10
|
"scripts": {
|