Add Basic Websocket Server/Worker Connection
This commit is contained in:
parent
01e34936e9
commit
9ac9ed8fe2
9 changed files with 218 additions and 7 deletions
9
server/index.go
Normal file
9
server/index.go
Normal file
|
@ -0,0 +1,9 @@
|
|||
package server
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func handleIndex(w http.ResponseWriter, r *http.Request) {
|
||||
w.Write([]byte("Alive"))
|
||||
}
|
55
server/server.go
Normal file
55
server/server.go
Normal file
|
@ -0,0 +1,55 @@
|
|||
package server
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"time"
|
||||
|
||||
"git.lastassault.de/speatzle/morffix/config"
|
||||
)
|
||||
|
||||
var conf config.Config
|
||||
|
||||
func Start(_conf config.Config) {
|
||||
conf = _conf
|
||||
mux := http.NewServeMux()
|
||||
mux.HandleFunc("/worker", handleWorkerWebsocket)
|
||||
mux.HandleFunc("/", handleIndex)
|
||||
|
||||
server := &http.Server{
|
||||
Addr: conf.Server.Address,
|
||||
Handler: mux,
|
||||
ReadTimeout: 1 * time.Second,
|
||||
WriteTimeout: 1 * time.Second,
|
||||
IdleTimeout: 30 * time.Second,
|
||||
ReadHeaderTimeout: 2 * time.Second,
|
||||
}
|
||||
|
||||
serverClose := make(chan bool)
|
||||
go func() {
|
||||
slog.Info("Listening...", "Address", conf.Server.Address)
|
||||
err := server.ListenAndServe()
|
||||
if err != http.ErrServerClosed {
|
||||
slog.Error("Listen Failed", "err", err)
|
||||
} else {
|
||||
slog.Info("Server Closed")
|
||||
}
|
||||
serverClose <- true
|
||||
}()
|
||||
|
||||
sigs := make(chan os.Signal, 1)
|
||||
signal.Notify(sigs, os.Interrupt)
|
||||
select {
|
||||
case <-serverClose:
|
||||
slog.Info("Exiting due to Listen Failure")
|
||||
case sig := <-sigs:
|
||||
slog.Info("Stopping Server...", "signal", sig)
|
||||
stopCtx, cancel := context.WithTimeout(context.Background(), time.Second*10)
|
||||
server.Shutdown(stopCtx)
|
||||
cancel()
|
||||
slog.Info("Done")
|
||||
}
|
||||
}
|
56
server/worker.go
Normal file
56
server/worker.go
Normal file
|
@ -0,0 +1,56 @@
|
|||
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)
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue