clear reactive resume service worker cache

This commit is contained in:
2026-05-18 16:25:30 +08:00
parent 8a21a46554
commit 5bb693e8f6

View File

@@ -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