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