Files
WhoPays/public/serviceworker.js
2026-02-08 19:53:46 +01:00

114 lines
3.1 KiB
JavaScript

const CACHE_NAME = "whopays-v2";
const urlsToCache = [
"/",
"/index.html",
"/style.css",
"/script.js",
"/manifest.json"
];
console.log("🔧 Service Worker: Loading...");
// Install event
self.addEventListener("install", (event) => {
console.log("⚙️ Service Worker: Installing...");
event.waitUntil(
caches.open(CACHE_NAME)
.then((cache) => {
console.log("✅ Service Worker: Cache opened");
// Try to cache files, but don't fail if some are missing
return Promise.allSettled(
urlsToCache.map(url =>
cache.add(url).catch(err => {
console.warn(`⚠️ Failed to cache: ${url}`, err);
return null;
})
)
);
})
.then(() => {
console.log("✅ Service Worker: Installed");
})
.catch(err => {
console.error("❌ Service Worker: Install failed", err);
})
);
self.skipWaiting();
});
// Activate event
self.addEventListener("activate", (event) => {
console.log("🔄 Service Worker: Activating...");
event.waitUntil(
caches.keys().then((cacheNames) => {
return Promise.all(
cacheNames.map((cacheName) => {
if (cacheName !== CACHE_NAME) {
console.log(`🗑️ Service Worker: Deleting old cache: ${cacheName}`);
return caches.delete(cacheName);
}
})
);
}).then(() => {
console.log("✅ Service Worker: Activated");
})
);
self.clients.claim();
});
// Fetch event
self.addEventListener("fetch", (event) => {
const url = new URL(event.request.url);
// Network first for API calls
if (url.pathname.startsWith("/status") || url.pathname.startsWith("/toggle")) {
event.respondWith(
fetch(event.request)
.catch(() => {
console.warn("⚠️ API offline, returning error");
return new Response(
JSON.stringify({ error: "Offline" }),
{
headers: { "Content-Type": "application/json" },
status: 503
}
);
})
);
return;
}
// Cache first for static assets
event.respondWith(
caches.match(event.request)
.then((response) => {
if (response) {
return response;
}
return fetch(event.request).then((fetchResponse) => {
// Only cache successful responses
if (!fetchResponse || fetchResponse.status !== 200 || fetchResponse.type !== 'basic') {
return fetchResponse;
}
const responseToCache = fetchResponse.clone();
caches.open(CACHE_NAME).then((cache) => {
cache.put(event.request, responseToCache);
});
return fetchResponse;
});
})
.catch((err) => {
console.warn("⚠️ Fetch failed:", err);
// Fallback for navigation requests
if (event.request.mode === 'navigate') {
return caches.match('/index.html');
}
return new Response('Offline', { status: 503 });
})
);
});
console.log("✅ Service Worker: Script loaded");