UNPKG

angular-auth-oidc-client

Version:
151 lines 26.1 kB
import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { distinctUntilChanged } from 'rxjs/operators'; import { EventTypes } from '../public-events/event-types'; import * as i0 from "@angular/core"; import * as i1 from "../storage/storage-persistence.service"; import * as i2 from "../logging/logger.service"; import * as i3 from "../public-events/public-events.service"; import * as i4 from "../validation/token-validation.service"; const DEFAULT_AUTHRESULT = { isAuthenticated: false, allConfigsAuthenticated: [] }; export class AuthStateService { constructor(storagePersistenceService, loggerService, publicEventsService, tokenValidationService) { this.storagePersistenceService = storagePersistenceService; this.loggerService = loggerService; this.publicEventsService = publicEventsService; this.tokenValidationService = tokenValidationService; this.authenticatedInternal$ = new BehaviorSubject(DEFAULT_AUTHRESULT); } get authenticated$() { return this.authenticatedInternal$.asObservable().pipe(distinctUntilChanged()); } setAuthenticatedAndFireEvent(allConfigs) { const result = this.composeAuthenticatedResult(allConfigs); this.authenticatedInternal$.next(result); } setUnauthenticatedAndFireEvent(currentConfig, allConfigs) { this.storagePersistenceService.resetAuthStateInStorage(currentConfig); const result = this.composeUnAuthenticatedResult(allConfigs); this.authenticatedInternal$.next(result); } updateAndPublishAuthState(authenticationResult) { this.publicEventsService.fireEvent(EventTypes.NewAuthenticationResult, authenticationResult); } setAuthorizationData(accessToken, authResult, currentConfig, allConfigs) { this.loggerService.logDebug(currentConfig, `storing the accessToken '${accessToken}'`); this.storagePersistenceService.write('authzData', accessToken, currentConfig); this.persistAccessTokenExpirationTime(authResult, currentConfig); this.setAuthenticatedAndFireEvent(allConfigs); } getAccessToken(configuration) { if (!this.isAuthenticated(configuration)) { return null; } const token = this.storagePersistenceService.getAccessToken(configuration); return this.decodeURIComponentSafely(token); } getIdToken(configuration) { if (!this.isAuthenticated(configuration)) { return null; } const token = this.storagePersistenceService.getIdToken(configuration); return this.decodeURIComponentSafely(token); } getRefreshToken(configuration) { if (!this.isAuthenticated(configuration)) { return null; } const token = this.storagePersistenceService.getRefreshToken(configuration); return this.decodeURIComponentSafely(token); } getAuthenticationResult(configuration) { if (!this.isAuthenticated(configuration)) { return null; } return this.storagePersistenceService.getAuthenticationResult(configuration); } areAuthStorageTokensValid(configuration) { if (!this.isAuthenticated(configuration)) { return false; } if (this.hasIdTokenExpiredAndRenewCheckIsEnabled(configuration)) { this.loggerService.logDebug(configuration, 'persisted idToken is expired'); return false; } if (this.hasAccessTokenExpiredIfExpiryExists(configuration)) { this.loggerService.logDebug(configuration, 'persisted accessToken is expired'); return false; } this.loggerService.logDebug(configuration, 'persisted idToken and accessToken are valid'); return true; } hasIdTokenExpiredAndRenewCheckIsEnabled(configuration) { const { renewTimeBeforeTokenExpiresInSeconds, enableIdTokenExpiredValidationInRenew, disableIdTokenValidation } = configuration; if (!enableIdTokenExpiredValidationInRenew) { return false; } const tokenToCheck = this.storagePersistenceService.getIdToken(configuration); const idTokenExpired = this.tokenValidationService.hasIdTokenExpired(tokenToCheck, configuration, renewTimeBeforeTokenExpiresInSeconds, disableIdTokenValidation); if (idTokenExpired) { this.publicEventsService.fireEvent(EventTypes.IdTokenExpired, idTokenExpired); } return idTokenExpired; } hasAccessTokenExpiredIfExpiryExists(configuration) { const { renewTimeBeforeTokenExpiresInSeconds } = configuration; const accessTokenExpiresIn = this.storagePersistenceService.read('access_token_expires_at', configuration); const accessTokenHasNotExpired = this.tokenValidationService.validateAccessTokenNotExpired(accessTokenExpiresIn, configuration, renewTimeBeforeTokenExpiresInSeconds); const hasExpired = !accessTokenHasNotExpired; if (hasExpired) { this.publicEventsService.fireEvent(EventTypes.TokenExpired, hasExpired); } return hasExpired; } isAuthenticated(configuration) { const hasAccessToken = !!this.storagePersistenceService.getAccessToken(configuration); const hasIdToken = !!this.storagePersistenceService.getIdToken(configuration); return hasAccessToken && hasIdToken; } decodeURIComponentSafely(token) { if (token) { return decodeURIComponent(token); } else { return ''; } } persistAccessTokenExpirationTime(authResult, configuration) { if (authResult?.expires_in) { const accessTokenExpiryTime = new Date(new Date().toUTCString()).valueOf() + authResult.expires_in * 1000; this.storagePersistenceService.write('access_token_expires_at', accessTokenExpiryTime, configuration); } } composeAuthenticatedResult(allConfigs) { if (allConfigs.length === 1) { const { configId } = allConfigs[0]; return { isAuthenticated: true, allConfigsAuthenticated: [{ configId, isAuthenticated: true }] }; } return this.checkAllConfigsIfTheyAreAuthenticated(allConfigs); } composeUnAuthenticatedResult(allConfigs) { if (allConfigs.length === 1) { const { configId } = allConfigs[0]; return { isAuthenticated: false, allConfigsAuthenticated: [{ configId, isAuthenticated: false }] }; } return this.checkAllConfigsIfTheyAreAuthenticated(allConfigs); } checkAllConfigsIfTheyAreAuthenticated(allConfigs) { const allConfigsAuthenticated = allConfigs.map((config) => ({ configId: config.configId, isAuthenticated: this.isAuthenticated(config), })); const isAuthenticated = allConfigsAuthenticated.every((x) => !!x.isAuthenticated); return { allConfigsAuthenticated, isAuthenticated }; } } AuthStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: AuthStateService, deps: [{ token: i1.StoragePersistenceService }, { token: i2.LoggerService }, { token: i3.PublicEventsService }, { token: i4.TokenValidationService }], target: i0.ɵɵFactoryTarget.Injectable }); AuthStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: AuthStateService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: AuthStateService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.StoragePersistenceService }, { type: i2.LoggerService }, { type: i3.PublicEventsService }, { type: i4.TokenValidationService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1hdXRoLW9pZGMtY2xpZW50L3NyYy9saWIvYXV0aC1zdGF0ZS9hdXRoLXN0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSXRELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7O0FBTzFELE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLEVBQUUsRUFBRSxDQUFDO0FBR25GLE1BQU0sT0FBTyxnQkFBZ0I7SUFPM0IsWUFDbUIseUJBQW9ELEVBQ3BELGFBQTRCLEVBQzVCLG1CQUF3QyxFQUN4QyxzQkFBOEM7UUFIOUMsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEyQjtRQUNwRCxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFWaEQsMkJBQXNCLEdBQUcsSUFBSSxlQUFlLENBQXNCLGtCQUFrQixDQUFDLENBQUM7SUFXcEcsQ0FBQztJQVRKLElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFTRCw0QkFBNEIsQ0FBQyxVQUFpQztRQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFM0QsSUFBSSxD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fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBPcGVuSWRDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vY29uZmlnL29wZW5pZC1jb25maWd1cmF0aW9uJztcclxuaW1wb3J0IHsgQXV0aFJlc3VsdCB9IGZyb20gJy4uL2Zsb3dzL2NhbGxiYWNrLWNvbnRleHQnO1xyXG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vbG9nZ2luZy9sb2dnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEV2ZW50VHlwZXMgfSBmcm9tICcuLi9wdWJsaWMtZXZlbnRzL2V2ZW50LXR5cGVzJztcclxuaW1wb3J0IHsgUHVibGljRXZlbnRzU2VydmljZSB9IGZyb20gJy4uL3B1YmxpYy1ldmVudHMvcHVibGljLWV2ZW50cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVBlcnNpc3RlbmNlU2VydmljZSB9IGZyb20gJy4uL3N0b3JhZ2Uvc3RvcmFnZS1wZXJzaXN0ZW5jZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG9rZW5WYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uL3ZhbGlkYXRpb24vdG9rZW4tdmFsaWRhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXV0aGVudGljYXRlZFJlc3VsdCB9IGZyb20gJy4vYXV0aC1yZXN1bHQnO1xyXG5pbXBvcnQgeyBBdXRoU3RhdGVSZXN1bHQgfSBmcm9tICcuL2F1dGgtc3RhdGUnO1xyXG5cclxuY29uc3QgREVGQVVMVF9BVVRIUkVTVUxUID0geyBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlLCBhbGxDb25maWdzQXV0aGVudGljYXRlZDogW10gfTtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEF1dGhTdGF0ZVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0aGVudGljYXRlZEludGVybmFsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXV0aGVudGljYXRlZFJlc3VsdD4oREVGQVVMVF9BVVRIUkVTVUxUKTtcclxuXHJcbiAgZ2V0IGF1dGhlbnRpY2F0ZWQkKCk6IE9ic2VydmFibGU8QXV0aGVudGljYXRlZFJlc3VsdD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXV0aGVudGljYXRlZEludGVybmFsJC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2U6IFN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlclNlcnZpY2U6IExvZ2dlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHB1YmxpY0V2ZW50c1NlcnZpY2U6IFB1YmxpY0V2ZW50c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRva2VuVmFsaWRhdGlvblNlcnZpY2U6IFRva2VuVmFsaWRhdGlvblNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIHNldEF1dGhlbnRpY2F0ZWRBbmRGaXJlRXZlbnQoYWxsQ29uZmlnczogT3BlbklkQ29uZmlndXJhdGlvbltdKTogdm9pZCB7XHJcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbXBvc2VBdXRoZW50aWNhdGVkUmVzdWx0KGFsbENvbmZpZ3MpO1xyXG5cclxuICAgIHRoaXMuYXV0aGVudGljYXRlZEludGVybmFsJC5uZXh0KHJlc3VsdCk7XHJcbiAgfVxyXG5cclxuICBzZXRVbmF1dGhlbnRpY2F0ZWRBbmRGaXJlRXZlbnQoY3VycmVudENvbmZpZzogT3BlbklkQ29uZmlndXJhdGlvbiwgYWxsQ29uZmlnczogT3BlbklkQ29uZmlndXJhdGlvbltdKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2UucmVzZXRBdXRoU3RhdGVJblN0b3JhZ2UoY3VycmVudENvbmZpZyk7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb21wb3NlVW5BdXRoZW50aWNhdGVkUmVzdWx0KGFsbENvbmZpZ3MpO1xyXG5cclxuICAgIHRoaXMuYXV0aGVudGljYXRlZEludGVybmFsJC5uZXh0KHJlc3VsdCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVBbmRQdWJsaXNoQXV0aFN0YXRlKGF1dGhlbnRpY2F0aW9uUmVzdWx0OiBBdXRoU3RhdGVSZXN1bHQpOiB2b2lkIHtcclxuICAgIHRoaXMucHVibGljRXZlbnRzU2VydmljZS5maXJlRXZlbnQ8QXV0aFN0YXRlUmVzdWx0PihFdmVudFR5cGVzLk5ld0F1dGhlbnRpY2F0aW9uUmVzdWx0LCBhdXRoZW50aWNhdGlvblJlc3VsdCk7XHJcbiAgfVxyXG5cclxuICBzZXRBdXRob3JpemF0aW9uRGF0YShcclxuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmcsXHJcbiAgICBhdXRoUmVzdWx0OiBBdXRoUmVzdWx0LFxyXG4gICAgY3VycmVudENvbmZpZzogT3BlbklkQ29uZmlndXJhdGlvbixcclxuICAgIGFsbENvbmZpZ3M6IE9wZW5JZENvbmZpZ3VyYXRpb25bXVxyXG4gICk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKGN1cnJlbnRDb25maWcsIGBzdG9yaW5nIHRoZSBhY2Nlc3NUb2tlbiAnJHthY2Nlc3NUb2tlbn0nYCk7XHJcblxyXG4gICAgdGhpcy5zdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlLndyaXRlKCdhdXRoekRhdGEnLCBhY2Nlc3NUb2tlbiwgY3VycmVudENvbmZpZyk7XHJcbiAgICB0aGlzLnBlcnNpc3RBY2Nlc3NUb2tlbkV4cGlyYXRpb25UaW1lKGF1dGhSZXN1bHQsIGN1cnJlbnRDb25maWcpO1xyXG4gICAgdGhpcy5zZXRBdXRoZW50aWNhdGVkQW5kRmlyZUV2ZW50KGFsbENvbmZpZ3MpO1xyXG4gIH1cclxuXHJcbiAgZ2V0QWNjZXNzVG9rZW4oY29uZmlndXJhdGlvbjogT3BlbklkQ29uZmlndXJhdGlvbik6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuaXNBdXRoZW50aWNhdGVkKGNvbmZpZ3VyYXRpb24pKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRva2VuID0gdGhpcy5zdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlLmdldEFjY2Vzc1Rva2VuKGNvbmZpZ3VyYXRpb24pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmRlY29kZVVSSUNvbXBvbmVudFNhZmVseSh0b2tlbik7XHJcbiAgfVxyXG5cclxuICBnZXRJZFRva2VuKGNvbmZpZ3VyYXRpb246IE9wZW5JZENvbmZpZ3VyYXRpb24pOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmlzQXV0aGVudGljYXRlZChjb25maWd1cmF0aW9uKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuc3RvcmFnZVBlcnNpc3RlbmNlU2VydmljZS5nZXRJZFRva2VuKGNvbmZpZ3VyYXRpb24pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmRlY29kZVVSSUNvbXBvbmVudFNhZmVseSh0b2tlbik7XHJcbiAgfVxyXG5cclxuICBnZXRSZWZyZXNoVG9rZW4oY29uZmlndXJhdGlvbjogT3BlbklkQ29uZmlndXJhdGlvbik6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuaXNBdXRoZW50aWNhdGVkKGNvbmZpZ3VyYXRpb24pKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRva2VuID0gdGhpcy5zdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlLmdldFJlZnJlc2hUb2tlbihjb25maWd1cmF0aW9uKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5kZWNvZGVVUklDb21wb25lbnRTYWZlbHkodG9rZW4pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QXV0aGVudGljYXRpb25SZXN1bHQoY29uZmlndXJhdGlvbjogT3BlbklkQ29uZmlndXJhdGlvbik6IGFueSB7XHJcbiAgICBpZiAoIXRoaXMuaXNBdXRoZW50aWNhdGVkKGNvbmZpZ3VyYXRpb24pKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2UuZ2V0QXV0aGVudGljYXRpb25SZXN1bHQoY29uZmlndXJhdGlvbik7XHJcbiAgfVxyXG5cclxuICBhcmVBdXRoU3RvcmFnZVRva2Vuc1ZhbGlkKGNvbmZpZ3VyYXRpb246IE9wZW5JZENvbmZpZ3VyYXRpb24pOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5pc0F1dGhlbnRpY2F0ZWQoY29uZmlndXJhdGlvbikpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmhhc0lkVG9rZW5FeHBpcmVkQW5kUmVuZXdDaGVja0lzRW5hYmxlZChjb25maWd1cmF0aW9uKSkge1xyXG4gICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nRGVidWcoY29uZmlndXJhdGlvbiwgJ3BlcnNpc3RlZCBpZFRva2VuIGlzIGV4cGlyZWQnKTtcclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5oYXNBY2Nlc3NUb2tlbkV4cGlyZWRJZkV4cGlyeUV4aXN0cyhjb25maWd1cmF0aW9uKSkge1xyXG4gICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nRGVidWcoY29uZmlndXJhdGlvbiwgJ3BlcnNpc3RlZCBhY2Nlc3NUb2tlbiBpcyBleHBpcmVkJyk7XHJcblxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKGNvbmZpZ3VyYXRpb24sICdwZXJzaXN0ZWQgaWRUb2tlbiBhbmQgYWNjZXNzVG9rZW4gYXJlIHZhbGlkJyk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBoYXNJZFRva2VuRXhwaXJlZEFuZFJlbmV3Q2hlY2tJc0VuYWJsZWQoY29uZmlndXJhdGlvbjogT3BlbklkQ29uZmlndXJhdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgeyByZW5ld1RpbWVCZWZvcmVUb2tlbkV4cGlyZXNJblNlY29uZHMsIGVuYWJsZUlkVG9rZW5FeHBpcmVkVmFsaWRhdGlvbkluUmVuZXcsIGRpc2FibGVJZFRva2VuVmFsaWRhdGlvbiB9ID0gY29uZmlndXJhdGlvbjtcclxuXHJcbiAgICBpZiAoIWVuYWJsZUlkVG9rZW5FeHBpcmVkVmFsaWRhdGlvbkluUmVuZXcpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdG9rZW5Ub0NoZWNrID0gdGhpcy5zdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlLmdldElkVG9rZW4oY29uZmlndXJhdGlvbik7XHJcblxyXG4gICAgY29uc3QgaWRUb2tlbkV4cGlyZWQgPSB0aGlzLnRva2VuVmFsaWRhdGlvblNlcnZpY2UuaGFzSWRUb2tlbkV4cGlyZWQodG9rZW5Ub0NoZWNrLCBjb25maWd1cmF0aW9uLCByZW5ld1RpbWVCZWZvcmVUb2tlbkV4cGlyZXNJblNlY29uZHMsIGRpc2FibGVJZFRva2VuVmFsaWRhdGlvbik7XHJcblxyXG4gICAgaWYgKGlkVG9rZW5FeHBpcmVkKSB7XHJcbiAgICAgIHRoaXMucHVibGljRXZlbnRzU2VydmljZS5maXJlRXZlbnQ8Ym9vbGVhbj4oRXZlbnRUeXBlcy5JZFRva2VuRXhwaXJlZCwgaWRUb2tlbkV4cGlyZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpZFRva2VuRXhwaXJlZDtcclxuICB9XHJcblxyXG4gIGhhc0FjY2Vzc1Rva2VuRXhwaXJlZElmRXhwaXJ5RXhpc3RzKGNvbmZpZ3VyYXRpb246IE9wZW5JZENvbmZpZ3VyYXRpb24pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHsgcmVuZXdUaW1lQmVmb3JlVG9rZW5FeHBpcmVzSW5TZWNvbmRzIH0gPSBjb25maWd1cmF0aW9uO1xyXG4gICAgY29uc3QgYWNjZXNzVG9rZW5FeHBpcmVzSW4gPSB0aGlzLnN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2UucmVhZCgnYWNjZXNzX3Rva2VuX2V4cGlyZXNfYXQnLCBjb25maWd1cmF0aW9uKTtcclxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuSGFzTm90RXhwaXJlZCA9IHRoaXMudG9rZW5WYWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFjY2Vzc1Rva2VuTm90RXhwaXJlZChcclxuICAgICAgYWNjZXNzVG9rZW5FeHBpcmVzSW4sXHJcbiAgICAgIGNvbmZpZ3VyYXRpb24sXHJcbiAgICAgIHJlbmV3VGltZUJlZm9yZVRva2VuRXhwaXJlc0luU2Vjb25kc1xyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBoYXNFeHBpcmVkID0gIWFjY2Vzc1Rva2VuSGFzTm90RXhwaXJlZDtcclxuXHJcbiAgICBpZiAoaGFzRXhwaXJlZCkge1xyXG4gICAgICB0aGlzLnB1YmxpY0V2ZW50c1NlcnZpY2UuZmlyZUV2ZW50PGJvb2xlYW4+KEV2ZW50VHlwZXMuVG9rZW5FeHBpcmVkLCBoYXNFeHBpcmVkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaGFzRXhwaXJlZDtcclxuICB9XHJcblxyXG4gIGlzQXV0aGVudGljYXRlZChjb25maWd1cmF0aW9uOiBPcGVuSWRDb25maWd1cmF0aW9uKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBoYXNBY2Nlc3NUb2tlbiA9ICEhdGhpcy5zdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlLmdldEFjY2Vzc1Rva2VuKGNvbmZpZ3VyYXRpb24pO1xyXG4gICAgY29uc3QgaGFzSWRUb2tlbiA9ICEhdGhpcy5zdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlLmdldElkVG9rZW4oY29uZmlndXJhdGlvbik7XHJcblxyXG4gICAgcmV0dXJuIGhhc0FjY2Vzc1Rva2VuICYmIGhhc0lkVG9rZW47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlY29kZVVSSUNvbXBvbmVudFNhZmVseSh0b2tlbjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICh0b2tlbikge1xyXG4gICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHRva2VuKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGVyc2lzdEFjY2Vzc1Rva2VuRXhwaXJhdGlvblRpbWUoYXV0aFJlc3VsdDogYW55LCBjb25maWd1cmF0aW9uOiBPcGVuSWRDb25maWd1cmF0aW9uKTogdm9pZCB7XHJcbiAgICBpZiAoYXV0aFJlc3VsdD8uZXhwaXJlc19pbikge1xyXG4gICAgICBjb25zdCBhY2Nlc3NUb2tlbkV4cGlyeVRpbWUgPSBuZXcgRGF0ZShuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCkpLnZhbHVlT2YoKSArIGF1dGhSZXN1bHQuZXhwaXJlc19pbiAqIDEwMDA7XHJcblxyXG4gICAgICB0aGlzLnN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2Uud3JpdGUoJ2FjY2Vzc190b2tlbl9leHBpcmVzX2F0JywgYWNjZXNzVG9rZW5FeHBpcnlUaW1lLCBjb25maWd1cmF0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tcG9zZUF1dGhlbnRpY2F0ZWRSZXN1bHQoYWxsQ29uZmlnczogT3BlbklkQ29uZmlndXJhdGlvbltdKTogQXV0aGVudGljYXRlZFJlc3VsdCB7XHJcbiAgICBpZiAoYWxsQ29uZmlncy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgY29uc3QgeyBjb25maWdJZCB9ID0gYWxsQ29uZmlnc1swXTtcclxuXHJcbiAgICAgIHJldHVybiB7IGlzQXV0aGVudGljYXRlZDogdHJ1ZSwgYWxsQ29uZmlnc0F1dGhlbnRpY2F0ZWQ6IFt7IGNvbmZpZ0lkLCBpc0F1dGhlbnRpY2F0ZWQ6IHRydWUgfV0gfTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5jaGVja0FsbENvbmZpZ3NJZlRoZXlBcmVBdXRoZW50aWNhdGVkKGFsbENvbmZpZ3MpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wb3NlVW5BdXRoZW50aWNhdGVkUmVzdWx0KGFsbENvbmZpZ3M6IE9wZW5JZENvbmZpZ3VyYXRpb25bXSk6IEF1dGhlbnRpY2F0ZWRSZXN1bHQge1xyXG4gICAgaWYgKGFsbENvbmZpZ3MubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIGNvbnN0IHsgY29uZmlnSWQgfSA9IGFsbENvbmZpZ3NbMF07XHJcblxyXG4gICAgICByZXR1cm4geyBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlLCBhbGxDb25maWdzQXV0aGVudGljYXRlZDogW3sgY29uZmlnSWQsIGlzQXV0aGVudGljYXRlZDogZmFsc2UgfV0gfTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5jaGVja0FsbENvbmZpZ3NJZlRoZXlBcmVBdXRoZW50aWNhdGVkKGFsbENvbmZpZ3MpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0FsbENvbmZpZ3NJZlRoZXlBcmVBdXRoZW50aWNhdGVkKGFsbENvbmZpZ3M6IE9wZW5JZENvbmZpZ3VyYXRpb25bXSk6IEF1dGhlbnRpY2F0ZWRSZXN1bHQge1xyXG4gICAgY29uc3QgYWxsQ29uZmlnc0F1dGhlbnRpY2F0ZWQgPSBhbGxDb25maWdzLm1hcCgoY29uZmlnKSA9PiAoe1xyXG4gICAgICBjb25maWdJZDogY29uZmlnLmNvbmZpZ0lkLFxyXG4gICAgICBpc0F1dGhlbnRpY2F0ZWQ6IHRoaXMuaXNBdXRoZW50aWNhdGVkKGNvbmZpZyksXHJcbiAgICB9KSk7XHJcblxyXG4gICAgY29uc3QgaXNBdXRoZW50aWNhdGVkID0gYWxsQ29uZmlnc0F1dGhlbnRpY2F0ZWQuZXZlcnkoKHgpID0+ICEheC5pc0F1dGhlbnRpY2F0ZWQpO1xyXG5cclxuICAgIHJldHVybiB7IGFsbENvbmZpZ3NBdXRoZW50aWNhdGVkLCBpc0F1dGhlbnRpY2F0ZWQgfTtcclxuICB9XHJcbn1cclxuIl19