From c2ea04de4b3a87773e9baece178dcd57cfbd33a4 Mon Sep 17 00:00:00 2001 From: Dan Cojocaru Date: Thu, 17 Nov 2022 23:30:38 +0100 Subject: [PATCH] Enable service worker for Safari For future reference: the preflight request must return these headers: Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET, POST, HEAD, OPTIONS Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization, Pragma, Cache-Control Otherwise, Safari will refuse requests made inside a service worker reporting a preflight check fail. --- common/worker.js | 6 ++---- sw.js | 48 ++++++++++++++++++++++++++++++------------------ 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/common/worker.js b/common/worker.js index f3abdec..7257218 100755 --- a/common/worker.js +++ b/common/worker.js @@ -15,11 +15,9 @@ const registerServiceWorker = async () => { console.log('Service worker active'); } } catch (error) { - console.error(`Registration failed with ${error}`); + console.error('Registration failed', error); } } }; -if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { - registerServiceWorker(); -} +registerServiceWorker(); diff --git a/sw.js b/sw.js index 1b979c1..7cdb6f1 100755 --- a/sw.js +++ b/sw.js @@ -124,17 +124,23 @@ const cacheFirst = async ({ request, preloadResponsePromise, refreshAnyway }) => } // Next try to use (and cache) the preloaded response, if it's there - if (preloadResponsePromise) { - const preloadResponse = await preloadResponsePromise - if (preloadResponse && preloadResponse.ok) { - console.info('[cf] using preload response', preloadResponse) - await putInCache(request, preloadResponse.clone()) - return preloadResponse - } - else { - console.log('[cf] got not ok preloadResponse, ignoring', preloadResponse) + try { + if (preloadResponsePromise) { + const preloadResponse = await preloadResponsePromise + if (preloadResponse && preloadResponse.ok) { + console.info('[cf] using preload response', preloadResponse) + await putInCache(request, preloadResponse.clone()) + return preloadResponse + } + else { + console.log('[cf] got not ok preloadResponse, ignoring', preloadResponse) + } } } + catch (e) { + // Ignore as preload isn't necessarily important + console.error('[cf] preload response error', e) + } // Next try to get the resource from the network const responseFromNetwork = await fetch(request) @@ -153,17 +159,23 @@ const cacheFirst = async ({ request, preloadResponsePromise, refreshAnyway }) => const networkFirst = async ({ request, preloadResponsePromise }) => { // First try to use (and cache) the preloaded response, if it's there - if (preloadResponsePromise) { - const preloadResponse = await preloadResponsePromise - if (preloadResponse && preloadResponse.ok) { - console.info('[nf] using preload response', preloadResponse) - await putInCache(request, preloadResponse.clone()) - return preloadResponse - } - else { - console.log('[nf] got not ok preloadResponse, ignoring', preloadResponse) + try { + if (preloadResponsePromise) { + const preloadResponse = await preloadResponsePromise + if (preloadResponse && preloadResponse.ok) { + console.info('[nf] using preload response', preloadResponse) + await putInCache(request, preloadResponse.clone()) + return preloadResponse + } + else { + console.log('[nf] got not ok preloadResponse, ignoring', preloadResponse) + } } } + catch (e) { + // Ignore as preload isn't necessarily important + console.error('[nf] preload response error', e) + } // Next try to get the resource from the network let responseFromNetwork