cmd/pkgserver: gracefully shut down on signal

Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
2026-03-11 02:00:55 +09:00
parent b03ad185de
commit ce914abb57
2 changed files with 26 additions and 7 deletions

View File

@@ -8,6 +8,7 @@ import (
"os" "os"
"os/signal" "os/signal"
"syscall" "syscall"
"time"
"hakurei.app/command" "hakurei.app/command"
"hakurei.app/container/check" "hakurei.app/container/check"
@@ -16,7 +17,8 @@ import (
"hakurei.app/message" "hakurei.app/message"
) )
//go:generate sh -c "sass ui/static/dark.scss ui/static/dark.css && sass ui/static/light.scss ui/static/light.css && tsc -p ui/static" const shutdownTimeout = 15 * time.Second
func main() { func main() {
log.SetFlags(0) log.SetFlags(0)
log.SetPrefix("pkgserver: ") log.SetPrefix("pkgserver: ")
@@ -65,9 +67,23 @@ func main() {
if err := index.populate(cache, report); err != nil { if err := index.populate(cache, report); err != nil {
return err return err
} }
uiRoutes(http.DefaultServeMux)
apiRoutes(http.DefaultServeMux, &index) var mux http.ServeMux
return http.ListenAndServe(flagAddr, nil) uiRoutes(&mux)
apiRoutes(&mux, &index)
server := http.Server{
Addr: flagAddr,
Handler: &mux,
}
go func() {
<-ctx.Done()
c, cancel := context.WithTimeout(context.Background(), shutdownTimeout)
defer cancel()
if err := server.Shutdown(c); err != nil {
log.Fatal(err)
}
}()
return server.ListenAndServe()
}).Flag( }).Flag(
&flagBaseDir, &flagBaseDir,
"b", command.StringFlag(""), "b", command.StringFlag(""),
@@ -77,8 +93,10 @@ func main() {
"addr", command.StringFlag(":8067"), "addr", command.StringFlag(":8067"),
"TCP network address to listen on", "TCP network address to listen on",
) )
c.MustParse(os.Args[1:], func(e error) { c.MustParse(os.Args[1:], func(err error) {
log.Fatal(e) if errors.Is(err, http.ErrServerClosed) {
}) os.Exit(0)
}
log.Fatal(err)
})
} }

View File

@@ -5,6 +5,7 @@ import (
"net/http" "net/http"
) )
//go:generate sh -c "sass ui/static/dark.scss ui/static/dark.css && sass ui/static/light.scss ui/static/light.css && tsc -p ui/static"
//go:embed ui/* //go:embed ui/*
var content embed.FS var content embed.FS