Catching errors in socket callbacks
authorDavid Négrier <d.negrier@thecodingmachine.com>
Tue, 12 May 2020 09:49:55 +0000 (11:49 +0200)
committerDavid Négrier <d.negrier@thecodingmachine.com>
Tue, 12 May 2020 09:49:55 +0000 (11:49 +0200)
Catching errors in socket callbacks to avoid having the server crashing when an error occurs.

back/src/Controller/IoSocketController.ts
front/src/Phaser/Entity/PlayableCaracter.ts
front/src/Phaser/Player/Player.ts

index c855c66a3521c8f30f5e81f86cfaafae347f5973..9f7de4ec338acbd04b0ad6ef5c350559a56ee7c1 100644 (file)
@@ -88,46 +88,56 @@ export class IoSocketController {
                         y: user y position on map
             */
             socket.on(SockerIoEvent.JOIN_ROOM, (message: string) => {
-                let messageUserPosition = this.hydrateMessageReceive(message);
-                if (messageUserPosition instanceof Error) {
-                    return socket.emit(SockerIoEvent.MESSAGE_ERROR, JSON.stringify({message: messageUserPosition.message}))
-                }
+                try {
+                    let messageUserPosition = this.hydrateMessageReceive(message);
+                    if (messageUserPosition instanceof Error) {
+                        return socket.emit(SockerIoEvent.MESSAGE_ERROR, JSON.stringify({message: messageUserPosition.message}))
+                    }
 
-                let Client = (socket as ExSocketInterface);
+                    let Client = (socket as ExSocketInterface);
 
-                if(Client.roomId === messageUserPosition.roomId){
-                    return;
-                }
+                    if(Client.roomId === messageUserPosition.roomId){
+                        return;
+                    }
 
-                //leave previous room
-                this.leaveRoom(Client);
+                    //leave previous room
+                    this.leaveRoom(Client);
 
-                //join new previous room
-                this.joinRoom(Client, messageUserPosition);
+                    //join new previous room
+                    this.joinRoom(Client, messageUserPosition);
 
-                // sending to all clients in room except sender
-                this.saveUserInformation(Client, messageUserPosition);
+                    // sending to all clients in room except sender
+                    this.saveUserInformation(Client, messageUserPosition);
 
-                //add function to refresh position user in real time.
-                this.refreshUserPosition(Client);
+                    //add function to refresh position user in real time.
+                    this.refreshUserPosition(Client);
 
-                socket.to(messageUserPosition.roomId).emit(SockerIoEvent.JOIN_ROOM, messageUserPosition.toString());
+                    socket.to(messageUserPosition.roomId).emit(SockerIoEvent.JOIN_ROOM, messageUserPosition.toString());
+                } catch (e) {
+                    console.error('An error occurred on "join_room" event');
+                    console.error(e);
+                }
             });
 
             socket.on(SockerIoEvent.USER_POSITION, (message: string) => {
-                let messageUserPosition = this.hydrateMessageReceive(message);
-                if (messageUserPosition instanceof Error) {
-                    return socket.emit(SockerIoEvent.MESSAGE_ERROR, JSON.stringify({message: messageUserPosition.message}));
+                try {
+                    let messageUserPosition = this.hydrateMessageReceive(message);
+                    if (messageUserPosition instanceof Error) {
+                        return socket.emit(SockerIoEvent.MESSAGE_ERROR, JSON.stringify({message: messageUserPosition.message}));
+                    }
+
+                    let Client = (socket as ExSocketInterface);
+
+                    // sending to all clients in room except sender
+                    this.saveUserInformation(Client, messageUserPosition);
+
+                    //refresh position of all user in all rooms in real time
+                    this.refreshUserPosition(Client);
+                } catch (e) {
+                    console.error('An error occurred on "user_position" event');
+                    console.error(e);
                 }
-
-                let Client = (socket as ExSocketInterface);
-
-                // sending to all clients in room except sender
-                this.saveUserInformation(Client, messageUserPosition);
-
-                //refresh position of all user in all rooms in real time
-                this.refreshUserPosition(Client);
-            });
+        });
 
             socket.on(SockerIoEvent.WEBRTC_SIGNAL, (message: string) => {
                 let data: any = JSON.parse(message);
@@ -153,24 +163,29 @@ export class IoSocketController {
             });
 
             socket.on(SockerIoEvent.DISCONNECT, () => {
-                let Client = (socket as ExSocketInterface);
-                this.sendDisconnectedEvent(Client);
-
-                //refresh position of all user in all rooms in real time
-                this.refreshUserPosition(Client);
-
-                //leave room
-                this.leaveRoom(Client);
-
-                //leave webrtc room
-                socket.leave(Client.webRtcRoomId);
-
-                //delete all socket information
-                delete Client.userId;
-                delete Client.webRtcRoomId;
-                delete Client.roomId;
-                delete Client.token;
-                delete Client.position;
+                try {
+                    let Client = (socket as ExSocketInterface);
+                    this.sendDisconnectedEvent(Client);
+
+                    //refresh position of all user in all rooms in real time
+                    this.refreshUserPosition(Client);
+
+                    //leave room
+                    this.leaveRoom(Client);
+
+                    //leave webrtc room
+                    socket.leave(Client.webRtcRoomId);
+
+                    //delete all socket information
+                    delete Client.userId;
+                    delete Client.webRtcRoomId;
+                    delete Client.roomId;
+                    delete Client.token;
+                    delete Client.position;
+                } catch (e) {
+                    console.error('An error occurred on "disconnect"');
+                    console.error(e);
+                }
             });
         });
     }
