Merge world and webrtc conexion
authorgparant <g.parant@thecodingmachine.com>
Tue, 28 Apr 2020 23:40:32 +0000 (01:40 +0200)
committergparant <g.parant@thecodingmachine.com>
Tue, 28 Apr 2020 23:40:32 +0000 (01:40 +0200)
back/src/App.ts
back/src/Controller/IoSocketController.ts
back/src/Model/Websocket/ExSocketInterface.ts
back/src/Model/World.ts
front/src/Connexion.ts
front/src/Phaser/Game/GameScene.ts
front/src/WebRtc/SimplePeer.ts

index 4b3b3c53625a219d6661a53e866c3d71d660002e..82ca317af454932dafdb027916899d7217fe8655 100644 (file)
@@ -28,7 +28,7 @@ class App {
     private config(): void {
         this.app.use(bodyParser.json());
         this.app.use(bodyParser.urlencoded({extended: false}));
-        this.app.use(function (req: Request, res: Response, next) {
+        this.app.use((req: Request, res: Response, next) => {
             res.header("Access-Control-Allow-Origin", "*"); // update to match the domain you will make the request from
             res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
             next();
index 77f3ac9e849f0445fde5561e32653d3121eccdbf..23a238e6385910f6d7edd5421305a55496a1d2a4 100644 (file)
@@ -8,6 +8,17 @@ import {SECRET_KEY} from "../Enum/EnvironmentVariable"; //TODO fix import by "_E
 import {ExtRooms, RefreshUserPositionFunction} from "../Model/Websocket/ExtRoom";
 import {ExtRoomsInterface} from "../Model/Websocket/ExtRoomsInterface";
 import {World} from "../Model/World";
+import { uuid } from 'uuidv4';
+
+enum SockerIoEvent {
+    CONNECTION = "connection",
+    DISCONNECTION = "disconnect",
+    JOIN_ROOM = "join-room",
+    USER_POSITION = "user-position",
+    WEBRTC_SIGNAL = "webrtc-signal",
+    WEBRTC_START = "webrtc-start",
+    MESSAGE_ERROR = "message-error",
+}
 
 export class IoSocketController{
     Io: socketIO.Server;
@@ -31,11 +42,17 @@ export class IoSocketController{
 
         this.ioConnection();
         this.shareUsersPosition();
-        this.World = new World(this.connectedUser, this.disConnectedUser);
+
+        //don't send only function because the context will be not this
+        this.World = new World((user1 : string, user2 : string) => {
+            this.connectedUser(user1, user2);
+        }, (user1 : string, user2 : string) => {
+            this.disConnectedUser(user1, user2);
+        });
     }
 
     ioConnection() {
-        this.Io.on('connection',  (socket: Socket) => {
+        this.Io.on(SockerIoEvent.CONNECTION,  (socket: Socket) => {
             /*join-rom event permit to join one room.
                 message :
                     userId : user identification
@@ -44,10 +61,10 @@ export class IoSocketController{
                         x: user x position on map
                         y: user y position on map
             */
-            socket.on('join-room', (message : string) => {
+            socket.on(SockerIoEvent.JOIN_ROOM, (message : string) => {
                 let messageUserPosition = this.hydrateMessageReceive(message);
                 if(messageUserPosition instanceof Error){
-                    return socket.emit("message-error", JSON.stringify({message: messageUserPosition.message}))
+                    return socket.emit(SockerIoEvent.MESSAGE_ERROR, JSON.stringify({message: messageUserPosition.message}))
                 }
 
                 //join user in room
@@ -64,13 +81,13 @@ export class IoSocketController{
                 rooms.refreshUserPosition = RefreshUserPositionFunction;
                 rooms.refreshUserPosition(rooms, this.Io);
 
-                socket.to(messageUserPosition.roomId).emit('join-room', messageUserPosition.toString());
+                socket.to(messageUserPosition.roomId).emit(SockerIoEvent.JOIN_ROOM, messageUserPosition.toString());
             });
 
-            socket.on('user-position', (message : string) => {
+            socket.on(SockerIoEvent.USER_POSITION, (message : string) => {
                 let messageUserPosition = this.hydrateMessageReceive(message);
                 if (messageUserPosition instanceof Error) {
-                    return socket.emit("message-error", JSON.stringify({message: messageUserPosition.message}));
+                    return socket.emit(SockerIoEvent.MESSAGE_ERROR, JSON.stringify({message: messageUserPosition.message}));
                 }
 
                 // update position in the worl
@@ -87,37 +104,7 @@ export class IoSocketController{
                 rooms.refreshUserPosition(rooms, this.Io);
             });
 
-            socket.on('webrtc-room', (message : string) => {
-                let data = JSON.parse(message);
-                socket.join(data.roomId);
-                (socket as ExSocketInterface).roomId = data.roomId;
-
-                //if two persone in room share
-                if(this.Io.sockets.adapter.rooms[data.roomId].length < 2) {
-                    return;
-                }
-                let clients : Array<any> = Object.values(this.Io.sockets.sockets);
-
-                //send start at one client to initialise offer webrtc
-                //send all users in room to create PeerConnection in front
-                clients.forEach((client: ExSocketInterface, index : number) => {
-
-                    let clientsId = clients.reduce((tabs : Array<any>, clientId: ExSocketInterface, indexClientId: number) => {
-                        if(!clientId.userId || clientId.userId === client.userId){
-                            return tabs;
-                        }
-                        tabs.push({
-                            userId: clientId.userId,
-                            initiator : index <= indexClientId
-                        });
-                        return tabs;
-                    }, []);
-
-                    client.emit('webrtc-start', JSON.stringify(clientsId));
-                });
-            });
-
-            socket.on('webrtc-signal', (message : string) => {
+            socket.on(SockerIoEvent.WEBRTC_SIGNAL, (message : string) => {
                 let data : any = JSON.parse(message);
 
                 //send only at user
@@ -127,10 +114,63 @@ export class IoSocketController{
                     if(client.userId !== data.receiverId){
                         continue
                     }
-                    client.emit('webrtc-signal',  message);
+                    client.emit(SockerIoEvent.WEBRTC_SIGNAL,  message);
                     break;
                 }
             });
+
+            socket.on(SockerIoEvent.DISCONNECTION, (reason : string) => {
+                let Client = (socket as ExSocketInterface);
+                //leave group of user
+                this.World.leave(Client);
+
+                //leave room
+                socket.leave(Client.roomId);
+                socket.leave(Client.webRtcRoomId);
+
+                //delete all socket information
+                delete Client.userId;
+                delete Client.webRtcRoomId;
+                delete Client.roomId;
+                delete Client.token;
+                delete Client.position;
+            });
+        });
+    }
+
+    /**
+     *
+     * @param socket
+     * @param roomId
+     */
+    joinWebRtcRoom(socket : ExSocketInterface, roomId : string) {
+        if(socket.webRtcRoomId === roomId){
+            return;
+        }
+        socket.join(roomId);
+        socket.webRtcRoomId = roomId;
+        //if two persone in room share
+        if (this.Io.sockets.adapter.rooms[roomId].length < 2) {
+            return;
+        }
+        let clients: Array<any> = Object.values(this.Io.sockets.sockets);
+
+        //send start at one client to initialise offer webrtc
+        //send all users in room to create PeerConnection in front
+        clients.forEach((client: ExSocketInterface, index: number) => {
+
+            let clientsId = clients.reduce((tabs: Array<any>, clientId: ExSocketInterface, indexClientId: number) => {
+                if (!clientId.userId || clientId.userId === client.userId) {
+                    return tabs;
+                }
+                tabs.push({
+                    userId: clientId.userId,
+                    initiator: index <= indexClientId
+                });
+                return tabs;
+            }, []);
+
+            client.emit(SockerIoEvent.WEBRTC_START, JSON.stringify({clients: clientsId, roomId: roomId}));
         });
     }
 
@@ -191,8 +231,18 @@ export class IoSocketController{
 
     //connected user
     connectedUser(user1 : string, user2 : string){
-        console.log("connectedUser => user1", user1);
-        console.log("connectedUser => user2", user2);
+        /* TODO manager room and group user to enter and leave */
+        let roomId = uuid();
+        let clients : Array<any> = Object.values(this.Io.sockets.sockets);
+        let User1 = clients.find((user : ExSocketInterface) => user.userId === user1);
+        let User2 = clients.find((user : ExSocketInterface) => user.userId === user2);
+
+        if(User1) {
+            this.joinWebRtcRoom(User1, roomId);
+        }
+        if(User2) {
+            this.joinWebRtcRoom(User2, roomId);
+        }
     }
 
     //connected user
index 095d3cbc0ebda4d7f53c39dc1d53e11bc360f830..4d1d9fee5a16c2448825e356d6130019f1c0f853 100644 (file)
@@ -4,6 +4,7 @@ import {PointInterface} from "./PointInterface";
 export interface ExSocketInterface extends Socket {
     token: any;
     roomId: string;
+    webRtcRoomId: string;
     userId: string;
     position: PointInterface;
 }
\ No newline at end of file
index 804a176b40843e6dd9fed5bed5ca23cfbb9a6045..ff1f58ff60b6a553d3107f7d6ed10d5c845a1ae4 100644 (file)
@@ -3,6 +3,7 @@ import {PointInterface} from "./Websocket/PointInterface";
 import {Group} from "./Group";
 import {Distance} from "./Distance";
 import {UserInterface} from "./UserInterface";
+import {ExSocketInterface} from "_Model/Websocket/ExSocketInterface";
 
 export class World {
     static readonly MIN_DISTANCE = 160;
@@ -29,8 +30,12 @@ export class World {
         });
     }
 
+    public leave(user : ExSocketInterface){
+        /*TODO leaver user in group*/
+        this.users.delete(user.userId);
+    }
+
     public updatePosition(userPosition: MessageUserPosition): void {
-        let context = this;
         let user = this.users.get(userPosition.userId);
         if(typeof user === 'undefined') {
             return;
index a9c10df5cf8fd1067a1f2a1465253cc083dbbc0b..77c9619f48f3102fecd1ff08cf4a2c4185e64d34 100644 (file)
@@ -7,7 +7,6 @@ import {API_URL} from "./Enum/EnvironmentVariable";
 enum EventMessage{
     WEBRTC_SIGNAL = "webrtc-signal",
     WEBRTC_START = "webrtc-start",
-    WEBRTC_ROOM = "webrtc-room",
     JOIN_ROOM = "join-room",
     USER_POSITION = "user-position",
     MESSAGE_ERROR = "message-error"
@@ -127,8 +126,6 @@ export interface ConnexionInterface {
     positionOfAllUser(): void;
 
     /*webrtc*/
-    sendWebrtcRomm(roomId: string): void;
-
     sendWebrtcSignal(signal: any, roomId: string, userId?: string, receiverId?: string): void;
 
     receiveWebrtcSignal(callBack: Function): void;
@@ -239,10 +236,6 @@ export class Connexion implements ConnexionInterface {
         }));
     }
 
-    sendWebrtcRomm(roomId: string) {
-        this.socket.emit(EventMessage.WEBRTC_ROOM, JSON.stringify({roomId: roomId}));
-    }
-
     receiveWebrtcStart(callback: Function) {
         this.socket.on(EventMessage.WEBRTC_START, callback);
     }
index e996d1403ed1305303e33c8cb833115de87f851e..b08db7912d87669a78f047117f80230c4fb43c65 100644 (file)
@@ -258,7 +258,6 @@ export class GameScene extends Phaser.Scene implements GameSceneInterface{
         //init colision
         this.physics.add.collider(this.CurrentPlayer, player, (CurrentPlayer: CurrentGamerInterface, MapPlayer: GamerInterface) => {
             CurrentPlayer.say("Hello, how are you ? ");
-            this.GameManager.SimplePeer.activePhone();
         });
     }
 }
index a53fd75434cd2b09c89d478e940060b1ca9fb45d..b04511d7fa3465f8b934f95b49dddcba8dd4f92d 100644 (file)
@@ -3,14 +3,13 @@ import {MediaManager} from "./MediaManager";
 let Peer = require('simple-peer');
 
 export interface SimplePeerInterface {
-    activePhone(): void;
-    disablePhone(): void;
 }
 
 export class SimplePeer {
     Connexion: ConnexionInterface;
     MediaManager: MediaManager;
     RoomId: string;
+    Users: Array<any>;
 
     PeerConnexionArray: Array<any> = new Array<any>();
 
@@ -18,12 +17,25 @@ export class SimplePeer {
         this.Connexion = Connexion;
         this.RoomId = roomId;
         this.MediaManager = new MediaManager();
+        this.initialise();
+    }
+
+    /**
+     * permit to listen when user could start visio
+     */
+    private initialise(){
+
+        //receive message start
+        this.Connexion.receiveWebrtcStart((message: string) => {
+            this.receiveWebrtcStart(message);
+        });
+
+        //when button to call is clicked, start video
         this.MediaManager.getElementActivePhone().addEventListener("click", () => {
             this.startWebRtc();
             this.disablePhone();
         });
     }
-
     /**
      * server has two person connected, start the meet
      */
@@ -31,13 +43,9 @@ export class SimplePeer {
         this.MediaManager.activeVisio();
         return this.MediaManager.getCamera().then((stream: MediaStream) => {
             this.MediaManager.localStream = stream;
-            //send message to join a room
-            this.Connexion.sendWebrtcRomm(this.RoomId);
 
-            //receive message start
-            this.Connexion.receiveWebrtcStart((message: string) => {
-                this.receiveWebrtcStart(message);
-            });
+            //create pear connexion
+            this.createPeerConnexion();
 
             //receive signal by gemer
             this.Connexion.receiveWebrtcSignal((message: string) => {
@@ -54,17 +62,16 @@ export class SimplePeer {
      */
     receiveWebrtcStart(message: string) {
         let data = JSON.parse(message);
+        this.RoomId = data.roomId;
+        this.Users = data.clients;
 
-        //create pear connexion of user stared
-        this.createPeerConnexion(data);
+        //active button for player
+        this.activePhone();
     }
 
-    /**
-     *
-     * @param users
-     */
-    createPeerConnexion(users : Array<any>) {
-        users.forEach((user: any) => {
+
+    createPeerConnexion() {
+        this.Users.forEach((user: any) => {
             if(this.PeerConnexionArray[user.userId]){
                 return;
             }