diff options
Diffstat (limited to 'src/service-worker.ts')
| -rw-r--r-- | src/service-worker.ts | 238 |
1 files changed, 119 insertions, 119 deletions
diff --git a/src/service-worker.ts b/src/service-worker.ts index 3e31005f..8f96f620 100644 --- a/src/service-worker.ts +++ b/src/service-worker.ts @@ -13,151 +13,151 @@ const sw = self as unknown as ServiceWorkerGlobalScope; const CACHE = `cache-${version}`; const ASSETS = [ - ...build, // the app itself - ...files // everything in `static` + ...build, // the app itself + ...files // everything in `static` ]; sw.addEventListener('install', (event: ExtendableEvent) => { - // Create a new cache and add all files to it - async function addFilesToCache() { - const cache = await caches.open(CACHE); - await cache.addAll(ASSETS); - } + // Create a new cache and add all files to it + async function addFilesToCache() { + const cache = await caches.open(CACHE); + await cache.addAll(ASSETS); + } - event.waitUntil(addFilesToCache()); + event.waitUntil(addFilesToCache()); }); sw.addEventListener('activate', (event) => { - // Remove previous cached data from disk - async function deleteOldCaches() { - for (const key of await caches.keys()) { - if (key !== CACHE) await caches.delete(key); - } - } - - event.waitUntil(deleteOldCaches()); + // Remove previous cached data from disk + async function deleteOldCaches() { + for (const key of await caches.keys()) { + if (key !== CACHE) await caches.delete(key); + } + } + + event.waitUntil(deleteOldCaches()); }); sw.addEventListener('fetch', (event) => { - // ignore POST requests etc - if (event.request.method !== 'GET') return; + // ignore POST requests etc + if (event.request.method !== 'GET') return; - const url = new URL(event.request.url).origin; + const url = new URL(event.request.url).origin; - if (url.startsWith('chrome-extension') || url.includes('extension') || url.indexOf('http') !== 0) - return; + if (url.startsWith('chrome-extension') || url.includes('extension') || url.indexOf('http') !== 0) + return; - async function respond() { - const url = new URL(event.request.url); - const cache = await caches.open(CACHE); + async function respond() { + const url = new URL(event.request.url); + const cache = await caches.open(CACHE); - // `build`/`files` can always be served from the cache - if (ASSETS.includes(url.pathname)) { - const response = await cache.match(url.pathname); + // `build`/`files` can always be served from the cache + if (ASSETS.includes(url.pathname)) { + const response = await cache.match(url.pathname); - if (response) { - return response; - } - } + if (response) { + return response; + } + } - // for everything else, try the network first, but - // fall back to the cache if we're offline - try { - const response = await fetch(event.request); + // for everything else, try the network first, but + // fall back to the cache if we're offline + try { + const response = await fetch(event.request); - // if we're offline, fetch can return a value that is not a Response - // instead of throwing - and we can't pass this non-Response to respondWith - if (!(response instanceof Response)) { - throw new Error('invalid response from fetch'); - } + // if we're offline, fetch can return a value that is not a Response + // instead of throwing - and we can't pass this non-Response to respondWith + if (!(response instanceof Response)) { + throw new Error('invalid response from fetch'); + } - if (response.status === 200) { - cache.put(event.request, response.clone()); - } + if (response.status === 200) { + cache.put(event.request, response.clone()); + } - return response; - } catch (err) { - const response = await cache.match(event.request); + return response; + } catch (err) { + const response = await cache.match(event.request); - if (response) { - return response; - } + if (response) { + return response; + } - // if there's no cache, then just error out - // as there is nothing we can do to respond to this request - throw err; - } - } + // if there's no cache, then just error out + // as there is nothing we can do to respond to this request + throw err; + } + } - event.respondWith(respond()); + event.respondWith(respond()); }); sw.addEventListener('push', async (event: PushEvent) => { - event.waitUntil( - (async () => { - if (self.Notification && self.Notification.permission !== 'granted') { - return; - } - - try { - const user = (await database.users.toArray()).at(0); - - if (!user) return; - - const recentNotifications = await notifications(user.user.accessToken); - - if ( - recentNotifications && - recentNotifications.length > 0 && - (recentNotifications[0].id > (user.lastNotificationID as number) || - new Date(recentNotifications[0].createdAt * 1000).getTime() + 30000 > - new Date().getTime()) - ) { - await database.users.update(user.id, { lastNotificationID: recentNotifications[0].id }); - await sw.registration.showNotification('due.moe', { - body: `${recentNotifications[0].user.name}${recentNotifications[0].context}`, - icon: recentNotifications[0].user.avatar.large || '/favicon-196x196.png', - // Ref. https://stackoverflow.com/a/50805868/14452787 - tag: 'notification-1' - }); - - return; - } - } catch (error) { - console.error(error); - } - - if ( - navigator.userAgent.includes('Chrome') && - !(await sw.clients.matchAll({ type: 'window', includeUncontrolled: true })).some( - (client) => client.visibilityState === 'visible' - ) - ) { - await sw.registration.showNotification('due.moe', { - body: 'No new notifications', - icon: '/favicon-196x196.png', - tag: 'notification-1' - }); - - // Ref. https://github.com/firebase/quickstart-js/issues/126#issuecomment-504081087 - await new Promise((resolve) => { - (resolve as unknown as () => void)(); - setTimeout( - async () => - await sw.registration - .getNotifications() - .then((notifications) => - notifications.forEach((notification) => notification.close()) - ), - 10 - ); - }); - } - })() - ); + event.waitUntil( + (async () => { + if (self.Notification && self.Notification.permission !== 'granted') { + return; + } + + try { + const user = (await database.users.toArray()).at(0); + + if (!user) return; + + const recentNotifications = await notifications(user.user.accessToken); + + if ( + recentNotifications && + recentNotifications.length > 0 && + (recentNotifications[0].id > (user.lastNotificationID as number) || + new Date(recentNotifications[0].createdAt * 1000).getTime() + 30000 > + new Date().getTime()) + ) { + await database.users.update(user.id, { lastNotificationID: recentNotifications[0].id }); + await sw.registration.showNotification('due.moe', { + body: `${recentNotifications[0].user.name}${recentNotifications[0].context}`, + icon: recentNotifications[0].user.avatar.large || '/favicon-196x196.png', + // Ref. https://stackoverflow.com/a/50805868/14452787 + tag: 'notification-1' + }); + + return; + } + } catch (error) { + console.error(error); + } + + if ( + navigator.userAgent.includes('Chrome') && + !(await sw.clients.matchAll({ type: 'window', includeUncontrolled: true })).some( + (client) => client.visibilityState === 'visible' + ) + ) { + await sw.registration.showNotification('due.moe', { + body: 'No new notifications', + icon: '/favicon-196x196.png', + tag: 'notification-1' + }); + + // Ref. https://github.com/firebase/quickstart-js/issues/126#issuecomment-504081087 + await new Promise((resolve) => { + (resolve as unknown as () => void)(); + setTimeout( + async () => + await sw.registration + .getNotifications() + .then((notifications) => + notifications.forEach((notification) => notification.close()) + ), + 10 + ); + }); + } + })() + ); }); sw.addEventListener('notificationclick', (event: NotificationEvent) => { - event.notification.close(); - event.waitUntil(sw.clients.openWindow('https://anilist.co/notifications')); + event.notification.close(); + event.waitUntil(sw.clients.openWindow('https://anilist.co/notifications')); }); |