forma-embedded-view-sdk
Version:
The Forma Embedded View SDK is a JavaScript library for creating custom extensions in Autodesk Forma (previously Spacemaker).
45 lines (44 loc) • 1.33 kB
JavaScript
/**
* A pub/sub implementation that queues events until a subscriber is added.
* There is no event name/type, so all events are of the same type.
*
* The first subscriber will receive any previously queued events.
*/
export class QueuedPubSub {
#eventTarget = new EventTarget();
#queued = [];
#subscribers = new Set();
subscribe(handler) {
const internalHandler = (_event) => {
const event = _event;
handler(event.detail);
};
const subscriber = Symbol();
this.#subscribers.add(subscriber);
this.#eventTarget.addEventListener("event", internalHandler);
if (this.#queued.length > 0) {
const queued = this.#queued;
this.#queued = [];
for (const data of queued) {
this.#dispatch(data);
}
}
return () => {
this.#subscribers.delete(subscriber);
this.#eventTarget.removeEventListener("event", internalHandler);
};
}
publish(data) {
if (this.#subscribers.size === 0) {
this.#queued.push(data);
}
else {
this.#dispatch(data);
}
}
#dispatch(data) {
this.#eventTarget.dispatchEvent(new CustomEvent("event", {
detail: data,
}));
}
}