// Split chunks are fetched lazily, so a deploy (or desktop server swap)// between page load and a later fetch can 404 the old hashed assets. One// reload picks up the fresh index.html. A sessionStorage flag keeps a// persistent failure from becoming a reload loop, and a successful boot clears// it so the next stale deploy gets its own single reload.const CHUNK_RELOAD_GUARD_KEY = "t3code:chunk-load-reloaded";/** * Called from the `vite:preloadError` listener. Reloads at most once per * failure streak and returns whether it did, so the caller knows whether to * swallow the event or let the error surface through the normal paths. */export function reloadOnceForChunkLoadError( getStorage: () => Storage = () => window.sessionStorage, reload: () => void = () => window.location.reload(),): boolean { let alreadyReloaded: boolean; try { const storage = getStorage(); alreadyReloaded = storage.getItem(CHUNK_RELOAD_GUARD_KEY) === "1"; if (!alreadyReloaded) storage.setItem(CHUNK_RELOAD_GUARD_KEY, "1"); } catch { // Without storage the guard cannot survive a reload, so a persistent // failure would loop forever. Let the error surface instead. return false; } if (alreadyReloaded) return false; reload(); return true;}/** Clears the guard after a successful boot so a later stale deploy can reload again. */export function clearChunkReloadGuard(getStorage: () => Storage = () => window.sessionStorage) { try { getStorage().removeItem(CHUNK_RELOAD_GUARD_KEY); } catch { // Blocked storage never held the flag. }}
// Split chunks are fetched lazily, so a deploy (or desktop server swap)
// between page load and a later fetch can 404 the old hashed assets. One
// reload picks up the fresh index.html. A sessionStorage flag keeps a
// persistent failure from becoming a reload loop, and a successful boot clears
// it so the next stale deploy gets its own single reload.
const CHUNK_RELOAD_GUARD_KEY = "t3code:chunk-load-reloaded";
/**
* Called from the `vite:preloadError` listener. Reloads at most once per
* failure streak and returns whether it did, so the caller knows whether to
* swallow the event or let the error surface through the normal paths.
*/
export function reloadOnceForChunkLoadError(
getStorage: () => Storage = () => window.sessionStorage,
reload: () => void = () => window.location.reload(),
): boolean {
let alreadyReloaded: boolean;
try {
const storage = getStorage();
alreadyReloaded = storage.getItem(CHUNK_RELOAD_GUARD_KEY) === "1";
if (!alreadyReloaded) storage.setItem(CHUNK_RELOAD_GUARD_KEY, "1");
} catch {
// Without storage the guard cannot survive a reload, so a persistent
// failure would loop forever. Let the error surface instead.
return false;
}
if (alreadyReloaded) return false;
reload();
return true;
}
/** Clears the guard after a successful boot so a later stale deploy can reload again. */
export function clearChunkReloadGuard(getStorage: () => Storage = () => window.sessionStorage) {
try {
getStorage().removeItem(CHUNK_RELOAD_GUARD_KEY);
} catch {
// Blocked storage never held the flag.
}
}