package.dist.src.internal.cache-control-client.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of sdk Show documentation
Show all versions of sdk Show documentation
Client SDK for Momento services
The newest version!
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CacheControlClient = void 0;
const generated_types_1 = require("@gomomento/generated-types");
var grpcControl = generated_types_1.control.control_client;
const headers_interceptor_1 = require("./grpc/headers-interceptor");
const cache_service_error_mapper_1 = require("../errors/cache-service-error-mapper");
const grpc_js_1 = require("@grpc/grpc-js");
const __1 = require("..");
const package_json_1 = require("../../package.json");
const idle_grpc_client_wrapper_1 = require("./grpc/idle-grpc-client-wrapper");
const utils_1 = require("@gomomento/sdk-core/dist/src/internal/utils");
const retry_interceptor_1 = require("./grpc/retry-interceptor");
class CacheControlClient {
/**
* @param {ControlClientProps} props
*/
constructor(props) {
this.logger = props.configuration.getLoggerFactory().getLogger(this);
this.cacheServiceErrorMapper = new cache_service_error_mapper_1.CacheServiceErrorMapper(props.configuration.getThrowOnErrors());
const headers = [
new headers_interceptor_1.Header('Authorization', props.credentialProvider.getAuthToken()),
new headers_interceptor_1.Header('agent', `nodejs:cache:${package_json_1.version}`),
new headers_interceptor_1.Header('runtime-version', `nodejs:${process.versions.node}`),
];
this.interceptors = [
headers_interceptor_1.HeaderInterceptor.createHeadersInterceptor(headers),
retry_interceptor_1.RetryInterceptor.createRetryInterceptor({
clientName: 'CacheControlClient',
loggerFactory: props.configuration.getLoggerFactory(),
overallRequestTimeoutMs: CacheControlClient.REQUEST_TIMEOUT_MS,
}),
];
this.logger.debug(`Creating control client using endpoint: '${props.credentialProvider.getControlEndpoint()}`);
this.clientWrapper = new idle_grpc_client_wrapper_1.IdleGrpcClientWrapper({
clientFactoryFn: () => new grpcControl.ScsControlClient(props.credentialProvider.getControlEndpoint(), props.credentialProvider.isControlEndpointSecure()
? grpc_js_1.ChannelCredentials.createSsl()
: grpc_js_1.ChannelCredentials.createInsecure()),
loggerFactory: props.configuration.getLoggerFactory(),
maxIdleMillis: props.configuration
.getTransportStrategy()
.getMaxIdleMillis(),
});
}
close() {
this.logger.debug('Closing cache control client');
this.clientWrapper.getClient().close();
}
async createCache(name) {
try {
(0, utils_1.validateCacheName)(name);
}
catch (err) {
return this.cacheServiceErrorMapper.returnOrThrowError(err, err => new __1.CreateCache.Error(err));
}
this.logger.debug(`Creating cache: ${name}`);
const request = new grpcControl._CreateCacheRequest({
cache_name: name,
});
return await new Promise((resolve, reject) => {
this.clientWrapper
.getClient()
.CreateCache(request, { interceptors: this.interceptors }, (err, _resp) => {
if (err) {
const sdkError = this.cacheServiceErrorMapper.convertError(err);
if (sdkError.errorCode() ===
__1.MomentoErrorCode.CACHE_ALREADY_EXISTS_ERROR) {
resolve(new __1.CreateCache.AlreadyExists());
}
else {
this.cacheServiceErrorMapper.resolveOrRejectError({
err: err,
errorResponseFactoryFn: e => new __1.CreateCache.Error(e),
resolveFn: resolve,
rejectFn: reject,
});
}
}
else {
resolve(new __1.CreateCache.Success());
}
});
});
}
async deleteCache(name) {
try {
(0, utils_1.validateCacheName)(name);
}
catch (err) {
return this.cacheServiceErrorMapper.returnOrThrowError(err, err => new __1.DeleteCache.Error(err));
}
const request = new grpcControl._DeleteCacheRequest({
cache_name: name,
});
this.logger.debug(`Deleting cache: ${name}`);
return await new Promise((resolve, reject) => {
this.clientWrapper
.getClient()
.DeleteCache(request, { interceptors: this.interceptors }, (err, _resp) => {
if (err) {
this.cacheServiceErrorMapper.resolveOrRejectError({
err: err,
errorResponseFactoryFn: e => new __1.DeleteCache.Error(e),
resolveFn: resolve,
rejectFn: reject,
});
}
else {
resolve(new __1.DeleteCache.Success());
}
});
});
}
async flushCache(cacheName) {
try {
(0, utils_1.validateCacheName)(cacheName);
}
catch (err) {
return this.cacheServiceErrorMapper.returnOrThrowError(err, err => new __1.CacheFlush.Error(err));
}
this.logger.debug(`Flushing cache: ${cacheName}`);
return await this.sendFlushCache(cacheName);
}
async sendFlushCache(cacheName) {
const request = new grpcControl._FlushCacheRequest({
cache_name: cacheName,
});
return await new Promise((resolve, reject) => {
this.clientWrapper.getClient().FlushCache(request, {
interceptors: this.interceptors,
}, (err, resp) => {
if (resp) {
resolve(new __1.CacheFlush.Success());
}
else {
this.cacheServiceErrorMapper.resolveOrRejectError({
err: err,
errorResponseFactoryFn: e => new __1.CacheFlush.Error(e),
resolveFn: resolve,
rejectFn: reject,
});
}
});
});
}
async listCaches() {
const request = new grpcControl._ListCachesRequest();
request.next_token = '';
this.logger.debug("Issuing 'listCaches' request");
return await new Promise((resolve, reject) => {
this.clientWrapper
.getClient()
.ListCaches(request, { interceptors: this.interceptors }, (err, resp) => {
if (err || !resp) {
this.cacheServiceErrorMapper.resolveOrRejectError({
err: err,
errorResponseFactoryFn: e => new __1.ListCaches.Error(e),
resolveFn: resolve,
rejectFn: reject,
});
}
else {
const caches = resp.cache.map(cache => {
var _a, _b, _c, _d, _e, _f, _g;
const cacheName = cache.cache_name;
const topicLimits = {
maxPublishMessageSizeKb: ((_a = cache.topic_limits) === null || _a === void 0 ? void 0 : _a.max_publish_message_size_kb) || 0,
maxSubscriptionCount: ((_b = cache.topic_limits) === null || _b === void 0 ? void 0 : _b.max_subscription_count) || 0,
maxPublishRate: ((_c = cache.topic_limits) === null || _c === void 0 ? void 0 : _c.max_publish_rate) || 0,
};
const cacheLimits = {
maxTtlSeconds: ((_d = cache.cache_limits) === null || _d === void 0 ? void 0 : _d.max_ttl_seconds) || 0,
maxItemSizeKb: ((_e = cache.cache_limits) === null || _e === void 0 ? void 0 : _e.max_item_size_kb) || 0,
maxThroughputKbps: ((_f = cache.cache_limits) === null || _f === void 0 ? void 0 : _f.max_throughput_kbps) || 0,
maxTrafficRate: ((_g = cache.cache_limits) === null || _g === void 0 ? void 0 : _g.max_traffic_rate) || 0,
};
return new __1.CacheInfo(cacheName, topicLimits, cacheLimits);
});
resolve(new __1.ListCaches.Success(caches));
}
});
});
}
}
exports.CacheControlClient = CacheControlClient;
CacheControlClient.REQUEST_TIMEOUT_MS = 60 * 1000;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtY29udHJvbC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW50ZXJuYWwvY2FjaGUtY29udHJvbC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0VBQW1EO0FBQ25ELElBQU8sV0FBVyxHQUFHLHlCQUFPLENBQUMsY0FBYyxDQUFDO0FBQzVDLG9FQUFxRTtBQUNyRSxxRkFBNkU7QUFDN0UsMkNBQThEO0FBQzlELDBCQVNZO0FBQ1oscURBQTJDO0FBQzNDLDhFQUFzRTtBQUd0RSx1RUFBOEU7QUFLOUUsZ0VBQTBEO0FBTzFELE1BQWEsa0JBQWtCO0lBTzdCOztPQUVHO0lBQ0gsWUFBWSxLQUF5QjtRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksb0RBQXVCLENBQ3hELEtBQUssQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsQ0FDdkMsQ0FBQztRQUNGLE1BQU0sT0FBTyxHQUFHO1lBQ2QsSUFBSSw0QkFBTSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEUsSUFBSSw0QkFBTSxDQUFDLE9BQU8sRUFBRSxnQkFBZ0Isc0JBQU8sRUFBRSxDQUFDO1lBQzlDLElBQUksNEJBQU0sQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDakUsQ0FBQztRQUNGLElBQUksQ0FBQyxZQUFZLEdBQUc7WUFDbEIsdUNBQWlCLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDO1lBQ25ELG9DQUFnQixDQUFDLHNCQUFzQixDQUFDO2dCQUN0QyxVQUFVLEVBQUUsb0JBQW9CO2dCQUNoQyxhQUFhLEVBQUUsS0FBSyxDQUFD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QUMsWUFBWSwwQ0FBRSwyQkFBMkIsS0FBSSxDQUFDOzRCQUN0RCxvQkFBb0IsRUFDbEIsQ0FBQSxNQUFBLEtBQUssQ0FBQyxZQUFZLDBDQUFFLHNCQUFzQixLQUFJLENBQUM7NEJBQ2pELGNBQWMsRUFBRSxDQUFBLE1BQUEsS0FBSyxDQUFDLFlBQVksMENBQUUsZ0JBQWdCLEtBQUksQ0FBQzt5QkFDMUQsQ0FBQzt3QkFDRixNQUFNLFdBQVcsR0FBZ0I7NEJBQy9CLGFBQWEsRUFBRSxDQUFBLE1BQUEsS0FBSyxDQUFDLFlBQVksMENBQUUsZUFBZSxLQUFJLENBQUM7NEJBQ3ZELGFBQWEsRUFBRSxDQUFBLE1BQUEsS0FBSyxDQUFDLFlBQVksMENBQUUsZ0JBQWdCLEtBQUksQ0FBQzs0QkFDeEQsaUJBQWlCLEVBQUUsQ0FBQSxNQUFBLEtBQUssQ0FBQyxZQUFZLDBDQUFFLG1CQUFtQixLQUFJLENBQUM7NEJBQy9ELGNBQWMsRUFBRSxDQUFBLE1BQUEsS0FBSyxDQUFDLFlBQVksMENBQUUsZ0JBQWdCLEtBQUksQ0FBQzt5QkFDMUQsQ0FBQzt3QkFDRixPQUFPLElBQUksYUFBUyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBQzVELENBQUMsQ0FBQyxDQUFDO29CQUNILE9BQU8sQ0FBQyxJQUFJLGNBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztpQkFDekM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUE5TUgsZ0RBK01DO0FBNU15QixxQ0FBa0IsR0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtjb250cm9sfSBmcm9tICdAZ29tb21lbnRvL2dlbmVyYXRlZC10eXBlcyc7XG5pbXBvcnQgZ3JwY0NvbnRyb2wgPSBjb250cm9sLmNvbnRyb2xfY2xpZW50O1xuaW1wb3J0IHtIZWFkZXIsIEhlYWRlckludGVyY2VwdG9yfSBmcm9tICcuL2dycGMvaGVhZGVycy1pbnRlcmNlcHRvcic7XG5pbXBvcnQge0NhY2hlU2VydmljZUVycm9yTWFwcGVyfSBmcm9tICcuLi9lcnJvcnMvY2FjaGUtc2VydmljZS1lcnJvci1tYXBwZXInO1xuaW1wb3J0IHtDaGFubmVsQ3JlZGVudGlhbHMsIEludGVyY2VwdG9yfSBmcm9tICdAZ3JwYy9ncnBjLWpzJztcbmltcG9ydCB7XG4gIENyZWF0ZUNhY2hlLFxuICBEZWxldGVDYWNoZSxcbiAgTGlzdENhY2hlcyxcbiAgQ2FjaGVGbHVzaCxcbiAgQ3JlZGVudGlhbFByb3ZpZGVyLFxuICBNb21lbnRvTG9nZ2VyLFxuICBDYWNoZUluZm8sXG4gIE1vbWVudG9FcnJvckNvZGUsXG59IGZyb20gJy4uJztcbmltcG9ydCB7dmVyc2lvbn0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCB7SWRsZUdycGNDbGllbnRXcmFwcGVyfSBmcm9tICcuL2dycGMvaWRsZS1ncnBjLWNsaWVudC13cmFwcGVyJztcbmltcG9ydCB7R3JwY0NsaWVudFdyYXBwZXJ9IGZyb20gJy4vZ3JwYy9ncnBjLWNsaWVudC13cmFwcGVyJztcbmltcG9ydCB7Q29uZmlndXJhdGlvbn0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHt2YWxpZGF0ZUNhY2hlTmFtZX0gZnJvbSAnQGdvbW9tZW50by9zZGstY29yZS9kaXN0L3NyYy9pbnRlcm5hbC91dGlscyc7XG5pbXBvcnQge1xuICBDYWNoZUxpbWl0cyxcbiAgVG9waWNMaW1pdHMsXG59IGZyb20gJ0Bnb21vbWVudG8vc2RrLWNvcmUvZGlzdC9zcmMvbWVzc2FnZXMvY2FjaGUtaW5mbyc7XG5pbXBvcnQge1JldHJ5SW50ZXJjZXB0b3J9IGZyb20gJy4vZ3JwYy9yZXRyeS1pbnRlcmNlcHRvcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJvbENsaWVudFByb3BzIHtcbiAgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbjtcbiAgY3JlZGVudGlhbFByb3ZpZGVyOiBDcmVkZW50aWFsUHJvdmlkZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBDYWNoZUNvbnRyb2xDbGllbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudFdyYXBwZXI6IEdycGNDbGllbnRXcmFwcGVyPGdycGNDb250cm9sLlNjc0NvbnRyb2xDbGllbnQ+O1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVyY2VwdG9yczogSW50ZXJjZXB0b3JbXTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUkVRVUVTVF9USU1FT1VUX01TOiBudW1iZXIgPSA2MCAqIDEwMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBNb21lbnRvTG9nZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlU2VydmljZUVycm9yTWFwcGVyOiBDYWNoZVNlcnZpY2VFcnJvck1hcHBlcjtcblxuICAvKipcbiAgICogQHBhcmFtIHtDb250cm9sQ2xpZW50UHJvcHN9IHByb3BzXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm9wczogQ29udHJvbENsaWVudFByb3BzKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBwcm9wcy5jb25maWd1cmF0aW9uLmdldExvZ2dlckZhY3RvcnkoKS5nZXRMb2dnZXIodGhpcyk7XG4gICAgdGhpcy5jYWNoZVNlcnZpY2VFcnJvck1hcHBlciA9IG5ldyBDYWNoZVNlcnZpY2VFcnJvck1hcHBlcihcbiAgICAgIHByb3BzLmNvbmZpZ3VyYXRpb24uZ2V0VGhyb3dPbkVycm9ycygpXG4gICAgKTtcbiAgICBjb25zdCBoZWFkZXJzID0gW1xuICAgICAgbmV3IEhlYWRlcignQXV0aG9yaXphdGlvbicsIHByb3BzLmNyZWRlbnRpYWxQcm92aWRlci5nZXRBdXRoVG9rZW4oKSksXG4gICAgICBuZXcgSGVhZGVyKCdhZ2VudCcsIGBub2RlanM6Y2FjaGU6JHt2ZXJzaW9ufWApLFxuICAgICAgbmV3IEhlYWRlcigncnVudGltZS12ZXJzaW9uJywgYG5vZGVqczoke3Byb2Nlc3MudmVyc2lvbnMubm9kZX1gKSxcbiAgICBdO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzID0gW1xuICAgICAgSGVhZGVySW50ZXJjZXB0b3IuY3JlYXRlSGVhZGVyc0ludGVyY2VwdG9yKGhlYWRlcnMpLFxuICAgICAgUmV0cnlJbnRlcmNlcHRvci5jcmVhdGVSZXRyeUludGVyY2VwdG9yKHtcbiAgICAgICAgY2xpZW50TmFtZTogJ0NhY2hlQ29udHJvbENsaWVudCcsXG4gICAgICAgIGxvZ2dlckZhY3Rvcnk6IHByb3BzLmNvbmZpZ3VyYXRpb24uZ2V0TG9nZ2VyRmFjdG9yeSgpLFxuICAgICAgICBvdmVyYWxsUmVxdWVzdFRpbWVvdXRNczogQ2FjaGVDb250cm9sQ2xpZW50LlJFUVVFU1RfVElNRU9VVF9NUyxcbiAgICAgIH0pLFxuICAgIF07XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBgQ3JlYXRpbmcgY29udHJvbCBjbGllbnQgdXNpbmcgZW5kcG9pbnQ6ICcke3Byb3BzLmNyZWRlbnRpYWxQcm92aWRlci5nZXRDb250cm9sRW5kcG9pbnQoKX1gXG4gICAgKTtcbiAgICB0aGlzLmNsaWVudFdyYXBwZXIgPSBuZXcgSWRsZUdycGNDbGllbnRXcmFwcGVyKHtcbiAgICAgIGNsaWVudEZhY3RvcnlGbjogKCkgPT5cbiAgICAgICAgbmV3IGdycGNDb250cm9sLlNjc0NvbnRyb2xDbGllbnQoXG4gICAgICAgICAgcHJvcHMuY3JlZGVudGlhbFByb3ZpZGVyLmdldENvbnRyb2xFbmRwb2ludCgpLFxuICAgICAgICAgIHByb3BzLmNyZWRlbnRpYWxQcm92aWRlci5pc0NvbnRyb2xFbmRwb2ludFNlY3VyZSgpXG4gICAgICAgICAgICA/IENoYW5uZWxDcmVkZW50aWFscy5jcmVhdGVTc2woKVxuICAgICAgICAgICAgOiBDaGFubmVsQ3JlZGVudGlhbHMuY3JlYXRlSW5zZWN1cmUoKVxuICAgICAgICApLFxuICAgICAgbG9nZ2VyRmFjdG9yeTogcHJvcHMuY29uZmlndXJhdGlvbi5nZXRMb2dnZXJGYWN0b3J5KCksXG4gICAgICBtYXhJZGxlTWlsbGlzOiBwcm9wcy5jb25maWd1cmF0aW9uXG4gICAgICAgIC5nZXRUcmFuc3BvcnRTdHJhdGVneSgpXG4gICAgICAgIC5nZXRNYXhJZGxlTWlsbGlzKCksXG4gICAgfSk7XG4gIH1cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0Nsb3NpbmcgY2FjaGUgY29udHJvbCBjbGllbnQnKTtcbiAgICB0aGlzLmNsaWVudFdyYXBwZXIuZ2V0Q2xpZW50KCkuY2xvc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVDYWNoZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPENyZWF0ZUNhY2hlLlJlc3BvbnNlPiB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlQ2FjaGVOYW1lKG5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVTZXJ2aWNlRXJyb3JNYXBwZXIucmV0dXJuT3JUaHJvd0Vycm9yKFxuICAgICAgICBlcnIgYXMgRXJyb3IsXG4gICAgICAgIGVyciA9PiBuZXcgQ3JlYXRlQ2FjaGUuRXJyb3IoZXJyKVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYENyZWF0aW5nIGNhY2hlOiAke25hbWV9YCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBncnBjQ29udHJvbC5fQ3JlYXRlQ2FjaGVSZXF1ZXN0KHtcbiAgICAgIGNhY2hlX25hbWU6IG5hbWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPENyZWF0ZUNhY2hlLlJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNsaWVudFdyYXBwZXJcbiAgICAgICAgLmdldENsaWVudCgpXG4gICAgICAgIC5DcmVhdGVDYWNoZShcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHtpbnRlcmNlcHRvcnM6IHRoaXMuaW50ZXJjZXB0b3JzfSxcbiAgICAgICAgICAoZXJyLCBfcmVzcCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICBjb25zdCBzZGtFcnJvciA9IHRoaXMuY2FjaGVTZXJ2aWNlRXJyb3JNYXBwZXIuY29udmVydEVycm9yKGVycik7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzZGtFcnJvci5lcnJvckNvZGUoKSA9PT1cbiAgICAgICAgICAgICAgICBNb21lbnRvRXJyb3JDb2RlLkNBQ0hFX0FMUkVBRFlfRVhJU1RTX0VSUk9SXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IENyZWF0ZUNhY2hlLkFscmVhZHlFeGlzdHMoKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVNlcnZpY2VFcnJvck1hcHBlci5yZXNvbHZlT3JSZWplY3RFcnJvcih7XG4gICAgICAgICAgICAgICAgICBlcnI6IGVycixcbiAgICAgICAgICAgICAgICAgIGVycm9yUmVzcG9uc2VGYWN0b3J5Rm46IGUgPT4gbmV3IENyZWF0ZUNhY2hlLkVycm9yKGUpLFxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZUZuOiByZXNvbHZlLFxuICAgICAgICAgICAgICAgICAgcmVqZWN0Rm46IHJlamVjdCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgQ3JlYXRlQ2FjaGUuU3VjY2VzcygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlQ2FjaGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxEZWxldGVDYWNoZS5SZXNwb25zZT4ge1xuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZUNhY2hlTmFtZShuYW1lKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlU2VydmljZUVycm9yTWFwcGVyLnJldHVybk9yVGhyb3dFcnJvcihcbiAgICAgICAgZXJyIGFzIEVycm9yLFxuICAgICAgICBlcnIgPT4gbmV3IERlbGV0ZUNhY2hlLkVycm9yKGVycilcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgZ3JwY0NvbnRyb2wuX0RlbGV0ZUNhY2hlUmVxdWVzdCh7XG4gICAgICBjYWNoZV9uYW1lOiBuYW1lLFxuICAgIH0pO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBEZWxldGluZyBjYWNoZTogJHtuYW1lfWApO1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxEZWxldGVDYWNoZS5SZXNwb25zZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5jbGllbnRXcmFwcGVyXG4gICAgICAgIC5nZXRDbGllbnQoKVxuICAgICAgICAuRGVsZXRlQ2FjaGUoXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICB7aW50ZXJjZXB0b3JzOiB0aGlzLmludGVyY2VwdG9yc30sXG4gICAgICAgICAgKGVyciwgX3Jlc3ApID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jYWNoZVNlcnZpY2VFcnJvck1hcHBlci5yZXNvbHZlT3JSZWplY3RFcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyOiBlcnIsXG4gICAgICAgICAgICAgICAgZXJyb3JSZXNwb25zZUZhY3RvcnlGbjogZSA9PiBuZXcgRGVsZXRlQ2FjaGUuRXJyb3IoZSksXG4gICAgICAgICAgICAgICAgcmVzb2x2ZUZuOiByZXNvbHZlLFxuICAgICAgICAgICAgICAgIHJlamVjdEZuOiByZWplY3QsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgRGVsZXRlQ2FjaGUuU3VjY2VzcygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZmx1c2hDYWNoZShjYWNoZU5hbWU6IHN0cmluZyk6IFByb21pc2U8Q2FjaGVGbHVzaC5SZXNwb25zZT4ge1xuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZUNhY2hlTmFtZShjYWNoZU5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVTZXJ2aWNlRXJyb3JNYXBwZXIucmV0dXJuT3JUaHJvd0Vycm9yKFxuICAgICAgICBlcnIgYXMgRXJyb3IsXG4gICAgICAgIGVyciA9PiBuZXcgQ2FjaGVGbHVzaC5FcnJvcihlcnIpXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgRmx1c2hpbmcgY2FjaGU6ICR7Y2FjaGVOYW1lfWApO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRGbHVzaENhY2hlKGNhY2hlTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRGbHVzaENhY2hlKFxuICAgIGNhY2hlTmFtZTogc3RyaW5nXG4gICk6IFByb21pc2U8Q2FjaGVGbHVzaC5SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgZ3JwY0NvbnRyb2wuX0ZsdXNoQ2FjaGVSZXF1ZXN0KHtcbiAgICAgIGNhY2hlX25hbWU6IGNhY2hlTmFtZSxcbiAgICB9KTtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5jbGllbnRXcmFwcGVyLmdldENsaWVudCgpLkZsdXNoQ2FjaGUoXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHtcbiAgICAgICAgICBpbnRlcmNlcHRvcnM6IHRoaXMuaW50ZXJjZXB0b3JzLFxuICAgICAgICB9LFxuICAgICAgICAoZXJyLCByZXNwKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3ApIHtcbiAgICAgICAgICAgIHJlc29sdmUobmV3IENhY2hlRmx1c2guU3VjY2VzcygpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jYWNoZVNlcnZpY2VFcnJvck1hcHBlci5yZXNvbHZlT3JSZWplY3RFcnJvcih7XG4gICAgICAgICAgICAgIGVycjogZXJyLFxuICAgICAgICAgICAgICBlcnJvclJlc3BvbnNlRmFjdG9yeUZuOiBlID0+IG5ldyBDYWNoZUZsdXNoLkVycm9yKGUpLFxuICAgICAgICAgICAgICByZXNvbHZlRm46IHJlc29sdmUsXG4gICAgICAgICAgICAgIHJlamVjdEZuOiByZWplY3QsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbGlzdENhY2hlcygpOiBQcm9taXNlPExpc3RDYWNoZXMuUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IGdycGNDb250cm9sLl9MaXN0Q2FjaGVzUmVxdWVzdCgpO1xuICAgIHJlcXVlc3QubmV4dF90b2tlbiA9ICcnO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwiSXNzdWluZyAnbGlzdENhY2hlcycgcmVxdWVzdFwiKTtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8TGlzdENhY2hlcy5SZXNwb25zZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5jbGllbnRXcmFwcGVyXG4gICAgICAgIC5nZXRDbGllbnQoKVxuICAgICAgICAuTGlzdENhY2hlcyhyZXF1ZXN0LCB7aW50ZXJjZXB0b3JzOiB0aGlzLmludGVyY2VwdG9yc30sIChlcnIsIHJlc3ApID0+IHtcbiAgICAgICAgICBpZiAoZXJyIHx8ICFyZXNwKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZUVycm9yTWFwcGVyLnJlc29sdmVPclJlamVjdEVycm9yKHtcbiAgICAgICAgICAgICAgZXJyOiBlcnIsXG4gICAgICAgICAgICAgIGVycm9yUmVzcG9uc2VGYWN0b3J5Rm46IGUgPT4gbmV3IExpc3RDYWNoZXMuRXJyb3IoZSksXG4gICAgICAgICAgICAgIHJlc29sdmVGbjogcmVzb2x2ZSxcbiAgICAgICAgICAgICAgcmVqZWN0Rm46IHJlamVjdCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZXMgPSByZXNwLmNhY2hlLm1hcChjYWNoZSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGNhY2hlTmFtZSA9IGNhY2hlLmNhY2hlX25hbWU7XG4gICAgICAgICAgICAgIGNvbnN0IHRvcGljTGltaXRzOiBUb3BpY0xpbWl0cyA9IHtcbiAgICAgICAgICAgICAgICBtYXhQdWJsaXNoTWVzc2FnZVNpemVLYjpcbiAgICAgICAgICAgICAgICAgIGNhY2hlLnRvcGljX2xpbWl0cz8ubWF4X3B1Ymxpc2hfbWVzc2FnZV9zaXplX2tiIHx8IDAsXG4gICAgICAgICAgICAgICAgbWF4U3Vic2NyaXB0aW9uQ291bnQ6XG4gICAgICAgICAgICAgICAgICBjYWNoZS50b3BpY19saW1pdHM/Lm1heF9zdWJzY3JpcHRpb25fY291bnQgfHwgMCxcbiAgICAgICAgICAgICAgICBtYXhQdWJsaXNoUmF0ZTogY2FjaGUudG9waWNfbGltaXRzPy5tYXhfcHVibGlzaF9yYXRlIHx8IDAsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGNvbnN0IGNhY2hlTGltaXRzOiBDYWNoZUxpbWl0cyA9IHtcbiAgICAgICAgICAgICAgICBtYXhUdGxTZWNvbmRzOiBjYWNoZS5jYWNoZV9saW1pdHM/Lm1heF90dGxfc2Vjb25kcyB8fCAwLFxuICAgICAgICAgICAgICAgIG1heEl0ZW1TaXplS2I6IGNhY2hlLmNhY2hlX2xpbWl0cz8ubWF4X2l0ZW1fc2l6ZV9rYiB8fCAwLFxuICAgICAgICAgICAgICAgIG1heFRocm91Z2hwdXRLYnBzOiBjYWNoZS5jYWNoZV9saW1pdHM/Lm1heF90aHJvdWdocHV0X2ticHMgfHwgMCxcbiAgICAgICAgICAgICAgICBtYXhUcmFmZmljUmF0ZTogY2FjaGUuY2FjaGVfbGltaXRzPy5tYXhfdHJhZmZpY19yYXRlIHx8IDAsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgQ2FjaGVJbmZvKGNhY2hlTmFtZSwgdG9waWNMaW1pdHMsIGNhY2hlTGltaXRzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzb2x2ZShuZXcgTGlzdENhY2hlcy5TdWNjZXNzKGNhY2hlcykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==