애플리케이션 수준의 ping/pong
opcode 0x9 와 0xA 를 쓰는 RFC ping/pong 은 브라우저 API 에 드러나지 않아. 브라우저가 응답은 처리하지만 애플리케이션에서 시작할 수 없지. 그래서 직접 심박을 만들어야 해. 30초마다 {type: 'ping'} 을 보내고 몇 초 안에 {type: 'pong'} 이 오길 기다려. 오지 않으면 코드 4000 으로 연결을 닫고 재연결 로직에 맡겨. NAT 시간 제한이나 노트북 덮개 닫힘처럼 브라우저가 알아채지 못한 채 죽은 연결을 찾아낼 수 있어.
type 별 메시지 라우터
메시지에 type 필드가 있으면 그 값에 따라 보내면 돼. 종류가 몇 개뿐이라면 평평한 switch 도 괜찮지만, 처리기 등록소인 Map<type, handler> 가 늘어나기 쉬워. 라우터는 로깅, 검증, 오류 처리처럼 여러 메시지에 걸친 관심사를 넣기에도 자연스러운 자리야.
상속 대신 조합해
재연결, 심박, 라우팅은 서로 독립된 관심사야. 거대한 클래스 하나보다 기본 소켓 위에 작고 조합 가능한 래퍼를 쌓아. cwkPippa 의 어댑터도 정확히 이런 모양이야. 경계도 좁고 책임도 좁지.