54 lines
1,020 B
Go
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
|
|
|
|
}
|