mongodb-stitch
Version:
[](https://gitter.im/mongodb/stitch?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
128 lines • 5.44 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "./Event", "./StitchEvent", "../../StitchError", "../../StitchRequestError"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Event_1 = __importDefault(require("./Event"));
var StitchEvent_1 = __importDefault(require("./StitchEvent"));
var StitchError_1 = __importDefault(require("../../StitchError"));
var StitchRequestError_1 = __importDefault(require("../../StitchRequestError"));
var BaseEventStream = (function () {
function BaseEventStream(reconnecter) {
this.reconnecter = reconnecter;
this.closed = false;
this.events = [];
this.listeners = [];
this.lastErr = undefined;
}
BaseEventStream.prototype.reconnect = function (error) {
var _this = this;
if (!this.reconnecter) {
if (!this.closed) {
this.closed = true;
this.events.push(new Event_1.default(StitchEvent_1.default.ERROR_EVENT_NAME, "stream closed: " + error));
this.poll();
}
return;
}
this.reconnecter()
.then(function (next) {
_this.onReconnect(next);
})
.catch(function (e) {
if (!(e instanceof StitchError_1.default) || !(e instanceof StitchRequestError_1.default)) {
_this.closed = true;
_this.events.push(new Event_1.default(StitchEvent_1.default.ERROR_EVENT_NAME, "stream closed: " + error));
_this.poll();
return;
}
setTimeout(function () { return _this.reconnect(e); }, BaseEventStream.RETRY_TIMEOUT_MILLIS);
});
};
BaseEventStream.prototype.poll = function () {
while (this.events.length !== 0) {
var event = this.events.pop();
for (var _i = 0, _a = this.listeners; _i < _a.length; _i++) {
var listener = _a[_i];
if (listener.onEvent) {
listener.onEvent(event);
}
}
}
};
BaseEventStream.prototype.addListener = function (listener) {
var _this = this;
if (this.closed) {
setTimeout(function () { return listener.onEvent(new Event_1.default(StitchEvent_1.default.ERROR_EVENT_NAME, "stream closed")); }, 0);
return;
}
if (this.lastErr !== undefined) {
setTimeout(function () { return listener.onEvent(new Event_1.default(StitchEvent_1.default.ERROR_EVENT_NAME, _this.lastErr)); }, 0);
return;
}
this.listeners.push(listener);
this.poll();
};
BaseEventStream.prototype.removeListener = function (listener) {
var index = this.listeners.indexOf(listener);
if (index === -1) {
return;
}
this.listeners.splice(index, 1);
};
BaseEventStream.prototype.listenOnce = function (listener) {
var _this = this;
if (this.closed) {
setTimeout(function () { return listener.onEvent(new Event_1.default(StitchEvent_1.default.ERROR_EVENT_NAME, "stream closed")); }, 0);
return;
}
if (this.lastErr !== undefined) {
setTimeout(function () { return listener.onEvent(new Event_1.default(StitchEvent_1.default.ERROR_EVENT_NAME, _this.lastErr)); }, 0);
return;
}
var wrapper = {
onEvent: function (e) {
_this.removeListener(wrapper);
listener.onEvent(e);
}
};
this.addListener(wrapper);
};
BaseEventStream.prototype.nextEvent = function () {
var _this = this;
if (this.closed) {
return Promise.reject(new Event_1.default(StitchEvent_1.default.ERROR_EVENT_NAME, "stream closed"));
}
if (this.lastErr !== undefined) {
return Promise.reject(new Event_1.default(StitchEvent_1.default.ERROR_EVENT_NAME, this.lastErr));
}
return new Promise(function (resolve, reject) {
_this.listenOnce({
onEvent: function (e) {
resolve(e);
}
});
});
};
BaseEventStream.prototype.close = function () {
if (this.closed) {
return;
}
this.closed = true;
this.afterClose();
};
BaseEventStream.RETRY_TIMEOUT_MILLIS = 5000;
return BaseEventStream;
}());
exports.default = BaseEventStream;
});
//# sourceMappingURL=BaseEventStream.js.map