1 if ("serviceWorker" in navigator) {
2 navigator.serviceWorker.register("/$sw/wasm-host-sw.mjs", { type: "module", scope: "/", updateViaCache: "none" })
3 .then(function(reg) {
4 console.log("[sw-reg] registered, state:", reg.active ? reg.active.state : "no active", "installing:", !!reg.installing, "waiting:", !!reg.waiting);
5 reg.addEventListener("updatefound", function() {
6 var sw = reg.installing;
7 console.log("[sw-reg] updatefound, installing:", !!sw);
8 if (sw) sw.addEventListener("statechange", function() {
9 console.log("[sw-reg] statechange:", sw.state);
10 if (sw.state === "installed" && navigator.serviceWorker.controller) {
11 sw.postMessage("SKIP_WAITING");
12 }
13 });
14 });
15 }).catch(function(err) {
16 console.error("[sw-reg] registration FAILED:", err);
17 });
18 19 // The critical fix: wait for SW to be ready, then ensure it claims this page.
20 // On first load, controller is null because claim() hasn't completed yet.
21 // We use navigator.serviceWorker.ready (resolves when active SW exists),
22 // then send CLAIM via the active registration (not via controller).
23 navigator.serviceWorker.ready.then(function(reg) {
24 if (!navigator.serviceWorker.controller && reg.active) {
25 // SW is active but not controlling this page. Ask it to claim.
26 reg.active.postMessage("CLAIM");
27 }
28 });
29 30 // Track whether a SW was already controlling this page at load time.
31 // Only reload on controllerchange when replacing an old SW (update),
32 // not on first activation (no stale cache to flush).
33 var hadController = !!navigator.serviceWorker.controller;
34 35 navigator.serviceWorker.addEventListener("controllerchange", function() {
36 if (window.__swFlush) window.__swFlush();
37 if (!hadController) {
38 hadController = true;
39 return;
40 }
41 if (!sessionStorage.getItem("sw-reload-fired")) {
42 sessionStorage.setItem("sw-reload-fired", String(Date.now()));
43 setTimeout(function() { sessionStorage.removeItem("sw-reload-fired"); }, 30000);
44 console.log("[sw-reg] controllerchange: reloading to pick up updated cache");
45 location.reload();
46 }
47 });
48 }
49