package websocket import ( "net/http" "time" uuid "github.com/satori/go.uuid" ) const ( // DefaultWriteTimeout is default value of Write Timeout DefaultWriteTimeout = 0 // DefaultReadTimeout is default value of Read Timeout DefaultReadTimeout = 0 // DefaultPongTimeout is default value of Pong Timeout DefaultPongTimeout = 60 * time.Second // DefaultPingTimeout is default value of Ping Timeout DefaultPingTimeout = 10 * time.Second // DefaultPingPeriod is default value of Ping Period DefaultPingPeriod = (DefaultPongTimeout * 9) / 10 // DefaultMaxMessageSize is default value of Max Message Size DefaultMaxMessageSize = 1024 // DefaultReadBufferSize is default value of Read Buffer Size DefaultReadBufferSize = 4096 // DefaultWriteBufferSize is default value of Write Buffer Size DefaultWriteBufferSize = 4096 ) var ( // DefaultIDGenerator returns the UUID of the client DefaultIDGenerator = func(*http.Request) string { return uuid.NewV4().String() } ) type ( // OptionSetter sets a configuration field to the websocket config // used to help developers to write less and configure only what they really want and nothing else OptionSetter interface { Set(o *Options) } // OptionSet implements the OptionSetter OptionSet func(o *Options) ) // Set is the func which makes the OptionSet an OptionSetter, this is used mostly func (os OptionSet) Set(o *Options) { os(o) } // Options is configuration of the websocket server type Options struct { Error func(res http.ResponseWriter, req *http.Request, status int, reason error) CheckOrigin func(req *http.Request) bool WriteTimeout time.Duration ReadTimeout time.Duration PongTimeout time.Duration PingTimeout time.Duration PingPeriod time.Duration MaxMessageSize int64 BinaryMessage bool ReadBufferSize int WriteBufferSize int IDGenerator func(*http.Request) string } // Set is the func which makes the OptionSet an OptionSetter, this is used mostly func (o *Options) Set(main *Options) { main.Error = o.Error main.CheckOrigin = o.CheckOrigin main.WriteTimeout = o.WriteTimeout main.ReadTimeout = o.ReadTimeout main.PongTimeout = o.PongTimeout main.PingTimeout = o.PingTimeout main.PingPeriod = o.PingPeriod main.MaxMessageSize = o.MaxMessageSize main.BinaryMessage = o.BinaryMessage main.ReadBufferSize = o.ReadBufferSize main.WriteBufferSize = o.WriteBufferSize main.IDGenerator = o.IDGenerator } // Error sets the error handler func Error(val func(res http.ResponseWriter, req *http.Request, status int, reason error)) OptionSet { return func(o *Options) { o.Error = val } } // CheckOrigin sets a handler which will check if different origin(domains) are allowed to contact with // the websocket server func CheckOrigin(val func(req *http.Request) bool) OptionSet { return func(o *Options) { o.CheckOrigin = val } } // WriteTimeout time allowed to write a message to the connection. // Default value is 15 * time.Second func WriteTimeout(val time.Duration) OptionSet { return func(o *Options) { o.WriteTimeout = val } } // ReadTimeout time allowed to read a message from the connection. // Default value is 15 * time.Second func ReadTimeout(val time.Duration) OptionSet { return func(o *Options) { o.ReadTimeout = val } } // PongTimeout allowed to read the next pong message from the connection // Default value is 60 * time.Second func PongTimeout(val time.Duration) OptionSet { return func(o *Options) { o.PongTimeout = val } } // PingTimeout allowed to send the ping message to the connection // Default value is 10 * time.Second func PingTimeout(val time.Duration) OptionSet { return func(o *Options) { o.PingTimeout = val } } // PingPeriod send ping messages to the connection with this period. Must be less than PongTimeout // Default value is (PongTimeout * 9) / 10 func PingPeriod(val time.Duration) OptionSet { return func(o *Options) { o.PingPeriod = val } } // MaxMessageSize max message size allowed from connection // Default value is 1024 func MaxMessageSize(val int64) OptionSet { return func(o *Options) { o.MaxMessageSize = val } } // BinaryMessage set it to true in order to denotes binary data messages instead of utf-8 text // compatible if you wanna use the Connection's EmitMessage to send a custom binary data to the client, // like a native server-client communication. // defaults to false func BinaryMessage(val bool) OptionSet { return func(o *Options) { o.BinaryMessage = val } } // ReadBufferSize is the buffer size for the underline reader func ReadBufferSize(val int) OptionSet { return func(o *Options) { o.ReadBufferSize = val } } // WriteBufferSize is the buffer size for the underline writer func WriteBufferSize(val int) OptionSet { return func(o *Options) { o.WriteBufferSize = val } } // IDGenerator used to create (and later on, set) // an ID for each incoming websocket connections (clients). // The request is an argument which you can use to generate the ID (from headers for example). // If empty then the ID is generated by func: uuid.NewV4().String() func IDGenerator(val func(*http.Request) string) OptionSet { return func(o *Options) { o.IDGenerator = val } } // Validate validates the configuration func (o *Options) Validate() { if o.WriteTimeout < 0 { o.WriteTimeout = DefaultWriteTimeout } if o.ReadTimeout < 0 { o.ReadTimeout = DefaultReadTimeout } if o.PongTimeout < 0 { o.PongTimeout = DefaultPongTimeout } if o.PingPeriod <= 0 { o.PingPeriod = DefaultPingPeriod } if o.MaxMessageSize <= 0 { o.MaxMessageSize = DefaultMaxMessageSize } if o.ReadBufferSize <= 0 { o.ReadBufferSize = DefaultReadBufferSize } if o.WriteBufferSize <= 0 { o.WriteBufferSize = DefaultWriteBufferSize } if o.Error == nil { o.Error = func(res http.ResponseWriter, req *http.Request, status int, reason error) { } } if o.CheckOrigin == nil { o.CheckOrigin = func(req *http.Request) bool { return true } } if o.IDGenerator == nil { o.IDGenerator = DefaultIDGenerator } }