The service worker's proxy fallback only matched the wrapped "Offline"
error from HttpSpacePrimitives, but raw fetch() throws browser-native
errors like
"Failed to fetch" (Chrome), "NetworkError..." (Firefox), or "Load
failed"
(Safari). This caused a hard 503 instead of falling through to serve
local
data. Additionally, the `fullSyncConfirmed` flag reset on every service
worker
restart, forcing unnecessary proxying even when synced data existed in
IndexedDB.
In this commit:
- Use `isNetworkError()` in proxy_router.ts to catch all browser network
errors
and fall through to local serving instead of returning 503
* Recover `fullSyncConfirmed` from persisted sync snapshot on SW
restart, so
previously synced spaces serve locally immediately
* Adds e2e tests trying to emulate this behavior and prevent regressions
When the server returns HTTP 500 or other 5xx errors, the client
was caching the error HTML page (e.g., Nginx error pages) and
attempting to parse it as JSON on boot, causing a lockout with
the message 'Could not process config and no cached copy'.
This fix adds all standard 5xx server error codes to the
offlineStatusCodes list, ensuring the client enters offline mode
and uses cached data instead of caching error responses.
Before: Only 502, 503, 504, 530 triggered offline mode
After: All 5xx errors (500-511, 530) trigger offline mode
Fixes#1724