Browse Source

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.
master
Kenneth Bruen 2 years ago
parent
commit
c2ea04de4b
Signed by: kbruen
GPG Key ID: C1980A470C3EE5B1
  1. 4
      common/worker.js
  2. 12
      sw.js

4
common/worker.js

@ -15,11 +15,9 @@ const registerServiceWorker = async () => {
console.log('Service worker active'); console.log('Service worker active');
} }
} catch (error) { } catch (error) {
console.error(`Registration failed with ${error}`); console.error('Registration failed', error);
} }
} }
}; };
if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {
registerServiceWorker(); registerServiceWorker();
}

12
sw.js

@ -124,6 +124,7 @@ const cacheFirst = async ({ request, preloadResponsePromise, refreshAnyway }) =>
} }
// Next try to use (and cache) the preloaded response, if it's there // Next try to use (and cache) the preloaded response, if it's there
try {
if (preloadResponsePromise) { if (preloadResponsePromise) {
const preloadResponse = await preloadResponsePromise const preloadResponse = await preloadResponsePromise
if (preloadResponse && preloadResponse.ok) { if (preloadResponse && preloadResponse.ok) {
@ -135,6 +136,11 @@ const cacheFirst = async ({ request, preloadResponsePromise, refreshAnyway }) =>
console.log('[cf] got not ok preloadResponse, ignoring', preloadResponse) 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 // Next try to get the resource from the network
const responseFromNetwork = await fetch(request) const responseFromNetwork = await fetch(request)
@ -153,6 +159,7 @@ const cacheFirst = async ({ request, preloadResponsePromise, refreshAnyway }) =>
const networkFirst = async ({ request, preloadResponsePromise }) => { const networkFirst = async ({ request, preloadResponsePromise }) => {
// First try to use (and cache) the preloaded response, if it's there // First try to use (and cache) the preloaded response, if it's there
try {
if (preloadResponsePromise) { if (preloadResponsePromise) {
const preloadResponse = await preloadResponsePromise const preloadResponse = await preloadResponsePromise
if (preloadResponse && preloadResponse.ok) { if (preloadResponse && preloadResponse.ok) {
@ -164,6 +171,11 @@ const networkFirst = async ({ request, preloadResponsePromise }) => {
console.log('[nf] got not ok preloadResponse, ignoring', preloadResponse) 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 // Next try to get the resource from the network
let responseFromNetwork let responseFromNetwork

Loading…
Cancel
Save