feat(pwa): ✨ add new sw "fastest and cache refresh" fetch strategy
This commit is contained in:
parent
9bf6d9596c
commit
77f9ae3518
|
|
@ -27,6 +27,35 @@ export class Strategy {
|
||||||
return this.#cache.match(request)
|
return this.#cache.match(request)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fastestAndCacheRefresh(
|
||||||
|
{ request, preloadResponse }: Pick<FetchEvent, 'request' | 'preloadResponse'>,
|
||||||
|
ac: AbortController = new AbortController()
|
||||||
|
) {
|
||||||
|
// Get cache or throw
|
||||||
|
const cachedOrError = this.#cache.match(request)
|
||||||
|
.then((response) => {
|
||||||
|
if (response) {
|
||||||
|
// Abort network request
|
||||||
|
ac.abort()
|
||||||
|
return response
|
||||||
|
}
|
||||||
|
throw new Error(`no cache available for "${request.url}"`)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Fetch and cache
|
||||||
|
const fetchedAndCached = this.networkOnly({ request, preloadResponse}, ac)
|
||||||
|
.then((response) => {
|
||||||
|
// Abort cache request
|
||||||
|
ac.abort()
|
||||||
|
// Update cache
|
||||||
|
this.#cache.put(request, response.clone())
|
||||||
|
return response
|
||||||
|
})
|
||||||
|
|
||||||
|
// Get fastest
|
||||||
|
return Promise.race([cachedOrError, fetchedAndCached])
|
||||||
|
}
|
||||||
|
|
||||||
async networkFirst(
|
async networkFirst(
|
||||||
{ request, preloadResponse }: FetchEvent,
|
{ request, preloadResponse }: FetchEvent,
|
||||||
{ fallbackUrl, timeout }: { fallbackUrl?: string; timeout?: number },
|
{ fallbackUrl, timeout }: { fallbackUrl?: string; timeout?: number },
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue