Workers: WebSocketがCloseフレームに自動応答するようになりました
Key Points
- 自動でCloseフレームに応答
- close時にreadyStateがCLOSEDに
- allowHalfOpenでプロキシ対応
Summary
Workersランタイムがピアからの Close フレームを受信した際、自動で相互の Close フレームを送信するようになりました。close イベントが発火する前に readyState が CLOSED に遷移します。この動作は 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 はこの動作の影響を受けません。