Auto-recover active sessions after signaling disconnects#321
Conversation
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
|
@Jayian1890 if you can test this due to my sub ended so |
There was a problem hiding this comment.
Pull request overview
Adds bounded automatic recovery in the renderer (App.tsx) to reclaim and reconnect to an existing CloudMatch session after unexpected signaling disconnects (e.g., network/VPN changes), instead of immediately tearing down stream state.
Changes:
- Introduces
SignalingRecoveryState+ helpers to track recovery attempts, delays, explicit shutdown intent, and appId context. - Implements
attemptSessionRecoveryflow that queries active sessions, re-claims the best candidate, and reconnects signaling with a limited retry budget. - Refactors session resume path by extracting
resolveSessionClaimAppIdandapplyClaimedSessionAndConnect, and updates signaling event handling to use recovery ondisconnected.
| } else if (event.type === "disconnected") { | ||
| console.warn("Signaling disconnected:", event.reason); | ||
| const recovered = await attemptSessionRecovery(event.reason).catch((error) => { | ||
| console.error("[Recovery] Signaling recovery failed:", error); | ||
| throw error; | ||
| }); | ||
| if (!recovered) { | ||
| clientRef.current?.dispose(); | ||
| clientRef.current = null; | ||
| setLaunchError({ | ||
| stage: streamStatusToLoadingStage(streamStatusRef.current), | ||
| title: "Session Connection Lost", | ||
| description: "The connection to your running session was lost and could not be restored automatically. Try resuming it again from the app.", | ||
| }); | ||
| resetLaunchRuntime({ keepLaunchError: true, keepStreamingContext: true }); |
There was a problem hiding this comment.
The disconnected handler treats any attemptSessionRecovery result of false as a hard failure and surfaces a user-facing "Session Connection Lost" error. When attemptSessionRecovery returns false because explicitShutdown was set (user-initiated stop/dismiss) or the status is non-recoverable, this can incorrectly show an error UX for an intentional shutdown. Consider explicitly checking signalingRecoveryRef.current.explicitShutdown (or returning a distinct result) and early-returning without setting launchError in that case.
|
Woah. How am I just seeing this. Lol. Yeah I'll test it. |
…ng. Added generation state to manage recovery attempts and prevent stale session applications. Updated relevant functions to utilize generation checks for improved session handling.
…ed a helper function to determine if a claimed reconnect can proceed based on recovery generation and explicit shutdown status, enhancing session management and logging clarity.
…wn and non-recoverable stream statuses. This prevents unnecessary error handling and improves logging clarity during disconnect scenarios.
Jayian1890
left a comment
There was a problem hiding this comment.
Successfully reconnects after changing wifi-networks, and also after toggling vpn.
…eamline recovery process. This change simplifies the connection flow during recovery attempts.
* Fix Epic ownership guard and owned store glow (#334) * Add Windows ARM64 release builds to pipeline (#340) * Restore Windows ARM64 build artifacts in release pipeline * fix(ci): match linux x64 artifact upload names * Add 'Hide Server Selector' setting to skip free-tier queue modal * Add Discord activity clearing functionality to rich presence (#349) * Remove Game Hub media handling and refactor ControllerLibraryPage (#350) * Remove Game Hub media handling from ControllerLibraryPage * Refactor initial category index logic in ControllerLibraryPage for clarity * Replace useEffect with useLayoutEffect for improved layout handling in ControllerLibraryPage * Merge branch 'dev' into Jayian1890/controller-mode-patch-042226 * Add flake.nix again (#343) * Fix Nix npm packaging * Update * Add nix instruction in README.md * Delete symbolic Link * change requested changes and add desktop items * Update README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update flake.nix Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Zortos <zortosdev@proton.me> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Kiefer <67562560+Kief5555@users.noreply.github.com> Co-authored-by: Kiefer <kieferlin1001@gmail.com> Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> Co-authored-by: DINEXXL <dinexxl@noreply.codeberg.org> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Switch macOS jobs to Blacksmith runners (#352) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * feat: implement DiscordStatusMonitor to periodically sync RPC activity with active cloud gaming sessions * feat: add initial sync handling in DiscordStatusMonitor to clear stale status on startup * Fix Settings search to show relevant sections only (scope-aware filtering + sidebar UX polish) (#353) * settings * Update opennow-stable/src/renderer/src/components/SettingsPage.tsx Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * do capy's suggestion Co-authored-by: Copilot <copilot@github.com> * Auto-recover active sessions after signaling disconnects (#321) * Implement bounded auto-recovery for active sessions after signaling disconnects * Enhance signaling recovery mechanism by introducing generation tracking. Added generation state to manage recovery attempts and prevent stale session applications. Updated relevant functions to utilize generation checks for improved session handling. * Refactor claimed session handling to improve recovery logic. Introduced a helper function to determine if a claimed reconnect can proceed based on recovery generation and explicit shutdown status, enhancing session management and logging clarity. * Enhance signaling recovery logic by adding checks for explicit shutdown and non-recoverable stream statuses. This prevents unnecessary error handling and improves logging clarity during disconnect scenarios. * Remove explicit shutdown check from signaling connection logic to streamline recovery process. This change simplifies the connection flow during recovery attempts. --------- Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> Co-authored-by: Jared <jared@interlacedpixel.com> * Add multi-account auth support with quick account switcher UI (#355) * chore(release): prepare v0.3.3 * chore(release): prepare v0.3.4 * chore(release): prepare v1.3.5 * chore(release): prepare v0.3.5 * Update README.md to include TestFlight badge and iOS packaging target * update AGENTS.md * chore(release): prepare v0.3.6 * Add multi-account auth support with quick account switcher UI * Add confirmation modal for account removal * Fix account switch session validation during refresh (#4) * Fix account switch session validation during refresh * Fail switch-account refresh when user identity cannot be verified * Update opennow-stable/src/main/gfn/auth.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: PriyanshAg-1 <204138848+PriyanshAg-1@users.noreply.github.com> Co-authored-by: priyanshrv1-oss <priyanshrv1@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fix async session state in handleSwitchAccount - pass fresh session to refreshNavbarActiveSession to avoid stale auth token Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Fix all remaining Copilot review issues: auth session null returns, error recovery state sync, ARIA semantics, SavedAccount type usage Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * fix: use menu ARIA roles in account dropdown and return getSession() after logout Agent-Logs-Url: https://github.com/priyanshrv1-oss/OpenNOW1/sessions/bc9cb33e-8e97-4cf8-8986-2a9a584abddc Co-authored-by: PriyanshAg-1 <204138848+PriyanshAg-1@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * fix: add role=none to structural wrappers in menu and fix embedded line numbers in TS files Agent-Logs-Url: https://github.com/priyanshrv1-oss/OpenNOW1/sessions/f707cd73-f431-41cf-96a8-c5e0c34ab939 Co-authored-by: PriyanshAg-1 <204138848+PriyanshAg-1@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Change logoutAll to logout in auth service * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Update opennow-stable/src/main/gfn/auth.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fixed errors and improved session auth flows * fix: improve session handling and error recovery in AuthService and App components; update Navbar accessibility roles * Update opennow-stable/src/main/gfn/auth.ts Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Resolve styling issues * Resolve startup issues --------- Co-authored-by: Zortos <zortosdev@proton.me> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> Co-authored-by: PriyanshAg-1 <204138848+PriyanshAg-1@users.noreply.github.com> Co-authored-by: priyanshrv1-oss <priyanshrv1@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Priyansh Agarwal <2k22.cse.32203@gmail.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> * Improve stream pointer responsiveness under load. (#354) * Improve stream pointer responsiveness under load. Reduce mouse input hot-path overhead with residual delta accumulation, adaptive flush scheduling, cached scale conversion, and tuned raw-input filtering while adding diagnostics and targeted tests. Made-with: Cursor * Refactor mouse input handling in GfnWebRtcClient to maintain pending deltas until a non-zero packet is sent. This change prevents loss of quantized integer deltas during server scaling, improving responsiveness and accuracy of mouse movements. * Enhance mouse input handling in GfnWebRtcClient by preventing re-arming of the mouse flush timer during teardown. This change ensures that the timer does not continue to operate after it has been cleared, improving resource management and stability. * Refactor App and StreamView components to remove Esc hold release indicator functionality. This includes the removal of related state management, CSS styles, and UI elements, streamlining the codebase and improving maintainability. * Refactor setActivity function in discordRpc.ts to update lastActivity only after successful RPC call, improving state management. * Update flake.nix to reference the correct path for opennow-logo.png and enhance Discord RPC state management by introducing pendingActivity for improved activity handling. * Enhance Discord RPC state management by consuming pendingActivity after processing, preventing reprocessing of failed attempts. Simplify activity title and start time assignment in DiscordStatusMonitor for improved clarity. * Reset pendingActivity to null on setActivity failure in discordRpc.ts to ensure proper state management during error handling. --------- Co-authored-by: Zortos <zortosdev@proton.me> Co-authored-by: Jared Terrance <jared@interlacedpixel.com> Co-authored-by: DINEXXL <105819287+DINEXXL@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> Co-authored-by: DINEXXL <dinexxl@noreply.codeberg.org> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: zaloguj12 <patrik.ostafin@gmail.com> Co-authored-by: Copilot <copilot@github.com> Co-authored-by: PriyanshAg-1 <204138848+PriyanshAg-1@users.noreply.github.com> Co-authored-by: priyanshrv1-oss <priyanshrv1@gmail.com> Co-authored-by: Priyansh Agarwal <2k22.cse.32203@gmail.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Description
Implement bounded automatic recovery for active sessions when signaling disconnects unexpectedly (e.g., after VPN toggle or network path changes). The renderer now attempts to reclaim and reconnect to the same session instead of immediately tearing down state.
Recovery Logic (
src/renderer/src/App.tsx):queue,setup,starting,connecting,streaming)[0ms, 3000ms]before failingsessionId; fall back to matching the trackedappIdif the same session is not foundlaunchErrorand reset to idle stateExplicit Shutdown Guard:
SignalingRecoveryStateref to track recovery attempts and explicit shutdown intentmarkExplicitSignalingShutdowninhandleStopStreamandhandleDismissLaunchErrorto prevent automatic recovery after user-initiated stopsShared Resume Helpers:
resolveSessionClaimAppIdto safely resolve theappIdfor session claimsapplyClaimedSessionAndConnectto centralize session application and signaling connectionclaimAndConnectSessionto use the extracted helpersSignaling Event Handler:
disconnectedevents with a call toattemptSessionRecoveryoffer/streamingtransition