I'm a begginer with socket.io and I wanted to know if I am doing the right thing to display the list of all active rooms created. The server side of socket.io keep crashing everytime I am trying to call my room list component so I really start to think that I am making a mistake somewhere. Is there a better/easier way to do this or am I doing the right thing ?
UPDATE: My server has stopped crashing but my useEffect doesn't receive my return from getActiveRooms(). Also I'm still wondering if I really have to create a room to emit the room list?
Server Side
const express = require('express');
const app = express();
const http = require('http');
const cors = require('cors');
const { Server } = require("socket.io");
app.use(cors());
const PORT = 3001;
const server = http.createServer(app);
const io = new Server(server, {
cors: {
origin: 'http://localhost:3000',
methods: ["GET", "POST"],
}
});
function getActiveRooms(io) {
// Convert map into 2D list:
// ==> [['4ziBKG9XFS06NdtVAAAH', Set(1)], ['room1', Set(2)], ...]
const arr = Array.from(io.sockets.adapter.rooms);
// Filter rooms whose name exist in set:
// ==> [['room1', Set(2)], ['room2', Set(2)]]
const filtered = arr.filter(room => !room[1].has(room[0]))
// Return only the room name:
// ==> ['room1', 'room2']
const res = filtered.map(i => i[0]);
console.log(`Liste des rooms actives : ${res}`)
return res;
}
io.on("connection", (socket) => {
socket.on("room_list", (data) => {
socket.join(data); //data is a room called listroom that will receive all rooms (string)
socket.to(data).emit("receive_room", getActiveRooms(io));
});
});
server.listen(PORT, () => {
console.log(`Serveur lancé sur le port ${PORT}`);
});
Client Side (it's a component called ListeRoom)
function ListeRooms({socket, username}) {
const classes = useStyles();
const [roomList, setRoomList] = useState([]);
useEffect(() => {
socket.on("receive_room", (data) => {
setRoomList((liste) => [...liste, data]);
})
}, [socket]);
Parameter that my component receive in my main page
<ListeRooms socket={socket} username={username}/>