angular-auth-oidc-client
Version:
Angular Lib for OpenID Connect & OAuth2
151 lines • 26.1 kB
JavaScript
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