UNPKG

data-transport

Version:
124 lines 17.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WebRTCTransport = void 0; var tslib_1 = require("tslib"); var transport_1 = require("../transport"); var MAX_CHUNK_SIZE = 1024 * 60; var BUFFER_FULL_THRESHOLD = 1024 * 64; var EXPIRED_TIME = 1000 * 60; var WebRTCTransport = /** @class */ (function (_super) { tslib_1.__extends(WebRTCTransport, _super); function WebRTCTransport(_options) { var _this = this; var peer = _options.peer, _a = _options.listener, listener = _a === void 0 ? function (callback) { var handler = function (data) { var e_1, _a; var _b; var message = JSON.parse(data); var key = Object.prototype.hasOwnProperty.call(message, 'request') ? 'request' : 'response'; var buffer = (_b = _this.receiveBuffer.get(message.__DATA_TRANSPORT_UUID__)) !== null && _b !== void 0 ? _b : { data: [], timestamp: Date.now(), }; _this.receiveBuffer.set(message.__DATA_TRANSPORT_UUID__, buffer); buffer.data[message.chunkId] = message[key]; buffer.data.length = message.length; buffer.timestamp = Date.now(); var isComplete = buffer.data.filter(function (item) { return item; }).length === message.length; if (isComplete) { var data_1 = JSON.parse(buffer.data.join('')); message[key] = key === 'request' ? data_1 : data_1[0]; delete message.length; callback(message); _this.receiveBuffer.delete(message.__DATA_TRANSPORT_UUID__); try { for (var _c = tslib_1.__values(_this.receiveBuffer), _d = _c.next(); !_d.done; _d = _c.next()) { var _e = tslib_1.__read(_d.value, 2), id = _e[0], item = _e[1]; if (Date.now() - item.timestamp > EXPIRED_TIME) { _this.receiveBuffer.delete(id); } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_d && !_d.done && (_a = _c.return)) _a.call(_c); } finally { if (e_1) throw e_1.error; } } } }; peer.on('data', handler); return function () { peer.off('data', handler); }; } : _a, _b = _options.sender, sender = _b === void 0 ? function (message) { var _a; var key = Object.prototype.hasOwnProperty.call(message, 'request') ? 'request' : 'response'; message[key] = JSON.stringify(key === 'request' ? message.request : typeof message.response !== 'undefined' ? [message.response] : []); var chunkId = 0; var allChunksSize = Math.ceil(message[key].length / MAX_CHUNK_SIZE); while (message[key].length > 0) { var data = tslib_1.__assign(tslib_1.__assign({}, message), (_a = {}, _a[key] = message[key].slice(0, MAX_CHUNK_SIZE), _a.chunkId = chunkId, _a.length = allChunksSize, _a)); peer.send(JSON.stringify(data)); message[key] = message[key].slice(MAX_CHUNK_SIZE); chunkId += 1; } } : _b, options = tslib_1.__rest(_options, ["peer", "listener", "sender"]); _this = _super.call(this, tslib_1.__assign(tslib_1.__assign({}, options), { listener: listener, sender: sender })) || this; _this.receiveBuffer = new Map(); if (peer) { var webRTCPaused_1 = false; var webRTCMessageQueue_1 = []; var peerSend_1 = peer.send.bind(peer); var sendMessageQueued_1 = function () { webRTCPaused_1 = false; var message = webRTCMessageQueue_1.shift(); var _loop_1 = function () { if (peer._channel.bufferedAmount && peer._channel.bufferedAmount > BUFFER_FULL_THRESHOLD) { webRTCPaused_1 = true; webRTCMessageQueue_1.unshift(message); var listener_1 = function () { peer._channel.removeEventListener('bufferedamountlow', listener_1); sendMessageQueued_1(); }; peer._channel.addEventListener('bufferedamountlow', listener_1); return { value: void 0 }; } try { peerSend_1(message); message = webRTCMessageQueue_1.shift(); } catch (error) { throw new Error("Error send message to peer: ".concat(error.message)); } }; while (message) { var state_1 = _loop_1(); if (typeof state_1 === "object") return state_1.value; } }; peer.send = function (chunk) { webRTCMessageQueue_1.push(chunk); if (webRTCPaused_1) { return; } sendMessageQueued_1(); }; } return _this; } return WebRTCTransport; }(transport_1.Transport)); exports.WebRTCTransport = WebRTCTransport; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViUlRDVHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYW5zcG9ydHMvd2ViUlRDVHJhbnNwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFPQSwwQ0FBeUM7QUFFekMsSUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUVqQyxJQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFFeEMsSUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQVcvQjtJQUVVLDJDQUFZO0lBR3BCLHlCQUFZLFFBQWdDO1FBQTVDLGlCQW9IQztRQWxIRyxJQUFBLElBQUksR0FpRUYsUUFBUSxLQWpFTixFQUNKLEtBZ0VFLFFBQVEsU0E3QlQsRUFuQ0QsUUFBUSxtQkFBRyxVQUFDLFFBQVE7WUFDbEIsSUFBTSxPQUFPLEdBQUcsVUFBQyxJQUFZOzs7Z0JBQzNCLElBQU0sT0FBTyxHQUErQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3RCxJQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQztvQkFDbEUsQ0FBQyxDQUFDLFNBQVM7b0JBQ1gsQ0FBQyxDQUFDLFVBQVUsQ0FBQztnQkFDZixJQUFNLE1BQU0sR0FBRyxNQUFBLEtBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUNuQyxPQUFPLENBQUMsdUJBQXVCLENBQ2hDLG1DQUFJO29CQUNILElBQUksRUFBRSxFQUFFO29CQUNSLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO2lCQUN0QixDQUFDO2dCQUNGLEtBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDaEUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBUSxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM3QyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTyxDQUFDO2dCQUNyQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDOUIsSUFBTSxVQUFVLEdBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBQyxJQUFJLElBQUssT0FBQSxJQUFJLEVBQUosQ0FBSSxDQUFDLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQy9ELElBQUksVUFBVSxFQUFFLENBQUM7b0JBQ2YsSUFBTSxNQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQztvQkFDdEIsUUFBUSxDQUFDLE9BQTBCLENBQUMsQ0FBQztvQkFDckMsS0FBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUM7O3dCQUMzRCxLQUF5QixJQUFBLEtBQUEsaUJBQUEsS0FBSSxDQUFDLGFBQWEsQ0FBQSxnQkFBQSw0QkFBRSxDQUFDOzRCQUFuQyxJQUFBLEtBQUEsMkJBQVUsRUFBVCxFQUFFLFFBQUEsRUFBRSxJQUFJLFFBQUE7NEJBQ2xCLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsWUFBWSxFQUFFLENBQUM7Z0NBQy9DLEtBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUNoQyxDQUFDO3dCQUNILENBQUM7Ozs7Ozs7OztnQkFDSCxDQUFDO1lBQ0gsQ0FBQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDekIsT0FBTztnQkFDTCxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM1QixDQUFDLENBQUM7UUFDSixDQUFDLEtBQUEsRUFDRCxLQTRCRSxRQUFRLE9BRlQsRUExQkQsTUFBTSxtQkFBRyxVQUFDLE9BQW1DOztZQUMzQyxJQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQztnQkFDbEUsQ0FBQyxDQUFDLFNBQVM7Z0JBQ1gsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUMzQixHQUFHLEtBQUssU0FBUztnQkFDZixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU87Z0JBQ2pCLENBQUMsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxRQUFRLEtBQUssV0FBVztvQkFDekMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztvQkFDcEIsQ0FBQyxDQUFDLEVBQUUsQ0FDUCxDQUFDO1lBQ0YsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLElBQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQVksQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUNqRCxDQUFDO1lBQ0YsT0FBUSxPQUFPLENBQUMsR0FBRyxDQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMzQyxJQUFNLElBQUkseUNBQ0wsT0FBTyxnQkFDVCxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQ3hELFVBQU8sVUFBQSxFQUNQLFNBQU0sR0FBRSxhQUFhLE1BQ3RCLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBSSxPQUFPLENBQUMsR0FBRyxDQUFZLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUM5RCxPQUFPLElBQUksQ0FBQyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUMsS0FBQSxFQUNFLE9BQU8sa0JBQ1IsUUFBUSxFQWxFTiw4QkFrRUwsQ0FEVyxDQUNDO1FBQ2IsUUFBQSxNQUFLLGtEQUNBLE9BQU8sS0FDVixRQUFRLFVBQUEsRUFDUixNQUFNLFFBQUEsSUFDTixTQUFDO1FBMUVHLG1CQUFhLEdBQUcsSUFBSSxHQUFHLEVBQThDLENBQUM7UUEyRTVFLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxJQUFJLGNBQVksR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBTSxvQkFBa0IsR0FBVSxFQUFFLENBQUM7WUFDckMsSUFBTSxVQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsSUFBTSxtQkFBaUIsR0FBRztnQkFDeEIsY0FBWSxHQUFHLEtBQUssQ0FBQztnQkFDckIsSUFBSSxPQUFPLEdBQUcsb0JBQWtCLENBQUMsS0FBSyxFQUFFLENBQUM7O29CQUV2QyxJQUNHLElBQVksQ0FBQyxRQUFRLENBQUMsY0FBYzt3QkFDcEMsSUFBWSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEdBQUcscUJBQXFCLEVBQzdELENBQUM7d0JBQ0QsY0FBWSxHQUFHLElBQUksQ0FBQzt3QkFDcEIsb0JBQWtCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUNwQyxJQUFNLFVBQVEsR0FBRzs0QkFDZCxJQUFZLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUN4QyxtQkFBbUIsRUFDbkIsVUFBUSxDQUNULENBQUM7NEJBQ0YsbUJBQWlCLEVBQUUsQ0FBQzt3QkFDdEIsQ0FBQyxDQUFDO3dCQUNELElBQVksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQ3JDLG1CQUFtQixFQUNuQixVQUFRLENBQ1QsQ0FBQzs7b0JBRUosQ0FBQztvQkFDRCxJQUFJLENBQUM7d0JBQ0gsVUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUNsQixPQUFPLEdBQUcsb0JBQWtCLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ3ZDLENBQUM7b0JBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQzt3QkFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBK0IsS0FBSyxDQUFDLE9BQU8sQ0FBRSxDQUFDLENBQUM7b0JBQ2xFLENBQUM7O2dCQXpCSCxPQUFPLE9BQU87Ozs7aUJBMEJiO1lBQ0gsQ0FBQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLEtBQVU7Z0JBQzlCLG9CQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxjQUFZLEVBQUUsQ0FBQztvQkFDakIsT0FBTztnQkFDVCxDQUFDO2dCQUNELG1CQUFpQixFQUFFLENBQUM7WUFDdEIsQ0FBQyxDQUFDO1FBQ0osQ0FBQzs7SUFDSCxDQUFDO0lBQ0gsc0JBQUM7QUFBRCxDQUFDLEFBMUhELENBRVUscUJBQVMsR0F3SGxCO0FBRVEsMENBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEluc3RhbmNlIH0gZnJvbSAnc2ltcGxlLXBlZXInO1xuaW1wb3J0IHR5cGUge1xuICBCYXNlSW50ZXJhY3Rpb24sXG4gIExpc3RlbmVyT3B0aW9ucyxcbiAgU2VuZE9wdGlvbnMsXG4gIFRyYW5zcG9ydE9wdGlvbnMsXG59IGZyb20gJy4uL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBUcmFuc3BvcnQgfSBmcm9tICcuLi90cmFuc3BvcnQnO1xuXG5jb25zdCBNQVhfQ0hVTktfU0laRSA9IDEwMjQgKiA2MDtcblxuY29uc3QgQlVGRkVSX0ZVTExfVEhSRVNIT0xEID0gMTAyNCAqIDY0O1xuXG5jb25zdCBFWFBJUkVEX1RJTUUgPSAxMDAwICogNjA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViUlRDVHJhbnNwb3J0T3B0aW9ucyBleHRlbmRzIFBhcnRpYWw8VHJhbnNwb3J0T3B0aW9ucz4ge1xuICBwZWVyOiBJbnN0YW5jZTtcbn1cblxuaW50ZXJmYWNlIFdlYlJUQ1RyYW5zcG9ydFNlbmRPcHRpb25zIGV4dGVuZHMgU2VuZE9wdGlvbnM8e30+IHtcbiAgY2h1bmtJZD86IG51bWJlcjtcbiAgbGVuZ3RoPzogbnVtYmVyO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBXZWJSVENUcmFuc3BvcnQ8XG4gIFQgZXh0ZW5kcyBCYXNlSW50ZXJhY3Rpb24gPSBhbnlcbj4gZXh0ZW5kcyBUcmFuc3BvcnQ8VD4ge1xuICBwcml2YXRlIHJlY2VpdmVCdWZmZXIgPSBuZXcgTWFwPHN0cmluZywgeyBkYXRhOiBhbnlbXTsgdGltZXN0YW1wOiBudW1iZXIgfT4oKTtcblxuICBjb25zdHJ1Y3Rvcihfb3B0aW9uczogV2ViUlRDVHJhbnNwb3J0T3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIHBlZXIsXG4gICAgICBsaXN0ZW5lciA9IChjYWxsYmFjaykgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2U6IFdlYlJUQ1RyYW5zcG9ydFNlbmRPcHRpb25zID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgICBjb25zdCBrZXkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobWVzc2FnZSwgJ3JlcXVlc3QnKVxuICAgICAgICAgICAgPyAncmVxdWVzdCdcbiAgICAgICAgICAgIDogJ3Jlc3BvbnNlJztcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLnJlY2VpdmVCdWZmZXIuZ2V0KFxuICAgICAgICAgICAgbWVzc2FnZS5fX0RBVEFfVFJBTlNQT1JUX1VVSURfX1xuICAgICAgICAgICkgPz8ge1xuICAgICAgICAgICAgZGF0YTogW10sXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLnJlY2VpdmVCdWZmZXIuc2V0KG1lc3NhZ2UuX19EQVRBX1RSQU5TUE9SVF9VVUlEX18sIGJ1ZmZlcik7XG4gICAgICAgICAgYnVmZmVyLmRhdGFbbWVzc2FnZS5jaHVua0lkIV0gPSBtZXNzYWdlW2tleV07XG4gICAgICAgICAgYnVmZmVyLmRhdGEubGVuZ3RoID0gbWVzc2FnZS5sZW5ndGghO1xuICAgICAgICAgIGJ1ZmZlci50aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IGlzQ29tcGxldGUgPVxuICAgICAgICAgICAgYnVmZmVyLmRhdGEuZmlsdGVyKChpdGVtKSA9PiBpdGVtKS5sZW5ndGggPT09IG1lc3NhZ2UubGVuZ3RoO1xuICAgICAgICAgIGlmIChpc0NvbXBsZXRlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShidWZmZXIuZGF0YS5qb2luKCcnKSk7XG4gICAgICAgICAgICBtZXNzYWdlW2tleV0gPSBrZXkgPT09ICdyZXF1ZXN0JyA/IGRhdGEgOiBkYXRhWzBdO1xuICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2UubGVuZ3RoO1xuICAgICAgICAgICAgY2FsbGJhY2sobWVzc2FnZSBhcyBMaXN0ZW5lck9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZlQnVmZmVyLmRlbGV0ZShtZXNzYWdlLl9fREFUQV9UUkFOU1BPUlRfVVVJRF9fKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2lkLCBpdGVtXSBvZiB0aGlzLnJlY2VpdmVCdWZmZXIpIHtcbiAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSBpdGVtLnRpbWVzdGFtcCA+IEVYUElSRURfVElNRSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlci5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBwZWVyLm9uKCdkYXRhJywgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgcGVlci5vZmYoJ2RhdGEnLCBoYW5kbGVyKTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBzZW5kZXIgPSAobWVzc2FnZTogV2ViUlRDVHJhbnNwb3J0U2VuZE9wdGlvbnMpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1lc3NhZ2UsICdyZXF1ZXN0JylcbiAgICAgICAgICA/ICdyZXF1ZXN0J1xuICAgICAgICAgIDogJ3Jlc3BvbnNlJztcbiAgICAgICAgbWVzc2FnZVtrZXldID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAga2V5ID09PSAncmVxdWVzdCdcbiAgICAgICAgICAgID8gbWVzc2FnZS5yZXF1ZXN0XG4gICAgICAgICAgICA6IHR5cGVvZiBtZXNzYWdlLnJlc3BvbnNlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgPyBbbWVzc2FnZS5yZXNwb25zZV1cbiAgICAgICAgICAgIDogW11cbiAgICAgICAgKTtcbiAgICAgICAgbGV0IGNodW5rSWQgPSAwO1xuICAgICAgICBjb25zdCBhbGxDaHVua3NTaXplID0gTWF0aC5jZWlsKFxuICAgICAgICAgIChtZXNzYWdlW2tleV0gYXMgc3RyaW5nKS5sZW5ndGggLyBNQVhfQ0hVTktfU0laRVxuICAgICAgICApO1xuICAgICAgICB3aGlsZSAoKG1lc3NhZ2Vba2V5XSBhcyBzdHJpbmcpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgICAgIFtrZXldOiAobWVzc2FnZVtrZXldIGFzIHN0cmluZykuc2xpY2UoMCwgTUFYX0NIVU5LX1NJWkUpLFxuICAgICAgICAgICAgY2h1bmtJZCxcbiAgICAgICAgICAgIGxlbmd0aDogYWxsQ2h1bmtzU2l6ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHBlZXIuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgICAgICAgbWVzc2FnZVtrZXldID0gKG1lc3NhZ2Vba2V5XSBhcyBzdHJpbmcpLnNsaWNlKE1BWF9DSFVOS19TSVpFKTtcbiAgICAgICAgICBjaHVua0lkICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSA9IF9vcHRpb25zO1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBsaXN0ZW5lcixcbiAgICAgIHNlbmRlcixcbiAgICB9KTtcbiAgICBpZiAocGVlcikge1xuICAgICAgbGV0IHdlYlJUQ1BhdXNlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgd2ViUlRDTWVzc2FnZVF1ZXVlOiBhbnlbXSA9IFtdO1xuICAgICAgY29uc3QgcGVlclNlbmQgPSBwZWVyLnNlbmQuYmluZChwZWVyKTtcbiAgICAgIGNvbnN0IHNlbmRNZXNzYWdlUXVldWVkID0gKCkgPT4ge1xuICAgICAgICB3ZWJSVENQYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB3ZWJSVENNZXNzYWdlUXVldWUuc2hpZnQoKTtcbiAgICAgICAgd2hpbGUgKG1lc3NhZ2UpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAocGVlciBhcyBhbnkpLl9jaGFubmVsLmJ1ZmZlcmVkQW1vdW50ICYmXG4gICAgICAgICAgICAocGVlciBhcyBhbnkpLl9jaGFubmVsLmJ1ZmZlcmVkQW1vdW50ID4gQlVGRkVSX0ZVTExfVEhSRVNIT0xEXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB3ZWJSVENQYXVzZWQgPSB0cnVlO1xuICAgICAgICAgICAgd2ViUlRDTWVzc2FnZVF1ZXVlLnVuc2hpZnQobWVzc2FnZSk7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgKHBlZXIgYXMgYW55KS5fY2hhbm5lbC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICdidWZmZXJlZGFtb3VudGxvdycsXG4gICAgICAgICAgICAgICAgbGlzdGVuZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VRdWV1ZWQoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAocGVlciBhcyBhbnkpLl9jaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICdidWZmZXJlZGFtb3VudGxvdycsXG4gICAgICAgICAgICAgIGxpc3RlbmVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGVlclNlbmQobWVzc2FnZSk7XG4gICAgICAgICAgICBtZXNzYWdlID0gd2ViUlRDTWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBzZW5kIG1lc3NhZ2UgdG8gcGVlcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHBlZXIuc2VuZCA9IGZ1bmN0aW9uIChjaHVuazogYW55KSB7XG4gICAgICAgIHdlYlJUQ01lc3NhZ2VRdWV1ZS5wdXNoKGNodW5rKTtcbiAgICAgICAgaWYgKHdlYlJUQ1BhdXNlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZW5kTWVzc2FnZVF1ZXVlZCgpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgV2ViUlRDVHJhbnNwb3J0IH07XG4iXX0=