manager.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package runtime
  2. import (
  3. "errors"
  4. "sync"
  5. "github.com/mhsanaei/3x-ui/v3/database"
  6. "github.com/mhsanaei/3x-ui/v3/database/model"
  7. )
  8. type Manager struct {
  9. local Runtime
  10. mu sync.RWMutex
  11. remotes map[int]*Remote
  12. }
  13. func NewManager(localDeps LocalDeps) *Manager {
  14. return &Manager{
  15. local: NewLocal(localDeps),
  16. remotes: make(map[int]*Remote),
  17. }
  18. }
  19. func (m *Manager) RuntimeFor(nodeID *int) (Runtime, error) {
  20. if nodeID == nil {
  21. return m.local, nil
  22. }
  23. m.mu.RLock()
  24. if rt, ok := m.remotes[*nodeID]; ok {
  25. m.mu.RUnlock()
  26. return rt, nil
  27. }
  28. m.mu.RUnlock()
  29. m.mu.Lock()
  30. defer m.mu.Unlock()
  31. if rt, ok := m.remotes[*nodeID]; ok {
  32. return rt, nil
  33. }
  34. n, err := loadNode(*nodeID)
  35. if err != nil {
  36. return nil, err
  37. }
  38. if !n.Enable {
  39. return nil, errors.New("node " + n.Name + " is disabled")
  40. }
  41. rt := NewRemote(n)
  42. m.remotes[*nodeID] = rt
  43. return rt, nil
  44. }
  45. func (m *Manager) Local() Runtime { return m.local }
  46. func (m *Manager) RemoteFor(node *model.Node) (*Remote, error) {
  47. if node == nil {
  48. return nil, errors.New("node is nil")
  49. }
  50. m.mu.RLock()
  51. if rt, ok := m.remotes[node.Id]; ok {
  52. m.mu.RUnlock()
  53. return rt, nil
  54. }
  55. m.mu.RUnlock()
  56. m.mu.Lock()
  57. defer m.mu.Unlock()
  58. if rt, ok := m.remotes[node.Id]; ok {
  59. return rt, nil
  60. }
  61. rt := NewRemote(node)
  62. m.remotes[node.Id] = rt
  63. return rt, nil
  64. }
  65. func (m *Manager) InvalidateNode(nodeID int) {
  66. m.mu.Lock()
  67. defer m.mu.Unlock()
  68. delete(m.remotes, nodeID)
  69. }
  70. func loadNode(id int) (*model.Node, error) {
  71. db := database.GetDB()
  72. n := &model.Node{}
  73. if err := db.Model(model.Node{}).Where("id = ?", id).First(n).Error; err != nil {
  74. return nil, err
  75. }
  76. return n, nil
  77. }
  78. var (
  79. managerMu sync.RWMutex
  80. manager *Manager
  81. )
  82. func SetManager(m *Manager) {
  83. managerMu.Lock()
  84. defer managerMu.Unlock()
  85. manager = m
  86. }
  87. func GetManager() *Manager {
  88. managerMu.RLock()
  89. defer managerMu.RUnlock()
  90. return manager
  91. }