From 5bb693e8f6dd2d0201df96d62885dca523d8ebb7 Mon Sep 17 00:00:00 2001 From: admin <572701190@qq.com> Date: Mon, 18 May 2026 16:25:30 +0800 Subject: [PATCH] clear reactive resume service worker cache --- ...ch-reactive-resume-service-worker-cache.sh | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100755 scripts/patch-reactive-resume-service-worker-cache.sh diff --git a/scripts/patch-reactive-resume-service-worker-cache.sh b/scripts/patch-reactive-resume-service-worker-cache.sh new file mode 100755 index 0000000..785ff89 --- /dev/null +++ b/scripts/patch-reactive-resume-service-worker-cache.sh @@ -0,0 +1,94 @@ +#!/bin/sh +set -eu + +CONTAINER="${1:-reactive-resume-reactive-resume-1}" + +docker exec -u root -i "$CONTAINER" sh <<'SH' +set -eu + +SSR_FILE="/app/apps/web/.output/server/_ssr/pdf-document-COfeOLVC.mjs" +SW_FILE="/app/apps/web/.output/public/sw.js" + +cp "$SSR_FILE" "$SSR_FILE.bak-sw-cache" 2>/dev/null || true +cp "$SW_FILE" "$SW_FILE.bak-sw-cache" 2>/dev/null || true + +node - <<'NODE' +const fs = require("fs"); + +const ssrFile = "/app/apps/web/.output/server/_ssr/pdf-document-COfeOLVC.mjs"; +const swFile = "/app/apps/web/.output/public/sw.js"; + +const registrationScript = ` +\tif ("serviceWorker" in navigator) { +\t\twindow.addEventListener("load", () => { +\t\t\tconst clearReactiveResumeCaches = async () => { +\t\t\t\tif ("caches" in window) { +\t\t\t\t\tconst keys = await caches.keys(); +\t\t\t\t\tawait Promise.all(keys.map((key) => caches.delete(key))); +\t\t\t\t} + +\t\t\t\tif (navigator.serviceWorker.getRegistrations) { +\t\t\t\t\tconst registrations = await navigator.serviceWorker.getRegistrations(); +\t\t\t\t\tawait Promise.all(registrations.map((registration) => registration.unregister())); +\t\t\t\t} +\t\t\t}; + +\t\t\tclearReactiveResumeCaches().then(() => { +\t\t\t\tif (navigator.serviceWorker.controller && !sessionStorage.getItem("rr-sw-cache-cleared-v1")) { +\t\t\t\t\tsessionStorage.setItem("rr-sw-cache-cleared-v1", "1"); +\t\t\t\t\twindow.location.reload(); +\t\t\t\t} +\t\t\t}).catch(console.error); +\t\t}); +\t} +`; + +let ssr = fs.readFileSync(ssrFile, "utf8"); +const start = "var pwaServiceWorkerRegistrationScript = `"; +const end = "`;\nvar src_default ="; +const startIndex = ssr.indexOf(start); +if (startIndex === -1) { + throw new Error("Service worker registration script start marker not found"); +} +const endIndex = ssr.indexOf(end, startIndex + start.length); +if (endIndex === -1) { + throw new Error("Service worker registration script end marker not found"); +} + +ssr = + ssr.slice(0, startIndex) + + start + + registrationScript + + ssr.slice(endIndex); +fs.writeFileSync(ssrFile, ssr); + +const sw = `self.addEventListener("install", () => { + self.skipWaiting(); +}); + +self.addEventListener("activate", (event) => { + event.waitUntil((async () => { + const keys = await caches.keys(); + await Promise.all(keys.map((key) => caches.delete(key))); + await self.registration.unregister(); + await self.clients.claim(); + + const clients = await self.clients.matchAll({ + type: "window", + includeUncontrolled: true, + }); + + for (const client of clients) { + client.postMessage({ type: "RR_SW_CACHE_CLEARED" }); + } + })()); +}); + +self.addEventListener("fetch", () => {}); +`; +fs.writeFileSync(swFile, sw); +NODE + +node --check "$SSR_FILE" >/dev/null +node --check "$SW_FILE" >/dev/null +SH