import {Application, Request, Response} from "express";
import Jwt, {JsonWebTokenError} from "jsonwebtoken";
import {BAD_REQUEST, OK} from "http-status-codes";
-import {SECRET_KEY} from "../Enum/EnvironmentVariable";
+import {SECRET_KEY, ROOM} from "../Enum/EnvironmentVariable";
export class AuthenticateController{
App : Application;
});
}
//TODO check user email for The Coding Machine game
- let token = Jwt.sign({email: param.email}, SECRET_KEY, {expiresIn: '24h'});
+ let token = Jwt.sign({email: param.email, roomId: ROOM}, SECRET_KEY, {expiresIn: '24h'});
return res.status(OK).send({token: token});
});
}
});
this.ioConnection();
+ this.shareUsersPosition();
}
ioConnection() {
x: user x position on map
y: user y position on map
*/
-
socket.on('join-room', (message : string) => {
let messageUserPosition = this.hydrateMessageReceive(message);
if(messageUserPosition instanceof Error){
//join user in room
socket.join(messageUserPosition.roomId);
// sending to all clients in room except sender
- this.saveUserPosition((socket as ExSocketInterface), messageUserPosition);
+ this.saveUserInformation((socket as ExSocketInterface), messageUserPosition);
socket.to(messageUserPosition.roomId).emit('join-room', messageUserPosition.toString());
});
return socket.emit("message-error", JSON.stringify({message: messageUserPosition.message}));
}
// sending to all clients in room except sender
- this.saveUserPosition((socket as ExSocketInterface), messageUserPosition);
+ this.saveUserInformation((socket as ExSocketInterface), messageUserPosition);
socket.to(messageUserPosition.roomId).emit('join-room', messageUserPosition.toString());
});
});
}
//permit to save user position in socket
- saveUserPosition(socket : ExSocketInterface, message : MessageUserPosition){
+ saveUserInformation(socket : ExSocketInterface, message : MessageUserPosition){
socket.position = message.position;
+ socket.roomId = message.roomId;
+ socket.userId = message.userId;
}
//Hydrate and manage error
return new Error(err);
}
}
+
+ /** permit to share user position
+ ** users position will send in event 'user-position'
+ ** The data sent is an array with information for each user :
+ [
+ {
+ userId: <string>,
+ roomId: <string>,
+ position: {
+ x : <number>,
+ y : <number>
+ }
+ },
+ ...
+ ]
+ **/
+ seTimeOutInProgress : any = null;
+ shareUsersPosition(){
+ if(!this.seTimeOutInProgress) {
+ clearTimeout(this.seTimeOutInProgress);
+ }
+ let clients = this.Io.clients();
+ let socketsKey = Object.keys(this.Io.clients().sockets);
+
+ //create mapping with all users in all rooms
+ let mapPositionUserByRoom = new Map();
+ for(let i = 0; i < socketsKey.length; i++){
+ let socket = clients.sockets[socketsKey[i]];
+ if(!(socket as ExSocketInterface).position){
+ continue;
+ }
+ let data = {
+ userId : (socket as ExSocketInterface).userId,
+ roomId : (socket as ExSocketInterface).roomId,
+ position : (socket as ExSocketInterface).position,
+ };
+ let dataArray = <any>[];
+ if(mapPositionUserByRoom.get(data.roomId)){
+ dataArray = mapPositionUserByRoom.get(data.roomId);
+ dataArray.push(data);
+ }else{
+ dataArray = [data];
+ }
+ mapPositionUserByRoom.set(data.roomId, dataArray);
+ }
+
+ //send for each room, all data of position user
+ let arrayMap = Array.from(mapPositionUserByRoom);
+ arrayMap.forEach((value) => {
+ let roomId = value[0];
+ let data = value[1];
+ this.Io.in(roomId).emit('user-position', JSON.stringify(data));
+ });
+ this.seTimeOutInProgress = setTimeout(() => {
+ this.shareUsersPosition();
+ }, 10);
+ }
}
\ No newline at end of file