UNPKG

@datorama/akita

Version:

State Management Tailored-Made for JS Applications

474 lines 33.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { EntityService, isDefined } from '@datorama/akita'; import { throwError } from 'rxjs'; import { inject } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { catchError, finalize, map, tap } from 'rxjs/operators'; import { HttpMethod, NgEntityServiceNotifier } from './ng-entity-service-notifier'; import { NgEntityServiceLoader } from './ng-entity-service.loader'; import { defaultConfig, mergeDeep, NG_ENTITY_SERVICE_CONFIG } from './ng-entity-service.config'; import { isID } from './helpers'; import { errorAction, successAction } from './action-factory'; /** @type {?} */ export var mapResponse = (/** * @param {?} config * @return {?} */ function (config) { return map((/** * @param {?} res * @return {?} */ function (res) { return ((config || {}).mapResponseFn ? config.mapResponseFn(res) : res); })); }); /** * @template S */ var /** * @template S */ NgEntityService = /** @class */ (function (_super) { tslib_1.__extends(NgEntityService, _super); function NgEntityService(store, config) { if (config === void 0) { config = {}; } var _this = _super.call(this) || this; _this.store = store; _this.config = config; _this.globalConfig = {}; _this.http = inject(HttpClient); _this.loader = inject(NgEntityServiceLoader); _this.notifier = inject(NgEntityServiceNotifier); _this.globalConfig = inject(NG_ENTITY_SERVICE_CONFIG); _this.mergedConfig = mergeDeep(defaultConfig, _this.globalConfig, config); _this.dispatchSuccess = successAction(_this.store.storeName, _this.notifier); _this.dispatchError = errorAction(_this.store.storeName, _this.notifier); return _this; } Object.defineProperty(NgEntityService.prototype, "api", { get: /** * @return {?} */ function () { return (this.baseUrl || this.getConfigValue('baseUrl')) + "/" + this.resourceName; }, enumerable: true, configurable: true }); Object.defineProperty(NgEntityService.prototype, "resourceName", { get: /** * @return {?} */ function () { return this.getConfigValue('resourceName') || this.store.storeName; }, enumerable: true, configurable: true }); /** * @param {?} api * @return {?} */ NgEntityService.prototype.setBaseUrl = /** * @param {?} api * @return {?} */ function (api) { this.baseUrl = api; }; /** * @template T * @param {?=} idOrConfig * @param {?=} config * @return {?} */ NgEntityService.prototype.get = /** * @template T * @param {?=} idOrConfig * @param {?=} config * @return {?} */ function (idOrConfig, config) { var _this = this; /** @type {?} */ var url; /** @type {?} */ var isSingle = isID(idOrConfig); /** @type {?} */ var _config = (isSingle ? config : idOrConfig) || {}; /** @type {?} */ var method = this.getHttpMethod(HttpMethod.GET); if (_config.url) { url = _config.url; } else { url = isSingle ? this.api + "/" + idOrConfig : this.api; } this.loader.dispatch({ method: method, loading: true, entityId: isSingle ? idOrConfig : null, storeName: this.store.storeName }); return (/** @type {?} */ (this.http[method.toLowerCase()](url, _config).pipe(mapResponse(_config), tap((/** * @param {?} data * @return {?} */ function (data) { if (isSingle) { _this.store.upsert((/** @type {?} */ (idOrConfig)), data); } else { _config.append ? _this.store.add(data) : _this.store.set(data); } _this.dispatchSuccess({ method: method, payload: data, successMsg: _config.successMsg }); })), catchError((/** * @param {?} error * @return {?} */ function (error) { return _this.handleError(method, error, _config.errorMsg); })), finalize((/** * @return {?} */ function () { _this.loader.dispatch({ method: method, loading: false, storeName: _this.store.storeName }); }))))); }; /** * * Add a new entity - Creates a POST request * * service.add(entity) * service.add(entity, config) * */ /** * * Add a new entity - Creates a POST request * * service.add(entity) * service.add(entity, config) * * @template T * @param {?} entity * @param {?=} config * @return {?} */ NgEntityService.prototype.add = /** * * Add a new entity - Creates a POST request * * service.add(entity) * service.add(entity, config) * * @template T * @param {?} entity * @param {?=} config * @return {?} */ function (entity, config) { var _this = this; /** @type {?} */ var method = this.getHttpMethod(HttpMethod.POST); this.loader.dispatch({ method: method, loading: true, storeName: this.store.storeName }); return (/** @type {?} */ (this.http[method.toLowerCase()](this.resolveUrl(config), entity, config).pipe(mapResponse(config), tap((/** * @param {?} entity * @return {?} */ function (entity) { _this.store.add(entity, config); _this.dispatchSuccess({ method: method, payload: entity, successMsg: config && config.successMsg }); })), catchError((/** * @param {?} error * @return {?} */ function (error) { return _this.handleError(method, error, config && config.errorMsg); })), finalize((/** * @return {?} */ function () { _this.loader.dispatch({ method: method, loading: false, storeName: _this.store.storeName }); }))))); }; /** * * Update an entity - Creates a PUT/PATCH request * * service.update(id, entity) * service.update(id, entity, config) * */ /** * * Update an entity - Creates a PUT/PATCH request * * service.update(id, entity) * service.update(id, entity, config) * * @template T * @param {?} id * @param {?} entity * @param {?=} config * @return {?} */ NgEntityService.prototype.update = /** * * Update an entity - Creates a PUT/PATCH request * * service.update(id, entity) * service.update(id, entity, config) * * @template T * @param {?} id * @param {?} entity * @param {?=} config * @return {?} */ function (id, entity, config) { var _this = this; /** @type {?} */ var method = config && config.method ? config.method : this.getHttpMethod(HttpMethod.PUT); this.loader.dispatch({ method: method, loading: true, entityId: id, storeName: this.store.storeName }); return (/** @type {?} */ (this.http[method.toLocaleLowerCase()](this.resolveUrl(config, id), entity, config).pipe(mapResponse(config), tap((/** * @param {?} entity * @return {?} */ function (entity) { _this.store.update(id, (/** @type {?} */ (entity))); _this.dispatchSuccess({ method: method, payload: entity, successMsg: config && config.successMsg }); })), catchError((/** * @param {?} error * @return {?} */ function (error) { return _this.handleError(method, error, config && config.errorMsg); })), finalize((/** * @return {?} */ function () { _this.loader.dispatch({ method: method, loading: false, entityId: id, storeName: _this.store.storeName }); }))))); }; /** * * Delete an entity - Creates a DELETE request * * service.delete(id) * service.delete(id, config) * */ /** * * Delete an entity - Creates a DELETE request * * service.delete(id) * service.delete(id, config) * * @template T * @param {?} id * @param {?=} config * @return {?} */ NgEntityService.prototype.delete = /** * * Delete an entity - Creates a DELETE request * * service.delete(id) * service.delete(id, config) * * @template T * @param {?} id * @param {?=} config * @return {?} */ function (id, config) { var _this = this; /** @type {?} */ var method = this.getHttpMethod(HttpMethod.DELETE); this.loader.dispatch({ method: method, loading: true, entityId: id, storeName: this.store.storeName }); return (/** @type {?} */ (this.http[method.toLowerCase()](this.resolveUrl(config, id), config).pipe(mapResponse(config), tap((/** * @param {?} res * @return {?} */ function (res) { _this.store.remove(id); _this.dispatchSuccess({ method: method, payload: res, successMsg: config && config.successMsg }); })), catchError((/** * @param {?} error * @return {?} */ function (error) { return _this.handleError(method, error, config && config.errorMsg); })), finalize((/** * @return {?} */ function () { _this.loader.dispatch({ method: method, loading: false, entityId: id, storeName: _this.store.storeName }); }))))); }; /** * @private * @param {?} type * @return {?} */ NgEntityService.prototype.getHttpMethod = /** * @private * @param {?} type * @return {?} */ function (type) { return this.mergedConfig.httpMethods[type]; }; /** * @private * @param {?} key * @return {?} */ NgEntityService.prototype.getConfigValue = /** * @private * @param {?} key * @return {?} */ function (key) { return this.constructor[key] || this.mergedConfig[key]; }; /** * @private * @param {?} config * @param {?=} id * @return {?} */ NgEntityService.prototype.resolveUrl = /** * @private * @param {?} config * @param {?=} id * @return {?} */ function (config, id) { /** @type {?} */ var customUrl = (config || {}).url; if (isDefined(id)) { return customUrl || this.api + "/" + id; } return customUrl || this.api; }; /** * @private * @param {?} method * @param {?} error * @param {?} errorMsg * @return {?} */ NgEntityService.prototype.handleError = /** * @private * @param {?} method * @param {?} error * @param {?} errorMsg * @return {?} */ function (method, error, errorMsg) { this.dispatchError({ method: method, errorMsg: errorMsg, payload: error }); return throwError(error); }; return NgEntityService; }(EntityService)); /** * @template S */ export { NgEntityService }; if (false) { /** @type {?} */ NgEntityService.prototype.baseUrl; /** @type {?} */ NgEntityService.prototype.loader; /** * @type {?} * @private */ NgEntityService.prototype.http; /** * @type {?} * @private */ NgEntityService.prototype.notifier; /** * @type {?} * @private */ NgEntityService.prototype.globalConfig; /** * @type {?} * @private */ NgEntityService.prototype.mergedConfig; /** * @type {?} * @private */ NgEntityService.prototype.dispatchSuccess; /** * @type {?} * @private */ NgEntityService.prototype.dispatchError; /** * @type {?} * @protected */ NgEntityService.prototype.store; /** * @type {?} * @private */ NgEntityService.prototype.config; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZW50aXR5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZGF0b3JhbWEvYWtpdGEvYW5ndWxhci9wbGF5Z3JvdW5kL3Byb2plY3RzL25nLWVudGl0eS1zZXJ2aWNlLyIsInNvdXJjZXMiOlsibGliL25nLWVudGl0eS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUVMLGFBQWEsRUFLYixTQUFTLEVBQ1YsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRSxPQUFPLEVBQXVCLFVBQVUsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25FLE9BQU8sRUFDTCxhQUFhLEVBQ2IsU0FBUyxFQUNULHdCQUF3QixFQUV6QixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7QUFFOUQsTUFBTSxLQUFPLFdBQVc7Ozs7QUFBRyxVQUFDLE1BQWtCO0lBQzVDLE9BQUEsR0FBRzs7OztJQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsQ0FBQyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxF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Ozs7SUEvT0Msa0NBQWdCOztJQUNoQixpQ0FBOEI7Ozs7O0lBRTlCLCtCQUF5Qjs7Ozs7SUFDekIsbUNBQTBDOzs7OztJQUMxQyx1Q0FBdUQ7Ozs7O0lBQ3ZELHVDQUEwRTs7Ozs7SUFFMUUsMENBQXdFOzs7OztJQUN4RSx3Q0FBc0U7Ozs7O0lBRTFELGdDQUErQjs7Ozs7SUFBRSxpQ0FBMEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZGRFbnRpdGllc09wdGlvbnMsXG4gIEVudGl0eVNlcnZpY2UsXG4gIEVudGl0eVN0YXRlLFxuICBFbnRpdHlTdG9yZSxcbiAgZ2V0RW50aXR5VHlwZSxcbiAgZ2V0SURUeXBlLFxuICBpc0RlZmluZWRcbn0gZnJvbSAnQGRhdG9yYW1hL2FraXRhJztcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpbmFsaXplLCBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEh0dHBDb25maWcsIE1zZywgTmdFbnRpdHlTZXJ2aWNlUGFyYW1zIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBFbnRpdHlTZXJ2aWNlQWN0aW9uLCBIdHRwTWV0aG9kLCBOZ0VudGl0eVNlcnZpY2VOb3RpZmllciB9IGZyb20gJy4vbmctZW50aXR5LXNlcnZpY2Utbm90aWZpZXInO1xuaW1wb3J0IHsgTmdFbnRpdHlTZXJ2aWNlTG9hZGVyIH0gZnJvbSAnLi9uZy1lbnRpdHktc2VydmljZS5sb2FkZXInO1xuaW1wb3J0IHtcbiAgZGVmYXVsdENvbmZpZyxcbiAgbWVyZ2VEZWVwLFxuICBOR19FTlRJVFlfU0VSVklDRV9DT05GSUcsXG4gIE5nRW50aXR5U2VydmljZUdsb2JhbENvbmZpZ1xufSBmcm9tICcuL25nLWVudGl0eS1zZXJ2aWNlLmNvbmZpZyc7XG5pbXBvcnQgeyBpc0lEIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IGVycm9yQWN0aW9uLCBzdWNjZXNzQWN0aW9uIH0gZnJvbSAnLi9hY3Rpb24tZmFjdG9yeSc7XG5cbmV4cG9ydCBjb25zdCBtYXBSZXNwb25zZSA9IChjb25maWc6IEh0dHBDb25maWcpID0+XG4gIG1hcChyZXMgPT4gKChjb25maWcgfHwge30pLm1hcFJlc3BvbnNlRm4gPyBjb25maWcubWFwUmVzcG9uc2VGbihyZXMpIDogcmVzKSk7XG5cbmV4cG9ydCBjbGFzcyBOZ0VudGl0eVNlcnZpY2U8UyBleHRlbmRzIEVudGl0eVN0YXRlID0gYW55PiBleHRlbmRzIEVudGl0eVNlcnZpY2U8Uz4ge1xuICBiYXNlVXJsOiBzdHJpbmc7XG4gIGxvYWRlcjogTmdFbnRpdHlTZXJ2aWNlTG9hZGVyO1xuXG4gIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgcHJpdmF0ZSBub3RpZmllcjogTmdFbnRpdHlTZXJ2aWNlTm90aWZpZXI7XG4gIHByaXZhdGUgZ2xvYmFsQ29uZmlnOiBOZ0VudGl0eVNlcnZpY2VHbG9iYWxDb25maWcgPSB7fTtcbiAgcHJpdmF0ZSBtZXJnZWRDb25maWc6IE5nRW50aXR5U2VydmljZVBhcmFtcyAmIE5nRW50aXR5U2VydmljZUdsb2JhbENvbmZpZztcblxuICBwcml2YXRlIGRpc3BhdGNoU3VjY2VzczogKGFjdGlvbjogUGFydGlhbDxFbnRpdHlTZXJ2aWNlQWN0aW9uPikgPT4gdm9pZDtcbiAgcHJpdmF0ZSBkaXNwYXRjaEVycm9yOiAoYWN0aW9uOiBQYXJ0aWFsPEVudGl0eVNlcnZpY2VBY3Rpb24+KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdG9yZTogRW50aXR5U3RvcmU8Uz4sIHByaXZhdGUgY29uZmlnOiBOZ0VudGl0eVNlcnZpY2VQYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5odHRwID0gaW5qZWN0KEh0dHBDbGllbnQpO1xuICAgIHRoaXMubG9hZGVyID0gaW5qZWN0KE5nRW50aXR5U2VydmljZUxvYWRlcik7XG4gICAgdGhpcy5ub3RpZmllciA9IGluamVjdChOZ0VudGl0eVNlcnZpY2VOb3RpZmllcik7XG4gICAgdGhpcy5nbG9iYWxDb25maWcgPSBpbmplY3QoTkdfRU5USVRZX1NFUlZJQ0VfQ09ORklHKTtcblxuICAgIHRoaXMubWVyZ2VkQ29uZmlnID0gbWVyZ2VEZWVwKGRlZmF1bHRDb25maWcsIHRoaXMuZ2xvYmFsQ29uZmlnLCBjb25maWcpO1xuXG4gICAgdGhpcy5kaXNwYXRjaFN1Y2Nlc3MgPSBzdWNjZXNzQWN0aW9uKHRoaXMuc3RvcmUuc3RvcmVOYW1lLCB0aGlzLm5vdGlmaWVyKTtcbiAgICB0aGlzLmRpc3BhdGNoRXJyb3IgPSBlcnJvckFjdGlvbih0aGlzLnN0b3JlLnN0b3JlTmFtZSwgdGhpcy5ub3RpZmllcik7XG4gIH1cblxuICBnZXQgYXBpKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmJhc2VVcmwgfHwgdGhpcy5nZXRDb25maWdWYWx1ZSgnYmFzZVVybCcpfS8ke3RoaXMucmVzb3VyY2VOYW1lfWA7XG4gIH1cblxuICBnZXQgcmVzb3VyY2VOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldENvbmZpZ1ZhbHVlKCdyZXNvdXJjZU5hbWUnKSB8fCB0aGlzLnN0b3JlLnN0b3JlTmFtZTtcbiAgfVxuXG4gIHNldEJhc2VVcmwoYXBpOiBzdHJpbmcpIHtcbiAgICB0aGlzLmJhc2VVcmwgPSBhcGk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogR2V0IGFsbCBvciBvbmUgZW50aXR5IC0gQ3JlYXRlcyBhIEdFVCByZXF1ZXN0XG4gICAqXG4gICAqIHNlcnZpY2UuZ2V0KCkuc3Vic2NyaWJlKClcbiAgICogc2VydmljZS5nZXQoeyBoZWFkZXJzLCBwYXJhbXMsIHVybCB9KVxuICAgKlxuICAgKiBzZXJ2aWNlLmdldChpZClcbiAgICogc2VydmljZS5nZXQoaWQsIHsgaGVhZGVycywgcGFyYW1zLCB1cmwgfSlcbiAgICpcbiAgICovXG4gIGdldDxUPihpZD86IGdldElEVHlwZTxTPiwgY29uZmlnPzogSHR0cENvbmZpZyAmIHsgYXBwZW5kPzogYm9vbGVhbiB9ICYgTXNnKTogT2JzZXJ2YWJsZTxUPjtcbiAgZ2V0PFQ+KGNvbmZpZz86IEh0dHBDb25maWcgJiB7IGFwcGVuZD86IGJvb2xlYW4gfSAmIE1zZyk6IE9ic2VydmFibGU8VD47XG4gIGdldDxUPihpZE9yQ29uZmlnPzogZ2V0SURUeXBlPFM+IHwgSHR0cENvbmZpZywgY29uZmlnPzogSHR0cENvbmZpZyAmIHsgYXBwZW5kPzogYm9vbGVhbiB9ICYgTXNnKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgbGV0IHVybDogc3RyaW5nO1xuICAgIGNvbnN0IGlzU2luZ2xlID0gaXNJRChpZE9yQ29uZmlnKTtcbiAgICBjb25zdCBfY29uZmlnOiBIdHRwQ29uZmlnICYgeyBhcHBlbmQ/OiBib29sZWFuIH0gJiBNc2cgPSAoaXNTaW5nbGUgPyBjb25maWcgOiBpZE9yQ29uZmlnKSB8fCB7fTtcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLmdldEh0dHBNZXRob2QoSHR0cE1ldGhvZC5HRVQpO1xuXG4gICAgaWYgKF9jb25maWcudXJsKSB7XG4gICAgICB1cmwgPSBfY29uZmlnLnVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgdXJsID0gaXNTaW5nbGUgPyBgJHt0aGlzLmFwaX0vJHtpZE9yQ29uZmlnfWAgOiB0aGlzLmFwaTtcbiAgICB9XG5cbiAgICB0aGlzLmxvYWRlci5kaXNwYXRjaCh7XG4gICAgICBtZXRob2QsXG4gICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgZW50aXR5SWQ6IGlzU2luZ2xlID8gaWRPckNvbmZpZyA6IG51bGwsXG4gICAgICBzdG9yZU5hbWU6IHRoaXMuc3RvcmUuc3RvcmVOYW1lXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwW21ldGhvZC50b0xvd2VyQ2FzZSgpXSh1cmwsIF9jb25maWcpLnBpcGUoXG4gICAgICBtYXBSZXNwb25zZShfY29uZmlnKSxcbiAgICAgIHRhcCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChpc1NpbmdsZSkge1xuICAgICAgICAgIHRoaXMuc3RvcmUudXBzZXJ0KGlkT3JDb25maWcgYXMgZ2V0SURUeXBlPFM+LCBkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfY29uZmlnLmFwcGVuZCA/IHRoaXMuc3RvcmUuYWRkKGRhdGEpIDogdGhpcy5zdG9yZS5zZXQoZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpc3BhdGNoU3VjY2Vzcyh7XG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIHBheWxvYWQ6IGRhdGEsXG4gICAgICAgICAgc3VjY2Vzc01zZzogX2NvbmZpZy5zdWNjZXNzTXNnXG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlRXJyb3IobWV0aG9kLCBlcnJvciwgX2NvbmZpZy5lcnJvck1zZykpLFxuICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRlci5kaXNwYXRjaCh7XG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIHN0b3JlTmFtZTogdGhpcy5zdG9yZS5zdG9yZU5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICkgYXMgT2JzZXJ2YWJsZTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBBZGQgYSBuZXcgZW50aXR5IC0gQ3JlYXRlcyBhIFBPU1QgcmVxdWVzdFxuICAgKlxuICAgKiBzZXJ2aWNlLmFkZChlbnRpdHkpXG4gICAqIHNlcnZpY2UuYWRkKGVudGl0eSwgY29uZmlnKVxuICAgKlxuICAgKi9cbiAgYWRkPFQ+KGVudGl0eTogZ2V0RW50aXR5VHlwZTxTPiwgY29uZmlnPzogSHR0cENvbmZpZyAmIFBpY2s8QWRkRW50aXRpZXNPcHRpb25zLCAncHJlcGVuZCc+ICYgTXNnKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5nZXRIdHRwTWV0aG9kKEh0dHBNZXRob2QuUE9TVCk7XG5cbiAgICB0aGlzLmxvYWRlci5kaXNwYXRjaCh7XG4gICAgICBtZXRob2QsXG4gICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgc3RvcmVOYW1lOiB0aGlzLnN0b3JlLnN0b3JlTmFtZVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmh0dHBbbWV0aG9kLnRvTG93ZXJDYXNlKCldKHRoaXMucmVzb2x2ZVVybChjb25maWcpLCBlbnRpdHksIGNvbmZpZykucGlwZShcbiAgICAgIG1hcFJlc3BvbnNlKGNvbmZpZyksXG4gICAgICB0YXAoKGVudGl0eTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc3RvcmUuYWRkKGVudGl0eSwgY29uZmlnKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaFN1Y2Nlc3Moe1xuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBwYXlsb2FkOiBlbnRpdHksXG4gICAgICAgICAgc3VjY2Vzc01zZzogY29uZmlnICYmIGNvbmZpZy5zdWNjZXNzTXNnXG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlRXJyb3IobWV0aG9kLCBlcnJvciwgY29uZmlnICYmIGNvbmZpZy5lcnJvck1zZykpLFxuICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRlci5kaXNwYXRjaCh7XG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIHN0b3JlTmFtZTogdGhpcy5zdG9yZS5zdG9yZU5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICkgYXMgT2JzZXJ2YWJsZTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBVcGRhdGUgYW4gZW50aXR5IC0gQ3JlYXRlcyBhIFBVVC9QQVRDSCByZXF1ZXN0XG4gICAqXG4gICAqIHNlcnZpY2UudXBkYXRlKGlkLCBlbnRpdHkpXG4gICAqIHNlcnZpY2UudXBkYXRlKGlkLCBlbnRpdHksIGNvbmZpZylcbiAgICpcbiAgICovXG4gIHVwZGF0ZTxUPihcbiAgICBpZDogZ2V0SURUeXBlPFM+LFxuICAgIGVudGl0eTogUGFydGlhbDxnZXRFbnRpdHlUeXBlPFM+PixcbiAgICBjb25maWc/OiBIdHRwQ29uZmlnICYgeyBtZXRob2Q6IEh0dHBNZXRob2QuUFVUIHwgSHR0cE1ldGhvZC5QQVRDSCB9ICYgTXNnXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIGNvbnN0IG1ldGhvZCA9IGNvbmZpZyAmJiBjb25maWcubWV0aG9kID8gY29uZmlnLm1ldGhvZCA6IHRoaXMuZ2V0SHR0cE1ldGhvZChIdHRwTWV0aG9kLlBVVCk7XG5cbiAgICB0aGlzLmxvYWRlci5kaXNwYXRjaCh7XG4gICAgICBtZXRob2QsXG4gICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgZW50aXR5SWQ6IGlkLFxuICAgICAgc3RvcmVOYW1lOiB0aGlzLnN0b3JlLnN0b3JlTmFtZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFttZXRob2QudG9Mb2NhbGVMb3dlckNhc2UoKV0odGhpcy5yZXNvbHZlVXJsKGNvbmZpZywgaWQpLCBlbnRpdHksIGNvbmZpZykucGlwZShcbiAgICAgIG1hcFJlc3BvbnNlKGNvbmZpZyksXG4gICAgICB0YXAoZW50aXR5ID0+IHtcbiAgICAgICAgdGhpcy5zdG9yZS51cGRhdGUoaWQsIGVudGl0eSBhcyBhbnkpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoU3VjY2Vzcyh7XG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIHBheWxvYWQ6IGVudGl0eSxcbiAgICAgICAgICBzdWNjZXNzTXNnOiBjb25maWcgJiYgY29uZmlnLnN1Y2Nlc3NNc2dcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVFcnJvcihtZXRob2QsIGVycm9yLCBjb25maWcgJiYgY29uZmlnLmVycm9yTXNnKSksXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGVyLmRpc3BhdGNoKHtcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgZW50aXR5SWQ6IGlkLFxuICAgICAgICAgIHN0b3JlTmFtZTogdGhpcy5zdG9yZS5zdG9yZU5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICkgYXMgT2JzZXJ2YWJsZTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBEZWxldGUgYW4gZW50aXR5IC0gQ3JlYXRlcyBhIERFTEVURSByZXF1ZXN0XG4gICAqXG4gICAqIHNlcnZpY2UuZGVsZXRlKGlkKVxuICAgKiBzZXJ2aWNlLmRlbGV0ZShpZCwgY29uZmlnKVxuICAgKlxuICAgKi9cbiAgZGVsZXRlPFQ+KGlkOiBnZXRJRFR5cGU8Uz4sIGNvbmZpZz86IEh0dHBDb25maWcgJiBNc2cpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLmdldEh0dHBNZXRob2QoSHR0cE1ldGhvZC5ERUxFVEUpO1xuXG4gICAgdGhpcy5sb2FkZXIuZGlzcGF0Y2goe1xuICAgICAgbWV0aG9kLFxuICAgICAgbG9hZGluZzogdHJ1ZSxcbiAgICAgIGVudGl0eUlkOiBpZCxcbiAgICAgIHN0b3JlTmFtZTogdGhpcy5zdG9yZS5zdG9yZU5hbWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmh0dHBbbWV0aG9kLnRvTG93ZXJDYXNlKCldKHRoaXMucmVzb2x2ZVVybChjb25maWcsIGlkKSwgY29uZmlnKS5waXBlKFxuICAgICAgbWFwUmVzcG9uc2UoY29uZmlnKSxcbiAgICAgIHRhcChyZXMgPT4ge1xuICAgICAgICB0aGlzLnN0b3JlLnJlbW92ZShpZCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hTdWNjZXNzKHtcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgcGF5bG9hZDogcmVzLFxuICAgICAgICAgIHN1Y2Nlc3NNc2c6IGNvbmZpZyAmJiBjb25maWcuc3VjY2Vzc01zZ1xuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUVycm9yKG1ldGhvZCwgZXJyb3IsIGNvbmZpZyAmJiBjb25maWcuZXJyb3JNc2cpKSxcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkZXIuZGlzcGF0Y2goe1xuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBlbnRpdHlJZDogaWQsXG4gICAgICAgICAgc3RvcmVOYW1lOiB0aGlzLnN0b3JlLnN0b3JlTmFtZVxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKSBhcyBPYnNlcnZhYmxlPFQ+O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRIdHRwTWV0aG9kKHR5cGU6IEh0dHBNZXRob2QpIHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZWRDb25maWcuaHR0cE1ldGhvZHNbdHlwZV07XG4gIH1cblxuICBwcml2YXRlIGdldENvbmZpZ1ZhbHVlKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3Jba2V5XSB8fCB0aGlzLm1lcmdlZENvbmZpZ1trZXldO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlVXJsKGNvbmZpZzogSHR0cENvbmZpZywgaWQ/OiBhbnkpIHtcbiAgICBjb25zdCBjdXN0b21VcmwgPSAoY29uZmlnIHx8IHt9KS51cmw7XG4gICAgaWYgKGlzRGVmaW5lZChpZCkpIHtcbiAgICAgIHJldHVybiBjdXN0b21VcmwgfHwgYCR7dGhpcy5hcGl9LyR7aWR9YDtcbiAgICB9XG4gICAgcmV0dXJuIGN1c3RvbVVybCB8fCB0aGlzLmFwaTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IobWV0aG9kOiBIdHRwTWV0aG9kLCBlcnJvcjogYW55LCBlcnJvck1zZzogc3RyaW5nKSB7XG4gICAgdGhpcy5kaXNwYXRjaEVycm9yKHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIGVycm9yTXNnLFxuICAgICAgcGF5bG9hZDogZXJyb3JcbiAgICB9KTtcbiAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XG4gIH1cbn1cbiJdfQ==