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.
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).
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.