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 => { self.addEventListener("fetch", event => {
const url = new URL(event.request.url) const url = new URL(event.request.url)
if(url.pathname.startsWith(FILES_ROOT)) { if(url.pathname.startsWith(FILES_ROOT)) {
event.respondWith(serve_response_from_dir(event)) event.respondWith(serve_response_from_dir(event))
} }

View File

@@ -17,11 +17,34 @@ const send_message = (message) => {
globalThis.clear_directory_handle = () => { globalThis.clear_directory_handle = () => {
send_message({type: 'SET_DIR_HANDLE', data: null}) send_message({type: 'SET_DIR_HANDLE', data: null})
clearInterval(keepalive_interval_id)
keepalive_interval_id = null
window.location.reload() window.location.reload()
} }
let dir_handle 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 () => { const request_directory_handle = async () => {
dir_handle = await globalThis.showDirectoryPicker() dir_handle = await globalThis.showDirectoryPicker()
await send_message({type: 'SET_DIR_HANDLE', data: dir_handle}) 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') return navigator.serviceWorker.register('service_worker.js')
.then(() => navigator.serviceWorker.ready) .then(() => navigator.serviceWorker.ready)
/* /*
@@ -142,9 +165,11 @@ export const load_dir = async (should_request_access) => {
handle = await request_directory_handle() handle = await request_directory_handle()
} else { } else {
handle = await load_persisted_directory_handle() handle = await load_persisted_directory_handle()
}
if(handle == null) { if(handle == null) {
return null return null
} } else {
keep_service_worker_alive()
} }
return do_load_dir(handle, null) return do_load_dir(handle, null)
} }