sing-song-player-3vx0f39v / service-worker.js
soiz1's picture
Update service-worker.js
9daf3ee
raw
history blame
2.87 kB
const CACHE_NAME = 'my-cache-v1';
let cachedFiles = [
'/index.html' // index.htmlは常にキャッシュ
];
// メッセージ受信処理
self.addEventListener('message', (event) => {
if (event.data && event.data.type === 'CACHE_FILES') {
cachedFiles = ['/index.html', ...event.data.files]; // index.htmlは常に含める
// チェックボックスの状態を保存
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);
})
);
});