X-Git-Url: https://git.auder.net/?p=vchess.git;a=blobdiff_plain;f=server%2Fsockets.js;h=3854ca2f533ccc764d90bd6a25e17e0f52af66f7;hp=206c780ffabc06ff307a228f71e35cbbf92188b6;hb=1611a25f25911da6a95fc0095b31c4b096a6638e;hpb=658c47bf5843fb0855659f22f7b1c38318c66ce5 diff --git a/server/sockets.js b/server/sockets.js index 206c780f..3854ca2f 100644 --- a/server/sockets.js +++ b/server/sockets.js @@ -2,8 +2,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) -{ +function getJsonFromUrl(url) { const query = url.substr(2); //starts with "/?" let result = {}; query.split("&").forEach((part) => { @@ -14,9 +13,8 @@ function getJsonFromUrl(url) } // Helper to safe-send some message through a (web-)socket: -function send(socket, message) -{ - if (!!socket && socket.readyState == 1) +function send(socket, message) { + if (socket && socket.readyState == 1) socket.send(JSON.stringify(message)); } @@ -31,13 +29,14 @@ module.exports = function(wss) { const tmpId = query["tmpId"]; const page = query["page"]; const notifyRoom = (page,code,obj={}) => { - if (!clients[page]) - return; + if (!clients[page]) return; Object.keys(clients[page]).forEach(k => { Object.keys(clients[page][k]).forEach(x => { - if (k == sid && x == tmpId) - return; - send(clients[page][k][x], Object.assign({code:code, from:sid}, obj)); + if (k == sid && x == tmpId) return; + send( + clients[page][k][x], + Object.assign({code: code, from: sid}, obj) + ); }); }); }; @@ -45,17 +44,16 @@ module.exports = function(wss) { if (!clients[page] || !clients[page][sid] || !clients[page][sid][tmpId]) return; //job already done delete clients[page][sid][tmpId]; - if (Object.keys(clients[page][sid]).length == 0) - { + if (Object.keys(clients[page][sid]).length == 0) { delete clients[page][sid]; - if (Object.keys(clients[page]) == 0) + if (Object.keys(clients[page]).length == 0) delete clients[page]; } }; + const doDisconnect = () => { deleteConnexion(); - if (!clients[page] || !clients[page][sid]) - { + if (!clients[page] || !clients[page][sid]) { // I effectively disconnected from this page: notifyRoom(page, "disconnect"); if (page.indexOf("/game/") >= 0) @@ -64,13 +62,11 @@ module.exports = function(wss) { }; const messageListener = (objtxt) => { let obj = JSON.parse(objtxt); - switch (obj.code) - { + switch (obj.code) { // 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": - { + case "connect": { notifyRoom(page, "connect"); if (page.indexOf("/game/") >= 0) notifyRoom("/", "gconnect", {page:page}); @@ -80,8 +76,7 @@ module.exports = function(wss) { // When page changes: doDisconnect(); break; - case "killme": - { + case "killme": { // Self multi-connect: manual removal + disconnect const doKill = (pg) => { Object.keys(clients[pg][obj.sid]).forEach(x => { @@ -91,55 +86,53 @@ module.exports = function(wss) { }; const disconnectFromOtherConnexion = (pg,code,o={}) => { Object.keys(clients[pg]).forEach(k => { - if (k != obj.sid) - { + if (k != obj.sid) { Object.keys(clients[pg][k]).forEach(x => { - send(clients[pg][k][x], Object.assign({code:code, from:obj.sid}, o)); + send( + clients[pg][k][x], + Object.assign({code: code, from: obj.sid}, o) + ); }); } }); }; Object.keys(clients).forEach(pg => { - if (!!clients[pg][obj.sid]) - { + if (clients[pg][obj.sid]) { doKill(pg); disconnectFromOtherConnexion(pg, "disconnect"); - if (pg.indexOf("/game/") >= 0 && !!clients["/"]) - disconnectFromOtherConnexion("/", "gdisconnect", {page:pg}); + if (pg.indexOf("/game/") >= 0 && clients["/"]) + disconnectFromOtherConnexion("/", "gdisconnect", {page: pg}); } }); break; } - case "pollclients": //from Hall or Game - { + case "pollclients": { + // From Hall or Game let sockIds = []; Object.keys(clients[page]).forEach(k => { // Avoid polling myself: no new information to get - if (k != sid) - sockIds.push(k); + if (k != sid) sockIds.push(k); }); - send(socket, {code:"pollclients", sockIds:sockIds}); + send(socket, {code: "pollclients", sockIds: sockIds}); break; } - case "pollclientsandgamers": //from Hall - { + case "pollclientsandgamers": { + // From Hall let sockIds = []; Object.keys(clients["/"]).forEach(k => { // Avoid polling myself: no new information to get - if (k != sid) - sockIds.push({sid:k}); + if (k != sid) sockIds.push({sid:k}); }); // NOTE: a "gamer" could also just be an observer Object.keys(clients).forEach(p => { - if (p != "/") - { + if (p != "/") { Object.keys(clients[p]).forEach(k => { - if (k != sid) - sockIds.push({sid:k, page:p}); //page needed for gamers + // 'page' indicator is needed for gamers + if (k != sid) sockIds.push({sid:k, page:p}); }); } }); - send(socket, {code:"pollclientsandgamers", sockIds:sockIds}); + send(socket, {code: "pollclientsandgamers", sockIds: sockIds}); break; } @@ -149,23 +142,20 @@ module.exports = function(wss) { case "asklastate": case "askchallenge": case "askgame": - case "askfullgame": - { + case "askfullgame": { const pg = obj.page || page; //required for askidentity and askgame // In cas askfullgame to wrong SID for example, would crash: - if (clients[pg] && clients[pg][obj.target]) - { + if (clients[pg] && clients[pg][obj.target]) { const tmpIds = Object.keys(clients[pg][obj.target]); - if (obj.target == sid) //targetting myself - { + if (obj.target == sid) { + // Targetting myself const idx_myTmpid = tmpIds.findIndex(x => x == tmpId); - if (idx_myTmpid >= 0) - tmpIds.splice(idx_myTmpid, 1); + if (idx_myTmpid >= 0) tmpIds.splice(idx_myTmpid, 1); } const tmpId_idx = Math.floor(Math.random() * tmpIds.length); send( clients[pg][obj.target][tmpIds[tmpId_idx]], - {code:obj.code, from:[sid,tmpId,page]} + {code: obj.code, from: [sid,tmpId,page]} ); } break; @@ -176,7 +166,10 @@ module.exports = function(wss) { case "startgame": Object.keys(clients[page][obj.target]).forEach(x => { if (obj.target != sid || x != tmpId) - send(clients[page][obj.target][x], {code:obj.code, data:obj.data}); + send( + clients[page][obj.target][x], + {code: obj.code, data: obj.data} + ); }); break; @@ -190,32 +183,33 @@ module.exports = function(wss) { case "abort": case "drawoffer": case "draw": - { - notifyRoom(page, obj.code, {data:obj.data}); - const mygamesPg = "/mygames"; - if (obj.code == "newmove" && clients[mygamesPg]) - { - // Relay newmove info to myGames page - // NOTE: the move itself is not needed (for now at least) - const gid = page.split("/")[2]; //format is "/game/gid" - obj.data.players.forEach(pSid => { - if (clients[mygamesPg][pSid]) - { - Object.keys(clients[mygamesPg][pSid]).forEach(x => { - send( - clients[mygamesPg][pSid][x], - {code:"newmove", gid:gid} - ); - }); - } - }); - } + notifyRoom(page, obj.code, {data: obj.data}); break; - } case "result": // Special case: notify all, 'transroom': Game --> Hall - notifyRoom("/", "result", {gid:obj.gid, score:obj.score}); + notifyRoom("/", "result", {gid: obj.gid, score: obj.score}); + break; + + case "mconnect": + // Special case: notify some game rooms that + // I'm watching game state from MyGames + // TODO: this code is ignored for now + obj.gids.forEach(gid => { + const pg = "/game/" + gid; + Object.keys(clients[pg]).forEach(s => { + Object.keys(clients[pg][s]).forEach(x => { + send( + clients[pg][s][x], + {code: "mconnect", data: obj.data} + ); + }); + }); + }); + break; + case "mdisconnect": + // TODO + // Also TODO: pass newgame to MyGames, and gameover (result) break; // Passing, relaying something: from isn't needed,