From d67596acd921f75caaa4e604bc1ccf163bd0729e Mon Sep 17 00:00:00 2001 From: JP Appel Date: Wed, 2 Jul 2025 02:11:26 -0400 Subject: Add experimental http server --- cmd/server.go | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 cmd/server.go (limited to 'cmd/server.go') diff --git a/cmd/server.go b/cmd/server.go new file mode 100644 index 0000000..374e5f4 --- /dev/null +++ b/cmd/server.go @@ -0,0 +1,64 @@ +package main + +import ( + "context" + "flag" + "fmt" + "log/slog" + "net/http" + "os" + "os/signal" + "syscall" + "time" + + "github.com/jpappel/atlas/pkg/data" + "github.com/jpappel/atlas/pkg/server" +) + +type ServerFlags struct { + Address string + Port int +} + +func setupServerFlags(args []string, fs *flag.FlagSet, flags *ServerFlags) { + fs.StringVar(&flags.Address, "address", "", "the address to listen on") + fs.IntVar(&flags.Port, "port", 8080, "the port to bind to") + + fs.Parse(args) +} + +func runServer(gFlags GlobalFlags, sFlags ServerFlags, db *data.Query) byte { + addr := fmt.Sprintf("%s:%d", sFlags.Address, sFlags.Port) + + s := http.Server{Addr: addr, Handler: server.New(db)} + + serverErrors := make(chan error, 1) + exit := make(chan os.Signal, 1) + + signal.Notify(exit, syscall.SIGTERM, os.Interrupt) + + slog.Info("Starting server on", slog.String("addr", addr)) + go func(serverErrors chan<- error) { + if err := s.ListenAndServe(); err != nil { + serverErrors <- err + } + }(serverErrors) + + select { + case <-exit: + slog.Info("Recieved signal to shutdown") + case err := <-serverErrors: + slog.Error("Server error", err) + } + + slog.Info("Shutting down server") + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + if err := s.Shutdown(ctx); err != nil { + slog.Error("Error shutting down server", err) + return 1 + } + + return 0 +} -- cgit v1.2.3