}
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;
}