Improve service worker initialization

This commit is contained in:
omaroughriss 2025-11-27 16:45:54 +01:00
parent 414f8e5dca
commit f675dc01ae

View File

@ -71,50 +71,45 @@ export class Database {
return objectList; return objectList;
} }
public async registerServiceWorker(path: string) { private async registerServiceWorker(path: string): Promise<void> {
if (!('serviceWorker' in navigator)) return; if (!('serviceWorker' in navigator)) return;
console.log('[Database] Initialisation du Service Worker sur :', path); console.log('[Database] Initializing Service Worker:', path);
try { try {
// 1. NETTOYAGE DES ANCIENS WORKERS (ZOMBIES)
const registrations = await navigator.serviceWorker.getRegistrations(); const registrations = await navigator.serviceWorker.getRegistrations();
for (const registration of registrations) { for (const registration of registrations) {
const scriptURL = registration.active?.scriptURL || registration.installing?.scriptURL || registration.waiting?.scriptURL; const scriptURL = registration.active?.scriptURL || registration.installing?.scriptURL || registration.waiting?.scriptURL;
const scope = registration.scope; const scope = registration.scope;
// On détecte spécifiquement l'ancien dossier qui pose problème
// L'erreur mentionne : scope ('.../src/service-workers/')
if (scope.includes('/src/service-workers/') || (scriptURL && scriptURL.includes('/src/service-workers/'))) { if (scope.includes('/src/service-workers/') || (scriptURL && scriptURL.includes('/src/service-workers/'))) {
console.warn(`[Database] 🚨 ANCIEN Service Worker détecté (${scope}). Suppression immédiate...`); console.warn(`[Database] Removing old Service Worker (${scope})`);
await registration.unregister(); await registration.unregister();
// On continue la boucle, ne pas retourner ici, il faut installer le nouveau après
} }
} }
// 2. INSTALLATION DU NOUVEAU WORKER (PROPRE)
// On vérifie s'il est déjà installé à la BONNE adresse
const existingValidWorker = registrations.find((r) => { const existingValidWorker = registrations.find((r) => {
const url = r.active?.scriptURL || r.installing?.scriptURL || r.waiting?.scriptURL; const url = r.active?.scriptURL || r.installing?.scriptURL || r.waiting?.scriptURL;
// On compare la fin de l'URL pour éviter les soucis http/https/localhost return url && url.endsWith(path.replace(/^\//,''));
return url && url.endsWith(path.replace(/^\//, ''));
}); });
if (!existingValidWorker) { if (!existingValidWorker) {
console.log('[Database] Enregistrement du nouveau Service Worker...'); console.log('[Database] Registering new Service Worker');
this.serviceWorkerRegistration = await navigator.serviceWorker.register(path, { type: 'module', scope: '/' }); this.serviceWorkerRegistration = await navigator.serviceWorker.register(path, { type: 'module', scope: '/' });
} else { } else {
console.log('[Database] Service Worker déjà actif et valide.'); console.log('[Database] Service Worker already active');
this.serviceWorkerRegistration = existingValidWorker; this.serviceWorkerRegistration = existingValidWorker;
await this.serviceWorkerRegistration.update(); await this.serviceWorkerRegistration.update();
} }
// Set up listeners
navigator.serviceWorker.addEventListener('message', async (event) => { navigator.serviceWorker.addEventListener('message', async (event) => {
// console.log('Received message from service worker:', event.data); if (event.data.type === 'DB_REQUEST') {
await this.handleDatabaseRequest(event.data);
return;
}
await this.handleServiceWorkerMessage(event.data); await this.handleServiceWorkerMessage(event.data);
}); });
// Periodic check
if (this.serviceWorkerCheckIntervalId) clearInterval(this.serviceWorkerCheckIntervalId); if (this.serviceWorkerCheckIntervalId) clearInterval(this.serviceWorkerCheckIntervalId);
this.serviceWorkerCheckIntervalId = window.setInterval(async () => { this.serviceWorkerCheckIntervalId = window.setInterval(async () => {
const activeWorker = this.serviceWorkerRegistration?.active || (await this.waitForServiceWorkerActivation(this.serviceWorkerRegistration!)); const activeWorker = this.serviceWorkerRegistration?.active || (await this.waitForServiceWorkerActivation(this.serviceWorkerRegistration!));
@ -125,11 +120,10 @@ export class Database {
} }
}, 5000); }, 5000);
} catch (error) { } catch (error) {
console.error('[Database] 💥 Erreur critique Service Worker:', error); console.error('[Database] Service Worker error:', error);
} }
} }
// Helper function to wait for service worker activation
private async waitForServiceWorkerActivation(registration: ServiceWorkerRegistration): Promise<ServiceWorker | null> { private async waitForServiceWorkerActivation(registration: ServiceWorkerRegistration): Promise<ServiceWorker | null> {
return new Promise((resolve) => { return new Promise((resolve) => {
if (registration.active) { if (registration.active) {