devportal-tunnel 1.0.0 → 1.0.2

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.
@@ -0,0 +1,18 @@
1
+ export interface LogEntry {
2
+ time: string;
3
+ method: string;
4
+ path: string;
5
+ status: number;
6
+ duration: number;
7
+ }
8
+ export declare function formatLog(entry: LogEntry): string;
9
+ /**
10
+ * Log a request to the terminal and optionally to a file.
11
+ * @param method HTTP method
12
+ * @param path Request path
13
+ * @param status HTTP status code
14
+ * @param duration Duration in ms
15
+ * @param logFile Optional log file path
16
+ */
17
+ export declare function logRequest(method: string, path: string, status: number, duration: number, logFile?: string): void;
18
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAqBjD;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,QAkBjB"}
@@ -0,0 +1,56 @@
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.formatLog = formatLog;
7
+ exports.logRequest = logRequest;
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const fs_1 = __importDefault(require("fs"));
10
+ function formatLog(entry) {
11
+ const methodColor = entry.method === "GET"
12
+ ? chalk_1.default.green
13
+ : entry.method === "POST"
14
+ ? chalk_1.default.blue
15
+ : chalk_1.default.yellow;
16
+ const statusColor = entry.status >= 500
17
+ ? chalk_1.default.red
18
+ : entry.status >= 400
19
+ ? chalk_1.default.yellow
20
+ : chalk_1.default.green;
21
+ return [
22
+ chalk_1.default.gray(`[${entry.time}]`),
23
+ methodColor(entry.method.padEnd(6)),
24
+ chalk_1.default.white(entry.path.padEnd(20)),
25
+ statusColor(entry.status.toString().padEnd(4)),
26
+ chalk_1.default.gray(`${entry.duration}ms`),
27
+ ].join(" ");
28
+ }
29
+ /**
30
+ * Log a request to the terminal and optionally to a file.
31
+ * @param method HTTP method
32
+ * @param path Request path
33
+ * @param status HTTP status code
34
+ * @param duration Duration in ms
35
+ * @param logFile Optional log file path
36
+ */
37
+ function logRequest(method, path, status, duration, logFile) {
38
+ const entry = {
39
+ time: new Date().toLocaleTimeString(),
40
+ method,
41
+ path,
42
+ status,
43
+ duration,
44
+ };
45
+ const line = formatLog(entry);
46
+ console.log(line);
47
+ if (logFile) {
48
+ try {
49
+ fs_1.default.appendFileSync(logFile, line + "\n");
50
+ }
51
+ catch (err) {
52
+ // Ignore file errors for now
53
+ }
54
+ }
55
+ }
56
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;;;AAWA,8BAqBC;AAUD,gCAuBC;AAjED,kDAA0B;AAC1B,4CAAoB;AAUpB,SAAgB,SAAS,CAAC,KAAe;IACvC,MAAM,WAAW,GACf,KAAK,CAAC,MAAM,KAAK,KAAK;QACpB,CAAC,CAAC,eAAK,CAAC,KAAK;QACb,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM;YACvB,CAAC,CAAC,eAAK,CAAC,IAAI;YACZ,CAAC,CAAC,eAAK,CAAC,MAAM,CAAC;IACrB,MAAM,WAAW,GACf,KAAK,CAAC,MAAM,IAAI,GAAG;QACjB,CAAC,CAAC,eAAK,CAAC,GAAG;QACX,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG;YACnB,CAAC,CAAC,eAAK,CAAC,MAAM;YACd,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC;IAEpB,OAAO;QACL,eAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC;QAC7B,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnC,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9C,eAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,CAAC;KAClC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,UAAU,CACxB,MAAc,EACd,IAAY,EACZ,MAAc,EACd,QAAgB,EAChB,OAAgB;IAEhB,MAAM,KAAK,GAAa;QACtB,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE;QACrC,MAAM;QACN,IAAI;QACJ,MAAM;QACN,QAAQ;KACT,CAAC;IACF,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,YAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,6BAA6B;QAC/B,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { EventEmitter } from "events";
2
+ export interface TunnelConfig {
3
+ serverUrl: string;
4
+ wsUrl: string;
5
+ deviceId: string;
6
+ localPort: number;
7
+ remotePort?: number;
8
+ subdomain?: string;
9
+ password?: string;
10
+ demo?: boolean;
11
+ authHeader?: string;
12
+ }
13
+ export interface TunnelInfo {
14
+ id: string;
15
+ name: string;
16
+ url: string;
17
+ expiresAt: string | null;
18
+ }
19
+ export declare class TunnelClient extends EventEmitter {
20
+ private ws;
21
+ /**
22
+ * Local application WebSocket connections.
23
+ *
24
+ * wsId = browser WebSocket ID generated by the server.
25
+ */
26
+ private localWebSockets;
27
+ private config;
28
+ private reconnectAttempts;
29
+ private maxReconnectAttempts;
30
+ private baseReconnectDelay;
31
+ private isConnected;
32
+ private tunnelInfo;
33
+ private pingInterval;
34
+ private isReconnecting;
35
+ private shouldReconnect;
36
+ constructor(config: TunnelConfig);
37
+ connect(): Promise<TunnelInfo>;
38
+ private setupWebSocket;
39
+ private scheduleReconnect;
40
+ private startPingInterval;
41
+ private stopPingInterval;
42
+ private handleMessage;
43
+ /**
44
+ * Browser -> Server -> CLI
45
+ *
46
+ * Server tells CLI to create a local WebSocket.
47
+ */
48
+ private handleWebSocketOpen;
49
+ /**
50
+ * Browser -> Server -> CLI -> Local app
51
+ */
52
+ private handleWebSocketMessage;
53
+ /**
54
+ * Browser -> Server -> CLI
55
+ *
56
+ * Close local WebSocket.
57
+ */
58
+ private handleWebSocketClose;
59
+ private closeAllLocalWebSockets;
60
+ private handleIncomingRequest;
61
+ private makeLocalRequest;
62
+ private send;
63
+ stop(): Promise<void>;
64
+ getTunnelInfo(): TunnelInfo | null;
65
+ }
66
+ //# 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,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,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;IAEpC;;;;OAIG;IACH,OAAO,CAAC,eAAe,CAAgC;IAEvD,OAAO,CAAC,MAAM,CAAe;IAE7B,OAAO,CAAC,iBAAiB,CAAK;IAE9B,OAAO,CAAC,oBAAoB,CAAM;IAElC,OAAO,CAAC,kBAAkB,CAAQ;IAElC,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,UAAU,CAA2B;IAE7C,OAAO,CAAC,YAAY,CAA+B;IAEnD,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,eAAe,CAAQ;gBAEnB,MAAM,EAAE,YAAY;IAM1B,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;IAMpC,OAAO,CAAC,cAAc;IA4FtB,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,gBAAgB;YAQV,aAAa;IA8E3B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAwF3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAsB9B;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,uBAAuB;YAajB,qBAAqB;IA+EnC,OAAO,CAAC,gBAAgB;IAiGxB,OAAO,CAAC,IAAI;IAMN,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B3B,aAAa,IAAI,UAAU,GAAG,IAAI;CAGnC"}
@@ -0,0 +1,463 @@
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
+ /**
16
+ * Local application WebSocket connections.
17
+ *
18
+ * wsId = browser WebSocket ID generated by the server.
19
+ */
20
+ this.localWebSockets = new Map();
21
+ this.reconnectAttempts = 0;
22
+ this.maxReconnectAttempts = 10;
23
+ this.baseReconnectDelay = 1000;
24
+ this.isConnected = false;
25
+ this.tunnelInfo = null;
26
+ this.pingInterval = null;
27
+ this.isReconnecting = false;
28
+ this.shouldReconnect = true;
29
+ this.config = config;
30
+ }
31
+ async connect() {
32
+ return new Promise((resolve, reject) => {
33
+ this.setupWebSocket(resolve, reject);
34
+ });
35
+ }
36
+ setupWebSocket(resolve, reject) {
37
+ try {
38
+ // Clean up existing control connection
39
+ if (this.ws) {
40
+ this.ws.removeAllListeners();
41
+ if (this.ws.readyState === ws_1.default.OPEN ||
42
+ this.ws.readyState === ws_1.default.CONNECTING) {
43
+ this.ws.close();
44
+ }
45
+ }
46
+ this.ws = new ws_1.default(this.config.wsUrl);
47
+ const ws = this.ws;
48
+ ws.on("open", () => {
49
+ this.isConnected = true;
50
+ this.isReconnecting = false;
51
+ this.reconnectAttempts = 0;
52
+ this.send({
53
+ type: "register",
54
+ deviceId: this.config.deviceId,
55
+ localPort: this.config.localPort,
56
+ remotePort: this.config.remotePort,
57
+ subdomain: this.tunnelInfo?.name || this.config.subdomain,
58
+ password: this.config.password,
59
+ demo: this.config.demo,
60
+ });
61
+ this.startPingInterval();
62
+ });
63
+ ws.on("message", async (data) => {
64
+ try {
65
+ const message = JSON.parse(data.toString());
66
+ await this.handleMessage(message, resolve, reject);
67
+ }
68
+ catch (error) {
69
+ console.error("Failed to parse server message:", error);
70
+ }
71
+ });
72
+ ws.on("close", () => {
73
+ this.isConnected = false;
74
+ this.stopPingInterval();
75
+ this.closeAllLocalWebSockets();
76
+ if (!this.shouldReconnect) {
77
+ this.emit("disconnected");
78
+ return;
79
+ }
80
+ if (this.reconnectAttempts < this.maxReconnectAttempts) {
81
+ this.scheduleReconnect();
82
+ }
83
+ else {
84
+ console.log(chalk_1.default.red("\nMax reconnection attempts reached. Tunnel stopped."));
85
+ console.log(chalk_1.default.gray("Run the command again to start a new tunnel."));
86
+ this.emit("disconnected");
87
+ process.exit(1);
88
+ }
89
+ });
90
+ ws.on("error", (error) => {
91
+ if (!this.isConnected && !this.isReconnecting && reject) {
92
+ reject(error);
93
+ }
94
+ this.emit("error", error);
95
+ });
96
+ }
97
+ catch (error) {
98
+ if (reject) {
99
+ reject(error);
100
+ }
101
+ }
102
+ }
103
+ scheduleReconnect() {
104
+ if (this.isReconnecting) {
105
+ return;
106
+ }
107
+ this.isReconnecting = true;
108
+ this.reconnectAttempts++;
109
+ const delay = Math.min(this.baseReconnectDelay * Math.pow(2, this.reconnectAttempts - 1) +
110
+ Math.random() * 1000, 30000);
111
+ console.log(chalk_1.default.yellow(`\nConnection lost. Reconnecting in ${Math.round(delay / 1000)}s... (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`));
112
+ setTimeout(() => {
113
+ this.emit("reconnecting", this.reconnectAttempts);
114
+ this.setupWebSocket();
115
+ }, delay);
116
+ }
117
+ startPingInterval() {
118
+ this.stopPingInterval();
119
+ this.pingInterval = setInterval(() => {
120
+ if (this.isConnected && this.ws?.readyState === ws_1.default.OPEN) {
121
+ this.send({
122
+ type: "ping",
123
+ });
124
+ }
125
+ }, 15000);
126
+ }
127
+ stopPingInterval() {
128
+ if (this.pingInterval) {
129
+ clearInterval(this.pingInterval);
130
+ this.pingInterval = null;
131
+ }
132
+ }
133
+ async handleMessage(message, resolve, reject) {
134
+ switch (message.type) {
135
+ case "registered": {
136
+ const wasReconnect = this.tunnelInfo !== null;
137
+ this.tunnelInfo = message.tunnel;
138
+ this.emit("registered", message.tunnel);
139
+ if (wasReconnect) {
140
+ console.log(chalk_1.default.green(`\nReconnected! Tunnel restored: ${message.tunnel.url}`));
141
+ this.emit("reconnected", message.tunnel);
142
+ }
143
+ else if (resolve) {
144
+ resolve(message.tunnel);
145
+ }
146
+ break;
147
+ }
148
+ case "request": {
149
+ await this.handleIncomingRequest(message);
150
+ break;
151
+ }
152
+ case "ws-open": {
153
+ this.handleWebSocketOpen(message);
154
+ break;
155
+ }
156
+ case "ws-message": {
157
+ this.handleWebSocketMessage(message);
158
+ break;
159
+ }
160
+ case "ws-close": {
161
+ this.handleWebSocketClose(message);
162
+ break;
163
+ }
164
+ case "error": {
165
+ console.error(chalk_1.default.red("Server error:"), message.message);
166
+ if (reject) {
167
+ reject(new Error(message.message));
168
+ }
169
+ break;
170
+ }
171
+ case "pong": {
172
+ break;
173
+ }
174
+ case "stopped": {
175
+ this.emit("stopped", message.tunnelId);
176
+ break;
177
+ }
178
+ default: {
179
+ console.warn("Unknown server message:", message.type);
180
+ }
181
+ }
182
+ }
183
+ /**
184
+ * Browser -> Server -> CLI
185
+ *
186
+ * Server tells CLI to create a local WebSocket.
187
+ */
188
+ handleWebSocketOpen(message) {
189
+ const { wsId, path, headers } = message;
190
+ if (!wsId) {
191
+ return;
192
+ }
193
+ const safePath = path && path !== "undefined" ? path : "/";
194
+ const localUrl = `ws://localhost:${this.config.localPort}${safePath}`;
195
+ console.log(chalk_1.default.gray(`WebSocket opening: ${localUrl}`));
196
+ const localHeaders = {
197
+ host: `localhost:${this.config.localPort}`,
198
+ };
199
+ // Forward useful headers but remove proxy-specific ones.
200
+ if (headers && typeof headers === "object") {
201
+ for (const [key, value] of Object.entries(headers)) {
202
+ if (typeof value === "string" &&
203
+ ![
204
+ "host",
205
+ "connection",
206
+ "upgrade",
207
+ "sec-websocket-key",
208
+ "sec-websocket-version",
209
+ "sec-websocket-extensions",
210
+ "content-length",
211
+ "x-forwarded-host",
212
+ "x-forwarded-proto",
213
+ "x-forwarded-for",
214
+ ].includes(key.toLowerCase())) {
215
+ localHeaders[key] = value;
216
+ }
217
+ }
218
+ }
219
+ const localWs = new ws_1.default(localUrl, {
220
+ headers: localHeaders,
221
+ });
222
+ this.localWebSockets.set(wsId, localWs);
223
+ localWs.on("open", () => {
224
+ console.log(chalk_1.default.gray(`WebSocket connected locally: ${wsId}`));
225
+ this.send({
226
+ type: "ws-opened",
227
+ wsId,
228
+ });
229
+ });
230
+ localWs.on("message", (data, isBinary) => {
231
+ this.send({
232
+ type: "ws-message",
233
+ wsId,
234
+ data: Buffer.from(data).toString("base64"),
235
+ binary: isBinary,
236
+ });
237
+ });
238
+ localWs.on("close", () => {
239
+ this.localWebSockets.delete(wsId);
240
+ this.send({
241
+ type: "ws-close",
242
+ wsId,
243
+ });
244
+ });
245
+ localWs.on("error", (error) => {
246
+ console.error(chalk_1.default.red(`Local WebSocket error (${wsId}):`), error.message);
247
+ this.localWebSockets.delete(wsId);
248
+ this.send({
249
+ type: "ws-close",
250
+ wsId,
251
+ });
252
+ });
253
+ }
254
+ /**
255
+ * Browser -> Server -> CLI -> Local app
256
+ */
257
+ handleWebSocketMessage(message) {
258
+ const { wsId, data, binary } = message;
259
+ const localWs = this.localWebSockets.get(wsId);
260
+ if (!localWs || localWs.readyState !== ws_1.default.OPEN) {
261
+ return;
262
+ }
263
+ try {
264
+ const payload = Buffer.from(data, "base64");
265
+ if (binary) {
266
+ localWs.send(payload);
267
+ }
268
+ else {
269
+ localWs.send(payload.toString("utf8"));
270
+ }
271
+ }
272
+ catch (error) {
273
+ console.error("Failed to forward WebSocket message:", error);
274
+ }
275
+ }
276
+ /**
277
+ * Browser -> Server -> CLI
278
+ *
279
+ * Close local WebSocket.
280
+ */
281
+ handleWebSocketClose(message) {
282
+ const { wsId } = message;
283
+ const localWs = this.localWebSockets.get(wsId);
284
+ if (!localWs) {
285
+ return;
286
+ }
287
+ this.localWebSockets.delete(wsId);
288
+ if (localWs.readyState === ws_1.default.OPEN ||
289
+ localWs.readyState === ws_1.default.CONNECTING) {
290
+ localWs.close();
291
+ }
292
+ }
293
+ closeAllLocalWebSockets() {
294
+ for (const localWs of this.localWebSockets.values()) {
295
+ if (localWs.readyState === ws_1.default.OPEN ||
296
+ localWs.readyState === ws_1.default.CONNECTING) {
297
+ localWs.close();
298
+ }
299
+ }
300
+ this.localWebSockets.clear();
301
+ }
302
+ async handleIncomingRequest(message) {
303
+ const { requestId, method, path, headers, body } = message;
304
+ this.emit("request", {
305
+ method,
306
+ path,
307
+ requestId,
308
+ });
309
+ const safePath = path && path !== "undefined" ? path : "/";
310
+ const url = `http://localhost:${this.config.localPort}${safePath}`;
311
+ const requestHeaders = {
312
+ ...headers,
313
+ host: `localhost:${this.config.localPort}`,
314
+ };
315
+ delete requestHeaders["content-length"];
316
+ delete requestHeaders["transfer-encoding"];
317
+ delete requestHeaders["connection"];
318
+ delete requestHeaders["sec-fetch-site"];
319
+ delete requestHeaders["sec-fetch-mode"];
320
+ delete requestHeaders["sec-fetch-dest"];
321
+ delete requestHeaders["sec-fetch-user"];
322
+ delete requestHeaders["origin"];
323
+ delete requestHeaders["referer"];
324
+ delete requestHeaders["x-forwarded-host"];
325
+ delete requestHeaders["x-forwarded-proto"];
326
+ delete requestHeaders["x-forwarded-for"];
327
+ if (this.config.authHeader) {
328
+ const [key, value] = this.config.authHeader.split(": ");
329
+ if (key && value) {
330
+ requestHeaders[key] = value;
331
+ }
332
+ }
333
+ try {
334
+ const response = await this.makeLocalRequest(method, url, requestHeaders, body);
335
+ this.emit("response", {
336
+ method,
337
+ path,
338
+ status: response.status,
339
+ requestId,
340
+ });
341
+ this.send({
342
+ type: "response",
343
+ requestId,
344
+ status: response.status,
345
+ headers: response.headers,
346
+ body: response.body,
347
+ });
348
+ }
349
+ catch (error) {
350
+ this.emit("error", error);
351
+ this.send({
352
+ type: "response",
353
+ requestId,
354
+ status: 502,
355
+ headers: {
356
+ "content-type": "application/json",
357
+ },
358
+ body: JSON.stringify({
359
+ error: "Failed to connect to local server",
360
+ message: error.message,
361
+ }),
362
+ });
363
+ }
364
+ }
365
+ makeLocalRequest(method, url, headers, body) {
366
+ return new Promise((resolve, reject) => {
367
+ const urlObj = new URL(url);
368
+ const options = {
369
+ hostname: urlObj.hostname,
370
+ port: Number(urlObj.port) || this.config.localPort,
371
+ path: urlObj.pathname + urlObj.search,
372
+ method,
373
+ headers,
374
+ timeout: 30000,
375
+ };
376
+ const req = http_1.default.request(options, (res) => {
377
+ const chunks = [];
378
+ res.on("data", (chunk) => {
379
+ chunks.push(chunk);
380
+ });
381
+ res.on("end", () => {
382
+ const bodyBuffer = Buffer.concat(chunks);
383
+ const responseHeaders = {};
384
+ for (const [key, value] of Object.entries(res.headers)) {
385
+ if (value) {
386
+ responseHeaders[key] = Array.isArray(value)
387
+ ? value.join(", ")
388
+ : value;
389
+ }
390
+ }
391
+ delete responseHeaders["content-length"];
392
+ delete responseHeaders["transfer-encoding"];
393
+ delete responseHeaders["connection"];
394
+ const contentType = responseHeaders["content-type"] || "";
395
+ const isBinary = !contentType.includes("text") &&
396
+ !contentType.includes("json") &&
397
+ !contentType.includes("xml") &&
398
+ !contentType.includes("javascript");
399
+ let bodyString;
400
+ if (isBinary) {
401
+ bodyString = bodyBuffer.toString("base64");
402
+ responseHeaders["x-body-encoding"] = "base64";
403
+ }
404
+ else {
405
+ bodyString = bodyBuffer.toString("utf-8");
406
+ }
407
+ resolve({
408
+ status: res.statusCode || 500,
409
+ headers: responseHeaders,
410
+ body: bodyString,
411
+ });
412
+ });
413
+ });
414
+ req.on("error", reject);
415
+ req.on("timeout", () => {
416
+ req.destroy();
417
+ reject(new Error("Request timeout"));
418
+ });
419
+ if (body) {
420
+ const bodyEncoding = headers?.["x-body-encoding"];
421
+ const bodyBuffer = bodyEncoding === "base64"
422
+ ? Buffer.from(body, "base64")
423
+ : Buffer.from(body, "utf-8");
424
+ req.write(bodyBuffer);
425
+ }
426
+ req.end();
427
+ });
428
+ }
429
+ send(data) {
430
+ if (this.ws?.readyState === ws_1.default.OPEN) {
431
+ this.ws.send(JSON.stringify(data));
432
+ }
433
+ }
434
+ async stop() {
435
+ this.shouldReconnect = false;
436
+ this.stopPingInterval();
437
+ this.closeAllLocalWebSockets();
438
+ if (this.tunnelInfo) {
439
+ this.send({
440
+ type: "stop",
441
+ tunnelId: this.tunnelInfo.id,
442
+ });
443
+ }
444
+ return new Promise((resolve) => {
445
+ if (this.ws?.readyState === ws_1.default.OPEN) {
446
+ const timeout = setTimeout(() => resolve(), 500);
447
+ this.ws.once("close", () => {
448
+ clearTimeout(timeout);
449
+ resolve();
450
+ });
451
+ this.ws.close();
452
+ }
453
+ else {
454
+ resolve();
455
+ }
456
+ });
457
+ }
458
+ getTunnelInfo() {
459
+ return this.tunnelInfo;
460
+ }
461
+ }
462
+ exports.TunnelClient = TunnelClient;
463
+ //# 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.2",
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": {
@@ -26,13 +27,13 @@
26
27
  "dependencies": {
27
28
  "chalk": "^4.1.2",
28
29
  "commander": "^11.1.0",
29
- "ora": "^5.4.1",
30
+ "ora": "^6.3.1",
30
31
  "qrcode-terminal": "^0.12.0",
31
32
  "ws": "^8.16.0"
32
33
  },
33
34
  "devDependencies": {
34
35
  "@types/node": "^20.10.0",
35
- "@types/ws": "^8.5.10",
36
+ "@types/ws": "^8.18.2",
36
37
  "ts-node": "^10.9.2",
37
38
  "typescript": "^5.3.0"
38
39
  },