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.
Files changed (2) hide show
  1. package/dist/index.js +71 -9
  2. 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/${sessionCode}`);
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
- return (await response.json());
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
- try {
2780
- await connectWebSocket();
2781
- console.log(`[reconnect] connected via ${activeGatewayUrl}`);
2782
- }
2783
- catch (err) {
2784
- console.error(`[reconnect] failed on all gateways: ${err.message}`);
2785
- gracefulShutdown();
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() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lunel-cli",
3
- "version": "0.1.65",
3
+ "version": "0.1.66",
4
4
  "author": [
5
5
  {
6
6
  "name": "Soham Bharambe",