48 lines
7.1 KiB
JavaScript
48 lines
7.1 KiB
JavaScript
|
"use strict";
|
||
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||
|
};
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
const events_1 = require("events");
|
||
|
const promisify_event_1 = __importDefault(require("promisify-event"));
|
||
|
const time_limit_promise_1 = __importDefault(require("time-limit-promise"));
|
||
|
const REMOTE_REDIRECT_TIMEOUT = 10000;
|
||
|
const ADDING_CONNECTION_WAITING_TIMEOUT = 10000;
|
||
|
class RemotesQueue {
|
||
|
constructor() {
|
||
|
this.events = new events_1.EventEmitter();
|
||
|
this.shiftingTimeout = Promise.resolve();
|
||
|
this.pendingConnections = {};
|
||
|
}
|
||
|
add(remoteConnection) {
|
||
|
const connectionReadyPromise = (0, promisify_event_1.default)(remoteConnection, 'ready')
|
||
|
.then(() => this.remove(remoteConnection));
|
||
|
this.pendingConnections[remoteConnection.id] = {
|
||
|
connection: remoteConnection,
|
||
|
readyPromise: connectionReadyPromise,
|
||
|
};
|
||
|
this.events.emit('connection-added', remoteConnection.id);
|
||
|
}
|
||
|
remove(remoteConnection) {
|
||
|
delete this.pendingConnections[remoteConnection.id];
|
||
|
}
|
||
|
shift() {
|
||
|
const shiftingPromise = this.shiftingTimeout
|
||
|
.then(async () => {
|
||
|
let headId = Object.keys(this.pendingConnections)[0];
|
||
|
if (!headId)
|
||
|
headId = await (0, time_limit_promise_1.default)((0, promisify_event_1.default)(this.events, 'connection-added'), ADDING_CONNECTION_WAITING_TIMEOUT);
|
||
|
return headId ? this.pendingConnections[headId].connection : null;
|
||
|
});
|
||
|
this.shiftingTimeout = shiftingPromise
|
||
|
.then(connection => {
|
||
|
if (!connection)
|
||
|
return Promise.resolve();
|
||
|
return (0, time_limit_promise_1.default)(this.pendingConnections[connection.id].readyPromise, REMOTE_REDIRECT_TIMEOUT);
|
||
|
});
|
||
|
return shiftingPromise;
|
||
|
}
|
||
|
}
|
||
|
exports.default = RemotesQueue;
|
||
|
module.exports = exports.default;
|
||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3Rlcy1xdWV1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9icm93c2VyL2Nvbm5lY3Rpb24vcmVtb3Rlcy1xdWV1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFzQztBQUN0QyxzRUFBNkM7QUFDN0MsNEVBQXVEO0FBSXZELE1BQU0sdUJBQXVCLEdBQWEsS0FBSyxDQUFDO0FBQ2hELE1BQU0saUNBQWlDLEdBQUcsS0FBSyxDQUFDO0FBT2hELE1BQXFCLFlBQVk7SUFLN0I7UUFDSSxJQUFJLENBQUMsTUFBTSxHQUFlLElBQUkscUJBQVksRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxlQUFlLEdBQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVNLEdBQUcsQ0FBRSxnQkFBbUM7UUFDM0MsTUFBTSxzQkFBc0IsR0FBRyxJQUFBLHlCQUFjLEVBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDO2FBQ25FLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUUvQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLEdBQUc7WUFDM0MsVUFBVSxFQUFJLGdCQUFnQjtZQUM5QixZQUFZLEVBQUUsc0JBQXNCO1NBQ3ZDLENBQUM7UUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRU0sTUFBTSxDQUFFLGdCQUFtQztRQUM5QyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU0sS0FBSztRQUNSLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlO2FBQ3ZDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNiLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFckQsSUFBSSxDQUFDLE1BQU07Z0JBQ1AsTUFBTSxHQUFHLE1BQU0sSUFBQSw0QkFBcUIsRUFBQyxJQUFBLHlCQUFjLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7WUFFN0gsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN0RSxDQUFDLENBQUMsQ0FBQztRQUVQLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZTthQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDZixJQUFJLENBQUMsVUFBVTtnQkFDWCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUU3QixPQUFPLElBQUEsNEJBQXFCLEVBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUMvRyxDQUFDLENBQUMsQ0FBQztRQUVQLE9BQU8sZUFBZSxDQUFDO0lBQzNCLENBQUM7Q0FDSjtBQWhERCwrQkFnREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IHByb21pc2lmeUV2ZW50IGZyb20gJ3Byb21pc2lmeS1ldmVudCc7XG5pbXBvcnQgZ2V0VGltZUxpbWl0ZWRQcm9taXNlIGZyb20gJ3RpbWUtbGltaXQtcHJvbWlzZSc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5IH0gZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9pbnRlcmZhY2VzJztcbmltcG9ydCBCcm93c2VyQ29ubmVjdGlvbiBmcm9tICcuL2luZGV4JztcblxuY29uc3QgUkVNT1RFX1JFRElSRUNUX1RJTUVPVVQgICAgICAgICAgID0gMTAwMDA7XG5jb25zdCBBRERJTkdfQ09OTkVDVElPTl9XQUlUSU5HX1RJTUVPVVQgPSAxMDAwMDtcblxuaW50ZXJmYWNlIFBlbmRpbmdDb25uZWN0aW9uIHtcbiAgICBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbjtcbiAgICByZWFkeVByb21pc2U6IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlbW90ZXNRdWV1ZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudHM6IEV2ZW50RW1pdHRlcjtcbiAgICBwcml2YXRlIHNoaWZ0aW5nVGltZW91dDogUHJvbWlzZTx2b2lkPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmdDb25uZWN0aW9uczogRGljdGlvbmFyeTxQZW5kaW5nQ29ubmVjdGlvbj47XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKCkge1xuICAgICAgICB0aGlzLmV2ZW50cyAgICAgICAgICAgICA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5zaGlmdGluZ1RpbWVvdXQgICAgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nQ29ubmVjdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkIChyZW1vdGVDb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uUmVhZHlQcm9taXNlID0gcHJvbWlzaWZ5RXZlbnQocmVtb3RlQ29ubmVjdGlvbiwgJ3JlYWR5JylcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucmVtb3ZlKHJlbW90ZUNvbm5lY3Rpb24pKTtcblxuICAgICAgICB0aGlzLnBlbmRpbmdDb25uZWN0aW9uc1tyZW1vdGVDb25uZWN0aW9uLmlkXSA9IHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb246ICAgcmVtb3RlQ29ubmVjdGlvbixcbiAgICAgICAgICAgIHJlYWR5UHJvbWlzZTogY29ubmVjdGlvblJlYWR5UHJvbWlzZSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KCdjb25uZWN0aW9uLWFkZGVkJywgcmVtb3RlQ29ubmVjdGlvbi5pZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZSAocmVtb3RlQ29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgZGVsZXRlIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25zW3JlbW90ZUNvbm5lY3Rpb24uaWRdO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaGlmdCAoKTogUHJvb
|