From 1b1aacc6f0a38cc1d856cd207adfb43f8132cfb0 Mon Sep 17 00:00:00 2001 From: Oleksii Date: Thu, 18 Aug 2022 00:42:48 +0300 Subject: [PATCH] global listeners: .on('*', listener) --- dist/events.js | 46 ++++++++++++++++++++++++++++------------------ dist/metacom.js | 2 +- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/dist/events.js b/dist/events.js index 1e66789b..7198a687 100644 --- a/dist/events.js +++ b/dist/events.js @@ -7,12 +7,18 @@ const warnAboutMemoryLeak = (eventName, count) => ); export default class EventEmitter { + globalEventName = '*'; + constructor() { this.events = new Map(); - this.globalListeners = new Set(); + this.events.set(this.globalEventName, new Set()); this.maxListenersCount = 10; } + isGlobalEvent(name) { + return name === this.globalEventName; + } + getMaxListeners() { return this.maxListenersCount; } @@ -34,16 +40,6 @@ export default class EventEmitter { } } - onAny(fn) { - const tooManyListeners = this.globalListeners.size > this.maxListenersCount; - if (tooManyListeners) warnAboutMemoryLeak('*', this.globalListeners.size); - this.globalListeners.add(fn); - } - - clearGlobalListeners() { - this.globalListeners.clear(); - } - once(name, fn) { const dispose = (...args) => { this.remove(name, dispose); @@ -53,13 +49,21 @@ export default class EventEmitter { } emit(name, ...args) { + if (this.isGlobalEvent(name)) + throw new Error( + `Cannot emit '${this.globalEventName}'. It is reserved for global listeners.`, + ); const event = this.events.get(name); - if (!event && !this.globalListeners.size) return; - for (const fn of event.values()) { - fn(...args); + if (event) { + for (const fn of event.values()) { + fn(...args); + } } - for (const fn of this.globalListeners.values()) { - fn(name, ...args); + const globalListeners = this.events.get(this.globalEventName); + if (globalListeners.size) { + for (const fn of globalListeners.values()) { + fn(name, ...args); + } } } @@ -72,7 +76,13 @@ export default class EventEmitter { } clear(name) { - if (name) this.events.delete(name); - else this.events.clear(); + const globalListeners = this.events.get(this.globalEventName); + if (!name) { + this.events.clear(); + globalListeners.clear(); + return; + } + if (this.isGlobalEvent(name)) globalListeners.clear(); + else this.events.delete(name); } } diff --git a/dist/metacom.js b/dist/metacom.js index d3b06c23..155930c5 100644 --- a/dist/metacom.js +++ b/dist/metacom.js @@ -158,7 +158,7 @@ export class Metacom extends EventEmitter { for (const methodName of methodNames) { methods[methodName] = request(methodName); } - methods.onAny((eventName, data) => { + methods.on('*', (eventName, data) => { const target = `${interfaceName}/${eventName}`; const packet = { event: ++this.eventId, [target]: data }; this.send(JSON.stringify(packet));