aboutsummaryrefslogtreecommitdiff
path: root/src/service-worker.ts
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-03-01 16:20:51 -0800
committerFuwn <[email protected]>2026-03-01 16:21:02 -0800
commiteae5d24d9e79e59a19d4721caaeaa0ca650ecb33 (patch)
tree1b685bb248e051dfa26d2bfdebe6689402dd93c5 /src/service-worker.ts
parentchore(tooling): remove legacy eslint and prettier (diff)
downloaddue.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.ts223
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"));
});