package tunnelstate import ( "sync" "github.com/rs/zerolog" "github.com/cloudflare/cloudflared/connection" ) type ConnTracker struct { sync.RWMutex isConnected map[int]bool log *zerolog.Logger } func NewConnTracker(log *zerolog.Logger) *ConnTracker { return &ConnTracker{ isConnected: make(map[int]bool, 0), log: log, } } func MockedConnTracker(mocked map[int]bool) *ConnTracker { return &ConnTracker{ isConnected: mocked, } } func (ct *ConnTracker) OnTunnelEvent(c connection.Event) { switch c.EventType { case connection.Connected: ct.Lock() ct.isConnected[int(c.Index)] = true ct.Unlock() case connection.Disconnected, connection.Reconnecting, connection.RegisteringTunnel, connection.Unregistering: ct.Lock() ct.isConnected[int(c.Index)] = false ct.Unlock() default: ct.log.Error().Msgf("Unknown connection event case %v", c) } } func (ct *ConnTracker) CountActiveConns() uint { ct.RLock() defer ct.RUnlock() active := uint(0) for _, connected := range ct.isConnected { if connected { active++ } } return active }