d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 1 | import { writable } from 'svelte/store'; |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 2 | import { mayAutoReload } from './engine-build'; |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 3 | |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 4 | const ENGINE_RELOAD_GUARD = 'malice-engine-reload'; |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 5 | |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 6 | export const engineStale = writable(false); |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 7 | export const engineRecovered = writable(0); |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 8 | |
5d6f6e2eb5a5 | atagen | 2026-10-27 05:42 UTC | 9 | let release: () => Promise<void> = () => Promise.resolve(); |
5d6f6e2eb5a5 | atagen | 2026-10-27 05:42 UTC | 10 | |
5d6f6e2eb5a5 | atagen | 2026-10-27 05:42 UTC | 11 | export function setEngineRelease(fn: () => Promise<void>): void { |
5d6f6e2eb5a5 | atagen | 2026-10-27 05:42 UTC | 12 | release = fn; |
5d6f6e2eb5a5 | atagen | 2026-10-27 05:42 UTC | 13 | } |
5d6f6e2eb5a5 | atagen | 2026-10-27 05:42 UTC | 14 | |
5d6f6e2eb5a5 | atagen | 2026-10-27 05:42 UTC | 15 | export function releaseEngine(): Promise<void> { |
5d6f6e2eb5a5 | atagen | 2026-10-27 05:42 UTC | 16 | return release(); |
5d6f6e2eb5a5 | atagen | 2026-10-27 05:42 UTC | 17 | } |
5d6f6e2eb5a5 | atagen | 2026-10-27 05:42 UTC | 18 | |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 19 | function reloadWhenHidden(): void { |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 20 | if (document.visibilityState !== 'hidden') return; |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 21 | const last = Number(sessionStorage.getItem(ENGINE_RELOAD_GUARD)) || null; |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 22 | const now = Date.now(); |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 23 | if (!mayAutoReload(now, last)) return; |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 24 | sessionStorage.setItem(ENGINE_RELOAD_GUARD, String(now)); |
5d6f6e2eb5a5 | atagen | 2026-10-27 05:42 UTC | 25 | void releaseEngine().then(() => window.location.reload()); |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 26 | } |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 27 | |
5d6f6e2eb5a5 | atagen | 2026-10-27 05:42 UTC | 28 | /** |
5d6f6e2eb5a5 | atagen | 2026-10-27 05:42 UTC | 29 | * Tabs in a handover leave the reload to the service worker activation. A hidden tab reloading |
5d6f6e2eb5a5 | atagen | 2026-10-27 05:42 UTC | 30 | * ahead of it lands on the new build under the old service worker and gets reloaded again. |
5d6f6e2eb5a5 | atagen | 2026-10-27 05:42 UTC | 31 | */ |
5d6f6e2eb5a5 | atagen | 2026-10-27 05:42 UTC | 32 | export function markEngineStale(autoReload = true): void { |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 33 | engineStale.set(true); |
5d6f6e2eb5a5 | atagen | 2026-10-27 05:42 UTC | 34 | if (!autoReload) return; |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 35 | document.addEventListener('visibilitychange', reloadWhenHidden); |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 36 | reloadWhenHidden(); |
d9be72fdb393 | atagen | 2026-10-26 09:23 UTC | 37 | } |