|
|
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"
|
|
|
)
|