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
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) |
|
} |
|
|
|
}
|
|
|