This commit is contained in:
2024-08-04 23:03:06 +03:00
parent e82a0ecb5e
commit e9735a4e99
8 changed files with 46 additions and 42 deletions

View File

@ -61,7 +61,7 @@ export class AuthService {
const token = localStorage.getItem(ApiService.tokenKey);
if (!token)
return of();
return of({} as TokenResponse);
const authToken = JSON.parse(token) as AuthToken;

View File

@ -1,7 +1,8 @@
import {BehaviorSubject, interval, Subscription, switchMap} from "rxjs";
import {BehaviorSubject, filter, interval, Subscription, switchMap} from "rxjs";
import {Injectable} from "@angular/core";
import {AuthService} from "@service/auth.service";
import {environment} from "@environment";
import ApiService from "@api/api.service";
@Injectable({
providedIn: 'root',
@ -15,12 +16,12 @@ export class TokenRefreshService {
this.setRefreshTokenExpireMs(AuthService.tokenExpiresIn.getTime() - 1000 - Date.now());
authService.tokenChangeError.subscribe(_ => {
console.log('Token change error event received');
console.debug('Token change error event received');
this.tokenRefreshing$.next(false);
this.stopTokenRefresh();
});
authService.expireTokenChange.subscribe(date => {
console.log('Expire token change event received:', date);
console.debug('Expire token change event received:', date);
this.setRefreshTokenExpireMs(date.getTime() - 1000 - Date.now());
});
}
@ -29,22 +30,26 @@ export class TokenRefreshService {
if (date)
this.refreshTokenExpireMs = new Date(date).getTime() - 1000 - Date.now();
if (!this.tokenRefreshSubscription || this.tokenRefreshSubscription.closed) {
this.tokenRefreshSubscription = interval(this.refreshTokenExpireMs).pipe(
switchMap(() => {
this.tokenRefreshing$.next(true);
return this.authService.refreshToken();
})
).subscribe({
next: (_) => {
this.tokenRefreshing$.next(false);
},
error: error => {
console.error('Token refresh error:', error);
this.tokenRefreshing$.next(false);
}
});
}
console.debug(this.tokenRefreshSubscription);
if (this.tokenRefreshSubscription && !this.tokenRefreshSubscription.closed)
return;
this.tokenRefreshSubscription = interval(this.refreshTokenExpireMs).pipe(
filter(isRefreshing => !isRefreshing),
switchMap(() => {
this.tokenRefreshing$.next(true);
console.debug('Send query to refresh token');
return this.authService.refreshToken();
})
).subscribe({
next: (_) => {
this.tokenRefreshing$.next(false);
},
error: error => {
this.tokenRefreshing$.next(false);
localStorage.removeItem(ApiService.tokenKey);
}
});
}
public getTokenRefreshing$(): BehaviorSubject<boolean> {
@ -60,13 +65,12 @@ export class TokenRefreshService {
public setRefreshTokenExpireMs(expireMs: number): void {
if (expireMs < environment.retryDelay)
expireMs = 3000;
expireMs = environment.retryDelay;
console.log(expireMs);
this.refreshTokenExpireMs = expireMs;
console.log(expireMs);
this.stopTokenRefresh();
this.startTokenRefresh();
}
}