+ case "killme": {
+ // Self multi-connect: manual removal + disconnect
+ const doKill = (pg) => {
+ Object.keys(clients[pg][obj.sid]).forEach(x => {
+ send(clients[pg][obj.sid][x].socket, { code: "killed" });
+ });
+ delete clients[pg][obj.sid];
+ };
+ const disconnectFromOtherConnexion = (pg,code,o={}) => {
+ Object.keys(clients[pg]).forEach(k => {
+ if (k != obj.sid) {
+ Object.keys(clients[pg][k]).forEach(x => {
+ send(
+ clients[pg][k][x].socket,
+ Object.assign({ code: code, from: obj.sid }, o)
+ );
+ });
+ }
+ });
+ };
+ Object.keys(clients).forEach(pg => {
+ if (clients[pg][obj.sid]) {
+ doKill(pg);
+ disconnectFromOtherConnexion(pg, "disconnect");
+ if (pg.indexOf("/game/") >= 0 && clients["/"])
+ disconnectFromOtherConnexion("/", "gdisconnect", { page: pg });
+ }
+ });
+ break;
+ }
+ 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);
+ });
+ send(socket, { code: "pollclients", sockIds: sockIds });
+ break;
+ }
+ 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});
+ });
+ // NOTE: a "gamer" could also just be an observer
+ Object.keys(clients).forEach(p => {
+ if (p != "/") {
+ Object.keys(clients[p]).forEach(k => {
+ // 'page' indicator is needed for gamers
+ if (k != sid) sockIds.push({ sid:k, page:p });
+ });
+ }
+ });
+ send(socket, { code: "pollclientsandgamers", sockIds: sockIds });