Wie implementiert man einen EventBus für ein TypeScript-basiertes CLI-Framework (climonad.js)?
Posted: 12 Jan 2025, 03:54
Ich entwickle derzeit ein CLI-Framework namens climonad.js – das in TypeScript geschrieben ist – und ich möchte einen Event-Bus-Mechanismus einführen, um verschiedene Ereignisse (z. B. Fehler, Befehlslebenszyklusbenachrichtigungen, Nutzungsverfolgung) zu verarbeiten und zu versenden ). Mein Ziel ist es, diese Bedenken zu entkoppeln, damit andere Module auf Ereignisse warten und darauf reagieren können, ohne auf Node.js-spezifische Module (wie das integrierte „events“-Paket) angewiesen zu sein.
Unten ist ein kurzes Konzept der Art von EventBus, an die ich gedacht habe:
Beispielverwendung könnte so aussehen:
Ich hoffe auf Feedback zu den folgenden Punkten:
Ähnliches Problem: https://github.com/supitsdu/climonad.js/issues/23
Unten ist ein kurzes Konzept der Art von EventBus, an die ich gedacht habe:
Code: Select all
export class EventBus {
private listeners: Record> = {}
/**
* Register an event listener for a specified event.
*/
public on(event: string, listener: (...args: unknown[]) => void): void {
if (!this.listeners[event]) {
this.listeners[event] = []
}
this.listeners[event].push(listener)
}
/**
* Unregister an event listener.
*/
public off(event: string, listener: (...args: unknown[]) => void): void {
if (this.listeners[event]) {
this.listeners[event] = this.listeners[event].filter(l => l !== listener)
}
}
/**
* Emit an event to all registered listeners.
*/
public emit(event: string, ...args: unknown[]): void {
if (this.listeners[event]) {
for (const listener of this.listeners[event]) {
listener(...args)
}
}
}
}
Code: Select all
import { EventBus } from "./EventBus"
const bus = new EventBus()
// Subscribe to an "error" event
bus.on("error", (err: unknown) => {
console.error("[climonad.js] Error:", err)
})
// Emit the error somewhere else in the code
try {
// Some CLI-specific action...
} catch (e) {
bus.emit("error", e)
}
- Gibt es einen idiomatischeren oder empfohlenen Ansatz? Implementieren einer Pub/Sub- oder ereignisbasierten Architektur in einem TypeScript-CLI-Projekt?
- Sehen Sie irgendwelche Fallstricke in diesem simplen Design (wie potenzielle Speicherlecks oder Leistungsprobleme), wenn die CLI groß wird? oder wird häufig ausgeführt?
- Würden Sie Schlagen Sie vor, irgendeine Art von Prioritätsbehandlung oder asynchroner Ereignisverarbeitung für fortgeschrittenere CLI-Aufgaben einzuführen?
- Gibt es bekannte Muster für die Überbrückung von Ereignisemissionen zwischen verschiedenen Modulen (z. B. Nutzungsverfolgung, Fehlerprotokollierung) in a CLI-Kontext, den ich untersuchen sollte?
Ähnliches Problem: https://github.com/supitsdu/climonad.js/issues/23