X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=server%2Fsockets.js;h=fcaab83c815a6a2ace407d9212009961fb4c2215;hb=a0c41e7e23c9ff64031739e072f38e493bac8dca;hp=b51a978aa2f30c2caa53ef14ad0e3d37a89fd93f;hpb=dc284d90d4f9228fc99e0b39394cbfded23657e5;p=vchess.git diff --git a/server/sockets.js b/server/sockets.js index b51a978a..fcaab83c 100644 --- a/server/sockets.js +++ b/server/sockets.js @@ -1,6 +1,7 @@ const url = require('url'); // Node version in Ubuntu 16.04 does not know about URL class +// NOTE: url is already transformed, without ?xxx=yyy... parts function getJsonFromUrl(url) { const query = url.substr(2); //starts with "/?" @@ -17,9 +18,15 @@ module.exports = function(wss) { wss.on("connection", (socket, req) => { const query = getJsonFromUrl(req.url); const sid = query["sid"]; - // TODO: later, allow duplicate connections (shouldn't be much more complicated) if (!!clients[sid]) - return socket.send(JSON.stringify({code:"duplicate"})); + { + // Dummy messages listener: just send "duplicate" event on anything + // ('connect' events for Hall and Game, 'askfullgame' for observers) + return socket.on("message", objtxt => { + if (["connect","askfullgame"].includes(JSON.parse(objtxt).code)) + socket.send(JSON.stringify({code:"duplicate"})); + }); + } clients[sid] = {sock: socket, page: query["page"]}; const notifyRoom = (page,code,obj={},excluded=[]) => { Object.keys(clients).forEach(k => { @@ -32,37 +39,58 @@ module.exports = function(wss) { } }); }; - notifyRoom(query["page"], "connect"); //Hall or Game - if (query["page"].indexOf("/game/") >= 0) - notifyRoom("/", "connect"); //notify main hall + // Wait for "connect" message to notify connection to the room, + // because if game loading is slow the message listener might + // not be ready too early. socket.on("message", objtxt => { let obj = JSON.parse(objtxt); if (!!obj.target && !clients[obj.target]) return; //receiver not connected, nothing we can do switch (obj.code) { + case "connect": + { + const curPage = clients[sid].page; + notifyRoom(curPage, "connect"); //Hall or Game + if (curPage.indexOf("/game/") >= 0) + notifyRoom("/", "gconnect"); //notify main hall + break; + } case "pollclients": + { const curPage = clients[sid].page; socket.send(JSON.stringify({code:"pollclients", - sockIds: Object.keys(clients).filter(k => k != sid && - (clients[k].page == curPage || - // Consider that people playing are in Hall too: - (curPage == "/" && clients[k].page.indexOf("/game/") >= 0)) + sockIds: Object.keys(clients).filter(k => + k != sid && clients[k].page == curPage + )})); + break; + } + case "pollgamers": + socket.send(JSON.stringify({code:"pollgamers", + sockIds: Object.keys(clients).filter(k => + k != sid && clients[k].page.indexOf("/game/") >= 0 )})); break; case "pagechange": + // page change clients[sid].page --> obj.page + // TODO: some offline rooms don't need to receive disconnect event notifyRoom(clients[sid].page, "disconnect"); if (clients[sid].page.indexOf("/game/") >= 0) - notifyRoom("/", "disconnect"); + notifyRoom("/", "gdisconnect"); clients[sid].page = obj.page; - notifyRoom(obj.page, "connect"); + // No need to notify connection: it's self-sent in .vue file + //notifyRoom(obj.page, "connect"); if (obj.page.indexOf("/game/") >= 0) - notifyRoom("/", "connect"); + notifyRoom("/", "gconnect"); break; case "askidentity": clients[obj.target].sock.send(JSON.stringify( {code:"askidentity",from:sid})); break; + case "asklastate": + clients[obj.target].sock.send(JSON.stringify( + {code:"asklastate",from:sid})); + break; case "askchallenge": clients[obj.target].sock.send(JSON.stringify( {code:"askchallenge",from:sid})); @@ -91,7 +119,7 @@ module.exports = function(wss) { : 0; const rid = gameSids[gid][idx]; clients[rid].sock.send(JSON.stringify( - {code:"askgame", from: rid})); + {code:"askgame", from: sid})); }); break; } @@ -136,11 +164,10 @@ module.exports = function(wss) { } break; case "newchat": - // WARNING: do not use query["page"], because the page may change - notifyRoom(clients[sid].page, "newchat", - {msg: obj.msg, name: obj.name}); + notifyRoom(clients[sid].page, "newchat", {chat:obj.chat}); break; // TODO: WebRTC instead in this case (most demanding?) + // --> At least do a "notifyRoom" case "newmove": clients[obj.target].sock.send(JSON.stringify( {code:"newmove", move:obj.move})); @@ -151,11 +178,11 @@ module.exports = function(wss) { break; case "resign": clients[obj.target].sock.send(JSON.stringify( - {code:"resign"})); + {code:"resign", side:obj.side})); break; case "abort": clients[obj.target].sock.send(JSON.stringify( - {code:"abort",msg:obj.msg})); + {code:"abort"})); break; case "drawoffer": clients[obj.target].sock.send(JSON.stringify( @@ -163,7 +190,7 @@ module.exports = function(wss) { break; case "draw": clients[obj.target].sock.send(JSON.stringify( - {code:"draw"})); + {code:"draw", message:obj.message})); break; } }); @@ -172,7 +199,7 @@ module.exports = function(wss) { delete clients[sid]; notifyRoom(page, "disconnect"); if (page.indexOf("/game/") >= 0) - notifyRoom("/", "disconnect"); //notify main hall + notifyRoom("/", "gdisconnect"); //notify main hall }); }); }