Ответ 1
Я попробовал вашу реальную ссылку на Safari 10.1.2 и не видел проблемы. Кажется, он исправлен.
Похоже, что API WebSocket в Safari 10.1 имеет максимальное количество двоичных данных, которое он может буферизировать, а затем следующее отправленное сообщение получает сообщение об ошибке "Соединение с WebSocket... не удалось: не удалось отправить фрейм WebSocket".
Затем Safari закрывает соединение с кодом 1006 (CLOSE_ABNORMAL).
WebSockets должны сообщать bufferedAmount
, но Safari всегда сообщает 0
до тех пор, пока не произойдет ошибка и соединение не будет закрыто.
Я пробовал просто делать 100 мс setTimeout между каждым сообщением, и это, похоже, работает в случае небольших фрагментов данных, но кажется хрупким, и большие куски все еще возникают ошибки, когда я отправляю свое закрывающее сообщение JSON даже с более длинным задержка.
Вы можете видеть здесь ошибку в действии - кнопки "Воспроизведение" работают в Safari 10.03, но ошибка в 10.1. (Код, который обрабатывает соединение WebSocket.)
Любые идеи о том, как обойти это? Или какой предел даже есть? Я знаю, что Safari - это Open Source, но я не уверен, где искать.
Обновление: здесь более простой пример:
// this fails in Safari 10.1 but works in 10.03 (and other browsers)
var ws = new WebSocket('wss://echo.websocket.org');
ws.onerror = function(evt) {
// Not sure why, but error events seem to have no useful information
// The console, however, will have the following error:
// WebSocket connection to 'wss://echo.websocket.org/' failed: Failed to send WebSocket frame.
console.log("WebSocket error - see console for message");
}
ws.onclose = function(evt) {
console.log(`WebSocket closed with code: ${evt.code}, reason: ${evt.reason}`);
}
ws.onopen = function() {
console.log('sending first binary message');
ws.send(new Uint8Array(23085));
console.log('bufferedAmount is ' + ws.bufferedAmount);
// this gets the error
console.log('sending second binary message');
ws.send(new Uint8Array(23085));
console.log('bufferedAmount is ' + ws.bufferedAmount);
console.log('sending third binary message');
ws.send(new Uint8Array(23085));
console.log('bufferedAmount is ' + ws.bufferedAmount);
ws.close();
}
https://jsfiddle.net/yta2mjuf/2/
Во втором сообщении сообщение об ошибке закрывает соединение, а после третьего сообщения bufferedAmount
- 23093.
Я попробовал вашу реальную ссылку на Safari 10.1.2 и не видел проблемы. Кажется, он исправлен.