From cca92d71afb4fd58c20a5911f5ca7ec796649562 Mon Sep 17 00:00:00 2001 From: Oleksii Date: Thu, 11 Aug 2022 23:21:47 +0300 Subject: [PATCH] client (browser) emitting events to server --- dist/events.js | 16 +++++++++++++++- dist/metacom.js | 6 ++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/dist/events.js b/dist/events.js index 6552a285..1e66789b 100644 --- a/dist/events.js +++ b/dist/events.js @@ -9,6 +9,7 @@ const warnAboutMemoryLeak = (eventName, count) => export default class EventEmitter { constructor() { this.events = new Map(); + this.globalListeners = new Set(); this.maxListenersCount = 10; } @@ -33,6 +34,16 @@ 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); @@ -43,10 +54,13 @@ export default class EventEmitter { emit(name, ...args) { const event = this.events.get(name); - if (!event) return; + if (!event && !this.globalListeners.size) return; for (const fn of event.values()) { fn(...args); } + for (const fn of this.globalListeners.values()) { + fn(name, ...args); + } } remove(name, fn) { diff --git a/dist/metacom.js b/dist/metacom.js index f0e84388..d3b06c23 100644 --- a/dist/metacom.js +++ b/dist/metacom.js @@ -36,6 +36,7 @@ export class Metacom extends EventEmitter { this.calls = new Map(); this.streams = new Map(); this.streamId = 0; + this.eventId = 0; this.active = false; this.connected = false; this.opening = null; @@ -157,6 +158,11 @@ export class Metacom extends EventEmitter { for (const methodName of methodNames) { methods[methodName] = request(methodName); } + methods.onAny((eventName, data) => { + const target = `${interfaceName}/${eventName}`; + const packet = { event: ++this.eventId, [target]: data }; + this.send(JSON.stringify(packet)); + }); this.api[interfaceName] = methods; } }