fix(offline): set the auto flag in setOfflineMode; remove temp diagnostic
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Has been skipped
CI / integration (pull_request) Has been skipped
CI / ui (pull_request) Successful in 1m10s
CI / conformance (pull_request) Successful in 10s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m51s

The auto-offline -> online return was dead because setOfflineMode never set the
'auto' flag: I added the state + getter but forgot the assignment, so it stayed
false. So scheduleRecovery bailed immediately (no poll ran) and the online event's
'if (active && auto)' was false. The contour diagnostic confirmed offline.auto
stayed false after an auto-offline. Add 'auto = on && !persist'.

Also remove the temporary network diagnostic panel (netdiag + the lobby strip) --
it did its job of pinpointing this.
This commit is contained in:
Ilia Denisov
2026-07-06 19:20:59 +02:00
parent 09c5a5e72e
commit 3ad66f49c7
4 changed files with 4 additions and 61 deletions
+3 -13
View File
@@ -57,7 +57,6 @@ import {
import type { CoachSeries } from './coachmark';
import { connection, reportOffline, reportOnline, resetConnection, checkReachable } from './connection.svelte';
import { offlineMode, setOfflineMode } from './offline.svelte';
import { netlog } from './netdiag.svelte'; // TEMP diagnostic
import { shouldBootOffline } from './offline';
import { isConnectionCode } from './retry';
import { clearGameCache, getCachedGame, setCachedGame } from './gamecache';
@@ -604,15 +603,9 @@ export function scheduleRecovery(delayMs: number): void {
recoveryTimer = null;
if (!offlineMode.active || !offlineMode.auto) return;
const interfaceUp = typeof navigator === 'undefined' || navigator.onLine;
netlog(`poll tick: navOnline=${interfaceUp}`); // TEMP diagnostic
if (interfaceUp) {
const reachable = await checkReachable(BOOT_REACHABILITY_TIMEOUT_MS);
netlog(`checkReachable=${reachable}`); // TEMP diagnostic
if (reachable && offlineMode.active && offlineMode.auto) {
setOfflineMode(false);
netlog('-> RETURNED ONLINE'); // TEMP diagnostic
return;
}
if (interfaceUp && (await checkReachable(BOOT_REACHABILITY_TIMEOUT_MS))) {
if (offlineMode.active && offlineMode.auto) setOfflineMode(false);
return;
}
scheduleRecovery(4000);
}, delayMs);
@@ -621,17 +614,14 @@ export function scheduleRecovery(delayMs: number): void {
export function initNetworkReactivity(): void {
if (typeof window === 'undefined' || import.meta.env.MODE === 'mock') return;
window.addEventListener('offline', () => {
netlog(`offline EVENT (active=${offlineMode.active})`); // TEMP diagnostic
if (!offlineMode.active) {
setOfflineMode(true, false); // auto (session)
netlog('-> auto-offline; poll started'); // TEMP diagnostic
scheduleRecovery(4000); // poll for the network to return
}
});
// The online event, when it fires, just kicks an immediate reachability check; the poll above is
// the reliable fallback for platforms where it does not fire.
window.addEventListener('online', () => {
netlog(`online EVENT (active=${offlineMode.active} auto=${offlineMode.auto})`); // TEMP diagnostic
if (offlineMode.active && offlineMode.auto) scheduleRecovery(0);
});
}