Add QueuedEventEmitter, use it for GuildSavedMessages events

This commit is contained in:
Dragory 2018-11-24 14:58:54 +02:00
parent 01d73565b6
commit effaff5dc8
3 changed files with 77 additions and 3 deletions

38
src/QueuedEventEmitter.ts Normal file
View file

@ -0,0 +1,38 @@
import { Queue } from "./Queue";
type Listener = (...args: any[]) => void;
export class QueuedEventEmitter {
protected listeners: Map<string, Listener[]>;
protected queue: Queue;
constructor() {
this.listeners = new Map();
this.queue = new Queue();
}
on(eventName: string, listener: Listener) {
if (!this.listeners.has(eventName)) {
this.listeners.set(eventName, []);
}
this.listeners.get(eventName).push(listener);
}
off(eventName: string, listener: Listener) {
if (!this.listeners.has(eventName)) {
return;
}
const listeners = this.listeners.get(eventName);
listeners.splice(listeners.indexOf(listener), 1);
}
emit(eventName: string, args: any[] = []) {
const listeners = [...(this.listeners.get(eventName) || []), ...(this.listeners.get("*") || [])];
listeners.forEach(listener => {
this.queue.add(listener.bind(null, args));
});
}
}