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. 6
      common/worker.js
  2. 12
      sw.js

6
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();

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
try {
if (preloadResponsePromise) {
const preloadResponse = await preloadResponsePromise
if (preloadResponse && preloadResponse.ok) {
@ -135,6 +136,11 @@ const cacheFirst = async ({ request, preloadResponsePromise, refreshAnyway }) =>
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,6 +159,7 @@ const cacheFirst = async ({ request, preloadResponsePromise, refreshAnyway }) =>
const networkFirst = async ({ request, preloadResponsePromise }) => {
// First try to use (and cache) the preloaded response, if it's there
try {
if (preloadResponsePromise) {
const preloadResponse = await preloadResponsePromise
if (preloadResponse && preloadResponse.ok) {
@ -164,6 +171,11 @@ const networkFirst = async ({ request, preloadResponsePromise }) => {
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

Loading…
Cancel
Save