@haelp/teto
Version:
A typescript-based controllable TETR.IO client.
1 lines • 5.41 kB
Source Map (JSON)
{"version":3,"sources":["../../src/utils/events.ts"],"sourcesContent":["export class EventEmitter<T extends Record<string, any>> {\n #listeners: [keyof T, Function, boolean][];\n #maxListeners: number = 10;\n\n /** Enables more debugging logs for memory leaks */\n verbose = false;\n\n constructor() {\n this.#listeners = [];\n }\n\n on<K extends keyof T>(event: K, cb: (data: T[K]) => void) {\n this.#listeners.push([event, cb, false]);\n\n const listeners = this.#listeners.filter(([e]) => e === event);\n if (listeners.length > this.#maxListeners) {\n console.warn(\n `Max listeners exceeded for event \"${String(event)}\". Current: ${\n this.#listeners.filter(([e]) => e === event).length\n }, Max: ${this.#maxListeners}`\n );\n if (this.verbose)\n console.warn(\n `Trace: ${new Error().stack}\\n\\nListeners:\\n`,\n listeners.map(([_, fn]) => fn.toString()).join(\"\\n\\n\")\n );\n }\n return this;\n }\n\n off<K extends keyof T>(event: K, cb: (data: T[K]) => void) {\n this.#listeners = this.#listeners.filter(\n ([e, c]) => e !== event || c !== cb\n );\n return this;\n }\n\n emit<K extends keyof T>(event: K, data: T[K]) {\n const toRemove = new Set<number>();\n\n this.#listeners.forEach(([e, cb, once], idx) => {\n if (e !== event) return;\n cb(data);\n if (once) toRemove.add(idx);\n });\n\n this.#listeners = this.#listeners.filter((_, idx) => !toRemove.has(idx));\n\n return this;\n }\n\n once<K extends keyof T>(event: K, cb: (data: T[K]) => any | Promise<any>) {\n this.#listeners.push([event, cb, true]);\n\n return this;\n }\n\n removeAllListeners<K extends keyof T>(event?: K) {\n if (event) {\n this.#listeners = this.#listeners.filter(([e]) => e !== event);\n } else {\n this.#listeners = [];\n }\n }\n\n set maxListeners(n: number) {\n if (n <= 0 || !Number.isInteger(n)) {\n throw new RangeError(\"Max listeners must be a positive integer\");\n }\n\n this.#maxListeners = n;\n }\n\n get maxListeners() {\n return this.#maxListeners;\n }\n\n export() {\n return {\n listeners: this.#listeners.map(([event, cb, once]) => ({\n event,\n cb,\n once\n })),\n maxListeners: this.#maxListeners,\n verbose: this.verbose\n };\n }\n\n import(data: ReturnType<EventEmitter<T>[\"export\"]>) {\n data.listeners.forEach(({ event, cb, once }) => {\n if (once) {\n this.once(event, cb as any);\n } else {\n this.on(event, cb as any);\n }\n });\n this.#maxListeners = data.maxListeners;\n this.verbose = data.verbose;\n return this;\n }\n}\n"],"names":["EventEmitter","verbose","on","event","cb","push","listeners","filter","e","length","console","warn","String","Error","stack","map","_","fn","toString","join","off","c","emit","data","toRemove","Set","forEach","once","idx","add","has","removeAllListeners","maxListeners","n","Number","isInteger","RangeError","export","import"],"mappings":"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"}