UNPKG

evnty

Version:

0-Deps, simple, fast, for browser and node js reactive anonymous event library

1 lines 4.39 kB
{"version":3,"sources":["../src/signal.ts"],"sourcesContent":["import { Callable } from './callable.js';\n\n/**\n * Signal<T> is a callable construct for sending and receiving a single asynchronous value.\n * It implements both Promise<T> and AsyncIterable<T>, allowing it to be awaited once\n * or iterated over with `for await...of`. Once signaled, it resolves the pending promise.\n *\n * @template T - The type of value the signal carries.\n * @param abortSignal - Optional AbortSignal used to abort waiting and reject the promise.\n */\nexport class Signal<T> extends Callable<[T], boolean> implements Promise<T>, AsyncIterable<T> {\n private rx?: PromiseWithResolvers<T>;\n\n constructor(private readonly abortSignal?: AbortSignal) {\n super((value: T) => {\n if (this.rx) {\n this.rx.resolve(value);\n this.rx = undefined;\n return true;\n } else {\n return false;\n }\n });\n this.abortSignal?.addEventListener(\n 'abort',\n () => {\n this.rx?.reject(this.abortSignal!.reason);\n this.rx = undefined;\n },\n { once: true },\n );\n }\n\n get [Symbol.toStringTag](): string {\n return `Signal(${this.abortSignal?.aborted ? 'stopped' : 'active'})`;\n }\n\n /**\n * Returns the internal promise that resolves with the signaled value.\n */\n get promise(): Promise<T> {\n return this.next();\n }\n\n /**\n * Waits for the next signal value or rejects if aborted.\n * @returns A promise resolving to the value of type T.\n */\n async next() {\n if (this.abortSignal?.aborted) {\n return Promise.reject(this.abortSignal.reason);\n }\n if (!this.rx) {\n this.rx = Promise.withResolvers<T>();\n }\n return this.rx.promise;\n }\n\n catch<OK = never>(onrejected?: ((reason: any) => OK | PromiseLike<OK>) | null): Promise<T | OK> {\n return this.promise.catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.promise.finally(onfinally);\n }\n\n then<OK = T, ERR = never>(\n onfulfilled?: ((value: T) => OK | PromiseLike<OK>) | null,\n onrejected?: ((reason: unknown) => ERR | PromiseLike<ERR>) | null,\n ): Promise<OK | ERR> {\n return this.promise.then(onfulfilled, onrejected);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T, void, void> {\n return {\n next: async () => {\n try {\n const value = await this;\n return { value, done: false };\n } catch {\n return { value: undefined, done: true };\n }\n },\n return: () => {\n return Promise.resolve({ value: undefined, done: true });\n },\n };\n }\n}\n"],"names":["Signal","Callable","rx","constructor","abortSignal","value","resolve","undefined","addEventListener","reject","reason","once","Symbol","toStringTag","aborted","promise","next","Promise","withResolvers","catch","onrejected","finally","onfinally","then","onfulfilled","asyncIterator","done","return"],"mappings":";;;;+BAUaA;;;eAAAA;;;6BAVY;AAUlB,MAAMA,eAAkBC,qBAAQ;;IAC7BC,GAA6B;IAErCC,YAAY,AAAiBC,WAAyB,CAAE;QACtD,KAAK,CAAC,CAACC;YACL,IAAI,IAAI,CAACH,EAAE,EAAE;gBACX,IAAI,CAACA,EAAE,CAACI,OAAO,CAACD;gBAChB,IAAI,CAACH,EAAE,GAAGK;gBACV,OAAO;YACT,OAAO;gBACL,OAAO;YACT;QACF,SAT2BH,cAAAA;QAU3B,IAAI,CAACA,WAAW,EAAEI,iBAChB,SACA;YACE,IAAI,CAACN,EAAE,EAAEO,OAAO,IAAI,CAACL,WAAW,CAAEM,MAAM;YACxC,IAAI,CAACR,EAAE,GAAGK;QACZ,GACA;YAAEI,MAAM;QAAK;IAEjB;IAEA,IAAI,CAACC,OAAOC,WAAW,CAAC,GAAW;QACjC,OAAO,CAAC,OAAO,EAAE,IAAI,CAACT,WAAW,EAAEU,UAAU,YAAY,SAAS,CAAC,CAAC;IACtE;IAKA,IAAIC,UAAsB;QACxB,OAAO,IAAI,CAACC,IAAI;IAClB;IAMA,MAAMA,OAAO;QACX,IAAI,IAAI,CAACZ,WAAW,EAAEU,SAAS;YAC7B,OAAOG,QAAQR,MAAM,CAAC,IAAI,CAACL,WAAW,CAACM,MAAM;QAC/C;QACA,IAAI,CAAC,IAAI,CAACR,EAAE,EAAE;YACZ,IAAI,CAACA,EAAE,GAAGe,QAAQC,aAAa;QACjC;QACA,OAAO,IAAI,CAAChB,EAAE,CAACa,OAAO;IACxB;IAEAI,MAAkBC,UAA2D,EAAmB;QAC9F,OAAO,IAAI,CAACL,OAAO,CAACI,KAAK,CAACC;IAC5B;IAEAC,QAAQC,SAA+B,EAAc;QACnD,OAAO,IAAI,CAACP,OAAO,CAACM,OAAO,CAACC;IAC9B;IAEAC,KACEC,WAAyD,EACzDJ,UAAiE,EAC9C;QACnB,OAAO,IAAI,CAACL,OAAO,CAACQ,IAAI,CAACC,aAAaJ;IACxC;IAEA,CAACR,OAAOa,aAAa,CAAC,GAAiC;QACrD,OAAO;YACLT,MAAM;gBACJ,IAAI;oBACF,MAAMX,QAAQ,MAAM,IAAI;oBACxB,OAAO;wBAAEA;wBAAOqB,MAAM;oBAAM;gBAC9B,EAAE,OAAM;oBACN,OAAO;wBAAErB,OAAOE;wBAAWmB,MAAM;oBAAK;gBACxC;YACF;YACAC,QAAQ;gBACN,OAAOV,QAAQX,OAAO,CAAC;oBAAED,OAAOE;oBAAWmB,MAAM;gBAAK;YACxD;QACF;IACF;AACF"}