X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=server%2Fsockets.js;h=45e003f8b8efbc46a320cd53aadac6c961db5d50;hb=d641bec1b3b299e16b7da93f966dad0b0bd35088;hp=75aeadd33da5910c05a72bdd17b3bb926d422dd7;hpb=120fe373ca3b9e83e33bd59979af10fe09350fc5;p=vchess.git diff --git a/server/sockets.js b/server/sockets.js index 75aeadd3..45e003f8 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,6 @@ module.exports = function(wss) { wss.on("connection", (socket, req) => { const query = getJsonFromUrl(req.url); const sid = query["sid"]; - if (!!clients[sid]) - return socket.send(JSON.stringify({code:"duplicate"})); - clients[sid] = {sock: socket, page: query["page"]}; const notifyRoom = (page,code,obj={},excluded=[]) => { Object.keys(clients).forEach(k => { if (k in excluded) @@ -31,15 +29,27 @@ module.exports = function(wss) { } }); }; - // 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 => { + const messageListener = (objtxt) => { let obj = JSON.parse(objtxt); if (!!obj.target && !clients[obj.target]) return; //receiver not connected, nothing we can do switch (obj.code) { + case "duplicate": + // Turn off message listening, and send disconnect if needed: + socket.removeListener("message", messageListener); + socket.removeListener("close", closeListener); + // From obj.page to clients[sid].page (TODO: unclear) + if (clients[sid].page != obj.page) + { + notifyRoom(obj.page, "disconnect"); + if (obj.page.indexOf("/game/") >= 0) + notifyRoom("/", "gdisconnect"); + } + break; + // 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. case "connect": { const curPage = clients[sid].page; @@ -65,11 +75,13 @@ module.exports = function(wss) { 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("/", "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("/", "gconnect"); break; @@ -77,6 +89,10 @@ module.exports = function(wss) { 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})); @@ -109,6 +125,10 @@ module.exports = function(wss) { }); break; } + case "askgame": + clients[obj.target].sock.send(JSON.stringify( + {code:"askgame", from:sid})); + break; case "askfullgame": clients[obj.target].sock.send(JSON.stringify( {code:"askfullgame", from:sid})); @@ -153,7 +173,7 @@ module.exports = function(wss) { notifyRoom(clients[sid].page, "newchat", {chat:obj.chat}); break; // TODO: WebRTC instead in this case (most demanding?) - // --> At least do a "notifyRoom" + // --> Or else: at least do a "notifyRoom" (also for draw, resign...) case "newmove": clients[obj.target].sock.send(JSON.stringify( {code:"newmove", move:obj.move})); @@ -179,13 +199,22 @@ module.exports = function(wss) { {code:"draw", message:obj.message})); break; } - }); - socket.on("close", () => { + }; + const closeListener = () => { const page = clients[sid].page; delete clients[sid]; notifyRoom(page, "disconnect"); if (page.indexOf("/game/") >= 0) notifyRoom("/", "gdisconnect"); //notify main hall - }); + }; + if (!!clients[sid]) + { + // Turn off old sock through current client: + clients[sid].sock.send(JSON.stringify({code:"duplicate"})); + } + // Potentially replace current connection: + clients[sid] = {sock: socket, page: query["page"]}; + socket.on("message", messageListener); + socket.on("close", closeListener); }); }