Skip to content

Instantly share code, notes, and snippets.

@nobu-sh
Created January 4, 2022 03:15
Show Gist options
  • Save nobu-sh/2b28b8b391988ed64dae36f15e4ea780 to your computer and use it in GitHub Desktop.
Save nobu-sh/2b28b8b391988ed64dae36f15e4ea780 to your computer and use it in GitHub Desktop.
Typescript & Javascript EventEmitter
// Javascript EventEmitter Polyfill by [Nobu](https://github.com/NobUwU)
export class EventEmitter {
constructor(max = 25) {
this._listeners = new Map()
this.max = max
}
// Override toString/name Methods
static get [Symbol.toStringTag]() {
return '[undefined EventEmitter]'
}
static get [Symbol.name]() {
return 'EventEmitter'
}
static toString() {
return '[undefined EventEmitter]'
}
get [Symbol.toStringTag]() {
return '[object EventEmitter]'
}
get [Symbol.name]() {
return 'EventEmitter'
}
toString() {
return '[object EventEmitter]'
}
// Primary Methods
addListener(event, listener) {
if (this._listeners.size >= this.max)
console.warn(`warning: possible EventEmitter memory leak detected. ${this._listeners.size} listeners registered.`)
this._listeners.set(event, [...(this._listeners.get(event) ?? []), listener])
}
removeListener(event, listener) {
const listeners = this._listeners.get(event)
listeners?.splice(listeners?.indexOf(listener))
}
removeListeners(event) {
this._listeners.delete(event)
}
removeAllListeners() {
this._listeners.clear()
}
envokeEvent(event, ...args) {
this._listeners.get(event)?.forEach((listener) => {
listener(...args)
})
}
listeners(event) {
return this._listeners.get(event)
}
listenerCount(event){
return this._listeners.get(event)?.length ?? 0
}
getMaxListeners = () => this.max
setMaxListeners(n) {
this.max = n
}
// Abstracted Methods
on(event, listener) {
this.addListener(event, listener)
}
off(event, listener) {
this.removeListener(event, listener)
}
emit(event, ...args) {
this.envokeEvent(event, ...args)
}
once(event, listener) {
const newListener = (...args) => {
listener(...args)
this.removeListener(event, newListener)
}
this.addListener(event, newListener)
}
}
// Typescript EventEmitter Polyfill by [Nobu](https://github.com/NobUwU)
export class EventEmitter {
private readonly _listeners = new Map<string, CallableFunction[]>()
private max: number
public constructor(max = 25) {
this.max = max
}
// Override toString/name Methods
public static get [Symbol.toStringTag](): string {
return '[undefined EventEmitter]'
}
public static get [Symbol.name](): string {
return 'EventEmitter'
}
public static toString(): string {
return '[undefined EventEmitter]'
}
public get [Symbol.toStringTag](): string {
return '[object EventEmitter]'
}
public get [Symbol.name](): string {
return 'EventEmitter'
}
public toString(): string {
return '[object EventEmitter]'
}
// Primary Methods
public addListener(event: string, listener: CallableFunction): void {
if (this._listeners.size >= this.max)
console.warn(`warning: possible EventEmitter memory leak detected. ${this._listeners.size} listeners registered.`)
this._listeners.set(event, [...(this._listeners.get(event) ?? []), listener])
}
public removeListener(event: string, listener: CallableFunction): void {
const listeners = this._listeners.get(event)
listeners?.splice(listeners?.indexOf(listener))
}
public removeListeners(event: string): void {
this._listeners.delete(event)
}
public removeAllListeners(): void {
this._listeners.clear()
}
public envokeEvent(event: string, ...args: unknown[]): void {
this._listeners.get(event)?.forEach((listener) => {
listener(...args)
})
}
public listeners(event: string): CallableFunction[] | undefined {
return this._listeners.get(event)
}
public listenerCount(event: string): number {
return this._listeners.get(event)?.length ?? 0
}
public getMaxListeners = () => this.max
public setMaxListeners(n: number): void {
this.max = n
}
// Abstracted Methods
public on(event: string, listener: CallableFunction) {
this.addListener(event, listener)
}
public off(event: string, listener: CallableFunction) {
this.removeListener(event, listener)
}
public emit(event: string, ...args: unknown[]) {
this.envokeEvent(event, ...args)
}
public once(event: string, listener: CallableFunction): void {
const newListener = (...args: unknown[]) => {
listener(...args)
this.removeListener(event, newListener)
}
this.addListener(event, newListener)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment