package socket import ( "sync/atomic" "time" "git.loafle.net/commons/server-go" ) type ClientConnHandler interface { server.ConnectionHandler GetReconnectInterval() time.Duration GetReconnectTryTime() int } type ClientConnHandlers struct { server.ConnectionHandlers ReconnectInterval time.Duration `json:"reconnectInterval,omitempty"` ReconnectTryTime int `json:"reconnectTryTime,omitempty"` validated atomic.Value } func (cch *ClientConnHandlers) GetReconnectInterval() time.Duration { return cch.ReconnectInterval } func (cch *ClientConnHandlers) GetReconnectTryTime() int { return cch.ReconnectTryTime } func (cch *ClientConnHandlers) Clone() *ClientConnHandlers { return &ClientConnHandlers{ ConnectionHandlers: *cch.ConnectionHandlers.Clone(), ReconnectInterval: cch.ReconnectInterval, ReconnectTryTime: cch.ReconnectTryTime, validated: cch.validated, } } func (cch *ClientConnHandlers) Validate() error { if nil != cch.validated.Load() { return nil } cch.validated.Store(true) if err := cch.ConnectionHandlers.Validate(); nil != err { return err } if cch.ReconnectInterval <= 0 { cch.ReconnectInterval = server.DefaultReconnectInterval } else { cch.ReconnectInterval = cch.ReconnectInterval * time.Second } if cch.ReconnectTryTime <= 0 { cch.ReconnectTryTime = server.DefaultReconnectTryTime } return nil }