Attempt to fix the non-transmitted moves issue
[vchess.git] / sockets.js
index 6dbb24a..10a794f 100644 (file)
@@ -18,6 +18,16 @@ module.exports = function(wss) {
        for (const v of Variants)
                clients[v.name] = {};
 
+       // (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 ?)
+       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;
                var query = getJsonFromUrl(req.url);
@@ -42,18 +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":
-                                               // TODO: adjust with readyState? (+ setTimeout()?) + send opponent (re)disconnect
-                                               // https://github.com/websockets/ws/blob/master/lib/websocket.js line 313
-                                               if (!!clients[page][obj.oppid])
+                                               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":
@@ -65,14 +85,16 @@ module.exports = function(wss) {
                                                        delete games[page];
                                                        const mycolor = Math.random() < 0.5 ? 'w' : 'b';
                                                        socket.send(JSON.stringify({code:"newgame",fen:fen,oppid:oppId,color:mycolor}));
-                                                       // TODO: check readyState, potential setTimeout()? + send opponent (re)disconnect
                                                        clients[page][oppId].send(JSON.stringify({code:"newgame",fen:fen,oppid:sid,color:mycolor=="w"?"b":"w"}));
                                                }
                                                else
                                                        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;
                                }
                        });