ブラウザの WebSocket API には send() があります。JavaScript がプロトコルの Ping フレームを送るための汎用的な ping() メソッドは公開されていません。

アプリケーションが {"type":"heartbeat"} のようなテキストメッセージを送る場合、それはアプリケーション・データです。サーバーはそのメッセージを理解し、応答を定義する必要があります。その契約を実装していないサーバーは、テキストに ping という語が含まれているからといって、プロトコルの Pong で応答する義務はありません。

確認応答が何を意味するのか、保留中のハートビートをどう識別するのか、古い確認応答がいつ手遅れになるのかを定義してください。業務処理の確認応答とは分けて扱います。

JavaScript のタイマーにもスケジューリング上の制約があります。バックグラウンドのタブや多忙なメインスレッドはコールバックを遅延させます。タイマーの正確な境界を外したことを、プロキシが転送をやめた決定的な証拠と解釈してはいけません。

ブラウザはプロトコルの制御フレームを内部で処理できますが、それによってアプリケーション・コードがすべての Ping や Pong を移植可能な形で見られるわけではありません。ページ独自の生存判定が必要なら、明示的なアプリケーション契約と復旧ポリシーを使ってください。

readyState が OPEN であるソケットは、ローカルでは開いていると見なされます。遠隔のアプリケーションが最後のメッセージを処理したという独立した測定ではありません。実際に答える必要のある問いに対応する証拠を使ってください。

関連記事