SPB Git forge

spb/market-atlas

Public
12commits 1branches 0releases
1.1 MBsize
maindefault branch
10 days agolast push
TypeScript 96.7% SQL 1.6% CSS 0.8% JavaScript 0.5%
1.3 KB · 39 lines typescript
Raw Blame History
1import { EventEmitter } from "node:events";2import type { CanonicalQuote, ConnectorHealth, MarketEvent, Observation, RawObservation } from "@market-atlas/market-model";34/**5 * Internal market bus. In-process today (modular monolith); the topic names mirror the6 * spec so that a NATS/Redpanda transport can replace this class without touching producers.7 */8export interface BusTopics {9  "raw.observation": RawObservation;10  "normalized.observation": Observation;11  "canonical.quote": CanonicalQuote;12  "market.event": MarketEvent;13  "connector.health": ConnectorHealth;14  "market.state": { exchangeId: string; state: string; at: number };15}1617type Handler<T> = (msg: T) => void;1819export class MarketBus {20  private emitter = new EventEmitter({ captureRejections: false });21  readonly counters: Record<string, number> = {};2223  constructor() {24    this.emitter.setMaxListeners(200);25  }2627  publish<K extends keyof BusTopics>(topic: K, msg: BusTopics[K]): void {28    this.counters[topic] = (this.counters[topic] ?? 0) + 1;29    this.emitter.emit(topic, msg);30  }3132  subscribe<K extends keyof BusTopics>(topic: K, handler: Handler<BusTopics[K]>): () => void {33    this.emitter.on(topic, handler);34    return () => this.emitter.off(topic, handler);35  }36}3738export const bus = new MarketBus();39