package protocol import ( "encoding/json" "sync" protocolpkg "github.com/noahlann/nnet/pkg/protocol" ) // frameHeader 协议帧头实现 type frameHeader struct { data map[string]interface{} mu sync.RWMutex } // NewFrameHeader 创建新的协议帧头 func NewFrameHeader() protocolpkg.FrameHeader { return &frameHeader{ data: make(map[string]interface{}), } } // Get 获取帧头字段 func (h *frameHeader) Get(key string) interface{} { h.mu.RLock() defer h.mu.RUnlock() return h.data[key] } // Set 设置帧头字段 func (h *frameHeader) Set(key string, value interface{}) { h.mu.Lock() defer h.mu.Unlock() if h.data == nil { h.data = make(map[string]interface{}) } h.data[key] = value } // Encode 编码为字节(使用JSON格式) // 注意:这是通用编码,用于调试和通用场景 // 具体的协议实现应该使用Protocol.Encode方法来编码完整的消息(包括帧头和数据) func (h *frameHeader) Encode() ([]byte, error) { h.mu.RLock() defer h.mu.RUnlock() // 如果数据为空,返回空JSON对象 if len(h.data) == 0 { return []byte("{}"), nil } // 使用JSON编码 return json.Marshal(h.data) } // Decode 从字节解码(使用JSON格式) // 注意:这是通用解码,用于调试和通用场景 // 具体的协议实现应该使用Protocol.Decode方法来解码完整的消息(包括帧头和数据) func (h *frameHeader) Decode(data []byte) error { if len(data) == 0 { return nil } h.mu.Lock() defer h.mu.Unlock() // 如果data为空,初始化为空map if h.data == nil { h.data = make(map[string]interface{}) } // 使用JSON解码 var decodedData map[string]interface{} if err := json.Unmarshal(data, &decodedData); err != nil { return err } // 合并解码后的数据(保留原有数据,新数据覆盖旧数据) for k, v := range decodedData { h.data[k] = v } return nil } // Clone 克隆帧头(深拷贝) func (h *frameHeader) Clone() protocolpkg.FrameHeader { h.mu.RLock() defer h.mu.RUnlock() cloned := &frameHeader{ data: make(map[string]interface{}), } // 深拷贝所有字段 for k, v := range h.data { cloned.data[k] = v } return cloned }