@datorama/akita
Version:
State Management Tailored-Made for JS Applications
474 lines • 33.7 kB
JavaScript
/**
* @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==