evnty
Version:
Async-first, reactive event handling library for complex event flows in browser and Node.js
102 lines (100 loc) • 2.35 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: Object.getOwnPropertyDescriptor(all, name).get
});
}
_export(exports, {
get Async () {
return Async;
},
get Disposer () {
return Disposer;
}
});
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]();
}
}
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.cjs.map