@kephas/angular
Version:
Provides integration capabilities with Angular.
134 lines • 19.1 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { HttpClient } from '@angular/common/http';
import { LogLevel, AppService, Priority, Logger } from '@kephas/core';
import { Notification } from '@kephas/ui';
import { MessageProcessorClient, MessagingError } from '@kephas/messaging';
import { AppSettings } from '../../public-api';
import { retry, map, catchError } from 'rxjs/operators';
/**
* Provides proxied message processing over HTTP.
*
* @export
* @class MessageProcessor
*/
let HttpMessageProcessorClient = class HttpMessageProcessorClient extends MessageProcessorClient {
/**
* Initializes a new instance of the HttpMessageProcessor class.
* @param {Notification} 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 <= 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,
Notification,
Logger])
], HttpMessageProcessorClient);
export { HttpMessageProcessorClient };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cE1lc3NhZ2VQcm9jZXNzb3JDbGllbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci9zcmMvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvaHR0cE1lc3NhZ2VQcm9jZXNzb3JDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQTJCLE1BQU0sc0JBQXNCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBVyxNQUFNLGNBQWMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzFDLE9BQU8sRUFDeUIsc0JBQXNCLEVBQzFCLGNBQWMsRUFDekMsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFL0MsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFxQnhEOzs7OztHQUtHO0lBRVUsMEJBQTBCLFNBQTFCLDBCQUEyQixTQUFRLHNCQUFzQjtJQVdsRTs7Ozs7T0FLRztJQUNILFlBQ2MsV0FBd0IsRUFDeEIsSUFBZ0IsRUFDaEIsWUFBMEIsRUFDMUIsTUFBYztRQUN4QixLQUFLLEVBQUUsQ0FBQztRQUpFLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQW5CNUI7Ozs7OztXQU1HO1FBQ08sY0FBUyxHQUFXLFVBQVUsQ0FBQztJQWN6QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksT0FBTyxDQUE0QixPQUFXLEVBQUUsT0FBZ0M7UUFDbkYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxD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LElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hGLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzdDO1NBQ0o7UUFFRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRTtZQUNyQyxNQUFNLElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDekQ7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRU8sYUFBYSxDQUE0QixLQUFVLEVBQUUsT0FBZ0M7UUFDekYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUU7WUFDNUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDeEM7UUFFRCxNQUFNLEtBQUssQ0FBQztJQUNoQixDQUFDO0NBQ0osQ0FBQTtBQTlJWSwwQkFBMEI7SUFEdEMsVUFBVSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO3FDQW1CaEIsV0FBVztRQUNsQixVQUFVO1FBQ0YsWUFBWTtRQUNsQixNQUFNO0dBckJuQiwwQkFBMEIsQ0E4SXRDO1NBOUlZLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBMb2dMZXZlbCwgQXBwU2VydmljZSwgUHJpb3JpdHksIExvZ2dlciwgRXhwYW5kbyB9IGZyb20gJ0BrZXBoYXMvY29yZSc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvbiB9IGZyb20gJ0BrZXBoYXMvdWknO1xyXG5pbXBvcnQge1xyXG4gICAgUmVzcG9uc2VNZXNzYWdlLCBFcnJvckluZm8sIE1lc3NhZ2VQcm9jZXNzb3JDbGllbnQsXHJcbiAgICBNZXNzYWdpbmdDbGllbnRDb250ZXh0LCBNZXNzYWdpbmdFcnJvclxyXG59IGZyb20gJ0BrZXBoYXMvbWVzc2FnaW5nJztcclxuaW1wb3J0IHsgQXBwU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9wdWJsaWMtYXBpJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZUlucHV0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHJldHJ5LCBtYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5cclxuaW50ZXJmYWNlIFJhd1Jlc3BvbnNlTWVzc2FnZTxUIGV4dGVuZHMgUmVzcG9uc2VNZXNzYWdlPiB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBleGNlcHRpb24gaW5mb3JtYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Vycm9ySW5mb31cclxuICAgICAqIEBtZW1iZXJvZiBSYXdSZXNwb25zZU1lc3NhZ2VcclxuICAgICAqL1xyXG4gICAgZXhjZXB0aW9uOiBFcnJvckluZm87XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmVzcG9uc2UgbWVzc2FnZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7VH1cclxuICAgICAqIEBtZW1iZXJvZiBSYXdSZXNwb25zZU1lc3NhZ2VcclxuICAgICAqL1xyXG4gICAgbWVzc2FnZTogVDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIHByb3hpZWQgbWVzc2FnZSBwcm9jZXNzaW5nIG92ZXIgSFRUUC5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgTWVzc2FnZVByb2Nlc3NvclxyXG4gKi9cclxuQEFwcFNlcnZpY2UoeyBvdmVycmlkZVByaW9yaXR5OiBQcmlvcml0eS5Mb3cgfSlcclxuZXhwb3J0IGNsYXNzIEh0dHBNZXNzYWdlUHJvY2Vzc29yQ2xpZW50IGV4dGVuZHMgTWVzc2FnZVByb2Nlc3NvckNsaWVudCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgdGhlIGJhc2Ugcm91dGUgZm9yIHRoZSBjb21tYW5kIGV4ZWN1dGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICogQG1lbWJlcm9mIE1lc3NhZ2VQcm9jZXNzb3JcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGJhc2VSb3V0ZTogc3RyaW5nID0gJ2FwaS9tc2cvJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBIdHRwTWVzc2FnZVByb2Nlc3NvciBjbGFzcy5cclxuICAgICAqIEBwYXJhbSB7Tm90aWZpY2F0aW9ufSBub3RpZmljYXRpb24gVGhlIG5vdGlmaWNhdGlvbiBzZXJ2aWNlLlxyXG4gICAgICogQHBhcmFtIHtIdHRwQ2xpZW50fSBodHRwIFRoZSBIVFRQIGNsaWVudC5cclxuICAgICAqIEBwYXJhbSB7QXBwU2V0dGluZ3N9IGFwcFNldHRpbmdzIFRoZSBhcHBsaWNhdGlvbiBzZXR0aW5ncy5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJvdGVjdGVkIGFwcFNldHRpbmdzOiBBcHBTZXR0aW5ncyxcclxuICAgICAgICBwcm90ZWN0ZWQgaHR0cDogSHR0cENsaWVudCxcclxuICAgICAgICBwcm90ZWN0ZWQgbm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24sXHJcbiAgICAgICAgcHJvdGVjdGVkIGxvZ2dlcjogTG9nZ2VyKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc3NlcyB0aGUgbWVzc2FnZSBhc3luY2hyb25vdXNseS5cclxuICAgICAqIEB0cGFyYW0gVCBUaGUgbWVzc2FnZSByZXNwb25zZSB0eXBlLlxyXG4gICAgICogQHBhcmFtIHt7fX0gbWVzc2FnZSBUaGUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TWVzc2FnaW5nQ2xpZW50Q29udGV4dH0gW29wdGlvbnNdIE9wdGlvbmFsLiBPcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBtZXNzYWdlIHByb2Nlc3NpbmcuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZXtUfX0gQW4gb2JzZXJ2YWJsZSBvdmVyIHRoZSByZXN1bHQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwcm9jZXNzPFQgZXh0ZW5kcyBSZXNwb25zZU1lc3NhZ2U+KG1lc3NhZ2U6IHt9LCBvcHRpb25zPzogTWVzc2FnaW5nQ2xpZW50Q29udGV4dCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0SHR0cFBvc3RVcmwobWVzc2FnZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3Qgb2JzID0gdGhpcy5odHRwLnBvc3Q8UmF3UmVzcG9uc2VNZXNzYWdlPFQ+Pih1cmwsIG1lc3NhZ2UsIHRoaXMuZ2V0SHR0cFBvc3RPcHRpb25zKG1lc3NhZ2UsIG9wdGlvbnMpKTtcclxuICAgICAgICBjb25zdCByZXNwb25zZU9iaiA9IChvcHRpb25zICYmIG9wdGlvbnMucmV0cmllcylcclxuICAgICAgICAgICAgPyBvYnMucGlwZShcclxuICAgICAgICAgICAgICAgIHJldHJ5KG9wdGlvbnMucmV0cmllcyksXHJcbiAgICAgICAgICAgICAgICBtYXAocmVzcG9uc2UgPT4gdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlPFQ+KHJlc3BvbnNlLCBvcHRpb25zKSksXHJcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuX3Byb2Nlc3NFcnJvcjxUPihlcnJvciwgb3B0aW9ucykpKVxyXG4gICAgICAgICAgICA6IG9icy5waXBlKFxyXG4gICAgICAgICAgICAgICAgbWFwKHJlc3BvbnNlID0+IHRoaXMuX3Byb2Nlc3NSZXNwb25zZTxUPihyZXNwb25zZSwgb3B0aW9ucykpLFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLl9wcm9jZXNzRXJyb3I8VD4oZXJyb3IsIG9wdGlvbnMpKSk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXNwb25zZU9iajtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIEhUVFAgR0VUIFVSTC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAcGFyYW0ge3t9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxyXG4gICAgICogQHBhcmFtIHtNZXNzYWdpbmdDbGllbnRDb250ZXh0fSBbb3B0aW9uc10gT3B0aW9uYWwuIE9wdGlvbnMgY29udHJvbGxpbmcgdGhlIGNvbW1hbmQgcHJvY2Vzc2luZy5cclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBIVFRQIEdFVCBVUkwuXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVzc2FnZVByb2Nlc3NvclxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0SHR0cFBvc3RVcmwobWVzc2FnZToge30sIG9wdGlvbnM/OiBNZXNzYWdpbmdDbGllbnRDb250ZXh0KTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgYmFzZVVybCA9IHRoaXMuYXBwU2V0dGluZ3MuYmFzZVVybDtcclxuICAgICAgICBpZiAoIWJhc2VVcmwuZW5kc1dpdGgoJy8nKSkge1xyXG4gICAgICAgICAgICBiYXNlVXJsID0gYmFzZVVybCArICcvJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9JHt0aGlzLmJhc2VSb3V0ZX1gO1xyXG4gICAgICAgIHJldHVybiB1cmw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBIVFRQIEdFVCBvcHRpb25zLiBCeSBkZWZhdWx0IGl0IGRvZXMgbm90IHJldHVybiBhbnkgb3B0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCBUaGUgY29tbWFuZC5cclxuICAgICAqIEBwYXJhbSB7e319IFthcmdzXSBPcHRpb25hbC4gVGhlIGFyZ3VtZW50cy5cclxuICAgICAqIEBwYXJhbSB7TWVzc2FnaW5nQ2xpZW50Q29udGV4dH0gW29wdGlvbnNdIE9wdGlvbmFsLiBPcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBjb21tYW5kIHByb2Nlc3NpbmcuXHJcbiAgICAgKiBAcmV0dXJucyB7KHtcclxuICAgICAqICAgICAgICAgICAgIGhlYWRlcnM/OiBIdHRwSGVhZGVycyB8IHtcclxuICAgICAqICAgICAgICAgICAgICAgICBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcclxuICAgICAqICAgICAgICAgICAgIH07XHJcbiAgICAgKiAgICAgICAgICAgICBvYnNlcnZlPzogJ2JvZHknO1xyXG4gICAgICogICAgICAgICAgICAgcGFyYW1zPzogSHR0cFBhcmFtcyB8IHtcclxuICAgICAqICAgICAgICAgICAgICAgICBbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gICAgICogICAgICAgICAgICAgfTtcclxuICAgICAqICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcclxuICAgICAqICAgICAgICAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcclxuICAgICAqICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XHJcbiAgICAgKiAgICAgICAgIH0gfCB1bmRlZmluZWQpfSBUaGUgb3B0aW9ucyBvciB1bmRlZmluZWQuXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVzc2FnZVByb2Nlc3NvclxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0SHR0cFBvc3RPcHRpb25zKG1lc3NhZ2U6IHt9LCBvcHRpb25zPzogTWVzc2FnaW5nQ2xpZW50Q29udGV4dCk6IHtcclxuICAgICAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfCB7XHJcbiAgICAgICAgICAgIFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgb2JzZXJ2ZT86ICdib2R5JztcclxuICAgICAgICBwYXJhbXM/OiBIdHRwUGFyYW1zIHwge1xyXG4gICAgICAgICAgICBbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuO1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcclxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xyXG4gICAgfSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9wcm9jZXNzUmVzcG9uc2U8VCBleHRlbmRzIFJlc3BvbnNlTWVzc2FnZT4ocmF3UmVzcG9uc2U6IFJhd1Jlc3BvbnNlTWVzc2FnZTxUPiwgb3B0aW9ucz86IE1lc3NhZ2luZ0NsaWVudENvbnRleHQpOiBUIHtcclxuICAgICAgICBpZiAocmF3UmVzcG9uc2UuZXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9ySW5mbyA9IHJhd1Jlc3BvbnNlLmV4Y2VwdGlvbjtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlcnJvckluZm8uc2V2ZXJpdHkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICBlcnJvckluZm8uc2V2ZXJpdHkgPSAoTG9nTGV2ZWwgYXMgRXhwYW5kbylbZXJyb3JJbmZvLnNldmVyaXR5IGFzIHN0cmluZ107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBNZXNzYWdpbmdFcnJvcihlcnJvckluZm8ubWVzc2FnZSEsIGVycm9ySW5mbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJhd1Jlc3BvbnNlLm1lc3NhZ2U7XHJcbiAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZS5zZXZlcml0eSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmVzcG9uc2Uuc2V2ZXJpdHkgPSAoTG9nTGV2ZWwgYXMgRXhwYW5kbylbcmVzcG9uc2Uuc2V2ZXJpdHkgYXMgc3RyaW5nXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZS5zZXZlcml0eSA8PSBMb2dMZXZlbC5FcnJvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgTWVzc2FnaW5nRXJyb3IocmVzcG9uc2UubWVzc2FnZSEsIHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZS5zZXZlcml0eSA9PT0gTG9nTGV2ZWwuV2FybmluZykge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2cocmVzcG9uc2Uuc2V2ZXJpdHksIG51bGwsIHJlc3BvbnNlLm1lc3NhZ2UhKTtcclxuICAgICAgICAgICAgaWYgKCEob3B0aW9ucyAmJiAob3B0aW9ucy5ub3RpZnlXYXJuaW5ncyA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMubm90aWZ5V2FybmluZ3MpKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb24ubm90aWZ5V2FybmluZyhyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZS5zZXZlcml0eSA8PSBMb2dMZXZlbC5FcnJvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgTWVzc2FnaW5nRXJyb3IocmVzcG9uc2UubWVzc2FnZSEsIHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3Byb2Nlc3NFcnJvcjxUIGV4dGVuZHMgUmVzcG9uc2VNZXNzYWdlPihlcnJvcjogYW55LCBvcHRpb25zPzogTWVzc2FnaW5nQ2xpZW50Q29udGV4dCk6IE9ic2VydmFibGVJbnB1dDxUPiB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIGlmICghKG9wdGlvbnMgJiYgKG9wdGlvbnMubm90aWZ5RXJyb3JzID09PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5ub3RpZnlFcnJvcnMpKSkge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbi5ub3RpZnlFcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxufVxyXG4iXX0=