import type { WorkbenchEvent } from "../api/workbench-sync-client"; export type WorkbenchStreamNotification = | { type: "open" | "disconnect" | "reset" } | { type: "events"; events: WorkbenchEvent[] }; /** Presentation observes wire events before business acknowledgements or snapshot filtering. */ export class WorkbenchEventChannel { private listeners = new Set<(notification: WorkbenchStreamNotification) => void>(); private live = false; subscribe = (listener: (notification: WorkbenchStreamNotification) => void) => { this.listeners.add(listener); listener({ type: this.live ? "open" : "disconnect" }); return () => { this.listeners.delete(listener); }; }; publish(notification: WorkbenchStreamNotification) { if (notification.type !== "events") this.live = notification.type === "open"; for (const listener of this.listeners) { // One presentation observer must not interrupt authoritative business synchronization. try { listener(notification); } catch { /* Observers own their error presentation. */ } } } }