keepalive service_worker

This commit is contained in:
Dmitry Vasilev
2023-06-19 10:26:39 +03:00
parent e404fa9275
commit 571db0bf41
2 changed files with 30 additions and 4 deletions

View File

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

View File

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