conn: null,
roomInitialized: false,
// If asklastate got no reply, ask again:
- gotLastate: false,
gotMoveIdx: -1, //last move index received
- // If newmove got no pingback, send again:
- opponentGotMove: false,
+ opponentGotMove: false, //used to freeze clock
connexionString: "",
reopenTimeout: 0,
reconnectTimeout: 0,
- // Incomplete info games: show move played
+ // Incomplete info games: show move played:
moveNotation: "",
- // Intervals from setInterval():
- askLastate: null,
- retrySendmove: null,
clockUpdate: null,
// Related to (killing of) self multi-connects:
newConnect: {}
document.removeEventListener('visibilitychange', this.visibilityChange);
window.removeEventListener('focus', this.onFocus);
window.removeEventListener('blur', this.onBlur);
- if (!!this.askLastate) clearInterval(this.askLastate);
- if (!!this.retrySendmove) clearInterval(this.retrySendmove);
if (!!this.clockUpdate) clearInterval(this.clockUpdate);
clearTimeout(this.reopenTimeout);
this.send("disconnect");
//const oppSid =
// this.game.players.find(p => p.sid != this.st.user.sid).sid;
this.send("asklastate", { target: sid });
- let counter = 1;
- this.askLastate = setInterval(
- () => {
- // Ask at most 3 times:
- // if no reply after that there should be a network issue.
- if (
- counter < 3 &&
- !this.gotLastate &&
- !!this.people[sid]
- ) {
- this.send("asklastate", { target: sid });
- counter++;
- }
- else clearInterval(this.askLastate);
- },
- 1500
- );
},
atCreation: function() {
document.addEventListener('visibilitychange', this.visibilityChange);
this.rematchOffer = "";
this.lastate = undefined;
this.roomInitialized = false;
- this.gotLastate = false;
this.gotMoveIdx = -1;
this.opponentGotMove = false;
- this.askLastate = null;
- this.retrySendmove = null;
this.clockUpdate = null;
this.newConnect = {};
// 1] Initialize connection
const onOpen = () => {
this.reconnectTimeout = 250;
const oppSid = this.getOppsid();
- if (!!oppSid) this.requestLastate(oppSid); //in case of
+ if (!!oppSid) this.send("asklastate", { target: oppSid });
};
this.conn.onopen = onOpen;
this.conn.onmessage = this.socketMessageListener;
}
},
send: function(code, obj) {
- if (!!this.conn && this.conn.readyState == 1)
- this.conn.send(JSON.stringify(Object.assign({ code: code }, obj)));
+ let timeout = 0;
+ const trySend = () => {
+ if (!!this.conn && this.conn.readyState == 1)
+ this.conn.send(JSON.stringify(Object.assign({ code: code }, obj)));
+ else setTimeout(trySend, timeout = (timeout > 0 ? 2 * timeout : 250));
+ }
+ setTimeout(trySend, timeout);
},
isConnected: function(index) {
const player = this.game.players[index];
}
// Ask potentially missed last state, if opponent and I play
if (
- !this.gotLastate &&
!!this.game.mycolor &&
this.game.type == "live" &&
this.game.players.some(p => p.sid == user.sid)
) {
- this.requestLastate(user.sid);
+ this.send("asklastate", { target: user.sid });
}
break;
}
// Confirm scenario? Fix?
case "lastate": {
// Got opponent infos about last move
- this.gotLastate = true;
this.lastate = data.data;
if (this.lastate.movesCount - 1 > this.gotMoveIdx)
this.gotMoveIdx = this.lastate.movesCount - 1;
).replace(/(fen:)([^:]*):/g, replaceByDiag);
};
let variant = undefined;
+ // TODO: avoid setInterval() here
const trySetVname = setInterval(
() => {
// this.st.variants might be uninitialized (variant == null)
sendMove["clock"] = this.game.clocks[colorIdx];
// (Live) Clocks will re-start when the opponent pingback arrive
this.opponentGotMove = false;
- this.send("newmove", {data: sendMove});
- // If the opponent doesn't reply gotmove soon enough, re-send move:
- // Do this at most 2 times, because more would mean network issues,
- // opponent would then be expected to disconnect/reconnect.
- let counter = 1;
- const currentUrl = document.location.href;
- this.retrySendmove = setInterval(
- () => {
- if (
- counter >= 3 ||
- this.opponentGotMove ||
- document.location.href != currentUrl //page change
- ) {
- clearInterval(this.retrySendmove);
- return;
- }
- const oppsid = this.getOppsid();
- if (!oppsid)
- // Opponent is disconnected: he'll ask last state
- clearInterval(this.retrySendmove);
- else {
- this.send("newmove", { data: sendMove, target: oppsid });
- counter++;
- }
- },
- 1500
- );
+ this.send("newmove", { data: sendMove });
}
else
// Not my move or I'm an observer: just start other player's clock