UNPKG

@kephas/ngx-core

Version:

Provides integration capabilities with Angular 13+.

137 lines 19.5 kB
import { __decorate, __metadata } from "tslib"; import { HttpClient } from '@angular/common/http'; import { LogLevel, AppService, Priority, Logger } from '@kephas/core'; import { NotificationService } from '@kephas/ui'; import { MessageProcessorClient, MessagingError } from '@kephas/messaging'; import { retry, map, catchError } from 'rxjs/operators'; import { AppSettings } from './appSettings'; /** * Provides proxied message processing over HTTP. * * @export * @class MessageProcessor */ let HttpMessageProcessorClient = class HttpMessageProcessorClient extends MessageProcessorClient { /** * Initializes a new instance of the HttpMessageProcessor 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 MessageProcessor */ this.baseRoute = 'api/msg/'; } /** * Processes the message asynchronously. * @tparam T The message response type. * @param {{}} message The message. * @param {MessagingClientContext} [options] Optional. Options controlling the message processing. * @returns {Observable{T}} An observable over the result. */ process(message, options) { const url = this.getHttpPostUrl(message, options); const obs = this.http.post(url, message, this.getHttpPostOptions(message, options)); const responseObj = (options && options.retries) ? obs.pipe(retry(options.retries), map(response => this._processResponse(response, options)), catchError(error => this._processError(error, options))) : obs.pipe(map(response => this._processResponse(response, options)), catchError(error => this._processError(error, options))); return responseObj; } /** * Gets the HTTP GET URL. * * @protected * @param {{}} message The message. * @param {MessagingClientContext} [options] Optional. Options controlling the command processing. * @returns {string} The HTTP GET URL. * @memberof MessageProcessor */ getHttpPostUrl(message, options) { let baseUrl = this.appSettings.baseUrl; if (!baseUrl.endsWith('/')) { baseUrl = baseUrl + '/'; } const url = `${baseUrl}${this.baseRoute}`; return url; } /** * 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 {MessagingClientContext} [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 MessageProcessor */ getHttpPostOptions(message, options) { return undefined; } _processResponse(rawResponse, options) { if (rawResponse.exception) { const errorInfo = rawResponse.exception; if (typeof errorInfo.severity === 'string') { errorInfo.severity = LogLevel[errorInfo.severity]; } throw new MessagingError(errorInfo.message, errorInfo); } const response = rawResponse.message; if (typeof response.severity === 'string') { response.severity = LogLevel[response.severity]; } if (!response.severity) { response.severity = LogLevel.Info; } if (response.severity <= LogLevel.Error) { throw new MessagingError(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 MessagingError(response.message, response); } return response; } _processError(error, options) { this.logger.error(error); if (!(options && (options.notifyErrors === undefined || options.notifyErrors))) { this.notification.notifyError(error); } throw error; } }; HttpMessageProcessorClient = __decorate([ AppService({ overridePriority: Priority.Low }), __metadata("design:paramtypes", [AppSettings, HttpClient, NotificationService, Logger]) ], HttpMessageProcessorClient); export { HttpMessageProcessorClient }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cE1lc3NhZ2VQcm9jZXNzb3JDbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rZXBoYXMvbmd4LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9odHRwTWVzc2FnZVByb2Nlc3NvckNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBMkIsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFXLE1BQU0sY0FBYyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNqRCxPQUFPLEVBQ3lCLHNCQUFzQixFQUMxQixjQUFjLEVBQ3pDLE1BQU0sbUJBQW1CLENBQUM7QUFFM0IsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQXFCNUM7Ozs7O0dBS0c7QUFFSCxJQUFhLDBCQUEwQixHQUF2QyxNQUFhLDBCQUEyQixTQUFRLHNCQUFzQjtJQVdsRTs7Ozs7T0FLRztJQUNILFlBQ2MsV0FBd0IsRUFDeEIsSUFBZ0IsRUFDaEIsWUFBaUMsRUFDakMsTUFBYztRQUN4QixLQUFLLEVBQUUsQ0FBQztRQUpFLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFuQjVCOzs7Ozs7V0FNRztRQUNPLGNBQVMsR0FBVyxVQUFVLENBQUM7SUFjekMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLE9BQU8sQ0FBNEIsT0FBVyxFQUFFLE9BQWdDO1FBQ25GLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FB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UUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLE9BQVEsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFO2dCQUNoRixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM3QztTQUNKO1FBRUQsSUFBSSxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUU7WUFDckMsTUFBTSxJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ3pEO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVPLGFBQWEsQ0FBNEIsS0FBVSxFQUFFLE9BQWdDO1FBQ3pGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFO1lBQzVFLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsTUFBTSxLQUFLLENBQUM7SUFDaEIsQ0FBQztDQUNKLENBQUE7QUFsSlksMEJBQTBCO0lBRHRDLFVBQVUsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztxQ0FtQmhCLFdBQVc7UUFDbEIsVUFBVTtRQUNGLG1CQUFtQjtRQUN6QixNQUFNO0dBckJuQiwwQkFBMEIsQ0FrSnRDO1NBbEpZLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBMb2dMZXZlbCwgQXBwU2VydmljZSwgUHJpb3JpdHksIExvZ2dlciwgRXhwYW5kbyB9IGZyb20gJ0BrZXBoYXMvY29yZSc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICdAa2VwaGFzL3VpJztcclxuaW1wb3J0IHtcclxuICAgIFJlc3BvbnNlTWVzc2FnZSwgRXJyb3JJbmZvLCBNZXNzYWdlUHJvY2Vzc29yQ2xpZW50LFxyXG4gICAgTWVzc2FnaW5nQ2xpZW50Q29udGV4dCwgTWVzc2FnaW5nRXJyb3JcclxufSBmcm9tICdAa2VwaGFzL21lc3NhZ2luZyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmFibGVJbnB1dCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyByZXRyeSwgbWFwLCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBBcHBTZXR0aW5ncyB9IGZyb20gJy4vYXBwU2V0dGluZ3MnO1xyXG5cclxuXHJcbmludGVyZmFjZSBSYXdSZXNwb25zZU1lc3NhZ2U8VCBleHRlbmRzIFJlc3BvbnNlTWVzc2FnZT4ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtFcnJvckluZm99XHJcbiAgICAgKiBAbWVtYmVyb2YgUmF3UmVzcG9uc2VNZXNzYWdlXHJcbiAgICAgKi9cclxuICAgIGV4Y2VwdGlvbjogRXJyb3JJbmZvO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHJlc3BvbnNlIG1lc3NhZ2UuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1R9XHJcbiAgICAgKiBAbWVtYmVyb2YgUmF3UmVzcG9uc2VNZXNzYWdlXHJcbiAgICAgKi9cclxuICAgIG1lc3NhZ2U6IFQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlcyBwcm94aWVkIG1lc3NhZ2UgcHJvY2Vzc2luZyBvdmVyIEhUVFAuXHJcbiAqXHJcbiAqIEBleHBvcnRcclxuICogQGNsYXNzIE1lc3NhZ2VQcm9jZXNzb3JcclxuICovXHJcbkBBcHBTZXJ2aWNlKHsgb3ZlcnJpZGVQcmlvcml0eTogUHJpb3JpdHkuTG93IH0pXHJcbmV4cG9ydCBjbGFzcyBIdHRwTWVzc2FnZVByb2Nlc3NvckNsaWVudCBleHRlbmRzIE1lc3NhZ2VQcm9jZXNzb3JDbGllbnQge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSBiYXNlIHJvdXRlIGZvciB0aGUgY29tbWFuZCBleGVjdXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqIEBtZW1iZXJvZiBNZXNzYWdlUHJvY2Vzc29yXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBiYXNlUm91dGU6IHN0cmluZyA9ICdhcGkvbXNnLyc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgSHR0cE1lc3NhZ2VQcm9jZXNzb3IgY2xhc3MuXHJcbiAgICAgKiBAcGFyYW0ge05vdGlmaWNhdGlvblNlcnZpY2V9IG5vdGlmaWNhdGlvbiBUaGUgbm90aWZpY2F0aW9uIHNlcnZpY2UuXHJcbiAgICAgKiBAcGFyYW0ge0h0dHBDbGllbnR9IGh0dHAgVGhlIEhUVFAgY2xpZW50LlxyXG4gICAgICogQHBhcmFtIHtBcHBTZXR0aW5nc30gYXBwU2V0dGluZ3MgVGhlIGFwcGxpY2F0aW9uIHNldHRpbmdzLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcm90ZWN0ZWQgYXBwU2V0dGluZ3M6IEFwcFNldHRpbmdzLFxyXG4gICAgICAgIHByb3RlY3RlZCBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgIHByb3RlY3RlZCBub3RpZmljYXRpb246IE5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIGxvZ2dlcjogTG9nZ2VyKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc3NlcyB0aGUgbWVzc2FnZSBhc3luY2hyb25vdXNseS5cclxuICAgICAqIEB0cGFyYW0gVCBUaGUgbWVzc2FnZSByZXNwb25zZSB0eXBlLlxyXG4gICAgICogQHBhcmFtIHt7fX0gbWVzc2FnZSBUaGUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TWVzc2FnaW5nQ2xpZW50Q29udGV4dH0gW29wdGlvbnNdIE9wdGlvbmFsLiBPcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBtZXNzYWdlIHByb2Nlc3NpbmcuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZXtUfX0gQW4gb2JzZXJ2YWJsZSBvdmVyIHRoZSByZXN1bHQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwcm9jZXNzPFQgZXh0ZW5kcyBSZXNwb25zZU1lc3NhZ2U+KG1lc3NhZ2U6IHt9LCBvcHRpb25zPzogTWVzc2FnaW5nQ2xpZW50Q29udGV4dCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0SHR0cFBvc3RVcmwobWVzc2FnZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3Qgb2JzID0gdGhpcy5odHRwLnBvc3Q8UmF3UmVzcG9uc2VNZXNzYWdlPFQ+Pih1cmwsIG1lc3NhZ2UsIHRoaXMuZ2V0SHR0cFBvc3RPcHRpb25zKG1lc3NhZ2UsIG9wdGlvbnMpKTtcclxuICAgICAgICBjb25zdCByZXNwb25zZU9iaiA9IChvcHRpb25zICYmIG9wdGlvbnMucmV0cmllcylcclxuICAgICAgICAgICAgPyBvYnMucGlwZShcclxuICAgICAgICAgICAgICAgIHJldHJ5KG9wdGlvbnMucmV0cmllcyksXHJcbiAgICAgICAgICAgICAgICBtYXAocmVzcG9uc2UgPT4gdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlPFQ+KHJlc3BvbnNlLCBvcHRpb25zKSksXHJcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuX3Byb2Nlc3NFcnJvcjxUPihlcnJvciwgb3B0aW9ucykpKVxyXG4gICAgICAgICAgICA6IG9icy5waXBlKFxyXG4gICAgICAgICAgICAgICAgbWFwKHJlc3BvbnNlID0+IHRoaXMuX3Byb2Nlc3NSZXNwb25zZTxUPihyZXNwb25zZSwgb3B0aW9ucykpLFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLl9wcm9jZXNzRXJyb3I8VD4oZXJyb3IsIG9wdGlvbnMpKSk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXNwb25zZU9iajtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIEhUVFAgR0VUIFVSTC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAcGFyYW0ge3t9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxyXG4gICAgICogQHBhcmFtIHtNZXNzYWdpbmdDbGllbnRDb250ZXh0fSBbb3B0aW9uc10gT3B0aW9uYWwuIE9wdGlvbnMgY29udHJvbGxpbmcgdGhlIGNvbW1hbmQgcHJvY2Vzc2luZy5cclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBIVFRQIEdFVCBVUkwuXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVzc2FnZVByb2Nlc3NvclxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0SHR0cFBvc3RVcmwobWVzc2FnZToge30sIG9wdGlvbnM/OiBNZXNzYWdpbmdDbGllbnRDb250ZXh0KTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgYmFzZVVybCA9IHRoaXMuYXBwU2V0dGluZ3MuYmFzZVVybDtcclxuICAgICAgICBpZiAoIWJhc2VVcmwuZW5kc1dpdGgoJy8nKSkge1xyXG4gICAgICAgICAgICBiYXNlVXJsID0gYmFzZVVybCArICcvJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9JHt0aGlzLmJhc2VSb3V0ZX1gO1xyXG4gICAgICAgIHJldHVybiB1cmw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBIVFRQIEdFVCBvcHRpb25zLiBCeSBkZWZhdWx0IGl0IGRvZXMgbm90IHJldHVybiBhbnkgb3B0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCBUaGUgY29tbWFuZC5cclxuICAgICAqIEBwYXJhbSB7e319IFthcmdzXSBPcHRpb25hbC4gVGhlIGFyZ3VtZW50cy5cclxuICAgICAqIEBwYXJhbSB7TWVzc2FnaW5nQ2xpZW50Q29udGV4dH0gW29wdGlvbnNdIE9wdGlvbmFsLiBPcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBjb21tYW5kIHByb2Nlc3NpbmcuXHJcbiAgICAgKiBAcmV0dXJucyB7KHtcclxuICAgICAqICAgICAgICAgICAgIGhlYWRlcnM/OiBIdHRwSGVhZGVycyB8IHtcclxuICAgICAqICAgICAgICAgICAgICAgICBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcclxuICAgICAqICAgICAgICAgICAgIH07XHJcbiAgICAgKiAgICAgICAgICAgICBvYnNlcnZlPzogJ2JvZHknO1xyXG4gICAgICogICAgICAgICAgICAgcGFyYW1zPzogSHR0cFBhcmFtcyB8IHtcclxuICAgICAqICAgICAgICAgICAgICAgICBbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gICAgICogICAgICAgICAgICAgfTtcclxuICAgICAqICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcclxuICAgICAqICAgICAgICAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcclxuICAgICAqICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XHJcbiAgICAgKiAgICAgICAgIH0gfCB1bmRlZmluZWQpfSBUaGUgb3B0aW9ucyBvciB1bmRlZmluZWQuXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVzc2FnZVByb2Nlc3NvclxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0SHR0cFBvc3RPcHRpb25zKG1lc3NhZ2U6IHt9LCBvcHRpb25zPzogTWVzc2FnaW5nQ2xpZW50Q29udGV4dCk6IHtcclxuICAgICAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfCB7XHJcbiAgICAgICAgICAgIFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgb2JzZXJ2ZT86ICdib2R5JztcclxuICAgICAgICBwYXJhbXM/OiBIdHRwUGFyYW1zIHwge1xyXG4gICAgICAgICAgICBbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuO1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcclxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xyXG4gICAgfSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9wcm9jZXNzUmVzcG9uc2U8VCBleHRlbmRzIFJlc3BvbnNlTWVzc2FnZT4ocmF3UmVzcG9uc2U6IFJhd1Jlc3BvbnNlTWVzc2FnZTxUPiwgb3B0aW9ucz86IE1lc3NhZ2luZ0NsaWVudENvbnRleHQpOiBUIHtcclxuICAgICAgICBpZiAocmF3UmVzcG9uc2UuZXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9ySW5mbyA9IHJhd1Jlc3BvbnNlLmV4Y2VwdGlvbjtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlcnJvckluZm8uc2V2ZXJpdHkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICBlcnJvckluZm8uc2V2ZXJpdHkgPSAoTG9nTGV2ZWwgYXMgRXhwYW5kbylbZXJyb3JJbmZvLnNldmVyaXR5IGFzIHN0cmluZ107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBNZXNzYWdpbmdFcnJvcihlcnJvckluZm8ubWVzc2FnZSEsIGVycm9ySW5mbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJhd1Jlc3BvbnNlLm1lc3NhZ2U7XHJcbiAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZS5zZXZlcml0eSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmVzcG9uc2Uuc2V2ZXJpdHkgPSAoTG9nTGV2ZWwgYXMgRXhwYW5kbylbcmVzcG9uc2Uuc2V2ZXJpdHkgYXMgc3RyaW5nXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcmVzcG9uc2Uuc2V2ZXJpdHkpIHtcclxuICAgICAgICAgICAgcmVzcG9uc2Uuc2V2ZXJpdHkgPSBMb2dMZXZlbC5JbmZvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnNldmVyaXR5IDw9IExvZ0xldmVsLkVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBNZXNzYWdpbmdFcnJvcihyZXNwb25zZS5tZXNzYWdlISwgcmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnNldmVyaXR5ID09PSBMb2dMZXZlbC5XYXJuaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhyZXNwb25zZS5zZXZlcml0eSwgbnVsbCwgcmVzcG9uc2UubWVzc2FnZSEpO1xyXG4gICAgICAgICAgICBpZiAoIShvcHRpb25zICYmIChvcHRpb25zLm5vdGlmeVdhcm5pbmdzID09PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5ub3RpZnlXYXJuaW5ncykpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbi5ub3RpZnlXYXJuaW5nKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnNldmVyaXR5IDw9IExvZ0xldmVsLkVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBNZXNzYWdpbmdFcnJvcihyZXNwb25zZS5tZXNzYWdlISwgcmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcHJvY2Vzc0Vycm9yPFQgZXh0ZW5kcyBSZXNwb25zZU1lc3NhZ2U+KGVycm9yOiBhbnksIG9wdGlvbnM/OiBNZXNzYWdpbmdDbGllbnRDb250ZXh0KTogT2JzZXJ2YWJsZUlucHV0PFQ+IHtcclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgaWYgKCEob3B0aW9ucyAmJiAob3B0aW9ucy5ub3RpZnlFcnJvcnMgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLm5vdGlmeUVycm9ycykpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uLm5vdGlmeUVycm9yKGVycm9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==