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