8000 feat(ui): add healthcheck on sharedWorker (#3652) · ovh/cds@2d745d0 · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Commit 2d745d0

Browse files
sguiheuxyesnault
authored andcommitted
feat(ui): add healthcheck on sharedWorker (#3652)
1 parent feed33f commit 2d745d0

File tree

3 files changed

+46
-5
lines changed

3 files changed

+46
-5
lines changed

ui/src/app/app.component.ts

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export class AppComponent implements OnInit {
3434
versionWorker: CDSWebWorker;
3535

3636
sseWorker: CDSWorker;
37+
heartbeatToken: number;
3738

3839
zone: NgZone;
3940

@@ -42,13 +43,14 @@ export class AppComponent implements OnInit {
4243

4344
languageSubscriber: Subscription;
4445
versionWorkerSubscription: Subscription;
45-
sseWorkerSubscription: Subscription;
4646
_routerSubscription: Subscription;
4747
_routerNavEndSubscription: Subscription;
4848

4949
displayResolver = false;
5050
toasterConfig: any;
5151

52+
lastPing: number;
53+
5254
constructor(_translate: TranslateService, private _language: LanguageStore,
5355
private _activatedRoute: ActivatedRoute, private _titleService: Title,
5456
private _authStore: AuthentificationStore, private _router: Router,
@@ -77,7 +79,7 @@ export class AppComponent implements OnInit {
7779
this._authStore.getUserlst().subscribe(user => {
7880
if (!user) {
7981
this.isConnected = false;
80-
this.stopWorker(this.sseWorker, this.sseWorkerSubscription);
82+
this.stopWorker(this.sseWorker, null);
8183
} else {
8284
this.isConnected = true;
8385
this.startSSE();
@@ -133,6 +135,9 @@ export class AppComponent implements OnInit {
133135
}
134136

135137
startSSE(): void {
138+
if (this.sseWorker) {
139+
this.stopWorker(this.sseWorker, null);
140+
}
136141
let authKey: string;
137142
let authValue: string;
138143
// ADD user AUTH
@@ -147,6 +152,17 @@ export class AppComponent implements OnInit {
147152

148153
if (window['SharedWorker']) {
149154
this.sseWorker = new CDSSharedWorker('./assets/worker/sharedWorker.js');
155+
if (this.heartbeatToken !== 0) {
156+
clearInterval(this.heartbeatToken);
157+
}
158+
159+
this.heartbeatToken = setInterval(() => {
160+
let d = (new Date()).getTime();
161+
if (this.lastPing !== 0 && (d - this.lastPing) > 11000) {
162+
// If no ping in the last 11s restart SSE
163+
this.startSSE();
164+
}
165+
});
150166
} else {
151167
this.sseWorker = new CDSWebWorker('./assets/worker/webWorker.js');
152168
}
@@ -164,7 +180,16 @@ export class AppComponent implements OnInit {
164180
return;
165181
}
166182
this.zone.run(() => {
167-
this._appService.manageEvent(<Event>e);
183+
if (e.healthCheck != null) {
184+
this.lastPing = (new Date()).getTime();
185+
// 0 = CONNECTING, 1 = OPEN, 2 = CLOSED
186+
if (e.healthCheck > 1) {
187+
// Reopen SSE
188+
this.startSSE();
189+
}
190+
} else {
191+
this._appService.manageEvent(<Event>e);
192+
}
168193
});
169194
});
170195
}

ui/src/app/app.service.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ export class AppService {
4646
}
4747

4848
manageEvent(event: Event): void {
49+
if (!event.type_event) {
50+
return
51+
}
4952
if (event.type_event.indexOf(EventType.ACTION_PREFIX) === 0) {
5053
this._actionStore.resync();
5154
}

ui/src/assets/worker/sharedWorker.js

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ var sseURL;
66
var pingUrl;
77
var headerKey;
88
var headerValue;
9-
const connections = [];
9+
var connections = [];
1010
var offline = false;
1111
onconnect = function(e) {
1212
var port = e.ports[0];
@@ -29,6 +29,7 @@ function initSSE(force) {
2929
if (evt.data.indexOf('ACK: ') === 0) {
3030
return;
3131
}
32+
3233
try {
3334
var jsonEvent = JSON.parse(evt.data);
3435
connections.forEach(p => {
@@ -42,6 +43,18 @@ function initSSE(force) {
4243
}
4344
}
4445

46+
// Send state of the connexion every 5 seconds
47+
setInterval(() => {
48+
if (sse && sse.readyState > 1) {
49+
sse.close();
50+
sse = undefined;
51+
}
52+
connections.forEach( p => {
53+
p.postMessage({ healthCheck: sse.readyState });
54+
});
55+
}, 5000);
56+
57+
// Check if token is still valid
4558
setInterval(() => {
4659
if (pingUrl) {
4760
try {
@@ -71,4 +84,4 @@ setInterval(() => {
7184
}
7285

7386
}
74-
}, 5000);
87+
}, 60000);

0 commit comments

Comments
 (0)
0