aboutsummaryrefslogtreecommitdiff
path: root/src/service-worker.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/service-worker.ts')
-rw-r--r--src/service-worker.ts238
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'));
});