const cachable_api = [ '/image/', '/profile/', ]; const is_cachable = (url) => { if (!url.includes('/api/') || url.endsWith('.js')) { return true; } for (const api of cachable_api) { if (url.includes(api)) { return true; } } return false; } const put_in_cache = async (request, response) => { const cache = await caches.open("v1"); await cache.put(request, response); }; const cache_first = async (request, event) => { if (request.method !== 'GET') { return await fetch(request); } if (!is_cachable(request.url)) { return await fetch(request); } const responseFromCache = await caches.match(request); if (responseFromCache) { return responseFromCache; } const responseFromNetwork = await fetch(request); event.waitUntil(put_in_cache(request, responseFromNetwork.clone())); return responseFromNetwork; }; self.addEventListener("fetch", (event) => { event.respondWith(cache_first(event.request, event)); });