Fix blocking on the websocket reader

This commit is contained in:
haykam821
2020-06-28 16:01:43 -04:00
parent 78a8543d52
commit 82c8da98f8

View File

@@ -108,13 +108,17 @@ func (b *API) handleMessages(c echo.Context) error {
return nil return nil
} }
func (b *API) handleStream(c echo.Context) error { func (b *API) getGreeting() config.Message {
c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSON) return config.Message{
c.Response().WriteHeader(http.StatusOK)
greet := config.Message{
Event: config.EventAPIConnected, Event: config.EventAPIConnected,
Timestamp: time.Now(), Timestamp: time.Now(),
} }
}
func (b *API) handleStream(c echo.Context) error {
c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSON)
c.Response().WriteHeader(http.StatusOK)
greet := b.getGreeting()
if err := json.NewEncoder(c.Response()).Encode(greet); err != nil { if err := json.NewEncoder(c.Response()).Encode(greet); err != nil {
return err return err
} }
@@ -142,28 +146,40 @@ func (b *API) handleWebsocketMessage(message config.Message) {
b.Remote <- message b.Remote <- message
} }
func (b *API) writePump(conn *websocket.Conn) {
for {
msg := b.Messages.Dequeue()
if msg != nil {
err := conn.WriteJSON(msg)
if err != nil {
break
}
}
}
}
func (b *API) readPump(conn *websocket.Conn) {
for {
message := config.Message{}
err := conn.ReadJSON(&message)
if err != nil {
break
}
b.handleWebsocketMessage(message)
}
}
func (b *API) handleWebsocket(c echo.Context) error { func (b *API) handleWebsocket(c echo.Context) error {
conn, err := websocket.Upgrade(c.Response().Writer, c.Request(), nil, 1024, 1024) conn, err := websocket.Upgrade(c.Response().Writer, c.Request(), nil, 1024, 1024)
if err != nil { if err != nil {
return err return err
} }
greet := config.Message{ greet := b.getGreeting()
Event: config.EventAPIConnected, _ = conn.WriteJSON(greet)
Timestamp: time.Now(),
}
conn.WriteJSON(greet)
for { go b.writePump(conn)
msg := b.Messages.Dequeue() go b.readPump(conn)
if msg != nil {
_ = conn.WriteJSON(msg)
}
message := config.Message{} return nil
err := conn.ReadJSON(&message)
if err == nil {
b.handleWebsocketMessage(message)
}
}
} }