Files
termi-blog/frontend/public/termi-web-push-sw.js
limitcool 381dc9b854
Some checks failed
docker-images / resolve-build-targets (push) Successful in 5s
docker-images / build-and-push (admin) (push) Successful in 30s
docker-images / submit-indexnow (push) Has been cancelled
docker-images / build-and-push (frontend) (push) Has been cancelled
docker-images / build-and-push (backend) (push) Has been cancelled
Fix web push delivery handling and worker console
2026-04-04 04:15:20 +08:00

72 lines
1.6 KiB
JavaScript

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;
}),
);
});