@leverageaiapps/locus-dev 1.1.3
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/Dockerfile +29 -0
- package/LICENSE +21 -0
- package/README.md +153 -0
- package/dist/capture.d.ts +3 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +134 -0
- package/dist/capture.js.map +1 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +84 -0
- package/dist/config.js.map +1 -0
- package/dist/context-extractor.d.ts +17 -0
- package/dist/context-extractor.d.ts.map +1 -0
- package/dist/context-extractor.js +118 -0
- package/dist/context-extractor.js.map +1 -0
- package/dist/debug-logger.d.ts +19 -0
- package/dist/debug-logger.d.ts.map +1 -0
- package/dist/debug-logger.js +48 -0
- package/dist/debug-logger.js.map +1 -0
- package/dist/exec.d.ts +20 -0
- package/dist/exec.d.ts.map +1 -0
- package/dist/exec.js +158 -0
- package/dist/exec.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +83 -0
- package/dist/index.js.map +1 -0
- package/dist/pty.d.ts +7 -0
- package/dist/pty.d.ts.map +1 -0
- package/dist/pty.js +27 -0
- package/dist/pty.js.map +1 -0
- package/dist/relay.d.ts +5 -0
- package/dist/relay.d.ts.map +1 -0
- package/dist/relay.js +131 -0
- package/dist/relay.js.map +1 -0
- package/dist/session.d.ts +6 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +250 -0
- package/dist/session.js.map +1 -0
- package/dist/voice-recognition-modelscope.d.ts +50 -0
- package/dist/voice-recognition-modelscope.d.ts.map +1 -0
- package/dist/voice-recognition-modelscope.js +171 -0
- package/dist/voice-recognition-modelscope.js.map +1 -0
- package/dist/vortex-tunnel.d.ts +9 -0
- package/dist/vortex-tunnel.d.ts.map +1 -0
- package/dist/vortex-tunnel.js +589 -0
- package/dist/vortex-tunnel.js.map +1 -0
- package/dist/web-server.d.ts +6 -0
- package/dist/web-server.d.ts.map +1 -0
- package/dist/web-server.js +2096 -0
- package/dist/web-server.js.map +1 -0
- package/docs/CNAME +1 -0
- package/docs/index.html +492 -0
- package/docs/install.sh +329 -0
- package/install.sh +329 -0
- package/package.json +69 -0
- package/scripts/postinstall.js +66 -0
- package/scripts/verify-install.js +128 -0
|
@@ -0,0 +1,589 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.startTunnel = startTunnel;
|
|
40
|
+
exports.stopTunnel = stopTunnel;
|
|
41
|
+
exports.getTunnelUrl = getTunnelUrl;
|
|
42
|
+
exports.isTunnelRunning = isTunnelRunning;
|
|
43
|
+
const axios_1 = __importDefault(require("axios"));
|
|
44
|
+
const ws_1 = __importDefault(require("ws"));
|
|
45
|
+
const http = __importStar(require("http"));
|
|
46
|
+
let tunnelWs = null;
|
|
47
|
+
let tunnelUrl = null;
|
|
48
|
+
let sessionId = null;
|
|
49
|
+
let gatewayUrl = null;
|
|
50
|
+
let localPort = null;
|
|
51
|
+
let heartbeatInterval = null;
|
|
52
|
+
let isReconnecting = false;
|
|
53
|
+
let reconnectAttempts = 0;
|
|
54
|
+
// Heartbeat configuration
|
|
55
|
+
const HEARTBEAT_INTERVAL_MS = 20 * 1000; // Send heartbeat every 20 seconds
|
|
56
|
+
const MAX_RECONNECT_ATTEMPTS = 100; // Max reconnect attempts (essentially unlimited for home use)
|
|
57
|
+
const MAX_RECONNECT_DELAY_MS = 60 * 1000; // Max 60 seconds between reconnect attempts
|
|
58
|
+
const MAX_PAYLOAD_SIZE = 64 * 1024 * 1024; // 64MB max message size for large file transfer
|
|
59
|
+
// Map to store pending HTTP requests
|
|
60
|
+
const pendingRequests = new Map();
|
|
61
|
+
// Single shared WebSocket connection to local server
|
|
62
|
+
let sharedLocalWs = null;
|
|
63
|
+
let sharedLocalWsReady = false;
|
|
64
|
+
/**
|
|
65
|
+
* Start Vortex tunnel
|
|
66
|
+
* Creates a session with the gateway and establishes WebSocket connection
|
|
67
|
+
*/
|
|
68
|
+
function startTunnel(port = 4020, gateway) {
|
|
69
|
+
return new Promise(async (resolve, reject) => {
|
|
70
|
+
try {
|
|
71
|
+
localPort = port;
|
|
72
|
+
gatewayUrl = gateway || process.env.VORTEX_GATEWAY || 'https://vortex.futuretech.social';
|
|
73
|
+
console.log(` [Vortex] Connecting to gateway: ${gatewayUrl}`);
|
|
74
|
+
// Step 1: Create session on gateway (v2 API)
|
|
75
|
+
const response = await axios_1.default.post(`${gatewayUrl}/api/session`, {
|
|
76
|
+
mode: 'http_proxy',
|
|
77
|
+
client_type: `LeverageAI-Agent/${process.platform}`
|
|
78
|
+
});
|
|
79
|
+
const { session_id, url, tunnel_url: sessionUrl, ws_url, expires_in } = response.data;
|
|
80
|
+
sessionId = session_id;
|
|
81
|
+
tunnelUrl = url;
|
|
82
|
+
console.log(` [Vortex] Session created: ${session_id.substring(0, 8)}...`);
|
|
83
|
+
console.log(` [Vortex] Session expires in: ${expires_in}s`);
|
|
84
|
+
// Step 2: Register tunnel with gateway
|
|
85
|
+
await axios_1.default.post(`${gatewayUrl}/api/tunnel/register`, {
|
|
86
|
+
session_id: session_id,
|
|
87
|
+
});
|
|
88
|
+
// Step 3: Connect WebSocket to gateway
|
|
89
|
+
const wsUrl = gatewayUrl.replace('https://', 'wss://').replace('http://', 'ws://') + `/tunnel/${session_id}`;
|
|
90
|
+
console.log(` [Vortex] Establishing WebSocket tunnel...`);
|
|
91
|
+
tunnelWs = new ws_1.default(wsUrl, {
|
|
92
|
+
maxPayload: MAX_PAYLOAD_SIZE
|
|
93
|
+
});
|
|
94
|
+
tunnelWs.on('open', () => {
|
|
95
|
+
console.log(` [Vortex] Tunnel connected`);
|
|
96
|
+
startHeartbeat();
|
|
97
|
+
// Create shared local WebSocket connection
|
|
98
|
+
createSharedLocalConnection();
|
|
99
|
+
resolve(tunnelUrl);
|
|
100
|
+
});
|
|
101
|
+
tunnelWs.on('message', (data) => {
|
|
102
|
+
try {
|
|
103
|
+
const msg = JSON.parse(data.toString());
|
|
104
|
+
handleGatewayMessage(msg);
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
// Not JSON, might be binary data
|
|
108
|
+
console.error('[Vortex] Invalid message from gateway:', e);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
tunnelWs.on('close', () => {
|
|
112
|
+
console.log(' [Vortex] Tunnel disconnected');
|
|
113
|
+
stopHeartbeat();
|
|
114
|
+
tunnelWs = null;
|
|
115
|
+
// Auto reconnect instead of cleanup
|
|
116
|
+
if (!isReconnecting && sessionId && gatewayUrl) {
|
|
117
|
+
attemptTunnelReconnect();
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
tunnelWs.on('error', (err) => {
|
|
121
|
+
console.error(' [Vortex] Tunnel error:', err.message);
|
|
122
|
+
reject(err);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error(' [Vortex] Failed to start tunnel:', error.message);
|
|
127
|
+
if (error.response) {
|
|
128
|
+
console.error(' [Vortex] Response:', error.response.data);
|
|
129
|
+
}
|
|
130
|
+
reject(error);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Create shared WebSocket connection to local server
|
|
136
|
+
* This connection is reused for all browser clients
|
|
137
|
+
*/
|
|
138
|
+
function createSharedLocalConnection() {
|
|
139
|
+
if (!localPort)
|
|
140
|
+
return;
|
|
141
|
+
if (sharedLocalWs && sharedLocalWs.readyState === ws_1.default.OPEN) {
|
|
142
|
+
return; // Already connected
|
|
143
|
+
}
|
|
144
|
+
console.log(` [Vortex] Creating shared local WebSocket connection to port ${localPort}...`);
|
|
145
|
+
sharedLocalWs = new ws_1.default(`ws://localhost:${localPort}/ws`, {
|
|
146
|
+
maxPayload: MAX_PAYLOAD_SIZE
|
|
147
|
+
});
|
|
148
|
+
sharedLocalWs.on('open', () => {
|
|
149
|
+
console.log(` [Vortex] Shared local WebSocket connected`);
|
|
150
|
+
sharedLocalWsReady = true;
|
|
151
|
+
});
|
|
152
|
+
sharedLocalWs.on('message', (data) => {
|
|
153
|
+
// Forward data from local server to all browsers through gateway
|
|
154
|
+
if (tunnelWs && tunnelWs.readyState === ws_1.default.OPEN) {
|
|
155
|
+
// Local server sends JSON text, forward it directly
|
|
156
|
+
const dataStr = Buffer.isBuffer(data) ? data.toString() : data.toString();
|
|
157
|
+
tunnelWs.send(dataStr);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
sharedLocalWs.on('close', () => {
|
|
161
|
+
console.log(` [Vortex] Shared local WebSocket closed`);
|
|
162
|
+
sharedLocalWsReady = false;
|
|
163
|
+
sharedLocalWs = null;
|
|
164
|
+
// Exponential backoff reconnect
|
|
165
|
+
let retryCount = 0;
|
|
166
|
+
const maxRetries = 10;
|
|
167
|
+
const attemptReconnect = () => {
|
|
168
|
+
if (retryCount >= maxRetries) {
|
|
169
|
+
console.log(` [Vortex] Max local reconnect attempts reached`);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
retryCount++;
|
|
173
|
+
const delay = Math.min(Math.pow(2, retryCount) * 1000, 30000);
|
|
174
|
+
console.log(` [Vortex] Local reconnect attempt ${retryCount}/${maxRetries} in ${delay / 1000}s...`);
|
|
175
|
+
setTimeout(() => {
|
|
176
|
+
if (tunnelWs && tunnelWs.readyState === ws_1.default.OPEN) {
|
|
177
|
+
createSharedLocalConnection();
|
|
178
|
+
// Check if reconnect succeeded after a short delay
|
|
179
|
+
setTimeout(() => {
|
|
180
|
+
if (!sharedLocalWsReady && retryCount < maxRetries) {
|
|
181
|
+
attemptReconnect();
|
|
182
|
+
}
|
|
183
|
+
}, 2000);
|
|
184
|
+
}
|
|
185
|
+
}, delay);
|
|
186
|
+
};
|
|
187
|
+
attemptReconnect();
|
|
188
|
+
});
|
|
189
|
+
sharedLocalWs.on('error', (err) => {
|
|
190
|
+
console.error(` [Vortex] Shared local WebSocket error:`, err.message);
|
|
191
|
+
sharedLocalWsReady = false;
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
// Map of WebSocket connections (for backward compatibility)
|
|
195
|
+
const websocketConnections = new Map();
|
|
196
|
+
/**
|
|
197
|
+
* Handle messages from the gateway
|
|
198
|
+
*/
|
|
199
|
+
function handleGatewayMessage(msg) {
|
|
200
|
+
switch (msg.type) {
|
|
201
|
+
case 'http_request':
|
|
202
|
+
// Gateway forwarded an HTTP request from browser
|
|
203
|
+
handleHttpRequest(msg);
|
|
204
|
+
break;
|
|
205
|
+
case 'websocket_connect':
|
|
206
|
+
// New WebSocket connection from browser (legacy protocol)
|
|
207
|
+
handleWebSocketConnect(msg.conn_id);
|
|
208
|
+
break;
|
|
209
|
+
case 'websocket_message':
|
|
210
|
+
// WebSocket message from browser (legacy protocol)
|
|
211
|
+
handleWebSocketMessage(msg.conn_id, msg.data);
|
|
212
|
+
break;
|
|
213
|
+
case 'websocket_binary':
|
|
214
|
+
// WebSocket binary data from browser (legacy protocol)
|
|
215
|
+
handleWebSocketBinary(msg.conn_id, msg.data);
|
|
216
|
+
break;
|
|
217
|
+
case 'websocket_disconnect':
|
|
218
|
+
// WebSocket disconnection from browser (legacy protocol)
|
|
219
|
+
handleWebSocketDisconnect(msg.conn_id);
|
|
220
|
+
break;
|
|
221
|
+
case 'client_connected':
|
|
222
|
+
// New browser client connected (v2 protocol)
|
|
223
|
+
console.log(` [Vortex] Client connected`);
|
|
224
|
+
// Ensure shared local connection is ready
|
|
225
|
+
if (!sharedLocalWsReady) {
|
|
226
|
+
createSharedLocalConnection();
|
|
227
|
+
}
|
|
228
|
+
break;
|
|
229
|
+
case 'client_disconnected':
|
|
230
|
+
console.log(` [Vortex] Client disconnected`);
|
|
231
|
+
break;
|
|
232
|
+
case 'pong':
|
|
233
|
+
// Heartbeat response received, connection is alive
|
|
234
|
+
break;
|
|
235
|
+
default:
|
|
236
|
+
// Forward any other message to local server (v2 protocol - direct relay)
|
|
237
|
+
// This handles input, resize, ping, etc. from browser
|
|
238
|
+
if (sharedLocalWs && sharedLocalWs.readyState === ws_1.default.OPEN) {
|
|
239
|
+
sharedLocalWs.send(JSON.stringify(msg));
|
|
240
|
+
}
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Handle HTTP request forwarded from gateway
|
|
246
|
+
* Forward it to the local server and send response back
|
|
247
|
+
*/
|
|
248
|
+
async function handleHttpRequest(msg) {
|
|
249
|
+
const { request_id, method, path, headers, body } = msg;
|
|
250
|
+
if (!localPort) {
|
|
251
|
+
sendToGateway({
|
|
252
|
+
type: 'http_response',
|
|
253
|
+
request_id,
|
|
254
|
+
status: 503,
|
|
255
|
+
headers: { 'Content-Type': 'text/plain' },
|
|
256
|
+
body: 'Local server not configured'
|
|
257
|
+
});
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
try {
|
|
261
|
+
// Remove host header to avoid conflicts
|
|
262
|
+
const requestHeaders = { ...headers };
|
|
263
|
+
delete requestHeaders.host;
|
|
264
|
+
delete requestHeaders.Host;
|
|
265
|
+
// Make request to local server
|
|
266
|
+
const options = {
|
|
267
|
+
hostname: 'localhost',
|
|
268
|
+
port: localPort,
|
|
269
|
+
path: path,
|
|
270
|
+
method: method,
|
|
271
|
+
headers: requestHeaders
|
|
272
|
+
};
|
|
273
|
+
const localReq = http.request(options, (localRes) => {
|
|
274
|
+
const chunks = [];
|
|
275
|
+
localRes.on('data', (chunk) => {
|
|
276
|
+
chunks.push(chunk);
|
|
277
|
+
});
|
|
278
|
+
localRes.on('end', () => {
|
|
279
|
+
const responseBody = Buffer.concat(chunks);
|
|
280
|
+
// Send response back to gateway
|
|
281
|
+
sendToGateway({
|
|
282
|
+
type: 'http_response',
|
|
283
|
+
request_id,
|
|
284
|
+
status: localRes.statusCode || 200,
|
|
285
|
+
headers: localRes.headers,
|
|
286
|
+
body: responseBody.toString('base64'),
|
|
287
|
+
encoding: 'base64'
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
localReq.on('error', (err) => {
|
|
292
|
+
console.error('[Vortex] Local request error:', err.message);
|
|
293
|
+
sendToGateway({
|
|
294
|
+
type: 'http_response',
|
|
295
|
+
request_id,
|
|
296
|
+
status: 502,
|
|
297
|
+
headers: { 'Content-Type': 'text/plain' },
|
|
298
|
+
body: `Failed to connect to local server: ${err.message}`
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
// Send request body if present
|
|
302
|
+
if (body) {
|
|
303
|
+
// Decode base64 body if encoded
|
|
304
|
+
const bodyBuffer = msg.encoding === 'base64' ? Buffer.from(body, 'base64') : body;
|
|
305
|
+
localReq.write(bodyBuffer);
|
|
306
|
+
}
|
|
307
|
+
localReq.end();
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
sendToGateway({
|
|
311
|
+
type: 'http_response',
|
|
312
|
+
request_id,
|
|
313
|
+
status: 500,
|
|
314
|
+
headers: { 'Content-Type': 'text/plain' },
|
|
315
|
+
body: `Internal error: ${error.message}`
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Handle new WebSocket connection (legacy protocol)
|
|
321
|
+
*/
|
|
322
|
+
function handleWebSocketConnect(connId) {
|
|
323
|
+
if (!localPort) {
|
|
324
|
+
sendToGateway({
|
|
325
|
+
type: 'websocket_close',
|
|
326
|
+
conn_id: connId
|
|
327
|
+
});
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
// Create WebSocket connection to local server
|
|
331
|
+
const localWs = new ws_1.default(`ws://localhost:${localPort}/ws`, {
|
|
332
|
+
maxPayload: MAX_PAYLOAD_SIZE
|
|
333
|
+
});
|
|
334
|
+
localWs.on('open', () => {
|
|
335
|
+
console.log(`[Vortex] Local WebSocket connected for ${connId.substring(0, 8)}...`);
|
|
336
|
+
websocketConnections.set(connId, localWs);
|
|
337
|
+
});
|
|
338
|
+
localWs.on('message', (data) => {
|
|
339
|
+
// Forward data from local server to browser through gateway
|
|
340
|
+
// Local server sends JSON text, we need to preserve it
|
|
341
|
+
if (Buffer.isBuffer(data)) {
|
|
342
|
+
sendToGateway({
|
|
343
|
+
type: 'websocket_data',
|
|
344
|
+
conn_id: connId,
|
|
345
|
+
data: data.toString('base64'),
|
|
346
|
+
binary: true
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
// data is already a string (JSON), send it as-is
|
|
351
|
+
sendToGateway({
|
|
352
|
+
type: 'websocket_data',
|
|
353
|
+
conn_id: connId,
|
|
354
|
+
data: data.toString(),
|
|
355
|
+
binary: false
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
localWs.on('close', () => {
|
|
360
|
+
console.log(`[Vortex] Local WebSocket closed for ${connId.substring(0, 8)}...`);
|
|
361
|
+
websocketConnections.delete(connId);
|
|
362
|
+
sendToGateway({
|
|
363
|
+
type: 'websocket_close',
|
|
364
|
+
conn_id: connId
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
localWs.on('error', (err) => {
|
|
368
|
+
console.error(`[Vortex] Local WebSocket error for ${connId.substring(0, 8)}...`, err.message);
|
|
369
|
+
websocketConnections.delete(connId);
|
|
370
|
+
sendToGateway({
|
|
371
|
+
type: 'websocket_close',
|
|
372
|
+
conn_id: connId
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Handle WebSocket message from browser (legacy protocol)
|
|
378
|
+
*/
|
|
379
|
+
function handleWebSocketMessage(connId, data) {
|
|
380
|
+
const localWs = websocketConnections.get(connId);
|
|
381
|
+
if (localWs && localWs.readyState === ws_1.default.OPEN) {
|
|
382
|
+
localWs.send(data);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Handle WebSocket binary data from browser (legacy protocol)
|
|
387
|
+
*/
|
|
388
|
+
function handleWebSocketBinary(connId, data) {
|
|
389
|
+
const localWs = websocketConnections.get(connId);
|
|
390
|
+
if (localWs && localWs.readyState === ws_1.default.OPEN) {
|
|
391
|
+
// Decode base64 and send as binary
|
|
392
|
+
const buffer = Buffer.from(data, 'base64');
|
|
393
|
+
localWs.send(buffer);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Handle WebSocket disconnection from browser (legacy protocol)
|
|
398
|
+
*/
|
|
399
|
+
function handleWebSocketDisconnect(connId) {
|
|
400
|
+
const localWs = websocketConnections.get(connId);
|
|
401
|
+
if (localWs) {
|
|
402
|
+
localWs.close();
|
|
403
|
+
websocketConnections.delete(connId);
|
|
404
|
+
console.log(`[Vortex] WebSocket disconnected for ${connId.substring(0, 8)}...`);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Send message to gateway
|
|
409
|
+
*/
|
|
410
|
+
function sendToGateway(msg) {
|
|
411
|
+
if (tunnelWs && tunnelWs.readyState === ws_1.default.OPEN) {
|
|
412
|
+
tunnelWs.send(JSON.stringify(msg));
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Start heartbeat to keep connection alive
|
|
417
|
+
* Sends ping every 30 seconds to prevent 5-minute timeout
|
|
418
|
+
*/
|
|
419
|
+
function startHeartbeat() {
|
|
420
|
+
stopHeartbeat(); // Clear any existing heartbeat
|
|
421
|
+
heartbeatInterval = setInterval(() => {
|
|
422
|
+
if (tunnelWs && tunnelWs.readyState === ws_1.default.OPEN) {
|
|
423
|
+
sendToGateway({ type: 'ping', timestamp: Date.now() });
|
|
424
|
+
}
|
|
425
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
426
|
+
console.log(` [Vortex] Heartbeat started (interval: ${HEARTBEAT_INTERVAL_MS / 1000}s)`);
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Stop heartbeat timer
|
|
430
|
+
*/
|
|
431
|
+
function stopHeartbeat() {
|
|
432
|
+
if (heartbeatInterval) {
|
|
433
|
+
clearInterval(heartbeatInterval);
|
|
434
|
+
heartbeatInterval = null;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Attempt to reconnect tunnel with exponential backoff
|
|
439
|
+
* Keeps the same session ID so iOS doesn't need to re-scan QR code
|
|
440
|
+
*/
|
|
441
|
+
async function attemptTunnelReconnect() {
|
|
442
|
+
if (isReconnecting) {
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
isReconnecting = true;
|
|
446
|
+
while (reconnectAttempts < MAX_RECONNECT_ATTEMPTS) {
|
|
447
|
+
reconnectAttempts++;
|
|
448
|
+
const delay = Math.min(Math.pow(2, reconnectAttempts) * 1000, MAX_RECONNECT_DELAY_MS);
|
|
449
|
+
console.log(` [Vortex] Tunnel reconnect attempt ${reconnectAttempts}/${MAX_RECONNECT_ATTEMPTS} in ${delay / 1000}s...`);
|
|
450
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
451
|
+
try {
|
|
452
|
+
await reconnectTunnel();
|
|
453
|
+
console.log(` [Vortex] Tunnel reconnected successfully!`);
|
|
454
|
+
reconnectAttempts = 0;
|
|
455
|
+
isReconnecting = false;
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
catch (error) {
|
|
459
|
+
console.error(` [Vortex] Reconnect failed: ${error.message}`);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
console.log(` [Vortex] Max reconnect attempts reached, giving up`);
|
|
463
|
+
isReconnecting = false;
|
|
464
|
+
cleanup();
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Reconnect tunnel using existing session ID
|
|
468
|
+
*/
|
|
469
|
+
async function reconnectTunnel() {
|
|
470
|
+
if (!sessionId || !gatewayUrl || !localPort) {
|
|
471
|
+
throw new Error('Missing session info for reconnect');
|
|
472
|
+
}
|
|
473
|
+
// Re-register tunnel with gateway (session should still exist)
|
|
474
|
+
try {
|
|
475
|
+
await axios_1.default.post(`${gatewayUrl}/api/tunnel/register`, {
|
|
476
|
+
session_id: sessionId,
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
catch (e) {
|
|
480
|
+
// If session expired, we need to create a new one
|
|
481
|
+
if (e.response?.status === 404) {
|
|
482
|
+
console.log(` [Vortex] Session expired, creating new session...`);
|
|
483
|
+
// Create new session
|
|
484
|
+
const response = await axios_1.default.post(`${gatewayUrl}/api/session`, {
|
|
485
|
+
mode: 'http_proxy',
|
|
486
|
+
client_type: `LeverageAI-Agent/${process.platform}`
|
|
487
|
+
});
|
|
488
|
+
const { session_id, url } = response.data;
|
|
489
|
+
sessionId = session_id;
|
|
490
|
+
tunnelUrl = url;
|
|
491
|
+
console.log(` [Vortex] New session created: ${session_id.substring(0, 8)}...`);
|
|
492
|
+
console.log(` [Vortex] ⚠️ New URL - need to re-scan QR code: ${url}`);
|
|
493
|
+
// Register new tunnel
|
|
494
|
+
await axios_1.default.post(`${gatewayUrl}/api/tunnel/register`, {
|
|
495
|
+
session_id: session_id,
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
else {
|
|
499
|
+
throw e;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
// Connect WebSocket to gateway
|
|
503
|
+
const wsUrl = gatewayUrl.replace('https://', 'wss://').replace('http://', 'ws://') + `/tunnel/${sessionId}`;
|
|
504
|
+
return new Promise((resolve, reject) => {
|
|
505
|
+
tunnelWs = new ws_1.default(wsUrl, {
|
|
506
|
+
maxPayload: MAX_PAYLOAD_SIZE
|
|
507
|
+
});
|
|
508
|
+
tunnelWs.on('open', () => {
|
|
509
|
+
console.log(` [Vortex] Tunnel reconnected`);
|
|
510
|
+
startHeartbeat();
|
|
511
|
+
// Recreate shared local connection
|
|
512
|
+
createSharedLocalConnection();
|
|
513
|
+
resolve();
|
|
514
|
+
});
|
|
515
|
+
tunnelWs.on('message', (data) => {
|
|
516
|
+
try {
|
|
517
|
+
const msg = JSON.parse(data.toString());
|
|
518
|
+
handleGatewayMessage(msg);
|
|
519
|
+
}
|
|
520
|
+
catch (e) {
|
|
521
|
+
console.error('[Vortex] Invalid message from gateway:', e);
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
tunnelWs.on('close', () => {
|
|
525
|
+
console.log(' [Vortex] Tunnel disconnected');
|
|
526
|
+
stopHeartbeat();
|
|
527
|
+
tunnelWs = null;
|
|
528
|
+
// Auto reconnect again
|
|
529
|
+
if (!isReconnecting && sessionId && gatewayUrl) {
|
|
530
|
+
attemptTunnelReconnect();
|
|
531
|
+
}
|
|
532
|
+
});
|
|
533
|
+
tunnelWs.on('error', (err) => {
|
|
534
|
+
console.error(' [Vortex] Tunnel error:', err.message);
|
|
535
|
+
reject(err);
|
|
536
|
+
});
|
|
537
|
+
// Timeout for connection
|
|
538
|
+
setTimeout(() => {
|
|
539
|
+
if (tunnelWs && tunnelWs.readyState !== ws_1.default.OPEN) {
|
|
540
|
+
tunnelWs.close();
|
|
541
|
+
reject(new Error('Connection timeout'));
|
|
542
|
+
}
|
|
543
|
+
}, 10000);
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
/**
|
|
547
|
+
* Clean up resources
|
|
548
|
+
*/
|
|
549
|
+
function cleanup() {
|
|
550
|
+
// Clear any pending requests
|
|
551
|
+
pendingRequests.forEach(({ reject, timeout }) => {
|
|
552
|
+
clearTimeout(timeout);
|
|
553
|
+
reject(new Error('Tunnel closed'));
|
|
554
|
+
});
|
|
555
|
+
pendingRequests.clear();
|
|
556
|
+
// Close shared local WebSocket
|
|
557
|
+
if (sharedLocalWs) {
|
|
558
|
+
sharedLocalWs.close();
|
|
559
|
+
sharedLocalWs = null;
|
|
560
|
+
sharedLocalWsReady = false;
|
|
561
|
+
}
|
|
562
|
+
// Close all WebSocket connections (legacy)
|
|
563
|
+
websocketConnections.forEach(ws => {
|
|
564
|
+
ws.close();
|
|
565
|
+
});
|
|
566
|
+
websocketConnections.clear();
|
|
567
|
+
}
|
|
568
|
+
function stopTunnel() {
|
|
569
|
+
// Set reconnecting to true to prevent auto-reconnect on manual stop
|
|
570
|
+
isReconnecting = true;
|
|
571
|
+
stopHeartbeat();
|
|
572
|
+
if (tunnelWs) {
|
|
573
|
+
tunnelWs.close();
|
|
574
|
+
tunnelWs = null;
|
|
575
|
+
}
|
|
576
|
+
cleanup();
|
|
577
|
+
tunnelUrl = null;
|
|
578
|
+
sessionId = null;
|
|
579
|
+
gatewayUrl = null;
|
|
580
|
+
isReconnecting = false;
|
|
581
|
+
reconnectAttempts = 0;
|
|
582
|
+
}
|
|
583
|
+
function getTunnelUrl() {
|
|
584
|
+
return tunnelUrl;
|
|
585
|
+
}
|
|
586
|
+
function isTunnelRunning() {
|
|
587
|
+
return tunnelWs !== null && tunnelWs.readyState === ws_1.default.OPEN;
|
|
588
|
+
}
|
|
589
|
+
//# sourceMappingURL=vortex-tunnel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vortex-tunnel.js","sourceRoot":"","sources":["../src/vortex-tunnel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-server.d.ts","sourceRoot":"","sources":["../src/web-server.ts"],"names":[],"mappings":"AA+QA,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAiKD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgtDxG;AAED,wBAAgB,aAAa,IAAI,IAAI,CAepC"}
|