case "askfullgame":
{
const pg = obj.page || page; //required for askidentity and askgame
- const tmpIds = Object.keys(clients[pg][obj.target]);
- if (obj.target == sid) //targetting myself
+ // In cas askfullgame to wrong SID for example, would crash:
+ if (clients[pg] && clients[pg][obj.target])
{
- const idx_myTmpid = tmpIds.findIndex(x => x == tmpId);
- if (idx_myTmpid >= 0)
- tmpIds.splice(idx_myTmpid, 1);
+ const tmpIds = Object.keys(clients[pg][obj.target]);
+ if (obj.target == sid) //targetting myself
+ {
+ const idx_myTmpid = tmpIds.findIndex(x => x == tmpId);
+ 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]}
+ );
}
- const tmpId_idx = Math.floor(Math.random() * tmpIds.length);
- send(clients[pg][obj.target][tmpIds[tmpId_idx]], {code:obj.code, from:[sid,tmpId,page]});
break;
}
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}
+ );
+ });
+ }
+ });
+ }
+ break;
+ }
+
+ case "result":
+ // Special case: notify all, 'transroom': Game --> Hall
+ notifyRoom("/", "result", {gid:obj.gid, score:obj.score});
break;
// Passing, relaying something: from isn't needed,
case "lastate":
{
const pg = obj.target[2] || page; //required for identity and game
- send(clients[pg][obj.target[0]][obj.target[1]], {code:obj.code, data:obj.data});
+ // NOTE: if in game we ask identity to opponent still in Hall,
+ // but leaving Hall, clients[pg] or clients[pg][target] could be ndefined
+ if (clients[pg] && clients[pg][obj.target[0]])
+ send(clients[pg][obj.target[0]][obj.target[1]], {code:obj.code, data:obj.data});
break;
}
}
};
const closeListener = () => {
- // TODO: BUG: this is triggered twice when anonymous reloads page
- // (+ registered users, everyone in Hall).
- // For tab or browser closing:
+ // For browser or tab closing (including page reload):
doDisconnect();
};
// Update clients object: add new connexion