morffix/server/server.go
2024-04-26 22:48:09 +02:00

59 lines
1.3 KiB
Go

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
}()
stopCleanup := make(chan bool, 1)
go cleanupDeadWorkers(stopCleanup)
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()
stopCleanup <- true
slog.Info("Done")
}
}