Ai
1 Star 0 Fork 0

monobytes/gcore

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
server.go 2.49 KB
一键复制 编辑 原始数据 按行查看 历史
null 提交于 2025-01-22 18:29 +08:00 . first commit
package node
import (
"context"
"gitee.com/monobytes/gcore/gcluster"
"gitee.com/monobytes/gcore/gerrors"
"gitee.com/monobytes/gcore/internal/transporter/internal/codes"
"gitee.com/monobytes/gcore/internal/transporter/internal/protocol"
"gitee.com/monobytes/gcore/internal/transporter/internal/route"
"gitee.com/monobytes/gcore/internal/transporter/internal/server"
)
type Server struct {
*server.Server
provider Provider
}
func NewServer(addr string, provider Provider) (*Server, error) {
serv, err := server.NewServer(&server.Options{Addr: addr})
if err != nil {
return nil, err
}
s := &Server{Server: serv, provider: provider}
s.init()
return s, nil
}
func (s *Server) init() {
s.RegisterHandler(route.Trigger, s.trigger)
s.RegisterHandler(route.Deliver, s.deliver)
s.RegisterHandler(route.GetState, s.getState)
s.RegisterHandler(route.SetState, s.setState)
}
// 触发事件
func (s *Server) trigger(conn *server.Conn, data []byte) error {
seq, event, cid, uid, err := protocol.DecodeTriggerReq(data)
if err != nil {
return err
}
if conn.InsKind != gcluster.Gate {
return gerrors.ErrIllegalRequest
}
if err = s.provider.Trigger(context.Background(), conn.InsID, cid, uid, event); seq == 0 {
if gerrors.Is(err, gerrors.ErrNotFoundSession) {
return nil
} else {
return err
}
} else {
return conn.Send(protocol.EncodeTriggerRes(seq, codes.ErrorToCode(err)))
}
}
// 投递消息
func (s *Server) deliver(conn *server.Conn, data []byte) error {
seq, cid, uid, message, err := protocol.DecodeDeliverReq(data)
if err != nil {
return err
}
var (
gid string
nid string
)
switch conn.InsKind {
case gcluster.Gate:
gid = conn.InsID
case gcluster.Node:
nid = conn.InsID
default:
return gerrors.ErrIllegalRequest
}
if err = s.provider.Deliver(context.Background(), gid, nid, cid, uid, message); seq == 0 {
return err
} else {
return conn.Send(protocol.EncodeDeliverRes(seq, codes.ErrorToCode(err)))
}
}
// 获取状态
func (s *Server) getState(conn *server.Conn, data []byte) error {
seq, err := protocol.DecodeGetStateReq(data)
if err != nil {
return err
}
state, err := s.provider.GetState()
return conn.Send(protocol.EncodeGetStateRes(seq, codes.ErrorToCode(err), state))
}
// 设置状态
func (s *Server) setState(conn *server.Conn, data []byte) error {
seq, state, err := protocol.DecodeSetStateReq(data)
if err != nil {
return err
}
err = s.provider.SetState(state)
return conn.Send(protocol.EncodeSetStateRes(seq, codes.ErrorToCode(err)))
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/monobytes/gcore.git
git@gitee.com:monobytes/gcore.git
monobytes
gcore
gcore
v0.0.17

搜索帮助