UNPKG

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
/** * 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, })); } }