lexivo/app/views/pwa/service-worker.js
2026-03-30 13:18:39 +02:00

40 lines
1.0 KiB
JavaScript

// Network-first strategy with offline fallback for PWA standalone mode
const CACHE_NAME = "rails-8-starter-offline";
const OFFLINE_URL = "/offline.html";
// Pre-cache the offline fallback page on install
self.addEventListener("install", (event) => {
event.waitUntil(
caches.open(CACHE_NAME).then((cache) => cache.add(OFFLINE_URL))
);
self.skipWaiting();
});
// Clean up old caches on activate
self.addEventListener("activate", (event) => {
event.waitUntil(
caches.keys().then((keys) =>
Promise.all(
keys
.filter((key) => key !== CACHE_NAME)
.map((key) => caches.delete(key))
)
)
);
self.clients.claim();
});
// Network-first for navigation requests; fallback to offline page on failure
self.addEventListener("fetch", (event) => {
if (event.request.mode !== "navigate") return;
const url = new URL(event.request.url);
event.respondWith(
fetch(event.request).catch(() =>
caches.match(OFFLINE_URL).then((cached) => cached || new Response("Offline", { status: 503 }))
)
);
});