@progress-chef/platform-http-interceptor 0.0.14 → 0.0.16

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.
@@ -1,5 +1,5 @@
1
1
  import { LocalStorageService, StorageKeys } from '@progress-chef/platform-storage-service';
2
- import { catchError, throwError } from 'rxjs';
2
+ import { catchError, throwError, timer } from 'rxjs';
3
3
  import { Injectable } from '@angular/core';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "@angular/router";
@@ -13,13 +13,8 @@ export class HttpAuthInterceptor {
13
13
  this.authTokenSet = new Set();
14
14
  this.isSessionExpired = false;
15
15
  }
16
- // private currentBaseUrlFromLocalStorage: string = 'currentServerBaseUrl';
17
- // private refreshTokenExpireTimeStorageKey: string = 'refreshTokenExpireTime';
18
16
  intercept(request, next) {
19
- const getRefreshTokenHalfTime = LocalStorageService.getItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME);
20
- if (getRefreshTokenHalfTime) {
21
- this.manageTokenRefresh();
22
- }
17
+ this.triggerRefreshTokenTimer();
23
18
  let authToken = LocalStorageService.getItem(StorageKeys.AUTH_TOKEN);
24
19
  let authReq = request;
25
20
  if (authToken) {
@@ -72,101 +67,17 @@ export class HttpAuthInterceptor {
72
67
  return throwError(() => error);
73
68
  }));
74
69
  }
75
- manageRefreshTokenExpireTime() {
76
- const newExpireTime = this.getExpireAtTime();
77
- const { halfwayTimeString } = this.handleCalulateHalfTime(newExpireTime);
78
- LocalStorageService.setItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME, halfwayTimeString);
79
- }
80
- manageTokenRefresh() {
81
- const { isHalfTimeGreater } = this.checkHalfTimeIsGreater();
82
- if (isHalfTimeGreater) {
83
- this.refreshToken();
84
- this.manageRefreshTokenExpireTime();
85
- // const newExpireTime = this.getExpireAtTime()
86
- // const { halfwayTimeString } = this.handleCalulateHalfTime(newExpireTime)
87
- // localStorage.setItem(this.refreshTokenExpireTimeStorageKey, halfwayTimeString)
88
- // LocalStorageService.setItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME, halfwayTimeString)
89
- }
90
- }
91
70
  refreshToken() {
92
- // const baseUrl: string = localStorage.getItem(this.currentBaseUrlFromLocalStorage) as string;
93
71
  const baseUrl = LocalStorageService.getItem(StorageKeys.CURRENT_SERVER_BASE_URL);
94
72
  if (!baseUrl)
95
73
  throw new Error('The backend or server base URL is missing in Local Storage');
96
74
  this.refreshTokenService.refreshToken({ platformServiceApiBaseUrls: baseUrl });
97
75
  }
