const API_CACHE_NAME = 'api-cache-v1' const API_URL_PATTERN = /\/api\/(GetStopList)/; const API_MAX_AGE = 72 * 60 * 60 * 1000; // 72 hours self.addEventListener('install', (event) => { event.waitUntil(self.skipWaiting()); }); self.addEventListener('activate', (event) => { event.waitUntil(self.clients.claim()); }); self.addEventListener('fetch', async (event) => { const url = new URL(event.request.url); if (event.request.method !== "GET" || !API_URL_PATTERN.test(url.pathname)) { return; } event.respondWith(apiCacheFirst(event.request)); }); async function apiCacheFirst(request) { const cache = await caches.open(API_CACHE_NAME); const cachedResponse = await cache.match(request); if (cachedResponse) { const age = Date.now() - new Date(cachedResponse.headers.get('date')).getTime(); if (age < API_MAX_AGE) { console.debug(`SW: Cache HIT for ${request.url}`); return cachedResponse; } // Cache is too old, fetch a fresh copy cache.delete(request); } try { const netResponse = await fetch(request); const responseToCache = netResponse.clone(); cache.put(request, responseToCache); console.debug(`SW: Cache MISS for ${request.url}`); return netResponse; } catch (error) { throw error; } }