sw-register.js raw
1 if ("serviceWorker" in navigator) {
2 navigator.serviceWorker.register("/$sw/$entry.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.update().catch(function() {});
6 reg.addEventListener("updatefound", function() {
7 var sw = reg.installing;
8 console.log("[sw-reg] updatefound, installing:", !!sw);
9 if (sw) sw.addEventListener("statechange", function() {
10 console.log("[sw-reg] statechange:", sw.state);
11 if (sw.state === "installed" && navigator.serviceWorker.controller) {
12 sw.postMessage("SKIP_WAITING");
13 }
14 });
15 });
16 }).catch(function(err) {
17 console.error("[sw-reg] registration FAILED:", err);
18 });
19
20 // The critical fix: wait for SW to be ready, then ensure it claims this page.
21 // On first load, controller is null because claim() hasn't completed yet.
22 // We use navigator.serviceWorker.ready (resolves when active SW exists),
23 // then send CLAIM via the active registration (not via controller).
24 navigator.serviceWorker.ready.then(function(reg) {
25 if (!navigator.serviceWorker.controller && reg.active) {
26 // SW is active but not controlling this page. Ask it to claim.
27 reg.active.postMessage("CLAIM");
28 }
29 });
30
31 navigator.serviceWorker.addEventListener("controllerchange", function() {
32 if (window.__swFlush) window.__swFlush();
33 });
34 }
35