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 CHANGED
@@ -1,16 +1,24 @@
1
- # DevPortal Tunnel CLI
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
- ## Usage
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
- ### Start a tunnel
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
- ### List active tunnels
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
- ### Device info
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
- - `device.json` - Your unique device ID
78
- - `tunnels.json` - Active tunnel information
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. Create an npm account at https://www.npmjs.com
83
- 2. Login: `npm login`
84
- 3. Build: `npm run build`
85
- 4. Publish: `npm publish`
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,2 @@
1
+ export declare function configCommand(action?: string, value?: string): Promise<void>;
2
+ //# sourceMappingURL=config.d.ts.map
@@ -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"}
@@ -4,6 +4,7 @@ interface StartOptions {
4
4
  demo?: boolean;
5
5
  qr?: boolean;
6
6
  authHeader?: string;
7
+ local?: boolean;
7
8
  }
8
9
  export declare function startTunnel(port: number, options: StartOptions): Promise<void>;
9
10
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AASA,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;CACrB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA4EpF"}
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"}
@@ -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)('Establishing tunnel...').start();
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
- // Generate tunnel info
58
- const name = options.subdomain || (0, tunnels_1.generateTunnelName)();
59
- const tunnelId = `t-${Date.now().toString(36)}`;
60
- const url = `https://${name}.devportal.live`;
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(1500);
63
- const tunnel = {
64
- id: tunnelId,
65
- name,
66
- url,
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.gray(' Dashboard: '), chalk_1.default.underline(`https://devportal.live/dashboard/${(0, device_1.getDeviceId)()}`));
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
- // Start mock request logging
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
- // Simulate incoming requests
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
- function simulateRequests() {
123
- const methods = ['GET', 'POST', 'PUT', 'DELETE'];
124
- const paths = ['/api/users', '/api/auth', '/api/data', '/webhook', '/health', '/api/items'];
125
- const statuses = [200, 200, 200, 201, 400, 401, 404, 500];
126
- const logRequest = () => {
127
- const method = methods[Math.floor(Math.random() * methods.length)];
128
- const path = paths[Math.floor(Math.random() * paths.length)];
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":"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"}
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(`https://devportal.live/dashboard/${deviceId}`));
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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -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.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": {