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

81 lines
2.2 KiB
Go

package nnet
1 year ago
import (
"git.noahlan.cn/noahlan/nnet"
"git.noahlan.cn/noahlan/nnet/conn"
1 year ago
"git.noahlan.cn/noahlan/nnet/middleware"
"git.noahlan.cn/noahlan/nnet/packet"
"git.noahlan.cn/noahlan/ntool/nlog"
1 year ago
"time"
)
1 year ago
type (
Config struct {
HeartbeatInterval time.Duration
HandshakeValidator HandshakeValidatorFunc
1 year ago
}
HandshakeReq struct {
1 year ago
Version string `json:"version"` // 客户端版本,服务器以此判断是否合适与客户端通信
Type string `json:"type"` // 客户端类型,与客户端版本号一起来确定客户端是否合适
ClientId string `json:"clientId"` // 客户端ID服务器以此取值
ClientSecret string `json:"clientSecret"` // 客户端密钥,服务器以此判定客户端是否可用
// 透传信息
Payload any `json:"payload,optional,omitempty"`
1 year ago
}
HandshakeResp struct {
1 year ago
// 心跳间隔,单位秒 0表示不需要心跳
Heartbeat int64 `json:"heartbeat"`
1 year ago
*RouteMap
1 year ago
// 透传信息
Payload any `json:"payload,optional,omitempty"`
1 year ago
}
1 year ago
)
1 year ago
func WithNNetClientProtocol(onReady OnReadyFunc) []nnet.RunOption {
router := NewRouter().(*nRouter)
packer := NewPacker(router.routeMap)
opts := []nnet.RunOption{
WithNNetClientEvents(onReady, packer),
nnet.WithRouter(router),
nnet.WithPackerBuilder(func() packet.Packer { return NewPacker(router.routeMap) }),
}
return opts
}
func WithNNetProtocol(config Config) []nnet.RunOption {
1 year ago
if config.HandshakeValidator == nil {
config.HandshakeValidator = func(data *HandshakeReq) error {
return nil
1 year ago
}
}
router := NewRouter().(*nRouter)
handshakeAckData := &HandshakeResp{
Heartbeat: int64(config.HeartbeatInterval.Seconds()),
RouteMap: router.routeMap,
}
1 year ago
packer := NewPacker(router.routeMap)
opts := []nnet.RunOption{
withNNetEvents(handshakeAckData, config.HandshakeValidator, packer),
nnet.WithRouter(router),
nnet.WithPackerBuilder(func() packet.Packer { return NewPacker(router.routeMap) }),
1 year ago
}
if config.HeartbeatInterval.Seconds() > 0 {
hbd, err := packer.Pack(Heartbeat, nil)
1 year ago
nlog.Must(err)
opts = append(opts, middleware.WithHeartbeat(config.HeartbeatInterval, func(_ *conn.Connection) []byte {
1 year ago
return hbd
1 year ago
}))
1 year ago
}
1 year ago
return opts
1 year ago
}