X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=sockets.js;h=f3d479d693c191cf812833413d0bab995b9a19a3;hb=001344b94834085956c84d56596a874ef10804b9;hp=6dbb24a27b01456c0536939663f44133cdd25254;hpb=0cb758e078f4981d1e5b5209e66ca02f544ec9d5;p=vchess.git diff --git a/sockets.js b/sockets.js index 6dbb24a2..f3d479d6 100644 --- a/sockets.js +++ b/sockets.js @@ -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; } });