@kephas/ngx-core
Version:
Provides integration capabilities with Angular 13+.
158 lines • 19.9 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { HttpClient } from '@angular/common/http';
import { LogLevel, AppService, Priority, Logger } from '@kephas/core';
import { CommandProcessorClient, CommandError } from '@kephas/commands';
import { NotificationService } from '@kephas/ui';
import { retry, map, catchError } from 'rxjs/operators';
import { AppSettings } from './appSettings';
/**
* Provides proxied command execution over HTTP.
*
* @export
* @class HttpCommandProcessorClient
*/
let HttpCommandProcessorClient = class HttpCommandProcessorClient extends CommandProcessorClient {
/**
* Initializes a new instance of the CommandProcessor class.
* @param {NotificationService} notification The notification service.
* @param {HttpClient} http The HTTP client.
* @param {AppSettings} appSettings The application settings.
*/
constructor(appSettings, http, notification, logger) {
super();
this.appSettings = appSettings;
this.http = http;
this.notification = notification;
this.logger = logger;
/**
* Gets or sets the base route for the command execution.
*
* @protected
* @type {string}
* @memberof CommandProcessor
*/
this.baseRoute = 'api/cmd/';
}
/**
* Processes the command asynchronously.
* @tparam T The command response type.
* @param {string} command The command.
* @param {{}} [args] Optional. The arguments.
* @param {CommandClientContext} [options] Optional. Options controlling the command processing.
* @returns {Observable{T}} An observable over the result.
*/
process(command, args, options) {
const url = this.getHttpGetUrl(command, args, options);
let obs = this.http.get(url, this.getHttpGetOptions(command, args, options));
if (options && options.retries) {
obs = obs.pipe(retry(options.retries), map(response => this._processResponse(response, options)), catchError(error => this._processError(error, options)));
}
else {
obs = obs.pipe(map(response => this._processResponse(response, options)), catchError(error => this._processError(error, options)));
}
return obs;
}
/**
* Gets the HTTP GET URL.
*
* @protected
* @param {string} command The command.
* @param {{}} [args] Optional. The arguments.
* @param {CommandClientContext} [options] Optional. Options controlling the command processing.
* @returns {string} The HTTP GET URL.
* @memberof CommandProcessor
*/
getHttpGetUrl(command, args, options) {
let baseUrl = this.appSettings.baseUrl;
if (!baseUrl.endsWith('/')) {
baseUrl = baseUrl + '/';
}
return `${baseUrl}${this.baseRoute}${command}`;
}
/**
* Gets the command GET parameters.
*
* @protected
* @param {{}} [args]
* @param {CommandClientContext} [options]
* @return {*} {HttpParams}
* @memberof HttpCommandProcessorClient
*/
getHttpGetParams(args, options) {
let params = {};
if (args) {
Object.keys(args)
.forEach(key => params[key] = this._getParamValue(args[key]));
}
return params;
}
/**
* Gets the HTTP GET options. By default it does not return any options.
*
* @protected
* @param {string} command The command.
* @param {{}} [args] Optional. The arguments.
* @param {CommandClientContext} [options] Optional. Options controlling the command processing.
* @returns {({
* headers?: HttpHeaders | {
* [header: string]: string | string[];
* };
* observe?: 'body';
* params?: HttpParams | {
* [param: string]: string | string[];
* };
* reportProgress?: boolean;
* responseType?: 'json';
* withCredentials?: boolean;
* } | undefined)} The options or undefined.
* @memberof CommandProcessor
*/
getHttpGetOptions(command, args, options) {
return {
params: this.getHttpGetParams(args, options),
};
}
_processResponse(response, options) {
if (typeof response.severity === 'string') {
response.severity = LogLevel[response.severity];
}
if (response.severity <= LogLevel.Error) {
throw new CommandError(response.message, response);
}
if (response.severity === LogLevel.Warning) {
this.logger.log(response.severity, null, response.message);
if (!(options && (options.notifyWarnings === undefined || options.notifyWarnings))) {
this.notification.notifyWarning(response);
}
}
if (response.severity <= LogLevel.Error) {
throw new Error(response.message);
}
return response;
}
_processError(error, options) {
this.logger.error(error);
if (!(options && (options.notifyErrors === undefined || options.notifyErrors))) {
this.notification.notifyError(error);
}
throw error;
}
_getParamValue(rawValue) {
if (typeof rawValue === 'string') {
return rawValue;
}
if (Array.isArray(rawValue)) {
return rawValue.map(e => `${e}`);
}
return `${rawValue}`;
}
};
HttpCommandProcessorClient = __decorate([
AppService({ overridePriority: Priority.Low }),
__metadata("design:paramtypes", [AppSettings,
HttpClient,
NotificationService,
Logger])
], HttpCommandProcessorClient);
export { HttpCommandProcessorClient };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cENvbW1hbmRQcm9jZXNzb3JDbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rZXBoYXMvbmd4LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9odHRwQ29tbWFuZFByb2Nlc3NvckNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBMkIsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsUUFBUSxFQUFFLFVBQVUsRUFDcEIsUUFBUSxFQUFFLE1BQU0sRUFDakIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLHNCQUFzQixFQUF5QyxZQUFZLEVBQzVFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpELE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUM7Ozs7O0dBS0c7QUFFSCxJQUFhLDBCQUEwQixHQUF2QyxNQUFhLDBCQUEyQixTQUFRLHNCQUFzQjtJQVdwRTs7Ozs7T0FLRztJQUNILFlBQ1ksV0FBd0IsRUFDeEIsSUFBZ0IsRUFDaEIsWUFBaUMsRUFDakMsTUFBYztRQUN4QixLQUFLLEVBQUUsQ0FBQztRQUpFLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFuQjFCOzs7Ozs7V0FNRztRQUNPLGNBQVMsR0FBRyxVQUFVLENBQUM7SUFjakMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxPQUFPLENBQTRCLE9BQWUsRUFBRSxJQUFTLEVBQUUsT0FBOEI7UUFDbEcsTUFBTSxHQUFHLEdB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QUFFLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztxQ0FtQnBCLFdBQVc7UUFDbEIsVUFBVTtRQUNGLG1CQUFtQjtRQUN6QixNQUFNO0dBckJmLDBCQUEwQixDQTJLdEM7U0EzS1ksMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7XHJcbiAgTG9nTGV2ZWwsIEFwcFNlcnZpY2UsXHJcbiAgUHJpb3JpdHksIExvZ2dlciwgRXhwYW5kb1xyXG59IGZyb20gJ0BrZXBoYXMvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgQ29tbWFuZFByb2Nlc3NvckNsaWVudCwgQ29tbWFuZENsaWVudENvbnRleHQsIENvbW1hbmRSZXNwb25zZSwgQ29tbWFuZEVycm9yXHJcbn0gZnJvbSAnQGtlcGhhcy9jb21tYW5kcyc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICdAa2VwaGFzL3VpJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZUlucHV0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHJldHJ5LCBtYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEFwcFNldHRpbmdzIH0gZnJvbSAnLi9hcHBTZXR0aW5ncyc7XHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgcHJveGllZCBjb21tYW5kIGV4ZWN1dGlvbiBvdmVyIEhUVFAuXHJcbiAqXHJcbiAqIEBleHBvcnRcclxuICogQGNsYXNzIEh0dHBDb21tYW5kUHJvY2Vzc29yQ2xpZW50XHJcbiAqL1xyXG5AQXBwU2VydmljZSh7IG92ZXJyaWRlUHJpb3JpdHk6IFByaW9yaXR5LkxvdyB9KVxyXG5leHBvcnQgY2xhc3MgSHR0cENvbW1hbmRQcm9jZXNzb3JDbGllbnQgZXh0ZW5kcyBDb21tYW5kUHJvY2Vzc29yQ2xpZW50IHtcclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyBvciBzZXRzIHRoZSBiYXNlIHJvdXRlIGZvciB0aGUgY29tbWFuZCBleGVjdXRpb24uXHJcbiAgICpcclxuICAgKiBAcHJvdGVjdGVkXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKiBAbWVtYmVyb2YgQ29tbWFuZFByb2Nlc3NvclxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBiYXNlUm91dGUgPSAnYXBpL2NtZC8nO1xyXG5cclxuICAvKipcclxuICAgKiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQ29tbWFuZFByb2Nlc3NvciBjbGFzcy5cclxuICAgKiBAcGFyYW0ge05vdGlmaWNhdGlvblNlcnZpY2V9IG5vdGlmaWNhdGlvbiBUaGUgbm90aWZpY2F0aW9uIHNlcnZpY2UuXHJcbiAgICogQHBhcmFtIHtIdHRwQ2xpZW50fSBodHRwIFRoZSBIVFRQIGNsaWVudC5cclxuICAgKiBAcGFyYW0ge0FwcFNldHRpbmdzfSBhcHBTZXR0aW5ncyBUaGUgYXBwbGljYXRpb24gc2V0dGluZ3MuXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcm90ZWN0ZWQgYXBwU2V0dGluZ3M6IEFwcFNldHRpbmdzLFxyXG4gICAgcHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcm90ZWN0ZWQgbm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIGxvZ2dlcjogTG9nZ2VyKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHJvY2Vzc2VzIHRoZSBjb21tYW5kIGFzeW5jaHJvbm91c2x5LlxyXG4gICAqIEB0cGFyYW0gVCBUaGUgY29tbWFuZCByZXNwb25zZSB0eXBlLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kIFRoZSBjb21tYW5kLlxyXG4gICAqIEBwYXJhbSB7e319IFthcmdzXSBPcHRpb25hbC4gVGhlIGFyZ3VtZW50cy5cclxuICAgKiBAcGFyYW0ge0NvbW1hbmRDbGllbnRDb250ZXh0fSBbb3B0aW9uc10gT3B0aW9uYWwuIE9wdGlvbnMgY29udHJvbGxpbmcgdGhlIGNvbW1hbmQgcHJvY2Vzc2luZy5cclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZXtUfX0gQW4gb2JzZXJ2YWJsZSBvdmVyIHRoZSByZXN1bHQuXHJcbiAgICovXHJcbiAgcHVibGljIHByb2Nlc3M8VCBleHRlbmRzIENvbW1hbmRSZXNwb25zZT4oY29tbWFuZDogc3RyaW5nLCBhcmdzPzoge30sIG9wdGlvbnM/OiBDb21tYW5kQ2xpZW50Q29udGV4dCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRIdHRwR2V0VXJsKGNvbW1hbmQsIGFyZ3MsIG9wdGlvbnMpO1xyXG4gICAgbGV0IG9icyA9IHRoaXMuaHR0cC5nZXQ8VD4odXJsLCB0aGlzLmdldEh0dHBHZXRPcHRpb25zKGNvbW1hbmQsIGFyZ3MsIG9wdGlvbnMpKTtcclxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmV0cmllcykge1xyXG4gICAgICBvYnMgPSBvYnMucGlwZShcclxuICAgICAgICByZXRyeShvcHRpb25zLnJldHJpZXMpLFxyXG4gICAgICAgIG1hcChyZXNwb25zZSA9PiB0aGlzLl9wcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UsIG9wdGlvbnMpKSxcclxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuX3Byb2Nlc3NFcnJvcjxUPihlcnJvciwgb3B0aW9ucykpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBvYnMgPSBvYnMucGlwZShcclxuICAgICAgICBtYXAocmVzcG9uc2UgPT4gdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlLCBvcHRpb25zKSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLl9wcm9jZXNzRXJyb3I8VD4oZXJyb3IsIG9wdGlvbnMpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9icztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIEhUVFAgR0VUIFVSTC5cclxuICAgKlxyXG4gICAqIEBwcm90ZWN0ZWRcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCBUaGUgY29tbWFuZC5cclxuICAgKiBAcGFyYW0ge3t9fSBbYXJnc10gT3B0aW9uYWwuIFRoZSBhcmd1bWVudHMuXHJcbiAgICogQHBhcmFtIHtDb21tYW5kQ2xpZW50Q29udGV4dH0gW29wdGlvbnNdIE9wdGlvbmFsLiBPcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBjb21tYW5kIHByb2Nlc3NpbmcuXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIEhUVFAgR0VUIFVSTC5cclxuICAgKiBAbWVtYmVyb2YgQ29tbWFuZFByb2Nlc3NvclxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBnZXRIdHRwR2V0VXJsKGNvbW1hbmQ6IHN0cmluZywgYXJncz86IHt9LCBvcHRpb25zPzogQ29tbWFuZENsaWVudENvbnRleHQpOiBzdHJpbmcge1xyXG4gICAgbGV0IGJhc2VVcmwgPSB0aGlzLmFwcFNldHRpbmdzLmJhc2VVcmw7XHJcbiAgICBpZiAoIWJhc2VVcmwuZW5kc1dpdGgoJy8nKSkge1xyXG4gICAgICBiYXNlVXJsID0gYmFzZVVybCArICcvJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYCR7YmFzZVVybH0ke3RoaXMuYmFzZVJvdXRlfSR7Y29tbWFuZH1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgY29tbWFuZCBHRVQgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwcm90ZWN0ZWRcclxuICAgKiBAcGFyYW0ge3t9fSBbYXJnc11cclxuICAgKiBAcGFyYW0ge0NvbW1hbmRDbGllbnRDb250ZXh0fSBbb3B0aW9uc11cclxuICAgKiBAcmV0dXJuIHsqfSAge0h0dHBQYXJhbXN9XHJcbiAgICogQG1lbWJlcm9mIEh0dHBDb21tYW5kUHJvY2Vzc29yQ2xpZW50XHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGdldEh0dHBHZXRQYXJhbXMoYXJncz86IHt9LCBvcHRpb25zPzogQ29tbWFuZENsaWVudENvbnRleHQpOiBIdHRwUGFyYW1zIHwge1xyXG4gICAgW3BhcmFtOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcclxuICB9IHtcclxuICAgIGxldCBwYXJhbXM6IEV4cGFuZG8gPSB7fTtcclxuICAgIGlmIChhcmdzKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKGFyZ3MpXHJcbiAgICAgICAgLmZvckVhY2goa2V5ID0+IHBhcmFtc1trZXldID0gdGhpcy5fZ2V0UGFyYW1WYWx1ZSgoYXJncyBhcyBFeHBhbmRvKVtrZXldKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhcmFtcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIEhUVFAgR0VUIG9wdGlvbnMuIEJ5IGRlZmF1bHQgaXQgZG9lcyBub3QgcmV0dXJuIGFueSBvcHRpb25zLlxyXG4gICAqXHJcbiAgICogQHByb3RlY3RlZFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kIFRoZSBjb21tYW5kLlxyXG4gICAqIEBwYXJhbSB7e319IFthcmdzXSBPcHRpb25hbC4gVGhlIGFyZ3VtZW50cy5cclxuICAgKiBAcGFyYW0ge0NvbW1hbmRDbGllbnRDb250ZXh0fSBbb3B0aW9uc10gT3B0aW9uYWwuIE9wdGlvbnMgY29udHJvbGxpbmcgdGhlIGNvbW1hbmQgcHJvY2Vzc2luZy5cclxuICAgKiBAcmV0dXJucyB7KHtcclxuICAgKiAgICAgICAgICAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfCB7XHJcbiAgICogICAgICAgICAgICAgICAgIFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gICAqICAgICAgICAgICAgIH07XHJcbiAgICogICAgICAgICAgICAgb2JzZXJ2ZT86ICdib2R5JztcclxuICAgKiAgICAgICAgICAgICBwYXJhbXM/OiBIdHRwUGFyYW1zIHwge1xyXG4gICAqICAgICAgICAgICAgICAgICBbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gICAqICAgICAgICAgICAgIH07XHJcbiAgICogICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuO1xyXG4gICAqICAgICAgICAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcclxuICAgKiAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xyXG4gICAqICAgICAgICAgfSB8IHVuZGVmaW5lZCl9IFRoZSBvcHRpb25zIG9yIHVuZGVmaW5lZC5cclxuICAgKiBAbWVtYmVyb2YgQ29tbWFuZFByb2Nlc3NvclxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBnZXRIdHRwR2V0T3B0aW9ucyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M/OiB7fSwgb3B0aW9ucz86IENvbW1hbmRDbGllbnRDb250ZXh0KToge1xyXG4gICAgaGVhZGVycz86IEh0dHBIZWFkZXJzIHwge1xyXG4gICAgICBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcclxuICAgIH07XHJcbiAgICBvYnNlcnZlPzogJ2JvZHknO1xyXG4gICAgcGFyYW1zPzogSHR0cFBhcmFtcyB8IHtcclxuICAgICAgW3BhcmFtOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcclxuICAgIH07XHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW47XHJcbiAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XHJcbiAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xyXG4gIH0gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcGFyYW1zOiB0aGlzLmdldEh0dHBHZXRQYXJhbXMoYXJncywgb3B0aW9ucyksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJvY2Vzc1Jlc3BvbnNlPFQgZXh0ZW5kcyBDb21tYW5kUmVzcG9uc2U+KHJlc3BvbnNlOiBULCBvcHRpb25zPzogQ29tbWFuZENsaWVudENvbnRleHQpOiBUIHtcclxuICAgIGlmICh0eXBlb2YgcmVzcG9uc2Uuc2V2ZXJpdHkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHJlc3BvbnNlLnNldmVyaXR5ID0gKExvZ0xldmVsIGFzIEV4cGFuZG8pW3Jlc3BvbnNlLnNldmVyaXR5IGFzIHN0cmluZ107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3BvbnNlLnNldmVyaXR5IDw9IExvZ0xldmVsLkVycm9yKSB7XHJcbiAgICAgIHRocm93IG5ldyBDb21tYW5kRXJyb3IocmVzcG9uc2UubWVzc2FnZSEsIHJlc3BvbnNlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzcG9uc2Uuc2V2ZXJpdHkgPT09IExvZ0xldmVsLldhcm5pbmcpIHtcclxuICAgICAgdGhpcy5sb2dnZXIubG9nKHJlc3BvbnNlLnNldmVyaXR5LCBudWxsLCByZXNwb25zZS5tZXNzYWdlISk7XHJcbiAgICAgIGlmICghKG9wdGlvbnMgJiYgKG9wdGlvbnMubm90aWZ5V2FybmluZ3MgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLm5vdGlmeVdhcm5pbmdzKSkpIHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbi5ub3RpZnlXYXJuaW5nKHJlc3BvbnNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXNwb25zZS5zZXZlcml0eSA8PSBMb2dMZXZlbC5FcnJvcikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcm9jZXNzRXJyb3I8VCBleHRlbmRzIENvbW1hbmRSZXNwb25zZT4oZXJyb3I6IGFueSwgb3B0aW9ucz86IENvbW1hbmRDbGllbnRDb250ZXh0KTogT2JzZXJ2YWJsZUlucHV0PFQ+IHtcclxuICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yKTtcclxuICAgIGlmICghKG9wdGlvbnMgJiYgKG9wdGlvbnMubm90aWZ5RXJyb3JzID09PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5ub3RpZnlFcnJvcnMpKSkge1xyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbi5ub3RpZnlFcnJvcihlcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgdGhyb3cgZXJyb3I7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRQYXJhbVZhbHVlKHJhd1ZhbHVlOiBhbnkpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XHJcbiAgICBpZiAodHlwZW9mIHJhd1ZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICByZXR1cm4gcmF3VmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmF3VmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiByYXdWYWx1ZS5tYXAoZSA9PiBgJHtlfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBgJHtyYXdWYWx1ZX1gO1xyXG4gIH1cclxufVxyXG4iXX0=