Add moment.js as a dependency, enhance TypeScript configuration to exclude scripts, and introduce new examples for dependency injection and health checks.
This commit is contained in:
53
src/lang/Events.ts
Normal file
53
src/lang/Events.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
import {EventEmitter} from 'events';
|
||||
import type IDisposable from './IDisposable';
|
||||
import Disposable from './Disposable';
|
||||
|
||||
type EventListener = (...args: unknown[]) => void | Promise<void>;
|
||||
|
||||
export class Events {
|
||||
private readonly _events: EventEmitter;
|
||||
|
||||
constructor() {
|
||||
this._events = new EventEmitter();
|
||||
}
|
||||
|
||||
public on(event: string, listener: EventListener): IDisposable {
|
||||
const wrappedListener = async (...eventArguments: unknown[]) => {
|
||||
try {
|
||||
await listener.apply(this, eventArguments);
|
||||
} catch (e) {
|
||||
console.error('Failed to process event [%s] with listener [%s]', event, listener, e);
|
||||
}
|
||||
};
|
||||
|
||||
this._events.on(event, wrappedListener);
|
||||
|
||||
return new Disposable(() => {
|
||||
this._events.removeListener(event, wrappedListener);
|
||||
});
|
||||
}
|
||||
|
||||
public once(event: string, listener: EventListener): IDisposable {
|
||||
const wrappedListener = async (...eventArguments: unknown[]) => {
|
||||
try {
|
||||
await listener.apply(this, eventArguments);
|
||||
} catch (e) {
|
||||
console.error('Failed to process event [%s] with listener [%s]', event, listener, e);
|
||||
}
|
||||
};
|
||||
|
||||
this._events.once(event, wrappedListener);
|
||||
|
||||
return new Disposable(() => {
|
||||
this._events.removeListener(event, wrappedListener);
|
||||
});
|
||||
}
|
||||
|
||||
public emit(event: string, ...eventArguments: unknown[]): boolean {
|
||||
return this._events.emit(event, ...eventArguments);
|
||||
}
|
||||
|
||||
public listenerCount(event: string): number {
|
||||
return this._events.listenerCount(event);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user