Skip to content

Instantly share code, notes, and snippets.

@itays
Created April 3, 2020 09:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save itays/3f837ac47f035d33eae579f574b45213 to your computer and use it in GitHub Desktop.
Save itays/3f837ac47f035d33eae579f574b45213 to your computer and use it in GitHub Desktop.
Singelton EventEmitter in TypeScript
// based on different implementations from this thread https://gist.github.com/mudge/5830382
export type Listener = (...args: any[]) => void;
export type Events = Record<string, Set<Listener>>;
class EventEmitter {
private events: Events = {};
on(event: string, listener: Listener) {
if (typeof this.events[event] !== "object") {
this.events[event] = new Set();
}
this.events[event].add(listener);
return () => this.removeListener(event, listener);
}
once(event: string, listener: Listener) {
const remove = this.on(event, (...args: any[]) => {
remove();
listener.apply(this, args);
});
}
emit(event: string, ...args: any[]) {
if (typeof this.events[event] !== "object") {
return;
}
const listeners = Array.from(this.events[event]);
listeners.forEach((listener) => listener.apply(this, args));
}
removeListener(event: string, listener: Listener) {
if (typeof this.events[event] !== "object") {
return;
}
this.events[event].delete(listener);
}
removeAllListeners() {
Object.keys(this.events).forEach((event) => this.events[event].clear());
}
}
const instance = new EventEmitter();
Object.freeze(instance);
export default instance;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment