Wygląda na to, że interfejs WebSocket API w Safari 10.1 ma maksymalną ilość danych binarnych, które może buforować, a następnie następna wysyłana wiadomość otrzymuje błąd "Połączenie WebSocket z ... nie powiodło się: nie udało się wysłać ramki WebSocket."Jak obejść błąd Safari 10.1 "Nie można wysłać ramki WebSocket"?
Safari następnie zamyka połączenie z kodem 1006 (CLOSE_ABNORMAL).
WebSockets są supposed to report the bufferedAmount
- ale Safari zawsze informuje 0
aż po wystąpi błąd i połączenie zostanie zamknięte.
Próbowałem po prostu zrobić 100ms setTimeout między każdą wiadomość, i to wydaje się działać w przypadku małych porcji danych, ale wydaje się, kruche i duże kawałki nadal dostają błędy, gdy wysyłam mój komunikat zamknięcia JSON, nawet z dłuższe opóźnienie.
Możesz see the bug in action here - przyciski "Odtwórz próbkę" działają w Safari 10.03, ale błąd w 10.1. (Code that handles the WebSocket connection.)
Wszelkie pomysły dotyczące obejścia tego problemu? A może nawet limit? Wiem, że Safari to Open Source, ale nie jestem pewien, gdzie szukać.
Aktualizacja: tutaj jest prostszy przykład:
// 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/
Druga wiadomość dostaje błąd zamyka połączenie, a po trzecie wiadomości, bufferedAmount
jest 23093.
Zgłaszałem błąd w WebKit tutaj: https://bugs.webkit.org/show_bug.cgi?id=170463 –
mamy ten sam problem. Próg dla nas wydaje się być buforem UInt8Array (23085); cokolwiek większego, i widzimy ten sam błąd. (My też widzimy bufferedAmount zawsze zgłaszające 0). Niestety nie można w tej chwili pomóc - nie wiemy, czy to błąd Safari, czy coś nowego. – MikeB
to samo po naszej stronie, czekając na naprawę ... –