You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

89 lines
2.1 KiB

package server
import (
"context"
"fmt"
"github.com/gorilla/websocket"
"runtime/debug"
"sonet/internal/gateway_ws/session"
"sonet/pkg/grpc/generic"
"sonet/pkg/protocol"
"sonet/pkg/utils/logger"
)
type ConnHandler struct {
grpcFactory *generic.GrpcGenericClientFactory
}
func NewConnHandler(grpcFactory *generic.GrpcGenericClientFactory) *ConnHandler {
return &ConnHandler{
grpcFactory: grpcFactory,
}
}
func (c *ConnHandler) handleConn(conn *websocket.Conn) {
client := session.NewNetClient(conn, ReadDeadline, WriteDeadline)
defer func() {
// 捕获其他错误
if r := recover(); r != nil {
logger.Error("NetClient recover error: ", r)
// 输出堆栈信息
logger.Error("NetClient recover error stack: ", string(debug.Stack()))
}
}()
defer client.Close()
for {
message, err := client.ReadMessage()
if err != nil {
// TODO 连接关闭,mq发送关闭事件
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) {
logger.Error("unexpected close error: ", err)
} else {
// 读失败
logger.Errorf("NetClient ReadMessage error: %T, %v", err, err)
}
return
}
payload, err := protocol.Decode(message)
if err != nil {
logger.Errorf("decode message error: len=%d", len(message), err)
return
}
fmt.Printf("%v\n", payload)
// grpc generic call
ctx := context.Background()
grpcClient, err := c.grpcFactory.GetClient(ctx, payload.Header.Svc)
if err != nil {
logger.Error("get grpc generic client error: ", err)
continue
}
resp, err := grpcClient.InvokeUnary(ctx, payload.Header.Target, payload.Body)
if err != nil {
logger.Error("grpc generic call error: ", err)
continue
}
fmt.Println(resp)
// write response
payload.Header.Type = protocol.TypeResponse
payload.Header.Svc = ""
payload.Header.Target = ""
payload.Body, err = resp.Marshal()
if err != nil {
logger.Error("generic call response marshal error: ", err)
continue
}
resMessage, err := protocol.Encode(payload)
if err != nil {
logger.Error("grpc generic call error: ", err)
continue
}
client.MustWrite(resMessage)
}
}