|
const CACHE_NAME = 'my-cache-v1'; |
|
let cachedFiles = [ |
|
'/index.html' |
|
]; |
|
|
|
|
|
self.addEventListener('message', (event) => { |
|
if (event.data && event.data.type === 'CACHE_FILES') { |
|
cachedFiles = ['/index.html', ...event.data.files]; |
|
|
|
|
|
if (event.data.checkboxStates) { |
|
event.waitUntil( |
|
caches.open('settings-cache').then(cache => { |
|
return cache.put( |
|
new Request('checkbox-states'), |
|
new Response(JSON.stringify(event.data.checkboxStates)) |
|
}) |
|
); |
|
} |
|
|
|
|
|
event.waitUntil( |
|
caches.open(CACHE_NAME).then(cache => { |
|
return cache.addAll(cachedFiles).catch(error => { |
|
console.error('キャッシュ追加エラー:', error); |
|
}); |
|
}) |
|
); |
|
} |
|
}); |
|
|
|
|
|
self.addEventListener('install', event => { |
|
event.waitUntil( |
|
caches.open(CACHE_NAME).then(cache => { |
|
return cache.addAll(cachedFiles).catch(error => { |
|
console.error('初期キャッシュエラー:', error); |
|
}); |
|
}) |
|
); |
|
self.skipWaiting(); |
|
}); |
|
|
|
|
|
self.addEventListener('activate', event => { |
|
event.waitUntil( |
|
caches.keys().then(keys => |
|
Promise.all( |
|
keys.map(key => { |
|
if (key !== CACHE_NAME && key !== 'settings-cache') { |
|
return caches.delete(key); |
|
} |
|
}) |
|
) |
|
) |
|
); |
|
self.clients.claim(); |
|
}); |
|
|
|
|
|
self.addEventListener('fetch', event => { |
|
const url = new URL(event.request.url); |
|
const path = url.pathname; |
|
|
|
|
|
if (!cachedFiles.includes(path)) { |
|
return fetch(event.request); |
|
} |
|
|
|
event.respondWith( |
|
fetch(event.request) |
|
.then(response => { |
|
|
|
const responseClone = response.clone(); |
|
caches.open(CACHE_NAME).then(cache => { |
|
cache.put(event.request, responseClone); |
|
}); |
|
return response; |
|
}) |
|
.catch(() => { |
|
|
|
return caches.match(event.request); |
|
}) |
|
); |
|
}); |