Files

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"`
}