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);
          }
        }
      })
    );
  }
});