From 09e23b8822df34db0d1e778fdd7d5ca594f1f5c7 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Sat, 2 May 2026 04:38:54 +0900 Subject: [PATCH] cmd/pkgserver: move API implementation to package For moving into cmd/mbf. Signed-off-by: Ophestra --- .gitignore | 2 +- cmd/pkgserver/index_test.go | 14 ---------- cmd/pkgserver/{ => internal/pkgserver}/api.go | 28 ++++++++++++++++++- .../{ => internal/pkgserver}/api_test.go | 2 +- .../{ => internal/pkgserver}/index.go | 2 +- .../pkgserver/index_test.go} | 13 ++++++++- .../{ => internal/pkgserver}/search.go | 2 +- .../internal/{ => pkgserver}/ui/index.html | 0 .../internal/{ => pkgserver}/ui/index.ts | 0 .../internal/{ => pkgserver}/ui/style.css | 0 .../internal/{ => pkgserver}/ui/tsconfig.json | 0 .../internal/{ => pkgserver}/ui/ui.go | 0 .../internal/{ => pkgserver}/ui/ui_full.go | 0 .../internal/{ => pkgserver}/ui/ui_stub.go | 0 cmd/pkgserver/main.go | 25 ++++------------- 15 files changed, 49 insertions(+), 39 deletions(-) delete mode 100644 cmd/pkgserver/index_test.go rename cmd/pkgserver/{ => internal/pkgserver}/api.go (89%) rename cmd/pkgserver/{ => internal/pkgserver}/api_test.go (99%) rename cmd/pkgserver/{ => internal/pkgserver}/index.go (99%) rename cmd/pkgserver/{main_test.go => internal/pkgserver/index_test.go} (87%) rename cmd/pkgserver/{ => internal/pkgserver}/search.go (99%) rename cmd/pkgserver/internal/{ => pkgserver}/ui/index.html (100%) rename cmd/pkgserver/internal/{ => pkgserver}/ui/index.ts (100%) rename cmd/pkgserver/internal/{ => pkgserver}/ui/style.css (100%) rename cmd/pkgserver/internal/{ => pkgserver}/ui/tsconfig.json (100%) rename cmd/pkgserver/internal/{ => pkgserver}/ui/ui.go (100%) rename cmd/pkgserver/internal/{ => pkgserver}/ui/ui_full.go (100%) rename cmd/pkgserver/internal/{ => pkgserver}/ui/ui_stub.go (100%) diff --git a/.gitignore b/.gitignore index 488373ff..d586aa09 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ # go generate /cmd/hakurei/LICENSE -/cmd/pkgserver/internal/ui/static +/cmd/pkgserver/internal/pkgserver/ui/static /internal/pkg/testdata/testtool /internal/rosa/hakurei_current.tar.gz diff --git a/cmd/pkgserver/index_test.go b/cmd/pkgserver/index_test.go deleted file mode 100644 index 1e4e1048..00000000 --- a/cmd/pkgserver/index_test.go +++ /dev/null @@ -1,14 +0,0 @@ -package main - -import "testing" - -// newIndex returns the address of a newly populated packageIndex. -func newIndex(t *testing.T) *packageIndex { - t.Helper() - - var index packageIndex - if err := index.populate(nil); err != nil { - t.Fatalf("populate: error = %v", err) - } - return &index -} diff --git a/cmd/pkgserver/api.go b/cmd/pkgserver/internal/pkgserver/api.go similarity index 89% rename from cmd/pkgserver/api.go rename to cmd/pkgserver/internal/pkgserver/api.go index fb41f126..599ea522 100644 --- a/cmd/pkgserver/api.go +++ b/cmd/pkgserver/internal/pkgserver/api.go @@ -1,6 +1,8 @@ -package main +// Package pkgserver implements the package metadata service backend. +package pkgserver import ( + "context" "encoding/json" "log" "net/http" @@ -8,6 +10,7 @@ import ( "path" "strconv" "sync" + "time" "hakurei.app/internal/info" "hakurei.app/internal/rosa" @@ -158,6 +161,29 @@ func (index *packageIndex) registerAPI(mux *http.ServeMux) { mux.HandleFunc("GET /status/", index.newStatusHandler(true)) } +// Register arranges for mux to service API requests. +func Register(ctx context.Context, mux *http.ServeMux, report *rosa.Report) error { + var index packageIndex + index.search = make(searchCache) + if err := index.populate(report); err != nil { + return err + } + ticker := time.NewTicker(1 * time.Minute) + go func() { + for { + select { + case <-ctx.Done(): + ticker.Stop() + return + case <-ticker.C: + index.search.clean() + } + } + }() + index.registerAPI(mux) + return nil +} + // writeAPIPayload sets headers common to API responses and encodes payload as // JSON for the response body. func writeAPIPayload(w http.ResponseWriter, payload any) { diff --git a/cmd/pkgserver/api_test.go b/cmd/pkgserver/internal/pkgserver/api_test.go similarity index 99% rename from cmd/pkgserver/api_test.go rename to cmd/pkgserver/internal/pkgserver/api_test.go index 2f58af28..8449c234 100644 --- a/cmd/pkgserver/api_test.go +++ b/cmd/pkgserver/internal/pkgserver/api_test.go @@ -1,4 +1,4 @@ -package main +package pkgserver import ( "net/http" diff --git a/cmd/pkgserver/index.go b/cmd/pkgserver/internal/pkgserver/index.go similarity index 99% rename from cmd/pkgserver/index.go rename to cmd/pkgserver/internal/pkgserver/index.go index 536fd83a..911183da 100644 --- a/cmd/pkgserver/index.go +++ b/cmd/pkgserver/internal/pkgserver/index.go @@ -1,4 +1,4 @@ -package main +package pkgserver import ( "cmp" diff --git a/cmd/pkgserver/main_test.go b/cmd/pkgserver/internal/pkgserver/index_test.go similarity index 87% rename from cmd/pkgserver/main_test.go rename to cmd/pkgserver/internal/pkgserver/index_test.go index c2a8e71b..8f3b5530 100644 --- a/cmd/pkgserver/main_test.go +++ b/cmd/pkgserver/internal/pkgserver/index_test.go @@ -1,4 +1,4 @@ -package main +package pkgserver import ( "bytes" @@ -10,6 +10,17 @@ import ( "testing" ) +// newIndex returns the address of a newly populated packageIndex. +func newIndex(t *testing.T) *packageIndex { + t.Helper() + + var index packageIndex + if err := index.populate(nil); err != nil { + t.Fatalf("populate: error = %v", err) + } + return &index +} + // checkStatus checks response status code. func checkStatus(t *testing.T, resp *http.Response, want int) { t.Helper() diff --git a/cmd/pkgserver/search.go b/cmd/pkgserver/internal/pkgserver/search.go similarity index 99% rename from cmd/pkgserver/search.go rename to cmd/pkgserver/internal/pkgserver/search.go index 4ce1e256..5756512f 100644 --- a/cmd/pkgserver/search.go +++ b/cmd/pkgserver/internal/pkgserver/search.go @@ -1,4 +1,4 @@ -package main +package pkgserver import ( "cmp" diff --git a/cmd/pkgserver/internal/ui/index.html b/cmd/pkgserver/internal/pkgserver/ui/index.html similarity index 100% rename from cmd/pkgserver/internal/ui/index.html rename to cmd/pkgserver/internal/pkgserver/ui/index.html diff --git a/cmd/pkgserver/internal/ui/index.ts b/cmd/pkgserver/internal/pkgserver/ui/index.ts similarity index 100% rename from cmd/pkgserver/internal/ui/index.ts rename to cmd/pkgserver/internal/pkgserver/ui/index.ts diff --git a/cmd/pkgserver/internal/ui/style.css b/cmd/pkgserver/internal/pkgserver/ui/style.css similarity index 100% rename from cmd/pkgserver/internal/ui/style.css rename to cmd/pkgserver/internal/pkgserver/ui/style.css diff --git a/cmd/pkgserver/internal/ui/tsconfig.json b/cmd/pkgserver/internal/pkgserver/ui/tsconfig.json similarity index 100% rename from cmd/pkgserver/internal/ui/tsconfig.json rename to cmd/pkgserver/internal/pkgserver/ui/tsconfig.json diff --git a/cmd/pkgserver/internal/ui/ui.go b/cmd/pkgserver/internal/pkgserver/ui/ui.go similarity index 100% rename from cmd/pkgserver/internal/ui/ui.go rename to cmd/pkgserver/internal/pkgserver/ui/ui.go diff --git a/cmd/pkgserver/internal/ui/ui_full.go b/cmd/pkgserver/internal/pkgserver/ui/ui_full.go similarity index 100% rename from cmd/pkgserver/internal/ui/ui_full.go rename to cmd/pkgserver/internal/pkgserver/ui/ui_full.go diff --git a/cmd/pkgserver/internal/ui/ui_stub.go b/cmd/pkgserver/internal/pkgserver/ui/ui_stub.go similarity index 100% rename from cmd/pkgserver/internal/ui/ui_stub.go rename to cmd/pkgserver/internal/pkgserver/ui/ui_stub.go diff --git a/cmd/pkgserver/main.go b/cmd/pkgserver/main.go index c1ca4c94..62ba15ab 100644 --- a/cmd/pkgserver/main.go +++ b/cmd/pkgserver/main.go @@ -10,9 +10,11 @@ import ( "syscall" "time" - "hakurei.app/cmd/pkgserver/internal/ui" "hakurei.app/command" "hakurei.app/internal/rosa" + + "hakurei.app/cmd/pkgserver/internal/pkgserver" + "hakurei.app/cmd/pkgserver/internal/pkgserver/ui" ) const shutdownTimeout = 15 * time.Second @@ -48,26 +50,11 @@ func main() { return errors.New("pkgserver requires 1 argument") } - var index packageIndex - index.search = make(searchCache) - if err := index.populate(report); err != nil { - return err - } - ticker := time.NewTicker(1 * time.Minute) - go func() { - for { - select { - case <-ctx.Done(): - ticker.Stop() - return - case <-ticker.C: - index.search.clean() - } - } - }() var mux http.ServeMux ui.Register(&mux) - index.registerAPI(&mux) + if err := pkgserver.Register(ctx, &mux, report); err != nil { + return err + } server := http.Server{ Addr: flagAddr, Handler: &mux,