394 lines
10 KiB
Go
394 lines
10 KiB
Go
package protocol
|
|
|
|
import "encoding/json"
|
|
|
|
// Target 是发送目标。
|
|
type Target struct {
|
|
Kind string `json:"kind"`
|
|
ID string `json:"id"`
|
|
}
|
|
|
|
// Body 是消息正文。
|
|
type Body struct {
|
|
Enc string `json:"enc"`
|
|
ContentType string `json:"content_type,omitempty"`
|
|
Data string `json:"data"`
|
|
}
|
|
|
|
// OfflineOpts 是离线保留选项。
|
|
type OfflineOpts struct {
|
|
Keep bool `json:"keep"`
|
|
TTLSeconds *int64 `json:"ttl_seconds,omitempty"`
|
|
}
|
|
|
|
// Limits 是与服务器配置相关的校验上限。
|
|
type Limits struct {
|
|
MaxBodyBytes int
|
|
MaxMetaBytes int
|
|
MaxFrameBytes int
|
|
}
|
|
|
|
// DefaultLimits 返回 DEVELOPMENT 示例中的默认上限。
|
|
func DefaultLimits() Limits {
|
|
return Limits{
|
|
MaxBodyBytes: DefaultMaxBodyBytes,
|
|
MaxMetaBytes: DefaultMaxMetaBytes,
|
|
MaxFrameBytes: DefaultMaxFrameBytes,
|
|
}
|
|
}
|
|
|
|
func (l Limits) withDefaults() Limits {
|
|
if l.MaxBodyBytes <= 0 {
|
|
l.MaxBodyBytes = DefaultMaxBodyBytes
|
|
}
|
|
if l.MaxMetaBytes <= 0 {
|
|
l.MaxMetaBytes = DefaultMaxMetaBytes
|
|
}
|
|
if l.MaxFrameBytes <= 0 {
|
|
l.MaxFrameBytes = DefaultMaxFrameBytes
|
|
}
|
|
return l
|
|
}
|
|
|
|
// Hello 是握手请求(第 6.1 节)。
|
|
type Hello struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
MaxReceiveBytes *int `json:"max_receive_bytes,omitempty"`
|
|
Client string `json:"client,omitempty"`
|
|
}
|
|
|
|
// HelloData 是握手成功响应 data。
|
|
type HelloData struct {
|
|
ServerTimeMs int64 `json:"server_time_ms"`
|
|
ServerVersion string `json:"server_version"`
|
|
MaxBodyBytes int `json:"max_body_bytes"`
|
|
MaxMetaBytes int `json:"max_meta_bytes"`
|
|
MaxFrameBytes int `json:"max_frame_bytes"`
|
|
MaxTTLSeconds int64 `json:"max_ttl_seconds"`
|
|
MaxScheduleSeconds int64 `json:"max_schedule_seconds"`
|
|
AckTimeoutSeconds int64 `json:"ack_timeout_seconds"`
|
|
SessionToken string `json:"session_token,omitempty"`
|
|
}
|
|
|
|
// Resp 是通用响应帧。
|
|
type Resp struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
OK bool `json:"ok"`
|
|
Data json.RawMessage `json:"data,omitempty"`
|
|
Error *ErrorBody `json:"error,omitempty"`
|
|
}
|
|
|
|
// Send 是发送请求(第 6.2 节)。
|
|
type Send struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
ID string `json:"id"`
|
|
To Target `json:"to"`
|
|
Body Body `json:"body"`
|
|
Meta map[string]any `json:"meta,omitempty"`
|
|
DelayMs *int64 `json:"delay_ms,omitempty"`
|
|
SendAtMs *int64 `json:"send_at_ms,omitempty"`
|
|
Offline *OfflineOpts `json:"offline,omitempty"`
|
|
Receipt *bool `json:"receipt,omitempty"`
|
|
TalkPassword string `json:"talk_password,omitempty"`
|
|
}
|
|
|
|
// SendData 是发送成功响应 data。
|
|
type SendData struct {
|
|
ID string `json:"id"`
|
|
SendAtMs int64 `json:"send_at_ms"`
|
|
State string `json:"state"`
|
|
}
|
|
|
|
// Msg 是下行消息(第 6.3 节)。
|
|
type Msg struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
ID string `json:"id"`
|
|
From string `json:"from"`
|
|
To Target `json:"to"`
|
|
Body Body `json:"body"`
|
|
Meta map[string]any `json:"meta,omitempty"`
|
|
SendAtMs int64 `json:"send_at_ms"`
|
|
}
|
|
|
|
// Ack 是确认请求。
|
|
type Ack struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
From string `json:"from"`
|
|
ID string `json:"id"`
|
|
}
|
|
|
|
// Recall 是撤回请求。
|
|
type Recall struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
ID string `json:"id"`
|
|
}
|
|
|
|
// RecallData 是撤回响应 data。
|
|
type RecallData struct {
|
|
Result string `json:"result"`
|
|
Recalled int `json:"recalled"`
|
|
Accepted int `json:"accepted"`
|
|
Other int `json:"other"`
|
|
}
|
|
|
|
// Status 是状态查询请求。
|
|
type Status struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
ID string `json:"id"`
|
|
Cursor string `json:"cursor,omitempty"`
|
|
Limit int `json:"limit,omitempty"`
|
|
}
|
|
|
|
// Receipt 是回执下行。
|
|
type Receipt struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
ReceiptID string `json:"receipt_id"`
|
|
ID string `json:"id"`
|
|
EndpointID string `json:"endpoint_id"`
|
|
State string `json:"state"`
|
|
Reason string `json:"reason"`
|
|
AtMs int64 `json:"at_ms"`
|
|
}
|
|
|
|
// ReceiptAck 是回执确认。
|
|
type ReceiptAck struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
ReceiptID string `json:"receipt_id"`
|
|
}
|
|
|
|
// Revoked 是已推送消息作废通知。
|
|
type Revoked struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
ID string `json:"id"`
|
|
From string `json:"from"`
|
|
Reason string `json:"reason"`
|
|
}
|
|
|
|
// PresenceGet 查询在线状态。
|
|
type PresenceGet struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
IDs []string `json:"ids"`
|
|
}
|
|
|
|
// DirectoryList 列目录。
|
|
type DirectoryList struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
Cursor string `json:"cursor,omitempty"`
|
|
Limit int `json:"limit,omitempty"`
|
|
Query string `json:"query,omitempty"`
|
|
}
|
|
|
|
// PresenceWatch 订阅上下线。
|
|
type PresenceWatch struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
IDs []string `json:"ids,omitempty"`
|
|
All bool `json:"all,omitempty"`
|
|
}
|
|
|
|
// Presence 是上下线通知。
|
|
type Presence struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
ID string `json:"id"`
|
|
Online bool `json:"online"`
|
|
AtMs int64 `json:"at_ms"`
|
|
}
|
|
|
|
// Unlock 解锁对话密码。
|
|
type Unlock struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
EndpointID string `json:"endpoint_id"`
|
|
TalkPassword string `json:"talk_password"`
|
|
}
|
|
|
|
// SelfGet 读取自己的资料。
|
|
type SelfGet struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
}
|
|
|
|
// SelfUpdate 更新自己的资料。
|
|
type SelfUpdate struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
Name string `json:"name,omitempty"`
|
|
DefaultDelayMs *int64 `json:"default_delay_ms,omitempty"`
|
|
}
|
|
|
|
// SelfTalkPassword 设置对话密码。
|
|
type SelfTalkPassword struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
TalkPassword string `json:"talk_password"`
|
|
}
|
|
|
|
// SelfLoginPassword 修改登录密码。
|
|
type SelfLoginPassword struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
OldPassword string `json:"old_password"`
|
|
NewPassword string `json:"new_password"`
|
|
}
|
|
|
|
// SelfLogout 退出登录并作废会话令牌。
|
|
type SelfLogout struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
}
|
|
|
|
// GroupMemberIn 是建群/加群时的成员项。
|
|
type GroupMemberIn struct {
|
|
ID string `json:"id"`
|
|
TalkPassword string `json:"talk_password,omitempty"`
|
|
}
|
|
|
|
// GroupCreate 建群。
|
|
type GroupCreate struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
Members []GroupMemberIn `json:"members"`
|
|
}
|
|
|
|
// GroupAdd 加成员。
|
|
type GroupAdd struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
GroupID string `json:"group_id"`
|
|
Members []GroupMemberIn `json:"members"`
|
|
}
|
|
|
|
// GroupRemove 移除成员。
|
|
type GroupRemove struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
GroupID string `json:"group_id"`
|
|
EndpointID string `json:"endpoint_id"`
|
|
}
|
|
|
|
// GroupLeave 退群。
|
|
type GroupLeave struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
GroupID string `json:"group_id"`
|
|
}
|
|
|
|
// GroupTransfer 转让群主。
|
|
type GroupTransfer struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
GroupID string `json:"group_id"`
|
|
EndpointID string `json:"endpoint_id"`
|
|
}
|
|
|
|
// GroupRename 改群名。
|
|
type GroupRename struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
GroupID string `json:"group_id"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
// GroupDissolve 解散群。
|
|
type GroupDissolve struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
GroupID string `json:"group_id"`
|
|
}
|
|
|
|
// GroupList 列出我的群。
|
|
type GroupList struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
Cursor string `json:"cursor,omitempty"`
|
|
Limit int `json:"limit,omitempty"`
|
|
}
|
|
|
|
// GroupGet 获取群详情。
|
|
type GroupGet struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
RID string `json:"rid"`
|
|
GroupID string `json:"group_id"`
|
|
Cursor string `json:"cursor,omitempty"`
|
|
Limit int `json:"limit,omitempty"`
|
|
}
|
|
|
|
// GroupEvent 是群事件下行。
|
|
type GroupEvent struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
GroupID string `json:"group_id"`
|
|
Event string `json:"event"`
|
|
EndpointID string `json:"endpoint_id,omitempty"`
|
|
AtMs int64 `json:"at_ms"`
|
|
}
|
|
|
|
// Fatal 是致命错误下行。
|
|
type Fatal struct {
|
|
V int `json:"v"`
|
|
Type string `json:"type"`
|
|
Reason string `json:"reason"`
|
|
}
|
|
|
|
// RegisterRequest 是 HTTP 注册请求(第 6.9 节)。
|
|
type RegisterRequest struct {
|
|
RegistrationCode string `json:"registration_code"`
|
|
ID string `json:"id"`
|
|
LoginPassword string `json:"login_password"`
|
|
Name string `json:"name,omitempty"`
|
|
TalkPassword string `json:"talk_password,omitempty"`
|
|
}
|
|
|
|
// RegisterData 是注册成功 data。
|
|
type RegisterData struct {
|
|
ID string `json:"id"`
|
|
LoginPassword string `json:"login_password,omitempty"`
|
|
}
|
|
|
|
// RegisterResponse 是注册 HTTP 响应。
|
|
type RegisterResponse struct {
|
|
OK bool `json:"ok"`
|
|
Data RegisterData `json:"data,omitempty"`
|
|
Error *ErrorBody `json:"error,omitempty"`
|
|
}
|