Redirecting not working

This commit is contained in:
MathieuSevignyLavallee 2024-11-11 15:16:59 -05:00
parent b744284472
commit d37e6c540a
10 changed files with 59 additions and 28 deletions

View file

@ -44,7 +44,7 @@ describe('WebSocketService', () => {
test('createRoom should emit create-room event', () => { test('createRoom should emit create-room event', () => {
WebsocketService.connect(ENV_VARIABLES.VITE_BACKEND_URL); WebsocketService.connect(ENV_VARIABLES.VITE_BACKEND_URL);
WebsocketService.createRoom(); WebsocketService.createRoom('test');
expect(mockSocket.emit).toHaveBeenCalledWith('create-room'); expect(mockSocket.emit).toHaveBeenCalledWith('create-room');
}); });

View file

@ -1,6 +1,6 @@
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { io,Socket } from 'socket.io-client'; import { Socket } from 'socket.io-client';
//import { ENV_VARIABLES } from '../../../constants'; //import { ENV_VARIABLES } from '../../../constants';
import StudentModeQuiz from '../../../components/StudentModeQuiz/StudentModeQuiz'; import StudentModeQuiz from '../../../components/StudentModeQuiz/StudentModeQuiz';
@ -34,15 +34,7 @@ const JoinRoom: React.FC = () => {
}, []); }, []);
const handleCreateSocket = () => { const handleCreateSocket = () => {
debugger; const socket = webSocketService.connect(`/api/room/${roomName}/socket`);
const socket = io('/', {
path: `/api/room/${roomName}/socket`,
transports: ['websocket'],
autoConnect: true,
reconnection: true,
reconnectionAttempts: 5,
reconnectionDelay: 1000,
});
socket.on('join-success', () => { socket.on('join-success', () => {
setIsWaitingForTeacher(true); setIsWaitingForTeacher(true);

View file

@ -79,14 +79,19 @@ const ManageRoom: React.FC = () => {
} }
}; };
const createWebSocketRoom = async() => { const createWebSocketRoom = async () => {
setConnectingError(''); setConnectingError('');
const room = await(await fetch('/api/room',{method:'post'})).json(); const room = await (await fetch('/api/room', { method: 'post' })).json();
const socket = webSocketService.connect(`/api/room/${room.id}/socket`); const socket = webSocketService.connect(`/api/room/${room.id}/socket`);
socket.on('connect', () => { socket.on('connect', () => {
webSocketService.createRoom(); webSocketService.createRoom(room.id);
}); });
socket.on("error", (error) => {
console.error("WebSocket server error:", error);
});
socket.on('connect_error', (error) => { socket.on('connect_error', (error) => {
setConnectingError('Erreur lors de la connexion... Veuillez réessayer'); setConnectingError('Erreur lors de la connexion... Veuillez réessayer');
console.error('WebSocket connection error:', error); console.error('WebSocket connection error:', error);
@ -143,7 +148,7 @@ const ManageRoom: React.FC = () => {
console.log('Quiz questions not found (cannot update answers without them).'); console.log('Quiz questions not found (cannot update answers without them).');
return; return;
} }
// Update the students state using the functional form of setStudents // Update the students state using the functional form of setStudents
setStudents((prevStudents) => { setStudents((prevStudents) => {
// print the list of current student names // print the list of current student names
@ -151,7 +156,7 @@ const ManageRoom: React.FC = () => {
prevStudents.forEach((student) => { prevStudents.forEach((student) => {
console.log(student.name); console.log(student.name);
}); });
let foundStudent = false; let foundStudent = false;
const updatedStudents = prevStudents.map((student) => { const updatedStudents = prevStudents.map((student) => {
console.log(`Comparing ${student.id} to ${idUser}`); console.log(`Comparing ${student.id} to ${idUser}`);
@ -171,7 +176,7 @@ const ManageRoom: React.FC = () => {
updatedAnswers = [...student.answers, newAnswer]; updatedAnswers = [...student.answers, newAnswer];
} }
return { ...student, answers: updatedAnswers }; return { ...student, answers: updatedAnswers };
} }
return student; return student;
}); });
if (!foundStudent) { if (!foundStudent) {

View file

@ -21,10 +21,14 @@ class WebSocketService {
private socket: Socket | null = null; private socket: Socket | null = null;
connect(backendUrl: string): Socket { connect(backendUrl: string): Socket {
// console.log(backendUrl); this.socket = io( '/',{
this.socket = io(`${backendUrl}`, { path: backendUrl,
transports: ['websocket'], transports: ['websocket'],
reconnectionAttempts: 1 autoConnect: true,
reconnection: true,
reconnectionAttempts: 10,
reconnectionDelay: 10000,
timeout: 20000,
}); });
return this.socket; return this.socket;
} }
@ -37,9 +41,14 @@ class WebSocketService {
} }
} }
createRoom() { createRoom(roomName: string) {
if (this.socket) { if (this.socket) {
this.socket.emit('create-room'); if(roomName){
this.socket.emit('create-room', {roomName});
}
else{
this.socket.emit('create-room');
}
} }
} }

View file

@ -1,15 +1,19 @@
import http from "http"; import http from "http";
import { Server, ServerOptions } from "socket.io"; import { Server, ServerOptions } from "socket.io";
// Import setupWebsocket
import { setupWebsocket } from "./socket/setupWebSocket"; import { setupWebsocket } from "./socket/setupWebSocket";
import dotenv from "dotenv";
const port = 4500; // Load environment variables
dotenv.config();
const port = 4500;
const roomId = process.env.ROOM_ID; // Load roomId from environment variable
console.log(`I am: /api/room/${roomId}/socket`);
// Create HTTP and WebSocket server // Create HTTP and WebSocket server
const server = http.createServer(); const server = http.createServer();
const ioOptions: Partial<ServerOptions> = { const ioOptions: Partial<ServerOptions> = {
path: '/api/room/975239/socket', // TODO : use env variable to set room id path: `/api/room/${roomId}/socket`, // Use roomId from env variable
cors: { cors: {
origin: "*", origin: "*",
methods: ["GET", "POST"], methods: ["GET", "POST"],

View file

@ -10,6 +10,7 @@
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@valkey/valkey-glide": "^1.1.0", "@valkey/valkey-glide": "^1.1.0",
"dotenv": "^16.4.5",
"http": "^0.0.1-security", "http": "^0.0.1-security",
"socket.io": "^4.8.1" "socket.io": "^4.8.1"
}, },
@ -509,6 +510,17 @@
"node": ">=0.3.1" "node": ">=0.3.1"
} }
}, },
"node_modules/dotenv": {
"version": "16.4.5",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
"integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://dotenvx.com"
}
},
"node_modules/engine.io": { "node_modules/engine.io": {
"version": "6.6.2", "version": "6.6.2",
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz",

View file

@ -18,6 +18,7 @@
}, },
"dependencies": { "dependencies": {
"@valkey/valkey-glide": "^1.1.0", "@valkey/valkey-glide": "^1.1.0",
"dotenv": "^16.4.5",
"http": "^0.0.1-security", "http": "^0.0.1-security",
"socket.io": "^4.8.1" "socket.io": "^4.8.1"
} }

View file

@ -88,8 +88,14 @@ export const setupWebsocket = (io: Server): void => {
idQuestion, idQuestion,
}); });
}); });
socket.on("error", (error) => {
console.error("WebSocket server error:", error);
});
}); });
const generateRoomName = (length = 6): string => { const generateRoomName = (length = 6): string => {
const characters = "0123456789"; const characters = "0123456789";
let result = ""; let result = "";

View file

@ -22,6 +22,7 @@
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
"mongodb": "^6.3.0", "mongodb": "^6.3.0",
"multer": "^1.4.5-lts.1", "multer": "^1.4.5-lts.1",
"net": "^1.0.2",
"nodemailer": "^6.9.9", "nodemailer": "^6.9.9",
"socket.io": "^4.7.2", "socket.io": "^4.7.2",
"socket.io-client": "^4.7.2" "socket.io-client": "^4.7.2"

View file

@ -26,7 +26,7 @@ class DockerRoomProvider extends BaseRoomProvider {
] ]
} }
}, },
Env: options.env || [] Env: [...options.env || [], `ROOM_ID=${roomId}`]
}; };
const container = await this.docker.createContainer(containerConfig); const container = await this.docker.createContainer(containerConfig);
@ -34,11 +34,12 @@ class DockerRoomProvider extends BaseRoomProvider {
const containerInfo = await container.inspect(); const containerInfo = await container.inspect();
const containerIP = containerInfo.NetworkSettings.IPAddress; const containerIP = containerInfo.NetworkSettings.IPAddress;
const host = `${containerIP}:4500`;
const host = `${containerIP}:4500`;
return await this.roomRepository.create(new Room(roomId, container_name, host, 0)); return await this.roomRepository.create(new Room(roomId, container_name, host, 0));
} }
async deleteRoom(roomId) { async deleteRoom(roomId) {
const container_name = `room_${roomId}`; const container_name = `room_${roomId}`;