web_ui.go 983 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package main
  2. import (
  3. "context"
  4. "embed"
  5. "io/fs"
  6. "net/http"
  7. "time"
  8. )
  9. //go:embed web/*
  10. var webRootFS embed.FS
  11. type WebUI struct {
  12. fs fs.FS
  13. mux *http.ServeMux
  14. server *http.Server
  15. }
  16. func NewWebUI(addr string) (*WebUI, error) {
  17. sub, err := fs.Sub(webRootFS, "web")
  18. if err != nil {
  19. return nil, err
  20. }
  21. mux := http.NewServeMux()
  22. static := http.FileServer(http.FS(sub))
  23. mux.Handle(
  24. "/static/",
  25. static,
  26. )
  27. registerRoutes(mux)
  28. return &WebUI{
  29. fs: sub,
  30. mux: mux,
  31. server: &http.Server{
  32. Addr: addr,
  33. Handler: mux,
  34. },
  35. }, nil
  36. }
  37. func (ui *WebUI) Start() error {
  38. startSessionCleaner() // session过期自动回收
  39. ui.mux.HandleFunc("/", ui.rootHandler)
  40. return ui.server.ListenAndServe()
  41. }
  42. func (ui *WebUI) Stop() error {
  43. if ui.server == nil {
  44. return nil
  45. }
  46. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  47. defer cancel()
  48. err := ui.server.Shutdown(ctx)
  49. if err != nil {
  50. _ = ui.server.Close()
  51. }
  52. return err
  53. }