GoonCord/src/core/vendetta/Emitter.ts
pylixonly 122c3a11e9 feat(storage): port storage api from dev
move old storage api as legacy
2024-10-13 11:29:42 +08:00

46 lines
1.2 KiB
TypeScript

export enum Events {
GET = "GET",
SET = "SET",
DEL = "DEL",
}
export type EmitterEvent = "SET" | "GET" | "DEL";
export interface EmitterListenerData {
path: string[];
value?: any;
}
export type EmitterListener = (
event: EmitterEvent,
data: EmitterListenerData | any
) => any;
export type EmitterListeners = Record<string, Set<EmitterListener>>;
export class Emitter {
listeners = Object.values(Events).reduce<EmitterListeners>(
(acc, val: string) => ((acc[val] = new Set<EmitterListener>()), acc),
{}
) as EmitterListeners;
on(event: EmitterEvent, listener: EmitterListener) {
if (!this.listeners[event].has(listener)) this.listeners[event].add(listener);
}
off(event: EmitterEvent, listener: EmitterListener) {
this.listeners[event].delete(listener);
}
once(event: EmitterEvent, listener: EmitterListener) {
const once = (event: EmitterEvent, data: EmitterListenerData) => {
this.off(event, once);
listener(event, data);
};
this.on(event, once);
}
emit(event: EmitterEvent, data: EmitterListenerData) {
for (const listener of this.listeners[event]) listener(event, data);
}
}