sw-register.js raw

   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