@dangl/angular-dangl-identity-client 6.2.0-beta0010 → 6.2.1-beta0010
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/api-client.d.ts +178 -178
- package/dangl-identity.module.d.ts +6 -7
- package/{esm2020 → esm2022}/api-client.mjs +551 -551
- package/{esm2020 → esm2022}/dangl-angular-dangl-identity-client.mjs +4 -4
- package/esm2022/dangl-identity.module.mjs +30 -0
- package/{esm2020 → esm2022}/interceptors/dangl-identity-request-validator.mjs +1 -1
- package/{esm2020 → esm2022}/interceptors/jwt-interceptor.service.mjs +47 -47
- package/esm2022/messengers/authentication.messenger.mjs +170 -0
- package/{esm2020 → esm2022}/models/jwt-storage.mjs +1 -1
- package/{esm2020 → esm2022}/models/user-info.mjs +1 -1
- package/{esm2020 → esm2022}/public_api.mjs +11 -11
- package/{esm2020 → esm2022}/services/authentication.service.mjs +39 -39
- package/{esm2020 → esm2022}/services/jwt-token.service.mjs +101 -101
- package/{fesm2020 → fesm2022}/dangl-angular-dangl-identity-client.mjs +905 -873
- package/fesm2022/dangl-angular-dangl-identity-client.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/interceptors/dangl-identity-request-validator.d.ts +4 -4
- package/interceptors/jwt-interceptor.service.d.ts +16 -16
- package/messengers/authentication.messenger.d.ts +28 -26
- package/models/jwt-storage.d.ts +5 -5
- package/models/user-info.d.ts +11 -11
- package/package.json +7 -13
- package/public_api.d.ts +8 -8
- package/services/authentication.service.d.ts +14 -14
- package/services/jwt-token.service.d.ts +28 -28
- package/esm2020/dangl-identity.module.mjs +0 -29
- package/esm2020/messengers/authentication.messenger.mjs +0 -146
- package/fesm2015/dangl-angular-dangl-identity-client.mjs +0 -896
- package/fesm2015/dangl-angular-dangl-identity-client.mjs.map +0 -1
- package/fesm2020/dangl-angular-dangl-identity-client.mjs.map +0 -1
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { ReplaySubject, Subject } from 'rxjs';
|
|
3
|
-
import { JwtHelperService } from '@auth0/angular-jwt';
|
|
4
|
-
import { takeUntil } from 'rxjs/operators';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "../services/jwt-token.service";
|
|
7
|
-
import * as i2 from "../api-client";
|
|
8
|
-
export class AuthenticationMessenger {
|
|
9
|
-
constructor(jwtTokenService, danglIdentityClient) {
|
|
10
|
-
this.jwtTokenService = jwtTokenService;
|
|
11
|
-
this.danglIdentityClient = danglIdentityClient;
|
|
12
|
-
this.jwtHelperService = new JwtHelperService();
|
|
13
|
-
this.$destroyed = new Subject();
|
|
14
|
-
this.isAuthenticated = new ReplaySubject(1);
|
|
15
|
-
this.username = new ReplaySubject(1);
|
|
16
|
-
this.email = new ReplaySubject(1);
|
|
17
|
-
this.identiconId = new ReplaySubject(1);
|
|
18
|
-
this.userInfo = new ReplaySubject(1);
|
|
19
|
-
this.tokenRefreshStarted = new Subject();
|
|
20
|
-
this.tokenRefreshFinished = new Subject();
|
|
21
|
-
jwtTokenService.tokenRefreshStarted
|
|
22
|
-
.pipe(takeUntil(this.$destroyed))
|
|
23
|
-
.subscribe(() => this.tokenRefreshStarted.next());
|
|
24
|
-
jwtTokenService.tokenRefreshFinished
|
|
25
|
-
.pipe(takeUntil(this.$destroyed))
|
|
26
|
-
.subscribe((successfulRefresh) => this.tokenRefreshFinished.next(successfulRefresh));
|
|
27
|
-
jwtTokenService.tokenStored
|
|
28
|
-
.pipe(takeUntil(this.$destroyed))
|
|
29
|
-
.subscribe((jwtToken) => this.refreshAuthenticationStatus(jwtToken));
|
|
30
|
-
jwtTokenService
|
|
31
|
-
.getToken()
|
|
32
|
-
.subscribe((token) => this.refreshAuthenticationStatus(token));
|
|
33
|
-
}
|
|
34
|
-
ngOnDestroy() {
|
|
35
|
-
this.isAuthenticated.complete();
|
|
36
|
-
this.username.complete();
|
|
37
|
-
this.email.complete();
|
|
38
|
-
this.identiconId.complete();
|
|
39
|
-
this.userInfo.complete();
|
|
40
|
-
this.tokenRefreshStarted.complete();
|
|
41
|
-
this.tokenRefreshFinished.complete();
|
|
42
|
-
this.$destroyed.next();
|
|
43
|
-
this.$destroyed.complete();
|
|
44
|
-
}
|
|
45
|
-
refreshUserInfoFromServer() {
|
|
46
|
-
this.danglIdentityClient.getUserInfo().subscribe({
|
|
47
|
-
next: (serverUserInfo) => {
|
|
48
|
-
if (serverUserInfo.userIsAuthenticated) {
|
|
49
|
-
const userInfo = {
|
|
50
|
-
deserializedToken: null,
|
|
51
|
-
email: serverUserInfo.currentUserEmail,
|
|
52
|
-
id: serverUserInfo.currentUserId,
|
|
53
|
-
identiconId: serverUserInfo.currentUserIdenticonId,
|
|
54
|
-
roles: [],
|
|
55
|
-
claims: {},
|
|
56
|
-
username: serverUserInfo.currentUserName,
|
|
57
|
-
};
|
|
58
|
-
serverUserInfo.userClaims.forEach((claim) => {
|
|
59
|
-
if (claim.type === 'role') {
|
|
60
|
-
userInfo.roles.push(claim.value);
|
|
61
|
-
}
|
|
62
|
-
else if (userInfo.claims[claim.type] === undefined) {
|
|
63
|
-
userInfo.claims[claim.type] = [claim.value];
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
userInfo.claims[claim.type].push(claim.value);
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
this.isAuthenticated.next(true);
|
|
70
|
-
this.username.next(serverUserInfo.currentUserName);
|
|
71
|
-
this.email.next(serverUserInfo.currentUserEmail);
|
|
72
|
-
this.identiconId.next(serverUserInfo.currentUserIdenticonId);
|
|
73
|
-
this.userInfo.next(userInfo);
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
this.isAuthenticated.next(false);
|
|
77
|
-
this.username.next(null);
|
|
78
|
-
this.email.next(null);
|
|
79
|
-
this.identiconId.next(null);
|
|
80
|
-
this.userInfo.next(null);
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
refreshAuthenticationStatus(jwtToken) {
|
|
86
|
-
if (jwtToken) {
|
|
87
|
-
const isValidToken = jwtToken.expiresAt > new Date().getTime() / 1000;
|
|
88
|
-
if (this.lastBroadcastAccessToken === jwtToken.accessToken) {
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
this.lastBroadcastAccessToken = jwtToken.accessToken;
|
|
92
|
-
if (isValidToken) {
|
|
93
|
-
this.isAuthenticated.next(true);
|
|
94
|
-
const decodedToken = this.jwtHelperService.decodeToken(jwtToken.accessToken);
|
|
95
|
-
this.username.next(decodedToken['name']);
|
|
96
|
-
this.email.next(decodedToken['email']);
|
|
97
|
-
this.identiconId.next(decodedToken['identicon_id']);
|
|
98
|
-
const tokenClaims = {};
|
|
99
|
-
for (const tokenProp in decodedToken) {
|
|
100
|
-
if (decodedToken.hasOwnProperty(tokenProp)) {
|
|
101
|
-
const property = decodedToken[tokenProp];
|
|
102
|
-
if (typeof property === 'string') {
|
|
103
|
-
if (tokenClaims[tokenProp] === undefined) {
|
|
104
|
-
tokenClaims[tokenProp] = [];
|
|
105
|
-
}
|
|
106
|
-
tokenClaims[tokenProp].push(property);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
this.userInfo.next({
|
|
111
|
-
id: decodedToken['sub'],
|
|
112
|
-
claims: tokenClaims,
|
|
113
|
-
deserializedToken: decodedToken,
|
|
114
|
-
email: decodedToken['email'],
|
|
115
|
-
identiconId: decodedToken['identicon_id'],
|
|
116
|
-
username: decodedToken['name'],
|
|
117
|
-
roles: decodedToken['role'],
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
this.isAuthenticated.next(false);
|
|
122
|
-
this.jwtTokenService.refreshToken().subscribe(() => { });
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
if (this.lastBroadcastAccessToken === null) {
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
this.lastBroadcastAccessToken = null;
|
|
130
|
-
this.isAuthenticated.next(false);
|
|
131
|
-
this.username.next(null);
|
|
132
|
-
this.email.next(null);
|
|
133
|
-
this.identiconId.next(null);
|
|
134
|
-
this.userInfo.next(null);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
AuthenticationMessenger.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: AuthenticationMessenger, deps: [{ token: i1.JwtTokenService }, { token: i2.DanglIdentityClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
139
|
-
AuthenticationMessenger.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: AuthenticationMessenger, providedIn: 'root' });
|
|
140
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: AuthenticationMessenger, decorators: [{
|
|
141
|
-
type: Injectable,
|
|
142
|
-
args: [{
|
|
143
|
-
providedIn: 'root',
|
|
144
|
-
}]
|
|
145
|
-
}], ctorParameters: function () { return [{ type: i1.JwtTokenService }, { type: i2.DanglIdentityClient }]; } });
|
|
146
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24ubWVzc2VuZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1kYW5nbC1pZGVudGl0eS1jbGllbnQvc3JjL21lc3NlbmdlcnMvYXV0aGVudGljYXRpb24ubWVzc2VuZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBSzNDLE1BQU0sT0FBTyx1QkFBdUI7SUFhbEMsWUFDVSxlQUFnQyxFQUNoQyxtQkFBd0M7UUFEeEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFkMUMscUJBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBRTFDLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRTFCLG9CQUFlLEdBQUcsSUFBSSxhQUFhLENBQVUsQ0FBQyxDQUFDLENBQUM7UUFDaEQsYUFBUSxHQUFHLElBQUksYUFBYSxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLFVBQUssR0FBRyxJQUFJLGFBQWEsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUNyQyxnQkFBVyxHQUFHLElBQUksYUFBYSxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzNDLGFBQVEsR0FBRyxJQUFJLGFBQWEsQ0FBVyxDQUFDLENBQUMsQ0FBQztRQUMxQyx3QkFBbUIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLHlCQUFvQixHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFNckQsZUFBZSxDQUFDLG1CQUFtQjth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WSxDQUFDLE1BQU0sQ0FBQztpQkFDNUIsQ0FBQyxDQUFDO2FBQ0o7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3pEO1NBQ0Y7YUFBTTtZQUNMLElBQUksSUFBSSxDQUFDLHdCQUF3QixLQUFLLElBQUksRUFBRTtnQkFDMUMsT0FBTzthQUNSO1lBQ0QsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztZQUNyQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMxQjtJQUNILENBQUM7O29IQTdJVSx1QkFBdUI7d0hBQXZCLHVCQUF1QixjQUZ0QixNQUFNOzJGQUVQLHVCQUF1QjtrQkFIbkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgRGFuZ2xJZGVudGl0eUNsaWVudCB9IGZyb20gJy4uL2FwaS1jbGllbnQnO1xyXG5pbXBvcnQgeyBKd3RIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnQGF1dGgwL2FuZ3VsYXItand0JztcclxuaW1wb3J0IHsgSnd0U3RvcmFnZSB9IGZyb20gJy4uL21vZGVscy9qd3Qtc3RvcmFnZSc7XHJcbmltcG9ydCB7IEp3dFRva2VuU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2p3dC10b2tlbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXNlckluZm8gfSBmcm9tICcuLi9tb2RlbHMvdXNlci1pbmZvJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0aW9uTWVzc2VuZ2VyIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICBwcml2YXRlIGp3dEhlbHBlclNlcnZpY2UgPSBuZXcgSnd0SGVscGVyU2VydmljZSgpO1xyXG4gIHByaXZhdGUgbGFzdEJyb2FkY2FzdEFjY2Vzc1Rva2VuOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSAkZGVzdHJveWVkID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgcmVhZG9ubHkgaXNBdXRoZW50aWNhdGVkID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XHJcbiAgcmVhZG9ubHkgdXNlcm5hbWUgPSBuZXcgUmVwbGF5U3ViamVjdDxzdHJpbmc+KDEpO1xyXG4gIHJlYWRvbmx5IGVtYWlsID0gbmV3IFJlcGxheVN1YmplY3Q8c3RyaW5nPigxKTtcclxuICByZWFkb25seSBpZGVudGljb25JZCA9IG5ldyBSZXBsYXlTdWJqZWN0PHN0cmluZz4oMSk7XHJcbiAgcmVhZG9ubHkgdXNlckluZm8gPSBuZXcgUmVwbGF5U3ViamVjdDxVc2VySW5mbz4oMSk7XHJcbiAgcmVhZG9ubHkgdG9rZW5SZWZyZXNoU3RhcnRlZCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcmVhZG9ubHkgdG9rZW5SZWZyZXNoRmluaXNoZWQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgand0VG9rZW5TZXJ2aWNlOiBKd3RUb2tlblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRhbmdsSWRlbnRpdHlDbGllbnQ6IERhbmdsSWRlbnRpdHlDbGllbnRcclxuICApIHtcclxuICAgIGp3dFRva2VuU2VydmljZS50b2tlblJlZnJlc2hTdGFydGVkXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiRkZXN0cm95ZWQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMudG9rZW5SZWZyZXNoU3RhcnRlZC5uZXh0KCkpO1xyXG5cclxuICAgIGp3dFRva2VuU2VydmljZS50b2tlblJlZnJlc2hGaW5pc2hlZFxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4kZGVzdHJveWVkKSlcclxuICAgICAgLnN1YnNjcmliZSgoc3VjY2Vzc2Z1bFJlZnJlc2gpID0+XHJcbiAgICAgICAgdGhpcy50b2tlblJlZnJlc2hGaW5pc2hlZC5uZXh0KHN1Y2Nlc3NmdWxSZWZyZXNoKVxyXG4gICAgICApO1xyXG5cclxuICAgIGp3dFRva2VuU2VydmljZS50b2tlblN0b3JlZFxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4kZGVzdHJveWVkKSlcclxuICAgICAgLnN1YnNjcmliZSgoand0VG9rZW4pID0+IHRoaXMucmVmcmVzaEF1dGhlbnRpY2F0aW9uU3RhdHVzKGp3dFRva2VuKSk7XHJcblxyXG4gICAgand0VG9rZW5TZXJ2aWNlXHJcbiAgICAgIC5nZXRUb2tlbigpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHRva2VuKSA9PiB0aGlzLnJlZnJlc2hBdXRoZW50aWNhdGlvblN0YXR1cyh0b2tlbikpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzQXV0aGVudGljYXRlZC5jb21wbGV0ZSgpO1xyXG4gICAgdGhpcy51c2VybmFtZS5jb21wbGV0ZSgpO1xyXG4gICAgdGhpcy5lbWFpbC5jb21wbGV0ZSgpO1xyXG4gICAgdGhpcy5pZGVudGljb25JZC5jb21wbGV0ZSgpO1xyXG4gICAgdGhpcy51c2VySW5mby5jb21wbGV0ZSgpO1xyXG4gICAgdGhpcy50b2tlblJlZnJlc2hTdGFydGVkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLnRva2VuUmVmcmVzaEZpbmlzaGVkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLiRkZXN0cm95ZWQubmV4dCgpO1xyXG4gICAgdGhpcy4kZGVzdHJveWVkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoVXNlckluZm9Gcm9tU2VydmVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYW5nbElkZW50aXR5Q2xpZW50LmdldFVzZXJJbmZvKCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHNlcnZlclVzZXJJbmZvKSA9PiB7XHJcbiAgICAgICAgaWYgKHNlcnZlclVzZXJJbmZvLnVzZXJJc0F1dGhlbnRpY2F0ZWQpIHtcclxuICAgICAgICAgIGNvbnN0IHVzZXJJbmZvOiBVc2VySW5mbyA9IHtcclxuICAgICAgICAgICAgZGVzZXJpYWxpemVkVG9rZW46IG51bGwsXHJcbiAgICAgICAgICAgIGVtYWlsOiBzZXJ2ZXJVc2VySW5mby5jdXJyZW50VXNlckVtYWlsLFxyXG4gICAgICAgICAgICBpZDogc2VydmVyVXNlckluZm8uY3VycmVudFVzZXJJZCxcclxuICAgICAgICAgICAgaWRlbnRpY29uSWQ6IHNlcnZlclVzZXJJbmZvLmN1cnJlbnRVc2VySWRlbnRpY29uSWQsXHJcbiAgICAgICAgICAgIHJvbGVzOiBbXSxcclxuICAgICAgICAgICAgY2xhaW1zOiB7fSxcclxuICAgICAgICAgICAgdXNlcm5hbWU6IHNlcnZlclVzZXJJbmZvLmN1cnJlbnRVc2VyTmFtZSxcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgc2VydmVyVXNlckluZm8udXNlckNsYWltcy5mb3JFYWNoKChjbGFpbSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY2xhaW0udHlwZSA9PT0gJ3JvbGUnKSB7XHJcbiAgICAgICAgICAgICAgdXNlckluZm8ucm9sZXMucHVzaChjbGFpbS52YWx1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodXNlckluZm8uY2xhaW1zW2NsYWltLnR5cGVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICB1c2VySW5mby5jbGFpbXNbY2xhaW0udHlwZV0gPSBbY2xhaW0udmFsdWVdO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHVzZXJJbmZvLmNsYWltc1tjbGFpbS50eXBlXS5wdXNoKGNsYWltLnZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLmlzQXV0aGVudGljYXRlZC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgdGhpcy51c2VybmFtZS5uZXh0KHNlcnZlclVzZXJJbmZvLmN1cnJlbnRVc2VyTmFtZSk7XHJcbiAgICAgICAgICB0aGlzLmVtYWlsLm5leHQoc2VydmVyVXNlckluZm8uY3VycmVudFVzZXJFbWFpbCk7XHJcbiAgICAgICAgICB0aGlzLmlkZW50aWNvbklkLm5leHQoc2VydmVyVXNlckluZm8uY3VycmVudFVzZXJJZGVudGljb25JZCk7XHJcbiAgICAgICAgICB0aGlzLnVzZXJJbmZvLm5leHQodXNlckluZm8pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmlzQXV0aGVudGljYXRlZC5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMudXNlcm5hbWUubmV4dChudWxsKTtcclxuICAgICAgICAgIHRoaXMuZW1haWwubmV4dChudWxsKTtcclxuICAgICAgICAgIHRoaXMuaWRlbnRpY29uSWQubmV4dChudWxsKTtcclxuICAgICAgICAgIHRoaXMudXNlckluZm8ubmV4dChudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaEF1dGhlbnRpY2F0aW9uU3RhdHVzKGp3dFRva2VuPzogSnd0U3RvcmFnZSkge1xyXG4gICAgaWYgKGp3dFRva2VuKSB7XHJcbiAgICAgIGNvbnN0IGlzVmFsaWRUb2tlbiA9IGp3dFRva2VuLmV4cGlyZXNBdCA+IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMDtcclxuICAgICAgaWYgKHRoaXMubGFzdEJyb2FkY2FzdEFjY2Vzc1Rva2VuID09PSBqd3RUb2tlbi5hY2Nlc3NUb2tlbikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmxhc3RCcm9hZGNhc3RBY2Nlc3NUb2tlbiA9IGp3dFRva2VuLmFjY2Vzc1Rva2VuO1xyXG4gICAgICBpZiAoaXNWYWxpZFRva2VuKSB7XHJcbiAgICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWQubmV4dCh0cnVlKTtcclxuICAgICAgICBjb25zdCBkZWNvZGVkVG9rZW4gPSB0aGlzLmp3dEhlbHBlclNlcnZpY2UuZGVjb2RlVG9rZW4oXHJcbiAgICAgICAgICBqd3RUb2tlbi5hY2Nlc3NUb2tlblxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy51c2VybmFtZS5uZXh0KGRlY29kZWRUb2tlblsnbmFtZSddKTtcclxuICAgICAgICB0aGlzLmVtYWlsLm5leHQoZGVjb2RlZFRva2VuWydlbWFpbCddKTtcclxuICAgICAgICB0aGlzLmlkZW50aWNvbklkLm5leHQoZGVjb2RlZFRva2VuWydpZGVudGljb25faWQnXSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRva2VuQ2xhaW1zOiB7IFtjbGFpbTogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xyXG4gICAgICAgIGZvciAoY29uc3QgdG9rZW5Qcm9wIGluIGRlY29kZWRUb2tlbikge1xyXG4gICAgICAgICAgaWYgKGRlY29kZWRUb2tlbi5oYXNPd25Qcm9wZXJ0eSh0b2tlblByb3ApKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gZGVjb2RlZFRva2VuW3Rva2VuUHJvcF07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRva2VuQ2xhaW1zW3Rva2VuUHJvcF0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdG9rZW5DbGFpbXNbdG9rZW5Qcm9wXSA9IFtdO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgdG9rZW5DbGFpbXNbdG9rZW5Qcm9wXS5wdXNoKHByb3BlcnR5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51c2VySW5mby5uZXh0KHtcclxuICAgICAgICAgIGlkOiBkZWNvZGVkVG9rZW5bJ3N1YiddLFxyXG4gICAgICAgICAgY2xhaW1zOiB0b2tlbkNsYWltcyxcclxuICAgICAgICAgIGRlc2VyaWFsaXplZFRva2VuOiBkZWNvZGVkVG9rZW4sXHJcbiAgICAgICAgICBlbWFpbDogZGVjb2RlZFRva2VuWydlbWFpbCddLFxyXG4gICAgICAgICAgaWRlbnRpY29uSWQ6IGRlY29kZWRUb2tlblsnaWRlbnRpY29uX2lkJ10sXHJcbiAgICAgICAgICB1c2VybmFtZTogZGVjb2RlZFRva2VuWyduYW1lJ10sXHJcbiAgICAgICAgICByb2xlczogZGVjb2RlZFRva2VuWydyb2xlJ10sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5qd3RUb2tlblNlcnZpY2UucmVmcmVzaFRva2VuKCkuc3Vic2NyaWJlKCgpID0+IHt9KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMubGFzdEJyb2FkY2FzdEFjY2Vzc1Rva2VuID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubGFzdEJyb2FkY2FzdEFjY2Vzc1Rva2VuID0gbnVsbDtcclxuICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWQubmV4dChmYWxzZSk7XHJcbiAgICAgIHRoaXMudXNlcm5hbWUubmV4dChudWxsKTtcclxuICAgICAgdGhpcy5lbWFpbC5uZXh0KG51bGwpO1xyXG4gICAgICB0aGlzLmlkZW50aWNvbklkLm5leHQobnVsbCk7XHJcbiAgICAgIHRoaXMudXNlckluZm8ubmV4dChudWxsKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|