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 {