package main
import (
"context"
"errors"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
agentfeedback "github.com/open-software-network/os-epode/sdk/go"
)
func main() {
if err := run(); err != nil { log.Fatal(err) }
}
func run() error {
router := http.NewServeMux()
router.HandleFunc("GET /search", searchHandler)
feedback, err := agentfeedback.New(agentfeedback.Options{
APIKey: os.Getenv("AGENT_FEEDBACK_KEY"),
Include: []string{"/search", "/docs/**"},
AccountRef: func(r *http.Request) string {
return accountID(r.Context())
},
UserRef: func(r *http.Request) string {
return userID(r.Context())
},
AnonymousRef: func(r *http.Request) string {
return firstPartyVisitorID(r.Context())
},
CustomerRef: func(r *http.Request) string {
return accountID(r.Context()) // durable Ask once compatibility
},
SessionRef: func(r *http.Request) string {
return productJourneyID(r.Context()) // optional server-issued journey
},
})
if err != nil { return err }
instrumented := feedback.Middleware(router)
handler := authenticateProductRequest(selectAuthorizedTenant(instrumented))
server := &http.Server{
Addr: ":8080", Handler: handler, ReadHeaderTimeout: 5 * time.Second,
}
serverErrors := make(chan error, 1)
go func() { serverErrors <- server.ListenAndServe() }()
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
defer signal.Stop(signals)
var serveErr error
select {
case <-signals:
case err := <-serverErrors:
if !errors.Is(err, http.ErrServerClosed) { serveErr = err }
}
serverContext, cancelServer := context.WithTimeout(context.Background(), 5*time.Second)
serverErr := server.Shutdown(serverContext)
cancelServer()
feedbackContext, cancelFeedback := context.WithTimeout(context.Background(), 5*time.Second)
feedbackErr := feedback.Shutdown(feedbackContext)
cancelFeedback()
return errors.Join(serveErr, serverErr, feedbackErr)
}