evnty
Version:
0-Deps, simple, fast, for browser and node js reactive anonymous event library
73 lines (71 loc) • 1.96 kB
JavaScript
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