Files
mq/codec/codec.go
2024-10-15 20:34:56 +05:45

77 lines
1.5 KiB
Go

package codec
import (
"encoding/binary"
"net"
"sync"
"github.com/oarkflow/mq/consts"
)
type Message struct {
Headers map[string]string `msgpack:"h"`
Queue string `msgpack:"q"`
Payload []byte `msgpack:"p"`
m sync.RWMutex
Command consts.CMD `msgpack:"c"`
}
func NewMessage(cmd consts.CMD, payload []byte, queue string, headers map[string]string) *Message {
return &Message{
Headers: headers,
Queue: queue,
Command: cmd,
Payload: payload,
}
}
func (m *Message) Serialize() ([]byte, error) {
m.m.RLock()
defer m.m.RUnlock()
data, err := Marshal(m)
if err != nil {
return nil, err
}
return data, nil
}
func Deserialize(data []byte) (*Message, error) {
var msg Message
if err := Unmarshal(data, &msg); err != nil {
return nil, err
}
return &msg, nil
}
func SendMessage(conn net.Conn, msg *Message) error {
data, err := msg.Serialize()
if err != nil {
return err
}
length := make([]byte, 4)
binary.BigEndian.PutUint32(length, uint32(len(data)))
if _, err := conn.Write(length); err != nil {
return err
}
if _, err := conn.Write(data); err != nil {
return err
}
return nil
}
func ReadMessage(conn net.Conn) (*Message, error) {
lengthBytes := make([]byte, 4)
if _, err := conn.Read(lengthBytes); err != nil {
return nil, err
}
length := binary.BigEndian.Uint32(lengthBytes)
data := make([]byte, length)
if _, err := conn.Read(data); err != nil {
return nil, err
}
return Deserialize(data)
}