event-emitter-enhancer
Version:
Enhances the Node.js EventEmitter with extra capabilities.
386 lines (324 loc) • 11.9 kB
TypeScript
import EventEmitter from 'events'
/**
* A unique event name, defined by a string or a symbol.
*/
type Event = string | symbol
/**
* An optional callback attached to asynchronously emitted events, fired after
* the event has been dispatched.
*/
interface AsyncEmitCallback extends Function {
(event: Event, emitted: boolean): void,
(event: Event, arg0: any, emitted: boolean): void,
(event: Event, arg0: any, arg1: any, emitted: boolean): void,
(event: Event, arg0: any, arg1: any, arg2: any, emitted: boolean): void,
(event: Event, arg0: any, arg1: any, arg2: any, arg3: any, emitted: boolean): void,
(event: Event, arg0: any, arg1: any, arg2: any, arg3: any, arg4: any, emitted: boolean): void,
(event: Event, ...args: Array<any | boolean>): void,
}
/**
* The filter function responsible for pre-processing events.
*/
interface FilterCallback extends Function {
(event: Event, ...args: any[]): boolean,
}
/**
* A basic event handler that receives the event name as its first parameter
* along with any arguments passed to the dispatcher.
*/
interface ListenerFunction extends Function {
(event: Event, ...args: any[]): void,
}
/**
* Options for the more complex version of the "on" method, which supports
* multiple events, multiple listeners, asynchronous events, and a timeout.
*/
interface OnOptions {
/**
* Whether the event handler should be called asynchronously.
*/
async?: boolean,
/**
* The event or events to handle.
*/
event: Event | Event[],
/**
* The handler or handlers to call when events are triggered.
*/
listener: ListenerFunction | ListenerFunction[],
/**
* Optionally disable the listener after a certain number of milliseconds.
*/
timeout?: number,
}
interface RemoveFunction extends Function {
(): void,
}
/**
* Extends the Node.js EventEmitter with additional capabilities.
*/
export class EnhancedEventEmitter {
/**
* If true, listeners (including "else" listeners) will not be triggered
* on emit.
*/
suspended: boolean
/**
* If defined, events will be splitted by this separator and emitted as partials.<br>
* For example, if the separator is ':' an event event1:event2:event3 will be emitted as 3 events: event1, event1:event2, event1:event2:event3.
*/
subscriptionSeparator: string
/**
* Adds a filter function that will be triggered before every emit of a
* specific event. The filter should return "true" to permit dispatch, or
* "false" to block dispatch.
*/
addEventFilter(event: Event, filter: FilterCallback): RemoveFunction
/**
* Adds a filter function that will be triggered before every emit (if no
* event name is provided) or before every emit of a specific event (if an
* event name is passed as the first parameter). The filter should return
* "true" to permit dispatch, or "false" to block dispatch.
*/
addFilter(filter: FilterCallback): RemoveFunction
/**
* Adds a filter function that will be triggered before every emit (if no
* event name is provided) or before every emit of a specific event (if an
* event name is passed as the first parameter). The filter should return
* "true" to permit dispatch, or "false" to block dispatch.
*/
addFilter(event: Event, filter: FilterCallback): RemoveFunction
/**
* Adds a filter function that will be triggered before every emit. The
* filter should return "true" to permit dispatch, or "false" to block
* dispatch.
*/
addGlobalFilter(filter: FilterCallback): RemoveFunction
/**
* The base Node.js "addListener" function, accepting an event name and
* a listener function and returning the instance for chaining.
*/
addListener(event: Event, listener: ListenerFunction): this
/**
* Creates an empty listener for a given event.
*/
addNoop(event: Event): RemoveFunction
/**
* Adds a listener which will be triggered by all events that do not have
* a matching listener.
*/
else(listener: ListenerFunction): void
/**
* If an event with the provided name is emitted, but no listeners are
* listening for it, the EnhancedEventEmitter will emit an error.
*/
elseError(event: Event): void
/**
* Causes the emitter to trigger all listeners attached to the provided
* event. Returns "true" if the event was handled, "false" if it was not.
*/
emit(event: Event, ...args: any[]): boolean
/**
* Emits the event asynchronously, ensuring flow is not blocked by
* listeners.
*/
emitAsync(event: Event, arg0: any, callback?: AsyncEmitCallback): void
/**
* Emits the event asynchronously, ensuring flow is not blocked by
* listeners.
*/
emitAsync(event: Event, arg0: any, arg1: any, callback?: AsyncEmitCallback): void
/**
* Emits the event asynchronously, ensuring flow is not blocked by
* listeners.
*/
emitAsync(event: Event, arg0: any, arg1: any, arg2: any, callback?: AsyncEmitCallback): void
/**
* Emits the event asynchronously, ensuring flow is not blocked by
* listeners.
*/
emitAsync(event: Event, arg0: any, arg1: any, arg2: any, arg3: any, callback?: AsyncEmitCallback): void
/**
* Emits the event asynchronously, ensuring flow is not blocked by
* listeners.
*/
emitAsync(event: Event, arg0: any, arg1: any, arg2: any, arg3: any, arg4: any, callback?: AsyncEmitCallback): void
/**
* Emits the event asynchronously, ensuring flow is not blocked by
* listeners.
*/
emitAsync(event: Event, ...args: Array<any | AsyncEmitCallback>): void
/**
* Returns all configured event names with listeners attached.
*/
eventNames(): Event[]
/**
* Adds a filter function that will be triggered before every emit (if no
* event name is provided) or before every emit of a specific event (if an
* event name is passed as the first parameter). The filter should return
* "true" to permit dispatch, or "false" to block dispatch.
*/
filter(filter: FilterCallback): RemoveFunction
/**
* Adds a filter function that will be triggered before every emit (if no
* event name is provided) or before every emit of a specific event (if an
* event name is passed as the first parameter). The filter should return
* "true" to permit dispatch, or "false" to block dispatch.
*/
filter(event: Event, filter: FilterCallback): RemoveFunction
/**
* Get the maximum configured number of listeners per event name this
* instance will allow.
*/
getMaxListeners(): number
/**
* Creates a dummy empty error handler to prevent unhandled errors from
* crashing the process.
*/
ignoreError(): void
/**
* Returns the total number of listeners attached to the given event name.
*/
listenerCount(event: Event): number
/**
* Returns all listeners for a given event name.
*/
listeners(event: Event): ListenerFunction[]
/**
* Disables a previously configured event listener with the given name
* and listener function and returns the instance for chaining.
*/
off(event: Event, listener: ListenerFunction): this
/**
* The Node.js EventEmitter "on" function. Returns a function that removes
* the listener when called.
*/
on(event: Event, listener: ListenerFunction): RemoveFunction
/**
* Extends "on" with more complex capabilities, including providing
* multiple listeners and event names, timing out the listener, and
* more. To remove the listeners, the returned function must be
* called instead of "removeEventListener."
*/
on(options: OnOptions): RemoveFunction
/**
* Adds a listener for all provided event names. To remove the listener,
* the returned function must be called instead of "removeEventListener."
*/
onAny(events: Event[], listener: ListenerFunction): RemoveFunction
/**
* Adds a listener which will be triggered asynchronously, ensuring that
* the listener is invoked after all other listeners without blocking flow.
* To remove the listener, the returned function must be called instead of
* "removeEventListener."
*/
onAsync(event: Event, listener: ListenerFunction): RemoveFunction
/**
* The Node.js EventEmitter "once" function. Returns a function that
* removes the listener when called.
*/
once(event: Event, listener: ListenerFunction): RemoveFunction
/**
* Inserts a new event listener at the beginning of the listener queue,
* returning the instance for chaining.
*/
prependListener(event: Event, listener: ListenerFunction): this
/**
* Inserts a new event listener which will be called only once at the
* beginning of the listener queue, returning the instance for chaining.
*/
prependOnceListener(event: Event, listener: ListenerFunction): this
/**
* Proxies events emitted by another emitter through this emitter, so that
* it emits them itself.
*/
proxyEvents(emitter: EventEmitter | EnhancedEventEmitter, event: Event): RemoveFunction
/**
* Proxies events emitted by another emitter through this emitter, so that
* it emits them itself.
*/
proxyEvents(emitter: EventEmitter | EnhancedEventEmitter, events: Event[]): RemoveFunction
/**
* Proxies events emitted by another emitter through this emitter, so that
* it emits them itself.
*/
proxyEvents(emitters: Array<EventEmitter | EnhancedEventEmitter>, event: Event): RemoveFunction
/**
* Proxies events emitted by another emitter through this emitter, so that
* it emits them itself.
*/
proxyEvents(emitters: Array<EventEmitter | EnhancedEventEmitter>, events: Event[]): RemoveFunction
/**
* The Node.js EventEmitter "removeAllListeners" function.
*/
removeAllListeners(event: Event): void
/**
* The Node.js EventEmitter "removeAllListeners" function, modified to
* accept an array of event names.
*/
removeAllListeners(events: Event[]): this
/**
* Removes all "else" listeners.
*/
removeAllElseListeners(): void
/**
* Removes the "elseError" handler for the provided event.
*/
removeElseError(event: Event): void
/**
* Removes the "else" listener that calls the provided function.
*/
removeElseListener(listener: ListenerFunction): void
/**
* Disables a previously configured event listener with the given name
* and listener function and returns the instance for chaining.
*/
removeListener(event: Event, listener: ListenerFunction): this
/**
* Set the maximum number of listeners per event name this instance
* will allow.
*/
setMaxListeners(count: number): this
/**
* Suspends all listeners for the provided event name, including "else"
* listeners.
*/
suspend(event: Event): void
/**
* Removes the "else" listener that calls the provided function.
*/
unelse(listener: ListenerFunction): void
/**
* Removes the "elseError" handler for the provided event.
*/
unelseError(event: Event): void
/**
* Resumes all listeners for the provided event name.
*/
unsuspend(event: Event): void
}
/**
* An interface for extending EventEmitter prototypes with additional
* capabilities.
*/
export class EventEmitterEnhancer {
/**
* A version of the EventEmitter already extended.
*/
static readonly EnhancedEventEmitter: typeof EnhancedEventEmitter
/**
* Extends the provided object prototype with the capabilities of the
* EnhancedEventEmitter, returning a new EnhancedEventEmitter constructor.
*/
static extend(emitter: typeof EventEmitter): typeof EnhancedEventEmitter
/**
* Modifies the provided object prototype, replacing it with an extended
* EnhancedEventEmitter with additional capabilities.
*/
static modify(emitter: typeof EventEmitter): void
/**
* Extends a single EventEmitter object with additional capabilities.
*/
static modifyInstance(emitter: EventEmitter): EnhancedEventEmitter
}
export default EventEmitterEnhancer