diff --git a/src/serviceworker/src/strategy.ts b/src/serviceworker/src/strategy.ts index df622fb..aa8c1ba 100644 --- a/src/serviceworker/src/strategy.ts +++ b/src/serviceworker/src/strategy.ts @@ -27,6 +27,35 @@ export class Strategy { return this.#cache.match(request) } + fastestAndCacheRefresh( + { request, preloadResponse }: Pick, + 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( { request, preloadResponse }: FetchEvent, { fallbackUrl, timeout }: { fallbackUrl?: string; timeout?: number },