Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | // Service Worker for Web Push Notifications // Handles push events and notification clicks — no fetch caching. // Activate immediately without waiting for existing clients to close self.addEventListener('install', (event) => { console.log('[SW] Installing') event.waitUntil(self.skipWaiting()) }) self.addEventListener('activate', (event) => { console.log('[SW] Activating') event.waitUntil(self.clients.claim()) }) self.addEventListener('push', (event) => { console.log('[SW] Push received', event) let data = {} if (event.data) { try { data = event.data.json() console.log('[SW] Push data:', data) } catch (err) { console.error('[SW] Failed to parse push data:', err) data = { title: 'Abaci One', body: event.data.text() } } } const title = data.title || 'Abaci One' const options = { body: data.body || 'New notification', icon: data.icon || '/icon-192x192.png', data: data.data || {}, } console.log('[SW] Showing notification:', title, options) event.waitUntil(self.registration.showNotification(title, options)) }) self.addEventListener('notificationclick', (event) => { event.notification.close() const url = event.notification.data?.url if (!url) return event.waitUntil( clients.matchAll({ type: 'window', includeUncontrolled: true }).then((windowClients) => { for (const client of windowClients) { if (client.url === url && 'focus' in client) { return client.focus() } } return clients.openWindow(url) }) ) }) |