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  }