data-transport
Version:
A simple and responsive transport
193 lines • 25.2 kB
JavaScript
;
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=