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 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"` // 消息内容 }