type + data envelope
WebSocket 이 opaque message stream 줘. 구조 추가는 네 일. 업계 dominant 패턴 — Slack, Discord, GraphQL-WS, 모든 chat 라이브러리 — 가 type string + data object 의 작은 JSON envelope. type field 가 어느 schema 의 data 인지 알려줘. 모든 게 이 단일 결정에서 떨어져 나와.
Type namespace
Dot-notation 써: chat.message, chat.typing, user.joined, user.status, room.join, game.move. 첫 segment 가 domain; 두 번째가 동사나 event. sortable, greppable, 확장 자연스러움 유지.
Error 도 message
Error 응답이 그냥 다른 message: {type: 'error', code: 'rate_limited', message: '...', ref_id: 'xyz'}. 같은 envelope, 다른 schema. error 를 first-class 로 다뤄, 특별한 transport-level 개념으로 다루지 마.