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.

107 lines
2.9 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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