Disable WebSocket compression and see if it helps with Safari
This commit is contained in:
parent
541dd917c5
commit
f3354f2f1c
|
@ -30,7 +30,8 @@ type Subscriber struct {
|
||||||
conn *websocket.Conn
|
conn *websocket.Conn
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
cancel context.CancelFunc
|
cancel context.CancelFunc
|
||||||
messages chan []byte
|
messages chan []byte // WebSocket outgoing queue
|
||||||
|
cooldown sync.Mutex // don't spam messages out the WS
|
||||||
closeSlow func()
|
closeSlow func()
|
||||||
|
|
||||||
muteMu sync.RWMutex
|
muteMu sync.RWMutex
|
||||||
|
@ -113,7 +114,12 @@ func (sub *Subscriber) SendJSON(v interface{}) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
log.Debug("SendJSON(%d=%s): %s", sub.ID, sub.Username, data)
|
log.Debug("SendJSON(%d=%s): %s", sub.ID, sub.Username, data)
|
||||||
return sub.conn.Write(sub.ctx, websocket.MessageText, data)
|
|
||||||
|
// Write it to their outgoing channel so we can rate limit in case of Safari browsers
|
||||||
|
// which get overwhelmed with too many messages.
|
||||||
|
sub.messages <- data
|
||||||
|
// return sub.conn.Write(sub.ctx, websocket.MessageText, data)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendMe sends the current user state to the client.
|
// SendMe sends the current user state to the client.
|
||||||
|
@ -140,7 +146,9 @@ func (s *Server) WebSocket() http.HandlerFunc {
|
||||||
ip := util.IPAddress(r)
|
ip := util.IPAddress(r)
|
||||||
log.Info("WebSocket connection from %s - %s", ip, r.Header.Get("User-Agent"))
|
log.Info("WebSocket connection from %s - %s", ip, r.Header.Get("User-Agent"))
|
||||||
log.Debug("Headers: %+v", r.Header)
|
log.Debug("Headers: %+v", r.Header)
|
||||||
c, err := websocket.Accept(w, r, nil)
|
c, err := websocket.Accept(w, r, &websocket.AcceptOptions{
|
||||||
|
CompressionMode: websocket.CompressionDisabled,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
fmt.Fprintf(w, "Could not accept websocket connection: %s", err)
|
fmt.Fprintf(w, "Could not accept websocket connection: %s", err)
|
||||||
|
@ -177,7 +185,11 @@ func (s *Server) WebSocket() http.HandlerFunc {
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case msg := <-sub.messages:
|
case msg := <-sub.messages:
|
||||||
|
// Don't spam messages too quick.
|
||||||
|
sub.cooldown.Lock()
|
||||||
err = writeTimeout(ctx, time.Second*5, c, msg)
|
err = writeTimeout(ctx, time.Second*5, c, msg)
|
||||||
|
time.Sleep(100 * time.Second)
|
||||||
|
sub.cooldown.Unlock()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user