Skip to content

Commit 1ba2817

Browse files
authored
🎨 [Frontend] Wait for set_heartbeat_emit_interval for starting the application (ITISFoundation#8188)
1 parent 24afa1f commit 1ba2817

File tree

6 files changed

+114
-140
lines changed

6 files changed

+114
-140
lines changed

services/static-webserver/client/source/class/osparc/Application.js

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -501,24 +501,46 @@ qx.Class.define("osparc.Application", {
501501
osparc.store.Store.getInstance().setCurrentStudyId(studyId);
502502
}
503503

504-
let mainPage = null;
505-
if (osparc.product.Utils.getProductName().includes("s4ldesktop")) {
506-
mainPage = new osparc.desktop.MainPageDesktop();
504+
const loadViewerPage = () => {
505+
const mainPage = new osparc.desktop.MainPage();
506+
this.__mainPage = mainPage;
507+
this.__loadView(mainPage);
508+
};
509+
const wsInstance = osparc.wrapper.WebSocket.getInstance();
510+
if (wsInstance.isAppConnected()) {
511+
loadViewerPage();
507512
} else {
508-
mainPage = new osparc.desktop.MainPage();
513+
const listenerId = wsInstance.addListener("changeAppConnected", function(e) {
514+
if (e.getData()) {
515+
wsInstance.removeListenerById(listenerId);
516+
loadViewerPage();
517+
}
518+
}, this);
509519
}
510-
this.__mainPage = mainPage;
511-
this.__loadView(mainPage);
512520
}
513521
})
514522
.catch(err => console.error(err));
515523
},
516524

