mirror of
https://github.com/leporello-js/leporello-js
synced 2026-01-13 13:04:30 -08:00
keepalive service_worker
This commit is contained in:
@@ -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))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
}
|
||||||
return null
|
if(handle == null) {
|
||||||
}
|
return null
|
||||||
|
} else {
|
||||||
|
keep_service_worker_alive()
|
||||||
}
|
}
|
||||||
return do_load_dir(handle, null)
|
return do_load_dir(handle, null)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user