UNPKG

leveros

Version:

The Lever OS Node client library

252 lines (208 loc) 26 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.Client = undefined; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _leverosCommon = require('leveros-common'); var common = _interopRequireWildcard(_leverosCommon); var _grpc = require('grpc'); var _grpc2 = _interopRequireDefault(_grpc); var _grpcpool = require('./grpcpool'); var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Endpoint = function () { function Endpoint(env, service, resource, client) { _classCallCheck(this, Endpoint); this._leverURL = new common.LeverURL(env, service, resource); this._client = client; } _createClass(Endpoint, [{ key: 'invoke', value: function invoke(method) { var leverURL = new common.LeverURL(this._leverURL.environment, this._leverURL.service, this._leverURL.resource, method); for (var _len = arguments.length, argsAndCallback = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { argsAndCallback[_key - 1] = arguments[_key]; } var invokeArgs = _lodash2.default.concat([leverURL], argsAndCallback); this._client._invoke.apply(this._client, invokeArgs); } }, { key: 'invokeChan', value: function invokeChan(method) { var leverURL = new common.LeverURL(this._leverURL.environment, this._leverURL.service, this._leverURL.resource, method); for (var _len2 = arguments.length, argsAndCallback = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { argsAndCallback[_key2 - 1] = arguments[_key2]; } var invokeChanArgs = _lodash2.default.concat([leverURL], argsAndCallback); this._client._invokeChan.apply(this._client, invokeChanArgs); } }]); return Endpoint; }(); var Client = function () { function Client() { _classCallCheck(this, Client); this._connections = new _grpcpool.GRPCPool(); this.forceHost = ""; } _createClass(Client, [{ key: 'service', value: function service(env, _service) { return new Endpoint(env, _service, "", this); } }, { key: 'resource', value: function resource(env, service, _resource) { return new Endpoint(env, service, _resource, this); } }, { key: 'invokeURL', value: function invokeURL(leverURLStr) { var leverURL = common.parseLeverURL(leverURLStr); for (var _len3 = arguments.length, argsAndCallback = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { argsAndCallback[_key3 - 1] = arguments[_key3]; } var invokeArgs = _lodash2.default.concat([leverURL], argsAndCallback); this._invoke.apply(this, invokeArgs); } }, { key: 'invokeChanURL', value: function invokeChanURL(leverURLStr) { var leverURL = common.parseLeverURL(leverURLStr); for (var _len4 = arguments.length, argsAndCallback = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { argsAndCallback[_key4 - 1] = arguments[_key4]; } var invokeChanArgs = _lodash2.default.concat([leverURL], argsAndCallback); this._invokeChan.apply(this, invokeChanArgs); } }, { key: '_invoke', value: function _invoke(leverURL) { for (var _len5 = arguments.length, argsAndCallback = Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) { argsAndCallback[_key5 - 1] = arguments[_key5]; } if (argsAndCallback.length === 0 || !_lodash2.default.isFunction(argsAndCallback[argsAndCallback.length - 1])) { throw new Error("Callback not provided"); } var args = argsAndCallback.slice(0, argsAndCallback.length - 1); var callback = argsAndCallback[argsAndCallback.length - 1]; if (isChanMethod(leverURL.method)) { callback(new Error("Use invokeChan for streaming methods")); return; } if (!leverURL.environment && !common.ownEnvironment) { callback(new Error("Environment not specified and cannot be deduced")); return; } if (!leverURL.environment) { leverURL.environment = common.ownEnvironment; } var dialTo = void 0; if (this.forceHost) { dialTo = this.forceHost; } else { if ((isInternalEnvironment(leverURL.environment) || leverURL.environment === common.ownEnvironment) && global.leverInternalRPCGateway) { dialTo = global.leverInternalRPCGateway; } else { dialTo = leverURL.environment; } } this._connections.dial(dialTo, function (error, connection) { if (error) { callback(error); return; } var rpc = common.jsToRpc(args); sendLeverRPC(connection, leverURL, rpc, function (sendError, reply) { if (sendError) { callback(sendError); return; } callback.apply(null, common.replyToJs(reply)); }); }); } }, { key: '_invokeChan', value: function _invokeChan(leverURL) { for (var _len6 = arguments.length, argsAndCallback = Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { argsAndCallback[_key6 - 1] = arguments[_key6]; } if (argsAndCallback.length === 0 || !_lodash2.default.isFunction(argsAndCallback[argsAndCallback.length - 1])) { throw new Error("Callback not provided"); } var args = argsAndCallback.slice(0, argsAndCallback.length - 1); var callback = argsAndCallback[argsAndCallback.length - 1]; if (!isChanMethod(leverURL.method)) { callback(new Error("Use invoke for non-streaming methods")); return; } if (!leverURL.environment && !common.ownEnvironment) { callback(new Error("Environment not specified and cannot be deduced")); return; } if (!leverURL.environment) { leverURL.environment = common.ownEnvironment; } var dialTo = void 0; if (this.forceHost) { dialTo = this.forceHost; } else { if ((isInternalEnvironment(leverURL.environment) || leverURL.environment === common.ownEnvironment) && global.leverInternalRPCGateway) { dialTo = global.leverInternalRPCGateway; } else { dialTo = leverURL.environment; } } this._connections.dial(dialTo, function (error, connection) { if (error) { callback(error); return; } var call = sendStreamingLeverRPC(connection, leverURL); call.write({ rpc: common.jsToRpc(args) }); var onError = function onError(err) { callback(err); }; call.on('error', onError); call.once('data', function (streamMsg) { call.removeListener('error', onError); if (streamMsg.message_oneof !== null) { var errorStr = "First message must be empty"; call.write({ error: errorStr }); call.end(); callback(new Error(errorStr)); return; } callback(null, new common.Stream(call)); }); }); } }]); return Client; }(); exports.Client = Client; function isChanMethod(name) { return _lodash2.default.endsWith(name, "Chan") || _lodash2.default.endsWith(name, "_chan") || name === "chan"; } function isInternalEnvironment(env) { if (!common.internalEnvSuffix) { return false; } return _lodash2.default.endsWith(env, common.internalEnvSuffix); } function sendLeverRPC(connection, leverURL, rpc, callback) { var metadata = new _grpc2.default.Metadata(); metadata.set('lever-url', leverURL.toString()); connection.handleRpc(rpc, callback, metadata); } function sendStreamingLeverRPC(connection, leverURL) { var metadata = new _grpc2.default.Metadata(); metadata.set('lever-url', leverURL.toString()); return connection.handleStreamingRpc(metadata); } //# sourceMappingURL=data:application/json;base64,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QUFPLFFBQVAsQ0FBZ0IsSUFBaEIsRUFBc0IsT0FBdEIsQ0FEQSxJQUVBLFNBQVMsTUFIYjtBQUlIOztBQUVELFNBQVMscUJBQVQsQ0FBK0IsR0FBL0IsRUFBb0M7QUFDaEMsUUFBSSxDQUFDLE9BQU8saUJBQVosRUFBK0I7QUFDM0IsZUFBTyxLQUFQO0FBQ0g7QUFDRCxXQUFPLGlCQUFPLFFBQVAsQ0FBZ0IsR0FBaEIsRUFBcUIsT0FBTyxpQkFBNUIsQ0FBUDtBQUNIOztBQUVELFNBQVMsWUFBVCxDQUFzQixVQUF0QixFQUFrQyxRQUFsQyxFQUE0QyxHQUE1QyxFQUFpRCxRQUFqRCxFQUEyRDtBQUN2RCxRQUFNLFdBQVcsSUFBSSxlQUFLLFFBQVQsRUFBakI7QUFDQSxhQUFTLEdBQVQsQ0FBYSxXQUFiLEVBQTBCLFNBQVMsUUFBVCxFQUExQjtBQUNBLGVBQVcsU0FBWCxDQUFxQixHQUFyQixFQUEwQixRQUExQixFQUFvQyxRQUFwQztBQUNIOztBQUVELFNBQVMscUJBQVQsQ0FBK0IsVUFBL0IsRUFBMkMsUUFBM0MsRUFBcUQ7QUFDakQsUUFBTSxXQUFXLElBQUksZUFBSyxRQUFULEVBQWpCO0FBQ0EsYUFBUyxHQUFULENBQWEsV0FBYixFQUEwQixTQUFTLFFBQVQsRUFBMUI7QUFDQSxXQUFPLFdBQVcsa0JBQVgsQ0FBOEIsUUFBOUIsQ0FBUDtBQUNIIiwiZmlsZSI6ImNsaWVudC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0ICogYXMgY29tbW9uIGZyb20gJ2xldmVyb3MtY29tbW9uJztcbmltcG9ydCBncnBjIGZyb20gJ2dycGMnO1xuaW1wb3J0IHsgR1JQQ1Bvb2wgfSBmcm9tICcuL2dycGNwb29sJztcbmltcG9ydCBsb2Rhc2ggZnJvbSAnbG9kYXNoJztcblxuY2xhc3MgRW5kcG9pbnQge1xuICAgIGNvbnN0cnVjdG9yKGVudiwgc2VydmljZSwgcmVzb3VyY2UsIGNsaWVudCkge1xuICAgICAgICB0aGlzLl9sZXZlclVSTCA9IG5ldyBjb21tb24uTGV2ZXJVUkwoZW52LCBzZXJ2aWNlLCByZXNvdXJjZSk7XG4gICAgICAgIHRoaXMuX2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG5cbiAgICBpbnZva2UobWV0aG9kLCAuLi5hcmdzQW5kQ2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgbGV2ZXJVUkwgPSBuZXcgY29tbW9uLkxldmVyVVJMKFxuICAgICAgICAgICAgdGhpcy5fbGV2ZXJVUkwuZW52aXJvbm1lbnQsXG4gICAgICAgICAgICB0aGlzLl9sZXZlclVSTC5zZXJ2aWNlLFxuICAgICAgICAgICAgdGhpcy5fbGV2ZXJVUkwucmVzb3VyY2UsXG4gICAgICAgICAgICBtZXRob2QpO1xuICAgICAgICBjb25zdCBpbnZva2VBcmdzID0gbG9kYXNoLmNvbmNhdChbbGV2ZXJVUkxdLCBhcmdzQW5kQ2FsbGJhY2spO1xuICAgICAgICB0aGlzLl9jbGllbnQuX2ludm9rZS5hcHBseSh0aGlzLl9jbGllbnQsIGludm9rZUFyZ3MpO1xuICAgIH1cblxuICAgIGludm9rZUNoYW4obWV0aG9kLCAuLi5hcmdzQW5kQ2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgbGV2ZXJVUkwgPSBuZXcgY29tbW9uLkxldmVyVVJMKFxuICAgICAgICAgICAgdGhpcy5fbGV2ZXJVUkwuZW52aXJvbm1lbnQsXG4gICAgICAgICAgICB0aGlzLl9sZXZlclVSTC5zZXJ2aWNlLFxuICAgICAgICAgICAgdGhpcy5fbGV2ZXJVUkwucmVzb3VyY2UsXG4gICAgICAgICAgICBtZXRob2QpO1xuICAgICAgICBjb25zdCBpbnZva2VDaGFuQXJncyA9IGxvZGFzaC5jb25jYXQoW2xldmVyVVJMXSwgYXJnc0FuZENhbGxiYWNrKTtcbiAgICAgICAgdGhpcy5fY2xpZW50Ll9pbnZva2VDaGFuLmFwcGx5KHRoaXMuX2NsaWVudCwgaW52b2tlQ2hhbkFyZ3MpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsaWVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zID0gbmV3IEdSUENQb29sKCk7XG4gICAgICAgIHRoaXMuZm9yY2VIb3N0ID0gXCJcIjtcbiAgICB9XG5cbiAgICBzZXJ2aWNlKGVudiwgc2VydmljZSkge1xuICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50KGVudiwgc2VydmljZSwgXCJcIiwgdGhpcyk7XG4gICAgfVxuXG4gICAgcmVzb3VyY2UoZW52LCBzZXJ2aWNlLCByZXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50KGVudiwgc2VydmljZSwgcmVzb3VyY2UsIHRoaXMpO1xuICAgIH1cblxuICAgIGludm9rZVVSTChsZXZlclVSTFN0ciwgLi4uYXJnc0FuZENhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGxldmVyVVJMID0gY29tbW9uLnBhcnNlTGV2ZXJVUkwobGV2ZXJVUkxTdHIpO1xuICAgICAgICBjb25zdCBpbnZva2VBcmdzID0gbG9kYXNoLmNvbmNhdChbbGV2ZXJVUkxdLCBhcmdzQW5kQ2FsbGJhY2spO1xuICAgICAgICB0aGlzLl9pbnZva2UuYXBwbHkodGhpcywgaW52b2tlQXJncyk7XG4gICAgfVxuXG4gICAgaW52b2tlQ2hhblVSTChsZXZlclVSTFN0ciwgLi4uYXJnc0FuZENhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGxldmVyVVJMID0gY29tbW9uLnBhcnNlTGV2ZXJVUkwobGV2ZXJVUkxTdHIpO1xuICAgICAgICBjb25zdCBpbnZva2VDaGFuQXJncyA9IGxvZGFzaC5jb25jYXQoW2xldmVyVVJMXSwgYXJnc0FuZENhbGxiYWNrKTtcbiAgICAgICAgdGhpcy5faW52b2tlQ2hhbi5hcHBseSh0aGlzLCBpbnZva2VDaGFuQXJncyk7XG4gICAgfVxuXG4gICAgX2ludm9rZShsZXZlclVSTCwgLi4uYXJnc0FuZENhbGxiYWNrKSB7XG4gICAgICAgIGlmIChhcmdzQW5kQ2FsbGJhY2subGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICAgICAgIWxvZGFzaC5pc0Z1bmN0aW9uKGFyZ3NBbmRDYWxsYmFja1thcmdzQW5kQ2FsbGJhY2subGVuZ3RoLTFdKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FsbGJhY2sgbm90IHByb3ZpZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBhcmdzQW5kQ2FsbGJhY2suc2xpY2UoMCwgYXJnc0FuZENhbGxiYWNrLmxlbmd0aC0xKTtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzQW5kQ2FsbGJhY2tbYXJnc0FuZENhbGxiYWNrLmxlbmd0aC0xXTtcblxuICAgICAgICBpZiAoaXNDaGFuTWV0aG9kKGxldmVyVVJMLm1ldGhvZCkpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcihcIlVzZSBpbnZva2VDaGFuIGZvciBzdHJlYW1pbmcgbWV0aG9kc1wiKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsZXZlclVSTC5lbnZpcm9ubWVudCAmJiAhY29tbW9uLm93bkVudmlyb25tZW50KSB7XG4gICAgICAgICAgICBjYWxsYmFjayhcbiAgICAgICAgICAgICAgICBuZXcgRXJyb3IoXCJFbnZpcm9ubWVudCBub3Qgc3BlY2lmaWVkIGFuZCBjYW5ub3QgYmUgZGVkdWNlZFwiKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsZXZlclVSTC5lbnZpcm9ubWVudCkge1xuICAgICAgICAgICAgbGV2ZXJVUkwuZW52aXJvbm1lbnQgPSBjb21tb24ub3duRW52aXJvbm1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGlhbFRvO1xuICAgICAgICBpZiAodGhpcy5mb3JjZUhvc3QpIHtcbiAgICAgICAgICAgIGRpYWxUbyA9IHRoaXMuZm9yY2VIb3N0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKChpc0ludGVybmFsRW52aXJvbm1lbnQobGV2ZXJVUkwuZW52aXJvbm1lbnQpIHx8XG4gICAgICAgICAgICAgICAgbGV2ZXJVUkwuZW52aXJvbm1lbnQgPT09IGNvbW1vbi5vd25FbnZpcm9ubWVudCkgJiZcbiAgICAgICAgICAgICAgICBnbG9iYWwubGV2ZXJJbnRlcm5hbFJQQ0dhdGV3YXkpIHtcbiAgICAgICAgICAgICAgICBkaWFsVG8gPSBnbG9iYWwubGV2ZXJJbnRlcm5hbFJQQ0dhdGV3YXk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpYWxUbyA9IGxldmVyVVJMLmVudmlyb25tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmRpYWwoZGlhbFRvLCAoZXJyb3IsIGNvbm5lY3Rpb24pID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJwYyA9IGNvbW1vbi5qc1RvUnBjKGFyZ3MpO1xuICAgICAgICAgICAgc2VuZExldmVyUlBDKFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sIGxldmVyVVJMLCBycGMsIChzZW5kRXJyb3IsIHJlcGx5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZW5kRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbmRFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgY29tbW9uLnJlcGx5VG9KcyhyZXBseSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfaW52b2tlQ2hhbihsZXZlclVSTCwgLi4uYXJnc0FuZENhbGxiYWNrKSB7XG4gICAgICAgIGlmIChhcmdzQW5kQ2FsbGJhY2subGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICAgICAgIWxvZGFzaC5pc0Z1bmN0aW9uKGFyZ3NBbmRDYWxsYmFja1thcmdzQW5kQ2FsbGJhY2subGVuZ3RoLTFdKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FsbGJhY2sgbm90IHByb3ZpZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBhcmdzQW5kQ2FsbGJhY2suc2xpY2UoMCwgYXJnc0FuZENhbGxiYWNrLmxlbmd0aC0xKTtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzQW5kQ2FsbGJhY2tbYXJnc0FuZENhbGxiYWNrLmxlbmd0aC0xXTtcblxuICAgICAgICBpZiAoIWlzQ2hhbk1ldGhvZChsZXZlclVSTC5tZXRob2QpKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoXCJVc2UgaW52b2tlIGZvciBub24tc3RyZWFtaW5nIG1ldGhvZHNcIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbGV2ZXJVUkwuZW52aXJvbm1lbnQgJiYgIWNvbW1vbi5vd25FbnZpcm9ubWVudCkge1xuICAgICAgICAgICAgY2FsbGJhY2soXG4gICAgICAgICAgICAgICAgbmV3IEVycm9yKFwiRW52aXJvbm1lbnQgbm90IHNwZWNpZmllZCBhbmQgY2Fubm90IGJlIGRlZHVjZWRcIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbGV2ZXJVUkwuZW52aXJvbm1lbnQpIHtcbiAgICAgICAgICAgIGxldmVyVVJMLmVudmlyb25tZW50ID0gY29tbW9uLm93bkVudmlyb25tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRpYWxUbztcbiAgICAgICAgaWYgKHRoaXMuZm9yY2VIb3N0KSB7XG4gICAgICAgICAgICBkaWFsVG8gPSB0aGlzLmZvcmNlSG9zdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICgoaXNJbnRlcm5hbEVudmlyb25tZW50KGxldmVyVVJMLmVudmlyb25tZW50KSB8fFxuICAgICAgICAgICAgICAgIGxldmVyVVJMLmVudmlyb25tZW50ID09PSBjb21tb24ub3duRW52aXJvbm1lbnQpICYmXG4gICAgICAgICAgICAgICAgZ2xvYmFsLmxldmVySW50ZXJuYWxSUENHYXRld2F5KSB7XG4gICAgICAgICAgICAgICAgZGlhbFRvID0gZ2xvYmFsLmxldmVySW50ZXJuYWxSUENHYXRld2F5O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaWFsVG8gPSBsZXZlclVSTC5lbnZpcm9ubWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb25uZWN0aW9ucy5kaWFsKGRpYWxUbywgKGVycm9yLCBjb25uZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjYWxsID0gc2VuZFN0cmVhbWluZ0xldmVyUlBDKGNvbm5lY3Rpb24sIGxldmVyVVJMKTtcbiAgICAgICAgICAgIGNhbGwud3JpdGUoe3JwYzogY29tbW9uLmpzVG9ScGMoYXJncyl9KTtcbiAgICAgICAgICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYWxsLm9uKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICAgICAgY2FsbC5vbmNlKCdkYXRhJywgKHN0cmVhbU1zZykgPT4ge1xuICAgICAgICAgICAgICAgIGNhbGwucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmVhbU1zZy5tZXNzYWdlX29uZW9mICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yU3RyID0gXCJGaXJzdCBtZXNzYWdlIG11c3QgYmUgZW1wdHlcIjtcbiAgICAgICAgICAgICAgICAgICAgY2FsbC53cml0ZSh7ZXJyb3I6IGVycm9yU3RyfSk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGwuZW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcihlcnJvclN0cikpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgbmV3IGNvbW1vbi5TdHJlYW0oY2FsbCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNDaGFuTWV0aG9kKG5hbWUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBsb2Rhc2guZW5kc1dpdGgobmFtZSwgXCJDaGFuXCIpIHx8XG4gICAgICAgIGxvZGFzaC5lbmRzV2l0aChuYW1lLCBcIl9jaGFuXCIpIHx8XG4gICAgICAgIG5hbWUgPT09IFwiY2hhblwiKTtcbn1cblxuZnVuY3Rpb24gaXNJbnRlcm5hbEVudmlyb25tZW50KGVudikge1xuICAgIGlmICghY29tbW9uLmludGVybmFsRW52U3VmZml4KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGxvZGFzaC5lbmRzV2l0aChlbnYsIGNvbW1vbi5pbnRlcm5hbEVudlN1ZmZpeCk7XG59XG5cbmZ1bmN0aW9uIHNlbmRMZXZlclJQQyhjb25uZWN0aW9uLCBsZXZlclVSTCwgcnBjLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IGdycGMuTWV0YWRhdGEoKTtcbiAgICBtZXRhZGF0YS5zZXQoJ2xldmVyLXVybCcsIGxldmVyVVJMLnRvU3RyaW5nKCkpO1xuICAgIGNvbm5lY3Rpb24uaGFuZGxlUnBjKHJwYywgY2FsbGJhY2ssIG1ldGFkYXRhKTtcbn1cblxuZnVuY3Rpb24gc2VuZFN0cmVhbWluZ0xldmVyUlBDKGNvbm5lY3Rpb24sIGxldmVyVVJMKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBuZXcgZ3JwYy5NZXRhZGF0YSgpO1xuICAgIG1ldGFkYXRhLnNldCgnbGV2ZXItdXJsJywgbGV2ZXJVUkwudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb24uaGFuZGxlU3RyZWFtaW5nUnBjKG1ldGFkYXRhKTtcbn1cbiJdfQ==