From 40cb5afbad6ee7a0ce6a66b1344290f3cd754ed9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Fri, 23 Apr 2021 19:15:13 +0200 Subject: [PATCH] Skip heartbeat if there is no response Fix xhr callbacks --- .../templates/analytics/scripts/page.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/shynet/analytics/templates/analytics/scripts/page.js b/shynet/analytics/templates/analytics/scripts/page.js index 89c4f0a..f2c96c1 100644 --- a/shynet/analytics/templates/analytics/scripts/page.js +++ b/shynet/analytics/templates/analytics/scripts/page.js @@ -8,11 +8,18 @@ var Shynet = { idempotency: null, heartbeatTaskId: null, + skipHeartbeat: false, sendHeartbeat: function () { try { if (document.hidden) { return; } + if (Shynet.skipHeartbeat) { + console.warn("Heartbeat skipped due to lack of server response"); + return; + } + + Shynet.skipHeartbeat = true; var xhr = new XMLHttpRequest(); xhr.open( "POST", @@ -20,6 +27,12 @@ var Shynet = { true ); xhr.setRequestHeader("Content-Type", "application/json"); + xhr.onload = function () { + Shynet.skipHeartbeat = false; + }; + xhr.onerror = function () { + Shynet.skipHeartbeat = false; + }; xhr.send( JSON.stringify({ idempotency: Shynet.idempotency, @@ -30,13 +43,14 @@ var Shynet = { window.performance.timing.navigationStart, }) ); - } catch (e) { } + } catch (e) {} }, newPageLoad: function () { if (Shynet.heartbeatTaskId != null) { clearInterval(Shynet.heartbeatTaskId); } Shynet.idempotency = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); + Shynet.skipHeartbeat = false; Shynet.heartbeatTaskId = setInterval(Shynet.sendHeartbeat, parseInt("{{heartbeat_frequency}}")); Shynet.sendHeartbeat(); } @@ -51,4 +65,4 @@ window.addEventListener("load", Shynet.newPageLoad); // -- START -- {{script_inject|safe}} // -- END -- -{% endif %} \ No newline at end of file +{% endif %}