diff --git a/frontend/src/ts/modules/app/component/app-header.component.ts b/frontend/src/ts/modules/app/component/app-header.component.ts index eaa14ca6..e96cbaac 100644 --- a/frontend/src/ts/modules/app/component/app-header.component.ts +++ b/frontend/src/ts/modules/app/component/app-header.component.ts @@ -1,5 +1,7 @@ -import {ChangeDetectionStrategy, ChangeDetectorRef, Component} from "@angular/core"; +import {ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy} from "@angular/core"; import {AuthorizationService} from "../service/authorization.service"; +import {WebsocketService} from "../websocket/websocket.service"; +import {HttpClient} from "@angular/common/http"; @Component({ moduleId: module.id, @@ -7,18 +9,35 @@ import {AuthorizationService} from "../service/authorization.service"; templateUrl: "../../../../../src/resources/template/app/component/app_header.html", changeDetection: ChangeDetectionStrategy.OnPush }) -export class AppHeaderComponent { +export class AppHeaderComponent implements OnDestroy { name: string; realm: string; - constructor(protected authService: AuthorizationService, - protected cd: ChangeDetectorRef) { + constructor(protected authService: AuthorizationService, protected cd: ChangeDetectorRef, + protected websocketService: WebsocketService, protected httpClient: HttpClient) { authService.onSessionUpdate .subscribe(session => { this.name = session.name; this.realm = session.realm; - cd.markForCheck() + cd.markForCheck(); + + if (this.authService.hasRole('security_administrator')) { + this.websocketService.subscribe(({data}) => { + let parsedObj = JSON.parse(data); + + if (parsedObj && parsedObj.traceId) { + if (parsedObj.className === 'update' || parsedObj.className === 'processError') { + this.httpClient.put('status', parsedObj).toPromise() + .catch(err => console.log('failed to update application status', err)); + } + } + }); + } }) } + + ngOnDestroy(): void { + this.websocketService.unsubscribe(); + } } diff --git a/frontend/src/ts/modules/app/service/authorization.service.ts b/frontend/src/ts/modules/app/service/authorization.service.ts index 1a64ed9a..9aedf3ac 100644 --- a/frontend/src/ts/modules/app/service/authorization.service.ts +++ b/frontend/src/ts/modules/app/service/authorization.service.ts @@ -1,7 +1,6 @@ import {Injectable} from "@angular/core"; import {Subject} from "rxjs"; import {HttpClient} from "@angular/common/http"; -import {WebsocketService} from "../websocket/websocket.service"; export interface UserSession { userId: string, @@ -18,7 +17,7 @@ export class AuthorizationService { public onSessionUpdate: Subject = new Subject(); - constructor(protected httpClient: HttpClient, protected websocketService: WebsocketService) {} + constructor(protected httpClient: HttpClient) {} public getCurrentSession(): Promise { if (this.session) return new Promise(resolve => resolve(this.session)); @@ -27,19 +26,6 @@ export class AuthorizationService { .then((session: UserSession) => { this.session = session; this.onSessionUpdate.next(session); - - if (this.hasRole('security_administrator')) { - this.websocketService.listen(({data}) => { - let parsedObj = JSON.parse(data); - - if (parsedObj && parsedObj.traceId) { - if (parsedObj.className === 'update' || parsedObj.className === 'processError') { - this.httpClient.put('status', parsedObj).toPromise() - .catch(err => console.log('failed to update application status', err)); - } - } - }); - } return session; }) } diff --git a/frontend/src/ts/modules/app/websocket/websocket.service.ts b/frontend/src/ts/modules/app/websocket/websocket.service.ts index 121950bf..41f68924 100644 --- a/frontend/src/ts/modules/app/websocket/websocket.service.ts +++ b/frontend/src/ts/modules/app/websocket/websocket.service.ts @@ -3,15 +3,18 @@ import {Injectable} from "@angular/core"; @Injectable({providedIn: 'root'}) export class WebsocketService { - public listen(fn){ + private initialData; + + public subscribe(fn: Function): void { let property = Object.getOwnPropertyDescriptor(MessageEvent.prototype, "data"); const data = property.get; + this.initialData = data; // wrapper that replaces getter function lookAtMessage() { let socket = this.currentTarget instanceof WebSocket; - if (!socket) { + if (!socket || !this.currentTarget.url.endsWith('notifier.message.send.push')) { return data.call(this); } let msg = data.call(this); @@ -22,4 +25,13 @@ export class WebsocketService { property.get = lookAtMessage; Object.defineProperty(MessageEvent.prototype, "data", property); } + + public unsubscribe(): void { + let property = Object.getOwnPropertyDescriptor(MessageEvent.prototype, "data"); + + if (this.initialData) { + property.get = this.initialData; + Object.defineProperty(MessageEvent.prototype, "data", property); + } + } }