Application-level ping/pong
RFC ping/pong (opcode 0x9/0xA) 은 브라우저 API 에서 안 보여 — 브라우저가 처리하지만 trigger 못 해. 그래서 직접 만들어. 30초마다 {type: 'ping'} 보내고; 몇 초 안에 {type: 'pong'} 기대; 안 오면 code 4000 으로 close 하고 재연결 logic 한테 넘겨. 브라우저가 못 알아채는 silently-dead connection (NAT timeout, lid 닫힘) 잡아.
Type 별 message router
Message 가 type field 가지면 route 해. 몇 개 type 엔 flat switch 도 ok; registry (Map<type, handler>) 가 더 잘 scale. router 는 cross-cutting concern (logging, validation, error handling) 추가하기 자연스러운 자리.
Compose, 상속하지 마
재연결, heartbeat, routing 은 독립적인 관심사. 한 거대 클래스 대신 base socket 위에 작은 composable wrapper 로 짜. cwkPippa 의 adapter 가 정확히 이 모양 — 좁은 boundary, 좁은 책임.