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.

77 lines 2.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DebugWeakBroadcastChannel = void 0; /** * @public * Like {@link BroadcastChannel} but without holding strong references. Available in debug contexts only. */ 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; } } exports.DebugWeakBroadcastChannel = DebugWeakBroadcastChannel; //# sourceMappingURL=debug-weak-broadcast-event.js.map