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;
}
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});
+ break;
+
// Passing, relaying something: from isn't needed,
// but target is fully identified (sid + tmpId)
case "challenge":
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