WebSocket Client With Exponential Reconnect

Keep a WebSocket client alive through disconnects with exponential backoff reconnect, jitter, heartbeat pings, and a bounded retry budget.

JavascriptResilience

Code

snippet
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);