Description
Is there an existing issue for this?
- I've searched for any related issues and avoided creating a duplicate issue.
Description
When the "How to detect and close broken connections?" code from the FAQ is used, the client disconnects after ~1:20 (1 Minute, 20 seconds).
Minimal reproducible example:
index.js
const WebSocket = require("ws");
const http = require("http");
const express = require("express");
const app = express();
let wss = new WebSocket.Server({
noServer: true
});
wss.on("connection", (ws) => {
console.log("Client open");
let interval = setInterval(() => {
ws.send(`${Date.now()}`);
}, 3000);
ws.once("close", () => {
console.log("Client close")
clearInterval(interval);
});
});
// PROBLEM START HERE
let interval = setInterval(() => {
wss.clients.forEach((ws) => {
if (!ws.isAlive) {
ws.terminate();
return;
}
ws.isAlive = false;
ws.ping();
});
}, 5000);
wss.on("close", () => {
clearInterval(interval);
});
// PROBLEM ENDS HERE
app.get("/", (req, res) => {
if ((!req.headers["upgrade"] || !req.headers["connection"])) {
// no websocket handshake
res.status(421).end();
} else {
wss.handleUpgrade(req, req.socket, req.headers, (ws) => {
ws.isAlive = true;
ws.on("pong", () => {
ws.isAlive = true;
});
wss.emit("connection", ws, req);
});
}
});
const server = http.createServer(app);
server.listen(8123, "0.0.0.0", (err) => {
console.log(err || "Server listening on http://0.0.0.0:8123");
});
['SIGINT', 'SIGQUIT', 'SIGTERM'].forEach((signal) => {
process.on(signal, () => {
wss.clients.forEach((ws) => {
ws.terminate();
});
server.close(() => {
console.log("HTTP Server closed");
process.exit(0);
});
});
});
package.json
{
"name": "test-ws-timeout",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"docker": "docker run --rm -it --network=host -v ./:/app node:20.11.0-bullseye node /app/index.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.18.2",
"ws": "8.10"
}
}
When the following code is commented, nothing happens and it works like expected:
let interval = setInterval(() => {
wss.clients.forEach((ws) => {
if (!ws.isAlive) {
ws.terminate();
return;
}
ws.isAlive = false;
ws.ping();
});
}, 5000);
wss.on("close", () => {
clearInterval(interval);
});
I only noticed because i installed a new OS and node.js version. On node v16.20.2 nothing happens, and the broken connection detection works.
ws version
8.10
Node.js Version
20.11.0
System
System:
OS: Linux 5.4 Ubuntu 18.04.6 LTS (Bionic Beaver)
CPU: (8) x64 Intel(R) Core(TM) i5-8365U CPU @ 1.60GHz
Memory: 7.18 GB / 15.45 GB
Container: Yes
Shell: 4.4.20 - /bin/bash
Expected result
The client should work and do not exit with the error.
Since node 20.11.0 does not work on my OS, i used docker to test it.
But it also happens on Ubuntu Unity 23.10 with node 20.11.0.
Test with the client that this package provides and wscat --connect=127.0.0.1:8123
(v5.1.0)
Actual result
No response