Files
Lycostorrent/app/static/sw.js
2026-03-23 20:59:26 +01:00

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();
}
});