feat(pwa): ♻️ use strategies from FetchStrategy instead of inline code
This commit is contained in:
parent
e0cc73b6a7
commit
79c0d49cad
|
|
@ -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}"`)
|
||||
const preCachedNoSearch = preCache
|
||||
.match(event.request, { ignoreSearch: true })
|
||||
.then((response) => {
|
||||
if (response) {
|
||||
ac.abort()
|
||||
return response
|
||||
}
|
||||
return cached
|
||||
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> {
|
||||
|
|
|
|||
Loading…
Reference in a new issue