97 lines
3.2 KiB
Go
97 lines
3.2 KiB
Go
package melody
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
)
|
||
|
||
//type CMsg struct {
|
||
// T int `json:"t"`
|
||
// Msg []byte `json:"msg"`
|
||
// filter filterFunc
|
||
//}
|
||
|
||
// 长连接消息结构
|
||
type CMsg struct {
|
||
Id string `json:"id"`
|
||
T int `json:"t"`
|
||
Ack int8 `json:"ack,omitempty"`
|
||
ChannelId string `json:"cid,omitempty"`
|
||
// data字段为上下游业务方的协议字段,对于liverpool是透明的
|
||
Msg json.RawMessage `json:"msg,omitempty"`
|
||
filter filterFunc
|
||
}
|
||
|
||
const (
|
||
// 长连接初始化消息
|
||
CMsgTypeInit int = 1
|
||
// 长连接初始化消息响应
|
||
CMsgTypeInitResp int = 2
|
||
// 业务消息
|
||
CMsgTypeBiz int = 3
|
||
// ack消息
|
||
CMsgTypeAck int = 101
|
||
// echo消息,用于测试
|
||
CMsgTypeEcho int = 102
|
||
)
|
||
|
||
func (m *CMsg) String() string {
|
||
return fmt.Sprintf("id: %s, t: %d, ack: %d, cid: %s", m.Id, m.T, m.Ack, m.ChannelId)
|
||
}
|
||
|
||
// ChanMsg是liverpool <-> channel之间的消息协议
|
||
type ChanMsg struct {
|
||
Id string `json:"id"`
|
||
|
||
// 消息类型,liverpool支持的类型见上
|
||
// liverpool -> channel的消息只有ChanMsgTypeClientQuit会有值,空值表示业务消息
|
||
// channel -> liverpool消息类型见上
|
||
Type int `json:"t,omitempty"`
|
||
|
||
// liverpool -> channel, 标明消息是从哪个session发送的
|
||
// channel -> liverpool, 消息的目标session,以下消息类型需要:
|
||
// ChanMsgTypeSession: 必须
|
||
// ChanMsgTypeRegChannel: SessionId和Mid必须有一个有效值, SessionId有效值优先
|
||
// ChanMsgTypeUnregRoom: SessionId和Mid必须有一个有效值, SessionId有效值优先
|
||
// ChanMsgTypeUnregChannel: SessionId和Mid必须有一个有效值, SessionId有效值优先
|
||
SessionId string `json:"sid,omitempty"`
|
||
|
||
// liverpool -> channel: 触发消息的用户id
|
||
// channel -> liverpool: 业务方操作的用户id,比如
|
||
Mid int64 `json:"mid,omitempty"`
|
||
|
||
// 消息的目标channel
|
||
// channelid不用在队列消息数据里面体现,因为消息都是从固定的channel(topic)读取消息, 这个字段只是为了往下游client发送消息带的字段
|
||
ChannelId string `json:"cid,omitempty"`
|
||
// 消息的目前roomid, 如果没有这个字段会给channel下面所有的长连接发送消息
|
||
RoomId string `json:"rid,omitempty"`
|
||
|
||
// ChanMsgTypeRoomUsers 消息类型的用户id列表
|
||
Mids []int64 `json:"mids,omitempty"`
|
||
|
||
// 上游channel发送的消息需要liverpool保证的qos,现阶段不做这块,只做qos=0
|
||
Qos int8 `json:"qos,omitempty"`
|
||
// 上下游业务之间的定义的消息数据结构
|
||
Data json.RawMessage `json:"d,omitempty"`
|
||
|
||
// extension字段
|
||
MqSuffix string `json:"ms,omitempty"`
|
||
T int64 `json:"ts,omitempty"`
|
||
// 广播消息的发送比例,[0-100], 0, 100表示全部发送,n(0<n<100)表示n%的发送比例
|
||
BroadcastRate int8 `json:"broadcast_rate,omitempty"`
|
||
ExcludeMids []int64 `json:"exclude_mids,omitempty"`
|
||
IncludeMids []int64 `json:"include_mids,omitempty"`
|
||
// liverpool -> channel会有这个字段,长连接客户端ip
|
||
IP string `json:"ip,omitempty"`
|
||
}
|
||
|
||
type InitMsgData struct {
|
||
Sid string `json:"sid"`
|
||
PingInterval int `json:"ping_interval"`
|
||
}
|
||
|
||
type BizMsg struct {
|
||
Type string `json:"t"` // 消息类型
|
||
Data any `json:"d"` // 消息内容
|
||
}
|