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);
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":
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;
}
});