98
- getExpireAtTime() {
99
- let isIdentityToken;
100
- setTimeout(() => {
101
- isIdentityToken = LocalStorageService.getItem(StorageKeys.IDENTITY_TOKEN);
102
- console.log('--------------getting first time token', isIdentityToken);
103
- }, 2000);
104
- console.log('======= check is token availabe --------', isIdentityToken);
105
- if (!isIdentityToken)
106
- throw new Error('identity token is missing in the local storage');
107
- const { expireAt } = isIdentityToken;
108
- const date = new Date(expireAt * 1000);
109
- const hours = date.getUTCHours().toString().padStart(2, '0');
110
- const minutes = date.getUTCMinutes().toString().padStart(2, '0');
111
- const seconds = date.getUTCSeconds().toString().padStart(2, '0');
112
- const latestRefreshTokenExpireTime = `${hours}:${minutes}:${seconds}`; //10:00:00
113
- return latestRefreshTokenExpireTime;
114
- }
115
- getCurrentTime() {
116
- const now = new Date();
117
- const options = { timeZone: 'Asia/Kolkata' };
118
- const formattedTime = now.toLocaleString('en-IN', { hour12: true, ...options });
119
- const [time, period] = formattedTime.split(', ')[1].split(' ');
120
- const [hours, minutes, seconds] = time.split(':').map(Number);
121
- return { hours, minutes, seconds, period };
122
- }
123
- timeToSeconds(hours, minutes, seconds) {
124
- return hours * 3600 + minutes * 60 + seconds;
125
- }
126
- secondsToTimeString(seconds) {
127
- const hours = Math.floor(seconds / 3600) % 12 || 12;
128
- const minutes = Math.floor((seconds % 3600) / 60);
129
- const secondsPart = seconds % 60;
130
- return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secondsPart.toString().padStart(2, '0')}`;
131
- }
132
- handleCalulateHalfTime(expireTime, isHalfTime = false) {
133
- const [expireHours, expireMinutes, expireSeconds] = expireTime.split(':').map(Number);
134
- const { hours: currentHours, minutes: currentMinutes, seconds: currentSeconds, period: currentPeriod } = this.getCurrentTime();
135
- const expireTimeInSeconds = this.timeToSeconds(expireHours, expireMinutes, expireSeconds);
136
- const currentTimeInSeconds = this.timeToSeconds(currentHours, currentMinutes, currentSeconds);
137
- let halfwayTimeInSeconds;
138
- if (isHalfTime) {
139
- halfwayTimeInSeconds = expireTimeInSeconds + currentTimeInSeconds;
140
- }
141
- else {
142
- halfwayTimeInSeconds = Math.floor((expireTimeInSeconds + currentTimeInSeconds) / 2);
143
- }
144
- if (halfwayTimeInSeconds < 0) {
145
- halfwayTimeInSeconds += 12 * 3600;
146
- }
147
- else if (halfwayTimeInSeconds >= 12 * 3600) {
148
- halfwayTimeInSeconds -= 12 * 3600;
149
- }
150
- const halfwayTimeString = this.secondsToTimeString(halfwayTimeInSeconds);
151
- let isHalfTimeGreater = false;
152
- if (halfwayTimeString.endsWith('AM') && expireTime.endsWith('PM')) {
153
- isHalfTimeGreater = false;
154
- }
155
- else if (halfwayTimeString.endsWith('PM') && expireTime.endsWith('AM')) {
156
- isHalfTimeGreater = true;
157
- }
158
- else {
159
- isHalfTimeGreater = halfwayTimeString > expireTime;
160
- }
161
- return { halfwayTimeString, isHalfTimeGreater };
162
- }
163
- checkHalfTimeIsGreater() {
164
- // const getRefreshTokenHalfTime: string = localStorage.getItem(this.refreshTokenExpireTimeStorageKey) as string;
165
- const getRefreshTokenHalfTime = LocalStorageService.getItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME);
166
- if (!getRefreshTokenHalfTime)
167
- throw new Error('Refresh token half time is missing');
168
- const { isHalfTimeGreater, halfwayTimeString } = this.handleCalulateHalfTime(getRefreshTokenHalfTime, true);
169
- return { isHalfTimeGreater, halfwayTimeString };
76
+ triggerRefreshTokenTimer() {
77
+ const refreshTokenTime = 20 * 1000;
78
+ timer(0, refreshTokenTime).subscribe(() => {
79
+ this.refreshToken();
80
+ });
170
81
  }
171
82
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HttpAuthInterceptor, deps: [{ token: i1.Router }, { token: i2.ToastNotificationService }, { token: i3.RefreshTokenService }], target: i0.ɵɵFactoryTarget.Injectable }); }
172
83
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HttpAuthInterceptor, providedIn: 'root' }); }
@@ -177,4 +88,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
177
88
  providedIn: 'root'
178
89
  }]
179
90
  }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.ToastNotificationService }, { type: i3.RefreshTokenService }]; } });
180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1hdXRoLmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcGxhdGZvcm0taHR0cC1pbnRlcmNlcHRvci9zcmMvbGliL2h0dHAtYXV0aC5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDM0YsT0FBTyxFQUFjLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFNM0MsTUFBTSxPQUFPLG1CQUFtQjtJQUc5QixZQUNVLE1BQWMsRUFDZCx3QkFBa0QsRUFDbEQsbUJBQXdDO1FBRnhDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFMbEQsaUJBQVksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztJQUtyQixDQUFDO0lBRUwsMkVBQTJFO0lBQzNFLCtFQUErRTtJQUMvRSxTQUFTLENBQUMsT0FBNkIsRUFBRSxJQUFpQjtRQUV4RCxNQUFNLHVCQUF1QixHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtRQUN0RyxJQUFJLHVCQUF1QixFQUFFO1lBQzNCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzNCO1FBRUQsSUFBSSxTQUFTLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwRSxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdEIsSUFBSSxTQUFTLEVBQUU7WUFDYixPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUss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QkFBaUIsR0FBRyxpQkFBaUIsR0FBRyxVQUFVLENBQUM7U0FDcEQ7UUFFRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLGlIQUFpSDtRQUNqSCxNQUFNLHVCQUF1QixHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtRQUN0RyxJQUFJLENBQUMsdUJBQXVCO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztJQUNsRCxDQUFDOytHQWhMVSxtQkFBbUI7bUhBQW5CLG1CQUFtQixjQUhsQixNQUFNOzs0RkFHUCxtQkFBbUI7a0JBSi9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSHR0cEVycm9yUmVzcG9uc2UsXG4gIEh0dHBFdmVudCxcbiAgSHR0cEhhbmRsZXIsXG4gIEh0dHBJbnRlcmNlcHRvcixcbiAgSHR0cFJlcXVlc3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuLy8gaW1wb3J0IHsgUmVmcmVzaFRva2VuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2Rpc3QvcGxhdGZvcm0tcmVmcmVzaC10b2tlbi1zZXJ2aWNlL2luZGV4JztcbmltcG9ydCB7IFJlZnJlc2hUb2tlblNlcnZpY2UgfSBmcm9tICdAcHJvZ3Jlc3MtY2hlZi9wbGF0Zm9ybS1yZWZyZXNoLXRva2VuLXNlcnZpY2UnXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnQHByb2dyZXNzLWNoZWYvcGxhdGZvcm0tc2hhcmVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgTG9jYWxTdG9yYWdlU2VydmljZSwgU3RvcmFnZUtleXMgfSBmcm9tICdAcHJvZ3Jlc3MtY2hlZi9wbGF0Zm9ybS1zdG9yYWdlLXNlcnZpY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgY2F0Y2hFcnJvciwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcblxuZXhwb3J0IGNsYXNzIEh0dHBBdXRoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuICBhdXRoVG9rZW5TZXQgPSBuZXcgU2V0KCk7XG4gIGlzU2Vzc2lvbkV4cGlyZWQgPSBmYWxzZTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHRvYXN0Tm90aWZpY2F0aW9uU2VydmljZTogVG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlLCBcbiAgICBwcml2YXRlIHJlZnJlc2hUb2tlblNlcnZpY2U6IFJlZnJlc2hUb2tlblNlcnZpY2UsXG4gICkgeyB9XG5cbiAgLy8gcHJpdmF0ZSBjdXJyZW50QmFzZVVybEZyb21Mb2NhbFN0b3JhZ2U6IHN0cmluZyA9ICdjdXJyZW50U2VydmVyQmFzZVVybCc7XG4gIC8vIHByaXZhdGUgcmVmcmVzaFRva2VuRXhwaXJlVGltZVN0b3JhZ2VLZXk6IHN0cmluZyA9ICdyZWZyZXNoVG9rZW5FeHBpcmVUaW1lJztcbiAgaW50ZXJjZXB0KHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PHVua25vd24+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PHVua25vd24+PiB7XG5cbiAgICBjb25zdCBnZXRSZWZyZXNoVG9rZW5IYWxmVGltZSA9IExvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5SRUZSRVNIX1RPS0VOX0hBTEZfRVhQUkVfVElNRSlcbiAgICBpZiAoZ2V0UmVmcmVzaFRva2VuSGFsZlRpbWUpIHtcbiAgICAgIHRoaXMubWFuYWdlVG9rZW5SZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgbGV0IGF1dGhUb2tlbiA9IExvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5BVVRIX1RPS0VOKTtcbiAgICBsZXQgYXV0aFJlcSA9IHJlcXVlc3Q7XG4gICAgaWYgKGF1dGhUb2tlbikge1xuICAgICAgYXV0aFJlcSA9IHJlcXVlc3QuY2xvbmUoe1xuICAgICAgICBzZXRIZWFkZXJzOiB7XG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2F1dGhUb2tlbn1gXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZiAoIXRoaXMuYXV0aFRva2VuU2V0LmhhcyhhdXRoVG9rZW4pKSB7XG4gICAgICAgIHRoaXMuaXNTZXNzaW9uRXhwaXJlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5hdXRoVG9rZW5TZXQuYWRkKGF1dGhUb2tlbik7XG4gICAgfVxuICAgIHJldHVybiBuZXh0LmhhbmRsZShhdXRoUmVxKS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgIGNvbnN0IGxvZ2luVHlwZSA9IExvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5MT0dJTl9UWVBFKTtcbiAgICAgICAgICBpZiAobG9naW5UeXBlID09PSAnc2FtbCcgfHwgbG9naW5UeXBlID09PSAnb2F1dGgnKSB7XG4gICAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuVVNFUl9OQU1FKTtcbiAgICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbShTdG9yYWdlS2V5cy5JU19SRU1FTUJFUl9NRSk7IFxuICAgICAgICAgIH1cbiAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oU3RvcmFnZUtleXMuSVNfVVNFUl9PUkdfQU5EX1JPTEVfU0VULCBmYWxzZSk7XG4gICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLklTX1VTRVJfQVVUSEVOVElDQVRFRCwgZmFsc2UpO1xuICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbShTdG9yYWdlS2V5cy5BVVRIX1RPS0VOKTtcbiAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuTE9HSU5fVFlQRSk7XG4gICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLklERU5USVRZX1RPS0VOKTtcbiAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuVVNFUl9PUkdfQU5EX1JPTEVfVE9LRU4pO1xuICAgICAgICAgIC8vIGNhbGwgbG9nb3V0IGFjdGlvblxuICAgICAgICAgIGlmICghdGhpcy5pc1Nlc3Npb25FeHBpcmVkKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0Tm90aWZpY2F0aW9uU2VydmljZS5zaG93VG9hc3ROb3RpZmljYXRpb24oe1xuICAgICAgICAgICAgICBjb250ZW50OiAnVGhlIHNlc3Npb24gaGFzIGVuZGVkLidcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5pc1Nlc3Npb25FeHBpcmVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbG9naW4nXSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSAwIHx8IGVycm9yLnN0YXR1cyA9PT0gNTA0KSB7XG4gICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IGBVbmFibGUgdG8gcmVhY2ggc2VydmVyLiBQbGVhc2UgdHJ5IGFnYWluLmAsXG4gICAgICAgICAgICB0eXBlOiB7IHN0eWxlOiAnZXJyb3InLCBpY29uOiB0cnVlIH0sXG4gICAgICAgICAgICBjbG9zYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IGBTb21ldGhpbmcgd2VudCB3cm9uZy4gUGxlYXNlIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgICAgdHlwZTogeyBzdHlsZTogJ2Vycm9yJywgaWNvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbWFuYWdlUmVmcmVzaFRva2VuRXhwaXJlVGltZSgpIHtcbiAgICBjb25zdCBuZXdFeHBpcmVUaW1lID0gdGhpcy5nZXRFeHBpcmVBdFRpbWUoKVxuICAgIGNvbnN0IHsgaGFsZndheVRpbWVTdHJpbmcgfSA9IHRoaXMuaGFuZGxlQ2FsdWxhdGVIYWxmVGltZShuZXdFeHBpcmVUaW1lKVxuICAgIExvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5SRUZSRVNIX1RPS0VOX0hBTEZfRVhQUkVfVElNRSwgaGFsZndheVRpbWVTdHJpbmcpXG4gIH1cblxuICBtYW5hZ2VUb2tlblJlZnJlc2goKSB7XG4gICAgY29uc3QgeyBpc0hhbGZUaW1lR3JlYXRlciB9ID0gdGhpcy5jaGVja0hhbGZUaW1lSXNHcmVhdGVyKCk7XG4gICAgaWYgKGlzSGFsZlRpbWVHcmVhdGVyKSB7XG4gICAgICB0aGlzLnJlZnJlc2hUb2tlbigpO1xuICAgICAgdGhpcy5tYW5hZ2VSZWZyZXNoVG9rZW5FeHBpcmVUaW1lKCk7XG4gICAgICAvLyBjb25zdCBuZXdFeHBpcmVUaW1lID0gdGhpcy5nZXRFeHBpcmVBdFRpbWUoKVxuICAgICAgLy8gY29uc3QgeyBoYWxmd2F5VGltZVN0cmluZyB9ID0gdGhpcy5oYW5kbGVDYWx1bGF0ZUhhbGZUaW1lKG5ld0V4cGlyZVRpbWUpXG4gICAgICAvLyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnJlZnJlc2hUb2tlbkV4cGlyZVRpbWVTdG9yYWdlS2V5LCBoYWxmd2F5VGltZVN0cmluZylcbiAgICAgIC8vIExvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5SRUZSRVNIX1RPS0VOX0hBTEZfRVhQUkVfVElNRSwgaGFsZndheVRpbWVTdHJpbmcpXG4gICAgfVxuICB9XG5cbiAgcmVmcmVzaFRva2VuKCkge1xuICAgIC8vIGNvbnN0IGJhc2VVcmw6IHN0cmluZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuY3VycmVudEJhc2VVcmxGcm9tTG9jYWxTdG9yYWdlKSBhcyBzdHJpbmc7XG4gICAgY29uc3QgYmFzZVVybCA9IExvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5DVVJSRU5UX1NFUlZFUl9CQVNFX1VSTCk7XG4gICAgaWYgKCFiYXNlVXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBiYWNrZW5kIG9yIHNlcnZlciBiYXNlIFVSTCBpcyBtaXNzaW5nIGluIExvY2FsIFN0b3JhZ2UnKTtcbiAgICB0aGlzLnJlZnJlc2hUb2tlblNlcnZpY2UucmVmcmVzaFRva2VuKHsgcGxhdGZvcm1TZXJ2aWNlQXBpQmFzZVVybHM6IGJhc2VVcmwgfSk7XG4gIH1cblxuICBnZXRFeHBpcmVBdFRpbWUoKSB7XG4gICAgbGV0IGlzSWRlbnRpdHlUb2tlbjtcbiAgICBzZXRUaW1lb3V0KCgpPT4ge1xuICAgICAgaXNJZGVudGl0eVRva2VuID0gTG9jYWxTdG9yYWdlU2VydmljZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLklERU5USVRZX1RPS0VOKTtcbiAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLWdldHRpbmcgZmlyc3QgdGltZSB0b2tlbicsIGlzSWRlbnRpdHlUb2tlbilcbiAgICB9LCAyMDAwKVxuICAgIGNvbnNvbGUubG9nKCc9PT09PT09IGNoZWNrIGlzIHRva2VuIGF2YWlsYWJlIC0tLS0tLS0tJywgaXNJZGVudGl0eVRva2VuKSAgXG4gICAgaWYgKCFpc0lkZW50aXR5VG9rZW4pIHRocm93IG5ldyBFcnJvcignaWRlbnRpdHkgdG9rZW4gaXMgbWlzc2luZyBpbiB0aGUgbG9jYWwgc3RvcmFnZScpO1xuICAgIGNvbnN0IHsgZXhwaXJlQXQgfSA9IGlzSWRlbnRpdHlUb2tlbjtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZXhwaXJlQXQgKiAxMDAwKTtcbiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0VVRDSG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgbWludXRlcyA9IGRhdGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBzZWNvbmRzID0gZGF0ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IGxhdGVzdFJlZnJlc2hUb2tlbkV4cGlyZVRpbWUgPSBgJHtob3Vyc306JHttaW51dGVzfToke3NlY29uZHN9YDsgLy8xMDowMDowMFxuICAgIHJldHVybiBsYXRlc3RSZWZyZXNoVG9rZW5FeHBpcmVUaW1lO1xuICB9XG5cbiAgZ2V0Q3VycmVudFRpbWUoKSB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBvcHRpb25zID0geyB0aW1lWm9uZTogJ0FzaWEvS29sa2F0YScgfTtcbiAgICBjb25zdCBmb3JtYXR0ZWRUaW1lID0gbm93LnRvTG9jYWxlU3RyaW5nKCdlbi1JTicsIHsgaG91cjEyOiB0cnVlLCAuLi5vcHRpb25zIH0pO1xuICAgIGNvbnN0IFt0aW1lLCBwZXJpb2RdID0gZm9ybWF0dGVkVGltZS5zcGxpdCgnLCAnKVsxXS5zcGxpdCgnICcpO1xuICAgIGNvbnN0IFtob3VycywgbWludXRlcywgc2Vjb25kc10gPSB0aW1lLnNwbGl0KCc6JykubWFwKE51bWJlcik7XG4gICAgcmV0dXJuIHsgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIHBlcmlvZCB9O1xuICB9XG5cbiAgdGltZVRvU2Vjb25kcyhob3VyczogbnVtYmVyLCBtaW51dGVzOiBudW1iZXIsIHNlY29uZHM6IG51bWJlcikge1xuICAgIHJldHVybiBob3VycyAqIDM2MDAgKyBtaW51dGVzICogNjAgKyBzZWNvbmRzO1xuICB9XG5cbiAgc2Vjb25kc1RvVGltZVN0cmluZyhzZWNvbmRzOiBudW1iZXIpIHtcbiAgICBjb25zdCBob3VycyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDM2MDApICUgMTIgfHwgMTI7XG4gICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKHNlY29uZHMgJSAzNjAwKSAvIDYwKTtcbiAgICBjb25zdCBzZWNvbmRzUGFydCA9IHNlY29uZHMgJSA2MDtcbiAgICByZXR1cm4gYCR7aG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke21pbnV0ZXMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke3NlY29uZHNQYXJ0LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX1gO1xuICB9XG5cbiAgaGFuZGxlQ2FsdWxhdGVIYWxmVGltZShleHBpcmVUaW1lOiBzdHJpbmcsIGlzSGFsZlRpbWU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IFtleHBpcmVIb3VycywgZXhwaXJlTWludXRlcywgZXhwaXJlU2Vjb25kc10gPSBleHBpcmVUaW1lLnNwbGl0KCc6JykubWFwKE51bWJlcik7XG4gICAgY29uc3QgeyBob3VyczogY3VycmVudEhvdXJzLCBtaW51dGVzOiBjdXJyZW50TWludXRlcywgc2Vjb25kczogY3VycmVudFNlY29uZHMsIHBlcmlvZDogY3VycmVudFBlcmlvZCB9ID0gdGhpcy5nZXRDdXJyZW50VGltZSgpO1xuXG4gICAgY29uc3QgZXhwaXJlVGltZUluU2Vjb25kcyA9IHRoaXMudGltZVRvU2Vjb25kcyhleHBpcmVIb3VycywgZXhwaXJlTWludXRlcywgZXhwaXJlU2Vjb25kcyk7XG4gICAgY29uc3QgY3VycmVudFRpbWVJblNlY29uZHMgPSB0aGlzLnRpbWVUb1NlY29uZHMoY3VycmVudEhvdXJzLCBjdXJyZW50TWludXRlcywgY3VycmVudFNlY29uZHMpO1xuXG4gICAgbGV0IGhhbGZ3YXlUaW1lSW5TZWNvbmRzOiBudW1iZXI7XG4gICAgaWYgKGlzSGFsZlRpbWUpIHtcbiAgICAgIGhhbGZ3YXlUaW1lSW5TZWNvbmRzID0gZXhwaXJlVGltZUluU2Vjb25kcyArIGN1cnJlbnRUaW1lSW5TZWNvbmRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYWxmd2F5VGltZUluU2Vjb25kcyA9IE1hdGguZmxvb3IoKGV4cGlyZVRpbWVJblNlY29uZHMgKyBjdXJyZW50VGltZUluU2Vjb25kcykgLyAyKTtcbiAgICB9XG5cbiAgICBpZiAoaGFsZndheVRpbWVJblNlY29uZHMgPCAwKSB7XG4gICAgICBoYWxmd2F5VGltZUluU2Vjb25kcyArPSAxMiAqIDM2MDA7XG4gICAgfSBlbHNlIGlmIChoYWxmd2F5VGltZUluU2Vjb25kcyA+PSAxMiAqIDM2MDApIHtcbiAgICAgIGhhbGZ3YXlUaW1lSW5TZWNvbmRzIC09IDEyICogMzYwMDtcbiAgICB9XG5cbiAgICBjb25zdCBoYWxmd2F5VGltZVN0cmluZyA9IHRoaXMuc2Vjb25kc1RvVGltZVN0cmluZyhoYWxmd2F5VGltZUluU2Vjb25kcyk7XG5cbiAgICBsZXQgaXNIYWxmVGltZUdyZWF0ZXIgPSBmYWxzZTtcbiAgICBpZiAoaGFsZndheVRpbWVTdHJpbmcuZW5kc1dpdGgoJ0FNJykgJiYgZXhwaXJlVGltZS5lbmRzV2l0aCgnUE0nKSkge1xuICAgICAgaXNIYWxmVGltZUdyZWF0ZXIgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGhhbGZ3YXlUaW1lU3RyaW5nLmVuZHNXaXRoKCdQTScpICYmIGV4cGlyZVRpbWUuZW5kc1dpdGgoJ0FNJykpIHtcbiAgICAgIGlzSGFsZlRpbWVHcmVhdGVyID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNIYWxmVGltZUdyZWF0ZXIgPSBoYWxmd2F5VGltZVN0cmluZyA+IGV4cGlyZVRpbWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgaGFsZndheVRpbWVTdHJpbmcsIGlzSGFsZlRpbWVHcmVhdGVyIH07XG4gIH1cblxuICBjaGVja0hhbGZUaW1lSXNHcmVhdGVyKCkge1xuICAgIC8vIGNvbnN0IGdldFJlZnJlc2hUb2tlbkhhbGZUaW1lOiBzdHJpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLnJlZnJlc2hUb2tlbkV4cGlyZVRpbWVTdG9yYWdlS2V5KSBhcyBzdHJpbmc7XG4gICAgY29uc3QgZ2V0UmVmcmVzaFRva2VuSGFsZlRpbWUgPSBMb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oU3RvcmFnZUtleXMuUkVGUkVTSF9UT0tFTl9IQUxGX0VYUFJFX1RJTUUpXG4gICAgaWYgKCFnZXRSZWZyZXNoVG9rZW5IYWxmVGltZSkgdGhyb3cgbmV3IEVycm9yKCdSZWZyZXNoIHRva2VuIGhhbGYgdGltZSBpcyBtaXNzaW5nJyk7XG4gICAgY29uc3QgeyBpc0hhbGZUaW1lR3JlYXRlciwgaGFsZndheVRpbWVTdHJpbmcgfSA9IHRoaXMuaGFuZGxlQ2FsdWxhdGVIYWxmVGltZShnZXRSZWZyZXNoVG9rZW5IYWxmVGltZSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHsgaXNIYWxmVGltZUdyZWF0ZXIsIGhhbGZ3YXlUaW1lU3RyaW5nIH07XG4gIH1cbn1cbiJdfQ==
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1hdXRoLmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcGxhdGZvcm0taHR0cC1pbnRlcmNlcHRvci9zcmMvbGliL2h0dHAtYXV0aC5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFVQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDM0YsT0FBTyxFQUFjLFVBQVUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7O0FBTTNDLE1BQU0sT0FBTyxtQkFBbUI7SUFHOUIsWUFDVSxNQUFjLEVBQ2Qsd0JBQWtELEVBQ2xELG1CQUF3QztRQUZ4QyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBTGxELGlCQUFZLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN6QixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFLckIsQ0FBQztJQUVMLFNBQVMsQ0FBQyxPQUE2QixFQUFFLElBQWlCO1FBQ3hELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksU0FBUyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEUsSUFBSSxPQUFPLEdBQUksT0FBTyxDQUFDO1FBQ3ZCLElBQUksU0FBUyxFQUFFO1lBQ2IsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQ3RCLFVBQVUsRUFBRTtvQkFDVixhQUFhLEVBQUUsVUFBVSxTQUFTLEVBQUU7aUJBQ3JDO2FBQ0YsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxD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LDBCQUEwQixFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELHdCQUF3QjtRQUN0QixNQUFNLGdCQUFnQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDbkMsS0FBSyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQzsrR0E5RVUsbUJBQW1CO21IQUFuQixtQkFBbUIsY0FIbEIsTUFBTTs7NEZBR1AsbUJBQW1CO2tCQUovQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEh0dHBFcnJvclJlc3BvbnNlLFxuICBIdHRwRXZlbnQsXG4gIEh0dHBIYW5kbGVyLFxuICBIdHRwSW50ZXJjZXB0b3IsXG4gIEh0dHBSZXF1ZXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFJlZnJlc2hUb2tlblNlcnZpY2UgfSBmcm9tICdAcHJvZ3Jlc3MtY2hlZi9wbGF0Zm9ybS1yZWZyZXNoLXRva2VuLXNlcnZpY2UnXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnQHByb2dyZXNzLWNoZWYvcGxhdGZvcm0tc2hhcmVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgTG9jYWxTdG9yYWdlU2VydmljZSwgU3RvcmFnZUtleXMgfSBmcm9tICdAcHJvZ3Jlc3MtY2hlZi9wbGF0Zm9ybS1zdG9yYWdlLXNlcnZpY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgY2F0Y2hFcnJvciwgdGhyb3dFcnJvciwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5cbmV4cG9ydCBjbGFzcyBIdHRwQXV0aEludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcbiAgYXV0aFRva2VuU2V0ID0gbmV3IFNldCgpO1xuICBpc1Nlc3Npb25FeHBpcmVkID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSB0b2FzdE5vdGlmaWNhdGlvblNlcnZpY2U6IFRvYXN0Tm90aWZpY2F0aW9uU2VydmljZSwgXG4gICAgcHJpdmF0ZSByZWZyZXNoVG9rZW5TZXJ2aWNlOiBSZWZyZXNoVG9rZW5TZXJ2aWNlLFxuICApIHsgfVxuXG4gIGludGVyY2VwdChyZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj4ge1xuICAgIHRoaXMudHJpZ2dlclJlZnJlc2hUb2tlblRpbWVyKCk7XG4gICAgbGV0IGF1dGhUb2tlbiA9IExvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5BVVRIX1RPS0VOKTtcbiAgICBsZXQgYXV0aFJlcSA9ICByZXF1ZXN0O1xuICAgIGlmIChhdXRoVG9rZW4pIHtcbiAgICAgIGF1dGhSZXEgPSByZXF1ZXN0LmNsb25lKHtcbiAgICAgICAgc2V0SGVhZGVyczoge1xuICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthdXRoVG9rZW59YFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKCF0aGlzLmF1dGhUb2tlblNldC5oYXMoYXV0aFRva2VuKSkge1xuICAgICAgICB0aGlzLmlzU2Vzc2lvbkV4cGlyZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXV0aFRva2VuU2V0LmFkZChhdXRoVG9rZW4pO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dC5oYW5kbGUoYXV0aFJlcSkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICBjb25zdCBsb2dpblR5cGUgPSBMb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oU3RvcmFnZUtleXMuTE9HSU5fVFlQRSk7XG4gICAgICAgICAgaWYgKGxvZ2luVHlwZSA9PT0gJ3NhbWwnIHx8IGxvZ2luVHlwZSA9PT0gJ29hdXRoJykge1xuICAgICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLlVTRVJfTkFNRSk7XG4gICAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuSVNfUkVNRU1CRVJfTUUpOyBcbiAgICAgICAgICB9XG4gICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLklTX1VTRVJfT1JHX0FORF9ST0xFX1NFVCwgZmFsc2UpO1xuICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5JU19VU0VSX0FVVEhFTlRJQ0FURUQsIGZhbHNlKTtcbiAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuQVVUSF9UT0tFTik7XG4gICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLkxPR0lOX1RZUEUpO1xuICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbShTdG9yYWdlS2V5cy5JREVOVElUWV9UT0tFTik7XG4gICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLlVTRVJfT1JHX0FORF9ST0xFX1RPS0VOKTtcbiAgICAgICAgICAvLyBjYWxsIGxvZ291dCBhY3Rpb25cbiAgICAgICAgICBpZiAoIXRoaXMuaXNTZXNzaW9uRXhwaXJlZCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgY29udGVudDogJ1RoZSBzZXNzaW9uIGhhcyBlbmRlZC4nXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuaXNTZXNzaW9uRXhwaXJlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2xvZ2luJ10pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gMCB8fCBlcnJvci5zdGF0dXMgPT09IDUwNCkge1xuICAgICAgICAgIHRoaXMudG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlLnNob3dUb2FzdE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICBjb250ZW50OiBgVW5hYmxlIHRvIHJlYWNoIHNlcnZlci4gUGxlYXNlIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgICAgdHlwZTogeyBzdHlsZTogJ2Vycm9yJywgaWNvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgIHRoaXMudG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlLnNob3dUb2FzdE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICBjb250ZW50OiBgU29tZXRoaW5nIHdlbnQgd3JvbmcuIFBsZWFzZSB0cnkgYWdhaW4uYCxcbiAgICAgICAgICAgIHR5cGU6IHsgc3R5bGU6ICdlcnJvcicsIGljb246IHRydWUgfSxcbiAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcilcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJlZnJlc2hUb2tlbigpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gTG9jYWxTdG9yYWdlU2VydmljZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLkNVUlJFTlRfU0VSVkVSX0JBU0VfVVJMKTtcbiAgICBpZiAoIWJhc2VVcmwpIHRocm93IG5ldyBFcnJvcignVGhlIGJhY2tlbmQgb3Igc2VydmVyIGJhc2UgVVJMIGlzIG1pc3NpbmcgaW4gTG9jYWwgU3RvcmFnZScpO1xuICAgIHRoaXMucmVmcmVzaFRva2VuU2VydmljZS5yZWZyZXNoVG9rZW4oeyBwbGF0Zm9ybVNlcnZpY2VBcGlCYXNlVXJsczogYmFzZVVybCB9KTtcbiAgfVxuXG4gIHRyaWdnZXJSZWZyZXNoVG9rZW5UaW1lcigpIHtcbiAgICBjb25zdCByZWZyZXNoVG9rZW5UaW1lID0gMjAgKiAxMDAwO1xuICAgIHRpbWVyKDAsIHJlZnJlc2hUb2tlblRpbWUpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnJlZnJlc2hUb2tlbigpO1xuICAgIH0pXG4gIH1cblxuICAvLyBhc3luYyBtYW5hZ2VSZWZyZXNoVG9rZW5FeHBpcmVUaW1lKCkge1xuICAvLyAgIGNvbnN0IG5ld0V4cGlyZVRpbWUgPSBhd2FpdCB0aGlzLmdldEV4cGlyZUF0VGltZSgpXG4gIC8vICAgY29uc3QgeyBoYWxmd2F5VGltZVN0cmluZyB9ID0gdGhpcy5oYW5kbGVDYWx1bGF0ZUhhbGZUaW1lKG5ld0V4cGlyZVRpbWUpXG4gIC8vICAgTG9jYWxTdG9yYWdlU2VydmljZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLlJFRlJFU0hfVE9LRU5fSEFMRl9FWFBSRV9USU1FLCBoYWxmd2F5VGltZVN0cmluZylcbiAgLy8gfVxuXG4gIC8vIG1hbmFnZVRva2VuUmVmcmVzaCgpIHtcbiAgLy8gICBjb25zdCB7IGlzSGFsZlRpbWVHcmVhdGVyIH0gPSB0aGlzLmNoZWNrSGFsZlRpbWVJc0dyZWF0ZXIoKTtcbiAgLy8gICBpZiAoaXNIYWxmVGltZUdyZWF0ZXIpIHtcbiAgLy8gICAgIHRoaXMucmVmcmVzaFRva2VuKCk7XG4gIC8vICAgICB0aGlzLm1hbmFnZVJlZnJlc2hUb2tlbkV4cGlyZVRpbWUoKTtcbiAgLy8gICAgIC8vIGNvbnN0IG5ld0V4cGlyZVRpbWUgPSB0aGlzLmdldEV4cGlyZUF0VGltZSgpXG4gIC8vICAgICAvLyBjb25zdCB7IGhhbGZ3YXlUaW1lU3RyaW5nIH0gPSB0aGlzLmhhbmRsZUNhbHVsYXRlSGFsZlRpbWUobmV3RXhwaXJlVGltZSlcbiAgLy8gICAgIC8vIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMucmVmcmVzaFRva2VuRXhwaXJlVGltZVN0b3JhZ2VLZXksIGhhbGZ3YXlUaW1lU3RyaW5nKVxuICAvLyAgICAgLy8gTG9jYWxTdG9yYWdlU2VydmljZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLlJFRlJFU0hfVE9LRU5fSEFMRl9FWFBSRV9USU1FLCBoYWxmd2F5VGltZVN0cmluZylcbiAgLy8gICB9XG4gIC8vIH1cblxuICAvLyBhc3luYyBnZXRFeHBpcmVBdFRpbWUoKSB7XG4gIC8vICAgYXdhaXQgdGhpcy5kZWxheSgyMDAwKVxuICAvLyAgIGxldCBpc0lkZW50aXR5VG9rZW4gPSBMb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oU3RvcmFnZUtleXMuSURFTlRJVFlfVE9LRU4pO1xuICAvLyAgIGNvbnNvbGUubG9nKCc9PT09PT09IGNoZWNrIGlzIHRva2VuIGF2YWlsYWJlIC0tLS0tLS0tJywgaXNJZGVudGl0eVRva2VuKSAgXG4gIC8vICAgaWYgKCFpc0lkZW50aXR5VG9rZW4pIHRocm93IG5ldyBFcnJvcignaWRlbnRpdHkgdG9rZW4gaXMgbWlzc2luZyBpbiB0aGUgbG9jYWwgc3RvcmFnZScpO1xuICAvLyAgIGNvbnN0IHsgZXhwaXJlQXQgfSA9IGlzSWRlbnRpdHlUb2tlbjtcbiAgLy8gICBjb25zdCBkYXRlID0gbmV3IERhdGUoZXhwaXJlQXQgKiAxMDAwKTtcbiAgLy8gICBjb25zdCBob3VycyA9IGRhdGUuZ2V0VVRDSG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gIC8vICAgY29uc3QgbWludXRlcyA9IGRhdGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgLy8gICBjb25zdCBzZWNvbmRzID0gZGF0ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAvLyAgIGNvbnN0IGxhdGVzdFJlZnJlc2hUb2tlbkV4cGlyZVRpbWUgPSBgJHtob3Vyc306JHttaW51dGVzfToke3NlY29uZHN9YDsgLy8xMDowMDowMFxuICAvLyAgIHJldHVybiBsYXRlc3RSZWZyZXNoVG9rZW5FeHBpcmVUaW1lO1xuICAvLyB9XG5cbiAgLy8gZ2V0Q3VycmVudFRpbWUoKSB7XG4gIC8vICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgLy8gICBjb25zdCBvcHRpb25zID0geyB0aW1lWm9uZTogJ0FzaWEvS29sa2F0YScgfTtcbiAgLy8gICBjb25zdCBmb3JtYXR0ZWRUaW1lID0gbm93LnRvTG9jYWxlU3RyaW5nKCdlbi1JTicsIHsgaG91cjEyOiB0cnVlLCAuLi5vcHRpb25zIH0pO1xuICAvLyAgIGNvbnN0IFt0aW1lLCBwZXJpb2RdID0gZm9ybWF0dGVkVGltZS5zcGxpdCgnLCAnKVsxXS5zcGxpdCgnICcpO1xuICAvLyAgIGNvbnN0IFtob3VycywgbWludXRlcywgc2Vjb25kc10gPSB0aW1lLnNwbGl0KCc6JykubWFwKE51bWJlcik7XG4gIC8vICAgcmV0dXJuIHsgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIHBlcmlvZCB9O1xuICAvLyB9XG5cbiAgLy8gdGltZVRvU2Vjb25kcyhob3VyczogbnVtYmVyLCBtaW51dGVzOiBudW1iZXIsIHNlY29uZHM6IG51bWJlcikge1xuICAvLyAgIHJldHVybiBob3VycyAqIDM2MDAgKyBtaW51dGVzICogNjAgKyBzZWNvbmRzO1xuICAvLyB9XG5cbiAgLy8gc2Vjb25kc1RvVGltZVN0cmluZyhzZWNvbmRzOiBudW1iZXIpIHtcbiAgLy8gICBjb25zdCBob3VycyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDM2MDApICUgMTIgfHwgMTI7XG4gIC8vICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKHNlY29uZHMgJSAzNjAwKSAvIDYwKTtcbiAgLy8gICBjb25zdCBzZWNvbmRzUGFydCA9IHNlY29uZHMgJSA2MDtcbiAgLy8gICByZXR1cm4gYCR7aG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke21pbnV0ZXMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke3NlY29uZHNQYXJ0LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX1gO1xuICAvLyB9XG5cbiAgLy8gaGFuZGxlQ2FsdWxhdGVIYWxmVGltZShleHBpcmVUaW1lOiBzdHJpbmcsIGlzSGFsZlRpbWU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAvLyAgIGNvbnN0IFtleHBpcmVIb3VycywgZXhwaXJlTWludXRlcywgZXhwaXJlU2Vjb25kc10gPSBleHBpcmVUaW1lLnNwbGl0KCc6JykubWFwKE51bWJlcik7XG4gIC8vICAgY29uc3QgeyBob3VyczogY3VycmVudEhvdXJzLCBtaW51dGVzOiBjdXJyZW50TWludXRlcywgc2Vjb25kczogY3VycmVudFNlY29uZHMsIHBlcmlvZDogY3VycmVudFBlcmlvZCB9ID0gdGhpcy5nZXRDdXJyZW50VGltZSgpO1xuXG4gIC8vICAgY29uc3QgZXhwaXJlVGltZUluU2Vjb25kcyA9IHRoaXMudGltZVRvU2Vjb25kcyhleHBpcmVIb3VycywgZXhwaXJlTWludXRlcywgZXhwaXJlU2Vjb25kcyk7XG4gIC8vICAgY29uc3QgY3VycmVudFRpbWVJblNlY29uZHMgPSB0aGlzLnRpbWVUb1NlY29uZHMoY3VycmVudEhvdXJzLCBjdXJyZW50TWludXRlcywgY3VycmVudFNlY29uZHMpO1xuXG4gIC8vICAgbGV0IGhhbGZ3YXlUaW1lSW5TZWNvbmRzOiBudW1iZXI7XG4gIC8vICAgaWYgKGlzSGFsZlRpbWUpIHtcbiAgLy8gICAgIGhhbGZ3YXlUaW1lSW5TZWNvbmRzID0gZXhwaXJlVGltZUluU2Vjb25kcyArIGN1cnJlbnRUaW1lSW5TZWNvbmRzO1xuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICBoYWxmd2F5VGltZUluU2Vjb25kcyA9IE1hdGguZmxvb3IoKGV4cGlyZVRpbWVJblNlY29uZHMgKyBjdXJyZW50VGltZUluU2Vjb25kcykgLyAyKTtcbiAgLy8gICB9XG5cbiAgLy8gICBpZiAoaGFsZndheVRpbWVJblNlY29uZHMgPCAwKSB7XG4gIC8vICAgICBoYWxmd2F5VGltZUluU2Vjb25kcyArPSAxMiAqIDM2MDA7XG4gIC8vICAgfSBlbHNlIGlmIChoYWxmd2F5VGltZUluU2Vjb25kcyA+PSAxMiAqIDM2MDApIHtcbiAgLy8gICAgIGhhbGZ3YXlUaW1lSW5TZWNvbmRzIC09IDEyICogMzYwMDtcbiAgLy8gICB9XG5cbiAgLy8gICBjb25zdCBoYWxmd2F5VGltZVN0cmluZyA9IHRoaXMuc2Vjb25kc1RvVGltZVN0cmluZyhoYWxmd2F5VGltZUluU2Vjb25kcyk7XG5cbiAgLy8gICBsZXQgaXNIYWxmVGltZUdyZWF0ZXIgPSBmYWxzZTtcbiAgLy8gICBpZiAoaGFsZndheVRpbWVTdHJpbmcuZW5kc1dpdGgoJ0FNJykgJiYgZXhwaXJlVGltZS5lbmRzV2l0aCgnUE0nKSkge1xuICAvLyAgICAgaXNIYWxmVGltZUdyZWF0ZXIgPSBmYWxzZTtcbiAgLy8gICB9IGVsc2UgaWYgKGhhbGZ3YXlUaW1lU3RyaW5nLmVuZHNXaXRoKCdQTScpICYmIGV4cGlyZVRpbWUuZW5kc1dpdGgoJ0FNJykpIHtcbiAgLy8gICAgIGlzSGFsZlRpbWVHcmVhdGVyID0gdHJ1ZTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgaXNIYWxmVGltZUdyZWF0ZXIgPSBoYWxmd2F5VGltZVN0cmluZyA+IGV4cGlyZVRpbWU7XG4gIC8vICAgfVxuXG4gIC8vICAgcmV0dXJuIHsgaGFsZndheVRpbWVTdHJpbmcsIGlzSGFsZlRpbWVHcmVhdGVyIH07XG4gIC8vIH1cblxuICAvLyBjaGVja0hhbGZUaW1lSXNHcmVhdGVyKCkge1xuICAvLyAgIC8vIGNvbnN0IGdldFJlZnJlc2hUb2tlbkhhbGZUaW1lOiBzdHJpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLnJlZnJlc2hUb2tlbkV4cGlyZVRpbWVTdG9yYWdlS2V5KSBhcyBzdHJpbmc7XG4gIC8vICAgY29uc3QgZ2V0UmVmcmVzaFRva2VuSGFsZlRpbWUgPSBMb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oU3RvcmFnZUtleXMuUkVGUkVTSF9UT0tFTl9IQUxGX0VYUFJFX1RJTUUpXG4gIC8vICAgaWYgKCFnZXRSZWZyZXNoVG9rZW5IYWxmVGltZSkgdGhyb3cgbmV3IEVycm9yKCdSZWZyZXNoIHRva2VuIGhhbGYgdGltZSBpcyBtaXNzaW5nJyk7XG4gIC8vICAgY29uc3QgeyBpc0hhbGZUaW1lR3JlYXRlciwgaGFsZndheVRpbWVTdHJpbmcgfSA9IHRoaXMuaGFuZGxlQ2FsdWxhdGVIYWxmVGltZShnZXRSZWZyZXNoVG9rZW5IYWxmVGltZSwgdHJ1ZSk7XG4gIC8vICAgcmV0dXJuIHsgaXNIYWxmVGltZUdyZWF0ZXIsIGhhbGZ3YXlUaW1lU3RyaW5nIH07XG4gIC8vIH1cblxuICAvLyBkZWxheShtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuICAvLyB9XG59XG4iXX0=
@@ -1,5 +1,5 @@
1
1
  import { LocalStorageService, StorageKeys } from '@progress-chef/platform-storage-service';
2
- import { catchError, throwError } from 'rxjs';
2
+ import { catchError, throwError, timer } from 'rxjs';
3
3
  import * as i0 from '@angular/core';
4
4
  import { Injectable } from '@angular/core';
5
5
  import * as i1 from '@angular/router';
@@ -14,13 +14,8 @@ class HttpAuthInterceptor {
14
14
  this.authTokenSet = new Set();
15
15
  this.isSessionExpired = false;
16
16
  }
17
- // private currentBaseUrlFromLocalStorage: string = 'currentServerBaseUrl';
18
- // private refreshTokenExpireTimeStorageKey: string = 'refreshTokenExpireTime';
19
17
  intercept(request, next) {
20
- const getRefreshTokenHalfTime = LocalStorageService.getItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME);
21
- if (getRefreshTokenHalfTime) {
22
- this.manageTokenRefresh();
23
- }
18
+ this.triggerRefreshTokenTimer();
24
19
  let authToken = LocalStorageService.getItem(StorageKeys.AUTH_TOKEN);
25
20
  let authReq = request;
26
21
  if (authToken) {
@@ -73,101 +68,17 @@ class HttpAuthInterceptor {
73
68
  return throwError(() => error);
74
69
  }));
75
70
  }
76
- manageRefreshTokenExpireTime() {
77
- const newExpireTime = this.getExpireAtTime();
78
- const { halfwayTimeString } = this.handleCalulateHalfTime(newExpireTime);
79
- LocalStorageService.setItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME, halfwayTimeString);
80
- }
81
- manageTokenRefresh() {
82
- const { isHalfTimeGreater } = this.checkHalfTimeIsGreater();
83
- if (isHalfTimeGreater) {
84
- this.refreshToken();
85
- this.manageRefreshTokenExpireTime();
86
- // const newExpireTime = this.getExpireAtTime()
87
- // const { halfwayTimeString } = this.handleCalulateHalfTime(newExpireTime)
88
- // localStorage.setItem(this.refreshTokenExpireTimeStorageKey, halfwayTimeString)
89
- // LocalStorageService.setItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME, halfwayTimeString)
90
- }
91
- }
92
71
  refreshToken() {
93
- // const baseUrl: string = localStorage.getItem(this.currentBaseUrlFromLocalStorage) as string;
94
72
  const baseUrl = LocalStorageService.getItem(StorageKeys.CURRENT_SERVER_BASE_URL);
95
73
  if (!baseUrl)
96
74
  throw new Error('The backend or server base URL is missing in Local Storage');
97
75
  this.refreshTokenService.refreshToken({ platformServiceApiBaseUrls: baseUrl });
98
76
  }
99
- getExpireAtTime() {
100
- let isIdentityToken;
101
- setTimeout(() => {
102
- isIdentityToken = LocalStorageService.getItem(StorageKeys.IDENTITY_TOKEN);
103
- console.log('--------------getting first time token', isIdentityToken);
104
- }, 2000);
105
- console.log('======= check is token availabe --------', isIdentityToken);
106
- if (!isIdentityToken)
107
- throw new Error('identity token is missing in the local storage');
108
- const { expireAt } = isIdentityToken;
109
- const date = new Date(expireAt * 1000);
110
- const hours = date.getUTCHours().toString().padStart(2, '0');
111
- const minutes = date.getUTCMinutes().toString().padStart(2, '0');
112
- const seconds = date.getUTCSeconds().toString().padStart(2, '0');
113
- const latestRefreshTokenExpireTime = `${hours}:${minutes}:${seconds}`; //10:00:00
114
- return latestRefreshTokenExpireTime;
115
- }
116
- getCurrentTime() {
117
- const now = new Date();
118
- const options = { timeZone: 'Asia/Kolkata' };
119
- const formattedTime = now.toLocaleString('en-IN', { hour12: true, ...options });
120
- const [time, period] = formattedTime.split(', ')[1].split(' ');
121
- const [hours, minutes, seconds] = time.split(':').map(Number);
122
- return { hours, minutes, seconds, period };
123
- }
124
- timeToSeconds(hours, minutes, seconds) {
125
- return hours * 3600 + minutes * 60 + seconds;
126
- }
127
- secondsToTimeString(seconds) {
128
- const hours = Math.floor(seconds / 3600) % 12 || 12;
129
- const minutes = Math.floor((seconds % 3600) / 60);
130
- const secondsPart = seconds % 60;
131
- return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secondsPart.toString().padStart(2, '0')}`;
132
- }
133
- handleCalulateHalfTime(expireTime, isHalfTime = false) {
134
- const [expireHours, expireMinutes, expireSeconds] = expireTime.split(':').map(Number);
135
- const { hours: currentHours, minutes: currentMinutes, seconds: currentSeconds, period: currentPeriod } = this.getCurrentTime();
136
- const expireTimeInSeconds = this.timeToSeconds(expireHours, expireMinutes, expireSeconds);
137
- const currentTimeInSeconds = this.timeToSeconds(currentHours, currentMinutes, currentSeconds);
138
- let halfwayTimeInSeconds;
139
- if (isHalfTime) {
140
- halfwayTimeInSeconds = expireTimeInSeconds + currentTimeInSeconds;
141
- }
142
- else {
143
- halfwayTimeInSeconds = Math.floor((expireTimeInSeconds + currentTimeInSeconds) / 2);
144
- }
145
- if (halfwayTimeInSeconds < 0) {
146
- halfwayTimeInSeconds += 12 * 3600;
147
- }
148
- else if (halfwayTimeInSeconds >= 12 * 3600) {
149
- halfwayTimeInSeconds -= 12 * 3600;
150
- }
151
- const halfwayTimeString = this.secondsToTimeString(halfwayTimeInSeconds);
152
- let isHalfTimeGreater = false;
153
- if (halfwayTimeString.endsWith('AM') && expireTime.endsWith('PM')) {
154
- isHalfTimeGreater = false;
155
- }
156
- else if (halfwayTimeString.endsWith('PM') && expireTime.endsWith('AM')) {
157
- isHalfTimeGreater = true;
158
- }
159
- else {
160
- isHalfTimeGreater = halfwayTimeString > expireTime;
161
- }
162
- return { halfwayTimeString, isHalfTimeGreater };
163
- }
164
- checkHalfTimeIsGreater() {
165
- // const getRefreshTokenHalfTime: string = localStorage.getItem(this.refreshTokenExpireTimeStorageKey) as string;
166
- const getRefreshTokenHalfTime = LocalStorageService.getItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME);
167
- if (!getRefreshTokenHalfTime)
168
- throw new Error('Refresh token half time is missing');
169
- const { isHalfTimeGreater, halfwayTimeString } = this.handleCalulateHalfTime(getRefreshTokenHalfTime, true);
170
- return { isHalfTimeGreater, halfwayTimeString };
77
+ triggerRefreshTokenTimer() {
78
+ const refreshTokenTime = 20 * 1000;
79
+ timer(0, refreshTokenTime).subscribe(() => {
80
+ this.refreshToken();
81
+ });
171
82
  }
