From c973ff40c448b5eec45e88f9afd10d96e4b92a42 Mon Sep 17 00:00:00 2001 From: matty Date: Sat, 21 Mar 2026 20:37:32 +0000 Subject: [PATCH] cache emojis with service worker --- packages/nicolium/src/service-worker/sw.ts | 37 ++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/packages/nicolium/src/service-worker/sw.ts b/packages/nicolium/src/service-worker/sw.ts index d03cfe8f9..a69fdc8b2 100644 --- a/packages/nicolium/src/service-worker/sw.ts +++ b/packages/nicolium/src/service-worker/sw.ts @@ -326,6 +326,43 @@ const handleNotificationClick = (event: NotificationEvent) => { event.waitUntil(reactToNotificationClick); }; +// --- Asset caching --- + +const CACHE_NAME = 'ncd-assets-v1'; + +/** URL patterns to cache with a cache-first strategy. */ +const CACHEABLE_PATTERNS = [ + /\/packs\/emoji\/.*\.svg$/, // Built-in emoji SVGs + /\/packs\/assets\/.*\.woff2?$/, // Font files + /\/packs\/assets\/.*\.css$/, // Stylesheets + /\/emoji\/.*\.(png|svg|gif|webp)$/, // Custom instance emojis +]; + +const isCacheable = (url: string): boolean => + CACHEABLE_PATTERNS.some((pattern) => pattern.test(url)); + +/** Cache-first fetch handler for static assets. */ +const handleFetch = (event: FetchEvent) => { + const { request } = event; + + if (request.method !== 'GET' || !isCacheable(request.url)) return; + + event.respondWith( + caches.match(request).then((cached) => { + if (cached) return cached; + + return fetch(request).then((response) => { + if (response.ok) { + const clone = response.clone(); + caches.open(CACHE_NAME).then((cache) => cache.put(request, clone)); + } + return response; + }); + }), + ); +}; + // ServiceWorker event listeners self.addEventListener('push', handlePush); self.addEventListener('notificationclick', handleNotificationClick); +self.addEventListener('fetch', handleFetch);