evnty
Version:
Async-first, reactive event handling library for complex event flows in browser and Node.js
1 lines • 5.12 kB
Source Map (JSON)
{"version":3,"sources":["../src/async.ts"],"sourcesContent":["import { Action, Fn, Emitter, MaybePromise, Promiseable } from './types.js';\n\n/**\n * @internal\n */\nexport class Disposer {\n #target?: Disposable;\n #abortSignal?: AbortSignal;\n\n constructor(target: Disposable, abortSignal?: AbortSignal) {\n if (abortSignal?.aborted) return;\n this.#target = target;\n if (abortSignal) {\n this.#abortSignal = abortSignal;\n abortSignal.addEventListener('abort', this);\n }\n }\n\n get disposed(): boolean {\n return !this.#target;\n }\n\n [Symbol.dispose](): boolean {\n if (!this.#target) return false;\n this.#target = undefined;\n // Stryker disable all: cleanup is memory optimization, no observable behavior after disposal\n if (this.#abortSignal) {\n this.#abortSignal.removeEventListener('abort', this);\n this.#abortSignal = undefined;\n }\n // Stryker restore all\n return true;\n }\n\n handleEvent(): void {\n // Stryker disable next-line OptionalChaining: #target is always set when abort listener fires (synchronous code)\n this.#target?.[Symbol.dispose]();\n }\n}\n\n/**\n * @internal\n */\nexport interface Async<T, R> extends Emitter<T, R>, Disposable {}\n\n/**\n * @internal\n */\nexport abstract class Async<T, R> implements Emitter<T, R>, Promiseable<T>, Promise<T>, AsyncIterator<T, void, void>, AsyncIterable<T> {\n abstract [Symbol.toStringTag]: string;\n abstract emit(value: T): R;\n abstract receive(): Promise<T>;\n\n dispose?(): void;\n\n #sink?: Fn<[T], R>;\n #disposer: Disposer;\n\n constructor(abortSignal?: AbortSignal) {\n this.#disposer = new Disposer(this, abortSignal);\n }\n\n get disposed(): boolean {\n return this.#disposer.disposed;\n }\n\n get sink(): Fn<[T], R> {\n return (this.#sink ??= this.emit.bind(this));\n }\n\n handleEvent(event: T) {\n this.emit(event);\n }\n\n catch<OK = never>(onrejected?: Fn<[unknown], MaybePromise<OK>> | null): Promise<T | OK> {\n return this.receive().catch(onrejected);\n }\n\n finally(onfinally?: Action | null): Promise<T> {\n return this.receive().finally(onfinally);\n }\n\n then<OK = T, ERR = never>(onfulfilled?: Fn<[T], MaybePromise<OK>> | null, onrejected?: Fn<[unknown], MaybePromise<ERR>> | null): Promise<OK | ERR> {\n return this.receive().then(onfulfilled, onrejected);\n }\n\n async next(): Promise<IteratorResult<T, void>> {\n try {\n const value = await this.receive();\n return { value, done: false };\n } catch {\n return { value: undefined, done: true };\n }\n }\n\n async return(): Promise<IteratorResult<T, void>> {\n // Stryker disable next-line OptionalChaining: all subclasses define dispose()\n this.dispose?.();\n return { value: undefined, done: true };\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T, void, void> {\n return this;\n }\n\n [Symbol.dispose](): void {\n if (this.#disposer[Symbol.dispose]()) {\n // Stryker disable next-line OptionalChaining: all subclasses define dispose()\n this.dispose?.();\n }\n }\n}\n"],"names":["Async","Disposer","target","abortSignal","aborted","addEventListener","disposed","Symbol","dispose","undefined","removeEventListener","handleEvent","sink","emit","bind","event","catch","onrejected","receive","finally","onfinally","then","onfulfilled","next","value","done","return","asyncIterator"],"mappings":";;;;;;;;;;;QAgDsBA;eAAAA;;QA3CTC;eAAAA;;;AAAN,MAAMA;IACX,CAAA,MAAO,CAAc;IACrB,CAAA,WAAY,CAAe;IAE3B,YAAYC,MAAkB,EAAEC,WAAyB,CAAE;QACzD,IAAIA,aAAaC,SAAS;QAC1B,IAAI,CAAC,CAAA,MAAO,GAAGF;QACf,IAAIC,aAAa;YACf,IAAI,CAAC,CAAA,WAAY,GAAGA;YACpBA,YAAYE,gBAAgB,CAAC,SAAS,IAAI;QAC5C;IACF;IAEA,IAAIC,WAAoB;QACtB,OAAO,CAAC,IAAI,CAAC,CAAA,MAAO;IACtB;IAEA,CAACC,OAAOC,OAAO,CAAC,GAAY;QAC1B,IAAI,CAAC,IAAI,CAAC,CAAA,MAAO,EAAE,OAAO;QAC1B,IAAI,CAAC,CAAA,MAAO,GAAGC;QAEf,IAAI,IAAI,CAAC,CAAA,WAAY,EAAE;YACrB,IAAI,CAAC,CAAA,WAAY,CAACC,mBAAmB,CAAC,SAAS,IAAI;YACnD,IAAI,CAAC,CAAA,WAAY,GAAGD;QACtB;QAEA,OAAO;IACT;IAEAE,cAAoB;QAElB,IAAI,CAAC,CAAA,MAAO,EAAE,CAACJ,OAAOC,OAAO,CAAC;IAChC;AACF;AAUO,MAAeR;IAOpB,CAAA,IAAK,CAAc;IACnB,CAAA,QAAS,CAAW;IAEpB,YAAYG,WAAyB,CAAE;QACrC,IAAI,CAAC,CAAA,QAAS,GAAG,IAAIF,SAAS,IAAI,EAAEE;IACtC;IAEA,IAAIG,WAAoB;QACtB,OAAO,IAAI,CAAC,CAAA,QAAS,CAACA,QAAQ;IAChC;IAEA,IAAIM,OAAmB;QACrB,OAAQ,IAAI,CAAC,CAAA,IAAK,KAAK,IAAI,CAACC,IAAI,CAACC,IAAI,CAAC,IAAI;IAC5C;IAEAH,YAAYI,KAAQ,EAAE;QACpB,IAAI,CAACF,IAAI,CAACE;IACZ;IAEAC,MAAkBC,UAAmD,EAAmB;QACtF,OAAO,IAAI,CAACC,OAAO,GAAGF,KAAK,CAACC;IAC9B;IAEAE,QAAQC,SAAyB,EAAc;QAC7C,OAAO,IAAI,CAACF,OAAO,GAAGC,OAAO,CAACC;IAChC;IAEAC,KAA0BC,WAA8C,EAAEL,UAAoD,EAAqB;QACjJ,OAAO,IAAI,CAACC,OAAO,GAAGG,IAAI,CAACC,aAAaL;IAC1C;IAEA,MAAMM,OAAyC;QAC7C,IAAI;YACF,MAAMC,QAAQ,MAAM,IAAI,CAACN,OAAO;YAChC,OAAO;gBAAEM;gBAAOC,MAAM;YAAM;QAC9B,EAAE,OAAM;YACN,OAAO;gBAAED,OAAOf;gBAAWgB,MAAM;YAAK;QACxC;IACF;IAEA,MAAMC,SAA2C;QAE/C,IAAI,CAAClB,OAAO;QACZ,OAAO;YAAEgB,OAAOf;YAAWgB,MAAM;QAAK;IACxC;IAEA,CAAClB,OAAOoB,aAAa,CAAC,GAAiC;QACrD,OAAO,IAAI;IACb;IAEA,CAACpB,OAAOC,OAAO,CAAC,GAAS;QACvB,IAAI,IAAI,CAAC,CAAA,QAAS,CAACD,OAAOC,OAAO,CAAC,IAAI;YAEpC,IAAI,CAACA,OAAO;QACd;IACF;AACF"}