@leverageaiapps/gogogo 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +167 -0
- package/dist/cloudflare-tunnel.d.ts +9 -0
- package/dist/cloudflare-tunnel.d.ts.map +1 -0
- package/dist/cloudflare-tunnel.js +209 -0
- package/dist/cloudflare-tunnel.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/pty.d.ts +22 -0
- package/dist/pty.d.ts.map +1 -0
- package/dist/pty.js +172 -0
- package/dist/pty.js.map +1 -0
- package/dist/session.d.ts +2 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +246 -0
- package/dist/session.js.map +1 -0
- package/dist/web-server.d.ts +3 -0
- package/dist/web-server.d.ts.map +1 -0
- package/dist/web-server.js +447 -0
- package/dist/web-server.js.map +1 -0
- package/package.json +67 -0
- package/public/index.html +509 -0
- package/public/js/terminal.js +729 -0
- package/scripts/postinstall.js +66 -0
- package/scripts/verify-install.js +124 -0
|
@@ -0,0 +1,447 @@
|
|
|
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.startWebServer = startWebServer;
|
|
40
|
+
exports.stopWebServer = stopWebServer;
|
|
41
|
+
const express_1 = __importDefault(require("express"));
|
|
42
|
+
const cookie_parser_1 = __importDefault(require("cookie-parser"));
|
|
43
|
+
const http_1 = require("http");
|
|
44
|
+
const ws_1 = require("ws");
|
|
45
|
+
const crypto = __importStar(require("crypto"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
const os = __importStar(require("os"));
|
|
49
|
+
const pty_1 = require("./pty");
|
|
50
|
+
let httpServer = null;
|
|
51
|
+
let wss = null;
|
|
52
|
+
let connectedClients = new Map();
|
|
53
|
+
// Token authentication state
|
|
54
|
+
let serverToken = '';
|
|
55
|
+
// Temp directory for uploaded images
|
|
56
|
+
let tempDir = null;
|
|
57
|
+
function getTempDir() {
|
|
58
|
+
if (!tempDir) {
|
|
59
|
+
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gogogo-img-'));
|
|
60
|
+
}
|
|
61
|
+
return tempDir;
|
|
62
|
+
}
|
|
63
|
+
let outputBuffer = [];
|
|
64
|
+
let nextSeq = 1;
|
|
65
|
+
const MAX_BUFFER_SIZE = 5000;
|
|
66
|
+
const BUFFER_TRIM_SIZE = 3000;
|
|
67
|
+
const MAX_IMAGE_SIZE = 5 * 1024 * 1024; // 5 MB
|
|
68
|
+
const MAX_WS_PAYLOAD = 6 * 1024 * 1024; // 6 MiB (just above image limit)
|
|
69
|
+
const COOKIE_MAX_AGE = 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
70
|
+
const CONTEXT_API_ENTRIES = 50;
|
|
71
|
+
// Regex to detect clear-screen escape sequences
|
|
72
|
+
const CLEAR_SCREEN_RE = /\x1b\[[23]J|\x1bc/;
|
|
73
|
+
// WebSocket heartbeat interval
|
|
74
|
+
const WS_PING_INTERVAL = 30000;
|
|
75
|
+
let pingInterval = null;
|
|
76
|
+
// WebSocket limits
|
|
77
|
+
const MAX_CONNECTIONS = 10;
|
|
78
|
+
const MSG_RATE_WINDOW_MS = 1000;
|
|
79
|
+
const MSG_RATE_LIMIT = 100; // max messages per window
|
|
80
|
+
// Generate unique client ID
|
|
81
|
+
let clientIdCounter = 0;
|
|
82
|
+
function generateClientId() {
|
|
83
|
+
return `client-${Date.now()}-${++clientIdCounter}`;
|
|
84
|
+
}
|
|
85
|
+
// Calculate minimum size across all connected clients and local terminal
|
|
86
|
+
function calculateMinSize() {
|
|
87
|
+
const local = (0, pty_1.getLocalSize)();
|
|
88
|
+
let minCols = local.cols;
|
|
89
|
+
let minRows = local.rows;
|
|
90
|
+
// Find minimum dimensions across all connected clients
|
|
91
|
+
connectedClients.forEach((clientInfo) => {
|
|
92
|
+
if (clientInfo.cols > 0 && clientInfo.rows > 0) {
|
|
93
|
+
minCols = Math.min(minCols, clientInfo.cols);
|
|
94
|
+
minRows = Math.min(minRows, clientInfo.rows);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
return { cols: minCols, rows: minRows };
|
|
98
|
+
}
|
|
99
|
+
// Apply minimum size to PTY
|
|
100
|
+
function applyMinSize() {
|
|
101
|
+
if (connectedClients.size === 0) {
|
|
102
|
+
// No web clients, use local size
|
|
103
|
+
const local = (0, pty_1.getLocalSize)();
|
|
104
|
+
(0, pty_1.resizePTY)(local.cols, local.rows);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const { cols, rows } = calculateMinSize();
|
|
108
|
+
if (cols > 0 && rows > 0) {
|
|
109
|
+
(0, pty_1.resizePTY)(cols, rows);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function safeEqual(a, b) {
|
|
113
|
+
// Pad both to same length to avoid leaking length via timing
|
|
114
|
+
const maxLen = Math.max(a.length, b.length, 1);
|
|
115
|
+
const aBuf = Buffer.alloc(maxLen);
|
|
116
|
+
const bBuf = Buffer.alloc(maxLen);
|
|
117
|
+
aBuf.write(a);
|
|
118
|
+
bBuf.write(b);
|
|
119
|
+
const match = crypto.timingSafeEqual(aBuf, bBuf);
|
|
120
|
+
return match && a.length === b.length;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check if user is authenticated via cookie
|
|
124
|
+
*/
|
|
125
|
+
function isAuthenticated(req) {
|
|
126
|
+
return req.cookies && req.cookies.auth && safeEqual(req.cookies.auth, serverToken);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Detect if connection is over HTTPS (direct or via proxy)
|
|
130
|
+
*/
|
|
131
|
+
function isSecure(req) {
|
|
132
|
+
return req.protocol === 'https' || req.get('x-forwarded-proto') === 'https';
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Token authentication middleware
|
|
136
|
+
* 1. ?token= query param match → set cookie + 302 redirect to clean URL
|
|
137
|
+
* 2. Cookie valid → pass through
|
|
138
|
+
* 3. Otherwise → 403
|
|
139
|
+
*/
|
|
140
|
+
function requireAuth(req, res, next) {
|
|
141
|
+
// Check for token in query parameter (first visit from QR code)
|
|
142
|
+
const queryToken = req.query.token;
|
|
143
|
+
if (queryToken && safeEqual(queryToken, serverToken)) {
|
|
144
|
+
// Set auth cookie and redirect to clean URL (without token)
|
|
145
|
+
res.cookie('auth', serverToken, {
|
|
146
|
+
httpOnly: true,
|
|
147
|
+
secure: isSecure(req),
|
|
148
|
+
maxAge: COOKIE_MAX_AGE,
|
|
149
|
+
sameSite: 'lax'
|
|
150
|
+
});
|
|
151
|
+
// Build redirect URL without the token parameter
|
|
152
|
+
const url = new URL(req.originalUrl, `${req.protocol}://${req.get('host')}`);
|
|
153
|
+
url.searchParams.delete('token');
|
|
154
|
+
const cleanPath = url.pathname + url.search;
|
|
155
|
+
res.redirect(302, cleanPath);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
// Check if authenticated via cookie
|
|
159
|
+
if (isAuthenticated(req)) {
|
|
160
|
+
next();
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
// Not authenticated
|
|
164
|
+
res.status(403).send('Forbidden');
|
|
165
|
+
}
|
|
166
|
+
function startWebServer(port, token) {
|
|
167
|
+
return new Promise((resolve, reject) => {
|
|
168
|
+
// Set the server token
|
|
169
|
+
serverToken = token;
|
|
170
|
+
// Register local terminal resize callback (inside startWebServer, not at module level)
|
|
171
|
+
(0, pty_1.onLocalTerminalResize)(() => applyMinSize());
|
|
172
|
+
const app = (0, express_1.default)();
|
|
173
|
+
// Trust exactly 1 proxy hop (Cloudflare Tunnel)
|
|
174
|
+
app.set('trust proxy', 1);
|
|
175
|
+
app.use((0, cookie_parser_1.default)());
|
|
176
|
+
app.use(express_1.default.json({ limit: '100kb' }));
|
|
177
|
+
// Security headers
|
|
178
|
+
app.use((req, res, next) => {
|
|
179
|
+
res.setHeader('X-Content-Type-Options', 'nosniff');
|
|
180
|
+
res.setHeader('X-Frame-Options', 'DENY');
|
|
181
|
+
res.setHeader('Referrer-Policy', 'no-referrer');
|
|
182
|
+
res.setHeader('Content-Security-Policy', "default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; connect-src 'self' wss:; img-src 'self' data:");
|
|
183
|
+
if (isSecure(req)) {
|
|
184
|
+
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
|
|
185
|
+
}
|
|
186
|
+
res.setHeader('Permissions-Policy', 'camera=(), geolocation=(), payment=()');
|
|
187
|
+
next();
|
|
188
|
+
});
|
|
189
|
+
// Health check (no auth required)
|
|
190
|
+
app.get('/api/health', (_req, res) => {
|
|
191
|
+
res.json({ status: 'ok', timestamp: Date.now() });
|
|
192
|
+
});
|
|
193
|
+
// Apply authentication middleware (always enabled)
|
|
194
|
+
app.use(requireAuth);
|
|
195
|
+
app.get('/api/terminal-context', (_req, res) => {
|
|
196
|
+
res.json({
|
|
197
|
+
recentOutput: outputBuffer.slice(-CONTEXT_API_ENTRIES).map(e => e.data),
|
|
198
|
+
bufferLength: outputBuffer.length,
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
// Serve static files from public directory
|
|
202
|
+
const publicDir = path.join(__dirname, '..', 'public');
|
|
203
|
+
if (fs.existsSync(publicDir)) {
|
|
204
|
+
app.use(express_1.default.static(publicDir));
|
|
205
|
+
}
|
|
206
|
+
// Fallback for SPA routing - use regex pattern for Express 5 compatibility
|
|
207
|
+
app.use((req, res, next) => {
|
|
208
|
+
// Skip API routes and WebSocket
|
|
209
|
+
if (req.path.startsWith('/api') || req.path === '/ws') {
|
|
210
|
+
return next();
|
|
211
|
+
}
|
|
212
|
+
// Skip static asset requests (favicon, images, etc.)
|
|
213
|
+
const staticExtensions = ['.ico', '.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.css', '.js', '.map', '.woff', '.woff2', '.ttf', '.eot'];
|
|
214
|
+
if (staticExtensions.some(ext => req.path.endsWith(ext))) {
|
|
215
|
+
return res.status(404).end();
|
|
216
|
+
}
|
|
217
|
+
// Only serve index.html for HTML requests (browser navigation)
|
|
218
|
+
const acceptHeader = req.get('Accept') || '';
|
|
219
|
+
if (!acceptHeader.includes('text/html')) {
|
|
220
|
+
return res.status(404).end();
|
|
221
|
+
}
|
|
222
|
+
const indexPath = path.join(publicDir, 'index.html');
|
|
223
|
+
if (fs.existsSync(indexPath)) {
|
|
224
|
+
res.sendFile(indexPath);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
res.status(500).send('Static files not found. Try reinstalling with: npm install -g @leverageaiapps/gogogo');
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
httpServer = (0, http_1.createServer)(app);
|
|
231
|
+
// WebSocket server - verify authentication on upgrade
|
|
232
|
+
wss = new ws_1.WebSocketServer({
|
|
233
|
+
server: httpServer,
|
|
234
|
+
path: '/ws',
|
|
235
|
+
maxPayload: MAX_WS_PAYLOAD,
|
|
236
|
+
verifyClient: (info, callback) => {
|
|
237
|
+
// Verify Origin matches the server host
|
|
238
|
+
const origin = info.origin || info.req.headers.origin || '';
|
|
239
|
+
const host = info.req.headers.host || '';
|
|
240
|
+
if (origin) {
|
|
241
|
+
try {
|
|
242
|
+
if (new URL(origin).host !== host) {
|
|
243
|
+
callback(false, 403, 'Origin mismatch');
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
callback(false, 403, 'Invalid origin');
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
const cookieHeader = info.req.headers.cookie || '';
|
|
253
|
+
const match = cookieHeader.split(';').map(c => c.trim()).find(c => c.startsWith('auth='));
|
|
254
|
+
if (match && safeEqual(match.substring(5), serverToken)) {
|
|
255
|
+
callback(true);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
callback(false, 403, 'Forbidden');
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
// Heartbeat: ping all clients every 30s to keep Cloudflare tunnel alive
|
|
262
|
+
pingInterval = setInterval(() => {
|
|
263
|
+
if (wss) {
|
|
264
|
+
wss.clients.forEach((client) => {
|
|
265
|
+
if (client.readyState === ws_1.WebSocket.OPEN) {
|
|
266
|
+
client.ping();
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}, WS_PING_INTERVAL);
|
|
271
|
+
wss.on('connection', (ws) => {
|
|
272
|
+
// Enforce connection limit
|
|
273
|
+
if (connectedClients.size >= MAX_CONNECTIONS) {
|
|
274
|
+
ws.close(1013, 'Too many connections');
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
const clientId = generateClientId();
|
|
278
|
+
const clientInfo = { cols: 80, rows: 24, id: clientId, synced: false };
|
|
279
|
+
connectedClients.set(ws, clientInfo);
|
|
280
|
+
// Rate limiting state per connection
|
|
281
|
+
let msgCount = 0;
|
|
282
|
+
let msgWindowStart = Date.now();
|
|
283
|
+
ws.on('message', async (data) => {
|
|
284
|
+
// Rate limit check
|
|
285
|
+
const now = Date.now();
|
|
286
|
+
if (now - msgWindowStart > MSG_RATE_WINDOW_MS) {
|
|
287
|
+
msgCount = 0;
|
|
288
|
+
msgWindowStart = now;
|
|
289
|
+
}
|
|
290
|
+
if (++msgCount > MSG_RATE_LIMIT) {
|
|
291
|
+
return; // silently drop messages over limit
|
|
292
|
+
}
|
|
293
|
+
try {
|
|
294
|
+
const msg = JSON.parse(data.toString());
|
|
295
|
+
// Sync handshake: client sends lastSeq on connect
|
|
296
|
+
if (msg.type === 'sync' && !clientInfo.synced) {
|
|
297
|
+
clientInfo.synced = true;
|
|
298
|
+
const lastSeq = typeof msg.lastSeq === 'number' ? msg.lastSeq : 0;
|
|
299
|
+
if (outputBuffer.length === 0) {
|
|
300
|
+
// Nothing to send
|
|
301
|
+
}
|
|
302
|
+
else if (lastSeq > 0 && lastSeq >= outputBuffer[0].seq) {
|
|
303
|
+
// Client has partial history — send only the delta
|
|
304
|
+
const delta = outputBuffer.filter(e => e.seq > lastSeq);
|
|
305
|
+
if (delta.length > 0) {
|
|
306
|
+
ws.send(JSON.stringify({
|
|
307
|
+
type: 'history-delta',
|
|
308
|
+
data: delta.map(e => e.data),
|
|
309
|
+
lastSeq: delta[delta.length - 1].seq
|
|
310
|
+
}));
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
// First connect or lastSeq too old — send full history
|
|
315
|
+
ws.send(JSON.stringify({
|
|
316
|
+
type: 'history',
|
|
317
|
+
data: outputBuffer.map(e => e.data),
|
|
318
|
+
lastSeq: outputBuffer[outputBuffer.length - 1].seq
|
|
319
|
+
}));
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
if (msg.type === 'input' && typeof msg.data === 'string') {
|
|
323
|
+
(0, pty_1.writeToPTY)(msg.data);
|
|
324
|
+
}
|
|
325
|
+
if (msg.type === 'resize') {
|
|
326
|
+
const cols = Number(msg.cols);
|
|
327
|
+
const rows = Number(msg.rows);
|
|
328
|
+
if (Number.isInteger(cols) && Number.isInteger(rows) &&
|
|
329
|
+
cols > 0 && cols <= 500 && rows > 0 && rows <= 200) {
|
|
330
|
+
clientInfo.cols = cols;
|
|
331
|
+
clientInfo.rows = rows;
|
|
332
|
+
applyMinSize();
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
if (msg.type === 'image_upload' && typeof msg.data === 'string') {
|
|
336
|
+
try {
|
|
337
|
+
const buf = Buffer.from(msg.data, 'base64');
|
|
338
|
+
if (buf.length > MAX_IMAGE_SIZE) {
|
|
339
|
+
ws.send(JSON.stringify({ type: 'image_uploaded', error: 'Image too large (max 5MB)' }));
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
// Sanitize filename: allow only alphanumeric, dash, underscore, dot
|
|
343
|
+
const rawName = (msg.filename || 'clipboard.png').replace(/[^a-zA-Z0-9._-]/g, '_');
|
|
344
|
+
const allowedExts = ['.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.bmp'];
|
|
345
|
+
const ext = path.extname(rawName).toLowerCase() || '.png';
|
|
346
|
+
if (!allowedExts.includes(ext)) {
|
|
347
|
+
ws.send(JSON.stringify({ type: 'image_uploaded', error: 'Unsupported image format' }));
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
const baseName = path.basename(rawName, ext).slice(0, 50);
|
|
351
|
+
const fileName = `${Date.now()}-${baseName}${ext}`;
|
|
352
|
+
const filePath = path.join(getTempDir(), fileName);
|
|
353
|
+
fs.writeFileSync(filePath, buf, { mode: 0o600 });
|
|
354
|
+
ws.send(JSON.stringify({ type: 'image_uploaded', path: filePath }));
|
|
355
|
+
}
|
|
356
|
+
catch (imgErr) {
|
|
357
|
+
ws.send(JSON.stringify({ type: 'image_uploaded', error: 'Upload failed' }));
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
catch (e) {
|
|
362
|
+
console.error(' [WebServer] Invalid message:', e);
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
ws.on('error', (_err) => {
|
|
366
|
+
// Prevent uncaught error from crashing the process
|
|
367
|
+
connectedClients.delete(ws);
|
|
368
|
+
});
|
|
369
|
+
ws.on('close', () => {
|
|
370
|
+
connectedClients.delete(ws);
|
|
371
|
+
// Recalculate minimum size after client disconnection
|
|
372
|
+
applyMinSize();
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
// Forward PTY output to all clients
|
|
376
|
+
(0, pty_1.onPTYData)((data) => {
|
|
377
|
+
const seq = nextSeq++;
|
|
378
|
+
outputBuffer.push({ seq, data });
|
|
379
|
+
// Truncate buffer at the last clear-screen sequence
|
|
380
|
+
if (CLEAR_SCREEN_RE.test(data)) {
|
|
381
|
+
const matches = [...data.matchAll(/\x1b\[[23]J|\x1bc/g)];
|
|
382
|
+
const last = matches[matches.length - 1];
|
|
383
|
+
const after = data.slice(last.index + last[0].length);
|
|
384
|
+
outputBuffer = after ? [{ seq, data: after }] : [];
|
|
385
|
+
}
|
|
386
|
+
else if (outputBuffer.length > MAX_BUFFER_SIZE) {
|
|
387
|
+
outputBuffer = outputBuffer.slice(-BUFFER_TRIM_SIZE);
|
|
388
|
+
}
|
|
389
|
+
const msg = JSON.stringify({ type: 'output', seq, data });
|
|
390
|
+
connectedClients.forEach((_clientInfo, client) => {
|
|
391
|
+
if (client.readyState === ws_1.WebSocket.OPEN) {
|
|
392
|
+
client.send(msg);
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
});
|
|
396
|
+
// Notify clients on PTY exit
|
|
397
|
+
(0, pty_1.onPTYExit)((code) => {
|
|
398
|
+
const msg = JSON.stringify({ type: 'exit', code });
|
|
399
|
+
connectedClients.forEach((_clientInfo, client) => {
|
|
400
|
+
if (client.readyState === ws_1.WebSocket.OPEN) {
|
|
401
|
+
client.send(msg);
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
});
|
|
405
|
+
httpServer.listen(port, '0.0.0.0', () => {
|
|
406
|
+
// Add a small delay to ensure the server is fully ready
|
|
407
|
+
setTimeout(() => {
|
|
408
|
+
resolve();
|
|
409
|
+
}, 100);
|
|
410
|
+
});
|
|
411
|
+
httpServer.on('error', (err) => {
|
|
412
|
+
console.error(' Failed to start server:', err);
|
|
413
|
+
reject(err);
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
function stopWebServer() {
|
|
418
|
+
if (pingInterval) {
|
|
419
|
+
clearInterval(pingInterval);
|
|
420
|
+
pingInterval = null;
|
|
421
|
+
}
|
|
422
|
+
if (wss) {
|
|
423
|
+
wss.clients.forEach((client) => client.close());
|
|
424
|
+
wss.close();
|
|
425
|
+
wss = null;
|
|
426
|
+
}
|
|
427
|
+
if (httpServer) {
|
|
428
|
+
httpServer.close();
|
|
429
|
+
httpServer = null;
|
|
430
|
+
}
|
|
431
|
+
connectedClients.clear();
|
|
432
|
+
outputBuffer = [];
|
|
433
|
+
nextSeq = 1;
|
|
434
|
+
clientIdCounter = 0;
|
|
435
|
+
serverToken = '';
|
|
436
|
+
// Clear PTY callbacks registered by this module
|
|
437
|
+
(0, pty_1.clearCallbacks)();
|
|
438
|
+
// Clean up temp image directory
|
|
439
|
+
if (tempDir) {
|
|
440
|
+
try {
|
|
441
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
442
|
+
}
|
|
443
|
+
catch { }
|
|
444
|
+
tempDir = null;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
//# sourceMappingURL=web-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-server.js","sourceRoot":"","sources":["../src/web-server.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@leverageaiapps/gogogo",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "CLI tool to forward terminal sessions to your mobile device via Cloudflare Tunnel. Code anywhere from your pocket.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"gogogo": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/",
|
|
11
|
+
"public/",
|
|
12
|
+
"scripts/"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"dev": "ts-node src/index.ts",
|
|
17
|
+
"start": "node dist/index.js",
|
|
18
|
+
"test": "vitest run",
|
|
19
|
+
"postinstall": "node scripts/postinstall.js",
|
|
20
|
+
"verify": "node scripts/verify-install.js",
|
|
21
|
+
"prepublishOnly": "npm run build",
|
|
22
|
+
"global-install": "npm install && npm run build && npm link"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"terminal",
|
|
26
|
+
"mobile",
|
|
27
|
+
"cloudflare",
|
|
28
|
+
"tunnel",
|
|
29
|
+
"remote",
|
|
30
|
+
"pty",
|
|
31
|
+
"cli",
|
|
32
|
+
"claude-code",
|
|
33
|
+
"ai",
|
|
34
|
+
"coding"
|
|
35
|
+
],
|
|
36
|
+
"author": "LeverageAI Apps",
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"commander": "^12.1.0",
|
|
40
|
+
"cookie-parser": "^1.4.7",
|
|
41
|
+
"express": "^5.2.1",
|
|
42
|
+
"node-pty": "^1.1.0",
|
|
43
|
+
"qrcode-terminal": "^0.12.0",
|
|
44
|
+
"ws": "^8.19.0"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/cookie-parser": "^1.4.10",
|
|
48
|
+
"@types/express": "^5.0.6",
|
|
49
|
+
"@types/node": "^20.17.12",
|
|
50
|
+
"@types/qrcode-terminal": "^0.12.2",
|
|
51
|
+
"@types/ws": "^8.18.1",
|
|
52
|
+
"ts-node": "^10.9.2",
|
|
53
|
+
"typescript": "^5.7.2",
|
|
54
|
+
"vitest": "^3.0.0"
|
|
55
|
+
},
|
|
56
|
+
"engines": {
|
|
57
|
+
"node": ">=18.0.0"
|
|
58
|
+
},
|
|
59
|
+
"repository": {
|
|
60
|
+
"type": "git",
|
|
61
|
+
"url": "https://github.com/leverageaiapp/GoGoGo.git"
|
|
62
|
+
},
|
|
63
|
+
"bugs": {
|
|
64
|
+
"url": "https://github.com/leverageaiapp/GoGoGo/issues"
|
|
65
|
+
},
|
|
66
|
+
"homepage": "https://gogogo.locus.cool"
|
|
67
|
+
}
|