diff --git a/src/serviceworker/mod.ts b/src/serviceworker/mod.ts index ec44acb..f2ed276 100644 --- a/src/serviceworker/mod.ts +++ b/src/serviceworker/mod.ts @@ -1,9 +1,10 @@ /// /// +import type { JsonValue } from '$std/json/common.ts' import { ApiPayload } from ':src/utils.ts' import type { PrecacheResponse } from '../../routes/api/serviceworker/precache.tsx' -import type { JsonValue } from '$std/json/common.ts' +import { FetchStrategy } from './src/fetch_strategy.ts' // Force load service worker types const self = globalThis as unknown as ServiceWorkerGlobalScope @@ -126,39 +127,32 @@ async function fetchHandler(event: FetchEvent) { updatePreCache() // TODO handle search params - const cached = await preCache.match(event.request) ?? - await fetch(event.request).then((response) => - response.ok ? response : null - ).catch(() => null) ?? - await preCache.match(event.request, { ignoreSearch: true }) + const ac = new AbortController() - if (cached === undefined) { - throw new Error(`no cache available for pre-cached-url "${url}"`) - } - return cached + 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.race([ + FetchStrategy.fastestAndCacheRefresh(preCache, event, ac), + preCachedNoSearch, + ]) } // Fastest and cache refresh if (url.origin === location.origin && method === 'GET') { const cache = await getDynCache() - - // 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]) + FetchStrategy.fastestAndCacheRefresh(cache, event) } // Network only - return fetch(event.request) + return FetchStrategy.networkOnly(event) } async function getDynCache(): Promise {