func (this *subServer) wsWritePump(clientGone chan struct{}, ws *websocket.Conn, fetcher store.Fetcher) { defer fetcher.Close() var err error for { select { case msg := <-fetcher.Messages(): ws.SetWriteDeadline(time.Now().Add(time.Second * 10)) // FIXME because of buffer, client recv 10, but kateway written 100, then // client quit... if err = ws.WriteMessage(websocket.BinaryMessage, msg.Value); err != nil { log.Error("%s: %v", ws.RemoteAddr(), err) return } if err = fetcher.CommitUpto(msg); err != nil { log.Error(err) // TODO add more ctx } case err = <-fetcher.Errors(): // TODO log.Error(err) case <-this.timer.After(this.wsPongWait / 3): ws.SetWriteDeadline(time.Now().Add(time.Second * 10)) if err = ws.WriteMessage(websocket.PingMessage, []byte{}); err != nil { log.Error("%s: %v", ws.RemoteAddr(), err) return } case <-this.gw.shutdownCh: return case <-clientGone: return } } }