ブラウザの WebSocket ハートビートにはアプリケーション層のプロトコルが必要
ブラウザの JavaScript が WebSocket Ping フレームを直接送れない場合に、合意済みのアプリケーション・ハートビートを設計します。
ブラウザの WebSocket API には send() があります。JavaScript がプロトコルの Ping フレームを送るための汎用的な ping() メソッドは公開されていません。
アプリケーションが {"type":"heartbeat"} のようなテキストメッセージを送る場合、それはアプリケーション・データです。サーバーはそのメッセージを理解し、応答を定義する必要があります。その契約を実装していないサーバーは、テキストに ping という語が含まれているからといって、プロトコルの Pong で応答する義務はありません。
確認応答が何を意味するのか、保留中のハートビートをどう識別するのか、古い確認応答がいつ手遅れになるのかを定義してください。業務処理の確認応答とは分けて扱います。
JavaScript のタイマーにもスケジューリング上の制約があります。バックグラウンドのタブや多忙なメインスレッドはコールバックを遅延させます。タイマーの正確な境界を外したことを、プロキシが転送をやめた決定的な証拠と解釈してはいけません。
ブラウザはプロトコルの制御フレームを内部で処理できますが、それによってアプリケーション・コードがすべての Ping や Pong を移植可能な形で見られるわけではありません。ページ独自の生存判定が必要なら、明示的なアプリケーション契約と復旧ポリシーを使ってください。
readyState が OPEN であるソケットは、ローカルでは開いていると見なされます。遠隔のアプリケーションが最後のメッセージを処理したという独立した測定ではありません。実際に答える必要のある問いに対応する証拠を使ってください。