From c71526b6c3132460a15b4b539e81a4b60762d924 Mon Sep 17 00:00:00 2001 From: cpu Date: Sat, 29 Mar 2025 06:22:55 +0100 Subject: [PATCH] fixed message handler --- src/js/services/serviceWorkerManager.js | 29 ++++++++++++++++++++++--- sw.js | 20 +++++++++++++---- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/js/services/serviceWorkerManager.js b/src/js/services/serviceWorkerManager.js index 4a1a7d8..092cea4 100644 --- a/src/js/services/serviceWorkerManager.js +++ b/src/js/services/serviceWorkerManager.js @@ -39,28 +39,51 @@ export function flicMessageHandler(event) { } } +// Global message handler function to ensure we catch all service worker messages +function handleServiceWorkerMessage(event) { + // Check if the message might be from our service worker + if (event.data && typeof event.data === 'object') { + console.log('[App] Potential SW message received:', event.data); + // Process the message with our flicMessageHandler + flicMessageHandler(event); + } +} + // --- Service Worker and PWA Setup --- export function setupServiceWorker(messageHandler) { if ('serviceWorker' in navigator) { + // Set up global message event listener on window object + window.addEventListener('message', handleServiceWorkerMessage); + window.addEventListener('load', () => { navigator.serviceWorker.register('/sw.js') .then(registration => { console.log('ServiceWorker registered successfully.'); - // Listen for messages FROM the Service Worker (e.g., Flic actions) + // Listen for messages FROM the Service Worker navigator.serviceWorker.addEventListener('message', messageHandler); + + // Add an event listener that will work with service worker controlled clients + if (navigator.serviceWorker.controller) { + console.log('Service worker already controlling the page, setting up message listener'); + navigator.serviceWorker.controller.addEventListener('message', messageHandler); + } - // Initialize Flic integration (which will just register handlers now, not auto-subscribe) + // Initialize Flic integration initFlic(); }) .catch(error => { console.error('ServiceWorker registration failed:', error); }); }); + // Listen for SW controller changes navigator.serviceWorker.addEventListener('controllerchange', () => { console.log('Service Worker controller changed, potentially updated.'); - // window.location.reload(); // Consider prompting user to reload + // Re-attach event listener to the new controller + if (navigator.serviceWorker.controller) { + navigator.serviceWorker.controller.addEventListener('message', messageHandler); + } }); } else { diff --git a/sw.js b/sw.js index ea7b19a..3953e71 100644 --- a/sw.js +++ b/sw.js @@ -142,12 +142,24 @@ self.addEventListener('push', event => { }); } - // Post message to each client + // Post message to each client with improved reliability let messageSent = false; - clientList.forEach(client => { + const sendPromises = clientList.map(client => { console.log(`[ServiceWorker] Posting message to client: ${client.id}`, messagePayload); - client.postMessage(messagePayload); - messageSent = true; // Mark that we at least tried to send a message + try { + // Try to send the message and mark it as sent + client.postMessage(messagePayload); + messageSent = true; + + // Also try to focus the client to ensure it gets the message + if ('focus' in client) { + return client.focus().then(() => true); + } + return Promise.resolve(true); + } catch (error) { + console.error('[ServiceWorker] Error posting message to client:', error); + return Promise.resolve(false); + } }); // Decide whether to still show a notification even if a window is open.