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 return cached
} }
// Cache first and refresh // Fastest and cache refresh
if (url.origin === location.origin && method === 'GET') { if (url.origin === location.origin && method === 'GET') {
const cached = await cache.match(event.request) const cache = await getDynCache()
const response = fetch(event.request) // Get cache or throw
.then((response) => { const cachedOrError = cache.match(event.request).then((response) => {
if (!response.ok) { if (response) return response
throw new Error( throw new Error(`no cache available for "${url}"`)
`failed to get request: [${response.status}] ${response.statusText}`, })
) // Fetch and cache
} const fetchedAndCached = fetch(event.request).then((response) => {
// Update cache if ok
cache.put(event.request, response.clone()) cache.put(event.request, response.clone())
return response return response
}) })
// Get fastest
return Promise.race([cachedOrError, fetchedAndCached])
}
// Network only
return fetch(event.request)
}
async function getDynCache(): Promise<Cache> { async function getDynCache(): Promise<Cache> {
const version = await swStorage.getItem<number>('$sw.dyn-cache.version') const version = await swStorage.getItem<number>('$sw.dyn-cache.version')
// Create cache // Create cache