global.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // Package global provides global variables and interfaces for accessing web and subscription servers.
  2. package global
  3. import (
  4. "context"
  5. "sync"
  6. _ "unsafe"
  7. "github.com/robfig/cron/v3"
  8. )
  9. var (
  10. webServer WebServer
  11. subServer SubServer
  12. restartHookMu sync.RWMutex
  13. restartHook func()
  14. )
  15. // WebServer interface defines methods for accessing the web server instance.
  16. type WebServer interface {
  17. GetCron() *cron.Cron // Get the cron scheduler
  18. GetCtx() context.Context // Get the server context
  19. GetWSHub() any // Get the WebSocket hub (using any to avoid circular dependency)
  20. }
  21. // SubServer interface defines methods for accessing the subscription server instance.
  22. type SubServer interface {
  23. GetCtx() context.Context // Get the server context
  24. }
  25. // SetWebServer sets the global web server instance.
  26. func SetWebServer(s WebServer) {
  27. webServer = s
  28. }
  29. // GetWebServer returns the global web server instance.
  30. func GetWebServer() WebServer {
  31. return webServer
  32. }
  33. // SetSubServer sets the global subscription server instance.
  34. func SetSubServer(s SubServer) {
  35. subServer = s
  36. }
  37. // GetSubServer returns the global subscription server instance.
  38. func GetSubServer() SubServer {
  39. return subServer
  40. }
  41. // SetRestartHook registers a callback that triggers an in-process panel
  42. // restart. main.go sets this up to push SIGHUP into its own signal channel
  43. // so the restart path works on Windows (where p.Signal(SIGHUP) is unsupported).
  44. func SetRestartHook(fn func()) {
  45. restartHookMu.Lock()
  46. defer restartHookMu.Unlock()
  47. restartHook = fn
  48. }
  49. // TriggerRestart fires the registered restart hook. Returns false if none is set.
  50. func TriggerRestart() bool {
  51. restartHookMu.RLock()
  52. fn := restartHook
  53. restartHookMu.RUnlock()
  54. if fn == nil {
  55. return false
  56. }
  57. fn()
  58. return true
  59. }