better handling of xhr requests
authorRaphaël Jakse <raphael.jakse@univ-grenoble-alpes.fr>
Thu, 2 Apr 2020 17:10:07 +0000 (19:10 +0200)
committerRaphaël Jakse <raphael.jakse@univ-grenoble-alpes.fr>
Thu, 2 Apr 2020 17:10:07 +0000 (19:10 +0200)
trivabble.js

index 2a8d669b0a95435e99e19167327a4e05cb77a2d7..b3ca064b963fcb5e78fc5c57a102d6c32a51e4e1 100644 (file)
     }
 
     var pollingServer = false;
+    var pollingReady = false;
+    var retriedImmediately = false;
 
     function fatalError(e) {
         console.error(e);
     }
 
     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;
         }
             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;
                             fatalError(e);
                         }
 
+                        retriedImmediately = false;
+
                         if (msgs instanceof Array) {
                             for (var i = 0; i < msgs.length; i++) {
                                 handleReceivedData(msgs[i]);
             } 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;
                 }