auto pick server and rejoin when session end - #665
Conversation
|
Capy auto-review is paused for this organization because the usage-cycle auto-review limit has been reached. Increase the limit or turn it off in billing settings to resume automatic reviews. |
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughChangesSmart auto-rejoin
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant StreamingSession
participant RendererApp
participant MainProcess
participant CloudMatch
participant PrintedWaste
participant DNS
StreamingSession->>RendererApp: session close or signaling disconnect
RendererApp->>MainProcess: request smart auto-join URL
MainProcess->>CloudMatch: call getSmartAutoJoinBaseUrl
CloudMatch->>PrintedWaste: fetch mapping and queue data
CloudMatch->>DNS: resolve ranked zone hostname
DNS-->>CloudMatch: resolved candidate
CloudMatch-->>MainProcess: return HTTPS base URL
MainProcess-->>RendererApp: return selected URL
RendererApp->>StreamingSession: rejoin with selected base URL
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (3)
opennow-stable/src/main/gfn/cloudmatch.ts (1)
2069-2086: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick winCandidate DNS resolution is sequential; could add noticeable latency on the auto-rejoin critical path.
resolveHostnameWithFallbackis awaited one candidate at a time; if the top-ranked (lowest-ping/queue) candidates are unreachable, this loop pays each fallback-resolution's cost serially before trying the next. Since this function is on the auto-rejoin critical path (called right as a session is ending), consider resolving the first few candidates concurrently and picking the first success, similar to how the TCP pings are already parallelized above.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@opennow-stable/src/main/gfn/cloudmatch.ts` around lines 2069 - 2086, Update the candidate resolution flow around resolveHostnameWithFallback to resolve a bounded set of top-ranked candidateZones concurrently rather than awaiting each candidate sequentially. Select and return the highest-priority candidate whose hostname resolves, while preserving the existing logging and final first-candidate fallback when none resolve.opennow-stable/src/renderer/src/components/SettingsPage.tsx (1)
2824-2839: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winHardcoded strings break the file's i18n convention.
Every other setting row in this component uses
t("settings.xxx")for labels/hints. This new row hardcodes English text directly, so it won't be localized and is inconsistent with the rest of the file.♻️ Suggested fix
<div className="settings-row"> <label className="settings-label"> - {"Auto-Rejoin (test)"} + {t("settings.stream.autoRejoinTest")} <span className="settings-hint"> - {"Automatically picks the best server using TCP ping and queue, and auto-rejoins when your session ends."} + {t("settings.stream.autoRejoinTestHint")} </span> </label>🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@opennow-stable/src/renderer/src/components/SettingsPage.tsx` around lines 2824 - 2839, Update the Auto-Rejoin settings row in the SettingsPage component to use the existing t("settings.xxx") localization helper for both its label and hint instead of hardcoded English strings. Add or reuse the appropriate settings translation keys while preserving the current toggle behavior and enableFastQueueJoin binding.opennow-stable/src/renderer/src/App.tsx (1)
1682-1721: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick winPre-ping retries every second with no backoff once triggered.
Once
sessionTimeRemainingSeconds <= 15, ifgetSmartAutoJoinBaseUrl()fails or returns no candidate,prePingSmartUrlRef.currentstaysnulland the next tick (every second) retries — each attempt fetches the queue, fetches the server mapping, and TCP-pings every datacenter cluster. In the worst case (persistent failure) this repeats up to ~15 times in the closing seconds of a session. Consider a simple cooldown (e.g. only retry every 3-5s, matching the existing logging modulo) to avoid hammering the queue/mapping endpoints.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@opennow-stable/src/renderer/src/App.tsx` around lines 1682 - 1721, Update the Auto-Rejoin pre-fetch logic in the useEffect watching sessionTimeRemainingSeconds so failed or empty getSmartAutoJoinBaseUrl attempts cannot retry on every one-second tick. Add a cooldown timestamp or equivalent retry guard, allowing retries only every 3–5 seconds while the session remains at or below 15 seconds, and preserve the existing in-flight protection and successful URL caching.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@opennow-stable/src/main/gfn/cloudmatch.ts`:
- Around line 1982-2009: Update getSmartAutoJoinBaseUrl to reuse the shared
fetchPrintedWasteQueue service instead of locally defining QUEUE_API_URL,
AbortController timeout, and fetch logic. Extend fetchPrintedWasteQueue to
accept and apply an optional proxyUrl while preserving its existing User-Agent
and request behavior, then pass proxyUrl from getSmartAutoJoinBaseUrl and
consume the shared response.
In `@opennow-stable/src/main/services/dnsInterceptor.ts`:
- Around line 14-68: Update initDnsInterceptor so the replacement dns.lookup
function preserves the original dns.lookup util.promisify.custom symbol. Copy
that symbol from the original lookup onto the new function after defining it,
retaining the `{ address, family }` result shape for promisified callers.
In `@opennow-stable/src/renderer/src/App.tsx`:
- Around line 3005-3031: Reset consecutiveAutoRejoinAttemptsRef after an
auto-rejoined session is confirmed stable, rather than relying only on the
non-bypass handlePlayGame path. Integrate this reset with the existing
scheduleStableRecoveryReset flow used after successful recovery, while
preserving the three-attempt guard for genuinely consecutive failures.
- Around line 3042-3048: Update the launch callback in startAutoRejoin so a null
streamingBaseUrl also calls setLaunchError with the existing user-facing session
connection failure message before resetting runtime and refreshing the navbar.
Preserve the current console logging and cleanup behavior, ensuring callers
still receive an error when async or cached URL resolution fails.
---
Nitpick comments:
In `@opennow-stable/src/main/gfn/cloudmatch.ts`:
- Around line 2069-2086: Update the candidate resolution flow around
resolveHostnameWithFallback to resolve a bounded set of top-ranked
candidateZones concurrently rather than awaiting each candidate sequentially.
Select and return the highest-priority candidate whose hostname resolves, while
preserving the existing logging and final first-candidate fallback when none
resolve.
In `@opennow-stable/src/renderer/src/App.tsx`:
- Around line 1682-1721: Update the Auto-Rejoin pre-fetch logic in the useEffect
watching sessionTimeRemainingSeconds so failed or empty getSmartAutoJoinBaseUrl
attempts cannot retry on every one-second tick. Add a cooldown timestamp or
equivalent retry guard, allowing retries only every 3–5 seconds while the
session remains at or below 15 seconds, and preserve the existing in-flight
protection and successful URL caching.
In `@opennow-stable/src/renderer/src/components/SettingsPage.tsx`:
- Around line 2824-2839: Update the Auto-Rejoin settings row in the SettingsPage
component to use the existing t("settings.xxx") localization helper for both its
label and hint instead of hardcoded English strings. Add or reuse the
appropriate settings translation keys while preserving the current toggle
behavior and enableFastQueueJoin binding.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: f5e28b87-91a6-4e5d-a44e-7e46f1777f1c
📒 Files selected for processing (10)
opennow-stable/src/main/gfn/cloudmatch.tsopennow-stable/src/main/gfn/proxyFetch.tsopennow-stable/src/main/index.tsopennow-stable/src/main/services/dnsInterceptor.tsopennow-stable/src/main/settings.tsopennow-stable/src/preload/index.tsopennow-stable/src/renderer/src/App.tsxopennow-stable/src/renderer/src/components/SettingsPage.tsxopennow-stable/src/shared/gfn.tsopennow-stable/src/shared/ipc.ts
There was a problem hiding this comment.
🧹 Nitpick comments (1)
opennow-stable/src/main/services/printedWaste.ts (1)
18-21: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueInterpolate the timeout constant in the error message.
The error message hardcodes "7000ms". If
PRINTEDWASTE_TIMEOUT_MSis modified in the future, this message will become stale. Consider interpolating the constant instead.♻️ Proposed refactor
const timeoutId = setTimeout( - () => controller.abort(new Error("PrintedWaste queue request timed out after 7000ms")), + () => controller.abort(new Error(`PrintedWaste queue request timed out after ${PRINTEDWASTE_TIMEOUT_MS}ms`)), PRINTEDWASTE_TIMEOUT_MS, );🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@opennow-stable/src/main/services/printedWaste.ts` around lines 18 - 21, Update the timeout error message in the setTimeout callback to interpolate PRINTEDWASTE_TIMEOUT_MS instead of hardcoding “7000ms”, so it always reflects the configured timeout value.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@opennow-stable/src/main/services/printedWaste.ts`:
- Around line 18-21: Update the timeout error message in the setTimeout callback
to interpolate PRINTEDWASTE_TIMEOUT_MS instead of hardcoding “7000ms”, so it
always reflects the configured timeout value.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: fcc132df-888d-412a-bcf8-264ed3a2baef
📒 Files selected for processing (5)
native/opennow-streamer/bin/opennow-streameropennow-stable/src/main/gfn/cloudmatch.tsopennow-stable/src/main/services/dnsInterceptor.tsopennow-stable/src/main/services/printedWaste.tsopennow-stable/src/renderer/src/App.tsx
🚧 Files skipped from review as they are similar to previous changes (3)
- opennow-stable/src/main/services/dnsInterceptor.ts
- opennow-stable/src/main/gfn/cloudmatch.ts
- opennow-stable/src/renderer/src/App.tsx
Kief5555
left a comment
There was a problem hiding this comment.
Please resolve your changes and ensure proper keys in the settings are set up for translations. Please only modify en.json.
the label and hint text are wired to translation keys in en.json file "autoRejoin": "Auto Rejoin",
"autoRejoinHint": "Automatically picks the best server using your ping
and queue, and automatically rejoins the game when your session ends." and in settingspage.tsx too: {t("settings.region.autoRejoin")}
{t("settings.region.autoRejoinHint")} |
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
opennow-stable/src/renderer/src/App.tsx (2)
3309-3320: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
consecutiveAutoRejoinAttemptsRefis never reset on the default (web) streaming success path.The stable-session reset (
consecutiveAutoRejoinAttemptsRef.current = 0, with the comment "Session confirmed stable — reset auto-rejoin counter…") was added only insideactivateNativeInputForCurrentSession(Lines 3241-3243), which is exclusively triggered by native-streamer signaling events. The WebRTC"offer"success path here — the one used forstreamClientMode: "web", the default value (Line 494) — has no equivalent reset. This reproduces the exact previously-flagged bug ("cap blocks auto-rejoin permanently after 3 total attempts, not 3 consecutive failures") for the majority of users who are on the default web client mode, even though that issue is marked addressed.🐛 Proposed fix: mirror the native-path reset
setLaunchError(null); setStreamStatus("streaming"); markDiscordStreamStarted(); scheduleStableRecoveryReset(activeSession.sessionId); + // Session confirmed stable — reset auto-rejoin counter so it doesn't + // block future rejoins after successful sessions (mirrors native path). + consecutiveAutoRejoinAttemptsRef.current = 0; console.log(🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@opennow-stable/src/renderer/src/App.tsx` around lines 3309 - 3320, Reset consecutiveAutoRejoinAttemptsRef.current to 0 in the WebRTC offer success path immediately after the session is confirmed streaming, alongside setLaunchError, setStreamStatus, markDiscordStreamStarted, and scheduleStableRecoveryReset. Mirror the stable-session reset performed by activateNativeInputForCurrentSession so default web streaming success clears the auto-rejoin counter.
3078-3111: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winAuto-rejoin needs a live-URL fallback.
startAutoRejoinstill depends on the 15s prefetch cache, so a recovery-exhausted disconnect usually hits the no-cache branch and falls back to the same session-lost error. If this is meant to handle ordinary network drops too, fetch a freshstreamingBaseUrlhere instead of relying onprePingSmartUrlRef.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@opennow-stable/src/renderer/src/App.tsx` around lines 3078 - 3111, The auto-rejoin path should fetch a fresh streaming URL when the prefetch cache is empty instead of immediately calling launch(null). Update startAutoRejoin’s no-cached-URL branch to invoke the existing live URL resolver (such as getSmartAutoJoinBaseUrl), then pass its result to launch while preserving the existing error handling when resolution returns null.
🧹 Nitpick comments (1)
opennow-stable/src/renderer/src/App.tsx (1)
1694-1755: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAutoRejoin diagnostics bypass the shared logger.
All the new
[AutoRejoin]tracing (prefetch progress/errors here, and the verbose state dump instartAutoRejoin) goes through plainconsole.*calls instead of@shared/logger, so these diagnostics won't be captured by thelogs:exportflow users would use to report a failed rejoin.As per path instructions, "Use the shared logger (
@shared/logger) and export logs vialogs:exportIPC channel; avoid bypassing this path for diagnostics features."Also applies to: 3046-3113
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@opennow-stable/src/renderer/src/App.tsx` around lines 1694 - 1755, Replace the AutoRejoin diagnostic console.* calls in the shown prefetch flow and the verbose state dump in startAutoRejoin with the shared logger from `@shared/logger`. Preserve the existing messages and severity levels while routing them through the logger so logs:export can capture all AutoRejoin diagnostics; do not add parallel console logging.Source: Path instructions
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@opennow-stable/src/renderer/src/App.tsx`:
- Around line 1682-1756: Move the zone filtering, URL construction, ping/queue
scoring, and best-server selection out of the Auto-Rejoin useEffect in App.tsx
into the existing shared picker utility or main-process cloudmatch/IPC path.
Update both App.tsx and QueueServerSelectModal.tsx to reuse that single
implementation, leaving the effect responsible only for requesting the prefetch
result and storing best.routingUrl; preserve the existing standard-zone,
nuked-zone, and weighted-scoring behavior.
- Around line 1685-1691: Clear prePingSmartUrlRef and prePingInFlightRef in
resetLaunchRuntime so every session reset removes any unused prefetch state.
Ensure this covers manual stops, launch errors, logout, and play failures while
preserving the existing auto-rejoin success cleanup.
---
Outside diff comments:
In `@opennow-stable/src/renderer/src/App.tsx`:
- Around line 3309-3320: Reset consecutiveAutoRejoinAttemptsRef.current to 0 in
the WebRTC offer success path immediately after the session is confirmed
streaming, alongside setLaunchError, setStreamStatus, markDiscordStreamStarted,
and scheduleStableRecoveryReset. Mirror the stable-session reset performed by
activateNativeInputForCurrentSession so default web streaming success clears the
auto-rejoin counter.
- Around line 3078-3111: The auto-rejoin path should fetch a fresh streaming URL
when the prefetch cache is empty instead of immediately calling launch(null).
Update startAutoRejoin’s no-cached-URL branch to invoke the existing live URL
resolver (such as getSmartAutoJoinBaseUrl), then pass its result to launch while
preserving the existing error handling when resolution returns null.
---
Nitpick comments:
In `@opennow-stable/src/renderer/src/App.tsx`:
- Around line 1694-1755: Replace the AutoRejoin diagnostic console.* calls in
the shown prefetch flow and the verbose state dump in startAutoRejoin with the
shared logger from `@shared/logger`. Preserve the existing messages and severity
levels while routing them through the logger so logs:export can capture all
AutoRejoin diagnostics; do not add parallel console logging.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 90335c0a-290b-4f4d-9895-3a428351c8d4
📒 Files selected for processing (2)
opennow-stable/src/renderer/src/App.tsxopennow-stable/src/renderer/src/components/SettingsPage.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
- opennow-stable/src/renderer/src/components/SettingsPage.tsx
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 60d2e956ee
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 59e9451a12
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0d29ca51ac
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
37d25c3 to
cdadd58
Compare
cdadd58 to
6402285
Compare
Kief5555
left a comment
There was a problem hiding this comment.
Please review the comments. Please also remove or justify the reason of introducing a new DNS lookup just for auto rejoining.
There was a problem hiding this comment.
Pull request overview
Adds an opt-in “Auto Rejoin / Fast Queue Join” feature to the OpenNOW Electron client that, near free-tier session end, pings PrintedWaste zones, chooses a best region, and attempts to automatically relaunch the same game—plus a main-process DNS fallback for NVIDIA domains to improve reconnect reliability.
Changes:
- Introduces
enableFastQueueJoinsetting, UI toggle, and localized copy. - Centralizes PrintedWaste zone scoring logic (queue + ping weighting) and reuses it in the server select modal and auto-rejoin flow.
- Adds a main-process DNS interceptor that falls back to public DNS resolvers for NVIDIA hostnames on certain lookup failures.
Reviewed changes
Copilot reviewed 10 out of 10 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| opennow-stable/src/shared/gfn.ts | Adds enableFastQueueJoin to shared settings/contracts. |
| opennow-stable/src/renderer/src/lib/printedWaste.ts | Adds PrintedWaste zone URL builder + best-zone picker logic. |
| opennow-stable/src/renderer/src/components/SettingsPage.tsx | Adds “Auto Rejoin” toggle to settings UI. |
| opennow-stable/src/renderer/src/components/QueueServerSelectModal.tsx | Reuses shared PrintedWaste helpers; routes auto-choice via shared picker. |
| opennow-stable/src/renderer/src/App.tsx | Implements auto-rejoin prefetch + rejoin attempt flow using PrintedWaste + ping. |
| opennow-stable/src/main/settings.ts | Adds default/persisted setting for enableFastQueueJoin. |
| opennow-stable/src/main/services/printedWaste.ts | Switches PrintedWaste queue fetch to optional-proxy fetch + AbortController timeout. |
| opennow-stable/src/main/services/dnsInterceptor.ts | Adds DNS lookup interceptor with fallback resolution for NVIDIA hostnames. |
| opennow-stable/src/main/index.ts | Initializes the DNS interceptor early during main startup. |
| locales/en.json | Adds English strings for “Auto Rejoin” and hint text. |
- Remove dnsInterceptor and initDnsInterceptor - Add isPrintedWasteZoneFresh timestamp validation (5-minute max age) - Re-use in-flight prePingPromiseRef to avoid duplicate fetches - Preserve original connection-lost behavior on signaling failure - Lock autoRejoinSessionIdRef dedupe by session ID
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.
Comments suppressed due to low confidence (2)
opennow-stable/src/shared/gfn.ts:1073
- Same as the top-level Settings field: this comment currently claims "shortest queue" selection, but the feature is ping+queue weighted selection tied to auto-rejoin. Keeping the shared StreamSettings doc accurate matters because it is part of the cross-process contract.
/** Automatically select the GFN region with the shortest queue. */
enableFastQueueJoin?: boolean;
opennow-stable/src/main/services/printedWaste.ts:16
fetchPrintedWasteQueuenow acceptsproxyUrland routes throughfetchWithOptionalProxy, but the only call site in main (ipcMain.handle(IPC_CHANNELS.PRINTEDWASTE_QUEUE_FETCH, ...)) still calls it with justapp.getVersion(). As-is, this change doesn’t actually enable proxy/DNS-path behavior for PrintedWaste fetches (and is at odds with the PR description’s proxy improvements). Either wire the effective proxy URL into the IPC handler/service call, or drop the new parameter to avoid a misleading API surface.
export async function fetchPrintedWasteQueue(
appVersion: string,
proxyUrl?: string,
): Promise<PrintedWasteQueueData> {
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
What this does
When your free session ends instead of just kicking you back to the home screen the app automatically picks the best server and rejoins the same game for you
How it works
also fixes a dns issue if your ISP can't resolve nvidia servers (common in some regions) it falls back to cloudflare/google dns so the rejoin still works
How to turn it on
Settings -> Stream -> "Auto-Rejoin" toggle off by default
Summary by CodeRabbit