UNPKG

rc-js-util

Version:

A collection of TS and C++ utilities to help writing performant and correct applications, achieved through strict typing and (removable) invariant checking.

73 lines 2.22 kB
/** * @public * Like {@link BroadcastChannel} but without holding strong references. Available in debug contexts only. */ export class DebugWeakBroadcastChannel { constructor(key) { this.key = key; this.listenersSet = new Set(); this.listenersMap = new WeakMap(); } addListener(maybeStore, listener) { if (listener == null) { // no store was supplied listener = maybeStore; } else { // we have both args maybeStore.registerCleanup(() => this.removeListener(listener)); } this.removeListener(listener); const ref = new WeakRef(listener); this.listenersSet.add(ref); this.listenersMap.set(listener, ref); } addOneTimeListener(maybeStore, listener) { if (listener == null) { // no store was supplied listener = maybeStore; } const temporaryListener = { [this.key]: (...args) => { this.removeListener(temporaryListener); return listener[this.key](...args); } }; this.addListener(temporaryListener); if (listener != null) { maybeStore.registerCleanup(() => this.removeListener(temporaryListener)); } } emit(...args) { this.listenersSet.forEach(ref => { const listener = ref.deref(); if (listener == null) { this.listenersSet.delete(ref); } else { listener[this.key](...args); } }); } removeListener(listener) { const ref = this.listenersMap.get(listener); if (ref != null) { this.listenersMap.delete(listener); this.listenersSet.delete(ref); } } getTargets() { const targets = []; this.listenersSet.forEach(ref => { const listener = ref.deref(); if (listener == null) { this.listenersSet.delete(ref); } else { targets.push(listener); } }); return targets; } } //# sourceMappingURL=debug-weak-broadcast-event.js.map