fix: force PWA worker updates
This commit is contained in:
@@ -303,15 +303,32 @@ function shouldReportNotFound(pathname: string): boolean {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export const PWA_CLIENT = `if ("serviceWorker" in navigator) {
|
export function renderPwaClient(version = "2") {
|
||||||
var swUrl = "/sw.js";
|
return `if ("serviceWorker" in navigator) {
|
||||||
|
var swVersion = ${JSON.stringify(version)};
|
||||||
|
var swUrl = "/sw.js?v=" + encodeURIComponent(swVersion);
|
||||||
if (window.trustedTypes) {
|
if (window.trustedTypes) {
|
||||||
try {
|
try {
|
||||||
swUrl = window.trustedTypes.createPolicy("wrnexus-pwa", { createScriptURL: function(value) { return value; } }).createScriptURL(swUrl);
|
swUrl = window.trustedTypes.createPolicy("wrnexus-pwa", { createScriptURL: function(value) { return value; } }).createScriptURL(swUrl);
|
||||||
} catch (_) {}
|
} catch (_) {}
|
||||||
}
|
}
|
||||||
addEventListener("load", () => navigator.serviceWorker.register(swUrl).catch(() => {}));
|
var reloading = false;
|
||||||
|
navigator.serviceWorker.addEventListener("controllerchange", function () {
|
||||||
|
var key = "wrnexus-pwa-controller-" + swVersion;
|
||||||
|
if (reloading || sessionStorage.getItem(key)) return;
|
||||||
|
reloading = true;
|
||||||
|
sessionStorage.setItem(key, "1");
|
||||||
|
location.reload();
|
||||||
|
});
|
||||||
|
addEventListener("load", function () {
|
||||||
|
navigator.serviceWorker.register(swUrl, { updateViaCache: "none" }).then(function (registration) {
|
||||||
|
return registration.update();
|
||||||
|
}).catch(function () {});
|
||||||
|
});
|
||||||
}`;
|
}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const PWA_CLIENT = renderPwaClient();
|
||||||
|
|
||||||
export const PWA_DEV_CLEANUP_CLIENT = `if ("serviceWorker" in navigator && !sessionStorage.getItem("wrnexus-pwa-dev-cleaned")) {
|
export const PWA_DEV_CLEANUP_CLIENT = `if ("serviceWorker" in navigator && !sessionStorage.getItem("wrnexus-pwa-dev-cleaned")) {
|
||||||
sessionStorage.setItem("wrnexus-pwa-dev-cleaned", "1");
|
sessionStorage.setItem("wrnexus-pwa-dev-cleaned", "1");
|
||||||
@@ -1032,7 +1049,7 @@ export function createHandlers(deps: RuntimeDeps): Handlers {
|
|||||||
}
|
}
|
||||||
if (url.pathname === "/__wrnexus/pwa.js" && pwaServiceWorkerEnabled) {
|
if (url.pathname === "/__wrnexus/pwa.js" && pwaServiceWorkerEnabled) {
|
||||||
return secure(
|
return secure(
|
||||||
new Response(PWA_CLIENT, {
|
new Response(renderPwaClient(deps.assetVersion ?? "2"), {
|
||||||
headers: {
|
headers: {
|
||||||
"content-type": "text/javascript; charset=utf-8",
|
"content-type": "text/javascript; charset=utf-8",
|
||||||
"cache-control": url.searchParams.has("v")
|
"cache-control": url.searchParams.has("v")
|
||||||
|
|||||||
@@ -5,6 +5,9 @@ test("PWA registration is valid JavaScript and Trusted Types compatible", () =>
|
|||||||
expect(() => new Bun.Transpiler({ loader: "js" }).transformSync(PWA_CLIENT)).not.toThrow();
|
expect(() => new Bun.Transpiler({ loader: "js" }).transformSync(PWA_CLIENT)).not.toThrow();
|
||||||
expect(PWA_CLIENT).toContain('createPolicy("wrnexus-pwa"');
|
expect(PWA_CLIENT).toContain('createPolicy("wrnexus-pwa"');
|
||||||
expect(PWA_CLIENT).toContain("createScriptURL(swUrl)");
|
expect(PWA_CLIENT).toContain("createScriptURL(swUrl)");
|
||||||
|
expect(PWA_CLIENT).toContain('register(swUrl, { updateViaCache: "none" })');
|
||||||
|
expect(PWA_CLIENT).toContain("registration.update()");
|
||||||
|
expect(PWA_CLIENT).toContain('addEventListener("controllerchange"');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("development PWA cleanup removes stale WRNexus service workers and caches", () => {
|
test("development PWA cleanup removes stale WRNexus service workers and caches", () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user