event-emitters
Version:
41 lines • 1.27 kB
JavaScript
import { EventEmitterAsyncIterator } from './EventEmitterAsyncIterator';
/**
* The same as node's EventEmitter but:
* Only emits a single "event".
* Throw an exception when a client registers the same listener more than once.
* Throw an exception when a client tries to remove a listener that is not listening.
*/
export class EventEmitter {
constructor() {
this.listeners = [];
}
emit(newMessage) {
this.listeners.forEach((listener) => {
listener(newMessage);
});
}
subscribe(listener) {
if (this.listeners.includes(listener)) {
throw new Error('You have already subscribed with this listener');
}
this.listeners.push(listener);
return listener;
}
unsubscribe(listener) {
const index = this.listeners.indexOf(listener);
if (index === -1) {
throw new Error('Tried to remove listener that is not listening');
}
this.listeners.splice(index, 1);
}
hasListeners() {
return this.listeners.length !== 0;
}
[Symbol.asyncIterator]() {
return this.asyncIterator();
}
asyncIterator() {
return new EventEmitterAsyncIterator(this);
}
}
//# sourceMappingURL=EventEmitter.js.map