perf(pwa): change cache strategy for non-pre-cached resources

This commit is contained in:
Julien Oculi 2024-07-18 14:19:41 +02:00
parent 4a917971d0
commit d7716a88a8

View file

@ -110,21 +110,28 @@ async function fetchHandler(event: FetchEvent) {
return cached
}
// Cache first and refresh
// Fastest and cache refresh
if (url.origin === location.origin && method === 'GET') {
const cached = await cache.match(event.request)
const cache = await getDynCache()
const response = fetch(event.request)
.then((response) => {
if (!response.ok) {
throw new Error(
`failed to get request: [${response.status}] ${response.statusText}`,
)
}
// Update cache if ok
// 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
return fetch(event.request)
}
async function getDynCache(): Promise<Cache> {
const version = await swStorage.getItem<number>('$sw.dyn-cache.version')
// Create cache