Merge pull request #209 from thecodingmachine/mitigateworlderror

Mitigating problem when there is a synchronization issue between World and sockets list
This commit is contained in:
David Négrier
2020-06-29 19:25:16 +02:00
committed by GitHub
2 changed files with 13 additions and 2 deletions
+9 -2
View File
@@ -183,9 +183,13 @@ export class IoSocketController {
// The answer shall contain the list of all users of the room with their positions:
const listOfUsers = Array.from(world.getUsers(), ([key, user]) => {
const player = this.searchClientByIdOrFail(user.id);
const player: ExSocketInterface|undefined = this.sockets.get(user.id);
if (player === undefined) {
console.warn('Something went wrong. The World contains a user "'+user.id+"' but this user does not exist in the sockets list!");
return null;
}
return new MessageUserPosition(user.id, player.name, player.character, player.position);
});
}).filter((item: MessageUserPosition|null) => item !== null);
answerFn(listOfUsers);
} catch (e) {
console.error('An error occurred on "join_room" event');
@@ -297,6 +301,9 @@ export class IoSocketController {
const world : World|undefined = this.Worlds.get(Client.roomId);
if(world){
world.leave(Client);
if (world.isEmpty()) {
this.Worlds.delete(Client.roomId);
}
}
//user leave previous room
Client.leave(Client.roomId);
+4
View File
@@ -72,6 +72,10 @@ export class World {
this.users.delete(user.userId);
}
public isEmpty(): boolean {
return this.users.size === 0;
}
public updatePosition(socket : Identificable, userPosition: PointInterface): void {
const user = this.users.get(socket.userId);
if(typeof user === 'undefined') {