| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package main
- import (
- "context"
- "embed"
- "io/fs"
- "net/http"
- "time"
- )
- //go:embed web/*
- var webRootFS embed.FS
- type WebUI struct {
- fs fs.FS
- mux *http.ServeMux
- server *http.Server
- }
- func NewWebUI(addr string) (*WebUI, error) {
- sub, err := fs.Sub(webRootFS, "web")
- if err != nil {
- return nil, err
- }
- mux := http.NewServeMux()
- static := http.FileServer(http.FS(sub))
- mux.Handle(
- "/static/",
- static,
- )
- registerRoutes(mux)
- return &WebUI{
- fs: sub,
- mux: mux,
- server: &http.Server{
- Addr: addr,
- Handler: mux,
- },
- }, nil
- }
- func (ui *WebUI) Start() error {
- startSessionCleaner() // session过期自动回收
- ui.mux.HandleFunc("/", ui.rootHandler)
- return ui.server.ListenAndServe()
- }
- func (ui *WebUI) Stop() error {
- if ui.server == nil {
- return nil
- }
- ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
- defer cancel()
- if err := ui.server.Shutdown(ctx); err != nil {
- ui.server.Close()
- return err
- }
- return nil
- }
|