Showing the list of all active rooms socket.io

Viewed 122

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}/>
0 Answers
Related