data channel
一般的に WebRTC といえば音声や映像を Peer to Peer で接続することでサーバを介さずに通話ができるというプロトコルですが、 media stream を送るだけが WebRTC ではありません。
RTCDataChannel API を使えば、ピア同士でデータのやりとりを行うことができます。
Chromeでデータが送れなくなる
前置きはこんなもんで、本題です。
チャットや軽いデータならば一度の
sendで送信できるのですが、今回は重いデータの送信を試していました。dataChannel.send(contents)RTCDataChannel API の
sendメソッドでは一度に送信できるサイズに制約があり、困ったことにブラウザごとに異なり、さらに受信側も挙動がまちまちなようです。ブラウザー間の差異を吸収するには、16キロバイト以下になるように分割し送信する必要があります。
ここでは分割するスクリプトはここでは省略しますが、だいたい50MBで3000個くらいになります。
これを
whileやforなどを使って連続的に送るのですが、Chromeで試してみたところなぜか途中でぱったりと送信が止まるのです。Connectionも正常なままで謎でしたが、
RTCDataChannel.bufferedAmountをみてみると 16384 になると止まるようです。そこで、
RTCDataChannel.bufferedAmountが0以上になったら送信を待機するようにしたら最後まで送信できるようになりました。Firefoxでは
bufferedAmountがいくつになっても大丈夫でした。ちなみに
whileやforを使うとタスクを占有してしまってレンダリングされなくなるので、最終的にsetTimeoutを使って末尾回帰するような関数を書きました笑2019年2月1日追記
これ再現しなくなりました...。バグだったのかな?