ekangularbase
Version:
Authentication service for usermanagement(oidc client)
185 lines (166 loc) • 7.49 kB
text/typescript
import { Injectable } from '@angular/core';
import { Effect, Actions } from '@ngrx/effects';
import { Action, Store } from '@ngrx/store';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/switchMap';
import 'rxjs/add/operator/switch';
import 'rxjs/add/observable/timer';
import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';
import * as ApplicationActions from './actions';
import { AuthService } from '../auth/auth.service';
import { MessageService } from 'node_modules/primeng/api';
import { AppConfig } from '../AppConfig/AppConfig';
export class ApplicationEffects {
DisableAutoLogout = true;
TIMEOUT = false;
interval: any;
intervalMsg: any;
countDownValue = 0;
InterfaceSeasonTimeOut = 0;
APPLICATION_TIMEOUT_TIME = 1000 * 60;
TIMEOUT_COUNT_DOWN = 30;
TIMEOUT_COUNT_DOWN_INTERVAL = 10;
extendApplicationTimeout$ = this.actions$
.switchMap((action: Action) => {
// console.log("action");
// console.log(action);
// var d = new Date();
// console.log(d);
if (this.TIMEOUT === true && action.type !== ApplicationActions.LOG_OUT) {
// console.log(action.type);
this.TIMEOUT = false;
}
return Observable.timer(this.APPLICATION_TIMEOUT_TIME);
})
.map(() => {
if (this.DisableAutoLogout === false && this.checkIsTimeOut() === true && this.TIMEOUT === false) {
console.log('LogoutTimer first', this.TIMEOUT_COUNT_DOWN);
this.TIMEOUT = true;
this.countDownValue = this.TIMEOUT_COUNT_DOWN - this.TIMEOUT_COUNT_DOWN_INTERVAL;
if (this.InterfaceSeasonTimeOut > (this.TIMEOUT_COUNT_DOWN * 1000)
&& this.countDownValue > 0) {
this.messageService.add({
severity: 'error', summary: 'Logout Warning',
detail: 'No action detected in a period of time. System will auto logout if no action detect within '
+ this.TIMEOUT_COUNT_DOWN + ' secound!'
});
this.countDownMessage();
} else {
this.authService.logOut();
}
}
return new ApplicationActions.LogOut();
});
constructor(private actions$: Actions, private authService: AuthService,
public messageService: MessageService, private appconfig: AppConfig) {
appconfig.onupdate.subscribe(result => {
try {
// console.log("AppConfig");
// console.log(result);
if (result) {
const s = AppConfig.systemSettings;
const i = s.find(a => a.name === 'InterfaceSeasonTimeOut');
// console.log(s);
// console.log(i);
if (i) {
this.DisableAutoLogout = false;
this.InterfaceSeasonTimeOut = 1000 * 60 * parseInt(i.value, 10);
if (parseInt(i.value, 10) >= 1) {
this.APPLICATION_TIMEOUT_TIME = 1000 * 60 * parseInt(i.value, 10);
console.log('TIMEOUT');
console.log(this.APPLICATION_TIMEOUT_TIME);
}
}
const c = s.find(a => a.name === 'LogoutTimer');
if (c) {
this.TIMEOUT_COUNT_DOWN = parseInt(c.value, 10);
console.log('LogoutTimer');
console.log(this.TIMEOUT_COUNT_DOWN);
}
const int = s.find(a => a.name === 'LogoutTimerInterval');
if (int) {
this.TIMEOUT_COUNT_DOWN_INTERVAL = parseInt(int.value, 10);
console.log('LogoutTimerInterval');
console.log(this.TIMEOUT_COUNT_DOWN_INTERVAL);
}
if (this.APPLICATION_TIMEOUT_TIME > (this.TIMEOUT_COUNT_DOWN * 1000)) {
this.APPLICATION_TIMEOUT_TIME -= (this.TIMEOUT_COUNT_DOWN * 1000);
console.log('TIMEOUT 2', this.APPLICATION_TIMEOUT_TIME);
}
}
} catch (error) {
console.log(error);
}
});
}
countDownMessage() {
this.intervalMsg = setInterval(() => {
if (this.checkIsTimeOut() === false) {
clearInterval(this.intervalMsg);
this.TIMEOUT = false;
this.messageService.add({
severity: 'info', summary: 'Logout Cancel',
detail: 'New action detected. Your current session has been extended.'
});
return;
}
if (this.countDownValue > 0) {
this.messageService.add({
severity: 'error', summary: 'Logout Warning',
detail: 'No action detected in a period of time. System will auto logout if no action detect within '
+ this.countDownValue + ' secound!'
});
this.countDownValue -= this.TIMEOUT_COUNT_DOWN_INTERVAL;
} else {
clearInterval(this.intervalMsg);
if (this.TIMEOUT) {
this.authService.logOut();
}
}
}, this.TIMEOUT_COUNT_DOWN_INTERVAL * 1000);
}
checkIsTimeOut(): boolean {
const actionTime = this.authService.getLastActionTime();
console.log('actionTime', actionTime);
if (!actionTime || actionTime === null) { return true; }
const at = new Date(actionTime);
console.log('at', at.getTime());
const ct = new Date();
ct.setMilliseconds(ct.getMilliseconds() - this.APPLICATION_TIMEOUT_TIME);
console.log('ct', ct.getTime());
if (at.getTime() > ct.getTime()) {
console.log('checkIsTimeOut false');
return false;
}
return true;
}
countDown() {
this.interval = setInterval(() => {
const actionTime = this.authService.getLastActionTime();
console.log('actionTime', actionTime);
if (actionTime) {
const at = new Date(actionTime);
console.log('at', at.getTime());
const ct = new Date();
ct.setMilliseconds(ct.getMilliseconds() - this.APPLICATION_TIMEOUT_TIME);
console.log('ct', ct.getTime());
if (at.getTime() > ct.getTime()) {
console.log('bigger than');
this.TIMEOUT = false;
}
}
if (this.TIMEOUT) {
this.authService.logOut();
} else {
this.messageService.add({
severity: 'info', summary: 'Logout Cancel',
detail: 'New action detected. Auto logout temporarily canceled.'
});
}
clearInterval(this.interval);
}, 30000);
}
}