fcaster/fcast/raw.go
2025-05-29 22:52:44 +02:00

54 lines
1,020 B
Go

package fcast
import (
"encoding/binary"
"errors"
)
type OpCode uint8
type MessageHeader struct {
Size uint32 // little endian (4) 0-3
OpCode OpCode // (1) 4-4
}
type RawMessage struct {
Header MessageHeader // 0-4
Body []byte // 5-
}
func NewMessage(op OpCode, body []byte) *RawMessage {
return &RawMessage{
Header: MessageHeader{
Size: uint32(len(body) + 1),
OpCode: op,
},
Body: body,
}
}
func SerializeRaw(message *RawMessage) []byte {
buf := make([]byte, 4+message.Header.Size)
binary.LittleEndian.PutUint32(buf[0:4], message.Header.Size)
buf[4] = byte(message.Header.OpCode)
copy(buf[5:], message.Body)
return buf
}
var (
ErrHeaderTooShort = errors.New("header is too short")
ErrBodyTooShort = errors.New("body is too short")
)
func DeserializeRaw(bodyLen, opCode, body []byte) (*RawMessage, error) {
var msg RawMessage
msg.Header.Size = binary.LittleEndian.Uint32(bodyLen)
msg.Header.OpCode = OpCode(uint8(opCode[0]))
msg.Body = body
return &msg, nil
}