func ReadAll(r io.Reader, b []byte) ([]byte, error) {
b = b[:0]
for {
+ if len(b) == cap(b) {
+ // Add more capacity (let append pick how much).
+ b = append(b, 0)[:len(b)]
+ }
n, err := r.Read(b[len(b):cap(b)])
b = b[:len(b)+n]
if err != nil {
}
return b, err
}
-
- if len(b) == cap(b) {
- // Add more capacity (let append pick how much).
- b = append(b, 0)[:len(b)]
- }
}
}
// rec send close
msg *msgq.MsgType[*WsMsg]
- TO int // depercated: use RTOMs WTOMs instead
- RTOMs int
- WTOMs int
- Header map[string]string
- Proxy string
+ TO int // depercated: use RTOMs WTOMs instead
+ RTOMs int
+ WTOMs int
+ BufSize int // msg buf 1: always use single buf >1: use bufs cycle
+ Header map[string]string
+ Proxy string
Ping Ping
pingT int64
if tmp.Url == "" {
return nil, errors.New(`url == ""`)
}
+ if v := config.BufSize; v <= 1 {
+ tmp.BufSize = 1
+ }
if v := config.TO; v != 0 {
tmp.RTOMs = v
tmp.WTOMs = v
}()
buf := make([]byte, humanize.KByte)
- var message []byte
+ var (
+ msgs = make([][]byte, o.BufSize)
+ cuP = 0
+ )
for {
if err := c.SetReadDeadline(time.Now().Add(time.Duration(o.RTOMs * int(time.Millisecond)))); err != nil {
o.error(err)
}
msg_type, r, err := c.NextReader()
if err == nil {
- message, err = pio.ReadAll(r, buf)
+ if msg, e := pio.ReadAll(r, buf); e != nil {
+ err = e
+ } else {
+ msgs[cuP] = append(msgs[cuP][:0], msg...)
+ cuP++
+ if cuP >= o.BufSize {
+ cuP = 0
+ }
+ }
}
if err != nil {
if e, ok := err.(*websocket.CloseError); ok {
case websocket.PingMessage:
o.msg.PushLock_tag(`send`, &WsMsg{
Type: websocket.PongMessage,
- Msg: message,
+ Msg: msgs[cuP],
})
case websocket.PongMessage:
o.pingT = time.Now().UnixMilli()
default:
o.msg.PushLock_tag(`rec`, &WsMsg{
Type: websocket.TextMessage,
- Msg: message,
+ Msg: msgs[cuP],
})
}
}