From b49a8dd99d14d24f1155d89a892ffbcdd6b472ef Mon Sep 17 00:00:00 2001
From: withchao <993506633@qq.com>
Date: Mon, 4 Nov 2024 11:36:20 +0800
Subject: [PATCH] feat: support text ping pong

---
 internal/msggateway/client.go          | 30 +++++++++++++++++++++++---
 internal/msggateway/message_handler.go | 11 ++++++++++
 2 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/internal/msggateway/client.go b/internal/msggateway/client.go
index bc06fa950..99598d521 100644
--- a/internal/msggateway/client.go
+++ b/internal/msggateway/client.go
@@ -16,6 +16,7 @@ package msggateway
 
 import (
 	"context"
+	"encoding/json"
 	"fmt"
 	"runtime/debug"
 	"sync"
@@ -159,9 +160,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)
@@ -419,3 +423,23 @@ 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
+		}
+		return c.conn.WriteMessage(MessageText, msgData)
+	default:
+		return fmt.Errorf("not support message type %s", msg.Type)
+	}
+}
diff --git a/internal/msggateway/message_handler.go b/internal/msggateway/message_handler.go
index 4b78c1004..5407ba90c 100644
--- a/internal/msggateway/message_handler.go
+++ b/internal/msggateway/message_handler.go
@@ -16,6 +16,7 @@ package msggateway
 
 import (
 	"context"
+	"encoding/json"
 	"sync"
 
 	"github.com/go-playground/validator/v10"
@@ -31,6 +32,16 @@ import (
 	"github.com/openimsdk/tools/utils/jsonutil"
 )
 
+const (
+	TextPing = "ping"
+	TextPong = "pong"
+)
+
+type TextMessage struct {
+	Type string          `json:"type"`
+	Body json.RawMessage `json:"body"`
+}
+
 type Req struct {
 	ReqIdentifier int32  `json:"reqIdentifier" validate:"required"`
 	Token         string `json:"token"`