56 lines
1.4 KiB
Go
56 lines
1.4 KiB
Go
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)
|
|
}
|