event-emitters
Version:
67 lines • 2.65 kB
JavaScript
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.QueueingEventEmitter = void 0;
var EventEmitter_1 = require("./EventEmitter");
/**
* Acts the same as EventEmitter but queues messages when there are no subscribers, delivering them
* as soon as the first subscriber subscribes.
*/
var QueueingEventEmitter = /** @class */ (function (_super) {
__extends(QueueingEventEmitter, _super);
function QueueingEventEmitter() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.messageQueue = [];
return _this;
}
QueueingEventEmitter.prototype.emit = function (newMessage) {
if (!this.listeners.length) {
this.messageQueue.push(newMessage);
}
else {
_super.prototype.emit.call(this, 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.
*/
QueueingEventEmitter.prototype.subscribe = function (listener) {
var _this = this;
_super.prototype.subscribe.call(this, listener);
if (this.messageQueue.length) {
var error_1;
this.messageQueue.forEach(function (queuedMessage) {
try {
_super.prototype.emit.call(_this, queuedMessage);
}
catch (e) {
error_1 = e;
}
});
this.messageQueue.splice(0);
if (error_1) {
throw error_1;
}
}
return listener;
};
return QueueingEventEmitter;
}(EventEmitter_1.EventEmitter));
exports.QueueingEventEmitter = QueueingEventEmitter;
//# sourceMappingURL=QueueingEventEmitter.js.map