Handling Connection Events

1. Setting Event Handlers

PropertyEventPayload
onopenopenEvent
onmessagemessageMessageEvent (.data)
onerrorerrorEvent
onclosecloseCloseEvent (.code, .reason, .wasClean)

Example: Assign handlers

ws.onopen = () => console.log("open");
ws.onmessage = (e) => console.log("msg", e.data);
ws.onerror = (e) => console.error("err", e);
ws.onclose = (e) => console.log("close", e.code, e.reason);

2. Using addEventListener

Example: Multiple listeners

ws.addEventListener("message", logger);
ws.addEventListener("message", router);
ws.addEventListener("close", cleanup, { once: true });
OptionEffect
{ once: true }Auto-remove after first call
{ signal }Remove via AbortController
{ capture }N/A for WebSocket (no bubbling)

3. Handling Connection Open

Example: Initial sync on open

ws.addEventListener("open", () => {
  ws.send(JSON.stringify({ type: "auth", token }));
  ws.send(JSON.stringify({ type: "subscribe", channels: ["prices"] }));
});
ActionRecommendation
AuthSend first as message (if not via URL/cookie)
ResubscribeReplay subscriptions after reconnect
Flush queueDrain pending outbound messages

4. Handling Message Events

PropertyDescription
dataString, Blob, or ArrayBuffer
originServer origin
lastEventIdEmpty for WS

5. Handling Connection Close

PropertyDescription
codeNumeric close code (1000-4999)
reasonUTF-8 string (≤123 bytes)
wasCleantrue if proper close handshake

6. Handling Connection Errors

Warning: The browser error event is intentionally information-poor (security). Use close.code/reason for diagnostics.
SymptomLikely Cause
Immediate error + close 1006DNS/TLS/handshake fail
Error after openNetwork drop / proxy timeout
Error on sendSocket already closing

7. Handling Page Unload

Example: Clean shutdown

window.addEventListener("beforeunload", () => {
  if (ws.readyState === WebSocket.OPEN) ws.close(1000, "page-unload");
});
EventUse
beforeunloadClose socket
pagehideBFCache-safe alternative
visibilitychangePause heartbeat / reconnect

8. Understanding Event Order

new WebSocket() → CONNECTING
        ↓
     [handshake]
        ↓ success         ↓ failure
       open              error → close (1006)
        ↓
   message* (zero or more)
        ↓
   close(code, reason, wasClean)
      
RuleDetail
close always lastAlways fires exactly once
error before closeError implies close will follow
no message after closeLate frames discarded

9. Removing Event Listeners

Example: AbortController

const ctrl = new AbortController();
ws.addEventListener("message", onMsg, { signal: ctrl.signal });
// later
ctrl.abort();
MethodUse
removeEventListenerNamed function reference required
AbortController.signalBatch-remove multiple listeners

10. Debugging with DevTools

ToolWhere
Network → WS tabInspect frames in/out
Messages filterFilter by content
Consolews.readyState, ws.bufferedAmount
chrome://net-exportFull network log