WebSocket Client With Exponential Reconnect
Keep a WebSocket client alive through disconnects with exponential backoff reconnect, jitter, heartbeat pings, and a bounded retry budget.
Code
import WebSocket from 'ws';
function createResilientSocket(url, { maxRetries = 8, baseMs = 500 } = {}) {
let attempts = 0;
let closed = false;
let socket;
const connect = () => {
socket = new WebSocket(url);
socket.on('open', () => {
attempts = 0;
socket.ping();
socket.on('pong', () => console.log('heartbeat ok'));
});
socket.on('message', (data) => console.log('recv:', data.toString()));
socket.on('close', (code) => {
if (closed || attempts >= maxRetries) return;
const jitter = Math.random() * baseMs;
const delay = Math.min(2 ** attempts * baseMs + jitter, 30_000);
attempts += 1;
console.log('closed', code, 'retrying in', Math.round(delay), 'ms');
setTimeout(connect, delay);
});
};
connect();
return { close: () => { closed = true; socket.terminate(); } };
}
const client = createResilientSocket('wss://stream.example.com/feed');
setTimeout(() => client.close(), 60_000);Report a problem with this exampleOpens a pre-filled issue on GitHub.