-
Notifications
You must be signed in to change notification settings - Fork 10
/
client_msg.go
90 lines (74 loc) · 2.15 KB
/
client_msg.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// Copyright (c) 2022-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
package service
import (
"fmt"
"github.com/mattermost/rtcd/service/rtc"
"github.com/vmihailenco/msgpack/v5"
)
type ClientMessage struct {
Type string `msgpack:"type"`
Data interface{} `msgpack:"data,omitempty"`
}
const (
ClientMessageJoin = "join"
ClientMessageLeave = "leave"
ClientMessageRTC = "rtc"
ClientMessageHello = "hello"
ClientMessageReconnect = "reconnect"
ClientMessageClose = "close"
ClientMessageVAD = "vad"
)
var _ msgpack.CustomEncoder = (*ClientMessage)(nil)
func (cm *ClientMessage) EncodeMsgpack(enc *msgpack.Encoder) error {
return enc.EncodeMulti(cm.Type, cm.Data)
}
var _ msgpack.CustomDecoder = (*ClientMessage)(nil)
func (cm *ClientMessage) DecodeMsgpack(dec *msgpack.Decoder) error {
msgType, err := dec.DecodeString()
if err != nil {
return fmt.Errorf("failed to decode msg.Type: %w", err)
}
cm.Type = msgType
switch cm.Type {
case ClientMessageJoin, ClientMessageLeave, ClientMessageHello, ClientMessageReconnect, ClientMessageClose:
data, err := dec.DecodeTypedMap()
if err != nil {
return fmt.Errorf("failed to decode msg.Data: %w", err)
}
cm.Data = data
case ClientMessageRTC, ClientMessageVAD:
var rtcMsg rtc.Message
if err = dec.Decode(&rtcMsg); err != nil {
return fmt.Errorf("failed to decode rtc.Message: %w", err)
}
cm.Data = rtcMsg
default:
data, err := dec.DecodeInterface()
if err != nil {
return fmt.Errorf("failed to decode msg.Data: %w", err)
}
cm.Data = data
}
return nil
}
func NewClientMessage(msgType string, data interface{}) *ClientMessage {
return &ClientMessage{
Type: msgType,
Data: data,
}
}
func NewPackedClientMessage(msgType string, data interface{}) ([]byte, error) {
cm := NewClientMessage(msgType, data)
packed, err := cm.Pack()
if err != nil {
return nil, fmt.Errorf("failed to pack client message: %s", err)
}
return packed, nil
}
func (cm *ClientMessage) Pack() ([]byte, error) {
return msgpack.Marshal(&cm)
}
func (cm *ClientMessage) Unpack(data []byte) error {
return msgpack.Unmarshal(data, &cm)
}