232 lines
5.1 KiB
Go
232 lines
5.1 KiB
Go
package nixmsg
|
||
|
||
import "time"
|
||
|
||
// ConnectionState 连接状态(onConnection)。
|
||
type ConnectionState string
|
||
|
||
const (
|
||
StateConnecting ConnectionState = "connecting"
|
||
StateOnline ConnectionState = "online"
|
||
StateReconnecting ConnectionState = "reconnecting"
|
||
StateOffline ConnectionState = "offline"
|
||
StateKicked ConnectionState = "kicked"
|
||
StateAuthFailed ConnectionState = "auth_failed"
|
||
)
|
||
|
||
// Credential 登录凭据:密码或会话令牌二选一。
|
||
type Credential struct {
|
||
Password string
|
||
SessionToken string
|
||
}
|
||
|
||
// Options 连接选项。
|
||
type Options struct {
|
||
// ManualAck 为 true 时手动确认模式。
|
||
ManualAck bool
|
||
// AllowTCP 显式允许裸 TCP(mqtt:// / mqtts://)。默认只用 WebSocket。
|
||
AllowTCP bool
|
||
// ConnectTimeout 连接超时,默认 30s。
|
||
ConnectTimeout time.Duration
|
||
// ClientLabel hello.client,默认 go-sdk/0.1。
|
||
ClientLabel string
|
||
// MaxReceiveBytes hello.max_receive_bytes;0 表示省略(不限)。
|
||
MaxReceiveBytes int
|
||
// SendQueueSize 发送队列上限,默认 1000。
|
||
SendQueueSize int
|
||
// MaxInflight 在途上限,默认 100。
|
||
MaxInflight int
|
||
// DedupCapacity from+id 去重容量,默认 10000。
|
||
DedupCapacity int
|
||
// HTTPClient 注册用;nil 用默认。
|
||
// 测试可注入 transport。
|
||
transport transport
|
||
}
|
||
|
||
func (o *Options) withDefaults() Options {
|
||
out := *o
|
||
if out.ConnectTimeout <= 0 {
|
||
out.ConnectTimeout = 30 * time.Second
|
||
}
|
||
if out.ClientLabel == "" {
|
||
out.ClientLabel = "go-sdk/0.1"
|
||
}
|
||
if out.SendQueueSize <= 0 {
|
||
out.SendQueueSize = 1000
|
||
}
|
||
if out.MaxInflight <= 0 {
|
||
out.MaxInflight = 100
|
||
}
|
||
if out.DedupCapacity <= 0 {
|
||
out.DedupCapacity = 10000
|
||
}
|
||
return out
|
||
}
|
||
|
||
// 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"`
|
||
}
|
||
|
||
// SendOptions 发送选项。
|
||
type SendOptions struct {
|
||
SendAt *time.Time
|
||
Delay *time.Duration
|
||
Keep bool
|
||
TTL *int64
|
||
Receipt *bool
|
||
TalkPassword string
|
||
ContentType string
|
||
Meta map[string]any
|
||
ID string // 可选;空则生成 UUIDv7
|
||
}
|
||
|
||
// SendResult 发送结果。
|
||
type SendResult struct {
|
||
ID string
|
||
SendAtMs int64
|
||
State string
|
||
}
|
||
|
||
// Message 下行消息(交给应用)。
|
||
type Message struct {
|
||
ID string
|
||
From string
|
||
To Target
|
||
Body Body
|
||
Meta map[string]any
|
||
SendAtMs int64
|
||
}
|
||
|
||
// RecallResult 撤回结果。
|
||
type RecallResult struct {
|
||
Result string
|
||
Recalled int
|
||
Accepted int
|
||
Other int
|
||
}
|
||
|
||
// Receipt 回执。
|
||
type Receipt struct {
|
||
ReceiptID string
|
||
ID string
|
||
EndpointID string
|
||
State string
|
||
Reason string
|
||
AtMs int64
|
||
}
|
||
|
||
// RevokedEvent 撤回/作废事件。
|
||
type RevokedEvent struct {
|
||
ID string
|
||
From string
|
||
Reason string
|
||
}
|
||
|
||
// PresenceItem 在线查询项。
|
||
type PresenceItem struct {
|
||
ID string `json:"id"`
|
||
Online bool `json:"online"`
|
||
SinceMs int64 `json:"since_ms"`
|
||
}
|
||
|
||
// DirectoryItem 目录项。
|
||
type DirectoryItem struct {
|
||
ID string `json:"id"`
|
||
Name string `json:"name"`
|
||
Online bool `json:"online"`
|
||
OnlineSinceMs int64 `json:"online_since_ms"`
|
||
OfflineSinceMs int64 `json:"offline_since_ms"`
|
||
TalkPasswordSet bool `json:"talk_password_set"`
|
||
}
|
||
|
||
// PresenceEvent 上下线通知。
|
||
type PresenceEvent struct {
|
||
ID string
|
||
Online bool
|
||
AtMs int64
|
||
}
|
||
|
||
// GroupEvent 群事件。
|
||
type GroupEvent struct {
|
||
GroupID string
|
||
Event string
|
||
EndpointID string
|
||
AtMs int64
|
||
}
|
||
|
||
// SelfInfo 自己的资料。
|
||
type SelfInfo struct {
|
||
ID string `json:"id"`
|
||
Name string `json:"name"`
|
||
DefaultDelayMs int64 `json:"default_delay_ms"`
|
||
TalkPasswordSet bool `json:"talk_password_set"`
|
||
}
|
||
|
||
// GroupInfo 群摘要。
|
||
type GroupInfo struct {
|
||
ID string `json:"id"`
|
||
Name string `json:"name"`
|
||
OwnerID string `json:"owner_id"`
|
||
MemberCount int `json:"member_count"`
|
||
}
|
||
|
||
// GroupMember 群成员。
|
||
type GroupMember struct {
|
||
ID string `json:"id"`
|
||
Name string `json:"name"`
|
||
Online bool `json:"online"`
|
||
}
|
||
|
||
// GroupMemberIn 建群/加群成员。
|
||
type GroupMemberIn struct {
|
||
ID string
|
||
TalkPassword string
|
||
}
|
||
|
||
// MemberFailure 部分成员失败。
|
||
type MemberFailure struct {
|
||
ID string `json:"id"`
|
||
Code string `json:"code"`
|
||
}
|
||
|
||
// RegisterOptions 注册选项。
|
||
type RegisterOptions struct {
|
||
ID string
|
||
LoginPassword string
|
||
Name string
|
||
TalkPassword string
|
||
}
|
||
|
||
// RegisterResult 注册结果。
|
||
type RegisterResult struct {
|
||
ID string
|
||
LoginPassword string // 仅请求未带密码时返回
|
||
}
|
||
|
||
// HandshakeLimits 握手参数。
|
||
type HandshakeLimits struct {
|
||
ServerTimeMs int64
|
||
ServerVersion string
|
||
MaxBodyBytes int
|
||
MaxMetaBytes int
|
||
MaxFrameBytes int
|
||
MaxTTLSeconds int64
|
||
MaxScheduleSeconds int64
|
||
AckTimeoutSeconds int64
|
||
}
|
||
|
||
// ConnectionEvent 连接状态事件。
|
||
type ConnectionEvent struct {
|
||
State ConnectionState
|
||
Reason string // auth_failed / kicked 时的原因
|
||
}
|