Как работать с ошибкой Safari 10.1 "Не удалось отправить фрейм WebSocket"?

Похоже, что 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.

Ответы

Ответ 1

Я попробовал вашу реальную ссылку на Safari 10.1.2 и не видел проблемы. Кажется, он исправлен.