evOo-local/apps/web/src/lib/preload-recovery.ts
cynarAI 6c7eed7580 Initial clean evOo-local from f00577b
Fresh history cut from cynarAI/evoo antigravity-handoff/project-timeline
(Voice First + project timeline). Brand docs/titles as evOo; keep @rakazo/*
packages as tech debt. Excludes node_modules, caches, secrets, voice blobs.
2026-09-20 17:15:16 +02:00

36 lines
1.1 KiB
TypeScript

const PRELOAD_RECOVERY_KEY = "rk:preload-recovery";
const PRELOAD_RECOVERY_COOLDOWN_MS = 30_000;
type PreloadRecoveryWindow = Pick<
Window,
| "addEventListener"
| "clearTimeout"
| "location"
| "removeEventListener"
| "sessionStorage"
| "setTimeout"
>;
/**
* Vite emits this event when a lazy chunk from an older deployment no longer
* exists. Reload once so the browser receives the current asset manifest.
*/
export function installPreloadRecovery(target: PreloadRecoveryWindow = window): () => void {
const clearRecovery = target.setTimeout(
() => target.sessionStorage.removeItem(PRELOAD_RECOVERY_KEY),
PRELOAD_RECOVERY_COOLDOWN_MS,
);
const onPreloadError = (event: Event) => {
if (target.sessionStorage.getItem(PRELOAD_RECOVERY_KEY)) return;
event.preventDefault();
target.sessionStorage.setItem(PRELOAD_RECOVERY_KEY, "1");
target.location.reload();
};
target.addEventListener("vite:preloadError", onPreloadError);
return () => {
target.clearTimeout(clearRecovery);
target.removeEventListener("vite:preloadError", onPreloadError);
};
}