self.addEventListener("push", (event) => { const payload = (() => { if (!event.data) { return {}; } try { return event.data.json(); } catch { return { body: event.data.text(), }; } })(); const notifyClients = self.clients .matchAll({ type: "window", includeUncontrolled: true }) .then((clients) => Promise.all( clients.map((client) => client.postMessage({ type: "termi:web-push-received", payload, }), ), ), ); const title = payload.title || "订阅更新"; const url = payload.url || "/"; const options = { body: payload.body || "", icon: payload.icon || "/favicon.svg", badge: payload.badge || "/favicon.ico", tag: payload.tag || "termi-subscription", data: { url, ...(payload.data || {}), }, }; event.waitUntil( Promise.all([ self.registration.showNotification(title, options), notifyClients, ]), ); }); self.addEventListener("notificationclick", (event) => { event.notification.close(); const targetUrl = event.notification?.data?.url || "/"; event.waitUntil( self.clients .matchAll({ type: "window", includeUncontrolled: true }) .then((clients) => { for (const client of clients) { if ("focus" in client && client.url === targetUrl) { return client.focus(); } } if (self.clients.openWindow) { return self.clients.openWindow(targetUrl); } return undefined; }), ); });