@dangl/angular-dangl-identity-client 6.2.0 → 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.
Files changed (31) hide show
  1. package/README.md +25 -0
  2. package/api-client.d.ts +178 -178
  3. package/dangl-identity.module.d.ts +6 -7
  4. package/{esm2020 → esm2022}/api-client.mjs +551 -551
  5. package/{esm2020 → esm2022}/dangl-angular-dangl-identity-client.mjs +4 -4
  6. package/esm2022/dangl-identity.module.mjs +30 -0
  7. package/{esm2020 → esm2022}/interceptors/dangl-identity-request-validator.mjs +1 -1
  8. package/{esm2020 → esm2022}/interceptors/jwt-interceptor.service.mjs +47 -47
  9. package/esm2022/messengers/authentication.messenger.mjs +170 -0
  10. package/{esm2020 → esm2022}/models/jwt-storage.mjs +1 -1
  11. package/{esm2020 → esm2022}/models/user-info.mjs +1 -1
  12. package/{esm2020 → esm2022}/public_api.mjs +11 -11
  13. package/{esm2020 → esm2022}/services/authentication.service.mjs +39 -39
  14. package/{esm2020 → esm2022}/services/jwt-token.service.mjs +101 -101
  15. package/{fesm2020 → fesm2022}/dangl-angular-dangl-identity-client.mjs +905 -873
  16. package/fesm2022/dangl-angular-dangl-identity-client.mjs.map +1 -0
  17. package/index.d.ts +5 -5
  18. package/interceptors/dangl-identity-request-validator.d.ts +4 -4
  19. package/interceptors/jwt-interceptor.service.d.ts +16 -16
  20. package/messengers/authentication.messenger.d.ts +28 -26
  21. package/models/jwt-storage.d.ts +5 -5
  22. package/models/user-info.d.ts +11 -11
  23. package/package.json +7 -13
  24. package/public_api.d.ts +8 -8
  25. package/services/authentication.service.d.ts +14 -14
  26. package/services/jwt-token.service.d.ts +28 -28
  27. package/esm2020/dangl-identity.module.mjs +0 -29
  28. package/esm2020/messengers/authentication.messenger.mjs +0 -146
  29. package/fesm2015/dangl-angular-dangl-identity-client.mjs +0 -896
  30. package/fesm2015/dangl-angular-dangl-identity-client.mjs.map +0 -1
  31. package/fesm2020/dangl-angular-dangl-identity-client.mjs.map +0 -1
