All Downloads are FREE. Search and download functionalities are using the official Maven repository.

package.dist.src.internal.cache-control-client.js Maven / Gradle / Ivy

There is a newer version: 1.105.0
Show 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");
const utils_2 = require("@gomomento/sdk-core/dist/src/utils");
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 = (0, utils_2.secondsToMilliseconds)(60);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtY29udHJvbC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW50ZXJuYWwvY2FjaGUtY29udHJvbC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0VBQW1EO0FBQ25ELElBQU8sV0FBVyxHQUFHLHlCQUFPLENBQUMsY0FBYyxDQUFDO0FBQzVDLG9FQUFxRTtBQUNyRSxxRkFBNkU7QUFDN0UsMkNBQThEO0FBQzlELDBCQVNZO0FBQ1oscURBQTJDO0FBQzNDLDhFQUFzRTtBQUd0RSx1RUFBOEU7QUFLOUUsZ0VBQTBEO0FBQzFELDhEQUF5RTtBQU96RSxNQUFhLGtCQUFrQjtJQVE3Qjs7T0FFRztJQUNILFlBQVksS0FBeUI7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLG9EQUF1QixDQUN4RCxLQUFLLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQ3ZDLENBQUM7UUFDRixNQUFNLE9BQU8sR0FBRztZQUNkLElBQUksNEJBQU0sQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BFLElBQUksNEJBQU0sQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLHNCQUFPLEVBQUUsQ0FBQztZQUM5QyxJQUFJLDRCQUFNLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2pFLENBQUM7UUFDRixJQUFJLENBQUMsWUFBWSxHQUFHO1lBQ2xCLHVDQUFpQixDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQztZQUNuRCxvQ0FBZ0IsQ0FBQyxzQkFBc0IsQ0FBQztnQkFDdEMsVUFBVSxFQUFFLG9CQUFvQjtnQkFDaEMsYUFBYSxF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LE1BQUEsS0FBSyxDQUFDLFlBQVksMENBQUUsMkJBQTJCLEtBQUksQ0FBQzs0QkFDdEQsb0JBQW9CLEVBQ2xCLENBQUEsTUFBQSxLQUFLLENBQUMsWUFBWSwwQ0FBRSxzQkFBc0IsS0FBSSxDQUFDOzRCQUNqRCxjQUFjLEVBQUUsQ0FBQSxNQUFBLEtBQUssQ0FBQyxZQUFZLDBDQUFFLGdCQUFnQixLQUFJLENBQUM7eUJBQzFELENBQUM7d0JBQ0YsTUFBTSxXQUFXLEdBQWdCOzRCQUMvQixhQUFhLEVBQUUsQ0FBQSxNQUFBLEtBQUssQ0FBQyxZQUFZLDBDQUFFLGVBQWUsS0FBSSxDQUFDOzRCQUN2RCxhQUFhLEVBQUUsQ0FBQSxNQUFBLEtBQUssQ0FBQyxZQUFZLDBDQUFFLGdCQUFnQixLQUFJLENBQUM7NEJBQ3hELGlCQUFpQixFQUFFLENBQUEsTUFBQSxLQUFLLENBQUMsWUFBWSwwQ0FBRSxtQkFBbUIsS0FBSSxDQUFDOzRCQUMvRCxjQUFjLEVBQUUsQ0FBQSxNQUFBLEtBQUssQ0FBQyxZQUFZLDBDQUFFLGdCQUFnQixLQUFJLENBQUM7eUJBQzFELENBQUM7d0JBQ0YsT0FBTyxJQUFJLGFBQVMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO29CQUM1RCxDQUFDLENBQUMsQ0FBQztvQkFDSCxPQUFPLENBQUMsSUFBSSxjQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7aUJBQ3pDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBL01ILGdEQWdOQztBQTdNeUIscUNBQWtCLEdBQ3hDLElBQUEsNkJBQXFCLEVBQUMsRUFBRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2NvbnRyb2x9IGZyb20gJ0Bnb21vbWVudG8vZ2VuZXJhdGVkLXR5cGVzJztcbmltcG9ydCBncnBjQ29udHJvbCA9IGNvbnRyb2wuY29udHJvbF9jbGllbnQ7XG5pbXBvcnQge0hlYWRlciwgSGVhZGVySW50ZXJjZXB0b3J9IGZyb20gJy4vZ3JwYy9oZWFkZXJzLWludGVyY2VwdG9yJztcbmltcG9ydCB7Q2FjaGVTZXJ2aWNlRXJyb3JNYXBwZXJ9IGZyb20gJy4uL2Vycm9ycy9jYWNoZS1zZXJ2aWNlLWVycm9yLW1hcHBlcic7XG5pbXBvcnQge0NoYW5uZWxDcmVkZW50aWFscywgSW50ZXJjZXB0b3J9IGZyb20gJ0BncnBjL2dycGMtanMnO1xuaW1wb3J0IHtcbiAgQ3JlYXRlQ2FjaGUsXG4gIERlbGV0ZUNhY2hlLFxuICBMaXN0Q2FjaGVzLFxuICBDYWNoZUZsdXNoLFxuICBDcmVkZW50aWFsUHJvdmlkZXIsXG4gIE1vbWVudG9Mb2dnZXIsXG4gIENhY2hlSW5mbyxcbiAgTW9tZW50b0Vycm9yQ29kZSxcbn0gZnJvbSAnLi4nO1xuaW1wb3J0IHt2ZXJzaW9ufSBmcm9tICcuLi8uLi9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHtJZGxlR3JwY0NsaWVudFdyYXBwZXJ9IGZyb20gJy4vZ3JwYy9pZGxlLWdycGMtY2xpZW50LXdyYXBwZXInO1xuaW1wb3J0IHtHcnBjQ2xpZW50V3JhcHBlcn0gZnJvbSAnLi9ncnBjL2dycGMtY2xpZW50LXdyYXBwZXInO1xuaW1wb3J0IHtDb25maWd1cmF0aW9ufSBmcm9tICcuLi9jb25maWcvY29uZmlndXJhdGlvbic7XG5pbXBvcnQge3ZhbGlkYXRlQ2FjaGVOYW1lfSBmcm9tICdAZ29tb21lbnRvL3Nkay1jb3JlL2Rpc3Qvc3JjL2ludGVybmFsL3V0aWxzJztcbmltcG9ydCB7XG4gIENhY2hlTGltaXRzLFxuICBUb3BpY0xpbWl0cyxcbn0gZnJvbSAnQGdvbW9tZW50by9zZGstY29yZS9kaXN0L3NyYy9tZXNzYWdlcy9jYWNoZS1pbmZvJztcbmltcG9ydCB7UmV0cnlJbnRlcmNlcHRvcn0gZnJvbSAnLi9ncnBjL3JldHJ5LWludGVyY2VwdG9yJztcbmltcG9ydCB7c2Vjb25kc1RvTWlsbGlzZWNvbmRzfSBmcm9tICdAZ29tb21lbnRvL3Nkay1jb3JlL2Rpc3Qvc3JjL3V0aWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBDb250cm9sQ2xpZW50UHJvcHMge1xuICBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uO1xuICBjcmVkZW50aWFsUHJvdmlkZXI6IENyZWRlbnRpYWxQcm92aWRlcjtcbn1cblxuZXhwb3J0IGNsYXNzIENhY2hlQ29udHJvbENsaWVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50V3JhcHBlcjogR3JwY0NsaWVudFdyYXBwZXI8Z3JwY0NvbnRyb2wuU2NzQ29udHJvbENsaWVudD47XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJjZXB0b3JzOiBJbnRlcmNlcHRvcltdO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSRVFVRVNUX1RJTUVPVVRfTVM6IG51bWJlciA9XG4gICAgc2Vjb25kc1RvTWlsbGlzZWNvbmRzKDYwKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IE1vbWVudG9Mb2dnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGVTZXJ2aWNlRXJyb3JNYXBwZXI6IENhY2hlU2VydmljZUVycm9yTWFwcGVyO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0NvbnRyb2xDbGllbnRQcm9wc30gcHJvcHNcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBDb250cm9sQ2xpZW50UHJvcHMpIHtcbiAgICB0aGlzLmxvZ2dlciA9IHByb3BzLmNvbmZpZ3VyYXRpb24uZ2V0TG9nZ2VyRmFjdG9yeSgpLmdldExvZ2dlcih0aGlzKTtcbiAgICB0aGlzLmNhY2hlU2VydmljZUVycm9yTWFwcGVyID0gbmV3IENhY2hlU2VydmljZUVycm9yTWFwcGVyKFxuICAgICAgcHJvcHMuY29uZmlndXJhdGlvbi5nZXRUaHJvd09uRXJyb3JzKClcbiAgICApO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBbXG4gICAgICBuZXcgSGVhZGVyKCdBdXRob3JpemF0aW9uJywgcHJvcHMuY3JlZGVudGlhbFByb3ZpZGVyLmdldEF1dGhUb2tlbigpKSxcbiAgICAgIG5ldyBIZWFkZXIoJ2FnZW50JywgYG5vZGVqczpjYWNoZToke3ZlcnNpb259YCksXG4gICAgICBuZXcgSGVhZGVyKCdydW50aW1lLXZlcnNpb24nLCBgbm9kZWpzOiR7cHJvY2Vzcy52ZXJzaW9ucy5ub2RlfWApLFxuICAgIF07XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMgPSBbXG4gICAgICBIZWFkZXJJbnRlcmNlcHRvci5jcmVhdGVIZWFkZXJzSW50ZXJjZXB0b3IoaGVhZGVycyksXG4gICAgICBSZXRyeUludGVyY2VwdG9yLmNyZWF0ZVJldHJ5SW50ZXJjZXB0b3Ioe1xuICAgICAgICBjbGllbnROYW1lOiAnQ2FjaGVDb250cm9sQ2xpZW50JyxcbiAgICAgICAgbG9nZ2VyRmFjdG9yeTogcHJvcHMuY29uZmlndXJhdGlvbi5nZXRMb2dnZXJGYWN0b3J5KCksXG4gICAgICAgIG92ZXJhbGxSZXF1ZXN0VGltZW91dE1zOiBDYWNoZUNvbnRyb2xDbGllbnQuUkVRVUVTVF9USU1FT1VUX01TLFxuICAgICAgfSksXG4gICAgXTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyBjb250cm9sIGNsaWVudCB1c2luZyBlbmRwb2ludDogJyR7cHJvcHMuY3JlZGVudGlhbFByb3ZpZGVyLmdldENvbnRyb2xFbmRwb2ludCgpfWBcbiAgICApO1xuICAgIHRoaXMuY2xpZW50V3JhcHBlciA9IG5ldyBJZGxlR3JwY0NsaWVudFdyYXBwZXIoe1xuICAgICAgY2xpZW50RmFjdG9yeUZuOiAoKSA9PlxuICAgICAgICBuZXcgZ3JwY0NvbnRyb2wuU2NzQ29udHJvbENsaWVudChcbiAgICAgICAgICBwcm9wcy5jcmVkZW50aWFsUHJvdmlkZXIuZ2V0Q29udHJvbEVuZHBvaW50KCksXG4gICAgICAgICAgcHJvcHMuY3JlZGVudGlhbFByb3ZpZGVyLmlzQ29udHJvbEVuZHBvaW50U2VjdXJlKClcbiAgICAgICAgICAgID8gQ2hhbm5lbENyZWRlbnRpYWxzLmNyZWF0ZVNzbCgpXG4gICAgICAgICAgICA6IENoYW5uZWxDcmVkZW50aWFscy5jcmVhdGVJbnNlY3VyZSgpXG4gICAgICAgICksXG4gICAgICBsb2dnZXJGYWN0b3J5OiBwcm9wcy5jb25maWd1cmF0aW9uLmdldExvZ2dlckZhY3RvcnkoKSxcbiAgICAgIG1heElkbGVNaWxsaXM6IHByb3BzLmNvbmZpZ3VyYXRpb25cbiAgICAgICAgLmdldFRyYW5zcG9ydFN0cmF0ZWd5KClcbiAgICAgICAgLmdldE1heElkbGVNaWxsaXMoKSxcbiAgICB9KTtcbiAgfVxuICBjbG9zZSgpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ2xvc2luZyBjYWNoZSBjb250cm9sIGNsaWVudCcpO1xuICAgIHRoaXMuY2xpZW50V3JhcHBlci5nZXRDbGllbnQoKS5jbG9zZSgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNyZWF0ZUNhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8Q3JlYXRlQ2FjaGUuUmVzcG9uc2U+IHtcbiAgICB0cnkge1xuICAgICAgdmFsaWRhdGVDYWNoZU5hbWUobmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZVNlcnZpY2VFcnJvck1hcHBlci5yZXR1cm5PclRocm93RXJyb3IoXG4gICAgICAgIGVyciBhcyBFcnJvcixcbiAgICAgICAgZXJyID0+IG5ldyBDcmVhdGVDYWNoZS5FcnJvcihlcnIpXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgY2FjaGU6ICR7bmFtZX1gKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IGdycGNDb250cm9sLl9DcmVhdGVDYWNoZVJlcXVlc3Qoe1xuICAgICAgY2FjaGVfbmFtZTogbmFtZSxcbiAgICB9KTtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8Q3JlYXRlQ2FjaGUuUmVzcG9uc2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuY2xpZW50V3JhcHBlclxuICAgICAgICAuZ2V0Q2xpZW50KClcbiAgICAgICAgLkNyZWF0ZUNhY2hlKFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAge2ludGVyY2VwdG9yczogdGhpcy5pbnRlcmNlcHRvcnN9LFxuICAgICAgICAgIChlcnIsIF9yZXNwKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNka0Vycm9yID0gdGhpcy5jYWNoZVNlcnZpY2VFcnJvck1hcHBlci5jb252ZXJ0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNka0Vycm9yLmVycm9yQ29kZSgpID09PVxuICAgICAgICAgICAgICAgIE1vbWVudG9FcnJvckNvZGUuQ0FDSEVfQUxSRUFEWV9FWElTVFNfRVJST1JcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgQ3JlYXRlQ2FjaGUuQWxyZWFkeUV4aXN0cygpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZUVycm9yTWFwcGVyLnJlc29sdmVPclJlamVjdEVycm9yKHtcbiAgICAgICAgICAgICAgICAgIGVycjogZXJyLFxuICAgICAgICAgICAgICAgICAgZXJyb3JSZXNwb25zZUZhY3RvcnlGbjogZSA9PiBuZXcgQ3JlYXRlQ2FjaGUuRXJyb3IoZSksXG4gICAgICAgICAgICAgICAgICByZXNvbHZlRm46IHJlc29sdmUsXG4gICAgICAgICAgICAgICAgICByZWplY3RGbjogcmVqZWN0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKG5ldyBDcmVhdGVDYWNoZS5TdWNjZXNzKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZWxldGVDYWNoZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPERlbGV0ZUNhY2hlLlJlc3BvbnNlPiB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlQ2FjaGVOYW1lKG5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVTZXJ2aWNlRXJyb3JNYXBwZXIucmV0dXJuT3JUaHJvd0Vycm9yKFxuICAgICAgICBlcnIgYXMgRXJyb3IsXG4gICAgICAgIGVyciA9PiBuZXcgRGVsZXRlQ2FjaGUuRXJyb3IoZXJyKVxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBncnBjQ29udHJvbC5fRGVsZXRlQ2FjaGVSZXF1ZXN0KHtcbiAgICAgIGNhY2hlX25hbWU6IG5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYERlbGV0aW5nIGNhY2hlOiAke25hbWV9YCk7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPERlbGV0ZUNhY2hlLlJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNsaWVudFdyYXBwZXJcbiAgICAgICAgLmdldENsaWVudCgpXG4gICAgICAgIC5EZWxldGVDYWNoZShcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHtpbnRlcmNlcHRvcnM6IHRoaXMuaW50ZXJjZXB0b3JzfSxcbiAgICAgICAgICAoZXJyLCBfcmVzcCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZUVycm9yTWFwcGVyLnJlc29sdmVPclJlamVjdEVycm9yKHtcbiAgICAgICAgICAgICAgICBlcnI6IGVycixcbiAgICAgICAgICAgICAgICBlcnJvclJlc3BvbnNlRmFjdG9yeUZuOiBlID0+IG5ldyBEZWxldGVDYWNoZS5FcnJvcihlKSxcbiAgICAgICAgICAgICAgICByZXNvbHZlRm46IHJlc29sdmUsXG4gICAgICAgICAgICAgICAgcmVqZWN0Rm46IHJlamVjdCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKG5ldyBEZWxldGVDYWNoZS5TdWNjZXNzKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBmbHVzaENhY2hlKGNhY2hlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDYWNoZUZsdXNoLlJlc3BvbnNlPiB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlQ2FjaGVOYW1lKGNhY2hlTmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZVNlcnZpY2VFcnJvck1hcHBlci5yZXR1cm5PclRocm93RXJyb3IoXG4gICAgICAgIGVyciBhcyBFcnJvcixcbiAgICAgICAgZXJyID0+IG5ldyBDYWNoZUZsdXNoLkVycm9yKGVycilcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBGbHVzaGluZyBjYWNoZTogJHtjYWNoZU5hbWV9YCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZEZsdXNoQ2FjaGUoY2FjaGVOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VuZEZsdXNoQ2FjaGUoXG4gICAgY2FjaGVOYW1lOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxDYWNoZUZsdXNoLlJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBncnBjQ29udHJvbC5fRmx1c2hDYWNoZVJlcXVlc3Qoe1xuICAgICAgY2FjaGVfbmFtZTogY2FjaGVOYW1lLFxuICAgIH0pO1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNsaWVudFdyYXBwZXIuZ2V0Q2xpZW50KCkuRmx1c2hDYWNoZShcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAge1xuICAgICAgICAgIGludGVyY2VwdG9yczogdGhpcy5pbnRlcmNlcHRvcnMsXG4gICAgICAgIH0sXG4gICAgICAgIChlcnIsIHJlc3ApID0+IHtcbiAgICAgICAgICBpZiAocmVzcCkge1xuICAgICAgICAgICAgcmVzb2x2ZShuZXcgQ2FjaGVGbHVzaC5TdWNjZXNzKCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZUVycm9yTWFwcGVyLnJlc29sdmVPclJlamVjdEVycm9yKHtcbiAgICAgICAgICAgICAgZXJyOiBlcnIsXG4gICAgICAgICAgICAgIGVycm9yUmVzcG9uc2VGYWN0b3J5Rm46IGUgPT4gbmV3IENhY2hlRmx1c2guRXJyb3IoZSksXG4gICAgICAgICAgICAgIHJlc29sdmVGbjogcmVzb2x2ZSxcbiAgICAgICAgICAgICAgcmVqZWN0Rm46IHJlamVjdCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsaXN0Q2FjaGVzKCk6IFByb21pc2U8TGlzdENhY2hlcy5SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgZ3JwY0NvbnRyb2wuX0xpc3RDYWNoZXNSZXF1ZXN0KCk7XG4gICAgcmVxdWVzdC5uZXh0X3Rva2VuID0gJyc7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXCJJc3N1aW5nICdsaXN0Q2FjaGVzJyByZXF1ZXN0XCIpO1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxMaXN0Q2FjaGVzLlJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNsaWVudFdyYXBwZXJcbiAgICAgICAgLmdldENsaWVudCgpXG4gICAgICAgIC5MaXN0Q2FjaGVzKHJlcXVlc3QsIHtpbnRlcmNlcHRvcnM6IHRoaXMuaW50ZXJjZXB0b3JzfSwgKGVyciwgcmVzcCkgPT4ge1xuICAgICAgICAgIGlmIChlcnIgfHwgIXJlc3ApIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlRXJyb3JNYXBwZXIucmVzb2x2ZU9yUmVqZWN0RXJyb3Ioe1xuICAgICAgICAgICAgICBlcnI6IGVycixcbiAgICAgICAgICAgICAgZXJyb3JSZXNwb25zZUZhY3RvcnlGbjogZSA9PiBuZXcgTGlzdENhY2hlcy5FcnJvcihlKSxcbiAgICAgICAgICAgICAgcmVzb2x2ZUZuOiByZXNvbHZlLFxuICAgICAgICAgICAgICByZWplY3RGbjogcmVqZWN0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlcyA9IHJlc3AuY2FjaGUubWFwKGNhY2hlID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgY2FjaGVOYW1lID0gY2FjaGUuY2FjaGVfbmFtZTtcbiAgICAgICAgICAgICAgY29uc3QgdG9waWNMaW1pdHM6IFRvcGljTGltaXRzID0ge1xuICAgICAgICAgICAgICAgIG1heFB1Ymxpc2hNZXNzYWdlU2l6ZUtiOlxuICAgICAgICAgICAgICAgICAgY2FjaGUudG9waWNfbGltaXRzPy5tYXhfcHVibGlzaF9tZXNzYWdlX3NpemVfa2IgfHwgMCxcbiAgICAgICAgICAgICAgICBtYXhTdWJzY3JpcHRpb25Db3VudDpcbiAgICAgICAgICAgICAgICAgIGNhY2hlLnRvcGljX2xpbWl0cz8ubWF4X3N1YnNjcmlwdGlvbl9jb3VudCB8fCAwLFxuICAgICAgICAgICAgICAgIG1heFB1Ymxpc2hSYXRlOiBjYWNoZS50b3BpY19saW1pdHM/Lm1heF9wdWJsaXNoX3JhdGUgfHwgMCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgY29uc3QgY2FjaGVMaW1pdHM6IENhY2hlTGltaXRzID0ge1xuICAgICAgICAgICAgICAgIG1heFR0bFNlY29uZHM6IGNhY2hlLmNhY2hlX2xpbWl0cz8ubWF4X3R0bF9zZWNvbmRzIHx8IDAsXG4gICAgICAgICAgICAgICAgbWF4SXRlbVNpemVLYjogY2FjaGUuY2FjaGVfbGltaXRzPy5tYXhfaXRlbV9zaXplX2tiIHx8IDAsXG4gICAgICAgICAgICAgICAgbWF4VGhyb3VnaHB1dEticHM6IGNhY2hlLmNhY2hlX2xpbWl0cz8ubWF4X3Rocm91Z2hwdXRfa2JwcyB8fCAwLFxuICAgICAgICAgICAgICAgIG1heFRyYWZmaWNSYXRlOiBjYWNoZS5jYWNoZV9saW1pdHM/Lm1heF90cmFmZmljX3JhdGUgfHwgMCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDYWNoZUluZm8oY2FjaGVOYW1lLCB0b3BpY0xpbWl0cywgY2FjaGVMaW1pdHMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXNvbHZlKG5ldyBMaXN0Q2FjaGVzLlN1Y2Nlc3MoY2FjaGVzKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19




© 2015 - 2025 Weber Informatics LLC | Privacy Policy