/*! coi-serviceworker v0.1.7 - Guido Zuidhof, licensed under MIT */ const isChromium = typeof navigator !== 'undefined' && /Chrome/.test(navigator.userAgent); let coepCredentialless = isChromium; if (typeof window === 'undefined') { self.addEventListener("install", () => self.skipWaiting()); self.addEventListener("activate", (event) => event.waitUntil(self.clients.claim())); self.addEventListener("message", (ev) => { if (!ev.data) { return; } else if (ev.data.type === "deregister") { self.registration.unregister().then(() => { return self.clients.matchAll(); }).then(clients => { clients.forEach((client) => client.navigate(client.url)); }); } }); self.addEventListener("fetch", function (event) { const r = event.request; if (r.cache === "only-if-cached" && r.mode !== "same-origin") { return; } const coep = coepCredentialless ? "credentialless" : "require-corp"; event.respondWith( fetch(r).then((response) => { if (response.status === 0) { return response; } const newHeaders = new Headers(response.headers); newHeaders.set("Cross-Origin-Embedder-Policy", coep); newHeaders.set("Cross-Origin-Opener-Policy", "same-origin"); return new Response(response.body, { status: response.status, statusText: response.statusText, headers: newHeaders, }); }) ); }); } else { // Adapter for client code (async function () { if (window.crossOriginIsolated) { console.log("Integrity check: crossOriginIsolated is true. COI active."); return; } // Guard against infinite loops if (window.sessionStorage.getItem("coiReloaded")) { console.warn("COI Service Worker reloaded but privacy headers are still missing. GitHub Pages or browser restrictions might be interfering with SharedArrayBuffer."); // We do NOT return here effectively, we let it try to register again just in case, // but we stop the RELOAD loop below. } const n = navigator; if (n.serviceWorker) { try { // Ensure we register with the correct relative path const registration = await n.serviceWorker.register(window.document.currentScript.src || "./coi-serviceworker.js"); console.log("COI SW Registered"); // If it's already active, (and we aren't isolated), we might need a reload. // But check the loop guard. if (registration.active && !n.serviceWorker.controller) { console.log("COI SW Active, checking reload guard..."); if (!window.sessionStorage.getItem("coiReloaded")) { window.sessionStorage.setItem("coiReloaded", "true"); console.log("Reloading to activate COI..."); window.location.reload(); } } registration.addEventListener("updatefound", () => { const worker = registration.installing; worker.addEventListener("statechange", () => { if (worker.state === "activated" && !n.serviceWorker.controller) { if (!window.sessionStorage.getItem("coiReloaded")) { window.sessionStorage.setItem("coiReloaded", "true"); console.log("COI SW Activated, reloading..."); window.location.reload(); } } }); }); } catch (err) { console.error("COI SW Register Failed", err); } } })(); }