You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
3.4 KiB
98 lines
3.4 KiB
/* eslint-disable no-restricted-globals */ |
|
|
|
// This service worker can be customized! |
|
// See https://developers.google.com/web/tools/workbox/modules |
|
// for the list of available Workbox modules, or add any other |
|
// code you'd like. |
|
// You can also remove this file if you'd prefer not to use a |
|
// service worker, and the Workbox build step will be skipped. |
|
|
|
import { clientsClaim } from 'workbox-core'; |
|
import { ExpirationPlugin } from 'workbox-expiration'; |
|
import { precacheAndRoute, createHandlerBoundToURL } from 'workbox-precaching'; |
|
import { registerRoute } from 'workbox-routing'; |
|
import { StaleWhileRevalidate } from 'workbox-strategies'; |
|
|
|
clientsClaim(); |
|
|
|
// Precache all of the assets generated by your build process. |
|
// Their URLs are injected into the manifest variable below. |
|
// This variable must be present somewhere in your service worker file, |
|
// even if you decide not to use precaching. See https://cra.link/PWA |
|
precacheAndRoute(self.__WB_MANIFEST); |
|
|
|
// Set up App Shell-style routing, so that all navigation requests |
|
// are fulfilled with your index.html shell. Learn more at |
|
// https://developers.google.com/web/fundamentals/architecture/app-shell |
|
const fileExtensionRegexp = new RegExp('/[^/?]+\\.[^/]+$'); |
|
registerRoute( |
|
// Return false to exempt requests from being fulfilled by index.html. |
|
({ request, url }) => { |
|
// If this isn't a navigation, skip. |
|
if (request.mode !== 'navigate') { |
|
return false; |
|
} // If this is a URL that starts with /_, skip. |
|
|
|
if (url.pathname.startsWith('/_')) { |
|
return false; |
|
} // If this looks like a URL for a resource, because it contains // a file extension, skip. |
|
|
|
if (url.pathname.match(fileExtensionRegexp)) { |
|
return false; |
|
} // Return true to signal that we want to use the handler. |
|
|
|
return true; |
|
}, |
|
createHandlerBoundToURL(process.env.PUBLIC_URL + '/index.html'), |
|
); |
|
|
|
// An example runtime caching route for requests that aren't handled by the |
|
// precache, in this case same-origin .png requests like those from in public/ |
|
registerRoute( |
|
// Add in any other file extensions or routing criteria as needed. |
|
({ url }) => |
|
url.origin === self.location.origin && url.pathname.endsWith('.png'), // Customize this strategy as needed, e.g., by changing to CacheFirst. |
|
new StaleWhileRevalidate({ |
|
cacheName: 'images', |
|
plugins: [ |
|
// Ensure that once this runtime cache reaches a maximum size the |
|
// least-recently used images are removed. |
|
new ExpirationPlugin({ maxEntries: 50 }), |
|
], |
|
}), |
|
); |
|
|
|
// This allows the web app to trigger skipWaiting via |
|
// registration.waiting.postMessage({type: 'SKIP_WAITING'}) |
|
self.addEventListener('message', (event) => { |
|
if (event.data && event.data.type === 'SKIP_WAITING') { |
|
self.skipWaiting(); |
|
} |
|
}); |
|
|
|
// Any other custom service worker logic can go here. |
|
function receivePushNotification(event) { |
|
console.log('[Service Worker] Push Received.'); |
|
|
|
const { title, pid, text } = event.data.json(); |
|
|
|
const options = { |
|
data: `${self.location.origin}/##${pid}`, |
|
body: text, |
|
}; |
|
|
|
event.waitUntil(self.registration.showNotification(title, options)); |
|
} |
|
|
|
function openPushNotification(event) { |
|
console.log( |
|
'[Service Worker] Notification click Received.', |
|
event.notification.data, |
|
); |
|
|
|
event.notification.close(); |
|
event.waitUntil(self.clients.openWindow(event.notification.data)); |
|
} |
|
|
|
self.addEventListener('push', receivePushNotification); |
|
self.addEventListener('notificationclick', openPushNotification);
|
|
|