Open
Description
Describe the bug
I came across a bug where if you broadcast an event to a room, it times out unless you explicitly set a timeout variable.
To Reproduce
Please fill the following code example:
Socket.IO server version: ^4.0.0
Server
import { createServer } from "node:http";
import { readFile } from "node:fs/promises";
import { Server } from "socket.io";
const port = process.env.PORT || 3000;
const httpServer = createServer(async (req, res) => {
if (req.url !== "/") {
res.writeHead(404);
res.end("Not found");
return;
}
// reload the file every time
const content = await readFile("index.html");
res.writeHead(200, {
"Content-Type": "text/html",
"Content-Length": Buffer.byteLength(content),
});
res.end(content);
});
const io = new Server(httpServer, {});
const roomCode = "Test room code"
io.on("connection", (socket) => {
console.log(`connect ${socket.id}`);
socket.on("joinRoom", async (username, ack) => {
console.log(`${username} joining`);
socket.join(roomCode);
// This doesn't work
const response = await socket.to(roomCode).emitWithAck("userJoined", username);
// This does
// const response = await socket.to(roomCode).timeout(5000).emitWithAck("userJoined", username);
ack(response);
})
});
httpServer.listen(port, () => {
console.log(`server listening at http://localhost:${port}`);
});
Socket.IO client version: ^4.0.0
Client
import { io } from "socket.io-client";
const port = process.env.PORT || 3000;
const socket = io(`http://localhost:${port}`);
const socket2 = io(`http://localhost:${port}`);
socket.on("userJoined", (username, ack) => {
ack("username1")
})
const response1 = await socket.emitWithAck("joinRoom", "username1");
console.log(`Response 1 is ${response1}`);
const response2 = await socket2.emitWithAck("joinRoom", "username2")
console.log(`Response 2 is ${response2}`);
Expected behavior
It should work with or without the explicit timeout set.
Platform:
- OS: Ubuntu 22.04.5 LTS