172
83
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HttpAuthInterceptor, deps: [{ token: i1.Router }, { token: i2.ToastNotificationService }, { token: i3.RefreshTokenService }], target: i0.ɵɵFactoryTarget.Injectable }); }
173
84
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HttpAuthInterceptor, providedIn: 'root' }); }
@@ -1 +1 @@
1
- {"version":3,"file":"progress-chef-platform-http-interceptor.mjs","sources":["../../../projects/platform-http-interceptor/src/lib/http-auth.interceptor.ts","../../../projects/platform-http-interceptor/src/public-api.ts","../../../projects/platform-http-interceptor/src/progress-chef-platform-http-interceptor.ts"],"sourcesContent":["import {\n HttpErrorResponse,\n HttpEvent,\n HttpHandler,\n HttpInterceptor,\n HttpRequest\n} from '@angular/common/http';\n// import { RefreshTokenService } from '../../../../dist/platform-refresh-token-service/index';\nimport { RefreshTokenService } from '@progress-chef/platform-refresh-token-service'\nimport { Router } from '@angular/router';\nimport { ToastNotificationService } from '@progress-chef/platform-shared-components';\nimport { LocalStorageService, StorageKeys } from '@progress-chef/platform-storage-service';\nimport { Observable, catchError, throwError } from 'rxjs';\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\n\nexport class HttpAuthInterceptor implements HttpInterceptor {\n authTokenSet = new Set();\n isSessionExpired = false;\n constructor(\n private router: Router,\n private toastNotificationService: ToastNotificationService, \n private refreshTokenService: RefreshTokenService,\n ) { }\n\n // private currentBaseUrlFromLocalStorage: string = 'currentServerBaseUrl';\n // private refreshTokenExpireTimeStorageKey: string = 'refreshTokenExpireTime';\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n\n const getRefreshTokenHalfTime = LocalStorageService.getItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME)\n if (getRefreshTokenHalfTime) {\n this.manageTokenRefresh();\n }\n\n let authToken = LocalStorageService.getItem(StorageKeys.AUTH_TOKEN);\n let authReq = request;\n if (authToken) {\n authReq = request.clone({\n setHeaders: {\n Authorization: `Bearer ${authToken}`\n }\n })\n if (!this.authTokenSet.has(authToken)) {\n this.isSessionExpired = false;\n }\n this.authTokenSet.add(authToken);\n }\n return next.handle(authReq).pipe(\n catchError((error: HttpErrorResponse) => {\n if (error.status === 401) {\n const loginType = LocalStorageService.getItem(StorageKeys.LOGIN_TYPE);\n if (loginType === 'saml' || loginType === 'oauth') {\n LocalStorageService.removeItem(StorageKeys.USER_NAME);\n LocalStorageService.removeItem(StorageKeys.IS_REMEMBER_ME); \n }\n LocalStorageService.setItem(StorageKeys.IS_USER_ORG_AND_ROLE_SET, false);\n LocalStorageService.setItem(StorageKeys.IS_USER_AUTHENTICATED, false);\n LocalStorageService.removeItem(StorageKeys.AUTH_TOKEN);\n LocalStorageService.removeItem(StorageKeys.LOGIN_TYPE);\n LocalStorageService.removeItem(StorageKeys.IDENTITY_TOKEN);\n LocalStorageService.removeItem(StorageKeys.USER_ORG_AND_ROLE_TOKEN);\n // call logout action\n if (!this.isSessionExpired) {\n this.toastNotificationService.showToastNotification({\n content: 'The session has ended.'\n });\n this.isSessionExpired = true;\n }\n \n this.router.navigate(['/login'])\n }\n if (error.status === 0 || error.status === 504) {\n this.toastNotificationService.showToastNotification({\n content: `Unable to reach server. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true\n })\n }\n if (error.status === 500) {\n this.toastNotificationService.showToastNotification({\n content: `Something went wrong. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true\n })\n }\n return throwError(() => error)\n })\n );\n }\n\n manageRefreshTokenExpireTime() {\n const newExpireTime = this.getExpireAtTime()\n const { halfwayTimeString } = this.handleCalulateHalfTime(newExpireTime)\n LocalStorageService.setItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME, halfwayTimeString)\n }\n\n manageTokenRefresh() {\n const { isHalfTimeGreater } = this.checkHalfTimeIsGreater();\n if (isHalfTimeGreater) {\n this.refreshToken();\n this.manageRefreshTokenExpireTime();\n // const newExpireTime = this.getExpireAtTime()\n // const { halfwayTimeString } = this.handleCalulateHalfTime(newExpireTime)\n // localStorage.setItem(this.refreshTokenExpireTimeStorageKey, halfwayTimeString)\n // LocalStorageService.setItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME, halfwayTimeString)\n }\n }\n\n refreshToken() {\n // const baseUrl: string = localStorage.getItem(this.currentBaseUrlFromLocalStorage) as string;\n const baseUrl = LocalStorageService.getItem(StorageKeys.CURRENT_SERVER_BASE_URL);\n if (!baseUrl) throw new Error('The backend or server base URL is missing in Local Storage');\n this.refreshTokenService.refreshToken({ platformServiceApiBaseUrls: baseUrl });\n }\n\n getExpireAtTime() {\n let isIdentityToken;\n setTimeout(()=> {\n isIdentityToken = LocalStorageService.getItem(StorageKeys.IDENTITY_TOKEN);\n console.log('--------------getting first time token', isIdentityToken)\n }, 2000)\n console.log('======= check is token availabe --------', isIdentityToken) \n if (!isIdentityToken) throw new Error('identity token is missing in the local storage');\n const { expireAt } = isIdentityToken;\n const date = new Date(expireAt * 1000);\n const hours = date.getUTCHours().toString().padStart(2, '0');\n const minutes = date.getUTCMinutes().toString().padStart(2, '0');\n const seconds = date.getUTCSeconds().toString().padStart(2, '0');\n const latestRefreshTokenExpireTime = `${hours}:${minutes}:${seconds}`; //10:00:00\n return latestRefreshTokenExpireTime;\n }\n\n getCurrentTime() {\n const now = new Date();\n const options = { timeZone: 'Asia/Kolkata' };\n const formattedTime = now.toLocaleString('en-IN', { hour12: true, ...options });\n const [time, period] = formattedTime.split(', ')[1].split(' ');\n const [hours, minutes, seconds] = time.split(':').map(Number);\n return { hours, minutes, seconds, period };\n }\n\n timeToSeconds(hours: number, minutes: number, seconds: number) {\n return hours * 3600 + minutes * 60 + seconds;\n }\n\n secondsToTimeString(seconds: number) {\n const hours = Math.floor(seconds / 3600) % 12 || 12;\n const minutes = Math.floor((seconds % 3600) / 60);\n const secondsPart = seconds % 60;\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secondsPart.toString().padStart(2, '0')}`;\n }\n\n handleCalulateHalfTime(expireTime: string, isHalfTime: boolean = false) {\n const [expireHours, expireMinutes, expireSeconds] = expireTime.split(':').map(Number);\n const { hours: currentHours, minutes: currentMinutes, seconds: currentSeconds, period: currentPeriod } = this.getCurrentTime();\n\n const expireTimeInSeconds = this.timeToSeconds(expireHours, expireMinutes, expireSeconds);\n const currentTimeInSeconds = this.timeToSeconds(currentHours, currentMinutes, currentSeconds);\n\n let halfwayTimeInSeconds: number;\n if (isHalfTime) {\n halfwayTimeInSeconds = expireTimeInSeconds + currentTimeInSeconds;\n } else {\n halfwayTimeInSeconds = Math.floor((expireTimeInSeconds + currentTimeInSeconds) / 2);\n }\n\n if (halfwayTimeInSeconds < 0) {\n halfwayTimeInSeconds += 12 * 3600;\n } else if (halfwayTimeInSeconds >= 12 * 3600) {\n halfwayTimeInSeconds -= 12 * 3600;\n }\n\n const halfwayTimeString = this.secondsToTimeString(halfwayTimeInSeconds);\n\n let isHalfTimeGreater = false;\n if (halfwayTimeString.endsWith('AM') && expireTime.endsWith('PM')) {\n isHalfTimeGreater = false;\n } else if (halfwayTimeString.endsWith('PM') && expireTime.endsWith('AM')) {\n isHalfTimeGreater = true;\n } else {\n isHalfTimeGreater = halfwayTimeString > expireTime;\n }\n\n return { halfwayTimeString, isHalfTimeGreater };\n }\n\n checkHalfTimeIsGreater() {\n // const getRefreshTokenHalfTime: string = localStorage.getItem(this.refreshTokenExpireTimeStorageKey) as string;\n const getRefreshTokenHalfTime = LocalStorageService.getItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME)\n if (!getRefreshTokenHalfTime) throw new Error('Refresh token half time is missing');\n const { isHalfTimeGreater, halfwayTimeString } = this.handleCalulateHalfTime(getRefreshTokenHalfTime, true);\n return { isHalfTimeGreater, halfwayTimeString };\n }\n}\n","/*\n * Public API Surface of platform-http-interceptor\n */\n\nexport * from './lib/http-auth.interceptor';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"progress-chef-platform-http-interceptor.mjs","sources":["../../../projects/platform-http-interceptor/src/lib/http-auth.interceptor.ts","../../../projects/platform-http-interceptor/src/public-api.ts","../../../projects/platform-http-interceptor/src/progress-chef-platform-http-interceptor.ts"],"sourcesContent":["import {\n HttpErrorResponse,\n HttpEvent,\n HttpHandler,\n HttpInterceptor,\n HttpRequest\n} from '@angular/common/http';\nimport { RefreshTokenService } from '@progress-chef/platform-refresh-token-service'\nimport { Router } from '@angular/router';\nimport { ToastNotificationService } from '@progress-chef/platform-shared-components';\nimport { LocalStorageService, StorageKeys } from '@progress-chef/platform-storage-service';\nimport { Observable, catchError, throwError, timer } from 'rxjs';\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\n\nexport class HttpAuthInterceptor implements HttpInterceptor {\n authTokenSet = new Set();\n isSessionExpired = false;\n constructor(\n private router: Router,\n private toastNotificationService: ToastNotificationService, \n private refreshTokenService: RefreshTokenService,\n ) { }\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n this.triggerRefreshTokenTimer();\n let authToken = LocalStorageService.getItem(StorageKeys.AUTH_TOKEN);\n let authReq = request;\n if (authToken) {\n authReq = request.clone({\n setHeaders: {\n Authorization: `Bearer ${authToken}`\n }\n })\n if (!this.authTokenSet.has(authToken)) {\n this.isSessionExpired = false;\n }\n this.authTokenSet.add(authToken);\n }\n return next.handle(authReq).pipe(\n catchError((error: HttpErrorResponse) => {\n if (error.status === 401) {\n const loginType = LocalStorageService.getItem(StorageKeys.LOGIN_TYPE);\n if (loginType === 'saml' || loginType === 'oauth') {\n LocalStorageService.removeItem(StorageKeys.USER_NAME);\n LocalStorageService.removeItem(StorageKeys.IS_REMEMBER_ME); \n }\n LocalStorageService.setItem(StorageKeys.IS_USER_ORG_AND_ROLE_SET, false);\n LocalStorageService.setItem(StorageKeys.IS_USER_AUTHENTICATED, false);\n LocalStorageService.removeItem(StorageKeys.AUTH_TOKEN);\n LocalStorageService.removeItem(StorageKeys.LOGIN_TYPE);\n LocalStorageService.removeItem(StorageKeys.IDENTITY_TOKEN);\n LocalStorageService.removeItem(StorageKeys.USER_ORG_AND_ROLE_TOKEN);\n // call logout action\n if (!this.isSessionExpired) {\n this.toastNotificationService.showToastNotification({\n content: 'The session has ended.'\n });\n this.isSessionExpired = true;\n }\n \n this.router.navigate(['/login'])\n }\n if (error.status === 0 || error.status === 504) {\n this.toastNotificationService.showToastNotification({\n content: `Unable to reach server. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true\n })\n }\n if (error.status === 500) {\n this.toastNotificationService.showToastNotification({\n content: `Something went wrong. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true\n })\n }\n return throwError(() => error)\n })\n );\n }\n\n refreshToken() {\n const baseUrl = LocalStorageService.getItem(StorageKeys.CURRENT_SERVER_BASE_URL);\n if (!baseUrl) throw new Error('The backend or server base URL is missing in Local Storage');\n this.refreshTokenService.refreshToken({ platformServiceApiBaseUrls: baseUrl });\n }\n\n triggerRefreshTokenTimer() {\n const refreshTokenTime = 20 * 1000;\n timer(0, refreshTokenTime).subscribe(() => {\n this.refreshToken();\n })\n }\n\n // async manageRefreshTokenExpireTime() {\n // const newExpireTime = await this.getExpireAtTime()\n // const { halfwayTimeString } = this.handleCalulateHalfTime(newExpireTime)\n // LocalStorageService.setItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME, halfwayTimeString)\n // }\n\n // manageTokenRefresh() {\n // const { isHalfTimeGreater } = this.checkHalfTimeIsGreater();\n // if (isHalfTimeGreater) {\n // this.refreshToken();\n // this.manageRefreshTokenExpireTime();\n // // const newExpireTime = this.getExpireAtTime()\n // // const { halfwayTimeString } = this.handleCalulateHalfTime(newExpireTime)\n // // localStorage.setItem(this.refreshTokenExpireTimeStorageKey, halfwayTimeString)\n // // LocalStorageService.setItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME, halfwayTimeString)\n // }\n // }\n\n // async getExpireAtTime() {\n // await this.delay(2000)\n // let isIdentityToken = LocalStorageService.getItem(StorageKeys.IDENTITY_TOKEN);\n // console.log('======= check is token availabe --------', isIdentityToken) \n // if (!isIdentityToken) throw new Error('identity token is missing in the local storage');\n // const { expireAt } = isIdentityToken;\n // const date = new Date(expireAt * 1000);\n // const hours = date.getUTCHours().toString().padStart(2, '0');\n // const minutes = date.getUTCMinutes().toString().padStart(2, '0');\n // const seconds = date.getUTCSeconds().toString().padStart(2, '0');\n // const latestRefreshTokenExpireTime = `${hours}:${minutes}:${seconds}`; //10:00:00\n // return latestRefreshTokenExpireTime;\n // }\n\n // getCurrentTime() {\n // const now = new Date();\n // const options = { timeZone: 'Asia/Kolkata' };\n // const formattedTime = now.toLocaleString('en-IN', { hour12: true, ...options });\n // const [time, period] = formattedTime.split(', ')[1].split(' ');\n // const [hours, minutes, seconds] = time.split(':').map(Number);\n // return { hours, minutes, seconds, period };\n // }\n\n // timeToSeconds(hours: number, minutes: number, seconds: number) {\n // return hours * 3600 + minutes * 60 + seconds;\n // }\n\n // secondsToTimeString(seconds: number) {\n // const hours = Math.floor(seconds / 3600) % 12 || 12;\n // const minutes = Math.floor((seconds % 3600) / 60);\n // const secondsPart = seconds % 60;\n // return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secondsPart.toString().padStart(2, '0')}`;\n // }\n\n // handleCalulateHalfTime(expireTime: string, isHalfTime: boolean = false) {\n // const [expireHours, expireMinutes, expireSeconds] = expireTime.split(':').map(Number);\n // const { hours: currentHours, minutes: currentMinutes, seconds: currentSeconds, period: currentPeriod } = this.getCurrentTime();\n\n // const expireTimeInSeconds = this.timeToSeconds(expireHours, expireMinutes, expireSeconds);\n // const currentTimeInSeconds = this.timeToSeconds(currentHours, currentMinutes, currentSeconds);\n\n // let halfwayTimeInSeconds: number;\n // if (isHalfTime) {\n // halfwayTimeInSeconds = expireTimeInSeconds + currentTimeInSeconds;\n // } else {\n // halfwayTimeInSeconds = Math.floor((expireTimeInSeconds + currentTimeInSeconds) / 2);\n // }\n\n // if (halfwayTimeInSeconds < 0) {\n // halfwayTimeInSeconds += 12 * 3600;\n // } else if (halfwayTimeInSeconds >= 12 * 3600) {\n // halfwayTimeInSeconds -= 12 * 3600;\n // }\n\n // const halfwayTimeString = this.secondsToTimeString(halfwayTimeInSeconds);\n\n // let isHalfTimeGreater = false;\n // if (halfwayTimeString.endsWith('AM') && expireTime.endsWith('PM')) {\n // isHalfTimeGreater = false;\n // } else if (halfwayTimeString.endsWith('PM') && expireTime.endsWith('AM')) {\n // isHalfTimeGreater = true;\n // } else {\n // isHalfTimeGreater = halfwayTimeString > expireTime;\n // }\n\n // return { halfwayTimeString, isHalfTimeGreater };\n // }\n\n // checkHalfTimeIsGreater() {\n // // const getRefreshTokenHalfTime: string = localStorage.getItem(this.refreshTokenExpireTimeStorageKey) as string;\n // const getRefreshTokenHalfTime = LocalStorageService.getItem(StorageKeys.REFRESH_TOKEN_HALF_EXPRE_TIME)\n // if (!getRefreshTokenHalfTime) throw new Error('Refresh token half time is missing');\n // const { isHalfTimeGreater, halfwayTimeString } = this.handleCalulateHalfTime(getRefreshTokenHalfTime, true);\n // return { isHalfTimeGreater, halfwayTimeString };\n // }\n\n // delay(ms: number): Promise<void> {\n // return new Promise(resolve => setTimeout(resolve, ms));\n // }\n}\n","/*\n * Public API Surface of platform-http-interceptor\n */\n\nexport * from './lib/http-auth.interceptor';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -12,26 +12,8 @@ export declare class HttpAuthInterceptor implements HttpInterceptor {
12
12
  isSessionExpired: boolean;
13
13
  constructor(router: Router, toastNotificationService: ToastNotificationService, refreshTokenService: RefreshTokenService);
14
14
  intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>>;
15
- manageRefreshTokenExpireTime(): void;
16
- manageTokenRefresh(): void;
17
15
  refreshToken(): void;
18
- getExpireAtTime(): string;
19
- getCurrentTime(): {
20
- hours: number;
21
- minutes: number;
22
- seconds: number;
23
- period: string;
24
- };
25
- timeToSeconds(hours: number, minutes: number, seconds: number): number;
26
- secondsToTimeString(seconds: number): string;
27
- handleCalulateHalfTime(expireTime: string, isHalfTime?: boolean): {
28
- halfwayTimeString: string;
29
- isHalfTimeGreater: boolean;
30
- };
31
- checkHalfTimeIsGreater(): {
32
- isHalfTimeGreater: boolean;
33
- halfwayTimeString: string;
34
- };
16
+ triggerRefreshTokenTimer(): void;
35
17
  static ɵfac: i0.ɵɵFactoryDeclaration<HttpAuthInterceptor, never>;
36
18
  static ɵprov: i0.ɵɵInjectableDeclaration<HttpAuthInterceptor>;
37
19
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@progress-chef/platform-http-interceptor",
3
- "version": "0.0.14",
3
+ "version": "0.0.16",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^16.2.0",
6
6
  "@angular/core": "^16.2.0"