const CACHE_NAME = 'file-viewer-cache-v3'; // バージョンを更新 const API_URLS_TO_CACHE = [ '/get_file_json' ]; const STATIC_CACHE_URLS = [ '/', '/dev.html' ]; // インストール時に静的リソースとAPIエンドポイントをキャッシュ self.addEventListener('install', event => { event.waitUntil( caches.open(CACHE_NAME) .then(cache => cache.addAll([...STATIC_CACHE_URLS, ...API_URLS_TO_CACHE])) .then(() => self.skipWaiting()) ); }); // アクティベート時に古いキャッシュを削除 self.addEventListener('activate', event => { event.waitUntil( caches.keys().then(cacheNames => { return Promise.all( cacheNames.map(cache => { if (cache !== CACHE_NAME) { return caches.delete(cache); } }) ); }).then(() => self.clients.claim()) ); }); // ファイル一覧を取得してキャッシュする関数 const cacheFilesList = async () => { try { // APIエンドポイントをキャッシュ const apiResponse = await fetch('/get_file_json'); if (apiResponse.ok) { const cache = await caches.open(CACHE_NAME); await cache.put('/get_file_json', apiResponse.clone()); } } catch (err) { console.error('Failed to cache files list:', err); } }; // fetchイベントの処理 self.addEventListener('fetch', event => { const requestUrl = new URL(event.request.url); // APIリクエストか共有ファイルへのリクエストかをチェック if (requestUrl.pathname === '/get_file_json' || requestUrl.pathname.startsWith('/shared_files/')) { event.respondWith( caches.match(event.request) .then(cachedResponse => { // キャッシュがあればそれを返す if (cachedResponse) { return cachedResponse; } // ネットワークから取得してキャッシュ return fetch(event.request) .then(networkResponse => { if (networkResponse.ok) { const responseToCache = networkResponse.clone(); caches.open(CACHE_NAME) .then(cache => cache.put(event.request, responseToCache)); } return networkResponse; }) .catch(() => { // オフライン時にエラーメッセージを返す if (requestUrl.pathname === '/get_file_json') { return new Response(JSON.stringify({ current_dir: '', files: [], dirs: [], parent_dir: '' }), { headers: { 'Content-Type': 'application/json' } }); } return new Response('
このリソースはオフラインで利用できません
', { headers: { 'Content-Type': 'text/html' } }); }); }) ); } else { // その他のリクエストは通常通り処理 event.respondWith( caches.match(event.request) .then(cachedResponse => cachedResponse || fetch(event.request)) ); } }); // メッセージを受信してキャッシュを更新 self.addEventListener('message', event => { if (event.data === 'update-cache') { event.waitUntil(cacheFilesList()); } });