package sipguardian import ( "sync" "github.com/caddyserver/caddy/v2" ) // Global registry to share guardian instances across modules var ( guardianRegistry = make(map[string]*SIPGuardian) registryMu sync.RWMutex ) // GetOrCreateGuardian returns a shared guardian instance by name func GetOrCreateGuardian(ctx caddy.Context, name string) (*SIPGuardian, error) { if name == "" { name = "default" } registryMu.Lock() defer registryMu.Unlock() if g, exists := guardianRegistry[name]; exists { return g, nil } // Create new guardian g := &SIPGuardian{} if err := g.Provision(ctx); err != nil { return nil, err } guardianRegistry[name] = g return g, nil } // GetGuardian returns an existing guardian instance func GetGuardian(name string) *SIPGuardian { if name == "" { name = "default" } registryMu.RLock() defer registryMu.RUnlock() return guardianRegistry[name] } // ListGuardians returns all guardian names func ListGuardians() []string { registryMu.RLock() defer registryMu.RUnlock() names := make([]string, 0, len(guardianRegistry)) for name := range guardianRegistry { names = append(names, name) } return names }