2015-06-01 15:49:10 +00:00
|
|
|
package structs
|
|
|
|
|
2015-06-05 22:21:17 +00:00
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
|
|
|
|
"github.com/hashicorp/go-msgpack/codec"
|
|
|
|
)
|
|
|
|
|
2015-06-01 15:49:10 +00:00
|
|
|
type MessageType uint8
|
|
|
|
|
|
|
|
const (
|
|
|
|
RegisterRequestType MessageType = iota
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
// IgnoreUnknownTypeFlag is set along with a MessageType
|
|
|
|
// to indicate that the message type can be safely ignored
|
|
|
|
// if it is not recognized. This is for future proofing, so
|
|
|
|
// that new commands can be added in a way that won't cause
|
|
|
|
// old servers to crash when the FSM attempts to process them.
|
|
|
|
IgnoreUnknownTypeFlag MessageType = 128
|
|
|
|
)
|
2015-06-05 22:21:17 +00:00
|
|
|
|
|
|
|
// msgpackHandle is a shared handle for encoding/decoding of structs
|
|
|
|
var msgpackHandle = &codec.MsgpackHandle{}
|
|
|
|
|
|
|
|
// Decode is used to decode a MsgPack encoded object
|
|
|
|
func Decode(buf []byte, out interface{}) error {
|
|
|
|
return codec.NewDecoder(bytes.NewReader(buf), msgpackHandle).Decode(out)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Encode is used to encode a MsgPack object with type prefix
|
|
|
|
func Encode(t MessageType, msg interface{}) ([]byte, error) {
|
|
|
|
var buf bytes.Buffer
|
|
|
|
buf.WriteByte(uint8(t))
|
|
|
|
err := codec.NewEncoder(&buf, msgpackHandle).Encode(msg)
|
|
|
|
return buf.Bytes(), err
|
|
|
|
}
|