package protocol import ( "context" ) // FrameHeader 协议帧头接口 type FrameHeader interface { // Get 获取帧头字段 Get(key string) interface{} // Set 设置帧头字段 Set(key string, value interface{}) // Encode 编码为字节 Encode() ([]byte, error) // Decode 从字节解码 Decode(data []byte) error // Clone 克隆帧头(深拷贝) Clone() FrameHeader } // Protocol 协议接口 type Protocol interface { // Name 获取协议名称 Name() string // Version 获取协议版本 Version() string // HasHeader 是否有帧头(无帧头协议返回false) HasHeader() bool // Encode 编码消息(添加帧头) // data: 要编码的数据 // header: 协议帧头(如果有,无帧头协议可以为nil) // 返回: 编码后的完整消息(包含帧头和数据) Encode(data []byte, header FrameHeader) ([]byte, error) // Decode 解码消息(提取帧头和数据) // data: 原始字节数据(应该是完整的消息,由unpacker拆包后提供) // 返回: 帧头(如果有)、数据部分、错误 // 注意:data已经是完整消息,无需处理半包/粘包 Decode(data []byte) (FrameHeader, []byte, error) // Handle 处理消息(可选,用于协议特定的处理逻辑) Handle(ctx context.Context, data []byte) ([]byte, error) } // VersionIdentifier 版本识别器 type VersionIdentifier interface { // Identify 识别协议版本 Identify(data []byte, ctx context.Context) (string, error) } // Manager 协议管理器接口 type Manager interface { // Register 注册协议 Register(protocol Protocol) error // Get 获取协议 Get(name, version string) (Protocol, error) // GetDefault 获取默认协议 GetDefault() Protocol // SetDefault 设置默认协议 SetDefault(name, version string) error // List 列出所有协议 List() []Protocol // RegisterVersionIdentifier 注册版本识别器 // name: 协议名称 // identifier: 版本识别器 RegisterVersionIdentifier(name string, identifier VersionIdentifier) error // GetVersionIdentifier 获取版本识别器 // name: 协议名称 GetVersionIdentifier(name string) VersionIdentifier // IdentifyVersion 识别协议版本 // name: 协议名称 // data: 原始数据(可能不完整) // ctx: 上下文 // 返回: 协议版本、错误 // 如果识别失败,返回空字符串和错误 // 如果数据不足,返回空字符串和nil(表示需要更多数据) IdentifyVersion(name string, data []byte, ctx context.Context) (string, error) } // Identifier 标识符类型 type Identifier string const ( // IdentifierHeader 基于帧头识别 IdentifierHeader Identifier = "header" // IdentifierMessageHeader 基于消息头识别 IdentifierMessageHeader Identifier = "message_header" // IdentifierMessageBody 基于消息体识别 IdentifierMessageBody Identifier = "message_body" // IdentifierCustom 自定义识别 IdentifierCustom Identifier = "custom" )