import { EventFeed } from "./event-feed"; import { InflightTracker } from "./inflight-tracker"; import { MetricsPoller } from "./metrics-poller"; import { type LlamaSwapConfig } from "./util"; class Runtime { readonly tracker = new InflightTracker(); offline = true; private feed?: EventFeed; private poller?: MetricsPoller; private listeners = new Set<() => void>(); ensureConnections(cfg: LlamaSwapConfig): void { if (!this.feed) { this.feed = new EventFeed(cfg, (ev) => { this.tracker.apply(ev); this.emit(); }); this.feed.setStatusHandler((connected) => { this.offline = !connected; this.emit(); }); this.feed.start(); } if (!this.poller) { this.poller = new MetricsPoller(cfg); this.poller.on(() => this.emit()); this.poller.start(); } } get pollerInstance(): MetricsPoller | undefined { return this.poller; } subscribe(listener: () => void): () => void { this.listeners.add(listener); return () => { this.listeners.delete(listener); }; } private emit(): void { for (const listener of this.listeners) listener(); } } export const runtime = new Runtime();