517-
__loadNodeViewerPage: async function(studyId, viewerNodeId) {
525+
__loadNodeViewerPage: function(studyId, viewerNodeId) {
518526
this.__connectWebSocket();
519-
const mainPage = new osparc.viewer.MainPage(studyId, viewerNodeId);
520-
this.__mainPage = mainPage;
521-
this.__loadView(mainPage);
527+
528+
const loadNodeViewerPage = () => {
529+
const mainPage = new osparc.viewer.MainPage(studyId, viewerNodeId);
530+
this.__mainPage = mainPage;
531+
this.__loadView(mainPage);
532+
};
533+
const wsInstance = osparc.wrapper.WebSocket.getInstance();
534+
if (wsInstance.isAppConnected()) {
535+
loadNodeViewerPage();
536+
} else {
537+
const listenerId = wsInstance.addListener("changeAppConnected", e => {
538+
if (e.getData()) {
539+
wsInstance.removeListenerById(listenerId);
540+
loadNodeViewerPage();
541+
}
542+
}, this);
543+
}
522544
},
523545

524546
__loadView: function(view, opts, clearUrl=true) {

services/static-webserver/client/source/class/osparc/MaintenanceTracker.js

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,24 @@ qx.Class.define("osparc.MaintenanceTracker", {
4242
statics: {
4343
CHECK_INTERVAL: 15*60*1000, // Check every 15'
4444
CLOSABLE_WARN_IN_ADVANCE: 4*24*60*60*1000, // Show Closable Ribbon Message 4 days in advance
45-
PERMANENT_WARN_IN_ADVANCE: 60*60*1000 // Show Permanent Ribbon Message 60' in advance
45+
PERMANENT_WARN_IN_ADVANCE: 60*60*1000, // Show Permanent Ribbon Message 60' in advance
46+
47+
dataToText: function(start, end, reason) {
48+
let text = osparc.utils.Utils.formatDateAndTime(start);
49+
if (end) {
50+
if (start.getDate() === end.getDate()) {
51+
// do not print the same day twice
52+
text += " - " + osparc.utils.Utils.formatTime(end);
53+
} else {
54+
text += " - " + osparc.utils.Utils.formatDateAndTime(end);
55+
}
56+
}
57+
text += " (local time)";
58+
if (reason) {
59+
text += ": " + reason;
60+
}
61+
return text;
62+
},
4663
},
4764

4865
members: {
@@ -78,20 +95,7 @@ qx.Class.define("osparc.MaintenanceTracker", {
7895
return null;
7996
}
8097

81-
let text = osparc.utils.Utils.formatDateAndTime(this.getStart());
82-
if (this.getEnd()) {
83-
if (this.getStart().getDate() === this.getEnd().getDate()) {
84-
// do not print the same day twice
85-
text += " - " + osparc.utils.Utils.formatTime(this.getEnd());
86-
} else {
87-
text += " - " + osparc.utils.Utils.formatDateAndTime(this.getEnd());
88-
}
89-
}
90-
text += " (local time)";
91-
if (this.getReason()) {
92-
text += ": " + this.getReason();
93-
}
94-
return text;
98+
return this.self().dataToText(this.getStart(), this.getEnd(), this.getReason());
9599
},
96100

97101
__setMaintenance: function(maintenanceData) {
@@ -129,9 +133,9 @@ qx.Class.define("osparc.MaintenanceTracker", {
129133
}
130134
},
131135

132-
__messageToRibbon: function(closable) {
136+
messageToRibbon: function(closable, message = null) {
133137
this.__removeRibbonMessage();
134-
const text = this.__getText();
138+
const text = message || this.__getText();
135139
const notification = new osparc.notification.RibbonNotification(text, "maintenance", closable);
136140
osparc.notification.RibbonNotifications.getInstance().addNotification(notification);
137141
this.__lastRibbonMessage = notification;
@@ -143,14 +147,14 @@ qx.Class.define("osparc.MaintenanceTracker", {
143147
const diffPermanent = this.getStart().getTime() - now.getTime() - this.self().PERMANENT_WARN_IN_ADVANCE;
144148

145149
if (diffClosable < 0) {
146-
this.__messageToRibbon(true);
150+
this.messageToRibbon(true);
147151
} else {
148-
setTimeout(() => this.__messageToRibbon(true), diffClosable);
152+
setTimeout(() => this.messageToRibbon(true), diffClosable);
149153
}
150154
if (diffPermanent < 0) {
151-
this.__messageToRibbon(false);
155+
this.messageToRibbon(false);
152156
} else {
153-
setTimeout(() => this.__messageToRibbon(false), diffPermanent);
157+
setTimeout(() => this.messageToRibbon(false), diffPermanent);
154158
}
155159
},
156160

services/static-webserver/client/source/class/osparc/WatchDog.js

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,7 @@ qx.Class.define("osparc.WatchDog", {
4848

4949
// register for socket.io event to change the default heartbeat interval
5050
const socket = osparc.wrapper.WebSocket.getInstance();
51-
socket.removeSlot("set_heartbeat_emit_interval");
52-
socket.on("set_heartbeat_emit_interval", ({ interval }) => {
53-
const newInterval = parseInt(interval) * 1000;
54-
this.setHeartbeatInterval(newInterval);
55-
}, this);
51+
socket.bind("heartbeatInterval", this, "heartbeatInterval");
5652
},
5753

5854
properties: {
@@ -66,10 +62,14 @@ qx.Class.define("osparc.WatchDog", {
6662

6763
heartbeatInterval: {
6864
check: "Number",
69-
init: 2 * 1000, // in milliseconds
70-
nullable: false,
71-
apply: "_applyHeartbeatInterval"
72-
}
65+
init: null,
66+
nullable: true,
67+
apply: "__applyHeartbeatInterval"
68+
},
69+
},
70+
71+
statics: {
72+
DEFAULT_HEARTBEAT_INTERVAL: 2000, // default to 2 seconds
7373
},
7474

7575
members: {
@@ -81,15 +81,24 @@ qx.Class.define("osparc.WatchDog", {
8181
logo.setOnline(value);
8282
}
8383

84-
if (value) {
85-
this.__clientHeartbeatWWPinger.postMessage(["start", this.getHeartbeatInterval()]);
86-
} else {
87-
this.__clientHeartbeatWWPinger.postMessage(["stop"]);
84+
value ? this.__startPinging() : this.__stopPinging();
85+
},
86+
87+
__applyHeartbeatInterval: function(value) {
88+
if (value === null) {
89+
return;
8890
}
91+
92+
this.__startPinging();
93+
},
94+
95+
__startPinging: function() {
96+
const heartbeatInterval = this.getHeartbeatInterval() || osparc.WatchDog.DEFAULT_HEARTBEAT_INTERVAL;
97+
this.__clientHeartbeatWWPinger.postMessage(["start", heartbeatInterval]);
8998
},
9099

91-
_applyHeartbeatInterval: function(value) {
92-
this.__clientHeartbeatWWPinger.postMessage(["start", value]);
100+
__stopPinging: function() {
101+
this.__clientHeartbeatWWPinger.postMessage(["stop"]);
93102
},
94103

95104
__pingServer: function() {

services/static-webserver/client/source/class/osparc/admin/Maintenance.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,17 @@ qx.Class.define("osparc.admin.Maintenance", {
5050
vBox.removeAll();
5151

5252
if (data) {
53+
const displayMaintenanceBtn = new qx.ui.form.Button(this.tr("Test Maintenance message")).set({
54+
appearance: "strong-button",
55+
allowGrowX: false,
56+
});
57+
const message = osparc.MaintenanceTracker.dataToText(new Date(data["start"]), new Date(data["end"]), data["reason"]);
58+
displayMaintenanceBtn.addListener("execute", () => osparc.MaintenanceTracker.getInstance().messageToRibbon(true), message);
59+
vBox.add(displayMaintenanceBtn);
60+
5361
const respLabel = new qx.ui.basic.Label(this.tr("Start and End dates go in UTC time zone"));
5462
vBox.add(respLabel);
5563

56-
const displayMaintenanceBtn = new qx.ui.form.Button(this.tr("Display Maintenance message"));
57-
// eslint-disable-next-line no-underscore-dangle
58-
displayMaintenanceBtn.addListener("execute", () => osparc.MaintenanceTracker.getInstance().__messageToRibbon(true));
59-
vBox.add(displayMaintenanceBtn);
60-
6164
const invitationRespViewer = new osparc.ui.basic.JsonTreeWidget(data, "maintenance-data");
6265
const container = new qx.ui.container.Scroll();
6366
container.add(invitationRespViewer);

services/static-webserver/client/source/class/osparc/desktop/MainPageDesktop.js

Lines changed: 0 additions & 88 deletions
This file was deleted.

services/static-webserver/client/source/class/osparc/wrapper/WebSocket.js

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,21 @@ qx.Class.define("osparc.wrapper.WebSocket", {
118118
nullable: false,
119119
init: 1000,
120120
check: "Number"
121-
}
121+
},
122+
123+
heartbeatInterval: {
124+
check: "Number",
125+
init: null,
126+
nullable: true,
127+
event: "heartbeatInterval"
128+
},
129+
130+
appConnected: {
131+
check: "Boolean",
132+
init: false,
133+
nullable: false,
134+
event: "changeAppConnected"
135+
},
122136
},
123137

124138
/** Constructor
@@ -202,6 +216,16 @@ qx.Class.define("osparc.wrapper.WebSocket", {
202216
this.fireDataEvent(event);
203217
}, this);
204218
}, this);
219+
220+
this.on("set_heartbeat_emit_interval", ({ interval }) => {
221+
if (interval) {
222+
const newInterval = parseInt(interval) * 1000;
223+
this.setHeartbeatInterval(newInterval);
224+
225+
// we consider the app is connected when the backend set the heartbeat interval
226+
this.setAppConnected(true);
227+
}
228+
}, this);
205229
}, this);
206230

207231
dynLoader.start();

0 commit comments

Comments
 (0)