import { logError } from "./logService"; /** * Data-change channel (#396, ADR 0022). * * The writes that may move a counter read elsewhere (the getting-started path * reads `COUNTERS_SQL` and the import folder) call `notifyDataChanged()` once * they have succeeded. The message only says "data that counters read may have * changed": it carries no payload, and the data layer does not know who * listens. Subscribers re-read on their own terms (the onboarding provider * waits 150 ms to group a burst, then ignores any stale answer). * * Modeled on `logService.subscribe`, without React. */ type DataChangedListener = () => void; const listeners = new Set(); /** * Tells every subscriber that data read by counters may have changed. Never * throws: a subscriber that fails is logged and the others still run, so a * write that succeeded is never reported as failed because of a listener. */ export function notifyDataChanged(): void { // Iterate over a copy: a listener may unsubscribe while being called. for (const listener of [...listeners]) { try { listener(); } catch (e) { logError( "Data events: a subscriber failed", e instanceof Error ? e.message : String(e), ); } } } /** Subscribes to data changes. Returns the function that unsubscribes. */ export function subscribeDataChanged(listener: DataChangedListener): () => void { listeners.add(listener); return () => { listeners.delete(listener); }; }