From 4b246f6c510ea4a7368d7c59c2c09a29eaa8f240 Mon Sep 17 00:00:00 2001 From: Samuel Lorch Date: Sun, 5 Mar 2023 20:53:16 +0100 Subject: [PATCH] hookup websocket to api handler --- pkg/server/websocket.go | 44 ++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/pkg/server/websocket.go b/pkg/server/websocket.go index e8e1848..0f3d48f 100644 --- a/pkg/server/websocket.go +++ b/pkg/server/websocket.go @@ -1,16 +1,20 @@ package server import ( + "bytes" "context" + "fmt" "net/http" + "runtime/debug" "time" "golang.org/x/exp/slog" "nhooyr.io/websocket" - "nhooyr.io/websocket/wsjson" ) func HandleWebsocketAPI(w http.ResponseWriter, r *http.Request) { + ctx, cancel := context.WithCancel(r.Context()) + defer cancel() c, err := websocket.Accept(w, r, nil) if err != nil { slog.Error("Accepting Websocket Connection", err) @@ -18,17 +22,33 @@ func HandleWebsocketAPI(w http.ResponseWriter, r *http.Request) { } defer c.Close(websocket.StatusInternalError, "Unexpected Closing") - ctx, cancel := context.WithTimeout(r.Context(), time.Second*10) - defer cancel() + slog.Info("Accepted API Websocket Connection") - var v interface{} - err = wsjson.Read(ctx, c, &v) - if err != nil { - slog.Error("Reading Websocket Message", err) - return + for { + _, m, err := c.Read(ctx) + if websocket.CloseStatus(err) == websocket.StatusNormalClosure { + slog.Info("API Websocket Closed Normally") + cancel() + return + } else if err != nil { + slog.Error("API Websocket Closed Unexpectedly", err) + cancel() + } + + go func() { + defer func() { + if r := recover(); r != nil { + slog.Error("Recovered Panic Handling Websocket API Request", fmt.Errorf("%v", r), "stack", debug.Stack()) + return + } + }() + ctx, cancel := context.WithTimeout(ctx, time.Second*10) + defer cancel() + + err := apiHandler.HandleRequest(ctx, bytes.NewReader(m), w) + if err != nil { + slog.Error("Handling Websocket API Request", err) + } + }() } - - slog.Info("received websocket msg", "msg", v) - - c.Close(websocket.StatusNormalClosure, "") }