UNPKG

@kephas/angular

Version:

Provides integration capabilities with Angular.

134 lines 19.1 kB
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cE1lc3NhZ2VQcm9jZXNzb3JDbGllbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci9zcmMvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvaHR0cE1lc3NhZ2VQcm9jZXNzb3JDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQTJCLE1BQU0sc0JBQXNCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBVyxNQUFNLGNBQWMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzFDLE9BQU8sRUFDeUIsc0JBQXNCLEVBQzFCLGNBQWMsRUFDekMsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFL0MsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFxQnhEOzs7OztHQUtHO0lBRVUsMEJBQTBCLFNBQTFCLDBCQUEyQixTQUFRLHNCQUFzQjtJQVdsRTs7Ozs7T0FLRztJQUNILFlBQ2MsV0FBd0IsRUFDeEIsSUFBZ0IsRUFDaEIsWUFBMEIsRUFDMUIsTUFBYztRQUN4QixLQUFLLEVBQUUsQ0FBQztRQUpFLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQW5CNUI7Ozs7OztXQU1HO1FBQ08sY0FBUyxHQUFXLFVBQVUsQ0FBQztJQWN6QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksT0FBTyxDQUE0QixPQUFXLEVBQUUsT0FBZ0M7UUFDbkYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQXdCLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzNHLE1BQU0sV0FBVyxHQUFHLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDNUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQ04sS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFDdEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFJLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUM1RCxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFJLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQy9ELENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUNOLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBSSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFDNUQsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBSSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXBFLE9BQU8sV0FBVyxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLGNBQWMsQ0FBQyxPQUFXLEVBQUUsT0FBZ0M7UUFDbEUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDeEIsT0FBTyxHQUFHLE9BQU8sR0FBRyxHQUFHLENBQUM7U0FDM0I7UUFFRCxNQUFNLEdBQUcsR0FBRyxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDMUMsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bb0JHO0lBQ08sa0JBQWtCLENBQUMsT0FBVyxFQUFFLE9BQWdDO1FBWXRFLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBNEIsV0FBa0MsRUFBRSxPQUFnQztRQUNwSCxJQUFJLFdBQVcsQ0FBQyxTQUFTLEVBQUU7WUFDdkIsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQztZQUN4QyxJQUFJLE9BQU8sU0FBUyxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7Z0JBQ3hDLFNBQVMsQ0FBQyxRQUFRLEdBQUksUUFBb0IsQ0FBQyxTQUFTLENBQUMsUUFBa0IsQ0FBQyxDQUFDO2FBQzVFO1lBRUQsTUFBTSxJQUFJLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1NBQzNEO1FBRUQsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUNyQyxJQUFJLE9BQU8sUUFBUSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDdkMsUUFBUSxDQUFDLFFBQVEsR0FBSSxRQUFvQixDQUFDLFFBQVEsQ0FBQyxRQUFrQixDQUFDLENBQUM7U0FDMUU7UUFFRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRTtZQUNyQyxNQUFNLElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDekQ7UUFFRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsT0FBUSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hGLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzdDO1NBQ0o7UUFFRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRTtZQUNyQyxNQUFNLElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDekQ7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRU8sYUFBYSxDQUE0QixLQUFVLEVBQUUsT0FBZ0M7UUFDekYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUU7WUFDNUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDeEM7UUFFRCxNQUFNLEtBQUssQ0FBQztJQUNoQixDQUFDO0NBQ0osQ0FBQTtBQTlJWSwwQkFBMEI7SUFEdEMsVUFBVSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO3FDQW1CaEIsV0FBVztRQUNsQixVQUFVO1FBQ0YsWUFBWTtRQUNsQixNQUFNO0dBckJuQiwwQkFBMEIsQ0E4SXRDO1NBOUlZLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBMb2dMZXZlbCwgQXBwU2VydmljZSwgUHJpb3JpdHksIExvZ2dlciwgRXhwYW5kbyB9IGZyb20gJ0BrZXBoYXMvY29yZSc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvbiB9IGZyb20gJ0BrZXBoYXMvdWknO1xyXG5pbXBvcnQge1xyXG4gICAgUmVzcG9uc2VNZXNzYWdlLCBFcnJvckluZm8sIE1lc3NhZ2VQcm9jZXNzb3JDbGllbnQsXHJcbiAgICBNZXNzYWdpbmdDbGllbnRDb250ZXh0LCBNZXNzYWdpbmdFcnJvclxyXG59IGZyb20gJ0BrZXBoYXMvbWVzc2FnaW5nJztcclxuaW1wb3J0IHsgQXBwU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9wdWJsaWMtYXBpJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZUlucHV0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHJldHJ5LCBtYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5cclxuaW50ZXJmYWNlIFJhd1Jlc3BvbnNlTWVzc2FnZTxUIGV4dGVuZHMgUmVzcG9uc2VNZXNzYWdlPiB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBleGNlcHRpb24gaW5mb3JtYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Vycm9ySW5mb31cclxuICAgICAqIEBtZW1iZXJvZiBSYXdSZXNwb25zZU1lc3NhZ2VcclxuICAgICAqL1xyXG4gICAgZXhjZXB0aW9uOiBFcnJvckluZm87XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmVzcG9uc2UgbWVzc2FnZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7VH1cclxuICAgICAqIEBtZW1iZXJvZiBSYXdSZXNwb25zZU1lc3NhZ2VcclxuICAgICAqL1xyXG4gICAgbWVzc2FnZTogVDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIHByb3hpZWQgbWVzc2FnZSBwcm9jZXNzaW5nIG92ZXIgSFRUUC5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgTWVzc2FnZVByb2Nlc3NvclxyXG4gKi9cclxuQEFwcFNlcnZpY2UoeyBvdmVycmlkZVByaW9yaXR5OiBQcmlvcml0eS5Mb3cgfSlcclxuZXhwb3J0IGNsYXNzIEh0dHBNZXNzYWdlUHJvY2Vzc29yQ2xpZW50IGV4dGVuZHMgTWVzc2FnZVByb2Nlc3NvckNsaWVudCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgdGhlIGJhc2Ugcm91dGUgZm9yIHRoZSBjb21tYW5kIGV4ZWN1dGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICogQG1lbWJlcm9mIE1lc3NhZ2VQcm9jZXNzb3JcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGJhc2VSb3V0ZTogc3RyaW5nID0gJ2FwaS9tc2cvJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBIdHRwTWVzc2FnZVByb2Nlc3NvciBjbGFzcy5cclxuICAgICAqIEBwYXJhbSB7Tm90aWZpY2F0aW9ufSBub3RpZmljYXRpb24gVGhlIG5vdGlmaWNhdGlvbiBzZXJ2aWNlLlxyXG4gICAgICogQHBhcmFtIHtIdHRwQ2xpZW50fSBodHRwIFRoZSBIVFRQIGNsaWVudC5cclxuICAgICAqIEBwYXJhbSB7QXBwU2V0dGluZ3N9IGFwcFNldHRpbmdzIFRoZSBhcHBsaWNhdGlvbiBzZXR0aW5ncy5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJvdGVjdGVkIGFwcFNldHRpbmdzOiBBcHBTZXR0aW5ncyxcclxuICAgICAgICBwcm90ZWN0ZWQgaHR0cDogSHR0cENsaWVudCxcclxuICAgICAgICBwcm90ZWN0ZWQgbm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24sXHJcbiAgICAgICAgcHJvdGVjdGVkIGxvZ2dlcjogTG9nZ2VyKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc3NlcyB0aGUgbWVzc2FnZSBhc3luY2hyb25vdXNseS5cclxuICAgICAqIEB0cGFyYW0gVCBUaGUgbWVzc2FnZSByZXNwb25zZSB0eXBlLlxyXG4gICAgICogQHBhcmFtIHt7fX0gbWVzc2FnZSBUaGUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TWVzc2FnaW5nQ2xpZW50Q29udGV4dH0gW29wdGlvbnNdIE9wdGlvbmFsLiBPcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBtZXNzYWdlIHByb2Nlc3NpbmcuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZXtUfX0gQW4gb2JzZXJ2YWJsZSBvdmVyIHRoZSByZXN1bHQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwcm9jZXNzPFQgZXh0ZW5kcyBSZXNwb25zZU1lc3NhZ2U+KG1lc3NhZ2U6IHt9LCBvcHRpb25zPzogTWVzc2FnaW5nQ2xpZW50Q29udGV4dCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0SHR0cFBvc3RVcmwobWVzc2FnZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3Qgb2JzID0gdGhpcy5odHRwLnBvc3Q8UmF3UmVzcG9uc2VNZXNzYWdlPFQ+Pih1cmwsIG1lc3NhZ2UsIHRoaXMuZ2V0SHR0cFBvc3RPcHRpb25zKG1lc3NhZ2UsIG9wdGlvbnMpKTtcclxuICAgICAgICBjb25zdCByZXNwb25zZU9iaiA9IChvcHRpb25zICYmIG9wdGlvbnMucmV0cmllcylcclxuICAgICAgICAgICAgPyBvYnMucGlwZShcclxuICAgICAgICAgICAgICAgIHJldHJ5KG9wdGlvbnMucmV0cmllcyksXHJcbiAgICAgICAgICAgICAgICBtYXAocmVzcG9uc2UgPT4gdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlPFQ+KHJlc3BvbnNlLCBvcHRpb25zKSksXHJcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuX3Byb2Nlc3NFcnJvcjxUPihlcnJvciwgb3B0aW9ucykpKVxyXG4gICAgICAgICAgICA6IG9icy5waXBlKFxyXG4gICAgICAgICAgICAgICAgbWFwKHJlc3BvbnNlID0+IHRoaXMuX3Byb2Nlc3NSZXNwb25zZTxUPihyZXNwb25zZSwgb3B0aW9ucykpLFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLl9wcm9jZXNzRXJyb3I8VD4oZXJyb3IsIG9wdGlvbnMpKSk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXNwb25zZU9iajtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIEhUVFAgR0VUIFVSTC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAcGFyYW0ge3t9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxyXG4gICAgICogQHBhcmFtIHtNZXNzYWdpbmdDbGllbnRDb250ZXh0fSBbb3B0aW9uc10gT3B0aW9uYWwuIE9wdGlvbnMgY29udHJvbGxpbmcgdGhlIGNvbW1hbmQgcHJvY2Vzc2luZy5cclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBIVFRQIEdFVCBVUkwuXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVzc2FnZVByb2Nlc3NvclxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0SHR0cFBvc3RVcmwobWVzc2FnZToge30sIG9wdGlvbnM/OiBNZXNzYWdpbmdDbGllbnRDb250ZXh0KTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgYmFzZVVybCA9IHRoaXMuYXBwU2V0dGluZ3MuYmFzZVVybDtcclxuICAgICAgICBpZiAoIWJhc2VVcmwuZW5kc1dpdGgoJy8nKSkge1xyXG4gICAgICAgICAgICBiYXNlVXJsID0gYmFzZVVybCArICcvJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9JHt0aGlzLmJhc2VSb3V0ZX1gO1xyXG4gICAgICAgIHJldHVybiB1cmw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBIVFRQIEdFVCBvcHRpb25zLiBCeSBkZWZhdWx0IGl0IGRvZXMgbm90IHJldHVybiBhbnkgb3B0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCBUaGUgY29tbWFuZC5cclxuICAgICAqIEBwYXJhbSB7e319IFthcmdzXSBPcHRpb25hbC4gVGhlIGFyZ3VtZW50cy5cclxuICAgICAqIEBwYXJhbSB7TWVzc2FnaW5nQ2xpZW50Q29udGV4dH0gW29wdGlvbnNdIE9wdGlvbmFsLiBPcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBjb21tYW5kIHByb2Nlc3NpbmcuXHJcbiAgICAgKiBAcmV0dXJucyB7KHtcclxuICAgICAqICAgICAgICAgICAgIGhlYWRlcnM/OiBIdHRwSGVhZGVycyB8IHtcclxuICAgICAqICAgICAgICAgICAgICAgICBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcclxuICAgICAqICAgICAgICAgICAgIH07XHJcbiAgICAgKiAgICAgICAgICAgICBvYnNlcnZlPzogJ2JvZHknO1xyXG4gICAgICogICAgICAgICAgICAgcGFyYW1zPzogSHR0cFBhcmFtcyB8IHtcclxuICAgICAqICAgICAgICAgICAgICAgICBbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gICAgICogICAgICAgICAgICAgfTtcclxuICAgICAqICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcclxuICAgICAqICAgICAgICAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcclxuICAgICAqICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XHJcbiAgICAgKiAgICAgICAgIH0gfCB1bmRlZmluZWQpfSBUaGUgb3B0aW9ucyBvciB1bmRlZmluZWQuXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVzc2FnZVByb2Nlc3NvclxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0SHR0cFBvc3RPcHRpb25zKG1lc3NhZ2U6IHt9LCBvcHRpb25zPzogTWVzc2FnaW5nQ2xpZW50Q29udGV4dCk6IHtcclxuICAgICAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfCB7XHJcbiAgICAgICAgICAgIFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgb2JzZXJ2ZT86ICdib2R5JztcclxuICAgICAgICBwYXJhbXM/OiBIdHRwUGFyYW1zIHwge1xyXG4gICAgICAgICAgICBbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuO1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcclxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xyXG4gICAgfSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9wcm9jZXNzUmVzcG9uc2U8VCBleHRlbmRzIFJlc3BvbnNlTWVzc2FnZT4ocmF3UmVzcG9uc2U6IFJhd1Jlc3BvbnNlTWVzc2FnZTxUPiwgb3B0aW9ucz86IE1lc3NhZ2luZ0NsaWVudENvbnRleHQpOiBUIHtcclxuICAgICAgICBpZiAocmF3UmVzcG9uc2UuZXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9ySW5mbyA9IHJhd1Jlc3BvbnNlLmV4Y2VwdGlvbjtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlcnJvckluZm8uc2V2ZXJpdHkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICBlcnJvckluZm8uc2V2ZXJpdHkgPSAoTG9nTGV2ZWwgYXMgRXhwYW5kbylbZXJyb3JJbmZvLnNldmVyaXR5IGFzIHN0cmluZ107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBNZXNzYWdpbmdFcnJvcihlcnJvckluZm8ubWVzc2FnZSEsIGVycm9ySW5mbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJhd1Jlc3BvbnNlLm1lc3NhZ2U7XHJcbiAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZS5zZXZlcml0eSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmVzcG9uc2Uuc2V2ZXJpdHkgPSAoTG9nTGV2ZWwgYXMgRXhwYW5kbylbcmVzcG9uc2Uuc2V2ZXJpdHkgYXMgc3RyaW5nXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZS5zZXZlcml0eSA8PSBMb2dMZXZlbC5FcnJvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgTWVzc2FnaW5nRXJyb3IocmVzcG9uc2UubWVzc2FnZSEsIHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZS5zZXZlcml0eSA9PT0gTG9nTGV2ZWwuV2FybmluZykge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2cocmVzcG9uc2Uuc2V2ZXJpdHksIG51bGwsIHJlc3BvbnNlLm1lc3NhZ2UhKTtcclxuICAgICAgICAgICAgaWYgKCEob3B0aW9ucyAmJiAob3B0aW9ucy5ub3RpZnlXYXJuaW5ncyA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMubm90aWZ5V2FybmluZ3MpKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb24ubm90aWZ5V2FybmluZyhyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZS5zZXZlcml0eSA8PSBMb2dMZXZlbC5FcnJvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgTWVzc2FnaW5nRXJyb3IocmVzcG9uc2UubWVzc2FnZSEsIHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3Byb2Nlc3NFcnJvcjxUIGV4dGVuZHMgUmVzcG9uc2VNZXNzYWdlPihlcnJvcjogYW55LCBvcHRpb25zPzogTWVzc2FnaW5nQ2xpZW50Q29udGV4dCk6IE9ic2VydmFibGVJbnB1dDxUPiB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIGlmICghKG9wdGlvbnMgJiYgKG9wdGlvbnMubm90aWZ5RXJyb3JzID09PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5ub3RpZnlFcnJvcnMpKSkge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbi5ub3RpZnlFcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxufVxyXG4iXX0=