From d7716a88a8857e0c9f15b92b95a153627871d7af Mon Sep 17 00:00:00 2001 From: Julien Oculi Date: Thu, 18 Jul 2024 14:19:41 +0200 Subject: [PATCH] perf(pwa): :zap: change cache strategy for non-pre-cached resources --- src/serviceworker/mod.ts | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/serviceworker/mod.ts b/src/serviceworker/mod.ts index ff3eaec..c5768f8 100644 --- a/src/serviceworker/mod.ts +++ b/src/serviceworker/mod.ts @@ -110,21 +110,28 @@ async function fetchHandler(event: FetchEvent) { return cached } - // Cache first and refresh + // Fastest and cache refresh if (url.origin === location.origin && method === 'GET') { - const cached = await cache.match(event.request) + const cache = await getDynCache() - const response = fetch(event.request) - .then((response) => { - if (!response.ok) { - throw new Error( - `failed to get request: [${response.status}] ${response.statusText}`, - ) - } - // Update cache if ok - cache.put(event.request, response.clone()) - return response - }) + // Get cache or throw + const cachedOrError = cache.match(event.request).then((response) => { + if (response) return response + throw new Error(`no cache available for "${url}"`) + }) + // Fetch and cache + const fetchedAndCached = fetch(event.request).then((response) => { + cache.put(event.request, response.clone()) + return response + }) + + // Get fastest + return Promise.race([cachedOrError, fetchedAndCached]) + } + + // Network only + return fetch(event.request) +} async function getDynCache(): Promise { const version = await swStorage.getItem('$sw.dyn-cache.version') // Create cache