cmd/pkgserver: move API implementation to package

For moving into cmd/mbf.

Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
2026-05-02 04:38:54 +09:00
parent 4ed20098c9
commit 09e23b8822
15 changed files with 49 additions and 39 deletions

2
.gitignore vendored
View File

@@ -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

View File

@@ -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
}

View File

@@ -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) {

View File

@@ -1,4 +1,4 @@
package main
package pkgserver
import (
"net/http"

View File

@@ -1,4 +1,4 @@
package main
package pkgserver
import (
"cmp"

View File

@@ -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()

View File

@@ -1,4 +1,4 @@
package main
package pkgserver
import (
"cmp"

View File

@@ -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,