|
|
|
@ -16,6 +16,7 @@ package msggateway
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"fmt"
|
|
|
|
|
"runtime/debug"
|
|
|
|
|
"sync"
|
|
|
|
@ -69,6 +70,8 @@ type Client struct {
|
|
|
|
|
IsCompress bool `json:"isCompress"`
|
|
|
|
|
UserID string `json:"userID"`
|
|
|
|
|
IsBackground bool `json:"isBackground"`
|
|
|
|
|
SDKType string `json:"sdkType"`
|
|
|
|
|
Encoder Encoder
|
|
|
|
|
ctx *UserConnContext
|
|
|
|
|
longConnServer LongConnServer
|
|
|
|
|
closed atomic.Bool
|
|
|
|
@ -94,11 +97,17 @@ func (c *Client) ResetClient(ctx *UserConnContext, conn LongConn, longConnServer
|
|
|
|
|
c.closed.Store(false)
|
|
|
|
|
c.closedErr = nil
|
|
|
|
|
c.token = ctx.GetToken()
|
|
|
|
|
c.SDKType = ctx.GetSDKType()
|
|
|
|
|
c.hbCtx, c.hbCancel = context.WithCancel(c.ctx)
|
|
|
|
|
c.subLock = new(sync.Mutex)
|
|
|
|
|
if c.subUserIDs != nil {
|
|
|
|
|
clear(c.subUserIDs)
|
|
|
|
|
}
|
|
|
|
|
if c.SDKType == GoSDK {
|
|
|
|
|
c.Encoder = NewGobEncoder()
|
|
|
|
|
} else {
|
|
|
|
|
c.Encoder = NewJsonEncoder()
|
|
|
|
|
}
|
|
|
|
|
c.subUserIDs = make(map[string]struct{})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -159,9 +168,12 @@ func (c *Client) readMessage() {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
case MessageText:
|
|
|
|
|
c.closedErr = ErrNotSupportMessageProtocol
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
_ = c.conn.SetReadDeadline(pongWait)
|
|
|
|
|
parseDataErr := c.handlerTextMessage(message)
|
|
|
|
|
if parseDataErr != nil {
|
|
|
|
|
c.closedErr = parseDataErr
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
case PingMessage:
|
|
|
|
|
err := c.writePongMsg("")
|
|
|
|
|
log.ZError(c.ctx, "writePongMsg", err)
|
|
|
|
@ -188,7 +200,7 @@ func (c *Client) handleMessage(message []byte) error {
|
|
|
|
|
var binaryReq = getReq()
|
|
|
|
|
defer freeReq(binaryReq)
|
|
|
|
|
|
|
|
|
|
err := c.longConnServer.Decode(message, binaryReq)
|
|
|
|
|
err := c.Encoder.Decode(message, binaryReq)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
@ -335,7 +347,7 @@ func (c *Client) writeBinaryMsg(resp Resp) error {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
encodedBuf, err := c.longConnServer.Encode(resp)
|
|
|
|
|
encodedBuf, err := c.Encoder.Encode(resp)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
@ -419,3 +431,26 @@ func (c *Client) writePongMsg(appData string) error {
|
|
|
|
|
|
|
|
|
|
return errs.Wrap(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Client) handlerTextMessage(b []byte) error {
|
|
|
|
|
var msg TextMessage
|
|
|
|
|
if err := json.Unmarshal(b, &msg); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
switch msg.Type {
|
|
|
|
|
case TextPong:
|
|
|
|
|
return nil
|
|
|
|
|
case TextPing:
|
|
|
|
|
msg.Type = TextPong
|
|
|
|
|
msgData, err := json.Marshal(msg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if err := c.conn.SetWriteDeadline(writeWait); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return c.conn.WriteMessage(MessageText, msgData)
|
|
|
|
|
default:
|
|
|
|
|
return fmt.Errorf("not support message type %s", msg.Type)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|