leveros
Version:
The Lever OS Node client library
252 lines (208 loc) • 26 kB
JavaScript
;
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==