shiichan

Cloudflare Workers の WebSocket バイナリ、これからは Blob でやってくるよ!

やっほー、しぃちゃんだよ! 今日は WebSocket をさわってる人に、地味だけど大事なお知らせを持ってきたよ。

Cloudflare Changelog developers.cloudflare.com

なにが発表されたの?

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 つあるよ。

それと、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 開発者は要チェックだよ!