package server import ( "context" "log/slog" "net/http" "git.lastassault.de/speatzle/morffix/constants" "nhooyr.io/websocket" ) type Connection struct { } var Connections []Connection func handleWorkerWebsocket(w http.ResponseWriter, r *http.Request) { if r.Header.Get(constants.SHARED_SECRET_HEADER) != conf.SharedSecret { w.WriteHeader(http.StatusUnauthorized) return } c, err := websocket.Accept(w, r, &websocket.AcceptOptions{ InsecureSkipVerify: true, }) if err != nil { slog.ErrorContext(r.Context(), "Error Accepting Worker Websocket Connection", "err", err) return } defer c.CloseNow() slog.InfoContext(r.Context(), "Worker Websocket Connection", "RemoteAddress", r.RemoteAddr) // TODO Add Connection Tracking for { err = readMessage(r.Context(), c) if websocket.CloseStatus(err) == websocket.StatusNormalClosure || websocket.CloseStatus(err) == websocket.StatusAbnormalClosure || websocket.CloseStatus(err) == websocket.StatusGoingAway { slog.InfoContext(r.Context(), "Websocket Closed") return } if err != nil { slog.ErrorContext(r.Context(), "Error Reading Websocket Message", "err", err) return } } } func readMessage(ctx context.Context, c *websocket.Conn) error { t, data, err := c.Read(ctx) if err != nil { return err } slog.InfoContext(ctx, "Got Websocket Message", "type", t.String(), "data", data) return c.Write(ctx, t, data) }