go-kratos/app/websocket/internal/service/message_handler.go

93 lines
2.3 KiB
Go

package service
import (
"encoding/json"
"fmt"
"log"
kafkago "github.com/segmentio/kafka-go"
)
// MessageHandler 处理 Kafka 消息
type MessageHandler struct {
wsService *WebSocketService
}
// WebSocketMessage 定义 WebSocket 消息结构
type WebSocketMessage struct {
Type string `json:"type"`
Content string `json:"content"`
Payload json.RawMessage `json:"payload,omitempty"`
}
func NewMessageHandler(wsService *WebSocketService) *MessageHandler {
return &MessageHandler{
wsService: wsService,
}
}
func (h *MessageHandler) Start() error {
return nil
}
func (h *MessageHandler) Stop() error {
return nil
}
// parseJSONMessage 解析并格式化 JSON 消息
func (h *MessageHandler) parseJSONMessage(message []byte) (string, error) {
var jsonData interface{}
if err := json.Unmarshal(message, &jsonData); err != nil {
return "", fmt.Errorf("failed to parse JSON: %v", err)
}
prettyJSON, err := json.MarshalIndent(jsonData, "", " ")
if err != nil {
return "", fmt.Errorf("failed to format JSON: %v", err)
}
return string(prettyJSON), nil
}
// parseWebSocketMessage 解析为 WebSocketMessage 结构
func (h *MessageHandler) parseWebSocketMessage(message []byte) (*WebSocketMessage, error) {
var wsMsg WebSocketMessage
if err := json.Unmarshal(message, &wsMsg); err != nil {
return nil, fmt.Errorf("failed to parse WebSocket message: %v", err)
}
return &wsMsg, nil
}
func (h *MessageHandler) HandleMessage(message *kafkago.Message) error {
// 解析并打印格式化的 JSON
prettyJSON, err := h.parseJSONMessage(message.Value)
if err != nil {
log.Printf("Error parsing message: %v", err)
return err
}
fmt.Printf("Received message:\n%s\n", prettyJSON)
// 解析为 WebSocketMessage
wsMsg, err := h.parseWebSocketMessage(message.Value)
if err != nil {
log.Printf("Error parsing WebSocket message: %v", err)
return err
}
// 根据消息类型处理不同的业务逻辑
switch wsMsg.Type {
case "message":
// 处理普通消息
return h.wsService.Broadcast(message.Value)
case "broadcast":
// 广播消息给所有连接的客户端
return h.wsService.Broadcast(wsMsg.Payload)
case "private":
// 处理私聊消息
return h.wsService.SendPrivateMessage(wsMsg.Payload)
default:
log.Printf("Unknown message type: %s", wsMsg.Type)
return nil
}
}