UNPKG

evnty

Version:

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

73 lines (71 loc) 1.96 kB
import { Callable } from "./callable.js"; export class Signal extends Callable { abortSignal; rx; constructor(abortSignal){ super((value)=>{ if (this.rx) { this.rx.resolve(value); this.rx = undefined; return true; } else { return false; } }), this.abortSignal = abortSignal; this.abortSignal?.addEventListener('abort', ()=>{ this.rx?.reject(this.abortSignal.reason); this.rx = undefined; }, { once: true }); } get [Symbol.toStringTag]() { return `Signal(${this.abortSignal?.aborted ? 'stopped' : 'active'})`; } get promise() { return this.next(); } async next() { if (this.abortSignal?.aborted) { return Promise.reject(this.abortSignal.reason); } if (!this.rx) { this.rx = Promise.withResolvers(); } return this.rx.promise; } catch(onrejected) { return this.promise.catch(onrejected); } finally(onfinally) { return this.promise.finally(onfinally); } then(onfulfilled, onrejected) { return this.promise.then(onfulfilled, onrejected); } [Symbol.asyncIterator]() { return { next: async ()=>{ try { const value = await this; return { value, done: false }; } catch { return { value: undefined, done: true }; } }, return: ()=>{ return Promise.resolve({ value: undefined, done: true }); } }; } } //# sourceMappingURL=signal.js.map