From 79b91aad92be28e37877541a1038b657783e58a2 Mon Sep 17 00:00:00 2001 From: Julien Oculi Date: Fri, 19 Jul 2024 14:58:55 +0200 Subject: [PATCH] feat(pwa): :sparkles: handle new fetch strategies --- src/serviceworker/mod.ts | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/src/serviceworker/mod.ts b/src/serviceworker/mod.ts index bbcee04..6f75fd9 100644 --- a/src/serviceworker/mod.ts +++ b/src/serviceworker/mod.ts @@ -136,31 +136,24 @@ async function fetchHandler(event: FetchEvent) { updatePreCache() // TODO handle search params - const ac = new AbortController() - - const preCachedNoSearch = preCache - .match(event.request, { ignoreSearch: true }) - .then((response) => { - if (response) { - ac.abort() - return response - } - throw new Error(`no cache available for pre-cached-url "${url}"`) - }) - - return Promise.any([ - FetchStrategy.fastestAndCacheRefresh(preCache, event, ac), - preCachedNoSearch, - ]) + return FetchStrategy.cacheFirst(preCache, event, { ignoreSearch: true }) } - // Fastest and cache refresh - if (url.origin === location.origin && method === 'GET') { - const cache = await getDynCache() - FetchStrategy.fastestAndCacheRefresh(cache, event) + // Allow offline API results + if (url.pathname.startsWith('/api/')) { + const cache = await getCache('$sw.api-cache.version') + return FetchStrategy.networkFirst(cache, event) } -async function getCache(name: string, lifeTime = 1 * 24 * 3_600 * 1000): Promise { + // Cache first else fetch and cache refresh + const cache = await getCache('$sw.dyn-cache.version') + return FetchStrategy.cacheFirst(cache, event) +} + +async function getCache( + name: string, + lifeTime = 1 * 24 * 3_600 * 1000, +): Promise { const now = Date.now() const version = await swStorage.getItem(name)