Refactor leave and join room
authorgparant <g.parant@thecodingmachine.com>
Sun, 10 May 2020 17:54:41 +0000 (19:54 +0200)
committergparant <g.parant@thecodingmachine.com>
Sun, 10 May 2020 17:54:41 +0000 (19:54 +0200)
back/src/Controller/IoSocketController.ts
back/src/Model/Websocket/ExtRooms.ts

index e9c86a3faa8e3b41622ca6b170283db67e400e3f..fc4336bf854201cd55047e3cc2133e744fa44d19 100644 (file)
@@ -93,56 +93,24 @@ export class IoSocketController {
                     return socket.emit(SockerIoEvent.MESSAGE_ERROR, JSON.stringify({message: messageUserPosition.message}))
                 }
 
-                if((socket as ExSocketInterface).roomId === messageUserPosition.roomId){
+                let Client = (socket as ExSocketInterface);
+
+                if(Client.roomId === messageUserPosition.roomId){
                     return;
                 }
 
-                //lease previous room and world
-                if((socket as ExSocketInterface).roomId){
-                    let Client = (socket as ExSocketInterface);
-                    //user leave previous room
-                    socket.leave(Client.roomId);
-                    //user leave previous world
-                    let world : World|undefined = this.Worlds.get(Client.roomId);
-                    if(world){
-                        world.leave(Client);
-                        this.Worlds.set(Client.roomId, world);
-                    }
-                }
+                //leave previous room
+                this.leaveRoom(Client);
 
-                //join user in room
-                socket.join(messageUserPosition.roomId);
-
-                //check and create new world for a room
-                if(!this.Worlds.get(messageUserPosition.roomId)){
-                    let world = new World((user1: string, group: Group) => {
-                        this.connectedUser(user1, group);
-                    }, (user1: string, group: Group) => {
-                        this.disConnectedUser(user1, group);
-                    }, MINIMUM_DISTANCE, GROUP_RADIUS, (group: Group) => {
-                        this.sendUpdateGroupEvent(group);
-                    }, (groupUuid: string, lastUser: UserInterface) => {
-                        this.sendDeleteGroupEvent(groupUuid, lastUser);
-                    });
-                    this.Worlds.set(messageUserPosition.roomId, world);
-                }
-
-                //join world
-                let world : World|undefined = this.Worlds.get(messageUserPosition.roomId);
-                if(world) {
-                    world.join(messageUserPosition);
-                    this.Worlds.set(messageUserPosition.roomId, world);
-                }
+                //join new previous room
+                this.joinRoom(Client, messageUserPosition);
 
                 // sending to all clients in room except sender
-                this.saveUserInformation((socket as ExSocketInterface), messageUserPosition);
+                this.saveUserInformation(Client, messageUserPosition);
 
                 //add function to refresh position user in real time.
                 this.refreshUserPosition();
 
-                //refresh position in world
-                this.refreshWorldPosition(messageUserPosition);
-
                 socket.to(messageUserPosition.roomId).emit(SockerIoEvent.JOIN_ROOM, messageUserPosition.toString());
             });
 
@@ -157,9 +125,6 @@ export class IoSocketController {
 
                 //refresh position of all user in all rooms in real time
                 this.refreshUserPosition();
-
-                //refresh position in world
-                this.refreshWorldPosition(messageUserPosition);
             });
 
             socket.on(SockerIoEvent.WEBRTC_SIGNAL, (message: string) => {
@@ -192,14 +157,10 @@ export class IoSocketController {
                 //refresh position of all user in all rooms in real time
                 this.refreshUserPosition();
 
-                let world : World|undefined = this.Worlds.get(Client.roomId);
-                if(world){
-                    world.leave(Client);
-                    this.Worlds.set(Client.roomId, world);
-                }
-
                 //leave room
-                socket.leave(Client.roomId);
+                this.leaveRoom(Client);
+
+                //leave webrtc room
                 socket.leave(Client.webRtcRoomId);
 
                 //delete all socket information
@@ -245,6 +206,54 @@ export class IoSocketController {
         delete Client.webRtcRoomId;
     }
 
+    /**
+     *
+     * @param Client
+     */
+    leaveRoom(Client : ExSocketInterface){
+        //lease previous room and world
+        if(Client.roomId){
+            //user leave previous room
+            Client.leave(Client.roomId);
+            //user leave previous world
+            let world : World|undefined = this.Worlds.get(Client.roomId);
+            if(world){
+                world.leave(Client);
+                this.Worlds.set(Client.roomId, world);
+            }
+        }
+    }
+    /**
+     *
+     * @param Client
+     * @param messageUserPosition
+     */
+    joinRoom(Client : ExSocketInterface, messageUserPosition: MessageUserPosition){
+        //join user in room
+        Client.join(messageUserPosition.roomId);
+
+        //check and create new world for a room
+        if(!this.Worlds.get(messageUserPosition.roomId)){
+            let world = new World((user1: string, group: Group) => {
+                this.connectedUser(user1, group);
+            }, (user1: string, group: Group) => {
+                this.disConnectedUser(user1, group);
+            }, MINIMUM_DISTANCE, GROUP_RADIUS, (group: Group) => {
+                this.sendUpdateGroupEvent(group);
+            }, (groupUuid: string, lastUser: UserInterface) => {
+                this.sendDeleteGroupEvent(groupUuid, lastUser);
+            });
+            this.Worlds.set(messageUserPosition.roomId, world);
+        }
+
+        //join world
+        let world : World|undefined = this.Worlds.get(messageUserPosition.roomId);
+        if(world) {
+            world.join(messageUserPosition);
+            this.Worlds.set(messageUserPosition.roomId, world);
+        }
+    }
+
     /**
      *
      * @param socket
@@ -299,15 +308,6 @@ export class IoSocketController {
         rooms.refreshUserPosition(rooms, this.Io);
     }
 
-    refreshWorldPosition(messageUserPosition : MessageUserPosition){
-        // update position in the worl
-        let world = this.Worlds.get(messageUserPosition.roomId);
-        if(world) {
-            world.updatePosition(messageUserPosition);
-            this.Worlds.set(messageUserPosition.roomId, world);
-        }
-    }
-
     //Hydrate and manage error
     hydrateMessageReceive(message: string): MessageUserPosition | Error {
         try {
index ae3b53dc26353d3bd4e6824e11721b94fc4c6e0d..c83cf77d22939a210c1c1c6865937e248d65eee4 100644 (file)
@@ -12,7 +12,7 @@ export class ExtRooms implements ExtRoomsInterface{
     [room: string]: SocketIO.Room;
 }
 
-let RefreshUserPositionFunction = function(rooms : ExtRooms, Io: socketIO.Server) {
+let RefreshUserPositionFunction = function(rooms : ExtRooms, Io: socketIO.Server, Worlds: Map<string, World>) {
     let clients = Io.clients();
     let socketsKey = Object.keys(Io.clients().sockets);
 
@@ -38,6 +38,14 @@ let RefreshUserPositionFunction = function(rooms : ExtRooms, Io: socketIO.Server
             dataArray = [data];
         }
         mapPositionUserByRoom.set(data.roomId, dataArray);
+
+        // update position in the worl
+        let messageUserPosition = new MessageUserPosition(data);
+        let world = Worlds.get(messageUserPosition.roomId);
+        if(world) {
+            world.updatePosition(messageUserPosition);
+            Worlds.set(messageUserPosition.roomId, world);
+        }
     }
     rooms.userPositionMapByRoom = Array.from(mapPositionUserByRoom);
 }