// Ship trace records to the daemon at Night Bloom. Daemon down is normal // (Space/demo mode) — buffer in localStorage and retry at the next sleep, // so no day's labels are lost to a napping daemon. import type { TraceRecord } from "../engine"; const BUFFER_KEY = "puck:trace-buffer"; export async function exportTraces(records: TraceRecord[]): Promise { let buffered: TraceRecord[] = []; try { buffered = JSON.parse(localStorage.getItem(BUFFER_KEY) ?? "[]"); } catch (e) { console.error("puck: corrupt trace buffer, dropping it", e); } const all = [...buffered, ...records]; if (!all.length) return; try { const res = await fetch("/api/traces", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ records: all }), signal: AbortSignal.timeout(5000), }); if (!res.ok) throw new Error(`daemon rejected traces: ${res.status}`); localStorage.removeItem(BUFFER_KEY); } catch { localStorage.setItem(BUFFER_KEY, JSON.stringify(all)); } }