fixed message handler

This commit is contained in:
cpu
2025-03-29 06:22:55 +01:00
parent ad96260d91
commit c71526b6c3
2 changed files with 42 additions and 7 deletions

View File

@@ -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 --- // --- Service Worker and PWA Setup ---
export function setupServiceWorker(messageHandler) { export function setupServiceWorker(messageHandler) {
if ('serviceWorker' in navigator) { if ('serviceWorker' in navigator) {
// Set up global message event listener on window object
window.addEventListener('message', handleServiceWorkerMessage);
window.addEventListener('load', () => { window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js') navigator.serviceWorker.register('/sw.js')
.then(registration => { .then(registration => {
console.log('ServiceWorker registered successfully.'); 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); navigator.serviceWorker.addEventListener('message', messageHandler);
// Initialize Flic integration (which will just register handlers now, not auto-subscribe) // 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
initFlic(); initFlic();
}) })
.catch(error => { .catch(error => {
console.error('ServiceWorker registration failed:', error); console.error('ServiceWorker registration failed:', error);
}); });
}); });
// Listen for SW controller changes // Listen for SW controller changes
navigator.serviceWorker.addEventListener('controllerchange', () => { navigator.serviceWorker.addEventListener('controllerchange', () => {
console.log('Service Worker controller changed, potentially updated.'); 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 { } else {

18
sw.js
View File

@@ -142,12 +142,24 @@ self.addEventListener('push', event => {
}); });
} }
// Post message to each client // Post message to each client with improved reliability
let messageSent = false; let messageSent = false;
clientList.forEach(client => { const sendPromises = clientList.map(client => {
console.log(`[ServiceWorker] Posting message to client: ${client.id}`, messagePayload); console.log(`[ServiceWorker] Posting message to client: ${client.id}`, messagePayload);
try {
// Try to send the message and mark it as sent
client.postMessage(messagePayload); client.postMessage(messagePayload);
messageSent = true; // Mark that we at least tried to send a message 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. // Decide whether to still show a notification even if a window is open.