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