diff --git a/service_worker.js b/service_worker.js index 09f2ee9..d826c6d 100644 --- a/service_worker.js +++ b/service_worker.js @@ -96,6 +96,7 @@ const serve_response_from_dir = async event => { self.addEventListener("fetch", event => { const url = new URL(event.request.url) + if(url.pathname.startsWith(FILES_ROOT)) { event.respondWith(serve_response_from_dir(event)) } diff --git a/src/filesystem.js b/src/filesystem.js index c772873..a7bc2b0 100644 --- a/src/filesystem.js +++ b/src/filesystem.js @@ -17,11 +17,34 @@ const send_message = (message) => { globalThis.clear_directory_handle = () => { send_message({type: 'SET_DIR_HANDLE', data: null}) + clearInterval(keepalive_interval_id) + keepalive_interval_id = null window.location.reload() } let dir_handle +let keepalive_interval_id + +/* +Service worker is killed by the browser after 40 seconds of inactivity see +https://github.com/mswjs/msw/issues/367 + +There is hard 5 minute limit on service worker lifetime See +https://chromium.googlesource.com/chromium/src/+/master/docs/security/service-worker-security-faq.md#do-service-workers-live-forever + +Keep reviving serivce worker, so when user reloads page, dir_handle is picked +up from service worker +*/ +const keep_service_worker_alive = () => { + if(keepalive_interval_id != null) { + return + } + keepalive_interval_id = setInterval(() => { + send_message({type: 'SET_DIR_HANDLE', data: dir_handle}) + }, 10_000) +} + const request_directory_handle = async () => { dir_handle = await globalThis.showDirectoryPicker() await send_message({type: 'SET_DIR_HANDLE', data: dir_handle}) @@ -38,7 +61,7 @@ export const init_window_service_worker = window => { }) } -export const load_persisted_directory_handle = () => { +const load_persisted_directory_handle = () => { return navigator.serviceWorker.register('service_worker.js') .then(() => navigator.serviceWorker.ready) /* @@ -142,9 +165,11 @@ export const load_dir = async (should_request_access) => { handle = await request_directory_handle() } else { handle = await load_persisted_directory_handle() - if(handle == null) { - return null - } + } + if(handle == null) { + return null + } else { + keep_service_worker_alive() } return do_load_dir(handle, null) }