index a5f63758ca21e8be21853d8f635d07992aa1c61c..e126dbb96b292cc5042be96a0f99c68c3ffaacb9 100644 (file)
@@ -49,6 +49,8 @@ export class PlayableCaracter extends Phaser.Physics.Arcade.Sprite {
         this.setSize(16, 16); //edit the hitbox to better match the character model
         this.setOffset(8, 16);
         this.setDepth(-1);
+
+        this.scene.events.on('postupdate', this.postupdate.bind(this));
     }
 
     move(x: number, y: number) {
@@ -69,14 +71,14 @@ export class PlayableCaracter extends Phaser.Physics.Arcade.Sprite {
         if (this.bubble) {
             this.bubble.moveBubble(this.x, this.y);
         }
-        this.updatePlayerNamePosition(this.x, this.y);
 
         //update depth user
         this.setDepth(this.y);
     }
 
-    updatePlayerNamePosition(x: number, y: number){
-        this.playerName.setPosition(x, y - 25);
+    postupdate(time: number, delta: number) {
+        //super.update(delta);
+        this.playerName.setPosition(this.x, this.y - 25);
     }
 
     stop(){
@@ -95,6 +97,9 @@ export class PlayableCaracter extends Phaser.Physics.Arcade.Sprite {
     }
 
     destroy(fromScene?: boolean): void {
+        if (this.scene) {
+            this.scene.events.removeListener('postupdate', this.postupdate.bind(this));
+        }
         super.destroy(fromScene);
         this.playerName.destroy();
     }
index e8e2e0d318501a3838c915e39e8aff8690c4e4b4..932f889d8f7a24e4cbd13527840b26a1e43b2487 100644 (file)
@@ -62,7 +62,7 @@ export class Player extends PlayableCaracter implements CurrentGamerInterface, G
 
         let activeEvents = this.userInputManager.getEventListForGameTick();
         let speedMultiplier = activeEvents.get(UserInputEvent.SpeedUp) ? 25 : 9;
-        let moveAmount = speedMultiplier * delta;
+        let moveAmount = speedMultiplier * 20;
 
         let x = 0;
         let y = 0;
@@ -102,6 +102,5 @@ export class Player extends PlayableCaracter implements CurrentGamerInterface, G
         this.setX(MessageUserPosition.position.x);
         this.setY(MessageUserPosition.position.y);
         this.setDepth(MessageUserPosition.position.y);
-        this.updatePlayerNamePosition(MessageUserPosition.position.x, MessageUserPosition.position.y);
     }
 }