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"}));
clients[sid] = {sock: socket, page: query["page"]};
{code:"askchallenge",from:sid}));
break;
case "askgames":
+ {
// Check all clients playing, and send them a "askgame" message
+ let gameSids = {}; //game ID --> [sid1, sid2]
+ const regexpGid = /\/[a-zA-Z0-9]+$/;
Object.keys(clients).forEach(k => {
if (k != sid && clients[k].page.indexOf("/game/") >= 0)
{
- clients[k].sock.send(JSON.stringify(
- {code:"askgame", from: sid}));
+ const gid = clients[k].page.match(regexpGid)[0];
+ if (!gameSids[gid])
+ gameSids[gid] = [k];
+ else
+ gameSids[gid].push(k);
}
});
+ // Request only one client out of 2 (TODO: this is a bit heavy)
+ // Alt: ask game to all, and filter later?
+ Object.keys(gameSids).forEach(gid => {
+ const L = gameSids[gid].length;
+ const idx = L > 1
+ ? Math.floor(Math.random() * Math.floor(L))
+ : 0;
+ const rid = gameSids[gid][idx];
+ clients[rid].sock.send(JSON.stringify(
+ {code:"askgame", from: sid}));
+ });
+ break;
+ }
+ case "askfullgame":
+ clients[obj.target].sock.send(JSON.stringify(
+ {code:"askfullgame", from:sid}));
+ break;
+ case "fullgame":
+ clients[obj.target].sock.send(JSON.stringify(
+ {code:"fullgame", game:obj.game}));
break;
case "identity":
clients[obj.target].sock.send(JSON.stringify(
}
break;
case "newchat":
- notifyRoom(query["page"], "newchat", {msg:obj.msg, name:obj.name});
+ // WARNING: do not use query["page"], because the page may change
+ notifyRoom(clients[sid].page, "newchat",
+ {msg: obj.msg, name: obj.name});
break;
// TODO: WebRTC instead in this case (most demanding?)
case "newmove":