feat: add shared runtime and PI datasource handlers
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
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();
|
||||
Reference in New Issue
Block a user