ゆったりWeb手帳

Chromeでdata channelを使って大量にデータを送ると途中で止まる

data channel

一般的に WebRTC といえば音声や映像を Peer to Peer で接続することでサーバを介さずに通話ができるというプロトコルですが、 media stream を送るだけが WebRTC ではありません。 RTCDataChannel API を使えば、ピア同士でデータのやりとりを行うことができます。

Chromeでデータが送れなくなる

前置きはこんなもんで、本題です。 チャットや軽いデータならば一度のsendで送信できるのですが、今回は重いデータの送信を試していました。

dataChannel.send(contents)

RTCDataChannel API のsendメソッドでは一度に送信できるサイズに制約があり、困ったことにブラウザごとに異なり、さらに受信側も挙動がまちまちなようです。 ブラウザー間の差異を吸収するには、16キロバイト以下になるように分割し送信する必要があります。

ここでは分割するスクリプトはここでは省略しますが、だいたい50MBで3000個くらいになります。

これをwhileforなどを使って連続的に送るのですが、Chromeで試してみたところなぜか途中でぱったりと送信が止まるのです。 Connectionも正常なままで謎でしたが、RTCDataChannel.bufferedAmountをみてみると 16384 になると止まるようです。

そこで、RTCDataChannel.bufferedAmountが0以上になったら送信を待機するようにしたら最後まで送信できるようになりました。

FirefoxではbufferedAmountがいくつになっても大丈夫でした。

ちなみにwhileforを使うとタスクを占有してしまってレンダリングされなくなるので、最終的にsetTimeoutを使って末尾回帰するような関数を書きました笑

2019年2月1日追記 これ再現しなくなりました…。バグだったのかな?