@@ -2,8 +2,13 @@ package main
22
33import (
44 "context"
5+ "errors"
56 "log/slog"
7+ "net/http"
68 "os"
9+ "os/signal"
10+ "syscall"
11+ "time"
712
813 "github.com/pyazo-screenshot/api/config"
914 "github.com/pyazo-screenshot/api/db"
@@ -18,7 +23,7 @@ func main() {
1823 }
1924
2025 if cfg .Env == "production" {
21- slog .SetDefault (slog .New (slog .NewJSONHandler (os .Stdout , nil )))
26+ slog .SetDefault (slog .New (slog .NewTextHandler (os .Stdout , nil )))
2227 }
2328
2429 if err := db .RunMigrations (cfg .DatabaseURL ()); err != nil {
@@ -35,9 +40,29 @@ func main() {
3540
3641 s := pyhttp .NewServer (pool , cfg )
3742 addr := ":" + cfg .Port
38- slog .Info ("server starting" , "addr" , addr )
39- if err := s .Router .Run (addr ); err != nil {
40- slog .Error ("server failed" , "error" , err )
43+
44+ srv := & http.Server {
45+ Addr : addr ,
46+ Handler : s .Router ,
47+ }
48+
49+ go func () {
50+ slog .Info ("server starting" , "addr" , addr )
51+ if err := srv .ListenAndServe (); err != nil && ! errors .Is (err , http .ErrServerClosed ) {
52+ slog .Error ("server failed" , "error" , err )
53+ os .Exit (1 )
54+ }
55+ }()
56+
57+ quit := make (chan os.Signal , 1 )
58+ signal .Notify (quit , syscall .SIGINT , syscall .SIGTERM )
59+ <- quit
60+
61+ slog .Info ("shutting down server" )
62+ ctx , cancel := context .WithTimeout (context .Background (), 5 * time .Second )
63+ defer cancel ()
64+ if err := srv .Shutdown (ctx ); err != nil {
65+ slog .Error ("server forced to shutdown" , "error" , err )
4166 os .Exit (1 )
4267 }
4368}
0 commit comments