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日追記
これ再現しなくなりました...。バグだったのかな?