Initial commit
This commit is contained in:
143
app/static/sw.js
Normal file
143
app/static/sw.js
Normal file
@@ -0,0 +1,143 @@
|
||||
// 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();
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user