From ab32021fc0d7754605ab9bac4b6788e5277388aa Mon Sep 17 00:00:00 2001 From: Gregoire Parant Date: Sat, 23 May 2020 14:00:36 +0200 Subject: [PATCH] Fix mediam stream manage and server back down --- back/src/Controller/AuthenticateController.ts | 10 ++++---- back/src/Controller/IoSocketController.ts | 23 +++++++++++++++--- front/src/Connexion.ts | 13 ++++------ front/src/Phaser/Game/GameScene.ts | 11 ++++++++- front/src/WebRtc/SimplePeer.ts | 24 +++++++++++++++++-- 5 files changed, 61 insertions(+), 20 deletions(-) diff --git a/back/src/Controller/AuthenticateController.ts b/back/src/Controller/AuthenticateController.ts index db5fb1ce..4e617509 100644 --- a/back/src/Controller/AuthenticateController.ts +++ b/back/src/Controller/AuthenticateController.ts @@ -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, }); - });*/ + }); } } diff --git a/back/src/Controller/IoSocketController.ts b/back/src/Controller/IoSocketController.ts index 8332d782..a93f7738 100644 --- a/back/src/Controller/IoSocketController.ts +++ b/back/src/Controller/IoSocketController.ts @@ -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 = 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 diff --git a/front/src/Connexion.ts b/front/src/Connexion.ts index 1b963129..e5a73aaf 100644 --- a/front/src/Connexion.ts +++ b/front/src/Connexion.ts @@ -165,25 +165,20 @@ export class Connexion implements ConnexionInterface { createConnexion(name: string, characterSelected: string): Promise { 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; - });*/ + }); } /** diff --git a/front/src/Phaser/Game/GameScene.ts b/front/src/Phaser/Game/GameScene.ts index 4a003b33..c79fb740 100644 --- a/front/src/Phaser/Game/GameScene.ts +++ b/front/src/Phaser/Game/GameScene.ts @@ -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, diff --git a/front/src/WebRtc/SimplePeer.ts b/front/src/WebRtc/SimplePeer.ts index 595e83b2..b301876e 100644 --- a/front/src/WebRtc/SimplePeer.ts +++ b/front/src/WebRtc/SimplePeer.ts @@ -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(