Attempt to fix the non-transmitted moves issue
authorBenjamin Auder <benjamin.auder@somewhere>
Sun, 18 Nov 2018 15:25:31 +0000 (16:25 +0100)
committerBenjamin Auder <benjamin.auder@somewhere>
Sun, 18 Nov 2018 15:25:31 +0000 (16:25 +0100)
TODO
public/javascripts/components/game.js
sockets.js

diff --git a/TODO b/TODO
index 006b915..aeb537d 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,6 +1,6 @@
 Styles must be improved (full width for smartphones, selectable text for PGN...)
 Tooltip text should fade (even when mouse stay on it, especially for small screens)
 Checkered stage 2: switch button at reserve position (or on top).
-If a played disconnect right after opponent sent a move, it might be never received: secure this
 Mode expert: game.js, button on top (with online indicator)
 Turn indicator on top too (black or white)
+incheck by checkered pawns: not marked (because of turn changed?)
index 1e68fe6..42e6507 100644 (file)
@@ -378,7 +378,7 @@ Vue.component('my-game', {
                        {
                                // New game request has been cancelled on disconnect
                                this.seek = true;
-                               this.newGame("human");
+                               this.newGame("human", "reconnect");
                        }
                };
                const socketMessageListener = msg => {
@@ -480,9 +480,12 @@ Vue.component('my-game', {
                                } catch (INVALID_STATE_ERR) {
                                        return; //nothing achieved
                                }
-                               let modalBox = document.getElementById("modal-control2");
-                               modalBox.checked = true;
-                               setTimeout(() => { modalBox.checked = false; }, 2000);
+                               if (!fenInit || fenInit!="reconnect") //TODO: bad HACK...
+                               {
+                                       let modalBox = document.getElementById("modal-control2");
+                                       modalBox.checked = true;
+                                       setTimeout(() => { modalBox.checked = false; }, 2000);
+                               }
                                return;
                        }
                        this.vr = new VariantRules(fen, moves || []);
index 62d51b7..10a794f 100644 (file)
@@ -18,9 +18,15 @@ module.exports = function(wss) {
        for (const v of Variants)
                clients[v.name] = {};
 
-       // TODO: when relaying to opponent, check readyState, potential setTimeout()? + send opponent (re)disconnect
        // (resign, newgame, newmove). See https://github.com/websockets/ws/blob/master/lib/websocket.js around line 313
-       // TODO: awaiting newmove, resign, newgame :: in memory structure (use Redis ?)
+       // TODO: awaiting newmove, resign, (+newgame?) :: in memory structure (use Redis ?)
+       let newmoves = {};
+       let newresign = {};
+       for (const v of Variants)
+       {
+               newmoves[v.name] = {};
+               newresign[v.name] = {};
+       }
 
        wss.on("connection", (socket, req) => {
                //const params = new URL("http://localhost" + req.url).searchParams;
@@ -46,15 +52,28 @@ module.exports = function(wss) {
                        Object.keys(clients[page]).forEach( k => {
                                clients[page][k].send(JSON.stringify({code:"connect",id:sid}));
                        });
+                       if (!!newmoves[page][sid])
+                       {
+                               socket.send(JSON.stringify({code:"newmove",move:newmoves[page][sid]}));
+                               delete newmoves[page][sid];
+                       }
+                       if (!!newresign[page][sid])
+                       {
+                               socket.send(JSON.stringify({code:"resign"}));
+                               delete newresign[page][sid];
+                       }
                        socket.on("message", objtxt => {
                                let obj = JSON.parse(objtxt);
                                switch (obj.code)
                                {
                                        case "newmove":
-                                               clients[page][obj.oppid].send(JSON.stringify({code:"newmove",move:obj.move}));
+                                               if (!!clients[page][obj.oppid] && clients[page][obj.oppid].readyState == WebSocket.OPEN)
+                                                       clients[page][obj.oppid].send(JSON.stringify({code:"newmove",move:obj.move}));
+                                               else
+                                                       newmoves[page][obj.oppid] = obj.move;
                                                break;
                                        case "ping":
-                                               if (!!clients[page][obj.oppid])
+                                               if (!!clients[page][obj.oppid] && clients[page][obj.oppid].readyState == WebSocket.OPEN)
                                                        socket.send(JSON.stringify({code:"pong"}));
                                                break;
                                        case "newgame":
@@ -72,7 +91,10 @@ module.exports = function(wss) {
                                                        games[page] = {id:sid, fen:obj.fen}; //wait for opponent
                                                break;
                                        case "resign":
-                                               clients[page][obj.oppid].send(JSON.stringify({code:"resign"}));
+                                               if (!!clients[page][obj.oppid] && clients[page][obj.oppid].readyState == WebSocket.OPEN)
+                                                       clients[page][obj.oppid].send(JSON.stringify({code:"resign"}));
+                                               else
+                                                       newresign[page][obj.oppid] = true;
                                                break;
                                }
                        });