Cloudflare Workers の WebSocket バイナリ、これからは Blob でやってくるよ!
やっほー、しぃちゃんだよ! 今日は WebSocket をさわってる人に、地味だけど大事なお知らせを持ってきたよ。
Cloudflare Changelogなにが発表されたの?
Cloudflare の Changelog から。Cloudflare Workers が、WebSocket で受け取ったバイナリのメッセージを、デフォルトで Blob として渡すようになったの。これは WebSocket の仕様やブラウザの標準的なふるまいに合わせた変更なんだって。
この挙動は 2026 年 3 月 17 日以降の互換性日付(compatibility date)を持つ Worker で、websocket_standard_binary_type という互換性フラグを通して有効になっているよ。Cloudflare 自身も「リリース時にちゃんとドキュメント化できていなかった」と認めているの。
今までどうだったの?
これまでは、WebSocket で届くバイナリフレームは、いつも ArrayBuffer として渡されていたの。だから多くの Worker は event.data が ArrayBuffer である前提でコードを書いていたんだよね。instanceof ArrayBuffer でチェックして処理を分ける、みたいな感じ。
これで何が変わるの?
デフォルトが Blob に変わったことで、ArrayBuffer を前提にしていたコードは要注意なの。届いたデータが Blob なのに ArrayBuffer だと思ってチェックすると、判定がすり抜けて、フレームを黙って処理しそこねる(silently fail)ことがあるんだって。エラーも出ずにスルーされちゃうから、気づきにくいのがこわいところ。バイナリを扱う WebSocket の Worker を持っている人は、一度自分のコードを見直しておくと安心だよ。
深く潜ってみよう
今まで通り ArrayBuffer で受け取りたいときは、方法が 2 つあるよ。
- 個別に戻す: WebSocket を
accept()する前に、binaryTypeプロパティ をws.binaryType = "arraybuffer"にセットしておく。これで、そのコネクションのバイナリは ArrayBuffer で届くの。 - 全体で戻す: Wrangler の設定ファイル に
no_websocket_standard_binary_typeフラグ を追加すると、すべての WebSocket でデフォルトを ArrayBuffer のままに保てるよ。
それと、Durable Object の hibernatable な WebSocket ハンドラは今回の変更の対象外で、引き続きバイナリを ArrayBuffer で受け取るの。ここは変わらないから覚えておいてね。
まとめ
- Cloudflare Workers の WebSocket バイナリメッセージが、デフォルトで Blob 配信に変わったよ(2026 年 3 月 17 日以降の互換性日付が対象)。
- 今まで通り ArrayBuffer がよければ、
binaryType = "arraybuffer"かno_websocket_standard_binary_typeフラグで戻せる。 - Durable Object の hibernatable WebSocket は対象外。
- ArrayBuffer 前提のコードは黙って動かなくなることがあるので、バイナリ WebSocket を使う Workers 開発者は要チェックだよ!