diff options
| author | Fuwn <[email protected]> | 2026-03-01 16:20:51 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-03-01 16:21:02 -0800 |
| commit | eae5d24d9e79e59a19d4721caaeaa0ca650ecb33 (patch) | |
| tree | 1b685bb248e051dfa26d2bfdebe6689402dd93c5 /src/service-worker.ts | |
| parent | chore(tooling): remove legacy eslint and prettier (diff) | |
| download | due.moe-eae5d24d9e79e59a19d4721caaeaa0ca650ecb33.tar.xz due.moe-eae5d24d9e79e59a19d4721caaeaa0ca650ecb33.zip | |
chore(biome): drop formatter style overrides
Diffstat (limited to 'src/service-worker.ts')
| -rw-r--r-- | src/service-worker.ts | 223 |
1 files changed, 117 insertions, 106 deletions
diff --git a/src/service-worker.ts b/src/service-worker.ts index 5a82c4b0..777b1bab 100644 --- a/src/service-worker.ts +++ b/src/service-worker.ts @@ -3,136 +3,147 @@ /// <reference lib="esnext" /> /// <reference lib="webworker" /> -import { build, files, version } from '$service-worker'; -import { database } from './lib/Database/IDB/user'; +import { build, files, version } from "$service-worker"; +import { database } from "./lib/Database/IDB/user"; import { - isNotificationQueued, - notifications, - updateLastNotificationID -} from './lib/Data/AniList/notifications'; + isNotificationQueued, + notifications, + updateLastNotificationID, +} from "./lib/Data/AniList/notifications"; const sw = self as unknown as ServiceWorkerGlobalScope; const CACHE = `cache-${version}`; const ASSETS = [...build, ...files]; -sw.addEventListener('install', (event: ExtendableEvent) => { - event.waitUntil( - (async () => { - const cache = await caches.open(CACHE); - await cache.addAll(ASSETS); - })() - ); +sw.addEventListener("install", (event: ExtendableEvent) => { + event.waitUntil( + (async () => { + const cache = await caches.open(CACHE); + await cache.addAll(ASSETS); + })(), + ); }); -sw.addEventListener('activate', (event) => { - event.waitUntil( - (async () => { - for (const key of await caches.keys()) { - if (key !== CACHE) await caches.delete(key); - } - })() - ); +sw.addEventListener("activate", (event) => { + event.waitUntil( + (async () => { + for (const key of await caches.keys()) { + if (key !== CACHE) await caches.delete(key); + } + })(), + ); }); -sw.addEventListener('fetch', (event) => { - if (event.request.method !== 'GET') return; +sw.addEventListener("fetch", (event) => { + 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); - if (ASSETS.includes(url.pathname)) { - const response = await cache.match(url.pathname); + if (ASSETS.includes(url.pathname)) { + const response = await cache.match(url.pathname); - if (response) return response; - } + if (response) return response; + } - try { - const response = await fetch(event.request); + try { + const response = await fetch(event.request); - if (!(response instanceof Response)) throw new Error('invalid response from fetch'); + 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 (error) { - const response = await cache.match(event.request); + return response; + } catch (error) { + const response = await cache.match(event.request); - if (response) return response; + if (response) return response; - throw error; - } - } + throw error; + } + } - 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 && - isNotificationQueued(recentNotifications, user.lastNotificationID) - ) { - await updateLastNotificationID(user.id, recentNotifications); - await sw.registration.showNotification('due.moe', { - body: `${recentNotifications[0].user.name}${recentNotifications[0].context}`, - icon: recentNotifications[0].user.avatar.large || '/favicon-196x196.png', - // 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' - }); - - // 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("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 && + isNotificationQueued(recentNotifications, user.lastNotificationID) + ) { + await updateLastNotificationID(user.id, recentNotifications); + await sw.registration.showNotification("due.moe", { + body: `${recentNotifications[0].user.name}${recentNotifications[0].context}`, + icon: + recentNotifications[0].user.avatar.large || + "/favicon-196x196.png", + // 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", + }); + + // 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')); +sw.addEventListener("notificationclick", (event: NotificationEvent) => { + event.notification.close(); + event.waitUntil(sw.clients.openWindow("https://anilist.co/notifications")); }); |