refactor: tighten project structure and strengthen tooling

This commit is contained in:
Tom Boullay
2026-04-16 10:45:05 +02:00
parent fd8b462e1c
commit 71c22386be
57 changed files with 362 additions and 519 deletions
+54 -1
View File
@@ -1 +1,54 @@
// src/utils/EventEmitter.ts
type Listener<TPayload> = (payload: TPayload) => void;
export class EventEmitter<TEvents extends Record<string, unknown>> {
private readonly listeners = new Map<
keyof TEvents,
Set<Listener<TEvents[keyof TEvents]>>
>();
on<TKey extends keyof TEvents>(
event: TKey,
listener: Listener<TEvents[TKey]>,
): () => void {
const currentListeners = this.listeners.get(event) ?? new Set();
currentListeners.add(listener as Listener<TEvents[keyof TEvents]>);
this.listeners.set(event, currentListeners);
return () => {
this.off(event, listener);
};
}
off<TKey extends keyof TEvents>(
event: TKey,
listener: Listener<TEvents[TKey]>,
): void {
const currentListeners = this.listeners.get(event);
if (!currentListeners) {
return;
}
currentListeners.delete(listener as Listener<TEvents[keyof TEvents]>);
if (currentListeners.size === 0) {
this.listeners.delete(event);
}
}
emit<TKey extends keyof TEvents>(event: TKey, payload: TEvents[TKey]): void {
const currentListeners = this.listeners.get(event);
if (!currentListeners) {
return;
}
currentListeners.forEach((listener) => {
listener(payload as TEvents[keyof TEvents]);
});
}
clear(): void {
this.listeners.clear();
}
}