From 76c6b597a8e763f79ae236370aedcfab7a06aa39 Mon Sep 17 00:00:00 2001 From: Julien Oculi Date: Fri, 19 Jul 2024 14:46:27 +0200 Subject: [PATCH] feat(pwa): :sparkles: add new "network first" fetch strategy --- src/serviceworker/src/fetch_strategy.ts | 28 +++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/serviceworker/src/fetch_strategy.ts b/src/serviceworker/src/fetch_strategy.ts index f88f3f9..3256325 100644 --- a/src/serviceworker/src/fetch_strategy.ts +++ b/src/serviceworker/src/fetch_strategy.ts @@ -26,8 +26,32 @@ export class FetchStrategy { return fetched } - // Get fastest - return Promise.any([cachedOrError, fetchedAndCached]) + static async networkFirst( + cache: Cache, + { request, preloadResponse }: Pick< + FetchEvent, + 'request' | 'preloadResponse' + >, + cacheQueryOptions?: CacheQueryOptions | undefined, + ): Promise { + try { + // Fetch and cache + const fetched = await this.networkOnly({ request, preloadResponse }) + cache.put(request, fetched.clone()) + return fetched + } catch (cause) { + // Get cache + const cached = await cache.match(request, cacheQueryOptions) + + if (cached) { + return cached + } + + throw new Error( + `no cache available for the requested url "${request.url}"`, + { cause }, + ) + } } static async networkOnly(