브라우저의 WebSocket API에는 send()이 있습니다. JavaScript가 프로토콜 Ping 프레임을 보낼 수 있는 범용 ping() 메서드는 제공하지 않습니다.

애플리케이션이 {"type":"heartbeat"} 같은 텍스트 메시지를 보낸다면 그것은 애플리케이션 데이터입니다. 서버는 그 메시지를 이해하고 응답을 정의해야 합니다. 그 계약을 구현하지 않은 서버는 텍스트에 ping이라는 단어가 있다는 이유만으로 프로토콜 Pong으로 응답할 의무가 없습니다.

확인이 무엇을 의미하는지, 대기 중인 하트비트를 어떻게 식별하는지, 오래된 확인이 언제 너무 늦는지를 정의하세요. 업무 작업의 확인과는 분리해 두어야 합니다.

JavaScript 타이머에도 스케줄링 제약이 있습니다. 백그라운드 탭과 바쁜 메인 스레드는 콜백을 지연시킬 수 있습니다. 정확한 타이머 경계를 놓친 것을 프록시가 전달을 멈췄다는 결정적 증거로 해석하지 마세요.

브라우저는 프로토콜 제어 프레임을 내부에서 처리할 수 있지만, 그것이 애플리케이션 코드에 모든 Ping이나 Pong을 이식 가능한 방식으로 보여 주지는 않습니다. 페이지에 자체적인 생존 판단이 필요하다면 명시적인 애플리케이션 계약과 복구 정책을 사용하세요.

readyState이 OPEN인 소켓은 로컬에서 열린 것으로 간주됩니다. 원격 애플리케이션이 마지막 메시지를 처리했다는 독립적인 측정은 아닙니다. 실제로 답해야 하는 질문에 맞는 증거를 사용하세요.

관련 글