Fix mediam stream manage and server back down
authorGregoire Parant <g.parant@thecodingmachine.com>
Sat, 23 May 2020 12:00:36 +0000 (14:00 +0200)
committerGregoire Parant <g.parant@thecodingmachine.com>
Sat, 23 May 2020 12:00:36 +0000 (14:00 +0200)
back/src/Controller/AuthenticateController.ts
back/src/Controller/IoSocketController.ts
front/src/Connexion.ts
front/src/Phaser/Game/GameScene.ts
front/src/WebRtc/SimplePeer.ts

index db5fb1ce58226c66adcc60d362a63838d46fc537..4e6175090744a3058373013fb9f14a9a2e39cc8b 100644 (file)
@@ -15,21 +15,21 @@ export class AuthenticateController {
     //permit to login on application. Return token to connect on Websocket IO.
     login(){
         // For now, let's completely forget the /login route.
-        /*this.App.post("/login", (req: Request, res: Response) => {
+        this.App.post("/login", (req: Request, res: Response) => {
             let param = req.body;
-            if(!param.email){
+            /*if(!param.name){
                 return res.status(BAD_REQUEST).send({
                     message: "email parameter is empty"
                 });
-            }
+            }*/
             //TODO check user email for The Coding Machine game
             let userId = uuid();
-            let token = Jwt.sign({email: param.email, userId: userId}, SECRET_KEY, {expiresIn: '24h'});
+            let token = Jwt.sign({name: param.name, userId: userId}, SECRET_KEY, {expiresIn: '24h'});
             return res.status(OK).send({
                 token: token,
                 mapUrlStart: URL_ROOM_STARTED,
                 userId: userId,
             });
-        });*/
+        });
     }
 }
index 8332d7826fdc59f9c0eac6424c3a448ac9f4aaa7..a93f7738f7276f1375bde5eaade27e9f1ae7d855 100644 (file)
@@ -39,25 +39,42 @@ export class IoSocketController {
 
         // Authentication with token. it will be decoded and stored in the socket.
         // Completely commented for now, as we do not use the "/login" route at all.
-        /*this.Io.use((socket: Socket, next) => {
+        this.Io.use((socket: Socket, next) => {
             if (!socket.handshake.query || !socket.handshake.query.token) {
                 return next(new Error('Authentication error'));
             }
             if(this.searchClientByToken(socket.handshake.query.token)){
                 return next(new Error('Authentication error'));
             }
-            Jwt.verify(socket.handshake.query.token, SECRET_KEY, (err: JsonWebTokenError, tokenDecoded: object) => {
+            Jwt.verify(socket.handshake.query.token, SECRET_KEY, (err: JsonWebTokenError, tokenDecoded: any) => {
                 if (err) {
                     return next(new Error('Authentication error'));
                 }
                 (socket as ExSocketInterface).token = tokenDecoded;
+                (socket as ExSocketInterface).id = tokenDecoded.userId;
                 next();
             });
-        });*/
+        });
 
         this.ioConnection();
     }
 
