From 4cff7748af65038db3754ab9ce157d528f03a474 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Thu, 2 Oct 2025 16:04:35 +0200 Subject: feat(backend): simple http server --- main.go | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 main.go (limited to 'main.go') diff --git a/main.go b/main.go new file mode 100644 index 0000000..a277761 --- /dev/null +++ b/main.go @@ -0,0 +1,57 @@ +package main + +import ( + "context" + "errors" + "log/slog" + "net/http" + "os" + "os/signal" + "syscall" + + "git.anhgelus.world/anhgelus/small-world/backend" + "github.com/joho/godotenv" +) + +func init() { + err := godotenv.Load(".env") + if err != nil && !errors.Is(err, os.ErrNotExist) { + slog.Error("loading .env", "error", err) + } +} +func main() { + r := backend.NewRouter() + + slog.Info("starting http server") + server := &http.Server{Addr: ":8000", Handler: r} + + errChan := make(chan error) + go startServer(server, errChan) + + sc := make(chan os.Signal, 1) + signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt) + + ok := true + for ok { + select { + case err := <-errChan: + slog.Error("http server running", "error", err) + slog.Info("restarting the server") + go startServer(server, errChan) + case <-sc: + err := server.Shutdown(context.Background()) + if err != nil { + slog.Error("closing http server", "error", err) + } + ok = false + } + } + slog.Info("http server stopped") +} + +func startServer(server *http.Server, errChan chan error) { + err := server.ListenAndServe() + if err != nil && !errors.Is(err, http.ErrServerClosed) { + errChan <- err + } +} -- cgit v1.2.3