import type { SnapshotMessage } from '@/shared' import { isRecord, num, parseSnapshot } from './guards' /** * 断线时继续出屏靠这份 localStorage 快照(06 第 8 节)。 * * 只保留最近一份:现场大屏内存有限,历史版本没有回放价值; * 读到的内容仍要过一遍 parseSnapshot,避免旧版本格式把渲染炸掉。 */ const SNAPSHOT_KEY = 'scoreboard:display:snapshot' export interface CachedSnapshot { version: number savedAt: number snapshot: SnapshotMessage } export function readCachedSnapshot(): CachedSnapshot | null { try { const raw = localStorage.getItem(SNAPSHOT_KEY) if (raw === null) return null const parsed: unknown = JSON.parse(raw) if (!isRecord(parsed)) return null const snapshot = parseSnapshot(parsed.snapshot) if (snapshot === null) return null return { version: snapshot.version, savedAt: num(parsed.savedAt), snapshot } } catch { // 隐私模式或配额异常时静默降级:缓存只是兜底,不能因此不出屏。 return null } } export function writeCachedSnapshot(snapshot: SnapshotMessage): void { try { localStorage.setItem( SNAPSHOT_KEY, JSON.stringify({ version: snapshot.version, savedAt: Date.now(), snapshot }), ) } catch { // 写失败同样只影响断线兜底,不阻断实时数据上屏。 } }