opencode-mobile 1.0.9 → 1.1.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/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/src/tunnel/cloudflare.d.ts +8 -0
- package/dist/src/tunnel/cloudflare.d.ts.map +1 -1
- package/dist/src/tunnel/cloudflare.js +74 -47
- package/dist/src/tunnel/cloudflare.js.map +1 -1
- package/dist/src/tunnel/index.d.ts +7 -1
- package/dist/src/tunnel/index.d.ts.map +1 -1
- package/dist/src/tunnel/index.js +88 -22
- package/dist/src/tunnel/index.js.map +1 -1
- package/dist/src/tunnel/localtunnel.d.ts +4 -0
- package/dist/src/tunnel/localtunnel.d.ts.map +1 -1
- package/dist/src/tunnel/localtunnel.js +28 -11
- package/dist/src/tunnel/localtunnel.js.map +1 -1
- package/dist/src/tunnel/ngrok.d.ts +12 -1
- package/dist/src/tunnel/ngrok.d.ts.map +1 -1
- package/dist/src/tunnel/ngrok.js +337 -19
- package/dist/src/tunnel/ngrok.js.map +1 -1
- package/dist/src/tunnel/qrcode.d.ts +6 -2
- package/dist/src/tunnel/qrcode.d.ts.map +1 -1
- package/dist/src/tunnel/qrcode.js +45 -8
- package/dist/src/tunnel/qrcode.js.map +1 -1
- package/dist/src/utils/index.d.ts +5 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +5 -0
- package/dist/src/utils/index.js.map +1 -0
- package/package.json +2 -3
- package/dist/tunnel-manager.d.ts +0 -30
- package/dist/tunnel-manager.d.ts.map +0 -1
- package/dist/tunnel-manager.js +0 -641
- package/dist/tunnel-manager.js.map +0 -1
package/dist/tunnel-manager.js
DELETED
|
@@ -1,641 +0,0 @@
|
|
|
1
|
-
import * as fs from "fs";
|
|
2
|
-
import { spawn } from "child_process";
|
|
3
|
-
import ngrok from "@ngrok/ngrok";
|
|
4
|
-
import localtunnel from "localtunnel";
|
|
5
|
-
import qrcode from "qrcode";
|
|
6
|
-
import qrcodeTerminal from "qrcode-terminal";
|
|
7
|
-
// Ngrok state
|
|
8
|
-
let ngrokInstance = null;
|
|
9
|
-
let currentTunnel = null;
|
|
10
|
-
// Localtunnel state
|
|
11
|
-
let localtunnelInstance = null;
|
|
12
|
-
// Cloudflare state
|
|
13
|
-
let cloudflareProcess = null;
|
|
14
|
-
let cloudflareUrl = null;
|
|
15
|
-
async function diagnoseNgrok() {
|
|
16
|
-
const diagnostics = {
|
|
17
|
-
installed: false,
|
|
18
|
-
authtokenConfigured: false,
|
|
19
|
-
authtokenValid: false,
|
|
20
|
-
existingTunnels: 0,
|
|
21
|
-
configPath: null,
|
|
22
|
-
error: null,
|
|
23
|
-
};
|
|
24
|
-
try {
|
|
25
|
-
const { promisify } = await import("util");
|
|
26
|
-
const execAsync = promisify((await import("child_process")).exec);
|
|
27
|
-
await execAsync("which ngrok");
|
|
28
|
-
diagnostics.installed = true;
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
diagnostics.error = "ngrok not installed";
|
|
32
|
-
return diagnostics;
|
|
33
|
-
}
|
|
34
|
-
const configPaths = [
|
|
35
|
-
`${process.env.HOME}/Library/Application Support/ngrok/ngrok.yml`,
|
|
36
|
-
`${process.env.HOME}/.config/ngrok/ngrok.yml`,
|
|
37
|
-
"/etc/ngrok/ngrok.yml",
|
|
38
|
-
];
|
|
39
|
-
for (const configPath of configPaths) {
|
|
40
|
-
try {
|
|
41
|
-
const { existsSync } = await import("fs");
|
|
42
|
-
if (existsSync(configPath)) {
|
|
43
|
-
diagnostics.configPath = configPath;
|
|
44
|
-
break;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
catch { }
|
|
48
|
-
}
|
|
49
|
-
if (!diagnostics.configPath) {
|
|
50
|
-
diagnostics.error = "No ngrok config found";
|
|
51
|
-
return diagnostics;
|
|
52
|
-
}
|
|
53
|
-
try {
|
|
54
|
-
const { readFileSync } = await import("fs");
|
|
55
|
-
const configContent = readFileSync(diagnostics.configPath, "utf-8");
|
|
56
|
-
// Check for v3 format first (current standard)
|
|
57
|
-
const v3Match = configContent.match(/agent:\s*\n\s*authtoken:\s*(.+)/);
|
|
58
|
-
// Fallback to v2 format (deprecated but still supported)
|
|
59
|
-
const v2Match = configContent.match(/authtoken:\s*(.+)/);
|
|
60
|
-
const authtoken = v3Match?.[1]?.trim() || v2Match?.[1]?.trim();
|
|
61
|
-
if (authtoken && authtoken.length > 10) {
|
|
62
|
-
diagnostics.authtokenConfigured = true;
|
|
63
|
-
// Validate authtoken by calling ngrok API
|
|
64
|
-
try {
|
|
65
|
-
const { promisify } = await import("util");
|
|
66
|
-
const execAsync = promisify((await import("child_process")).exec);
|
|
67
|
-
// Quick API check - timeout after 5 seconds
|
|
68
|
-
try {
|
|
69
|
-
const result = await execAsync(`curl -s --max-time 5 -H "Authorization: Bearer ${authtoken}" https://api.ngrok.com/tunnels 2>&1`);
|
|
70
|
-
const output = result.stdout + result.stderr;
|
|
71
|
-
// Only fail on clear auth errors
|
|
72
|
-
const hasAuthError = output.includes("ERR_NGROK_206") ||
|
|
73
|
-
output.includes("authentication") ||
|
|
74
|
-
output.includes("invalid_token") ||
|
|
75
|
-
output.includes("Unauthorized");
|
|
76
|
-
if (hasAuthError && output.length < 200) {
|
|
77
|
-
diagnostics.error = "Authtoken invalid or expired";
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
// Any other response means token is valid
|
|
81
|
-
diagnostics.authtokenValid = true;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
85
|
-
// If curl fails, proceed anyway - SDK might work
|
|
86
|
-
diagnostics.authtokenValid = true;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
catch (e) {
|
|
90
|
-
diagnostics.error = `Authtoken test failed: ${e.message}`;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
diagnostics.error = "No authtoken in config";
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
catch (e) {
|
|
98
|
-
diagnostics.error = `Failed to read config: ${e.message}`;
|
|
99
|
-
}
|
|
100
|
-
return diagnostics;
|
|
101
|
-
}
|
|
102
|
-
async function setupNgrokWithUserInput() {
|
|
103
|
-
console.log("\n[Setup] Ngrok configuration needed.");
|
|
104
|
-
console.log("[Setup] 1. Get authtoken from: https://dashboard.ngrok.com/get-started/your-authtoken");
|
|
105
|
-
console.log("[Setup] 2. Run: ngrok config add-authtoken YOUR_AUTHTOKEN");
|
|
106
|
-
console.log("");
|
|
107
|
-
const readline = await import("readline");
|
|
108
|
-
const rl = readline.createInterface({
|
|
109
|
-
input: process.stdin,
|
|
110
|
-
output: process.stdout,
|
|
111
|
-
});
|
|
112
|
-
return new Promise((resolve) => {
|
|
113
|
-
rl.question("[Setup] Paste your ngrok authtoken (or press Enter to skip): ", async (authtoken) => {
|
|
114
|
-
rl.close();
|
|
115
|
-
if (!authtoken || authtoken.trim().length < 10) {
|
|
116
|
-
console.log("[Setup] Skipping ngrok setup.");
|
|
117
|
-
resolve(null);
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
const token = authtoken.trim();
|
|
121
|
-
try {
|
|
122
|
-
const { promisify } = await import("util");
|
|
123
|
-
const execAsync = promisify((await import("child_process")).exec);
|
|
124
|
-
// Use ngrok config command which writes v3 format
|
|
125
|
-
await execAsync(`ngrok config add-authtoken ${token}`);
|
|
126
|
-
console.log("[Setup] Ngrok authtoken configured successfully! (v3 format)");
|
|
127
|
-
resolve(token);
|
|
128
|
-
}
|
|
129
|
-
catch (e) {
|
|
130
|
-
// If ngrok config command fails, write v3 format manually
|
|
131
|
-
console.log("[Setup] Ngrok config command failed, writing config manually...");
|
|
132
|
-
try {
|
|
133
|
-
const { writeFileSync, existsSync, mkdirSync } = await import("fs");
|
|
134
|
-
const configPath = `${process.env.HOME}/Library/Application Support/ngrok/ngrok.yml`;
|
|
135
|
-
const configDir = `${process.env.HOME}/Library/Application Support/ngrok`;
|
|
136
|
-
if (!existsSync(configDir)) {
|
|
137
|
-
mkdirSync(configDir, { recursive: true });
|
|
138
|
-
}
|
|
139
|
-
// Write v3 format
|
|
140
|
-
const v3Config = `version: "3"
|
|
141
|
-
|
|
142
|
-
agent:
|
|
143
|
-
authtoken: ${token}
|
|
144
|
-
`;
|
|
145
|
-
writeFileSync(configPath, v3Config);
|
|
146
|
-
console.log("[Setup] Ngrok config written successfully! (v3 format)");
|
|
147
|
-
resolve(token);
|
|
148
|
-
}
|
|
149
|
-
catch (writeError) {
|
|
150
|
-
console.error(`[Setup] Failed to write config: ${writeError.message}`);
|
|
151
|
-
resolve(null);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
async function ensureNgrokReady() {
|
|
158
|
-
console.log("\n[Diagnostics] Checking ngrok configuration...");
|
|
159
|
-
const diagnostics = await diagnoseNgrok();
|
|
160
|
-
console.log(`[Diagnostics] Installed: ${diagnostics.installed ? "✓" : "✗"}`);
|
|
161
|
-
console.log(`[Diagnostics] Config: ${diagnostics.configPath || "none"}`);
|
|
162
|
-
console.log(`[Diagnostics] Authtoken: ${diagnostics.authtokenConfigured ? "✓" : "✗"}`);
|
|
163
|
-
if (diagnostics.error) {
|
|
164
|
-
console.log(`[Diagnostics] Issue: ${diagnostics.error}`);
|
|
165
|
-
}
|
|
166
|
-
if (!diagnostics.installed) {
|
|
167
|
-
console.log("\n[Setup] Please install ngrok: brew install ngrok");
|
|
168
|
-
return { ready: false, authtoken: null };
|
|
169
|
-
}
|
|
170
|
-
if (!diagnostics.authtokenConfigured || diagnostics.error) {
|
|
171
|
-
const authtoken = await setupNgrokWithUserInput();
|
|
172
|
-
return { ready: !!authtoken, authtoken };
|
|
173
|
-
}
|
|
174
|
-
console.log("[Diagnostics] Ngrok appears configured, attempting connection...");
|
|
175
|
-
return { ready: true, authtoken: null };
|
|
176
|
-
}
|
|
177
|
-
function findCloudflared() {
|
|
178
|
-
const paths = [
|
|
179
|
-
"/usr/local/bin/cloudflared",
|
|
180
|
-
"/usr/bin/cloudflared",
|
|
181
|
-
`${process.env.HOME}/.cloudflared/cloudflared`,
|
|
182
|
-
"/opt/homebrew/bin/cloudflared",
|
|
183
|
-
];
|
|
184
|
-
for (const p of paths) {
|
|
185
|
-
try {
|
|
186
|
-
if (fs.existsSync(p))
|
|
187
|
-
return p;
|
|
188
|
-
}
|
|
189
|
-
catch { }
|
|
190
|
-
}
|
|
191
|
-
return null;
|
|
192
|
-
}
|
|
193
|
-
async function startCloudflared(port) {
|
|
194
|
-
const cloudflaredPath = findCloudflared();
|
|
195
|
-
if (!cloudflaredPath)
|
|
196
|
-
throw new Error("cloudflared not found. Install from https://github.com/cloudflare/cloudflared");
|
|
197
|
-
return new Promise((resolve, reject) => {
|
|
198
|
-
const timeout = setTimeout(() => reject(new Error("Timeout waiting for cloudflared URL (60s)")), 60000);
|
|
199
|
-
cloudflareProcess = spawn(cloudflaredPath, [
|
|
200
|
-
"tunnel",
|
|
201
|
-
"--url",
|
|
202
|
-
`http://127.0.0.1:${port}`,
|
|
203
|
-
], { stdio: ["ignore", "pipe", "pipe"] });
|
|
204
|
-
const onData = (data) => {
|
|
205
|
-
const line = data.toString().trim();
|
|
206
|
-
const urlMatch = line.match(/https:\/\/[a-zA-Z0-9-]+\.trycloudflare\.com/);
|
|
207
|
-
if (urlMatch) {
|
|
208
|
-
const url = urlMatch[0];
|
|
209
|
-
console.log("[Cloudflared] URL:", url);
|
|
210
|
-
clearTimeout(timeout);
|
|
211
|
-
cloudflareUrl = url;
|
|
212
|
-
resolve({
|
|
213
|
-
url: cloudflareUrl,
|
|
214
|
-
tunnelId: cloudflareUrl.split("://")[1].split(".")[0],
|
|
215
|
-
port,
|
|
216
|
-
provider: "cloudflare",
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
else if (line.includes("ERR") || line.includes("error")) {
|
|
220
|
-
console.log("[Cloudflared]", line);
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
cloudflareProcess.stdout?.on("data", onData);
|
|
224
|
-
cloudflareProcess.stderr?.on("data", onData);
|
|
225
|
-
cloudflareProcess.on("error", (err) => {
|
|
226
|
-
clearTimeout(timeout);
|
|
227
|
-
reject(err);
|
|
228
|
-
});
|
|
229
|
-
cloudflareProcess.on("exit", (code) => {
|
|
230
|
-
// If no URL was captured, treat as failure even on clean exit
|
|
231
|
-
if (!cloudflareUrl) {
|
|
232
|
-
clearTimeout(timeout);
|
|
233
|
-
reject(new Error("cloudflared exited without providing a tunnel URL"));
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
if (code !== 0 && code !== null) {
|
|
237
|
-
clearTimeout(timeout);
|
|
238
|
-
reject(new Error(`cloudflared exited with code ${code}`));
|
|
239
|
-
}
|
|
240
|
-
});
|
|
241
|
-
});
|
|
242
|
-
}
|
|
243
|
-
function stopCloudflare() {
|
|
244
|
-
if (cloudflareProcess) {
|
|
245
|
-
cloudflareProcess.kill("SIGTERM");
|
|
246
|
-
cloudflareProcess = null;
|
|
247
|
-
}
|
|
248
|
-
cloudflareUrl = null;
|
|
249
|
-
}
|
|
250
|
-
async function startLocaltunnel(port) {
|
|
251
|
-
return new Promise((resolve, reject) => {
|
|
252
|
-
const timeout = setTimeout(() => reject(new Error("Timeout waiting for localtunnel URL (30s)")), 30000);
|
|
253
|
-
localtunnel({ port }, (err, tunnel) => {
|
|
254
|
-
if (err) {
|
|
255
|
-
clearTimeout(timeout);
|
|
256
|
-
reject(new Error(`Localtunnel failed: ${err.message}`));
|
|
257
|
-
return;
|
|
258
|
-
}
|
|
259
|
-
clearTimeout(timeout);
|
|
260
|
-
localtunnelInstance = tunnel;
|
|
261
|
-
console.log("[Tunnel] URL:", tunnel.url);
|
|
262
|
-
tunnel.on('close', () => {
|
|
263
|
-
localtunnelInstance = null;
|
|
264
|
-
});
|
|
265
|
-
resolve({
|
|
266
|
-
url: tunnel.url,
|
|
267
|
-
tunnelId: tunnel.url.split("://")[1].split(".")[0],
|
|
268
|
-
port,
|
|
269
|
-
provider: "localtunnel",
|
|
270
|
-
});
|
|
271
|
-
});
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
function stopLocaltunnel() {
|
|
275
|
-
if (localtunnelInstance) {
|
|
276
|
-
localtunnelInstance.close();
|
|
277
|
-
localtunnelInstance = null;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
async function startNgrokTunnel(config) {
|
|
281
|
-
const { exec } = await import("child_process");
|
|
282
|
-
const { promisify } = await import("util");
|
|
283
|
-
const execAsync = promisify(exec);
|
|
284
|
-
async function cleanupNgrok() {
|
|
285
|
-
try {
|
|
286
|
-
await ngrok.kill();
|
|
287
|
-
ngrokInstance = null;
|
|
288
|
-
}
|
|
289
|
-
catch (e) {
|
|
290
|
-
// Couldn't kill - leave it, don't force kill other processes
|
|
291
|
-
console.log("[Tunnel] Could not clean up ngrok session (may be in use by other services)");
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
// First, ensure ngrok is properly configured
|
|
295
|
-
const { ready, authtoken } = await ensureNgrokReady();
|
|
296
|
-
if (!ready) {
|
|
297
|
-
throw new Error("Ngrok not configured. Please set up your authtoken.");
|
|
298
|
-
}
|
|
299
|
-
await cleanupNgrok();
|
|
300
|
-
console.log("\n[Tunnel] Starting ngrok...");
|
|
301
|
-
// Get config path for debugging
|
|
302
|
-
const configPaths = [
|
|
303
|
-
`${process.env.HOME}/Library/Application Support/ngrok/ngrok.yml`,
|
|
304
|
-
`${process.env.HOME}/.config/ngrok/ngrok.yml`,
|
|
305
|
-
"/etc/ngrok/ngrok.yml",
|
|
306
|
-
];
|
|
307
|
-
let activeConfigPath = "none";
|
|
308
|
-
for (const p of configPaths) {
|
|
309
|
-
try {
|
|
310
|
-
const { existsSync } = require("fs");
|
|
311
|
-
if (existsSync(p)) {
|
|
312
|
-
activeConfigPath = p;
|
|
313
|
-
break;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
catch { }
|
|
317
|
-
}
|
|
318
|
-
// Read config for debugging
|
|
319
|
-
let configContent = "";
|
|
320
|
-
if (activeConfigPath !== "none") {
|
|
321
|
-
try {
|
|
322
|
-
const { readFileSync } = require("fs");
|
|
323
|
-
configContent = readFileSync(activeConfigPath, "utf-8");
|
|
324
|
-
}
|
|
325
|
-
catch {
|
|
326
|
-
configContent = "(failed to read)";
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
console.log(`[Tunnel] Config: ${activeConfigPath}`);
|
|
330
|
-
console.log(`[Tunnel] Format: ${configContent.includes('version: "3"') ? "v3" : configContent.includes("version: 2") ? "v2" : "unknown"}`);
|
|
331
|
-
console.log(`[Tunnel] Token: ${configContent.includes("authtoken:") || configContent.includes("agent:") ? "✓" : "✗"}`);
|
|
332
|
-
// Try multiple strategies if one fails
|
|
333
|
-
const strategies = [
|
|
334
|
-
// Strategy 1: Basic ngrok.forward()
|
|
335
|
-
async () => {
|
|
336
|
-
console.log("[Tunnel] Strategy 1: ngrok.forward()...");
|
|
337
|
-
const token = config.authToken || authtoken;
|
|
338
|
-
if (token && typeof token === 'string') {
|
|
339
|
-
console.log(`[Tunnel] Token: ${token.substring(0, 8)}...`);
|
|
340
|
-
}
|
|
341
|
-
const options = { addr: config.port };
|
|
342
|
-
if (token && typeof token === 'string')
|
|
343
|
-
options.authtoken = token;
|
|
344
|
-
const listener = await ngrok.forward(options);
|
|
345
|
-
console.log(`[Tunnel] URL: ${listener.url()}`);
|
|
346
|
-
return listener.url();
|
|
347
|
-
},
|
|
348
|
-
// Strategy 2: With session metadata
|
|
349
|
-
async () => {
|
|
350
|
-
console.log("[Tunnel] Strategy 2: + metadata...");
|
|
351
|
-
await cleanupNgrok();
|
|
352
|
-
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
353
|
-
const token = config.authToken || authtoken;
|
|
354
|
-
if (token && typeof token === 'string') {
|
|
355
|
-
console.log(`[Tunnel] Token: ${token.substring(0, 8)}...`);
|
|
356
|
-
}
|
|
357
|
-
const options = {
|
|
358
|
-
addr: config.port,
|
|
359
|
-
session_metadata: `opencode-${Date.now()}`,
|
|
360
|
-
};
|
|
361
|
-
if (token && typeof token === 'string')
|
|
362
|
-
options.authtoken = token;
|
|
363
|
-
const listener = await ngrok.forward(options);
|
|
364
|
-
console.log(`[Tunnel] URL: ${listener.url()}`);
|
|
365
|
-
return listener.url();
|
|
366
|
-
},
|
|
367
|
-
// Strategy 3: Clean session
|
|
368
|
-
async () => {
|
|
369
|
-
console.log("[Tunnel] Strategy 3: clean session...");
|
|
370
|
-
await cleanupNgrok();
|
|
371
|
-
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
372
|
-
const token = config.authToken || authtoken;
|
|
373
|
-
if (token && typeof token === 'string') {
|
|
374
|
-
console.log(`[Tunnel] Token: ${token.substring(0, 8)}...`);
|
|
375
|
-
}
|
|
376
|
-
const options = { addr: config.port };
|
|
377
|
-
if (token && typeof token === 'string')
|
|
378
|
-
options.authtoken = token;
|
|
379
|
-
const listener = await ngrok.forward(options);
|
|
380
|
-
console.log(`[Tunnel] URL: ${listener.url()}`);
|
|
381
|
-
return listener.url();
|
|
382
|
-
},
|
|
383
|
-
// Strategy 4: Use ngrok binary directly
|
|
384
|
-
async () => {
|
|
385
|
-
console.log("[Tunnel] Strategy 4: ngrok binary...");
|
|
386
|
-
await cleanupNgrok();
|
|
387
|
-
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
388
|
-
const configPath = activeConfigPath !== "none" ? activeConfigPath : "";
|
|
389
|
-
console.log(`[Tunnel] Config: ${configPath || "(default)"}`);
|
|
390
|
-
const cmd = configPath
|
|
391
|
-
? `ngrok http ${config.port} --config="${configPath}" --log=stdout 2>&1`
|
|
392
|
-
: `ngrok http ${config.port} --log=stdout 2>&1`;
|
|
393
|
-
console.log(`[Tunnel] Running: ngrok http ${config.port}`);
|
|
394
|
-
const { spawn } = require("child_process");
|
|
395
|
-
const ngrokProcess = spawn("sh", ["-c", cmd], {
|
|
396
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
397
|
-
});
|
|
398
|
-
let output = "";
|
|
399
|
-
let resolved = false;
|
|
400
|
-
let resolvePromise;
|
|
401
|
-
const onData = (data) => {
|
|
402
|
-
const text = data.toString();
|
|
403
|
-
output += text;
|
|
404
|
-
// Extract URL from format: url=https://abc.ngrok-free.app
|
|
405
|
-
const urlMatch = text.match(/url=([^\s]+)/);
|
|
406
|
-
if (urlMatch && !resolved) {
|
|
407
|
-
resolved = true;
|
|
408
|
-
ngrokProcess.kill();
|
|
409
|
-
if (resolvePromise)
|
|
410
|
-
resolvePromise(true);
|
|
411
|
-
console.log(`[Tunnel] URL: ${urlMatch[1]}`);
|
|
412
|
-
}
|
|
413
|
-
};
|
|
414
|
-
ngrokProcess.stdout.on("data", onData);
|
|
415
|
-
ngrokProcess.stderr.on("data", onData);
|
|
416
|
-
const waitPromise = new Promise((resolve) => {
|
|
417
|
-
resolvePromise = resolve;
|
|
418
|
-
});
|
|
419
|
-
const timeoutPromise = new Promise((_resolve, reject) => {
|
|
420
|
-
setTimeout(() => {
|
|
421
|
-
if (!resolved) {
|
|
422
|
-
ngrokProcess.kill();
|
|
423
|
-
reject(new Error("timeout"));
|
|
424
|
-
}
|
|
425
|
-
}, 15000);
|
|
426
|
-
});
|
|
427
|
-
await Promise.race([waitPromise, timeoutPromise]);
|
|
428
|
-
// Final extraction
|
|
429
|
-
const finalUrlMatch = output.match(/url=([^\s]+)/);
|
|
430
|
-
if (finalUrlMatch) {
|
|
431
|
-
return finalUrlMatch[1];
|
|
432
|
-
}
|
|
433
|
-
throw new Error("failed to extract URL");
|
|
434
|
-
},
|
|
435
|
-
];
|
|
436
|
-
let lastError = null;
|
|
437
|
-
let firstAuthError = null;
|
|
438
|
-
for (let i = 0; i < strategies.length; i++) {
|
|
439
|
-
try {
|
|
440
|
-
console.log(`[Tunnel] Connecting to port ${config.port}...`);
|
|
441
|
-
ngrokInstance = await strategies[i]();
|
|
442
|
-
const tunnelUrl = ngrokInstance;
|
|
443
|
-
const urlObj = new URL(tunnelUrl);
|
|
444
|
-
const tunnelId = urlObj.hostname.split(".")[0];
|
|
445
|
-
currentTunnel = {
|
|
446
|
-
url: tunnelUrl,
|
|
447
|
-
tunnelId,
|
|
448
|
-
port: config.port,
|
|
449
|
-
provider: "ngrok",
|
|
450
|
-
};
|
|
451
|
-
console.log("[Tunnel] URL:", tunnelUrl);
|
|
452
|
-
return currentTunnel;
|
|
453
|
-
}
|
|
454
|
-
catch (error) {
|
|
455
|
-
lastError = error;
|
|
456
|
-
console.log(`[Tunnel] Strategy ${i + 1} failed: ${error.message}`);
|
|
457
|
-
// Capture first auth-related error for proper detection
|
|
458
|
-
const errorMsg = error.message.toLowerCase();
|
|
459
|
-
const isAuthError = errorMsg.includes("invalid tunnel configuration") ||
|
|
460
|
-
errorMsg.includes("authtoken") ||
|
|
461
|
-
errorMsg.includes("authentication") ||
|
|
462
|
-
errorMsg.includes("auth token") ||
|
|
463
|
-
errorMsg.includes("session failed");
|
|
464
|
-
if (isAuthError && !firstAuthError) {
|
|
465
|
-
firstAuthError = error;
|
|
466
|
-
console.log(`[Tunnel] Auth error detected in strategy ${i + 1}: ${error.message}`);
|
|
467
|
-
}
|
|
468
|
-
if (i === strategies.length - 1) {
|
|
469
|
-
console.error(`[Tunnel] All strategies exhausted. Last error: ${error.message}`);
|
|
470
|
-
// If we captured an auth error earlier, throw that instead (so it can be detected)
|
|
471
|
-
if (firstAuthError) {
|
|
472
|
-
console.error(`[Tunnel] Original auth error: ${firstAuthError.message}`);
|
|
473
|
-
throw firstAuthError;
|
|
474
|
-
}
|
|
475
|
-
throw error;
|
|
476
|
-
}
|
|
477
|
-
console.log(`[Tunnel] Trying next strategy...`);
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
throw lastError || new Error("Unknown error");
|
|
481
|
-
}
|
|
482
|
-
export async function stopNgrok() {
|
|
483
|
-
if (!ngrokInstance)
|
|
484
|
-
return;
|
|
485
|
-
try {
|
|
486
|
-
await ngrok.kill();
|
|
487
|
-
ngrokInstance = null;
|
|
488
|
-
currentTunnel = null;
|
|
489
|
-
}
|
|
490
|
-
catch (error) {
|
|
491
|
-
console.error("[Tunnel] Error stopping ngrok:", error.message);
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
export async function stopTunnel() {
|
|
495
|
-
stopCloudflare();
|
|
496
|
-
await stopNgrok();
|
|
497
|
-
stopLocaltunnel();
|
|
498
|
-
currentTunnel = null;
|
|
499
|
-
}
|
|
500
|
-
export async function startTunnel(config) {
|
|
501
|
-
const provider = config.provider || "ngrok";
|
|
502
|
-
switch (provider) {
|
|
503
|
-
case "localtunnel":
|
|
504
|
-
return await startLocaltunnel(config.port);
|
|
505
|
-
case "cloudflare":
|
|
506
|
-
return await startCloudflared(config.port);
|
|
507
|
-
case "ngrok":
|
|
508
|
-
return await startNgrokTunnel(config);
|
|
509
|
-
default:
|
|
510
|
-
throw new Error(`Unknown tunnel provider: ${provider}`);
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
export function getTunnelInfo() {
|
|
514
|
-
return currentTunnel;
|
|
515
|
-
}
|
|
516
|
-
export function getTunnelDetails() {
|
|
517
|
-
const details = {
|
|
518
|
-
type: "none",
|
|
519
|
-
url: null,
|
|
520
|
-
loginStatus: "unknown",
|
|
521
|
-
loginId: null,
|
|
522
|
-
configPath: null,
|
|
523
|
-
};
|
|
524
|
-
// Determine tunnel type and URL
|
|
525
|
-
if (currentTunnel) {
|
|
526
|
-
details.type = currentTunnel.provider;
|
|
527
|
-
details.url = currentTunnel.url;
|
|
528
|
-
}
|
|
529
|
-
else if (localtunnelInstance?.url) {
|
|
530
|
-
details.type = "localtunnel";
|
|
531
|
-
details.url = localtunnelInstance.url;
|
|
532
|
-
}
|
|
533
|
-
else if (cloudflareUrl) {
|
|
534
|
-
details.type = "cloudflare";
|
|
535
|
-
details.url = cloudflareUrl;
|
|
536
|
-
}
|
|
537
|
-
// Get config path for ngrok
|
|
538
|
-
const configPaths = [
|
|
539
|
-
`${process.env.HOME}/Library/Application Support/ngrok/ngrok.yml`,
|
|
540
|
-
`${process.env.HOME}/.config/ngrok/ngrok.yml`,
|
|
541
|
-
"/etc/ngrok/ngrok.yml",
|
|
542
|
-
];
|
|
543
|
-
for (const p of configPaths) {
|
|
544
|
-
try {
|
|
545
|
-
if (fs.existsSync(p)) {
|
|
546
|
-
details.configPath = p;
|
|
547
|
-
break;
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
catch { }
|
|
551
|
-
}
|
|
552
|
-
// Check ngrok config for login status
|
|
553
|
-
if (details.configPath && details.type === "ngrok") {
|
|
554
|
-
try {
|
|
555
|
-
const configContent = fs.readFileSync(details.configPath, "utf-8");
|
|
556
|
-
// Check for authtoken (indicates logged in)
|
|
557
|
-
if (configContent.includes("authtoken:")) {
|
|
558
|
-
details.loginStatus = "authenticated";
|
|
559
|
-
// Try to extract account info from config comments or try API
|
|
560
|
-
const accountMatch = configContent.match(/account:\s*(.+)/);
|
|
561
|
-
if (accountMatch) {
|
|
562
|
-
details.loginId = accountMatch[1].trim();
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
else {
|
|
566
|
-
details.loginStatus = "free";
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
catch { }
|
|
570
|
-
}
|
|
571
|
-
// Localtunnel is always free/anonymous
|
|
572
|
-
if (details.type === "localtunnel") {
|
|
573
|
-
details.loginStatus = "anonymous";
|
|
574
|
-
}
|
|
575
|
-
// Cloudflare might have config info
|
|
576
|
-
if (details.type === "cloudflare") {
|
|
577
|
-
details.loginStatus = "unknown";
|
|
578
|
-
}
|
|
579
|
-
return details;
|
|
580
|
-
}
|
|
581
|
-
export function getServerUrl() {
|
|
582
|
-
return currentTunnel?.url || localtunnelInstance?.url || cloudflareUrl || null;
|
|
583
|
-
}
|
|
584
|
-
export async function displayQRCode(url) {
|
|
585
|
-
console.log("[QR] displayQRCode called from:", new Error().stack?.split('\n').slice(2, 6).join('\n'));
|
|
586
|
-
console.log("[QR] displayQRCode called with:", typeof url, `"${url}"`);
|
|
587
|
-
if (typeof url !== "string" || !url || url === "undefined" || !url.startsWith("http")) {
|
|
588
|
-
console.error("[QR] Invalid URL, skipping QR (already displayed or stale call)");
|
|
589
|
-
return;
|
|
590
|
-
}
|
|
591
|
-
console.log("\n" + "=".repeat(50));
|
|
592
|
-
console.log(" OpenCode Mobile Connection Ready!");
|
|
593
|
-
console.log("=".repeat(50));
|
|
594
|
-
console.log(`\n ${url}\n`);
|
|
595
|
-
try {
|
|
596
|
-
qrcodeTerminal.generate(url, { small: false }, (qr) => {
|
|
597
|
-
console.log(qr);
|
|
598
|
-
console.log("=".repeat(50) + "\n");
|
|
599
|
-
});
|
|
600
|
-
}
|
|
601
|
-
catch {
|
|
602
|
-
console.log(" Install qrcode-terminal for QR code display");
|
|
603
|
-
console.log(" npm install -g qrcode-terminal\n");
|
|
604
|
-
console.log("=".repeat(50) + "\n");
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
export async function displayQRCodeAndSave(url, filepath) {
|
|
608
|
-
await displayQRCode(url);
|
|
609
|
-
if (filepath) {
|
|
610
|
-
try {
|
|
611
|
-
await qrcode.toFile(filepath, url, {
|
|
612
|
-
width: 300,
|
|
613
|
-
margin: 2,
|
|
614
|
-
color: {
|
|
615
|
-
dark: "#000000",
|
|
616
|
-
light: "#ffffff",
|
|
617
|
-
},
|
|
618
|
-
});
|
|
619
|
-
console.log(`[QR] Saved QR code to: ${filepath}`);
|
|
620
|
-
return filepath;
|
|
621
|
-
}
|
|
622
|
-
catch (error) {
|
|
623
|
-
console.error("[QR] Failed to save QR code:", error.message);
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
return url;
|
|
627
|
-
}
|
|
628
|
-
export async function gracefulShutdown() {
|
|
629
|
-
console.log("\n[Tunnel] Graceful shutdown...");
|
|
630
|
-
await stopTunnel();
|
|
631
|
-
console.log("[Tunnel] Shutdown complete");
|
|
632
|
-
}
|
|
633
|
-
// Handle process signals for graceful shutdown
|
|
634
|
-
const signals = ["SIGINT", "SIGTERM", "SIGHUP"];
|
|
635
|
-
signals.forEach((signal) => {
|
|
636
|
-
process.on(signal, async () => {
|
|
637
|
-
await gracefulShutdown();
|
|
638
|
-
process.exit(0);
|
|
639
|
-
});
|
|
640
|
-
});
|
|
641
|
-
//# sourceMappingURL=tunnel-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel-manager.js","sourceRoot":"","sources":["../tunnel-manager.ts"],"names":[],"mappings":"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"}
|