client-side ping-pong

This commit is contained in:
Devaev Maxim 2018-07-14 05:25:15 +03:00
parent b2f57590b6
commit 2b8d6b215c
2 changed files with 28 additions and 3 deletions

View File

@ -150,7 +150,9 @@ class Server: # pylint: disable=too-many-instance-attributes
except Exception as err: except Exception as err:
logger.error("Can't parse JSON event from websocket: %s", err) logger.error("Can't parse JSON event from websocket: %s", err)
else: else:
if event.get("event_type") == "key": if event.get("event_type") == "ping":
ws.send_str(json.dumps({"msg_type": "pong"}))
elif event.get("event_type") == "key":
key = str(event.get("key", ""))[:64].strip() key = str(event.get("key", ""))[:64].strip()
state = event.get("state") state = event.get("state")
if key and state in [True, False]: if key and state in [True, False]:

View File

@ -11,13 +11,16 @@ function __startSessionPoller() {
ws.onopen = function(event) { ws.onopen = function(event) {
__installHidHandlers(ws); __installHidHandlers(ws);
__setSessionStatus(true); __setSessionStatus(true);
__startSessionPoller.ping_server_timer = setInterval(() => __pingServer(ws), 2000);
}; };
ws.onmessage = function(event) { ws.onmessage = function(event) {
// console.log("KVMD:", event.data); // console.log("KVMD:", event.data);
event = JSON.parse(event.data); event = JSON.parse(event.data);
if (event.msg_type == "event") { if (event.msg_type == "event") {
if (event.msg.event == "atx_state") { if (event.msg.event == "pong") {
__pingServer.missed_heartbeats = 0;
} else if (event.msg.event == "atx_state") {
leds = event.msg.event_attrs.leds; leds = event.msg.event_attrs.leds;
document.getElementById("atx-power-led").className = (leds.power ? "led-on" : "led-off"); document.getElementById("atx-power-led").className = (leds.power ? "led-on" : "led-off");
document.getElementById("atx-hdd-led").className = (leds.hdd ? "led-busy" : "led-off"); document.getElementById("atx-hdd-led").className = (leds.hdd ? "led-busy" : "led-off");
@ -26,6 +29,9 @@ function __startSessionPoller() {
}; };
ws.onclose = function(event) { ws.onclose = function(event) {
if (__startSessionPoller.ping_server_timer) {
clearInterval(__startSessionPoller.ping_server_timer);
}
__clearHidHandlers(); __clearHidHandlers();
__setSessionStatus(false); __setSessionStatus(false);
document.getElementById("atx-power-led").className = "led-off"; document.getElementById("atx-power-led").className = "led-off";
@ -38,6 +44,21 @@ function __startSessionPoller() {
}; };
} }
function __pingServer(ws) {
try {
__pingServer.missed_heartbeats++;
if (__pingServer.missed_heartbeats >= 5) {
throw new Error("Too many missed heartbeats");
}
ws.send(JSON.stringify({"event_type": "ping"}));
} catch (err) {
__pingServer.missed_heartbeats = 0;
console.warn("Closing session:", err.message);
ws.close();
}
}
__pingServer.missed_heartbeats = 0;
function __setSessionStatus(status) { function __setSessionStatus(status) {
var el_session_status = document.getElementById("session-status"); var el_session_status = document.getElementById("session-status");
el_session_status.innerHTML = (status ? "Session active" : "Session closed, trying to reconnect..."); el_session_status.innerHTML = (status ? "Session active" : "Session closed, trying to reconnect...");
@ -74,7 +95,9 @@ function __installHidHandlers(ws) {
} }
function __clearHidHandlers() { function __clearHidHandlers() {
clearInterval(__installHidHandlers.mouse_move_timer); if (__installHidHandlers.mouse_move_timer) {
clearInterval(__installHidHandlers.mouse_move_timer);
}
document.onkeydown = null; document.onkeydown = null;
document.onkeyup = null; document.onkeyup = null;