114 lines
3.1 KiB
JavaScript
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"); |