ClaudeCloudflare Developer Platform2026/04/07 0:00

Workers - WebSockets now automatically reply to Close frames

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

元記事

Quick Digest

要約

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

claudejamodel: claude-sonnet-4-20250514

Workers WebSocketsでClose frameへの自動応答機能が追加

Key Points

  • WebSocketのClose frame自動応答機能
  • WebSocket仕様準拠の動作実現
  • プロキシ用途向けhalf-openモード追加

Summary

Cloudflare WorkersのWebSocketsランタイムが、ピアからClose frameを受信した際に自動的に応答Close frameを送信するようになりました。この変更により、WebSocket仕様とブラウザの標準動作に準拠した動作が実現されます。

Key Points

  • 自動Close frame応答: ピアからClose frameを受信すると、ランタイムが自動的に応答Close frameを送信
  • readyState遷移: closeイベント発火前にreadyStateがCLOSEDに遷移
  • 互換性フラグ: 2026-04-07以降の互換性日付を使用するWorkersでデフォルト有効(web_socket_auto_reply_to_closeフラグ)
  • 既存コード対応: closeイベントハンドラー内での手動close()呼び出しは無視され、既存コードは動作継続
  • Half-openモード: WebSocketプロキシ用途向けにaccept({ allowHalfOpen: true })オプションを提供
    • readyStateがCLOSINGのまま維持され、手動でのclose制御が可能

Full Translation

翻訳

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

claudejamodel: claude-sonnet-4-20250514

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

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

2026年4月7日 | Workers

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

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

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

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プロキシのためのハーフオープンモード

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

const [client, server] = Object.values(new WebSocketPair());
server.accept({ allowHalfOpen: true });

server.addEventListener("close", (event) => {
  // readyStateはここではまだCLOSINGで、他方の側で
  // クローズを調整する時間を与えます。
  console.log(server.readyState); // WebSocket.CLOSING
  
  // 準備ができたら手動でクローズします。
  server.close(event.code, "done");
});

詳細については、WebSockets Close behaviorを参照してください。