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 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) => {
|
||||||
|
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
|
// 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> {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue