UNPKG

evnty

Version:

Async-first, reactive event handling library for complex event flows in browser and Node.js

84 lines (82 loc) 1.97 kB
export class Disposer { #target; #abortSignal; constructor(target, abortSignal){ if (abortSignal?.aborted) return; this.#target = target; if (abortSignal) { this.#abortSignal = abortSignal; abortSignal.addEventListener('abort', this); } } get disposed() { return !this.#target; } [Symbol.dispose]() { if (!this.#target) return false; this.#target = undefined; if (this.#abortSignal) { this.#abortSignal.removeEventListener('abort', this); this.#abortSignal = undefined; } return true; } handleEvent() { this.#target?.[Symbol.dispose](); } } export class Async { #sink; #disposer; constructor(abortSignal){ this.#disposer = new Disposer(this, abortSignal); } get disposed() { return this.#disposer.disposed; } get sink() { return this.#sink ??= this.emit.bind(this); } handleEvent(event) { this.emit(event); } catch(onrejected) { return this.receive().catch(onrejected); } finally(onfinally) { return this.receive().finally(onfinally); } then(onfulfilled, onrejected) { return this.receive().then(onfulfilled, onrejected); } async next() { try { const value = await this.receive(); return { value, done: false }; } catch { return { value: undefined, done: true }; } } async return() { this.dispose?.(); return { value: undefined, done: true }; } [Symbol.asyncIterator]() { return this; } [Symbol.dispose]() { if (this.#disposer[Symbol.dispose]()) { this.dispose?.(); } } } //# sourceMappingURL=async.js.map