概要
- WHATWG Streams Standard(Web streams) は、ストリームデータ処理の共通APIとして設計
- 現代のJavaScript開発 には合わない設計上の課題とパフォーマンス問題
- ロックやBYOB、バックプレッシャー など複雑なAPIセマンティクス
- 新しいアプローチ では、JavaScriptの言語機能を活用し大幅な高速化を実現
- 今後のストリームAPI設計 への提案と議論のきっかけ
Web Streamsの課題と設計上の限界
- WHATWG Streams Standard(Web streams) は、ブラウザやサーバー間で共通のストリームAPIを提供するために設計
- Node.js、Cloudflare Workers、Deno、Bun など主要ランタイムに採用され、fetch()などの基盤APIにも利用
- 標準APIには 根本的な使いにくさとパフォーマンス問題 が存在
- 問題の多くは 設計時の決定 に起因し、現代のJavaScriptスタイルと合致しない
- async iteration(for await...of) 登場前に設計されたため、独自のreader/writerモデルを採用
過剰な儀式的操作
- ストリームの 基本的な読み取り操作 に多くの手順やロック管理が必要
- 例:getReader()でロック取得、read()で読み取り、releaseLock()でロック解除
- これらは 設計上の都合によるAPIの複雑化 であり、本質的な必須要件ではない
- async iteration の導入で多少簡潔になったが、APIの根本的な複雑さは残存
- エラーや追加機能利用時に 元の複雑なAPIに戻る必要 があり、開発者の負担増
ロックモデルの問題
- getReader()呼び出し時にストリームがロック され、他の操作が不可能
- releaseLock()の呼び出し忘れ でストリームが永久にロックされる例が多発
- ロック状態や解除タイミングの 仕様や実装差異 によるバグや混乱
- 実装者側も ロック状態管理やエッジケース対応 で複雑な内部処理が必要
BYOB(Bring Your Own Buffer)の複雑性
- メモリ再利用最適化 のために導入されたBYOBだが、実際の利用頻度は低い
- 専用リーダーやバッファ管理、ArrayBufferのデタッチ など、APIが非常に複雑
- async iterationやTransformStreams と併用不可、実用性に乏しい
- 多くの開発者が デフォルト読み取りで妥協 し、BYOBの恩恵を受けない
- 正しいBYOB対応実装は 大規模・エラーが起きやすい ため敬遠されがち
バックプレッシャーの理論と実態
- バックプレッシャー(Backpressure) は、消費者の速度に応じて生産者の速度を制御する仕組み
- コントローラーの desiredSize 値でシグナルを送る設計
- しかし controller.enqueue()は常に成功 し、desiredSizeが負でも止められない
- 理論上は有効だが、実装や運用面で機能不全 に陥りやすい
まとめと代替アプローチの提案
- Web streamsは 過去の制約と設計方針 による複雑さとパフォーマンス問題を抱える
- JavaScriptの最新言語機能(async iteration等) を前提とした新API設計が必要
- 代替案では 2倍から120倍の高速化 を実現、根本的な設計見直しの効果を実証
- 今後のストリームAPIは シンプルさ・実用性・パフォーマンス のバランスが重要
- 現行仕様を否定するのではなく、新しい方向性の議論のきっかけ とする提案