UNPKG

data-transport

Version:
193 lines 25.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SharedWorkerTransport = exports.SharedWorkerInternalTransport = exports.SharedWorkerClientTransport = void 0; var tslib_1 = require("tslib"); var constant_1 = require("../constant"); var transport_1 = require("../transport"); var connectEventName = 'sharedworker-connect'; var disconnectEventName = 'sharedworker-disconnect'; var SharedWorkerClientTransport = /** @class */ (function (_super) { tslib_1.__extends(SharedWorkerClientTransport, _super); function SharedWorkerClientTransport(_options) { var _this = this; var worker = _options.worker, _a = _options.listener, listener = _a === void 0 ? function (callback) { var handler = function (_a) { var data = _a.data; callback(data); }; worker.port.addEventListener('message', handler); worker.port.start(); return function () { worker.port.removeEventListener('message', handler); }; } : _a, _b = _options.sender, sender = _b === void 0 ? function (message) { var _a; var transfer = (_a = message.transfer) !== null && _a !== void 0 ? _a : []; delete message.transfer; worker.port.postMessage(message, transfer); } : _b, options = tslib_1.__rest(_options, ["worker", "listener", "sender"]); _this = _super.call(this, tslib_1.__assign(tslib_1.__assign({}, options), { listener: listener, sender: sender })) || this; _this._onConnectCallback = new Set(); // do not use `unload` event // https://developer.chrome.com/docs/web-platform/deprecating-unload window.addEventListener('pagehide', function () { // @ts-ignore _this.emit({ name: disconnectEventName, respond: false }, _this.id); }); // @ts-ignore _this.listen(connectEventName, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var _this = this; return tslib_1.__generator(this, function (_a) { Promise.resolve().then(function () { _this._onConnectCallback.forEach(function (callback) { callback(); }); }); return [2 /*return*/, this.id]; }); }); }); return _this; } SharedWorkerClientTransport.prototype.onConnect = function (callback) { var _this = this; this._onConnectCallback.add(callback); return function () { _this._onConnectCallback.delete(callback); }; }; return SharedWorkerClientTransport; }(transport_1.Transport)); exports.SharedWorkerClientTransport = SharedWorkerClientTransport; var SharedWorkerInternalTransport = /** @class */ (function (_super) { tslib_1.__extends(SharedWorkerInternalTransport, _super); function SharedWorkerInternalTransport(_options) { if (_options === void 0) { _options = {}; } var _this = this; var _a = _options.listener, listener = _a === void 0 ? function (callback) { var _this = this; this[constant_1.callbackKey] = callback; return function () { _this.ports.forEach(function (port) { port._handler && port.removeEventListener('message', port._handler); delete port._handler; }); self.close(); }; } : _a, _b = _options.sender, sender = _b === void 0 ? function (message) { var _a, _b; var transfer = (_a = message.transfer) !== null && _a !== void 0 ? _a : []; delete message.transfer; var port = (_b = message._extra) === null || _b === void 0 ? void 0 : _b._port; // pick a client port for sender. if (port) { delete message._extra._port; port.postMessage(message, transfer); } else if (message.type === 'response' && // @ts-ignore _this.ports.has(message.requestId)) { // @ts-ignore var port_1 = _this.ports.get(message.requestId); port_1.postMessage(message, transfer); } else { _this.ports.forEach(function (port) { try { port.postMessage(message, transfer); } catch (error) { console.error(error); } }); _this.tempPorts.forEach(function (port) { try { port.postMessage(message, transfer); } catch (error) { console.error(error); } }); } } : _b, options = tslib_1.__rest(_options, ["listener", "sender"]); _this = _super.call(this, tslib_1.__assign(tslib_1.__assign({}, options), { listener: listener, sender: sender })) || this; _this.ports = new Map(); _this.tempPorts = new Set(); _this._onConnectCallback = new Set(); _this._onDisconnectCallback = new Set(); var disconnectActionName = (0, transport_1.getAction)(_this[constant_1.prefixKey], disconnectEventName); self.addEventListener('connect', function (e) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var port, id_1, err_1; var _this = this; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: port = e.ports[0]; port._handler = function (_a) { var _b; var data = _a.data; if (data.hasRespond) { data._extra = (_b = data._extra) !== null && _b !== void 0 ? _b : {}; data._extra._port = port; } if (data.action === disconnectActionName && _this.ports.has(data.requestId)) { // clear port and clientId when the port's client is disconnected. _this.ports.delete(data.requestId); _this._onDisconnectCallback.forEach(function (callback) { callback(data.requestId); }); } _this[constant_1.callbackKey](data); }; port.addEventListener('message', port._handler); port.start(); this.tempPorts.add(port); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, this.emit({ // @ts-ignore name: connectEventName, _extra: { _port: port }, })]; case 2: id_1 = _a.sent(); this.ports.set(id_1, port); this.tempPorts.delete(port); this._onConnectCallback.forEach(function (callback) { callback(id_1); }); return [3 /*break*/, 4]; case 3: err_1 = _a.sent(); this.tempPorts.delete(port); console.error(err_1); return [3 /*break*/, 4]; case 4: return [2 /*return*/]; } }); }); }); return _this; } SharedWorkerInternalTransport.prototype.onConnect = function (callback) { var _this = this; this._onConnectCallback.add(callback); return function () { _this._onConnectCallback.delete(callback); }; }; SharedWorkerInternalTransport.prototype.onDisconnect = function (callback) { var _this = this; this._onDisconnectCallback.add(callback); return function () { _this._onDisconnectCallback.delete(callback); }; }; return SharedWorkerInternalTransport; }(transport_1.Transport)); exports.SharedWorkerInternalTransport = SharedWorkerInternalTransport; exports.SharedWorkerTransport = { Client: SharedWorkerClientTransport, Worker: SharedWorkerInternalTransport, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkV29ya2VyVHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYW5zcG9ydHMvc2hhcmVkV29ya2VyVHJhbnNwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSx3Q0FBcUQ7QUFRckQsMENBQW9EO0FBa0JwRCxJQUFNLGdCQUFnQixHQUFHLHNCQUFzQixDQUFDO0FBQ2hELElBQU0sbUJBQW1CLEdBQUcseUJBQXlCLENBQUM7QUFLdEQ7SUFFVSx1REFBWTtJQUNwQixxQ0FBWSxRQUE0QztRQUF4RCxpQkEwQ0M7UUF4Q0csSUFBQSxNQUFNLEdBbUJKLFFBQVEsT0FuQkosRUFDTixLQWtCRSxRQUFRLFNBUFQsRUFYRCxRQUFRLG1CQUFHLFVBQUMsUUFBUTtZQUNsQixJQUFNLE9BQU8sR0FBRyxVQUFDLEVBRW1DO29CQURsRCxJQUFJLFVBQUE7Z0JBRUosUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pCLENBQUMsQ0FBQztZQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEIsT0FBTztnQkFDTCxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN0RCxDQUFDLENBQUM7UUFDSixDQUFDLEtBQUEsRUFDRCxLQU1FLFFBQVEsT0FGVCxFQUpELE1BQU0sbUJBQUcsVUFBQyxPQUFPOztZQUNmLElBQU0sUUFBUSxHQUFHLE1BQUEsT0FBTyxDQUFDLFFBQVEsbUNBQUksRUFBRSxDQUFDO1lBQ3hDLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDN0MsQ0FBQyxLQUFBLEVBQ0UsT0FBTyxr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MkI7SUFDbkMsTUFBTSxFQUFFLDZCQUE2QjtDQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2FsbGJhY2tLZXksIHByZWZpeEtleSB9IGZyb20gJy4uL2NvbnN0YW50JztcbmltcG9ydCB7IGxpc3RlbiB9IGZyb20gJy4uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHtcbiAgVHJhbnNwb3J0T3B0aW9ucyxcbiAgVHJhbnNmZXJhYmxlV29ya2VyLFxuICBMaXN0ZW5lck9wdGlvbnMsXG4gIEJhc2VJbnRlcmFjdGlvbixcbn0gZnJvbSAnLi4vaW50ZXJmYWNlJztcbmltcG9ydCB7IGdldEFjdGlvbiwgVHJhbnNwb3J0IH0gZnJvbSAnLi4vdHJhbnNwb3J0JztcblxuZGVjbGFyZSB2YXIgc2VsZjogU2hhcmVkV29ya2VyR2xvYmFsU2NvcGU7XG5pbnRlcmZhY2UgU2hhcmVkV29ya2VyUG9ydCBleHRlbmRzIFRyYW5zZmVyYWJsZVdvcmtlciB7XG4gIF9wb3J0PzogTWVzc2FnZVBvcnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmVkV29ya2VyQ2xpZW50VHJhbnNwb3J0T3B0aW9uc1xuICBleHRlbmRzIFBhcnRpYWw8VHJhbnNwb3J0T3B0aW9uczxUcmFuc2ZlcmFibGVXb3JrZXI+PiB7XG4gIC8qKlxuICAgKiBQYXNzIGEgc2hhcmVkIHdvcmtlciBpbnN0YW5jZSBmb3IgZGF0YSB0cmFuc3BvcnQuXG4gICAqL1xuICB3b3JrZXI6IFNoYXJlZFdvcmtlcjtcbn1cblxudHlwZSBDbGllbnRDYWxsYmFjayA9ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xudHlwZSBXb3JrZXJDYWxsYmFjayA9IChjbGllbnRJZDogc3RyaW5nKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuY29uc3QgY29ubmVjdEV2ZW50TmFtZSA9ICdzaGFyZWR3b3JrZXItY29ubmVjdCc7XG5jb25zdCBkaXNjb25uZWN0RXZlbnROYW1lID0gJ3NoYXJlZHdvcmtlci1kaXNjb25uZWN0JztcblxuZXhwb3J0IGludGVyZmFjZSBTaGFyZWRXb3JrZXJJbnRlcm5hbFRyYW5zcG9ydE9wdGlvbnNcbiAgZXh0ZW5kcyBQYXJ0aWFsPFRyYW5zcG9ydE9wdGlvbnM8U2hhcmVkV29ya2VyUG9ydD4+IHt9XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFyZWRXb3JrZXJDbGllbnRUcmFuc3BvcnQ8XG4gIFQgZXh0ZW5kcyBCYXNlSW50ZXJhY3Rpb24gPSBhbnlcbj4gZXh0ZW5kcyBUcmFuc3BvcnQ8VD4ge1xuICBjb25zdHJ1Y3Rvcihfb3B0aW9uczogU2hhcmVkV29ya2VyQ2xpZW50VHJhbnNwb3J0T3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIHdvcmtlcixcbiAgICAgIGxpc3RlbmVyID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoe1xuICAgICAgICAgIGRhdGEsXG4gICAgICAgIH06IE1lc3NhZ2VFdmVudDxMaXN0ZW5lck9wdGlvbnM8VHJhbnNmZXJhYmxlV29ya2VyPj4pID0+IHtcbiAgICAgICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICAgICAgfTtcbiAgICAgICAgd29ya2VyLnBvcnQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICB3b3JrZXIucG9ydC5zdGFydCgpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIHdvcmtlci5wb3J0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBzZW5kZXIgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCB0cmFuc2ZlciA9IG1lc3NhZ2UudHJhbnNmZXIgPz8gW107XG4gICAgICAgIGRlbGV0ZSBtZXNzYWdlLnRyYW5zZmVyO1xuICAgICAgICB3b3JrZXIucG9ydC5wb3N0TWVzc2FnZShtZXNzYWdlLCB0cmFuc2Zlcik7XG4gICAgICB9LFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gPSBfb3B0aW9ucztcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbGlzdGVuZXIsXG4gICAgICBzZW5kZXIsXG4gICAgfSk7XG4gICAgLy8gZG8gbm90IHVzZSBgdW5sb2FkYCBldmVudFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZG9jcy93ZWItcGxhdGZvcm0vZGVwcmVjYXRpbmctdW5sb2FkXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywgKCkgPT4ge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5lbWl0KHsgbmFtZTogZGlzY29ubmVjdEV2ZW50TmFtZSwgcmVzcG9uZDogZmFsc2UgfSwgdGhpcy5pZCk7XG4gICAgfSk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMubGlzdGVuKGNvbm5lY3RFdmVudE5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl9vbkNvbm5lY3RDYWxsYmFjay5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcy5pZDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQ29ubmVjdENhbGxiYWNrID0gbmV3IFNldDxDbGllbnRDYWxsYmFjaz4oKTtcblxuICBvbkNvbm5lY3QoY2FsbGJhY2s6IENsaWVudENhbGxiYWNrKSB7XG4gICAgdGhpcy5fb25Db25uZWN0Q2FsbGJhY2suYWRkKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5fb25Db25uZWN0Q2FsbGJhY2suZGVsZXRlKGNhbGxiYWNrKTtcbiAgICB9O1xuICB9XG59XG5cbmludGVyZmFjZSBTaGFyZWRXb3JrZXJUcmFuc3BvcnRQb3J0IGV4dGVuZHMgTWVzc2FnZVBvcnQge1xuICBfaGFuZGxlcj86IChvcHRpb25zOiBNZXNzYWdlRXZlbnQ8TGlzdGVuZXJPcHRpb25zPFNoYXJlZFdvcmtlclBvcnQ+PikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYXJlZFdvcmtlckludGVybmFsVHJhbnNwb3J0PFxuICBUIGV4dGVuZHMgQmFzZUludGVyYWN0aW9uID0gYW55XG4+IGV4dGVuZHMgVHJhbnNwb3J0PFQ+IHtcbiAgcHJvdGVjdGVkIHBvcnRzID0gbmV3IE1hcDxzdHJpbmcsIE1lc3NhZ2VQb3J0PigpO1xuICBwcm90ZWN0ZWQgdGVtcFBvcnRzID0gbmV3IFNldDxNZXNzYWdlUG9ydD4oKTtcbiAgcHJpdmF0ZSBbY2FsbGJhY2tLZXldITogKG9wdGlvbnM6IExpc3RlbmVyT3B0aW9uczxTaGFyZWRXb3JrZXJQb3J0PikgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3Rvcihfb3B0aW9uczogU2hhcmVkV29ya2VySW50ZXJuYWxUcmFuc3BvcnRPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBsaXN0ZW5lciA9IGZ1bmN0aW9uICh0aGlzOiBTaGFyZWRXb3JrZXJJbnRlcm5hbFRyYW5zcG9ydCwgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpc1tjYWxsYmFja0tleV0gPSBjYWxsYmFjaztcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICB0aGlzLnBvcnRzLmZvckVhY2goKHBvcnQ6IFNoYXJlZFdvcmtlclRyYW5zcG9ydFBvcnQpID0+IHtcbiAgICAgICAgICAgIHBvcnQuX2hhbmRsZXIgJiYgcG9ydC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgcG9ydC5faGFuZGxlcik7XG4gICAgICAgICAgICBkZWxldGUgcG9ydC5faGFuZGxlcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzZWxmLmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgc2VuZGVyID0gKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgdHJhbnNmZXIgPSBtZXNzYWdlLnRyYW5zZmVyID8/IFtdO1xuICAgICAgICBkZWxldGUgbWVzc2FnZS50cmFuc2ZlcjtcbiAgICAgICAgY29uc3QgcG9ydCA9IG1lc3NhZ2UuX2V4dHJhPy5fcG9ydDtcbiAgICAgICAgLy8gcGljayBhIGNsaWVudCBwb3J0IGZvciBzZW5kZXIuXG4gICAgICAgIGlmIChwb3J0KSB7XG4gICAgICAgICAgZGVsZXRlIG1lc3NhZ2UuX2V4dHJhIS5fcG9ydDtcbiAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRyYW5zZmVyKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBtZXNzYWdlLnR5cGUgPT09ICdyZXNwb25zZScgJiZcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgdGhpcy5wb3J0cy5oYXMobWVzc2FnZS5yZXF1ZXN0SWQpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjb25zdCBwb3J0ID0gdGhpcy5wb3J0cy5nZXQobWVzc2FnZS5yZXF1ZXN0SWQpITtcbiAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRyYW5zZmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnBvcnRzLmZvckVhY2goKHBvcnQpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2UobWVzc2FnZSwgdHJhbnNmZXIpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy50ZW1wUG9ydHMuZm9yRWFjaCgocG9ydCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZShtZXNzYWdlLCB0cmFuc2Zlcik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9ID0gX29wdGlvbnM7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGxpc3RlbmVyLFxuICAgICAgc2VuZGVyLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGlzY29ubmVjdEFjdGlvbk5hbWUgPSBnZXRBY3Rpb24oXG4gICAgICB0aGlzW3ByZWZpeEtleV0hLFxuICAgICAgZGlzY29ubmVjdEV2ZW50TmFtZVxuICAgICk7XG4gICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdjb25uZWN0JywgYXN5bmMgKGUpID0+IHtcbiAgICAgIGNvbnN0IHBvcnQ6IFNoYXJlZFdvcmtlclRyYW5zcG9ydFBvcnQgPSBlLnBvcnRzWzBdO1xuICAgICAgcG9ydC5faGFuZGxlciA9ICh7XG4gICAgICAgIGRhdGEsXG4gICAgICB9OiBNZXNzYWdlRXZlbnQ8TGlzdGVuZXJPcHRpb25zPFNoYXJlZFdvcmtlclBvcnQ+PikgPT4ge1xuICAgICAgICBpZiAoZGF0YS5oYXNSZXNwb25kKSB7XG4gICAgICAgICAgZGF0YS5fZXh0cmEgPSBkYXRhLl9leHRyYSA/PyB7fTtcbiAgICAgICAgICBkYXRhLl9leHRyYS5fcG9ydCA9IHBvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRhdGEuYWN0aW9uID09PSBkaXNjb25uZWN0QWN0aW9uTmFtZSAmJlxuICAgICAgICAgIHRoaXMucG9ydHMuaGFzKGRhdGEucmVxdWVzdElkKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBjbGVhciBwb3J0IGFuZCBjbGllbnRJZCB3aGVuIHRoZSBwb3J0J3MgY2xpZW50IGlzIGRpc2Nvbm5lY3RlZC5cbiAgICAgICAgICB0aGlzLnBvcnRzLmRlbGV0ZShkYXRhLnJlcXVlc3RJZCk7XG4gICAgICAgICAgdGhpcy5fb25EaXNjb25uZWN0Q2FsbGJhY2suZm9yRWFjaCgoY2FsbGJhY2spID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEucmVxdWVzdElkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzW2NhbGxiYWNrS2V5XShkYXRhKTtcbiAgICAgIH07XG4gICAgICBwb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBwb3J0Ll9oYW5kbGVyKTtcbiAgICAgIHBvcnQuc3RhcnQoKTtcbiAgICAgIHRoaXMudGVtcFBvcnRzLmFkZChwb3J0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGJlY2F1c2UgcGFyYW1ldGVycyBpcyB1bmtub3duXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgaWQ6IHN0cmluZyA9IGF3YWl0IHRoaXMuZW1pdCh7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIG5hbWU6IGNvbm5lY3RFdmVudE5hbWUsXG4gICAgICAgICAgX2V4dHJhOiB7IF9wb3J0OiBwb3J0IH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBvcnRzLnNldChpZCwgcG9ydCk7XG4gICAgICAgIHRoaXMudGVtcFBvcnRzLmRlbGV0ZShwb3J0KTtcbiAgICAgICAgdGhpcy5fb25Db25uZWN0Q2FsbGJhY2suZm9yRWFjaCgoY2FsbGJhY2spID0+IHtcbiAgICAgICAgICBjYWxsYmFjayhpZCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMudGVtcFBvcnRzLmRlbGV0ZShwb3J0KTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Db25uZWN0Q2FsbGJhY2sgPSBuZXcgU2V0PFdvcmtlckNhbGxiYWNrPigpO1xuXG4gIG9uQ29ubmVjdChjYWxsYmFjazogV29ya2VyQ2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbkNvbm5lY3RDYWxsYmFjay5hZGQoY2FsbGJhY2spO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLl9vbkNvbm5lY3RDYWxsYmFjay5kZWxldGUoY2FsbGJhY2spO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9vbkRpc2Nvbm5lY3RDYWxsYmFjayA9IG5ldyBTZXQ8V29ya2VyQ2FsbGJhY2s+KCk7XG5cbiAgb25EaXNjb25uZWN0KGNhbGxiYWNrOiBXb3JrZXJDYWxsYmFjaykge1xuICAgIHRoaXMuX29uRGlzY29ubmVjdENhbGxiYWNrLmFkZChjYWxsYmFjayk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuX29uRGlzY29ubmVjdENhbGxiYWNrLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgU2hhcmVkV29ya2VyVHJhbnNwb3J0ID0ge1xuICBDbGllbnQ6IFNoYXJlZFdvcmtlckNsaWVudFRyYW5zcG9ydCxcbiAgV29ya2VyOiBTaGFyZWRXb3JrZXJJbnRlcm5hbFRyYW5zcG9ydCxcbn07XG4iXX0=