Spaces:
Running
Running
File size: 2,259 Bytes
f67ba6f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | /**
* LEAF_AI Service Worker (PWA Offline Support)
* Cho phép nông dân mở app và tra cứu cẩm nang/thư viện ngay tại vườn khi không có mạng 4G/Wifi.
*/
const CACHE_NAME = 'leaf-ai-v1.0.0';
const STATIC_ASSETS = [
'./',
'./index.html',
'./manifest.json',
'./assets/css/style.css',
'./assets/js/disease_data.js',
'./assets/js/canvas_render.js',
'./assets/js/camera.js',
'./assets/js/api.js',
'./assets/js/three_leaf.js',
'./assets/js/app.js'
];
// Install: Cache các tài nguyên tĩnh cần thiết
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE_NAME).then((cache) => {
console.log('[LEAF_AI SW] Caching offline assets...');
return cache.addAll(STATIC_ASSETS).catch(err => {
console.warn('[LEAF_AI SW] Cache addAll warning:', err);
});
}).then(() => self.skipWaiting())
);
});
// Activate: Xóa cache cũ nếu nâng cấp phiên bản
self.addEventListener('activate', (event) => {
event.waitUntil(
caches.keys().then((keys) => {
return Promise.all(
keys.map((key) => {
if (key !== CACHE_NAME) {
console.log('[LEAF_AI SW] Removing old cache:', key);
return caches.delete(key);
}
})
);
}).then(() => self.clients.claim())
);
});
// Fetch: Chiến lược Network First, Fallback to Cache
self.addEventListener('fetch', (event) => {
// Chỉ cache các request HTTP/HTTPS và GET
if (event.request.method !== 'GET') return;
event.respondWith(
fetch(event.request)
.then((networkResponse) => {
if (networkResponse && networkResponse.status === 200) {
const responseClone = networkResponse.clone();
caches.open(CACHE_NAME).then((cache) => {
cache.put(event.request, responseClone);
});
}
return networkResponse;
})
.catch(() => {
// Nếu offline, lấy từ cache
return caches.match(event.request).then((cachedResponse) => {
if (cachedResponse) {
return cachedResponse;
}
if (event.request.mode === 'navigate') {
return caches.match('./index.html');
}
});
})
);
});
|