@akala/core
Version:
154 lines • 5.64 kB
JavaScript
import { AsyncTeardownManager } from "../teardown-manager.js";
/**
* Wrapper class for EventEmitter to manage subscriptions.
* @template T
* @implements {Disposable}
*/
export class EventBusWrapper extends AsyncTeardownManager {
emitter;
constructor(emitter) {
super();
this.emitter = emitter;
emitter.once(Symbol.dispose, (() => this[Symbol.dispose]()));
}
subscriptions = [];
/**
* Checks if there are listeners for a given event.
* @template TKey
* @param {TKey} name - The name of the event.
* @returns {boolean} - True if there are listeners, false otherwise.
*/
hasListener(name) {
return this.emitter.hasListener(name);
}
/**
* Gets the defined events.
* @returns {string[]} - An array of defined event names.
*/
get definedEvents() {
return this.emitter.definedEvents;
}
/**
* Emits an event.
* @template TEvent
* @param {TEvent} event - The event to emit.
* @param {...EventArgs<T[TEvent]>} args - The arguments to pass to the event listeners.
* @returns {false | EventReturnType<T[TEvent]>} - The return value of the event listeners or false if the event does not exist.
*/
emit(event, ...args) {
return this.emitter.emit(event, ...args);
}
/**
* Adds a listener for an event.
* @template TEvent
* @param {TEvent} event - The event to listen to.
* @param {EventListener<AllEvents<T>[TEvent]>} handler - The event handler.
* @param {EventOptions<AllEvents<T>[TEvent]>} [options] - The event options.
* @returns {Subscription} - The subscription.
*/
on(event, handler, options) {
const sub = this.emitter.on(event, handler, options);
this.subscriptions.push(sub);
return sub;
}
/**
* Adds a one-time listener for an event.
* @template TEvent
* @param {TEvent} event - The event to listen to.
* @param {EventListener<AllEvents<T>[TEvent]>} handler - The event handler.
* @param {Omit<EventOptions<AllEvents<T>[TEvent]>, "once">} [options] - The event options.
* @returns {Subscription} - The subscription.
*/
once(event, handler, options) {
const sub = this.emitter.once(event, handler, options);
this.subscriptions.push(sub);
return sub;
}
/**
* Removes a listener for an event.
* @template TEvent
* @param {TEvent} event - The event to remove the listener from.
* @param {EventListener<AllEvents<T>[TEvent]>} handler - The event handler.
* @returns {boolean} - True if the listener was removed, false otherwise.
*/
off(event, handler) {
return this.emitter.off(event, handler);
}
}
/**
* Wrapper class to make a sync event bus async.
* @template T
* @implements {Disposable}
*/
export class EventBus2AsyncEventBus extends AsyncTeardownManager {
emitter;
constructor(emitter) {
super();
this.emitter = emitter;
emitter.once(Symbol.dispose, (() => this[Symbol.asyncDispose]()));
}
subscriptions = [];
/**
* Checks if there are listeners for a given event.
* @template TKey
* @param {TKey} name - The name of the event.
* @returns {boolean} - True if there are listeners, false otherwise.
*/
hasListener(name) {
return Promise.resolve(this.emitter.hasListener(name));
}
/**
* Gets the defined events.
* @returns {string[]} - An array of defined event names.
*/
get definedEvents() {
return Promise.resolve(this.emitter.definedEvents);
}
/**
* Emits an event.
* @template TEvent
* @param {TEvent} event - The event to emit.
* @param {...EventArgs<T[TEvent]>} args - The arguments to pass to the event listeners.
* @returns {false | EventReturnType<T[TEvent]>} - The return value of the event listeners or false if the event does not exist.
*/
emit(event, ...args) {
return Promise.resolve(this.emitter.emit(event, ...args));
}
/**
* Adds a listener for an event.
* @template TEvent
* @param {TEvent} event - The event to listen to.
* @param {EventListener<AllEvents<T>[TEvent]>} handler - The event handler.
* @param {EventOptions<AllEvents<T>[TEvent]>} [options] - The event options.
* @returns {Subscription} - The subscription.
*/
on(event, handler, options) {
const sub = this.emitter.on(event, handler, options);
this.subscriptions.push(sub);
return Promise.resolve(() => Promise.resolve(sub()));
}
/**
* Adds a one-time listener for an event.
* @template TEvent
* @param {TEvent} event - The event to listen to.
* @param {EventListener<AllEvents<T>[TEvent]>} handler - The event handler.
* @param {Omit<EventOptions<AllEvents<T>[TEvent]>, "once">} [options] - The event options.
* @returns {Subscription} - The subscription.
*/
once(event, handler, options) {
const sub = this.emitter.once(event, handler, options);
this.subscriptions.push(sub);
return Promise.resolve(() => Promise.resolve(sub()));
}
/**
* Removes a listener for an event.
* @template TEvent
* @param {TEvent} event - The event to remove the listener from.
* @param {EventListener<AllEvents<T>[TEvent]>} handler - The event handler.
* @returns {boolean} - True if the listener was removed, false otherwise.
*/
off(event, handler) {
return Promise.resolve(this.emitter.off(event, handler));
}
}
//# sourceMappingURL=event-bus.js.map