ClaudeCloudflare Developer PlatformApr 7, 2026, 12:00 AM

Workers - WebSockets now automatically reply to Close frames

A condensed section focused on the key takeaways first.

Original Post

Quick Digest

Summary

A condensed section focused on the key takeaways first.

claudeenmodel: claude-sonnet-4-20250514

Workers WebSockets Auto-Reply to Close Frames

Key Points

  • Automatic Close frame replies now enabled by default
  • Half-open mode available for WebSocket proxying
  • Backward compatible with existing close handlers

Summary

Cloudflare Workers runtime now automatically sends reciprocal Close frames when receiving Close frames from peers, matching WebSocket specification and browser behavior. This change is enabled by default for Workers using compatibility dates on or after 2026-04-07.

Key Points

  • Automatic Close Handling: Workers automatically reply to Close frames and transition readyState to CLOSED before firing the close event
  • Backward Compatibility: Existing code calling close() in close event handlers continues to work (calls are silently ignored when already closed)
  • Half-Open Mode: Pass { allowHalfOpen: true } to accept() for WebSocket proxying scenarios where manual close coordination is needed
  • Compatibility Flag: Controlled by web_socket_auto_reply_to_close compatibility flag for dates >= 2026-04-07

Full Translation

Translations

A translation section that keeps the flow of the original article.

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を参照してください。

Workers - WebSockets now automatically reply to Close frames | Cloudflare Developer Platform | DocsDigest