github.com/isyscore/isc-gobase@v1.5.3-0.20231218061332-cbc7451899e9/websocket/config.go (about) 1 package websocket 2 3 import ( 4 "math/rand" 5 "net/http" 6 "time" 7 8 "github.com/gin-gonic/gin" 9 uuid "github.com/iris-contrib/go.uuid" 10 ) 11 12 const ( 13 DefaultWebsocketWriteTimeout = 0 14 DefaultWebsocketReadTimeout = 0 15 DefaultWebsocketPongTimeout = 60 * time.Second 16 DefaultWebsocketPingPeriod = (DefaultWebsocketPongTimeout * 9) / 10 17 DefaultWebsocketMaxMessageSize = 1024 18 DefaultWebsocketReadBufferSize = 4096 19 DefaultWebsocketWriterBufferSize = 4096 20 DefaultEvtMessageKey = "gin-websocket-message:" 21 22 letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 23 letterIdxBits = 6 24 letterIdxMask = 1<<letterIdxBits - 1 25 letterIdxMax = 63 / letterIdxBits 26 ) 27 28 var ( 29 DefaultIDGenerator = func(*gin.Context) string { 30 id, err := uuid.NewV4() 31 if err != nil { 32 return randomString(64) 33 } 34 return id.String() 35 } 36 37 src = rand.NewSource(time.Now().UnixNano()) 38 ) 39 40 type Config struct { 41 IDGenerator func(ctx *gin.Context) string 42 EvtMessagePrefix []byte 43 Error func(w http.ResponseWriter, r *http.Request, status int, reason error) 44 CheckOrigin func(r *http.Request) bool 45 HandshakeTimeout time.Duration 46 WriteTimeout time.Duration 47 ReadTimeout time.Duration 48 PongTimeout time.Duration 49 PingPeriod time.Duration 50 MaxMessageSize int64 51 BinaryMessages bool 52 ReadBufferSize int 53 WriteBufferSize int 54 EnableCompression bool 55 Subprotocols []string 56 } 57 58 func (c Config) Validate() Config { 59 if c.WriteTimeout < 0 { 60 c.WriteTimeout = DefaultWebsocketWriteTimeout 61 } 62 if c.ReadTimeout < 0 { 63 c.ReadTimeout = DefaultWebsocketReadTimeout 64 } 65 if c.PongTimeout < 0 { 66 c.PongTimeout = DefaultWebsocketPongTimeout 67 } 68 if c.PingPeriod <= 0 { 69 c.PingPeriod = DefaultWebsocketPingPeriod 70 } 71 if c.MaxMessageSize <= 0 { 72 c.MaxMessageSize = DefaultWebsocketMaxMessageSize 73 } 74 if c.ReadBufferSize <= 0 { 75 c.ReadBufferSize = DefaultWebsocketReadBufferSize 76 } 77 if c.WriteBufferSize <= 0 { 78 c.WriteBufferSize = DefaultWebsocketWriterBufferSize 79 } 80 if c.Error == nil { 81 c.Error = func(w http.ResponseWriter, r *http.Request, status int, reason error) { 82 //empty 83 } 84 } 85 if c.CheckOrigin == nil { 86 c.CheckOrigin = func(r *http.Request) bool { 87 // allow all connections by default 88 return true 89 } 90 } 91 if len(c.EvtMessagePrefix) == 0 { 92 c.EvtMessagePrefix = []byte(DefaultEvtMessageKey) 93 } 94 if c.IDGenerator == nil { 95 c.IDGenerator = DefaultIDGenerator 96 } 97 return c 98 } 99 100 func random(n int) []byte { 101 b := make([]byte, n) 102 for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; { 103 if remain == 0 { 104 cache, remain = src.Int63(), letterIdxMax 105 } 106 if idx := int(cache & letterIdxMask); idx < len(letterBytes) { 107 b[i] = letterBytes[idx] 108 i-- 109 } 110 cache >>= letterIdxBits 111 remain-- 112 } 113 114 return b 115 } 116 117 func randomString(n int) string { 118 return string(random(n)) 119 }