diff --git a/websockets/client.go b/websockets/client.go index dc6ec2b2..732b5378 100644 --- a/websockets/client.go +++ b/websockets/client.go @@ -1,6 +1,28 @@ package main +import "errors" + type Client struct { - id string + id string messages chan []byte } + +type Message struct { + Action string `json:"action"` + Value interface{} `json:"value"` +} + +type Response struct { + Ok bool `json:"ok"` + Value interface{} `json:"value,omitempty"` + Error string `json:"error,omitempty"` +} + +func (c *Client) HandleMessage(message Message) (interface{}, error) { + switch message.Action { + case "ping": + return "pong", nil + default: + return nil, errors.New("invalid action") + } +} diff --git a/websockets/main.go b/websockets/main.go index 2eead092..e8c89bb5 100644 --- a/websockets/main.go +++ b/websockets/main.go @@ -5,6 +5,7 @@ import ( "net/http" websocket "nhooyr.io/websocket" + wsjson "nhooyr.io/websocket/wsjson" ) const MAX_MESSAGE_QUEUE = 16 @@ -29,14 +30,32 @@ func main() { defer server.DeleteClient(client) for { - t, message, err := c.Read(r.Context()) - if err != nil || t != websocket.MessageText { + var message Message + err := wsjson.Read(r.Context(), c, &message) + if err != nil { + log.Printf("err: %v", err) break } - log.Printf("Received %v", message) + ret, err := client.HandleMessage(message) + var resp Response + if err == nil { + if ret != nil { + resp = Response{ + Ok: true, + Value: ret, + } + } else { + resp = Response{Ok: true} + } + } else { + resp = Response{ + Ok: false, + Error: err.Error(), + } + } - err = c.Write(r.Context(), websocket.MessageText, message) + err = wsjson.Write(r.Context(), c, resp) if err != nil { break }