UNPKG

@kephas/ngx-core

Version:

Provides integration capabilities with Angular 13+.

158 lines 19.9 kB
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=