네 개 이벤트, 그게 전부
브라우저 WebSocket 노출하는 이벤트 정확히 네 개: open, message, error, close. on* property (handler 1개) 또는 addEventListener (multi handler, 추천) 둘 다 ok. connecting 이벤트 없고 reconnect 이벤트 없고 pong 이벤트 없고 — 다 직접 만들 거야.
발화 순서
정상 세션: open → message* → close. handshake 실패: error → close. runtime drop: ...message → error → close. 결정적으로 error 가 close 보다 항상 먼저 떨어지는데, error 는 의도적으로 별로 안 노출해 — 보안상 브라우저가 connection 실패 이유 안 leak 해. close code 와 reason 알려면 close 이벤트 봐.
받는 것
message 의 event.data 는 string (text frame), Blob (binary 의 default), ArrayBuffer (ws.binaryType = 'arraybuffer' 설정 시) 중 하나. close 이벤트의 event.code, event.reason, event.wasClean 가 어떻게 끝났는지 알려줘.