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
commit 9cfa7eb236
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 2 deletions

View File

@ -183,9 +183,13 @@ export class IoSocketController {
// The answer shall contain the list of all users of the room with their positions: // The answer shall contain the list of all users of the room with their positions:
const listOfUsers = Array.from(world.getUsers(), ([key, user]) => { 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); return new MessageUserPosition(user.id, player.name, player.character, player.position);
}); }).filter((item: MessageUserPosition|null) => item !== null);
answerFn(listOfUsers); answerFn(listOfUsers);
} catch (e) { } catch (e) {
console.error('An error occurred on "join_room" event'); 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); const world : World|undefined = this.Worlds.get(Client.roomId);
if(world){ if(world){
world.leave(Client); world.leave(Client);
if (world.isEmpty()) {
this.Worlds.delete(Client.roomId);
}
} }
//user leave previous room //user leave previous room
Client.leave(Client.roomId); Client.leave(Client.roomId);

View File

@ -72,6 +72,10 @@ export class World {
this.users.delete(user.userId); this.users.delete(user.userId);
} }
public isEmpty(): boolean {
return this.users.size === 0;
}
public updatePosition(socket : Identificable, userPosition: PointInterface): void { public updatePosition(socket : Identificable, userPosition: PointInterface): void {
const user = this.users.get(socket.userId); const user = this.users.get(socket.userId);
if(typeof user === 'undefined') { if(typeof user === 'undefined') {