// Lycostorrent Service Worker const CACHE_NAME = 'lycostorrent-v1'; // Assets à mettre en cache const STATIC_ASSETS = [ '/', '/latest', '/static/css/style.css', '/static/css/latest.css', '/static/js/search.js', '/static/js/latest.js', '/static/icons/icon-192x192.png', '/static/icons/icon-512x512.png' ]; // Installation - mise en cache des assets statiques self.addEventListener('install', (event) => { console.log('🔧 Service Worker: Installation...'); event.waitUntil( caches.open(CACHE_NAME) .then((cache) => { console.log('📦 Service Worker: Mise en cache des assets'); return cache.addAll(STATIC_ASSETS); }) .then(() => { // Activer immédiatement sans attendre return self.skipWaiting(); }) .catch((error) => { console.error('❌ Service Worker: Erreur de cache', error); }) ); }); // Activation - nettoyage des anciens caches self.addEventListener('activate', (event) => { console.log('✅ Service Worker: Activation'); event.waitUntil( caches.keys() .then((cacheNames) => { return Promise.all( cacheNames .filter((name) => name !== CACHE_NAME) .map((name) => { console.log('🗑️ Service Worker: Suppression ancien cache', name); return caches.delete(name); }) ); }) .then(() => { // Prendre le contrôle immédiatement return self.clients.claim(); }) ); }); // Fetch - stratégie Network First avec fallback cache self.addEventListener('fetch', (event) => { const url = new URL(event.request.url); // Ne pas cacher les requêtes API (toujours aller sur le réseau) if (url.pathname.startsWith('/api/')) { event.respondWith( fetch(event.request) .catch(() => { return new Response( JSON.stringify({ success: false, error: 'Hors ligne' }), { headers: { 'Content-Type': 'application/json' } } ); }) ); return; } // Pour les assets statiques - Cache First if (url.pathname.startsWith('/static/')) { event.respondWith( caches.match(event.request) .then((cachedResponse) => { if (cachedResponse) { // Retourner le cache et mettre à jour en arrière-plan fetch(event.request) .then((response) => { if (response.ok) { caches.open(CACHE_NAME) .then((cache) => cache.put(event.request, response)); } }) .catch(() => {}); return cachedResponse; } // Pas en cache, récupérer du réseau return fetch(event.request) .then((response) => { if (response.ok) { const responseClone = response.clone(); caches.open(CACHE_NAME) .then((cache) => cache.put(event.request, responseClone)); } return response; }); }) ); return; } // Pour les pages HTML - Network First event.respondWith( fetch(event.request) .then((response) => { // Mettre en cache la réponse if (response.ok && event.request.method === 'GET') { const responseClone = response.clone(); caches.open(CACHE_NAME) .then((cache) => cache.put(event.request, responseClone)); } return response; }) .catch(() => { // Fallback sur le cache return caches.match(event.request) .then((cachedResponse) => { if (cachedResponse) { return cachedResponse; } // Page hors ligne par défaut return caches.match('/'); }); }) ); }); // Gestion des messages self.addEventListener('message', (event) => { if (event.data && event.data.type === 'SKIP_WAITING') { self.skipWaiting(); } });