@@ -1,101 +1,101 @@
1
- import { Injectable } from '@angular/core';
2
- import { Subject, of, ReplaySubject } from 'rxjs';
3
- import { map, tap, first } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "../api-client";
6
- export class JwtTokenService {
7
- constructor(danglIdentityClient) {
8
- this.danglIdentityClient = danglIdentityClient;
9
- this.storage_identifier = 'dangl_identity_integration_jwt_token';
10
- this.isRefreshing = false;
11
- this.refreshTokenSource = new Subject();
12
- this.tokenStoredSource = new ReplaySubject(1);
13
- this.tokenStored = this.tokenStoredSource.asObservable();
14
- this.tokenRefreshStartedSource = new Subject();
15
- this.tokenRefreshStarted = this.tokenRefreshStartedSource.asObservable();
16
- this.tokenRefreshFinishedSource = new Subject();
17
- this.tokenRefreshFinished = this.tokenRefreshFinishedSource.asObservable();
18
- }
19
- ngOnDestroy() {
20
- this.tokenRefreshStartedSource.complete();
21
- this.tokenRefreshFinishedSource.complete();
22
- this.tokenStoredSource.complete();
23
- this.refreshTokenSource.complete();
24
- }
25
- deleteToken() {
26
- localStorage.removeItem(this.storage_identifier);
27
- this.tokenStoredSource.next(null);
28
- }
29
- storeCustomToken(tokenToStore) {
30
- localStorage.setItem(this.storage_identifier, JSON.stringify(tokenToStore));
31
- this.tokenStoredSource.next(tokenToStore);
32
- }
33
- storeToken(token) {
34
- const tokenToStore = this.transformTokenResponse(token);
35
- localStorage.setItem(this.storage_identifier, JSON.stringify(tokenToStore));
36
- this.tokenStoredSource.next(tokenToStore);
37
- }
38
- getTokenFromStorage() {
39
- const storedString = localStorage.getItem(this.storage_identifier);
40
- if (storedString) {
41
- const storedToken = JSON.parse(storedString);
42
- return storedToken;
43
- }
44
- return null;
45
- }
46
- refreshToken() {
47
- if (this.isRefreshing) {
48
- return this.refreshTokenSource.pipe(first());
49
- }
50
- this.isRefreshing = true;
51
- this.tokenRefreshStartedSource.next();
52
- const refreshToken = this.getTokenFromStorage().refreshToken;
53
- if (!refreshToken) {
54
- this.isRefreshing = false;
55
- return of(null);
56
- }
57
- this.danglIdentityClient
58
- .refreshToken({
59
- refreshToken: refreshToken,
60
- })
61
- .pipe(tap((r) => this.storeToken(r)), map((r) => this.transformTokenResponse(r)))
62
- .subscribe((refreshTokenResponse) => {
63
- this.isRefreshing = false;
64
- this.tokenRefreshFinishedSource.next(true);
65
- this.refreshTokenSource.next(refreshTokenResponse);
66
- }, (error) => {
67
- this.isRefreshing = false;
68
- this.tokenRefreshFinishedSource.next(false);
69
- this.refreshTokenSource.next(null);
70
- console.error('Internal error while refreshing Dangl.Identity token', error);
71
- });
72
- return this.refreshTokenSource.pipe(first());
73
- }
74
- getToken() {
75
- const token = this.getTokenFromStorage();
76
- if (!token) {
77
- return of(null);
78
- }
79
- const isValidToken = token.expiresAt > new Date().getTime() / 1000;
80
- if (isValidToken) {
81
- return of(token);
82
- }
83
- return this.refreshToken();
84
- }
85
- transformTokenResponse(token) {
86
- return {
87
- accessToken: token.accessToken,
88
- refreshToken: token.refreshToken,
89
- expiresAt: new Date().getTime() / 1000 + token.expiresIn,
90
- };
91
- }
92
- }
93
- JwtTokenServicefac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: JwtTokenService, deps: [{ token: i1.DanglIdentityClient }], target: i0.ɵɵFactoryTarget.Injectable });
94
- JwtTokenService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: JwtTokenService, providedIn: 'root' });
95
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: JwtTokenService, decorators: [{
96
- type: Injectable,
97
- args: [{
98
- providedIn: 'root',
99
- }]
100
- }], ctorParameters: function () { return [{ type: i1.DanglIdentityClient }]; } });
101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LXRva2VuLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWRhbmdsLWlkZW50aXR5LWNsaWVudC9zcmMvc2VydmljZXMvand0LXRva2VuLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUd0RCxPQUFPLEVBQUUsT0FBTyxFQUFjLEVBQUUsRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLEdBQUcsRUFBYyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQU03RCxNQUFNLE9BQU8sZUFBZTtJQVcxQixZQUFvQixtQkFBd0M7UUFBeEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQVYzQyx1QkFBa0IsR0FBRyxzQ0FBc0MsQ0FBQztRQUNyRSxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQix1QkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBYyxDQUFDO1FBQy9DLHNCQUFpQixHQUFHLElBQUksYUFBYSxDQUFhLENBQUMsQ0FBQyxDQUFDO1FBQzdELGdCQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzVDLDhCQUF5QixHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDbEQsd0JBQW1CLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzVELCtCQUEwQixHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFDNUQseUJBQW9CLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBRVAsQ0FBQztJQUVoRSxXQUFXO1FBQ1QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVB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QyxPQUFPLENBQUMsS0FBSyxDQUNYLHNEQUFzRCxFQUN0RCxLQUFLLENBQ04sQ0FBQztRQUNKLENBQUMsQ0FDRixDQUFDO1FBRUosT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELFFBQVE7UUFDTixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsT0FBTyxFQUFFLENBQWEsSUFBSSxDQUFDLENBQUM7U0FDN0I7UUFDRCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ25FLElBQUksWUFBWSxFQUFFO1lBQ2hCLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLHNCQUFzQixDQUFDLEtBQXVCO1FBQ3BELE9BQU87WUFDTCxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsU0FBUztTQUN6RCxDQUFDO0lBQ0osQ0FBQzs7NEdBeEdVLGVBQWU7Z0hBQWYsZUFBZSxjQUZkLE1BQU07MkZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGFuZ2xJZGVudGl0eUNsaWVudCwgVG9rZW5SZXNwb25zZUdldCB9IGZyb20gJy4uL2FwaS1jbGllbnQnO1xyXG5pbXBvcnQgeyBKd3RTdG9yYWdlIH0gZnJvbSAnLi4vbW9kZWxzL2p3dC1zdG9yYWdlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YsIFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCBjYXRjaEVycm9yLCB0YXAsIGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvbk1lc3NlbmdlciB9IGZyb20gJy4uL21lc3NlbmdlcnMvYXV0aGVudGljYXRpb24ubWVzc2VuZ2VyJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBKd3RUb2tlblNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZV9pZGVudGlmaWVyID0gJ2RhbmdsX2lkZW50aXR5X2ludGVncmF0aW9uX2p3dF90b2tlbic7XHJcbiAgcHJpdmF0ZSBpc1JlZnJlc2hpbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIHJlZnJlc2hUb2tlblNvdXJjZSA9IG5ldyBTdWJqZWN0PEp3dFN0b3JhZ2U+KCk7XHJcbiAgcHJpdmF0ZSB0b2tlblN0b3JlZFNvdXJjZSA9IG5ldyBSZXBsYXlTdWJqZWN0PEp3dFN0b3JhZ2U+KDEpO1xyXG4gIHRva2VuU3RvcmVkID0gdGhpcy50b2tlblN0b3JlZFNvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICBwcml2YXRlIHRva2VuUmVmcmVzaFN0YXJ0ZWRTb3VyY2UgPSBuZXcgU3ViamVjdCgpO1xyXG4gIHRva2VuUmVmcmVzaFN0YXJ0ZWQgPSB0aGlzLnRva2VuUmVmcmVzaFN0YXJ0ZWRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcHJpdmF0ZSB0b2tlblJlZnJlc2hGaW5pc2hlZFNvdXJjZSA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgdG9rZW5SZWZyZXNoRmluaXNoZWQgPSB0aGlzLnRva2VuUmVmcmVzaEZpbmlzaGVkU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhbmdsSWRlbnRpdHlDbGllbnQ6IERhbmdsSWRlbnRpdHlDbGllbnQpIHt9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy50b2tlblJlZnJlc2hTdGFydGVkU291cmNlLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLnRva2VuUmVmcmVzaEZpbmlzaGVkU291cmNlLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLnRva2VuU3RvcmVkU291cmNlLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLnJlZnJlc2hUb2tlblNvdXJjZS5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlVG9rZW4oKSB7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLnN0b3JhZ2VfaWRlbnRpZmllcik7XHJcbiAgICB0aGlzLnRva2VuU3RvcmVkU291cmNlLm5leHQobnVsbCk7XHJcbiAgfVxyXG5cclxuICBzdG9yZUN1c3RvbVRva2VuKHRva2VuVG9TdG9yZTogSnd0U3RvcmFnZSkge1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5zdG9yYWdlX2lkZW50aWZpZXIsIEpTT04uc3RyaW5naWZ5KHRva2VuVG9TdG9yZSkpO1xyXG4gICAgdGhpcy50b2tlblN0b3JlZFNvdXJjZS5uZXh0KHRva2VuVG9TdG9yZSk7XHJcbiAgfVxyXG5cclxuICBzdG9yZVRva2VuKHRva2VuOiBUb2tlblJlc3BvbnNlR2V0KSB7XHJcbiAgICBjb25zdCB0b2tlblRvU3RvcmUgPSB0aGlzLnRyYW5zZm9ybVRva2VuUmVzcG9uc2UodG9rZW4pO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5zdG9yYWdlX2lkZW50aWZpZXIsIEpTT04uc3RyaW5naWZ5KHRva2VuVG9TdG9yZSkpO1xyXG4gICAgdGhpcy50b2tlblN0b3JlZFNvdXJjZS5uZXh0KHRva2VuVG9TdG9yZSk7XHJcbiAgfVxyXG5cclxuICBnZXRUb2tlbkZyb21TdG9yYWdlKCk6IEp3dFN0b3JhZ2Uge1xyXG4gICAgY29uc3Qgc3RvcmVkU3RyaW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5zdG9yYWdlX2lkZW50aWZpZXIpO1xyXG4gICAgaWYgKHN0b3JlZFN0cmluZykge1xyXG4gICAgICBjb25zdCBzdG9yZWRUb2tlbiA9IDxKd3RTdG9yYWdlPkpTT04ucGFyc2Uoc3RvcmVkU3RyaW5nKTtcclxuICAgICAgcmV0dXJuIHN0b3JlZFRva2VuO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoVG9rZW4oKTogT2JzZXJ2YWJsZTxKd3RTdG9yYWdlPiB7XHJcbiAgICBpZiAodGhpcy5pc1JlZnJlc2hpbmcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuU291cmNlLnBpcGUoZmlyc3QoKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnRva2VuUmVmcmVzaFN0YXJ0ZWRTb3VyY2UubmV4dCgpO1xyXG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gdGhpcy5nZXRUb2tlbkZyb21TdG9yYWdlKCkucmVmcmVzaFRva2VuO1xyXG5cclxuICAgIGlmICghcmVmcmVzaFRva2VuKSB7XHJcbiAgICAgIHRoaXMuaXNSZWZyZXNoaW5nID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiBvZjxKd3RTdG9yYWdlPihudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhbmdsSWRlbnRpdHlDbGllbnRcclxuICAgICAgLnJlZnJlc2hUb2tlbih7XHJcbiAgICAgICAgcmVmcmVzaFRva2VuOiByZWZyZXNoVG9rZW4sXHJcbiAgICAgIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRhcCgocikgPT4gdGhpcy5zdG9yZVRva2VuKHIpKSxcclxuICAgICAgICBtYXAoKHIpID0+IHRoaXMudHJhbnNmb3JtVG9rZW5SZXNwb25zZShyKSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgIChyZWZyZXNoVG9rZW5SZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pc1JlZnJlc2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMudG9rZW5SZWZyZXNoRmluaXNoZWRTb3VyY2UubmV4dCh0cnVlKTtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuU291cmNlLm5leHQocmVmcmVzaFRva2VuUmVzcG9uc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzUmVmcmVzaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy50b2tlblJlZnJlc2hGaW5pc2hlZFNvdXJjZS5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuU291cmNlLm5leHQobnVsbCk7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgICAnSW50ZXJuYWwgZXJyb3Igd2hpbGUgcmVmcmVzaGluZyBEYW5nbC5JZGVudGl0eSB0b2tlbicsXHJcbiAgICAgICAgICAgIGVycm9yXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5yZWZyZXNoVG9rZW5Tb3VyY2UucGlwZShmaXJzdCgpKTtcclxuICB9XHJcblxyXG4gIGdldFRva2VuKCk6IE9ic2VydmFibGU8Snd0U3RvcmFnZT4ge1xyXG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmdldFRva2VuRnJvbVN0b3JhZ2UoKTtcclxuICAgIGlmICghdG9rZW4pIHtcclxuICAgICAgcmV0dXJuIG9mPEp3dFN0b3JhZ2U+KG51bGwpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaXNWYWxpZFRva2VuID0gdG9rZW4uZXhwaXJlc0F0ID4gbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwO1xyXG4gICAgaWYgKGlzVmFsaWRUb2tlbikge1xyXG4gICAgICByZXR1cm4gb2YodG9rZW4pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyYW5zZm9ybVRva2VuUmVzcG9uc2UodG9rZW46IFRva2VuUmVzcG9uc2VHZXQpOiBKd3RTdG9yYWdlIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFjY2Vzc1Rva2VuOiB0b2tlbi5hY2Nlc3NUb2tlbixcclxuICAgICAgcmVmcmVzaFRva2VuOiB0b2tlbi5yZWZyZXNoVG9rZW4sXHJcbiAgICAgIGV4cGlyZXNBdDogbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwICsgdG9rZW4uZXhwaXJlc0luLFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIl19
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject, of, ReplaySubject } from 'rxjs';
3
+ import { map, tap, first } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../api-client";
6
+ export class JwtTokenService {
7
+ constructor(danglIdentityClient) {
8
+ this.danglIdentityClient = danglIdentityClient;
9
+ this.storage_identifier = 'dangl_identity_integration_jwt_token';
10
+ this.isRefreshing = false;
11
+ this.refreshTokenSource = new Subject();
12
+ this.tokenStoredSource = new ReplaySubject(1);
13
+ this.tokenStored = this.tokenStoredSource.asObservable();
14
+ this.tokenRefreshStartedSource = new Subject();
15
+ this.tokenRefreshStarted = this.tokenRefreshStartedSource.asObservable();
16
+ this.tokenRefreshFinishedSource = new Subject();
17
+ this.tokenRefreshFinished = this.tokenRefreshFinishedSource.asObservable();
18
+ }
19
+ ngOnDestroy() {
20
+ this.tokenRefreshStartedSource.complete();
21
+ this.tokenRefreshFinishedSource.complete();
22
+ this.tokenStoredSource.complete();
23
+ this.refreshTokenSource.complete();
24
+ }
25
+ deleteToken() {
26
+ localStorage.removeItem(this.storage_identifier);
27
+ this.tokenStoredSource.next(null);
28
+ }
29
+ storeCustomToken(tokenToStore) {
30
+ localStorage.setItem(this.storage_identifier, JSON.stringify(tokenToStore));
31
+ this.tokenStoredSource.next(tokenToStore);
32
+ }
33
+ storeToken(token) {
34
+ const tokenToStore = this.transformTokenResponse(token);
35
+ localStorage.setItem(this.storage_identifier, JSON.stringify(tokenToStore));
36
+ this.tokenStoredSource.next(tokenToStore);
37
+ }
38
+ getTokenFromStorage() {
39
+ const storedString = localStorage.getItem(this.storage_identifier);
40
+ if (storedString) {
41
+ const storedToken = JSON.parse(storedString);
42
+ return storedToken;
43
+ }
44
+ return null;
45
+ }
46
+ refreshToken() {
47
+ if (this.isRefreshing) {
48
+ return this.refreshTokenSource.pipe(first());
49
+ }
50
+ this.isRefreshing = true;
51
+ this.tokenRefreshStartedSource.next();
52
+ const refreshToken = this.getTokenFromStorage().refreshToken;
53
+ if (!refreshToken) {
54
+ this.isRefreshing = false;
55
+ return of(null);
56
+ }
57
+ this.danglIdentityClient
58
+ .refreshToken({
59
+ refreshToken: refreshToken,
60
+ })
61
+ .pipe(tap((r) => this.storeToken(r)), map((r) => this.transformTokenResponse(r)))
62
+ .subscribe((refreshTokenResponse) => {
63
+ this.isRefreshing = false;
64
+ this.tokenRefreshFinishedSource.next(true);
65
+ this.refreshTokenSource.next(refreshTokenResponse);
66
+ }, (error) => {
67
+ this.isRefreshing = false;
68
+ this.tokenRefreshFinishedSource.next(false);
69
+ this.refreshTokenSource.next(null);
70
+ console.error('Internal error while refreshing Dangl.Identity token', error);
71
+ });
72
+ return this.refreshTokenSource.pipe(first());
73
+ }
74
+ getToken() {
75
+ const token = this.getTokenFromStorage();
76
+ if (!token) {
77
+ return of(null);
78
+ }
79
+ const isValidToken = token.expiresAt > new Date().getTime() / 1000;
80
+ if (isValidToken) {
81
+ return of(token);
82
+ }
83
+ return this.refreshToken();
84
+ }
85
+ transformTokenResponse(token) {
86
+ return {
87
+ accessToken: token.accessToken,
88
+ refreshToken: token.refreshToken,
89
+ expiresAt: new Date().getTime() / 1000 + token.expiresIn,
90
+ };
91
+ }
92
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: JwtTokenService, deps: [{ token: i1.DanglIdentityClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
93
+ static { thisprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: JwtTokenService, providedIn: 'root' }); }
94
+ }
95
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: JwtTokenService, decorators: [{
96
+ type: Injectable,
97
+ args: [{
98
+ providedIn: 'root',
99
+ }]
100
+ }], ctorParameters: () => [{ type: i1.DanglIdentityClient }] });
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LXRva2VuLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWRhbmdsLWlkZW50aXR5LWNsaWVudC9zcmMvc2VydmljZXMvand0LXRva2VuLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUd0RCxPQUFPLEVBQUUsT0FBTyxFQUFjLEVBQUUsRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLEdBQUcsRUFBYyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQU03RCxNQUFNLE9BQU8sZUFBZTtJQVcxQixZQUFvQixtQkFBd0M7UUFBeEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQVYzQyx1QkFBa0IsR0FBRyxzQ0FBc0MsQ0FBQztRQUNyRSxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQix1QkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBYyxDQUFDO1FBQy9DLHNCQUFpQixHQUFHLElBQUksYUFBYSxDQUFhLENBQUMsQ0FBQyxDQUFDO1FBQzdELGdCQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzVDLDhCQUF5QixHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDbEQsd0JBQW1CLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzVELCtCQUEwQixHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFDNUQseUJBQW9CLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBRVAsQ0FBQztJQUVoRSxXQUFXO1FBQ1QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxXQUFXO1FBQ1QsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxZQUF3QjtRQUN2QyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQXVCO1FBQ2hDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RCxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDbkUsSUFBSSxZQUFZLEVBQUU7WUFDaEIsTUFBTSxXQUFXLEdBQWUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN6RCxPQUFPLFdBQVcsQ0FBQztTQUNwQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDOUM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsWUFBWSxDQUFDO1FBRTdELElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsT0FBTyxFQUFFLENBQWEsSUFBSSxDQUFDLENBQUM7U0FDN0I7UUFFRCxJQUFJLENBQUMsbUJBQW1CO2FBQ3JCLFlBQVksQ0FBQztZQUNaLFlBQVksRUFBRSxZQUFZO1NBQzNCLENBQUM7YUFDRCxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzNDO2FBQ0EsU0FBUyxDQUNSLENBQUMsb0JBQW9CLEVBQUUsRUFBRTtZQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNyRCxDQUFDLEVBQ0QsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNSLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxPQUFPLENBQUMsS0FBSyxDQUNYLHNEQUFzRCxFQUN0RCxLQUFLLENBQ04sQ0FBQztRQUNKLENBQUMsQ0FDRixDQUFDO1FBRUosT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELFFBQVE7UUFDTixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsT0FBTyxFQUFFLENBQWEsSUFBSSxDQUFDLENBQUM7U0FDN0I7UUFDRCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ25FLElBQUksWUFBWSxFQUFFO1lBQ2hCLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLHNCQUFzQixDQUFDLEtBQXVCO1FBQ3BELE9BQU87WUFDTCxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsU0FBUztTQUN6RCxDQUFDO0lBQ0osQ0FBQzs4R0F4R1UsZUFBZTtrSEFBZixlQUFlLGNBRmQsTUFBTTs7MkZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGFuZ2xJZGVudGl0eUNsaWVudCwgVG9rZW5SZXNwb25zZUdldCB9IGZyb20gJy4uL2FwaS1jbGllbnQnO1xyXG5pbXBvcnQgeyBKd3RTdG9yYWdlIH0gZnJvbSAnLi4vbW9kZWxzL2p3dC1zdG9yYWdlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YsIFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCBjYXRjaEVycm9yLCB0YXAsIGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvbk1lc3NlbmdlciB9IGZyb20gJy4uL21lc3NlbmdlcnMvYXV0aGVudGljYXRpb24ubWVzc2VuZ2VyJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBKd3RUb2tlblNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZV9pZGVudGlmaWVyID0gJ2RhbmdsX2lkZW50aXR5X2ludGVncmF0aW9uX2p3dF90b2tlbic7XHJcbiAgcHJpdmF0ZSBpc1JlZnJlc2hpbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIHJlZnJlc2hUb2tlblNvdXJjZSA9IG5ldyBTdWJqZWN0PEp3dFN0b3JhZ2U+KCk7XHJcbiAgcHJpdmF0ZSB0b2tlblN0b3JlZFNvdXJjZSA9IG5ldyBSZXBsYXlTdWJqZWN0PEp3dFN0b3JhZ2U+KDEpO1xyXG4gIHRva2VuU3RvcmVkID0gdGhpcy50b2tlblN0b3JlZFNvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICBwcml2YXRlIHRva2VuUmVmcmVzaFN0YXJ0ZWRTb3VyY2UgPSBuZXcgU3ViamVjdCgpO1xyXG4gIHRva2VuUmVmcmVzaFN0YXJ0ZWQgPSB0aGlzLnRva2VuUmVmcmVzaFN0YXJ0ZWRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcHJpdmF0ZSB0b2tlblJlZnJlc2hGaW5pc2hlZFNvdXJjZSA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgdG9rZW5SZWZyZXNoRmluaXNoZWQgPSB0aGlzLnRva2VuUmVmcmVzaEZpbmlzaGVkU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhbmdsSWRlbnRpdHlDbGllbnQ6IERhbmdsSWRlbnRpdHlDbGllbnQpIHt9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy50b2tlblJlZnJlc2hTdGFydGVkU291cmNlLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLnRva2VuUmVmcmVzaEZpbmlzaGVkU291cmNlLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLnRva2VuU3RvcmVkU291cmNlLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLnJlZnJlc2hUb2tlblNvdXJjZS5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlVG9rZW4oKSB7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLnN0b3JhZ2VfaWRlbnRpZmllcik7XHJcbiAgICB0aGlzLnRva2VuU3RvcmVkU291cmNlLm5leHQobnVsbCk7XHJcbiAgfVxyXG5cclxuICBzdG9yZUN1c3RvbVRva2VuKHRva2VuVG9TdG9yZTogSnd0U3RvcmFnZSkge1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5zdG9yYWdlX2lkZW50aWZpZXIsIEpTT04uc3RyaW5naWZ5KHRva2VuVG9TdG9yZSkpO1xyXG4gICAgdGhpcy50b2tlblN0b3JlZFNvdXJjZS5uZXh0KHRva2VuVG9TdG9yZSk7XHJcbiAgfVxyXG5cclxuICBzdG9yZVRva2VuKHRva2VuOiBUb2tlblJlc3BvbnNlR2V0KSB7XHJcbiAgICBjb25zdCB0b2tlblRvU3RvcmUgPSB0aGlzLnRyYW5zZm9ybVRva2VuUmVzcG9uc2UodG9rZW4pO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5zdG9yYWdlX2lkZW50aWZpZXIsIEpTT04uc3RyaW5naWZ5KHRva2VuVG9TdG9yZSkpO1xyXG4gICAgdGhpcy50b2tlblN0b3JlZFNvdXJjZS5uZXh0KHRva2VuVG9TdG9yZSk7XHJcbiAgfVxyXG5cclxuICBnZXRUb2tlbkZyb21TdG9yYWdlKCk6IEp3dFN0b3JhZ2Uge1xyXG4gICAgY29uc3Qgc3RvcmVkU3RyaW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5zdG9yYWdlX2lkZW50aWZpZXIpO1xyXG4gICAgaWYgKHN0b3JlZFN0cmluZykge1xyXG4gICAgICBjb25zdCBzdG9yZWRUb2tlbiA9IDxKd3RTdG9yYWdlPkpTT04ucGFyc2Uoc3RvcmVkU3RyaW5nKTtcclxuICAgICAgcmV0dXJuIHN0b3JlZFRva2VuO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoVG9rZW4oKTogT2JzZXJ2YWJsZTxKd3RTdG9yYWdlPiB7XHJcbiAgICBpZiAodGhpcy5pc1JlZnJlc2hpbmcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuU291cmNlLnBpcGUoZmlyc3QoKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnRva2VuUmVmcmVzaFN0YXJ0ZWRTb3VyY2UubmV4dCgpO1xyXG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gdGhpcy5nZXRUb2tlbkZyb21TdG9yYWdlKCkucmVmcmVzaFRva2VuO1xyXG5cclxuICAgIGlmICghcmVmcmVzaFRva2VuKSB7XHJcbiAgICAgIHRoaXMuaXNSZWZyZXNoaW5nID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiBvZjxKd3RTdG9yYWdlPihudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhbmdsSWRlbnRpdHlDbGllbnRcclxuICAgICAgLnJlZnJlc2hUb2tlbih7XHJcbiAgICAgICAgcmVmcmVzaFRva2VuOiByZWZyZXNoVG9rZW4sXHJcbiAgICAgIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRhcCgocikgPT4gdGhpcy5zdG9yZVRva2VuKHIpKSxcclxuICAgICAgICBtYXAoKHIpID0+IHRoaXMudHJhbnNmb3JtVG9rZW5SZXNwb25zZShyKSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgIChyZWZyZXNoVG9rZW5SZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pc1JlZnJlc2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMudG9rZW5SZWZyZXNoRmluaXNoZWRTb3VyY2UubmV4dCh0cnVlKTtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuU291cmNlLm5leHQocmVmcmVzaFRva2VuUmVzcG9uc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzUmVmcmVzaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy50b2tlblJlZnJlc2hGaW5pc2hlZFNvdXJjZS5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuU291cmNlLm5leHQobnVsbCk7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgICAnSW50ZXJuYWwgZXJyb3Igd2hpbGUgcmVmcmVzaGluZyBEYW5nbC5JZGVudGl0eSB0b2tlbicsXHJcbiAgICAgICAgICAgIGVycm9yXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5yZWZyZXNoVG9rZW5Tb3VyY2UucGlwZShmaXJzdCgpKTtcclxuICB9XHJcblxyXG4gIGdldFRva2VuKCk6IE9ic2VydmFibGU8Snd0U3RvcmFnZT4ge1xyXG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmdldFRva2VuRnJvbVN0b3JhZ2UoKTtcclxuICAgIGlmICghdG9rZW4pIHtcclxuICAgICAgcmV0dXJuIG9mPEp3dFN0b3JhZ2U+KG51bGwpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaXNWYWxpZFRva2VuID0gdG9rZW4uZXhwaXJlc0F0ID4gbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwO1xyXG4gICAgaWYgKGlzVmFsaWRUb2tlbikge1xyXG4gICAgICByZXR1cm4gb2YodG9rZW4pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyYW5zZm9ybVRva2VuUmVzcG9uc2UodG9rZW46IFRva2VuUmVzcG9uc2VHZXQpOiBKd3RTdG9yYWdlIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFjY2Vzc1Rva2VuOiB0b2tlbi5hY2Nlc3NUb2tlbixcclxuICAgICAgcmVmcmVzaFRva2VuOiB0b2tlbi5yZWZyZXNoVG9rZW4sXHJcbiAgICAgIGV4cGlyZXNBdDogbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwICsgdG9rZW4uZXhwaXJlc0luLFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIl19