From 16459b7c160c95902a2e870f463f16df15e327bc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rapha=C3=ABl=20Jakse?= Date: Thu, 2 Apr 2020 19:10:07 +0200 Subject: [PATCH] better handling of xhr requests --- trivabble.js | 47 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/trivabble.js b/trivabble.js index 2a8d669..b3ca064 100644 --- a/trivabble.js +++ b/trivabble.js @@ -455,6 +455,8 @@ } var pollingServer = false; + var pollingReady = false; + var retriedImmediately = false; function fatalError(e) { console.error(e); @@ -661,15 +663,21 @@ } function send(data) { - var xhr = new XMLHttpRequest(); - - xhr.open("POST", "/:trivabble", true); - xhr.setRequestHeader("Content-Type", "text/plain"); - xhr.send(JSON.stringify(data)); + if (!pollingReady && ((data.cmds && data.cmds.length) && data.cmds[0].cmd !== "joinGame")) { + send([]); + setTimeout(send.bind(null, data), POLLING_DELAY); + return; + } - var thisRequestIsPolling = false, currentIndex = 0, expectedLength = 0; + var thisRequestIsPolling = false; + var currentIndex = 0; + var expectedLength = 0; if (!data.cmds || !data.cmds.length) { + if (pollingServer) { + return; + } + pollingServer = true; thisRequestIsPolling = true; } @@ -678,10 +686,19 @@ blockMove++; } + var xhr = new XMLHttpRequest(); + + xhr.open("POST", "/:trivabble", true); + xhr.setRequestHeader("Content-Type", "text/plain"); + xhr.send(JSON.stringify(data)); + xhr.onreadystatechange = function () { // TODO error handling - if (xhr.readyState === 3 && thisRequestIsPolling) { + if (xhr.readyState === 2 && thisRequestIsPolling) { + pollingReady = true; + } else if (xhr.readyState === 3 && thisRequestIsPolling) { + pollingReady = true; while (true) { if (!expectedLength) { var i = currentIndex; @@ -717,6 +734,8 @@ fatalError(e); } + retriedImmediately = false; + if (msgs instanceof Array) { for (var i = 0; i < msgs.length; i++) { handleReceivedData(msgs[i]); @@ -731,7 +750,19 @@ } else if (xhr.readyState === 4) { if (thisRequestIsPolling) { pollingServer = false; - setTimeout(sendCmds.bind(null, []), POLLING_DELAY); + pollingReady = false; + + if (retriedImmediately) { + setTimeout(sendCmds.bind(null, []), POLLING_DELAY); + } else { + retriedImmediately = true; + sendCmds([]) + } + return; + } + + if (xhr.status === 0 || xhr.status >= 300) { + setTimeout(send.bind(null, data), POLLING_DELAY); return; } -- 2.30.2