Я работаю над проектом, в котором для передачи файлов используется WebRT C, недавно кто-то сообщил о проблеме , сказав, что передача файлов преждевременно прекращается для больших файлов. Я нашел проблему, и мое решение этой проблемы состояло в том, чтобы полагаться на событие bufferedamountlow
для координации отправки кусков. Я также прекратил закрывать соединение, когда отправитель считает, что оно установлено.
По какой-то причине в Safari это событие не срабатывает.
Вот соответствующий код:
const connection = new RTCPeerConnection(rtcConfiguration);
const channel = connection.createDataChannel('sendDataChannel');
channel.binaryType = 'arraybuffer';
channel.addEventListener('open', () => {
const fileReader = new FileReader();
let offset = 0;
const nextSlice = (currentOffset: number) => {
// Do asynchronous thing with FileReader, that will result in
// channel.send(buffer) getting called.
// Also, offset gets increased by 16384 (the size of the buffer).
};
channel.bufferedAmountLowThreshold = 0;
channel.addEventListener('bufferedamountlow', () => nextSlice(offset));
nextSlice(0);
});
Более длинная версия моего кода доступна здесь.
Исследуя проблему, я понял, что в Safari мой connection.stcp
не определен. (Поскольку я переключился на connection.sctp.maxMessageSize
вместо 16384
для моего размера буфера.) Я бы предположил, что проблема связана с этим.
В чем может быть причина этой проблемы? Позвольте мне добавить, что на Chrome и Firefox все прекрасно работает без каких-либо проблем.
Событие bufferedamountlow
не требуется для правильной работы моего кода, я бы хотел, чтобы он работал Тем не менее, чтобы получить более точные оценки текущего прогресса и скорости на отправляющем конце передачи файла.