代码拉取完成,页面将自动刷新
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)))
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。