72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
package protocol
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/hex"
|
|
"encoding/json"
|
|
)
|
|
|
|
// PairMessage contains all message details.
|
|
type PairMessage struct {
|
|
InstallationID string `json:"installationId"`
|
|
// The type of the device
|
|
DeviceType string `json:"deviceType"`
|
|
// Name the user set name
|
|
Name string `json:"name"`
|
|
// The FCMToken for mobile platforms
|
|
FCMToken string `json:"fcmToken"`
|
|
|
|
// not protocol defined fields
|
|
ID []byte `json:"-"`
|
|
}
|
|
|
|
func (m *PairMessage) MarshalJSON() ([]byte, error) {
|
|
type PairMessageAlias PairMessage
|
|
item := struct {
|
|
*PairMessageAlias
|
|
ID string `json:"id"`
|
|
}{
|
|
PairMessageAlias: (*PairMessageAlias)(m),
|
|
ID: "0x" + hex.EncodeToString(m.ID),
|
|
}
|
|
|
|
return json.Marshal(item)
|
|
}
|
|
|
|
// CreatePairMessage creates a PairMessage which is used
|
|
// to pair devices.
|
|
func CreatePairMessage(installationID string, name string, deviceType string, fcmToken string) PairMessage {
|
|
return PairMessage{
|
|
InstallationID: installationID,
|
|
Name: name,
|
|
DeviceType: deviceType,
|
|
FCMToken: fcmToken,
|
|
}
|
|
}
|
|
|
|
// DecodePairMessage decodes a raw payload to Message struct.
|
|
func DecodePairMessage(data []byte) (message PairMessage, err error) {
|
|
buf := bytes.NewBuffer(data)
|
|
decoder := NewMessageDecoder(buf)
|
|
value, err := decoder.Decode()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
message, ok := value.(PairMessage)
|
|
if !ok {
|
|
return message, ErrInvalidDecodedValue
|
|
}
|
|
return
|
|
}
|
|
|
|
// EncodePairMessage encodes a PairMessage using Transit serialization.
|
|
func EncodePairMessage(value PairMessage) ([]byte, error) {
|
|
var buf bytes.Buffer
|
|
encoder := NewMessageEncoder(&buf)
|
|
if err := encoder.Encode(value); err != nil {
|
|
return nil, err
|
|
}
|
|
return buf.Bytes(), nil
|
|
}
|