fix(offline): hotseat review fixes + PWA stale-shell (SW route order)
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 1m6s
CI / conformance (pull_request) Successful in 10s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m44s
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 1m6s
CI / conformance (pull_request) Successful in 10s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m44s
Owner review of the pass-and-play PR: - Roster delete (bug): a correct host PIN now ARMS a delete cross next to the row (mirroring the lobby delete) instead of removing it silently; tapping the kebab again clears the host authorisation. - Variant picker (UX): replace the dropdown with the Quick-Match variant plaques + the multiple-words toggle, one-to-one. - Keyboard layout (UX): the roster sits in a scroll region with the Start button pinned (friends-form pattern), so a name input's soft keyboard shrinks the region instead of leaving a full-height blank spacer painted behind the keyboard. - e2e: variant via plaque + a row-delete (arm then cross) regression step. PWA stale-version (pre-existing, same PR): - sw.ts: register the network-first NavigationRoute BEFORE precacheAndRoute. Workbox matches in registration order and the precache route (directoryIndex index.html) shadowed the shell navigation, serving it cache-first — the old build's __APP_VERSION__ until a second load. Fixes both the maintenance self-reload and a cold open after a deploy. Doc updated (ARCHITECTURE).
This commit is contained in:
+13
-5
@@ -24,17 +24,19 @@ clientsClaim();
|
||||
// Drop precaches left by a previous SW revision (including the old install-only shell cache).
|
||||
cleanupOutdatedCaches();
|
||||
|
||||
// Precache the shell + hashed assets injected at build time — exactly what a cold offline launch
|
||||
// needs. The landing page and the old-engine polyfill bundle are excluded via the build globs.
|
||||
precacheAndRoute(self.__WB_MANIFEST);
|
||||
|
||||
// Navigations are network-first so a new deploy loads immediately when online: fetch the fresh
|
||||
// (no-cache) shell from the server — it references the new hashed assets, which are then fetched
|
||||
// fresh — and only fall back to the precached shell when the network is unreachable or too slow (a
|
||||
// short timeout). This keeps the app up to date online while still cold-launching offline. Only the
|
||||
// tiny HTML is re-fetched; the immutable hashed assets stay cache-first (precacheAndRoute above) and
|
||||
// tiny HTML is re-fetched; the immutable hashed assets stay cache-first (precacheAndRoute below) and
|
||||
// re-download only when their hash — i.e. the version — changes. Deny-list the RPC path and the
|
||||
// admin console so those are never resolved to the app shell.
|
||||
//
|
||||
// This route MUST be registered BEFORE precacheAndRoute: Workbox matches routes in registration
|
||||
// order, and the precache route matches shell navigations too (its directoryIndex is index.html), so
|
||||
// registering it first would shadow this handler and serve the shell CACHE-FIRST — i.e. the old
|
||||
// build's version until the next load. NavigationRoute matches only request.mode === 'navigate', so
|
||||
// hashed-asset requests still fall through to the cache-first precache route below.
|
||||
const NAV_TIMEOUT_MS = 3000;
|
||||
async function freshShell({ request }: { request: Request }): Promise<Response> {
|
||||
const ctrl = new AbortController();
|
||||
@@ -50,3 +52,9 @@ async function freshShell({ request }: { request: Request }): Promise<Response>
|
||||
return (await matchPrecache('index.html')) ?? Response.error();
|
||||
}
|
||||
registerRoute(new NavigationRoute(freshShell, { denylist: [/^\/scrabble\.edge\.v1\.Gateway/, /^\/_gm\//] }));
|
||||
|
||||
// Precache the shell + hashed assets injected at build time — exactly what a cold offline launch
|
||||
// needs (the precached index.html is also the offline fallback matchPrecache serves above). The
|
||||
// immutable hashed assets stay cache-first here; the landing page and the old-engine polyfill bundle
|
||||
// are excluded via the build globs.
|
||||
precacheAndRoute(self.__WB_MANIFEST);
|
||||
|
||||
Reference in New Issue
Block a user