evnty
Version:
Async-first, reactive event handling library for complex event flows in browser and Node.js
165 lines (163 loc) • 4.06 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 Event () {
return Event;
},
get EventIterator () {
return EventIterator;
},
get createEvent () {
return createEvent;
},
get createInterval () {
return createInterval;
},
get default () {
return _default;
},
get merge () {
return merge;
}
});
const _asynccjs = require("./async.cjs");
const _signalcjs = require("./signal.cjs");
const _listenerregistrycjs = require("./listener-registry.cjs");
const _dispatchresultcjs = require("./dispatch-result.cjs");
class EventIterator {
#signal;
constructor(signal){
this.#signal = signal;
}
async next() {
try {
const value = await this.#signal.receive();
return {
value,
done: false
};
} catch {
return {
value: undefined,
done: true
};
}
}
async return() {
return {
value: undefined,
done: true
};
}
}
class Event {
#listeners = new _listenerregistrycjs.ListenerRegistry();
#signal = new _signalcjs.Signal();
#disposer;
#onDispose;
#sink;
[Symbol.toStringTag] = 'Event';
constructor(onDispose){
this.#onDispose = onDispose;
this.#disposer = new _asynccjs.Disposer(this);
}
get sink() {
return this.#sink ??= this.emit.bind(this);
}
handleEvent(event) {
this.emit(event);
}
get size() {
return this.#listeners.size;
}
emit(value) {
this.#signal.emit(value);
return new _dispatchresultcjs.DispatchResult(this.#listeners.dispatch(value));
}
lacks(listener) {
return !this.#listeners.has(listener);
}
has(listener) {
return this.#listeners.has(listener);
}
off(listener) {
this.#listeners.off(listener);
return this;
}
on(listener) {
this.#listeners.on(listener);
return ()=>void this.off(listener);
}
once(listener) {
this.#listeners.once(listener);
return ()=>void this.off(listener);
}
clear() {
this.#listeners.clear();
return this;
}
receive() {
return this.#signal.receive();
}
then(onfulfilled, onrejected) {
return this.receive().then(onfulfilled, onrejected);
}
catch(onrejected) {
return this.receive().catch(onrejected);
}
finally(onfinally) {
return this.receive().finally(onfinally);
}
settle() {
return this.receive().then((value)=>({
status: 'fulfilled',
value
}), (reason)=>({
status: 'rejected',
reason
}));
}
[Symbol.asyncIterator]() {
return new EventIterator(this.#signal);
}
dispose() {
this[Symbol.dispose]();
}
[Symbol.dispose]() {
if (this.#disposer[Symbol.dispose]()) {
this.#signal[Symbol.dispose]();
this.#listeners.clear();
void this.#onDispose?.();
}
}
}
const merge = (...events)=>{
const mergedEvent = new Event(()=>{
for (const event of events){
event.off(mergedEvent.sink);
}
});
for (const event of events){
event.on(mergedEvent.sink);
}
return mergedEvent;
};
const createInterval = (interval)=>{
let counter = 0;
const intervalEvent = new Event(()=>clearInterval(timerId));
const timerId = setInterval(()=>{
intervalEvent.emit(counter++);
}, interval);
return intervalEvent;
};
const createEvent = ()=>new Event();
const _default = createEvent;
//# sourceMappingURL=event.cjs.map