lunel-cli 0.1.65 → 0.1.66
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.js +71 -9
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2494,11 +2494,56 @@ async function createSessionFromManager() {
|
|
|
2494
2494
|
return (await response.json());
|
|
2495
2495
|
}
|
|
2496
2496
|
async function connectToCloudSession(sessionCode) {
|
|
2497
|
-
const response = await fetch(`${MANAGER_URL}/v1/session
|
|
2497
|
+
const response = await fetch(`${MANAGER_URL}/v1/session/resolve`, {
|
|
2498
|
+
method: "POST",
|
|
2499
|
+
headers: { "Content-Type": "application/json" },
|
|
2500
|
+
body: JSON.stringify({ code: sessionCode }),
|
|
2501
|
+
});
|
|
2498
2502
|
if (!response.ok) {
|
|
2499
2503
|
throw new Error(`Failed to look up cloud session ${sessionCode}: ${response.status}`);
|
|
2500
2504
|
}
|
|
2501
|
-
|
|
2505
|
+
const snapshot = await response.json();
|
|
2506
|
+
if (!snapshot.exists || !snapshot.valid || !snapshot.primary || !snapshot.resumeToken || !snapshot.code) {
|
|
2507
|
+
throw new Error(`Failed to look up cloud session ${sessionCode}: invalid or expired session`);
|
|
2508
|
+
}
|
|
2509
|
+
return {
|
|
2510
|
+
sessionId: snapshot.sessionId || "",
|
|
2511
|
+
code: snapshot.code,
|
|
2512
|
+
password: snapshot.resumeToken,
|
|
2513
|
+
primary: snapshot.primary,
|
|
2514
|
+
backup: snapshot.backup ?? null,
|
|
2515
|
+
state: snapshot.state,
|
|
2516
|
+
expiresAt: snapshot.expiresAt,
|
|
2517
|
+
};
|
|
2518
|
+
}
|
|
2519
|
+
async function resolveSessionByResumeToken(resumeToken) {
|
|
2520
|
+
const response = await fetch(`${MANAGER_URL}/v1/session/resolve`, {
|
|
2521
|
+
method: "POST",
|
|
2522
|
+
headers: { "Content-Type": "application/json" },
|
|
2523
|
+
body: JSON.stringify({ resumeToken }),
|
|
2524
|
+
});
|
|
2525
|
+
if (!response.ok) {
|
|
2526
|
+
throw new Error(`Failed to resolve session from manager: ${response.status}`);
|
|
2527
|
+
}
|
|
2528
|
+
const snapshot = await response.json();
|
|
2529
|
+
if (!snapshot.exists || !snapshot.valid || !snapshot.primary || !snapshot.resumeToken || !snapshot.code) {
|
|
2530
|
+
if (snapshot.reason === "session_finalized" || snapshot.reason === "not_found") {
|
|
2531
|
+
return null;
|
|
2532
|
+
}
|
|
2533
|
+
if (snapshot.state === "ended" || snapshot.state === "expired") {
|
|
2534
|
+
return null;
|
|
2535
|
+
}
|
|
2536
|
+
throw new Error(`Session resolve returned invalid snapshot (${snapshot.reason || "unknown"})`);
|
|
2537
|
+
}
|
|
2538
|
+
return {
|
|
2539
|
+
sessionId: snapshot.sessionId || "",
|
|
2540
|
+
code: snapshot.code,
|
|
2541
|
+
password: snapshot.resumeToken,
|
|
2542
|
+
primary: snapshot.primary,
|
|
2543
|
+
backup: snapshot.backup ?? null,
|
|
2544
|
+
state: snapshot.state,
|
|
2545
|
+
expiresAt: snapshot.expiresAt,
|
|
2546
|
+
};
|
|
2502
2547
|
}
|
|
2503
2548
|
function displayQR(primaryGateway, backupGateway, code) {
|
|
2504
2549
|
console.log("\n");
|
|
@@ -2776,13 +2821,30 @@ async function handleConnectionDrop(reason) {
|
|
|
2776
2821
|
gracefulShutdown();
|
|
2777
2822
|
return;
|
|
2778
2823
|
}
|
|
2779
|
-
|
|
2780
|
-
|
|
2781
|
-
|
|
2782
|
-
|
|
2783
|
-
|
|
2784
|
-
|
|
2785
|
-
|
|
2824
|
+
let attempt = 0;
|
|
2825
|
+
while (!shuttingDown) {
|
|
2826
|
+
attempt += 1;
|
|
2827
|
+
const base = Math.min(250 * 2 ** (attempt - 1), 30_000);
|
|
2828
|
+
const delayMs = Math.round(base * (0.8 + Math.random() * 0.4));
|
|
2829
|
+
try {
|
|
2830
|
+
const resolved = await resolveSessionByResumeToken(currentSessionPassword);
|
|
2831
|
+
if (!resolved) {
|
|
2832
|
+
console.error("[reconnect] session no longer exists or is finalized");
|
|
2833
|
+
gracefulShutdown();
|
|
2834
|
+
return;
|
|
2835
|
+
}
|
|
2836
|
+
currentSessionCode = resolved.code;
|
|
2837
|
+
currentSessionPassword = resolved.password;
|
|
2838
|
+
currentPrimaryGateway = normalizeGatewayUrl(resolved.primary);
|
|
2839
|
+
currentBackupGateway = resolved.backup ? normalizeGatewayUrl(resolved.backup) : null;
|
|
2840
|
+
await connectWebSocket();
|
|
2841
|
+
console.log(`[reconnect] connected via ${activeGatewayUrl}`);
|
|
2842
|
+
return;
|
|
2843
|
+
}
|
|
2844
|
+
catch (err) {
|
|
2845
|
+
console.error(`[reconnect] attempt ${attempt} failed: ${err.message}`);
|
|
2846
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
2847
|
+
}
|
|
2786
2848
|
}
|
|
2787
2849
|
}
|
|
2788
2850
|
async function main() {
|