File size: 1,689 Bytes
9d43c0f 69869ba a5593e0 69869ba 9d43c0f 69869ba 9d43c0f 69869ba 9d43c0f a5593e0 69869ba a5593e0 69869ba 8bab24f 69869ba 8bab24f |
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 |
const CACHE_NAME = 'media-player-cache-v1';
let cachedFiles = [
'/index.html', '/index.html?mode=t',
'/v.mp4', '/t/v.mp4',
'/p.mp3', '/s.mp3', '/a.mp3', '/t.mp3', '/k.mp3',
'/t/p.mp3', '/t/s.mp3', '/t/a.mp3', '/t/t.mp3', '/t/k.mp3'
];
// install: ファイルを個別にキャッシュ
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE_NAME).then(async cache => {
console.log('キャッシュを追加中:', cachedFiles);
await Promise.allSettled(
cachedFiles.map(file =>
cache.add(file).catch(err => console.warn(`キャッシュ失敗: ${file}`, err))
)
);
})
);
});
// fetch: キャッシュ優先
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request).then(response => {
return response || fetch(event.request);
})
);
});
// message: 動的にファイルを更新する場合の処理
self.addEventListener('message', (event) => {
if (event.data?.type === 'CACHE_FILES') {
const files = event.data.files || [];
cachedFiles = ['/index.html', ...files];
event.waitUntil(
caches.open(CACHE_NAME).then(async cache => {
await Promise.allSettled(
cachedFiles.map(file =>
cache.add(file).catch(err => console.warn(`キャッシュ失敗: ${file}`, err))
)
);
const keys = await cache.keys();
const validPaths = new Set(cachedFiles);
for (const request of keys) {
const path = new URL(request.url).pathname;
if (!validPaths.has(path)) {
await cache.delete(request);
}
}
})
);
}
});
|