OpenAICloudflare Developer Platform2026/04/07 0:00

Workers - WebSockets now automatically reply to Close frames

要点だけを先に読めるように短く再構成したセクションです。

元記事

Quick Digest

要約

要点だけを先に読めるように短く再構成したセクションです。

openaijamodel: gpt-5-mini-2025-08-07

Workers: WebSocketがCloseフレームに自動応答するようになりました

Key Points

  • 自動でCloseフレームに応答
  • close時にreadyStateがCLOSEDに
  • allowHalfOpenでプロキシ対応

Summary

Workersランタイムがピアからの Close フレームを受信した際、自動で相互の Close フレームを送信するようになりました。close イベントが発火する前に readyStateCLOSED に遷移します。この動作は WebSocket 仕様とブラウザの標準挙動に一致します。既存の close() 呼び出しは、既に閉じている場合は黙って無視されます。

Key Points

  • 既定で有効: 互換性日付が 2026-04-07 以降の Workers は web_socket_auto_reply_to_close によりこの挙動がデフォルトで有効になります。
  • close ハンドラ内では readyState が既に CLOSED のため通常は close() を呼ぶ必要はありません。呼んでも無害で静かに無視されます。
  • WebSocket プロキシング(クライアントとバックエンドを独立して閉じたい)を行う場合は、accept({ allowHalfOpen: true }) を使って半開状態を許可すると、close イベント時に readyState がまだ CLOSING のままで他側と閉じる調整ができます。

例:

const [client, server] = Object.values(new WebSocketPair());
server.accept({ allowHalfOpen: true });
server.addEventListener("close", (event) => {
  // readyState は CLOSING のまま
  // 必要に応じて別側へ終了通知を送り、手動で close() を呼ぶ
  server.close(event.code, "done");
});

Migration / 注意点

  • プロキシや独立したクローズ制御が必要な既存実装は allowHalfOpen: true を検討してください。
  • 互換性日付が古い Workers はこの動作の影響を受けません。

Full Translation

翻訳

原文の流れを保ったまま読める翻訳セクションです。

openaijamodel: gpt-5-mini-2025-08-07

Workers - WebSockets が Close フレームに自動で応答するようになりました

Workers - WebSockets が Close フレームに自動で応答するようになりました

公開日:2026-04-07

Workers ランタイムは、ピアから Close フレームを受信したときに相互の Close フレームを自動的に送信するようになりました。readyState は close イベントが発火する前に CLOSED に遷移します。この動作は WebSocket specification と標準ブラウザの挙動に一致します。

この変更は、互換性日付が 2026-04-07 以降の Workers(web_socket_auto_reply_to_close 互換フラグ経由)でデフォルトで有効になります。

  • 既存のコードで close イベントハンドラ内から明示的に close() を呼び出している場合でも動作は継続します。WebSocket が既に閉じているときの呼び出しは静かに無視されます。

動作の例

サーバ側が相手の Close を受け取ったとき、readyState はすでに CLOSED になっています。サンプル:

const [client, server] = Object.values(new WebSocketPair());
server.accept();
server.addEventListener("close", (event) => {
    // readyState はすでに CLOSED — server.close() を呼ぶ必要はありません。
    console.log(server.readyState); // WebSocket.CLOSED
    console.log(event.code); // 1000
    console.log(event.wasClean); // true
});

WebSocket プロキシ(Half-open)モード

自動 Close の動作は、Worker がクライアントとバックエンドの間に入り、両側の Close を独立して調整する必要がある WebSocket プロキシングと干渉することがあります。このユースケースをサポートするために、accept() に { allowHalfOpen: true } を渡してください。

サンプル:

const [client, server] = Object.values(new WebSocketPair());
server.accept({ allowHalfOpen: true });
server.addEventListener("close", (event) => {
    // ここでは readyState はまだ CLOSING のままなので、
    // 他側の Close を調整する時間があります。
    console.log(server.readyState); // WebSocket.CLOSING

    // 準備ができたら手動で閉じる。
    server.close(event.code, "done");
});

補足

  • この変更は WebSocket の仕様に準拠したものであり、ブラウザの標準的な挙動と一致します。
  • 追加情報は「WebSockets Close behavior」を参照してください。

リソース: API、Cloudflare ドキュメント、ヘルプセンター。