fixed message handler
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
|
// 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();
|
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 {
|
||||||
|
|||||||
20
sw.js
20
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;
|
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);
|
||||||
client.postMessage(messagePayload);
|
try {
|
||||||
messageSent = true; // Mark that we at least tried to send a message
|
// 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.
|
// Decide whether to still show a notification even if a window is open.
|
||||||
|
|||||||
Reference in New Issue
Block a user