SignalR (ASP.NET) popularized the 'try WebSocket, fall back to long-polling' pattern. The pattern's value comes from gracefully handling corporate proxies, restrictive networks, and older clients while preferring WebSocket where available.

Advertisement

Transport negotiation

Client connects with 'I prefer WebSocket'. Server attempts upgrade. If blocked (proxy strips Upgrade header), falls back to Server-Sent Events. If SSE blocked, long-polling. App code unaware.

Reconnect with replay

Client tracks sequence number of last received message. On reconnect, sends 'I'm at N; resume from there'. Server replays missed messages from its buffer (or reports gap if buffer evicted).

Advertisement

Hub abstraction

Calls look RPC-like: chat.invoke('SendMessage', msg). Transport details hidden. Equivalent libraries: Socket.IO for Node, Phoenix Channels for Elixir, ASP.NET SignalR for .NET.

Transport negotiation + reconnect-with-replay + RPC-like API. Re-implementing this is rarely worth it.