package server import ( "crypto/tls" "fmt" "net" "time" ) type ConnectionHandler interface { GetConcurrency() int GetKeepAlive() time.Duration GetHandshakeTimeout() time.Duration GetTLSConfig() *tls.Config Listener(serverCtx ServerCtx) (net.Listener, error) } type ConnectionHandlers struct { ConnectionHandler // The maximum number of concurrent connections the server may serve. // // DefaultConcurrency is used if not set. Concurrency int KeepAlive time.Duration HandshakeTimeout time.Duration TLSConfig *tls.Config } func (ch *ConnectionHandlers) Listener(serverCtx ServerCtx) (net.Listener, error) { return nil, fmt.Errorf("Method[ConnectionHandler.Listener] is not implemented") } func (ch *ConnectionHandlers) GetConcurrency() int { return ch.Concurrency } func (ch *ConnectionHandlers) GetKeepAlive() time.Duration { return ch.KeepAlive } func (ch *ConnectionHandlers) GetHandshakeTimeout() time.Duration { return ch.HandshakeTimeout } func (ch *ConnectionHandlers) GetTLSConfig() *tls.Config { return ch.TLSConfig } func (ch *ConnectionHandlers) Validate() error { if ch.Concurrency <= 0 { ch.Concurrency = DefaultConcurrency } if ch.KeepAlive <= 0 { ch.KeepAlive = DefaultKeepAlive } if ch.HandshakeTimeout <= 0 { ch.HandshakeTimeout = DefaultHandshakeTimeout } return nil }