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
JavaScript
"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