+    /**
+     *
+     * @param token
+     */
+    searchClientByToken(token: string): ExSocketInterface | null {
+        let clients: Array<any> = Object.values(this.Io.sockets.sockets);
+        for (let i = 0; i < clients.length; i++) {
+            let client: ExSocketInterface = clients[i];
+            if (client.token !== token) {
+                continue
+            }
+            return client;
+        }
+        return null;
+    }
+
     private sendUpdateGroupEvent(group: Group): void {
         // Let's get the room of the group. To do this, let's get anyone in the group and find its room.
         // Note: this is suboptimal
index 1b9631296b2ac5c5b6c31a4380521b74040dbd2d..e5a73aaf0d6c22ff671047f50134da12ddf65119 100644 (file)
@@ -165,25 +165,20 @@ export class Connexion implements ConnexionInterface {
     createConnexion(name: string, characterSelected: string): Promise<ConnexionInterface> {
         this.name = name;
         this.character = characterSelected;
-        /*return Axios.post(`${API_URL}/login`, {email: this.email})
+        return Axios.post(`${API_URL}/login`, {name: name})
             .then((res) => {
                 this.token = res.data.token;
-                this.userId = res.data.userId;*/
-
                 this.socket = SocketIo(`${API_URL}`, {
-                    /*query: {
+                    query: {
                         token: this.token
-                    }*/
+                    }
                 });
-
                 return this.connectSocketServer();
-
-         /*       return res.data;
             })
             .catch((err) => {
                 console.error(err);
                 throw err;
-            });*/
+            });
     }
 
     /**
index 4a003b3340545cdaceb38eca69aa5fdf15a05a33..c79fb7407fea54fdd7eba9ec2f91c220bf1385c3 100644 (file)
@@ -3,7 +3,7 @@ import {
     GroupCreatedUpdatedMessageInterface,
     MessageUserJoined,
     MessageUserMovedInterface,
-    MessageUserPositionInterface
+    MessageUserPositionInterface, PointInterface
 } from "../../Connexion";
 import {CurrentGamerInterface, GamerInterface, hasMovedEventName, Player} from "../Player/Player";
 import { DEBUG_MODE, RESOLUTION, ROOM, ZOOM_LEVEL} from "../../Enum/EnvironmentVariable";
@@ -14,6 +14,7 @@ import Sprite = Phaser.GameObjects.Sprite;
 import CanvasTexture = Phaser.Textures.CanvasTexture;
 import {AddPlayerInterface} from "./AddPlayerInterface";
 import {PlayerAnimationNames} from "../Player/Animation";
+import {MessageUserMoved} from "../../../../back/src/Model/Websocket/MessageUserMoved";
 
 export enum Textures {
     Player = "male1"
@@ -410,6 +411,14 @@ export class GameScene extends Phaser.Scene {
      * Create new player
      */
     public addPlayer(addPlayerData : AddPlayerInterface) : void{
+        //check if exist player, if exist, move position
+        if(this.MapPlayersByKey.has(addPlayerData.userId)){
+            this.updatePlayerPosition({
+                userId: addPlayerData.userId,
+                position: addPlayerData.position
+            });
+            return;
+        }
         //initialise player
         let player = new Player(
             addPlayerData.userId,
index 595e83b2eca0f7da7d60c405caccd171a9d0268d..b301876e655566fd89f053853b67941155a3aa2d 100644 (file)
@@ -141,9 +141,9 @@ export class SimplePeer implements SimplePeerInterface{
             this.stream(user.userId, stream);
         });
 
-        this.PeerConnexionArray.get(user.userId).on('track', (track: MediaStreamTrack, stream: MediaStream) => {
+        /*this.PeerConnexionArray.get(user.userId).on('track', (track: MediaStreamTrack, stream: MediaStream) => {
             this.stream(user.userId, stream);
-        });
+        });*/
 
         this.PeerConnexionArray.get(user.userId).on('close', () => {
             this.closeConnexion(user.userId);
@@ -157,6 +157,13 @@ export class SimplePeer implements SimplePeerInterface{
             console.info(`connect => ${user.userId}`);
         });
 
+        this.PeerConnexionArray.get(user.userId).on('data',  (chunk: Buffer) => {
+            let data = JSON.parse(chunk.toString('utf8'));
+            if(data.type === "stream"){
+                this.stream(user.userId, data.stream);
+            }
+        });
+
         this.addMedia(user.userId);
     }
 
@@ -205,6 +212,11 @@ export class SimplePeer implements SimplePeerInterface{
      * @param stream
      */
     private stream(userId : any, stream: MediaStream) {
+        if(!stream){
+            this.MediaManager.disabledVideoByUserId(userId);
+            this.MediaManager.disabledMicrophoneByUserId(userId);
+            return;
+        }
         this.MediaManager.addStreamRemoteVideo(userId, stream);
     }
 
@@ -216,6 +228,14 @@ export class SimplePeer implements SimplePeerInterface{
         try {
             let transceiver : any = null;
             if(!this.MediaManager.localStream){
+                //send fake signal
+                if(!this.PeerConnexionArray.has(userId)){
+                    return;
+                }
+                this.PeerConnexionArray.get(userId).write(new Buffer(JSON.stringify({
+                    type: "stream",
+                    stream: null
+                })));
                 return;
             }
             this.MediaManager.localStream.getTracks().forEach(