2017-04-03 46 views
16

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 0po 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.

+4

Zgłaszałem błąd w WebKit tutaj: https://bugs.webkit.org/show_bug.cgi?id=170463 –

+1

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

+0

to samo po naszej stronie, czekając na naprawę ... –

Odpowiedz

0

Próbowałem swoje link do świata rzeczywistego w Safari 10.1.2 i problem nie wystąpił. Wygląda na to, że zostało to naprawione.