StartReader reads messages from a Websocket connection and passes them to a supplied handler for processing.
(ctx context.Context, done chan<- bool, ws *websocket.Conn, handler func([]byte) error)
| 9 | // StartReader reads messages from a Websocket connection and passes |
| 10 | // them to a supplied handler for processing. |
| 11 | func StartReader(ctx context.Context, done chan<- bool, ws *websocket.Conn, handler func([]byte) error) error { |
| 12 | msgs := make(chan []byte) |
| 13 | go func() { |
| 14 | Reader: |
| 15 | for { |
| 16 | _, message, err := ws.ReadMessage() |
| 17 | if err != nil { |
| 18 | // log.Printf("read websocket: %s", err) |
| 19 | done <- true |
| 20 | break Reader |
| 21 | } |
| 22 | msgs <- message |
| 23 | } |
| 24 | }() |
| 25 | go func() { |
| 26 | Consumer: |
| 27 | for { |
| 28 | select { |
| 29 | case msg := <-msgs: |
| 30 | err := handler(msg) |
| 31 | if err != nil { |
| 32 | done <- true |
| 33 | break Consumer |
| 34 | } |
| 35 | case <-ctx.Done(): |
| 36 | break Consumer |
| 37 | } |
| 38 | } |
| 39 | }() |
| 40 | return nil |
| 41 | } |
nothing calls this directly
no outgoing calls
no test coverage detected