Skip to content

Commit 0c0a4a7

Browse files
author
Manuel Rauber
committed
feat: introduce DateTimeProvider
1 parent 8d152c2 commit 0c0a4a7

File tree

4 files changed

+31
-9
lines changed

4 files changed

+31
-9
lines changed

projects/lib/src/angular-oauth-oidc.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { DateTimeProvider, SystemDateTimeProvider } from './date-time-provider';
12
import { OAuthStorage, OAuthLogger } from './types';
23
import { NgModule, ModuleWithProviders } from '@angular/core';
34
import { CommonModule } from '@angular/common';
@@ -48,7 +49,8 @@ export class OAuthModule {
4849
provide: HTTP_INTERCEPTORS,
4950
useClass: DefaultOAuthInterceptor,
5051
multi: true
51-
}
52+
},
53+
{ provide: DateTimeProvider, useClass: SystemDateTimeProvider }
5254
]
5355
};
5456
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { Injectable } from '@angular/core';
2+
3+
export abstract class DateTimeProvider {
4+
abstract now(): number;
5+
abstract new(): Date;
6+
}
7+
8+
@Injectable()
9+
export class SystemDateTimeProvider extends DateTimeProvider {
10+
now(): number {
11+
return Date.now();
12+
}
13+
14+
new(): Date {
15+
return new Date();
16+
}
17+
}

projects/lib/src/oauth-service.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
catchError
2727
} from 'rxjs/operators';
2828
import { DOCUMENT } from '@angular/common';
29+
import { DateTimeProvider } from './date-time-provider';
2930

3031
import {
3132
ValidationHandler,
@@ -120,7 +121,8 @@ export class OAuthService extends AuthConfig implements OnDestroy {
120121
protected urlHelper: UrlHelperService,
121122
protected logger: OAuthLogger,
122123
@Optional() protected crypto: HashHandler,
123-
@Inject(DOCUMENT) document: any
124+
@Inject(DOCUMENT) document: any,
125+
protected dateTimeService: DateTimeProvider,
124126
) {
125127
super();
126128

@@ -463,7 +465,7 @@ export class OAuthService extends AuthConfig implements OnDestroy {
463465
}
464466

465467
protected calcTimeout(storedAt: number, expiration: number): number {
466-
const now = Date.now();
468+
const now = this.dateTimeService.now();
467469
const delta =
468470
(expiration - storedAt) * this.timeoutFactor - (now - storedAt);
469471
return Math.max(0, delta);
@@ -1572,10 +1574,10 @@ export class OAuthService extends AuthConfig implements OnDestroy {
15721574
this._storage.setItem('granted_scopes', JSON.stringify(grantedScopes));
15731575
}
15741576

1575-
this._storage.setItem('access_token_stored_at', '' + Date.now());
1577+
this._storage.setItem('access_token_stored_at', '' + this.dateTimeService.now());
15761578
if (expiresIn) {
15771579
const expiresInMilliSeconds = expiresIn * 1000;
1578-
const now = new Date();
1580+
const now = this.dateTimeService.new();
15791581
const expiresAt = now.getTime() + expiresInMilliSeconds;
15801582
this._storage.setItem('expires_at', '' + expiresAt);
15811583
}
@@ -1973,7 +1975,7 @@ export class OAuthService extends AuthConfig implements OnDestroy {
19731975
this._storage.setItem('id_token', idToken.idToken);
19741976
this._storage.setItem('id_token_claims_obj', idToken.idTokenClaimsJson);
19751977
this._storage.setItem('id_token_expires_at', '' + idToken.idTokenExpiresAt);
1976-
this._storage.setItem('id_token_stored_at', '' + Date.now());
1978+
this._storage.setItem('id_token_stored_at', '' + this.dateTimeService.now());
19771979
}
19781980

19791981
protected storeSessionState(sessionState: string): void {
@@ -2094,7 +2096,7 @@ export class OAuthService extends AuthConfig implements OnDestroy {
20942096
return Promise.reject(err);
20952097
}
20962098

2097-
const now = Date.now();
2099+
const now = this.dateTimeService.now();
20982100
const issuedAtMSec = claims.iat * 1000;
20992101
const expiresAtMSec = claims.exp * 1000;
21002102
const clockSkewInMSec = (this.clockSkewInSec || 600) * 1000;
@@ -2254,7 +2256,7 @@ export class OAuthService extends AuthConfig implements OnDestroy {
22542256
public hasValidAccessToken(): boolean {
22552257
if (this.getAccessToken()) {
22562258
const expiresAt = this._storage.getItem('expires_at');
2257-
const now = new Date();
2259+
const now = this.dateTimeService.new();
22582260
if (expiresAt && parseInt(expiresAt, 10) < now.getTime()) {
22592261
return false;
22602262
}
@@ -2271,7 +2273,7 @@ export class OAuthService extends AuthConfig implements OnDestroy {
22712273
public hasValidIdToken(): boolean {
22722274
if (this.getIdToken()) {
22732275
const expiresAt = this._storage.getItem('id_token_expires_at');
2274-
const now = new Date();
2276+
const now = this.dateTimeService.new();
22752277
if (expiresAt && parseInt(expiresAt, 10) < now.getTime()) {
22762278
return false;
22772279
}

projects/lib/src/public_api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ export * from './events';
1212
export * from './interceptors/default-oauth.interceptor';
1313
export * from './interceptors/resource-server-error-handler';
1414
export * from './oauth-module.config';
15+
export * from './date-time-provider';

0 commit comments

Comments
 (0)