feat(pwa): ♻️ use strategies from FetchStrategy instead of inline code

This commit is contained in:
Julien Oculi 2024-07-18 16:15:04 +02:00
parent e0cc73b6a7
commit 79c0d49cad

View file

@ -1,9 +1,10 @@
/// <reference no-default-lib="true"/>
/// <reference lib="webworker" />
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<Cache> {