atagen

malice

public
Star0
Watch0
d67da9aec471fb9247bdddcbce01c951d6ae9854
2
ssh://brewery@pls.lobotomise.me:33/atagen/malice.git

Blame: web/src/lib/engine-state.ts

d9be72fdb393atagen2026-10-26 09:23 UTC1
import { writable } from 'svelte/store';
d9be72fdb393atagen2026-10-26 09:23 UTC2
import { mayAutoReload } from './engine-build';
d9be72fdb393atagen2026-10-26 09:23 UTC3
d9be72fdb393atagen2026-10-26 09:23 UTC4
const ENGINE_RELOAD_GUARD = 'malice-engine-reload';
d9be72fdb393atagen2026-10-26 09:23 UTC5
d9be72fdb393atagen2026-10-26 09:23 UTC6
export const engineStale = writable(false);
d9be72fdb393atagen2026-10-26 09:23 UTC7
export const engineRecovered = writable(0);
d9be72fdb393atagen2026-10-26 09:23 UTC8
5d6f6e2eb5a5atagen2026-10-27 05:42 UTC9
let release: () => Promise<void> = () => Promise.resolve();
5d6f6e2eb5a5atagen2026-10-27 05:42 UTC10
5d6f6e2eb5a5atagen2026-10-27 05:42 UTC11
export function setEngineRelease(fn: () => Promise<void>): void {
5d6f6e2eb5a5atagen2026-10-27 05:42 UTC12
  release = fn;
5d6f6e2eb5a5atagen2026-10-27 05:42 UTC13
}
5d6f6e2eb5a5atagen2026-10-27 05:42 UTC14
5d6f6e2eb5a5atagen2026-10-27 05:42 UTC15
export function releaseEngine(): Promise<void> {
5d6f6e2eb5a5atagen2026-10-27 05:42 UTC16
  return release();
5d6f6e2eb5a5atagen2026-10-27 05:42 UTC17
}
5d6f6e2eb5a5atagen2026-10-27 05:42 UTC18
d9be72fdb393atagen2026-10-26 09:23 UTC19
function reloadWhenHidden(): void {
d9be72fdb393atagen2026-10-26 09:23 UTC20
  if (document.visibilityState !== 'hidden') return;
d9be72fdb393atagen2026-10-26 09:23 UTC21
  const last = Number(sessionStorage.getItem(ENGINE_RELOAD_GUARD)) || null;
d9be72fdb393atagen2026-10-26 09:23 UTC22
  const now = Date.now();
d9be72fdb393atagen2026-10-26 09:23 UTC23
  if (!mayAutoReload(now, last)) return;
d9be72fdb393atagen2026-10-26 09:23 UTC24
  sessionStorage.setItem(ENGINE_RELOAD_GUARD, String(now));
5d6f6e2eb5a5atagen2026-10-27 05:42 UTC25
  void releaseEngine().then(() => window.location.reload());
d9be72fdb393atagen2026-10-26 09:23 UTC26
}
d9be72fdb393atagen2026-10-26 09:23 UTC27
5d6f6e2eb5a5atagen2026-10-27 05:42 UTC28
/**
5d6f6e2eb5a5atagen2026-10-27 05:42 UTC29
 * Tabs in a handover leave the reload to the service worker activation. A hidden tab reloading
5d6f6e2eb5a5atagen2026-10-27 05:42 UTC30
 * ahead of it lands on the new build under the old service worker and gets reloaded again.
5d6f6e2eb5a5atagen2026-10-27 05:42 UTC31
 */
5d6f6e2eb5a5atagen2026-10-27 05:42 UTC32
export function markEngineStale(autoReload = true): void {
d9be72fdb393atagen2026-10-26 09:23 UTC33
  engineStale.set(true);
5d6f6e2eb5a5atagen2026-10-27 05:42 UTC34
  if (!autoReload) return;
d9be72fdb393atagen2026-10-26 09:23 UTC35
  document.addEventListener('visibilitychange', reloadWhenHidden);
d9be72fdb393atagen2026-10-26 09:23 UTC36
  reloadWhenHidden();
d9be72fdb393atagen2026-10-26 09:23 UTC37
}