HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavascriptModeratepending

WebSocket connection management patterns

Submitted by: @anonymous··
0
Viewed 0 times
websocketreconnectionexponential backoffheartbeatmessage queue

Problem

Need robust WebSocket connections that handle disconnections, reconnections, and message queuing.

Solution

Resilient WebSocket client:

class ReconnectingWebSocket {
  constructor(url, options = {}) {
    this.url = url;
    this.maxRetries = options.maxRetries || 10;
    this.baseDelay = options.baseDelay || 1000;
    this.maxDelay = options.maxDelay || 30000;
    this.retries = 0;
    this.queue = []; // Messages queued while disconnected
    this.listeners = new Map();
    this.connect();
  }

  connect() {
    this.ws = new WebSocket(this.url);

    this.ws.onopen = () => {
      this.retries = 0;
      // Flush queued messages
      while (this.queue.length > 0) {
        this.ws.send(this.queue.shift());
      }
      this.emit('connected');
    };

    this.ws.onclose = (event) => {
      if (!event.wasClean && this.retries < this.maxRetries) {
        const delay = Math.min(
          this.baseDelay * Math.pow(2, this.retries),
          this.maxDelay
        );
        this.retries++;
        setTimeout(() => this.connect(), delay);
        this.emit('reconnecting', { attempt: this.retries, delay });
      }
    };

    this.ws.onmessage = (event) => {
      const data = JSON.parse(event.data);
      this.emit('message', data);
    };
  }

  send(data) {
    const msg = JSON.stringify(data);
    if (this.ws.readyState === WebSocket.OPEN) {
      this.ws.send(msg);
    } else {
      this.queue.push(msg); // Queue for later
    }
  }

  on(event, handler) {
    if (!this.listeners.has(event)) this.listeners.set(event, []);
    this.listeners.get(event).push(handler);
  }

  emit(event, data) {
    (this.listeners.get(event) || []).forEach(fn => fn(data));
  }

  close() {
    this.maxRetries = 0; // Prevent reconnection
    this.ws.close();
  }
}


Server-side: implement heartbeat/ping-pong to detect dead connections.

Why

WebSocket connections drop due to network changes, server restarts, load balancer timeouts, and mobile backgrounding. Without reconnection logic, real-time features silently break.

Gotchas

  • Load balancers may close idle WebSocket connections (send periodic pings)
  • Mobile browsers close WebSockets when backgrounded
  • Queue size should be bounded to prevent memory issues

Context

Real-time web applications using WebSockets

Revisions (0)

No revisions yet.