Made progressive web app installable

This commit is contained in:
2026-05-12 17:09:27 +02:00
parent 7d9328b865
commit 06398e98e2
6 changed files with 71 additions and 56 deletions

View File

@@ -1,57 +1,26 @@
/* coi-serviceworker.js */
/* coi-serviceworker.js - Cross-Origin Isolation + PWA support */
if (typeof window === "undefined") {
// Código del Worker: Intercepta peticiones
self.addEventListener("install", () => self.skipWaiting());
// Service Worker context
self.addEventListener("install", () => self.skipWaiting());
self.addEventListener("activate", (event) =>
event.waitUntil(self.clients.claim())
);
self.addEventListener("activate", (event) =>
event.waitUntil(self.clients.claim())
);
self.addEventListener("fetch", (event) => {
if (event.request.method !== "GET") return;
event.respondWith(
fetch(event.request)
.then((response) => {
if (response.status === 0) return response;
const newHeaders = new Headers(response.headers);
newHeaders.set("Cross-Origin-Embedder-Policy", "require-corp");
newHeaders.set("Cross-Origin-Opener-Policy", "same-origin");
newHeaders.set("Cross-Origin-Resource-Policy", "cross-origin");
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: newHeaders,
});
})
.catch(() => fetch(event.request))
);
});
} else {
// Código de la Ventana: Registra el worker y recarga
(function () {
if ("serviceWorker" in navigator) {
navigator.serviceWorker
.register(window.document.currentScript.src)
.then((registration) => {
registration.addEventListener("updatefound", () => {
// Si hay una actualización, recargamos
location.reload();
});
if (registration.active && !navigator.serviceWorker.controller) {
// Si el worker está activo pero no controla la página aún, recargamos
location.reload();
}
});
}
// Si ya estamos aislados, perfecto
if (window.crossOriginIsolated) {
console.log("Aislamiento de origen ACTIVADO");
}
})();
}
self.addEventListener("fetch", (event) => {
if (event.request.method !== "GET") return;
event.respondWith(
fetch(event.request).then((response) => {
if (response.status === 0 || response.type === "opaque") return response;
const headers = new Headers(response.headers);
headers.set("Cross-Origin-Embedder-Policy", "require-corp");
headers.set("Cross-Origin-Opener-Policy", "same-origin");
headers.set("Cross-Origin-Resource-Policy", "cross-origin");
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers,
});
}).catch(() => fetch(event.request))
);
});