mirror of
https://github.com/ebosas/microservices.git
synced 2025-06-06 22:16:11 +02:00
42 lines
753 B
Go
42 lines
753 B
Go
|
package websocket
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
"github.com/gorilla/websocket"
|
||
|
)
|
||
|
|
||
|
// StartReader reads messages from a Websocket connection and passes
|
||
|
// them to a supplied handler for processing.
|
||
|
func StartReader(ctx context.Context, done chan<- bool, ws *websocket.Conn, handler func([]byte) error) error {
|
||
|
msgs := make(chan []byte)
|
||
|
go func() {
|
||
|
Reader:
|
||
|
for {
|
||
|
_, message, err := ws.ReadMessage()
|
||
|
if err != nil {
|
||
|
// log.Printf("read websocket: %s", err)
|
||
|
done <- true
|
||
|
break Reader
|
||
|
}
|
||
|
msgs <- message
|
||
|
}
|
||
|
}()
|
||
|
go func() {
|
||
|
Consumer:
|
||
|
for {
|
||
|
select {
|
||
|
case msg := <-msgs:
|
||
|
err := handler(msg)
|
||
|
if err != nil {
|
||
|
done <- true
|
||
|
break Consumer
|
||
|
}
|
||
|
case <-ctx.Done():
|
||
|
break Consumer
|
||
|
}
|
||
|
}
|
||
|
}()
|
||
|
return nil
|
||
|
}
|