X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=sockets.js;h=452cb6e0915c144617ff9878b69d7daade6cc2d3;hb=098e8468ae7a52a55850c09f90506f52b8133567;hp=a1818e09803ab50542f6599d2072b9553d242c98;hpb=4b5fe3061829e184f9ad86a13d831eda22d95343;p=vchess.git diff --git a/sockets.js b/sockets.js index a1818e09..452cb6e0 100644 --- a/sockets.js +++ b/sockets.js @@ -1,16 +1,6 @@ -//const url = require('url'); +const url = require('url'); const Variants = require("./variants"); -function getJsonFromUrl(url) { - var query = url.substr(2); //starts with "/?" - var result = {}; - query.split("&").forEach(function(part) { - var item = part.split("="); - result[item[0]] = decodeURIComponent(item[1]); - }); - return result; -} - module.exports = function(wss) { let clients = { "index": {} }; @@ -18,15 +8,23 @@ 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 +// // Safety counter (TODO: is it necessary ?) +// setInterval(() => { +// Object.keys(clients).forEach(k => { +// Object.keys(clients[k]).forEach(ck => { +// if (!clients[k][ck] || clients[k][ck].readyState != 1) +// delete clients[k][ck]; +// }); +// }); +// }, 60000); //every minute (will be lowered if a lot of users...) + + // No-op function as a callback when sending messages + const noop = () => { }; wss.on("connection", (socket, req) => { - //const params = new URL("http://localhost" + req.url).searchParams; - var query = getJsonFromUrl(req.url); - const sid = query["sid"]; //params.get("sid"); - const page = query["page"]; //params.get("page"); + const params = new URL("http://localhost" + req.url).searchParams; + const sid = params.get("sid"); + const page = params.get("page"); clients[page][sid] = socket; if (page == "index") { @@ -40,23 +38,35 @@ module.exports = function(wss) { { // Send to every client connected on index an update message for counts Object.keys(clients["index"]).forEach( k => { - clients["index"][k].send(JSON.stringify({code:"increase",vname:page})); + clients["index"][k].send(JSON.stringify({code:"increase",vname:page}), noop); }); // Also notify potential opponents: hit all clients which check if sid corresponds Object.keys(clients[page]).forEach( k => { - clients[page][k].send(JSON.stringify({code:"connect",id:sid})); + clients[page][k].send(JSON.stringify({code:"connect",id:sid}), noop); }); 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].send( + JSON.stringify({code:"newmove",move:obj.move}), noop); + } break; case "ping": if (!!clients[page][obj.oppid]) socket.send(JSON.stringify({code:"pong"})); break; + case "lastate": + if (!!clients[page][obj.oppid]) + { + const oppId = obj.oppid; + obj.oppid = sid; //I'm oppid for my opponent + clients[page][oppId].send(JSON.stringify(obj), noop); + } + break; case "newgame": if (!!games[page]) { @@ -65,14 +75,22 @@ module.exports = function(wss) { const fen = games[page]["fen"]; delete games[page]; const mycolor = Math.random() < 0.5 ? 'w' : 'b'; - socket.send(JSON.stringify({code:"newgame",fen:fen,oppid:oppId,color:mycolor})); - clients[page][oppId].send(JSON.stringify({code:"newgame",fen:fen,oppid:sid,color:mycolor=="w"?"b":"w"})); + socket.send( + JSON.stringify({code:"newgame",fen:fen,oppid:oppId,color:mycolor})); + if (!!clients[page][oppId]) + { + clients[page][oppId].send( + JSON.stringify( + {code:"newgame",fen:fen,oppid:sid,color:mycolor=="w"?"b":"w"}), + noop); + } } 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].send(JSON.stringify({code:"resign"}), noop); break; } }); @@ -86,12 +104,12 @@ module.exports = function(wss) { { // Send to every client connected on index an update message for counts Object.keys(clients["index"]).forEach( k => { - clients["index"][k].send(JSON.stringify({code:"decrease",vname:page})); + clients["index"][k].send(JSON.stringify({code:"decrease",vname:page}), noop); }); } // Also notify potential opponents: hit all clients which check if sid corresponds Object.keys(clients[page]).forEach( k => { - clients[page][k].send(JSON.stringify({code:"disconnect",id:sid})); + clients[page][k].send(JSON.stringify({code:"disconnect",id:sid}), noop); }); }); });