event-emitters
Version:
44 lines • 1.31 kB
JavaScript
import { EventEmitter } from './EventEmitter';
/**
* Acts the same as EventEmitter but queues messages when there are no subscribers, delivering them
* as soon as the first subscriber subscribes.
*/
export class QueueingEventEmitter extends EventEmitter {
constructor() {
super(...arguments);
this.messageQueue = [];
}
emit(newMessage) {
if (!this.listeners.length) {
this.messageQueue.push(newMessage);
}
else {
super.emit(newMessage);
}
}
/**
* The queue will still be drained if the subscriber throws error, in the case that the
* there are multiple messages with multiple exceptions thrown, only the last one will
* be re-thrown.
*/
subscribe(listener) {
super.subscribe(listener);
if (this.messageQueue.length) {
let error;
this.messageQueue.forEach((queuedMessage) => {
try {
super.emit(queuedMessage);
}
catch (e) {
error = e;
}
});
this.messageQueue.splice(0);
if (error) {
throw error;
}
}
return listener;
}
}
//# sourceMappingURL=QueueingEventEmitter.js.map