- Migrated console.error() calls to structured logger.warn() and logger.error() throughout codebase. - Updated os.tmpdir() import style in browser tool from destructured to namespace import.
34 lines
836 B
TypeScript
34 lines
836 B
TypeScript
import { logger } from "@oh-my-pi/pi-utils";
|
|
|
|
export class EventBus {
|
|
readonly #listeners = new Map<string, Set<(data: unknown) => void>>();
|
|
|
|
emit(channel: string, data: unknown): void {
|
|
const handlers = this.#listeners.get(channel);
|
|
if (handlers) {
|
|
for (const handler of handlers) {
|
|
handler(data);
|
|
}
|
|
}
|
|
}
|
|
|
|
on(channel: string, handler: (data: unknown) => void): () => void {
|
|
if (!this.#listeners.has(channel)) {
|
|
this.#listeners.set(channel, new Set());
|
|
}
|
|
const safeHandler = async (data: unknown) => {
|
|
try {
|
|
await handler(data);
|
|
} catch (err) {
|
|
logger.error("Event handler error", { channel, error: String(err) });
|
|
}
|
|
};
|
|
this.#listeners.get(channel)!.add(safeHandler);
|
|
return () => this.#listeners.get(channel)?.delete(safeHandler);
|
|
}
|
|
|
|
clear(): void {
|
|
this.#listeners.clear();
|
|
}
|
|
}
|