143 lines
4.0 KiB
JavaScript
143 lines
4.0 KiB
JavaScript
// 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();
|
|
}
|
|
}); |