服务与方法
本页列出 Node.js SDK 的全部服务方法、TypeScript 参数与返回类型,以及 REST 接口和自动重试类别。路径省略 /{org_name}/{app_name},参数与响应字段的含义见各行 REST 文档链接,通用规则见调用接口。
签名中的 T.X 是主包导出的类型,可用 import type { X } from '@deeprespond/im-server-sdk' 引入。options 为 CallOptions,迭代器使用 IterOptions;可选参数写作 ?。方法返回 Promise,遍历方法返回 AsyncIterable,使用 for await。WithRaw 表示结果同时提供 result[RAW] 的原始响应。
“接口名”用于错误的 op、stats、钩子和 FakeOpenAPI,仍使用 snake_case;方法使用 camelCase。遍历方法逐页调用列表接口,All 后缀的方法按上限拆批。重试类别见重试与幂等,被限流后的等待重发按限流处理。
用户 client.users
| 方法与签名 | REST 接口 | 接口名 | 自动重试 | 文档 |
|---|---|---|---|---|
listMuted(params?: T.ListMutedParams, options?: CallOptions): Promise<Page<T.UserMute>> | GET /mutes | users.list_muted | 查询 | 查询被禁言的用户列表 |
iterMuted(params?: Omit<T.ListMutedParams, 'cursor'>, options?: IterOptions): AsyncIterable<T.UserMute> | 逐页调用 GET /mutes | users.list_muted | 查询 | 查询被禁言的用户列表 |
create(username: string, params?: T.CreateUserParams, options?: CallOptions): Promise<WithRaw<T.User>> | POST /users | users.create | 唯一创建 | 创建用户 |
list(params?: T.ListUsersParams, options?: CallOptions): Promise<Page<T.User>> | GET /users | users.list | 查询 | 查询用户列表 |
iter(params?: Omit<T.ListUsersParams, 'cursor'>, options?: IterOptions): AsyncIterable<T.User> | 逐页调用 GET /users | users.list | 查询 | 查询用户列表 |
batchCreate(users: readonly T.CreateUserInput[], options?: CallOptions): Promise<WithRaw<T.BatchCreateUsersResult>> | POST /users/batch | users.batch_create | 唯一创建 | 批量创建用户 |
batchCreateAll( users: Iterable<T.CreateUserInput> | AsyncIterable<T.CreateUserInput>, options?: CallOptions): Promise<WithRaw<T.BatchCreateUsersResult>> | 分批调用 POST /users/batch | users.batch_create | 唯一创建 | 批量创建用户 |
lookup(usernames: readonly string[], options?: CallOptions): Promise<WithRaw<T.User[]>> | POST /users/lookup | users.lookup | 查询 | 按用户名批量查询 |
get(username: string, options?: CallOptions): Promise<WithRaw<T.User>> | GET /users/{username} | users.get | 查询 | 查询用户 |
update(username: string, params?: T.UpdateUserParams, options?: CallOptions): Promise<WithRaw<T.User>> | PATCH /users/{username} | users.update | 幂等 | 修改用户资料 |
delete(username: string, options?: CallOptions): Promise<void> | DELETE /users/{username} | users.delete | 幂等 | 删除用户 |
disable(username: string, params?: T.DisableUserParams, options?: CallOptions): Promise<WithRaw<T.User>> | POST /users/{username}/disable | users.disable | 幂等 | 封禁用户 |
enable(username: string, options?: CallOptions): Promise<WithRaw<T.User>> | POST /users/{username}/enable | users.enable | 幂等 | 解封用户 |
issueLoginTicket(username: string, params?: T.IssueLoginTicketParams, options?: CallOptions): Promise<WithRaw<T.LoginTicket>> | POST /users/{username}/login-tickets | users.issue_login_ticket | 幂等 | 签发登录凭证 |
listMutes(username: string, options?: CallOptions): Promise<WithRaw<T.UserMute[]>> | GET /users/{username}/mutes | users.mutes | 查询 | 查询用户的禁言 |
mute( username: string, scope: 'chat' | 'group' | 'room' | (string & {}), params?: T.MuteParams, options?: CallOptions): Promise<WithRaw<T.UserMute>> | PUT /users/{username}/mutes/{scope} | users.mute | 幂等 | 设置禁言 |
unmute(username: string, scope: 'chat' | 'group' | 'room' | (string & {}), options?: CallOptions): Promise<void> | DELETE /users/{username}/mutes/{scope} | users.unmute | 幂等 | 解除禁言 |
setPassword(username: string, password: string, options?: CallOptions): Promise<void> | PUT /users/{username}/password | users.set_password | 不重试 | 设置密码 |
listSessions(username: string, options?: CallOptions): Promise<WithRaw<T.Session[]>> | GET /users/{username}/sessions | users.sessions | 查询 | 查询登录设备 |
kickAll(username: string, options?: CallOptions): Promise<void> | DELETE /users/{username}/sessions | users.kick_all | 不重试 | 踢掉全部设备 |
kick(username: string, sessionId: string, options?: CallOptions): Promise<void> | DELETE /users/{username}/sessions/{session_id} | users.kick | 幂等 | 踢掉单台设备 |
好友 client.friends
| 方法与签名 | REST 接口 | 接口名 | 自动重试 | 文档 |
|---|---|---|---|---|
listRequests(username: string, params: T.ListFriendRequestsParams, options?: CallOptions): Promise<Page<T.FriendRequest>> | GET /users/{username}/friend-requests | friends.requests | 查询 | 查询好友申请 |
iterRequests( username: string, params: Omit<T.ListFriendRequestsParams, 'cursor'>, options?: IterOptions): AsyncIterable<T.FriendRequest> | 逐页调用 GET /users/{username}/friend-requests | friends.requests | 查询 | 查询好友申请 |
getSettings(username: string, options?: CallOptions): Promise<WithRaw<T.FriendSettings>> | GET /users/{username}/friend-settings | friends.settings | 查询 | 查询加好友方式 |
setSettings( username: string, friendAddMode: 'need_confirm' | 'allow_any' | 'deny_any' | (string & {}) | null, options?: CallOptions): Promise<WithRaw<T.FriendSettings>> | PUT /users/{username}/friend-settings | friends.set_settings | 幂等 | 设置加好友方式 |
list(username: string, params?: T.ListFriendsParams, options?: CallOptions): Promise<VersionedPage<T.Friend>> | GET /users/{username}/friends | friends.list | 查询 | 查询好友列表 |
iter(username: string, params?: Omit<T.ListFriendsParams, 'cursor' | 'known_version'>, options?: IterOptions): AsyncIterable<T.Friend> | 逐页调用 GET /users/{username}/friends | friends.list | 查询 | 查询好友列表 |
deleteAll(username: string, options?: CallOptions): Promise<number> | DELETE /users/{username}/friends | friends.delete_all | 幂等 | 删除全部好友 |
batchAdd(username: string, friends: readonly T.AddFriendItem[], options?: CallOptions): Promise<WithRaw<T.BatchAddFriendsResult>> | POST /users/{username}/friends/batch | friends.batch_add | 幂等 | 批量添加好友 |
batchAddAll( username: string, friends: Iterable<T.AddFriendItem> | AsyncIterable<T.AddFriendItem>, options?: CallOptions): Promise<WithRaw<T.BatchAddFriendsResult>> | 分批调用 POST /users/{username}/friends/batch | friends.batch_add | 幂等 | 批量添加好友 |
batchDelete(username: string, usernames: readonly string[], options?: CallOptions): Promise<WithRaw<T.BatchDeleteFriendsResult>> | POST /users/{username}/friends/batch-delete | friends.batch_delete | 幂等 | 批量删除好友 |
check(username: string, usernames: readonly string[], options?: CallOptions): Promise<WithRaw<T.FriendCheck[]>> | POST /users/{username}/friends/check | friends.check | 查询 | 检查好友关系 |
get(username: string, friend: string, options?: CallOptions): Promise<WithRaw<T.Friend>> | GET /users/{username}/friends/{friend} | friends.get | 查询 | 查询单个好友 |
add(username: string, friend: string, params?: T.AddFriendParams, options?: CallOptions): Promise<WithRaw<T.FriendChange>> | PUT /users/{username}/friends/{friend} | friends.add | 幂等 | 添加好友 |
update(username: string, friend: string, params?: T.UpdateFriendParams, options?: CallOptions): Promise<WithRaw<T.FriendChange>> | PATCH /users/{username}/friends/{friend} | friends.update | 幂等 | 修改好友备注和自定义属性 |
delete(username: string, friend: string, options?: CallOptions): Promise<WithRaw<T.FriendChange>> | DELETE /users/{username}/friends/{friend} | friends.delete | 幂等 | 删除好友 |
黑名单 client.blacklist
| 方法与签名 | REST 接口 | 接口名 | 自动重试 | 文档 |
|---|---|---|---|---|
list(username: string, params?: T.ListBlacklistParams, options?: CallOptions): Promise<VersionedPage<T.BlacklistEntry>> | GET /users/{username}/blacklist | blacklist.list | 查询 | 查询黑名单 |
iter( username: string, params?: Omit<T.ListBlacklistParams, 'cursor' | 'known_version'>, options?: IterOptions): AsyncIterable<T.BlacklistEntry> | 逐页调用 GET /users/{username}/blacklist | blacklist.list | 查询 | 查询黑名单 |
batchAdd(username: string, usernames: readonly string[], options?: CallOptions): Promise<WithRaw<T.BatchBlacklistResult>> | POST /users/{username}/blacklist/batch | blacklist.batch_add | 幂等 | 批量拉黑 |
batchRemove(username: string, usernames: readonly string[], options?: CallOptions): Promise<WithRaw<T.BatchBlacklistResult>> | POST /users/{username}/blacklist/batch-delete | blacklist.batch_remove | 幂等 | 批量移出黑名单 |
add(username: string, target: string, options?: CallOptions): Promise<WithRaw<T.BlacklistChange>> | PUT /users/{username}/blacklist/{target} | blacklist.add | 幂等 | 拉黑用户 |
remove(username: string, target: string, options?: CallOptions): Promise<WithRaw<T.BlacklistChange>> | DELETE /users/{username}/blacklist/{target} | blacklist.remove | 幂等 | 移出黑名单 |
群组 client.groups
| 方法与签名 | REST 接口 | 接口名 | 自动重试 | 文档 |
|---|---|---|---|---|
create(owner: string, params?: T.CreateGroupParams, options?: CallOptions): Promise<WithRaw<T.CreateGroupResult>> | POST /groups | groups.create | 不重试 | 创建群 |
list(params?: T.ListGroupsParams, options?: CallOptions): Promise<Page<T.Group>> | GET /groups | groups.list | 查询 | 查询群列表 |
iter(params?: Omit<T.ListGroupsParams, 'cursor'>, options?: IterOptions): AsyncIterable<T.Group> | 逐页调用 GET /groups | groups.list | 查询 | 查询群列表 |
get(groupId: string, options?: CallOptions): Promise<WithRaw<T.Group>> | GET /groups/{group_id} | groups.get | 查询 | 查询群信息 |
update(groupId: string, params?: T.UpdateGroupParams, options?: CallOptions): Promise<WithRaw<T.GroupChange>> | PATCH /groups/{group_id} | groups.update | 幂等 | 修改群资料和设置 |
delete(groupId: string, params?: T.GroupsDeleteParams, options?: CallOptions): Promise<void> | DELETE /groups/{group_id} | groups.delete | 幂等 | 解散群 |
listBlacklist(groupId: string, params?: T.ListOptions, options?: CallOptions): Promise<Page<T.GroupBlacklistEntry>> | GET /groups/{group_id}/blacklist | groups.blacklist | 查询 | 查询群黑名单 |
iterBlacklist(groupId: string, params?: Omit<T.ListOptions, 'cursor'>, options?: IterOptions): AsyncIterable<T.GroupBlacklistEntry> | 逐页调用 GET /groups/{group_id}/blacklist | groups.blacklist | 查询 | 查询群黑名单 |
addToBlacklist( groupId: string, username: string, params?: T.GroupsAddToBlacklistParams, options?: CallOptions): Promise<WithRaw<T.GroupBlacklistChange>> | PUT /groups/{group_id}/blacklist/{username} | groups.add_to_blacklist | 幂等 | 将用户加入群黑名单 |
removeFromBlacklist(groupId: string, username: string, options?: CallOptions): Promise<WithRaw<T.GroupBlacklistChange>> | DELETE /groups/{group_id}/blacklist/{username} | groups.remove_from_blacklist | 幂等 | 将用户移出群黑名单 |
disable(groupId: string, params?: T.GroupsDisableParams, options?: CallOptions): Promise<WithRaw<T.GroupChange>> | POST /groups/{group_id}/disable | groups.disable | 幂等 | 封禁群 |
enable(groupId: string, options?: CallOptions): Promise<WithRaw<T.GroupChange>> | POST /groups/{group_id}/enable | groups.enable | 幂等 | 解封群 |
listMembers(groupId: string, params?: T.ListMembersParams, options?: CallOptions): Promise<VersionedPage<T.GroupMember>> | GET /groups/{group_id}/members | groups.members | 查询 | 查询群成员列表 |
iterMembers( groupId: string, params?: Omit<T.ListMembersParams, 'cursor' | 'known_version'>, options?: IterOptions): AsyncIterable<T.GroupMember> | 逐页调用 GET /groups/{group_id}/members | groups.members | 查询 | 查询群成员列表 |
addMembers(groupId: string, usernames: readonly string[], options?: CallOptions): Promise<WithRaw<T.GroupMembersResult>> | POST /groups/{group_id}/members/batch | groups.add_members | 幂等 | 批量添加群成员 |
removeMembers(groupId: string, usernames: readonly string[], options?: CallOptions): Promise<WithRaw<T.GroupMembersResult>> | POST /groups/{group_id}/members/batch-delete | groups.remove_members | 幂等 | 批量移出群成员 |
getMember(groupId: string, username: string, options?: CallOptions): Promise<WithRaw<T.GroupMember>> | GET /groups/{group_id}/members/{username} | groups.member | 查询 | 查询群成员 |
updateMember( groupId: string, username: string, params?: T.UpdateMemberParams, options?: CallOptions): Promise<WithRaw<T.GroupMemberChange>> | PATCH /groups/{group_id}/members/{username} | groups.update_member | 幂等 | 修改群成员资料 |
muteMember( groupId: string, username: string, params?: T.GroupsMuteMemberParams, options?: CallOptions): Promise<WithRaw<T.GroupMemberChange>> | PUT /groups/{group_id}/members/{username}/mute | groups.mute_member | 幂等 | 禁言群成员 |
unmuteMember(groupId: string, username: string, options?: CallOptions): Promise<WithRaw<T.GroupMemberChange>> | DELETE /groups/{group_id}/members/{username}/mute | groups.unmute_member | 幂等 | 解除群成员禁言 |
setRole( groupId: string, username: string, role: 'admin' | 'member' | (string & {}), options?: CallOptions): Promise<WithRaw<T.GroupMemberChange>> | PUT /groups/{group_id}/members/{username}/role | groups.set_role | 幂等 | 设置群成员角色 |
setMuteAll(groupId: string, on: boolean, options?: CallOptions): Promise<WithRaw<T.GroupChange>> | PUT /groups/{group_id}/mute-all(on=true)DELETE /groups/{group_id}/mute-all(on=false) | groups.mute_allgroups.unmute_all | 幂等 | 开启全员禁言 关闭全员禁言 |
transferOwner(groupId: string, username: string, options?: CallOptions): Promise<WithRaw<T.GroupChange>> | PUT /groups/{group_id}/owner | groups.transfer_owner | 幂等 | 转让群主 |
listRequests(groupId: string, params?: T.ListGroupRequestsParams, options?: CallOptions): Promise<Page<T.GroupRequest>> | GET /groups/{group_id}/requests | groups.requests | 查询 | 查询入群申请和邀请 |
iterRequests(groupId: string, params?: Omit<T.ListGroupRequestsParams, 'cursor'>, options?: IterOptions): AsyncIterable<T.GroupRequest> | 逐页调用 GET /groups/{group_id}/requests | groups.requests | 查询 | 查询入群申请和邀请 |
getInviteSettings(username: string, options?: CallOptions): Promise<WithRaw<T.GroupInviteSettings>> | GET /users/{username}/group-settings | groups.invite_settings | 查询 | 查询用户的入群设置 |
setInviteSettings( username: string, inviteMode: 'allow_any' | 'need_confirm' | (string & {}) | null, options?: CallOptions): Promise<WithRaw<T.GroupInviteSettings>> | PUT /users/{username}/group-settings | groups.set_invite_settings | 幂等 | 修改用户的入群设置 |
listOfUser(username: string, params?: T.ListOptions, options?: CallOptions): Promise<Page<T.UserGroup>> | GET /users/{username}/groups | groups.of_user | 查询 | 查询用户加入的群 |
iterOfUser(username: string, params?: Omit<T.ListOptions, 'cursor'>, options?: IterOptions): AsyncIterable<T.UserGroup> | 逐页调用 GET /users/{username}/groups | groups.of_user | 查询 | 查询用户加入的群 |
消息 client.messages
| 方法与签名 | REST 接口 | 接口名 | 自动重试 | 文档 |
|---|---|---|---|---|
send(params: T.SendMessageParams, options?: CallOptions): Promise<WithRaw<T.SendResult>> | POST /messages | messages.send | 幂等键;online_only=True 时不重试 | 发送单条消息 |
export(params?: T.ExportParams, options?: CallOptions): Promise<ExportPage<T.Message>> | GET /messages | messages.export | 查询 | 导出应用的消息 |
iterExport(params?: T.ExportParams, options?: IterOptions): AsyncIterable<T.Message> | 逐页调用 GET /messages | messages.export | 查询 | 导出应用的消息 |
batchSend(toUsers: readonly string[], params: T.BatchSendParams, options?: CallOptions): Promise<WithRaw<T.BatchSendResult>> | POST /messages/batch | messages.batch_send | 幂等键 | 批量发送消息 |
batchSendAll( toUsers: Iterable<string> | AsyncIterable<string>, params: T.BatchSendParams, options?: CallOptions): Promise<WithRaw<T.BatchSendResult>> | 分批调用 POST /messages/batch | messages.batch_send | 幂等键 | 批量发送消息 |
batchRecall( messageIds: readonly string[], params?: T.MessagesBatchRecallParams, options?: CallOptions): Promise<WithRaw<T.BatchRecallResult>> | POST /messages/batch-recall | messages.batch_recall | 幂等 | 批量撤回消息 |
get(messageId: string, options?: CallOptions): Promise<WithRaw<T.Message>> | GET /messages/{message_id} | messages.get | 查询 | 查询单条消息 |
edit(messageId: string, params?: T.EditMessageParams, options?: CallOptions): Promise<WithRaw<T.MessageChange>> | PATCH /messages/{message_id} | messages.edit | 幂等 | 编辑消息 |
pin(messageId: string, params?: T.MessagesPinParams, options?: CallOptions): Promise<WithRaw<T.MessageChange>> | PUT /messages/{message_id}/pin | messages.pin | 幂等 | 置顶消息 |
unpin(messageId: string, params?: T.MessagesUnpinParams, options?: CallOptions): Promise<WithRaw<T.MessageChange>> | DELETE /messages/{message_id}/pin | messages.unpin | 幂等 | 取消置顶消息 |
recall(messageId: string, params?: T.MessagesRecallParams, options?: CallOptions): Promise<WithRaw<T.MessageChange>> | POST /messages/{message_id}/recall | messages.recall | 幂等 | 撤回消息 |
listSentBy(username: string, params?: T.SentByParams, options?: CallOptions): Promise<Page<T.Message>> | GET /users/{username}/sent-messages | messages.sent_by | 查询 | 查询用户发出的消息 |
iterSentBy(username: string, params?: Omit<T.SentByParams, 'cursor'>, options?: IterOptions): AsyncIterable<T.Message> | 逐页调用 GET /users/{username}/sent-messages | messages.sent_by | 查询 | 查询用户发出的消息 |
会话 client.conversations
| 方法与签名 | REST 接口 | 接口名 | 自动重试 | 文档 |
|---|---|---|---|---|
get(conversationId: string, options?: CallOptions): Promise<WithRaw<T.ConversationInfo>> | GET /conversations/{conversation_id} | conversations.get | 查询 | 查询会话信息 |
listMessages(conversationId: string, params?: T.SeqParams, options?: CallOptions): Promise<SeqPage<T.Message>> | GET /conversations/{conversation_id}/messages | conversations.messages | 查询 | 拉取会话的历史消息 |
iterMessages(conversationId: string, params?: T.SeqParams, options?: IterOptions): AsyncIterable<T.Message> | 逐页调用 GET /conversations/{conversation_id}/messages | conversations.messages | 查询 | 拉取会话的历史消息 |
listPins(conversationId: string, params?: T.ConversationsListPinsParams, options?: CallOptions): Promise<Page<T.Message>> | GET /conversations/{conversation_id}/pins | conversations.pins | 查询 | 查询会话中的置顶消息 |
iterPins(conversationId: string, options?: IterOptions): AsyncIterable<T.Message> | 逐页调用 GET /conversations/{conversation_id}/pins | conversations.pins | 查询 | 查询会话中的置顶消息 |
getSingle(username: string, peer: string, options?: CallOptions): Promise<WithRaw<T.ConversationInfo>> | GET /single-conversations/{username}/{peer} | conversations.single | 查询 | 查询两个用户之间的单聊会话 |
listOfUser(username: string, params?: T.ListOptions, options?: CallOptions): Promise<Page<T.ConversationState>> | GET /users/{username}/conversations | conversations.of_user | 查询 | 查询用户的会话列表 |
iterOfUser(username: string, params?: Omit<T.ListOptions, 'cursor'>, options?: IterOptions): AsyncIterable<T.ConversationState> | 逐页调用 GET /users/{username}/conversations | conversations.of_user | 查询 | 查询用户的会话列表 |
markAllRead(username: string, options?: CallOptions): Promise<WithRaw<T.MarkAllReadResult>> | POST /users/{username}/conversations/read-all | conversations.mark_all_read | 幂等 | 全部标记已读 |
getStateOfUser(username: string, conversationId: string, options?: CallOptions): Promise<WithRaw<T.ConversationState>> | GET /users/{username}/conversations/{conversation_id} | conversations.state_of_user | 查询 | 查询用户的单个会话 |
delete( username: string, conversationId: string, params?: T.ConversationsDeleteParams, options?: CallOptions): Promise<WithRaw<T.ConversationStateChange>> | DELETE /users/{username}/conversations/{conversation_id} | conversations.delete | 幂等 | 删除会话 |
clear(username: string, conversationId: string, options?: CallOptions): Promise<WithRaw<T.ConversationStateChange>> | POST /users/{username}/conversations/{conversation_id}/clear | conversations.clear | 幂等 | 清空聊天记录 |
deleteMessages( username: string, conversationId: string, seqs: readonly number[], options?: CallOptions): Promise<WithRaw<T.DeleteMessagesResult>> | POST /users/{username}/conversations/{conversation_id}/messages/delete | conversations.delete_messages | 幂等 | 删除消息 |
markRead( username: string, conversationId: string, params?: T.ConversationsMarkReadParams, options?: CallOptions): Promise<WithRaw<T.ConversationStateChange>> | POST /users/{username}/conversations/{conversation_id}/read | conversations.mark_read | 幂等 | 标记会话已读 |
unreadCount(username: string, options?: CallOptions): Promise<WithRaw<T.UnreadCount>> | GET /users/{username}/unread-count | conversations.unread_count | 查询 | 查询用户的未读总数 |
文件 client.media
| 方法与签名 | REST 接口 | 接口名 | 自动重试 | 文档 |
|---|---|---|---|---|
upload(source: UploadSource, params: UploadParams, options?: CallOptions): Promise<MediaFile> | POST /media/uploads、上传内容、POST /media/uploads/{file_id}/complete | media.create_upload 等 | 见上传文件 | 文件上传 |
resumeUpload(fileId: string, source: UploadSource, params?: ResumeParams, options?: CallOptions): Promise<MediaFile> | GET /media/uploads/{file_id}/parts、补传分片、POST /media/uploads/{file_id}/complete | media.uploaded_parts 等 | 幂等 | 文件上传 |
download(url: string, dest: DownloadTarget, options?: CallOptions): Promise<number> | POST /media/download-urls,再从下载地址读取 | media.download_urls | 查询 | 换取下载地址 |
getDownloadUrls(urls: readonly string[], options?: CallOptions): Promise<WithRaw<T.DownloadURLItem[]>> | POST /media/download-urls | media.download_urls | 查询 | 换取下载地址 |
getFile(fileId: string, options?: CallOptions): Promise<WithRaw<T.MediaFile>> | GET /media/files/{file_id} | media.file | 查询 | 查询文件 |
deleteFile(fileId: string, options?: CallOptions): Promise<void> | DELETE /media/files/{file_id} | media.delete_file | 幂等 | 删除文件 |
listGroupFiles(groupId: string, params?: T.ListOptions, options?: CallOptions): Promise<T.GroupFilesPage> | GET /media/groups/{group_id}/files | media.group_files | 查询 | 查询群文件列表 |
iterGroupFiles(groupId: string, params?: Omit<T.ListOptions, 'cursor'>, options?: IterOptions): AsyncIterable<T.MediaFile> | 逐页调用 GET /media/groups/{group_id}/files | media.group_files | 查询 | 查询群文件列表 |
createUpload(params: T.CreateUploadParams, options?: CallOptions): Promise<WithRaw<T.UploadSession>> | POST /media/uploads | media.create_upload | 不重试 | 创建上传 |
cancelUpload(fileId: string, options?: CallOptions): Promise<void> | DELETE /media/uploads/{file_id} | media.cancel_upload | 幂等 | 取消上传 |
completeUpload(fileId: string, options?: CallOptions): Promise<WithRaw<T.MediaFile>> | POST /media/uploads/{file_id}/complete | media.complete_upload | 幂等 | 完成上传 |
getPartUrls(fileId: string, partNumbers: readonly number[], options?: CallOptions): Promise<WithRaw<T.PartURL[]>> | POST /media/uploads/{file_id}/parts | media.part_urls | 查询 | 索取分片上传地址 |
listUploadedParts(fileId: string, options?: CallOptions): Promise<WithRaw<T.UploadedPart[]>> | GET /media/uploads/{file_id}/parts | media.uploaded_parts | 查询 | 查询已上传的分片 |
usage(options?: CallOptions): Promise<WithRaw<T.MediaUsage>> | GET /media/usage | media.usage | 查询 | 查询存储用量 |
推送设置 client.push
| 方法与签名 | REST 接口 | 接口名 | 自动重试 | 文档 |
|---|---|---|---|---|
listDevices(username: string, options?: CallOptions): Promise<WithRaw<T.PushDevice[]>> | GET /users/{username}/push-devices | push.devices | 查询 | 查询推送设备 |
unbindDevice(username: string, sessionId: string, options?: CallOptions): Promise<void> | DELETE /users/{username}/push-devices/{session_id} | push.unbind_device | 幂等 | 解绑推送设备 |
getSettings(username: string, options?: CallOptions): Promise<WithRaw<T.PushSettings>> | GET /users/{username}/push-settings | push.settings | 查询 | 查询推送设置 |
updateSettings(username: string, params?: T.UpdatePushSettingsParams, options?: CallOptions): Promise<WithRaw<T.PushSettingsChange>> | PATCH /users/{username}/push-settings | push.update_settings | 幂等 | 修改推送设置 |
listMutes(username: string, params?: T.ListPushMutesParams, options?: CallOptions): Promise<VersionedPage<T.ConversationMute>> | GET /users/{username}/push-settings/conversations | push.mutes | 查询 | 查询会话免打扰 |
iterMutes( username: string, params?: Omit<T.ListPushMutesParams, 'cursor' | 'known_version'>, options?: IterOptions): AsyncIterable<T.ConversationMute> | 逐页调用 GET /users/{username}/push-settings/conversations | push.mutes | 查询 | 查询会话免打扰 |
muteGroup( username: string, groupId: string, mode: 'none' | 'mention_only' | (string & {}), params?: T.MuteConversationParams, options?: CallOptions): Promise<WithRaw<T.ConversationMuteChange>> | PUT /users/{username}/push-settings/conversations/group/{group_id} | push.mute_group | 幂等 | 设置会话免打扰 |
unmuteGroup(username: string, groupId: string, options?: CallOptions): Promise<WithRaw<T.ConversationUnmuteChange>> | DELETE /users/{username}/push-settings/conversations/group/{group_id} | push.unmute_group | 幂等 | 取消会话免打扰 |
muteSingle( username: string, peer: string, mode: 'none' | (string & {}), params?: T.MuteConversationParams, options?: CallOptions): Promise<WithRaw<T.ConversationMuteChange>> | PUT /users/{username}/push-settings/conversations/single/{peer} | push.mute_single | 幂等 | 设置会话免打扰 |
unmuteSingle(username: string, peer: string, options?: CallOptions): Promise<WithRaw<T.ConversationUnmuteChange>> | DELETE /users/{username}/push-settings/conversations/single/{peer} | push.unmute_single | 幂等 | 取消会话免打扰 |
聊天室 client.chatrooms
| 方法与签名 | REST 接口 | 接口名 | 自动重试 | 文档 |
|---|---|---|---|---|
create(name: string, params?: T.CreateChatroomParams, options?: CallOptions): Promise<WithRaw<T.Chatroom>> | POST /chatrooms | chatrooms.create | 不重试 | 创建聊天室 |
list(params?: T.ListChatroomsParams, options?: CallOptions): Promise<Page<T.Chatroom>> | GET /chatrooms | chatrooms.list | 查询 | 查询聊天室列表 |
iter(params?: Omit<T.ListChatroomsParams, 'cursor'>, options?: IterOptions): AsyncIterable<T.Chatroom> | 逐页调用 GET /chatrooms | chatrooms.list | 查询 | 查询聊天室列表 |
onlineCounts(roomIds: readonly string[], options?: CallOptions): Promise<WithRaw<T.RoomOnlineCount[]>> | POST /chatrooms/online-counts | chatrooms.online_counts | 查询 | 批量查询在线人数 |
get(roomId: string, options?: CallOptions): Promise<WithRaw<T.Chatroom>> | GET /chatrooms/{room_id} | chatrooms.get | 查询 | 查询聊天室信息 |
update(roomId: string, params?: T.UpdateChatroomParams, options?: CallOptions): Promise<WithRaw<T.ChatroomChange>> | PATCH /chatrooms/{room_id} | chatrooms.update | 幂等 | 修改聊天室资料 |
delete(roomId: string, options?: CallOptions): Promise<void> | DELETE /chatrooms/{room_id} | chatrooms.delete | 幂等 | 解散聊天室 |
setAdmin(roomId: string, username: string, options?: CallOptions): Promise<WithRaw<T.RoomAdminChange>> | PUT /chatrooms/{room_id}/admins/{username} | chatrooms.set_admin | 幂等 | 设置管理员 |
removeAdmin(roomId: string, username: string, options?: CallOptions): Promise<WithRaw<T.RoomAdminChange>> | DELETE /chatrooms/{room_id}/admins/{username} | chatrooms.remove_admin | 幂等 | 取消管理员 |
listAllowlist(roomId: string, params?: T.ListOptions, options?: CallOptions): Promise<Page<T.RoomAllowlistEntry>> | GET /chatrooms/{room_id}/allowlist | chatrooms.allowlist | 查询 | 查询白名单 |
iterAllowlist(roomId: string, params?: Omit<T.ListOptions, 'cursor'>, options?: IterOptions): AsyncIterable<T.RoomAllowlistEntry> | 逐页调用 GET /chatrooms/{room_id}/allowlist | chatrooms.allowlist | 查询 | 查询白名单 |
addToAllowlist(roomId: string, usernames: readonly string[], options?: CallOptions): Promise<WithRaw<T.RoomBatchResult>> | POST /chatrooms/{room_id}/allowlist | chatrooms.add_to_allowlist | 幂等 | 加入白名单 |
removeFromAllowlist(roomId: string, usernames: readonly string[], options?: CallOptions): Promise<WithRaw<T.RoomBatchResult>> | POST /chatrooms/{room_id}/allowlist/batch-delete | chatrooms.remove_from_allowlist | 幂等 | 移出白名单 |
getAttributes(roomId: string, params?: T.ChatroomsGetAttributesParams, options?: CallOptions): Promise<WithRaw<T.RoomAttributes>> | GET /chatrooms/{room_id}/attributes | chatrooms.attributes | 查询 | 查询聊天室属性 |
setAttributes( roomId: string, attributes: Readonly<Record<string, string>>, options?: CallOptions): Promise<WithRaw<T.RoomAttributesChange>> | PUT /chatrooms/{room_id}/attributes | chatrooms.set_attributes | 幂等 | 设置聊天室属性 |
removeAttributes(roomId: string, keys: readonly string[], options?: CallOptions): Promise<WithRaw<T.RoomAttributesChange>> | POST /chatrooms/{room_id}/attributes/batch-delete | chatrooms.remove_attributes | 幂等 | 删除聊天室属性 |
listBans(roomId: string, params?: T.ListOptions, options?: CallOptions): Promise<Page<T.RoomBan>> | GET /chatrooms/{room_id}/bans | chatrooms.bans | 查询 | 查询封禁名单 |
iterBans(roomId: string, params?: Omit<T.ListOptions, 'cursor'>, options?: IterOptions): AsyncIterable<T.RoomBan> | 逐页调用 GET /chatrooms/{room_id}/bans | chatrooms.bans | 查询 | 查询封禁名单 |
ban( roomId: string, usernames: readonly string[], params?: T.RoomPenaltyParams, options?: CallOptions): Promise<WithRaw<T.RoomBatchResult>> | POST /chatrooms/{room_id}/bans | chatrooms.ban | 幂等 | 封禁用户 |
unban(roomId: string, usernames: readonly string[], options?: CallOptions): Promise<WithRaw<T.RoomBatchResult>> | POST /chatrooms/{room_id}/bans/batch-delete | chatrooms.unban | 幂等 | 解除封禁 |
disable(roomId: string, params?: T.ChatroomsDisableParams, options?: CallOptions): Promise<WithRaw<T.ChatroomChange>> | POST /chatrooms/{room_id}/disable | chatrooms.disable | 幂等 | 封禁聊天室 |
enable(roomId: string, options?: CallOptions): Promise<WithRaw<T.ChatroomChange>> | POST /chatrooms/{room_id}/enable | chatrooms.enable | 幂等 | 解封聊天室 |
listMembers(roomId: string, params?: T.ListOptions, options?: CallOptions): Promise<Page<T.RoomMember>> | GET /chatrooms/{room_id}/members | chatrooms.members | 查询 | 查询聊天室成员列表 |
iterMembers(roomId: string, params?: Omit<T.ListOptions, 'cursor'>, options?: IterOptions): AsyncIterable<T.RoomMember> | 逐页调用 GET /chatrooms/{room_id}/members | chatrooms.members | 查询 | 查询聊天室成员列表 |
kick(roomId: string, usernames: readonly string[], options?: CallOptions): Promise<WithRaw<T.RoomBatchResult>> | POST /chatrooms/{room_id}/members/batch-delete | chatrooms.kick | 幂等 | 移出聊天室成员 |
getMember(roomId: string, username: string, options?: CallOptions): Promise<WithRaw<T.RoomMemberState>> | GET /chatrooms/{room_id}/members/{username} | chatrooms.member | 查询 | 查询用户是否在聊天室里 |
send(roomId: string, params: T.SendRoomMessageParams, options?: CallOptions): Promise<WithRaw<T.RoomSendResult>> | POST /chatrooms/{room_id}/messages | chatrooms.send | 幂等键;priority="low" 时不重试 | 发送聊天室消息 |
listRecentMessages( roomId: string, params?: T.ChatroomsListRecentMessagesParams, options?: CallOptions): Promise<WithRaw<T.RoomMessage[]>> | GET /chatrooms/{room_id}/messages | chatrooms.recent_messages | 查询 | 查询最近的消息 |
recall(roomId: string, messageId: string, params?: T.ChatroomsRecallParams, options?: CallOptions): Promise<WithRaw<T.RoomRecallResult>> | POST /chatrooms/{room_id}/messages/{message_id}/recall | chatrooms.recall | 幂等 | 撤回聊天室消息 |
setMuteAll(roomId: string, on: boolean, options?: CallOptions): Promise<WithRaw<T.ChatroomChange>> | PUT /chatrooms/{room_id}/mute-all(on=true)DELETE /chatrooms/{room_id}/mute-all(on=false) | chatrooms.mute_allchatrooms.unmute_all | 幂等 | 开启全员禁言 关闭全员禁言 |
listMutes(roomId: string, params?: T.ListOptions, options?: CallOptions): Promise<Page<T.RoomMute>> | GET /chatrooms/{room_id}/mutes | chatrooms.mutes | 查询 | 查询禁言名单 |
iterMutes(roomId: string, params?: Omit<T.ListOptions, 'cursor'>, options?: IterOptions): AsyncIterable<T.RoomMute> | 逐页调用 GET /chatrooms/{room_id}/mutes | chatrooms.mutes | 查询 | 查询禁言名单 |
mute( roomId: string, usernames: readonly string[], params?: T.RoomPenaltyParams, options?: CallOptions): Promise<WithRaw<T.RoomBatchResult>> | POST /chatrooms/{room_id}/mutes | chatrooms.mute | 幂等 | 禁言用户 |
unmute(roomId: string, usernames: readonly string[], options?: CallOptions): Promise<WithRaw<T.RoomBatchResult>> | POST /chatrooms/{room_id}/mutes/batch-delete | chatrooms.unmute | 幂等 | 解除禁言 |
transferOwner(roomId: string, username: string | null, options?: CallOptions): Promise<WithRaw<T.ChatroomChange>> | PUT /chatrooms/{room_id}/owner | chatrooms.transfer_owner | 幂等 | 转让所有者 |
内容安全 client.moderation
| 方法与签名 | REST 接口 | 接口名 | 自动重试 | 文档 |
|---|---|---|---|---|
processPending(handle: PendingHandler, params?: ProcessPendingParams, options?: CallOptions): Promise<number> | GET /moderation/items、GET /moderation/items/{item_id}/content、POST /moderation/items/{item_id}/decide | moderation.items 等 | 带 version 作出结论,可以重试 | 审核记录 |
getConfig(options?: CallOptions): Promise<WithRaw<T.ModerationConfig>> | GET /moderation/config | moderation.config | 查询 | 查询审核配置 |
updateConfig(params?: T.UpdateModerationConfigParams, options?: CallOptions): Promise<WithRaw<T.ModerationConfig>> | PATCH /moderation/config | moderation.update_config | 幂等 | 修改审核配置 |
listItems(params?: T.ListItemsParams, options?: CallOptions): Promise<Page<T.ModerationItem>> | GET /moderation/items | moderation.items | 查询 | 查询审核记录列表 |
iterItems(params?: Omit<T.ListItemsParams, 'cursor'>, options?: IterOptions): AsyncIterable<T.ModerationItem> | 逐页调用 GET /moderation/items | moderation.items | 查询 | 查询审核记录列表 |
batchDecide(itemIds: readonly string[], params: T.BatchDecideParams, options?: CallOptions): Promise<WithRaw<T.BatchDecideResult>> | POST /moderation/items/batch-decide | moderation.batch_decide | 幂等 | 批量作出结论 |
getItem(itemId: string, options?: CallOptions): Promise<WithRaw<T.ModerationItem>> | GET /moderation/items/{item_id} | moderation.item | 查询 | 查询审核记录 |
getItemContent(itemId: string, options?: CallOptions): Promise<WithRaw<T.ItemContent>> | GET /moderation/items/{item_id}/content | moderation.item_content | 查询 | 读取审核记录的内容 |
decide(itemId: string, params: T.DecideParams, options?: CallOptions): Promise<WithRaw<T.ModerationItem>> | POST /moderation/items/{item_id}/decide | moderation.decide | 幂等;带 actions 不带 version 时不重试 | 作出结论 |
escalate(itemId: string, params?: T.ModerationEscalateParams, options?: CallOptions): Promise<WithRaw<T.ModerationItem>> | POST /moderation/items/{item_id}/escalate | moderation.escalate | 不重试 | 转交平台 |
listPlatformActions(params?: T.ListOptions, options?: CallOptions): Promise<Page<T.PlatformAction>> | GET /moderation/platform-actions | moderation.platform_actions | 查询 | 查询平台的处置 |
iterPlatformActions(params?: Omit<T.ListOptions, 'cursor'>, options?: IterOptions): AsyncIterable<T.PlatformAction> | 逐页调用 GET /moderation/platform-actions | moderation.platform_actions | 查询 | 查询平台的处置 |
report(params: T.ReportParams, options?: CallOptions): Promise<WithRaw<T.ReportResult>> | POST /moderation/reports | moderation.report | 幂等 | 代用户举报 |
stats(params: T.ModerationStatsParams, options?: CallOptions): Promise<WithRaw<T.ModerationStats>> | GET /moderation/stats | moderation.stats | 查询 | 查询统计 |
checkText( scene: | 'message' | 'chatroom_message' | 'user_profile' | 'group_profile' | 'group_member' | 'group_request' | 'friend_request' | 'chatroom_profile' | 'chatroom_attribute' | 'media_upload' | (string & {}), params?: T.CheckTextParams, options?: CallOptions): Promise<WithRaw<T.TextCheckResult>> | POST /moderation/text-check | moderation.check_text | 查询 | 检查文本 |
listViolations(username: string, params?: T.ListOptions, options?: CallOptions): Promise<T.ViolationsPage> | GET /moderation/users/{username}/violations | moderation.violations | 查询 | 查询用户的违规 |
iterViolations(username: string, params?: Omit<T.ListOptions, 'cursor'>, options?: IterOptions): AsyncIterable<T.Violation> | 逐页调用 GET /moderation/users/{username}/violations | moderation.violations | 查询 | 查询用户的违规 |
clearViolations(username: string, params?: T.ModerationClearViolationsParams, options?: CallOptions): Promise<number> | DELETE /moderation/users/{username}/violations | moderation.clear_violations | 幂等 | 清除用户的违规 |
listWordLists(options?: CallOptions): Promise<WithRaw<T.WordList[]>> | GET /moderation/word-lists | moderation.word_lists | 查询 | 查询词库列表 |
createWordList(name: string, params?: T.CreateWordListParams, options?: CallOptions): Promise<WithRaw<T.WordList>> | POST /moderation/word-lists | moderation.create_word_list | 不重试 | 创建词库 |
getWordList(listId: string, options?: CallOptions): Promise<WithRaw<T.WordList>> | GET /moderation/word-lists/{list_id} | moderation.word_list | 查询 | 查询词库 |
updateWordList(listId: string, params?: T.UpdateWordListParams, options?: CallOptions): Promise<WithRaw<T.WordList>> | PATCH /moderation/word-lists/{list_id} | moderation.update_word_list | 幂等 | 修改词库 |
deleteWordList(listId: string, options?: CallOptions): Promise<void> | DELETE /moderation/word-lists/{list_id} | moderation.delete_word_list | 幂等 | 删除词库 |
listWords(listId: string, params?: T.ListWordsParams, options?: CallOptions): Promise<Page<T.Word>> | GET /moderation/word-lists/{list_id}/words | moderation.words | 查询 | 查询词条 |
iterWords(listId: string, params?: Omit<T.ListWordsParams, 'cursor'>, options?: IterOptions): AsyncIterable<T.Word> | 逐页调用 GET /moderation/word-lists/{list_id}/words | moderation.words | 查询 | 查询词条 |
addWords(listId: string, words: readonly string[], options?: CallOptions): Promise<WithRaw<T.AddWordsResult>> | POST /moderation/word-lists/{list_id}/words/batch | moderation.add_words | 幂等 | 添加词条 |
removeWords(listId: string, words: readonly string[], options?: CallOptions): Promise<number> | POST /moderation/word-lists/{list_id}/words/batch-delete | moderation.remove_words | 幂等 | 删除词条 |
音视频通话 client.calls
| 方法与签名 | REST 接口 | 接口名 | 自动重试 | 文档 |
|---|---|---|---|---|
list(params?: T.ListCallsParams, options?: CallOptions): Promise<Page<T.Call>> | GET /calls | calls.list | 查询 | 查询通话列表 |
iter(params?: Omit<T.ListCallsParams, 'cursor'>, options?: IterOptions): AsyncIterable<T.Call> | 逐页调用 GET /calls | calls.list | 查询 | 查询通话列表 |
get(callId: string, options?: CallOptions): Promise<WithRaw<T.Call>> | GET /calls/{call_id} | calls.get | 查询 | 查询通话详情 |
end(callId: string, params?: T.CallsEndParams, options?: CallOptions): Promise<WithRaw<T.CallChange>> | POST /calls/{call_id}/end | calls.end | 幂等 | 结束通话 |
removeMember( callId: string, username: string, params?: T.CallsRemoveMemberParams, options?: CallOptions): Promise<WithRaw<T.CallChange>> | POST /calls/{call_id}/members/{username}/remove | calls.remove_member | 幂等 | 把成员移出通话 |
stats(from: string, to: string, options?: CallOptions): Promise<WithRaw<T.CallDayStats[]>> | GET /rtc/stats | calls.stats | 查询 | 查询通话统计 |
getActiveCall(username: string, options?: CallOptions): Promise<WithRaw<T.ActiveCalls>> | GET /users/{username}/calls/active | calls.active_of | 查询 | 查询用户正在进行的通话 |
在线状态 client.presence
| 方法与签名 | REST 接口 | 接口名 | 自动重试 | 文档 |
|---|---|---|---|---|
query(usernames: readonly string[], options?: CallOptions): Promise<WithRaw<T.Presence[]>> | POST /presence/query | presence.query | 查询 | 批量查询在线状态 |
get(username: string, options?: CallOptions): Promise<WithRaw<T.Presence>> | GET /users/{username}/presence | presence.get | 查询 | 查询用户的在线状态 |
文件便利方法的参数
client.media.upload(source, params, options?) 的 source 为 UploadSource,params 为 UploadParams,返回 MediaFile。resumeUpload(fileId, source, params?, options?) 使用 ResumeParams,恢复有效的上传会话。download(url, dest, options?) 的目标为 DownloadTarget,返回写入的字节数。参数和来源限制见文件上传与下载。upload、download 的统计接口名分别为 media.upload、media.download。
内容安全便利方法
client.moderation.processPending(handle, params?, options?): Promise<number> 逐条读取待审核记录,调用 PendingHandler 并提交结论,返回已提交条数。params 为 { scene?, limit?, stopOnError? };处理函数收到 (item, content, { signal }),返回 Decision、null 或 undefined,也可返回 Promise。Decision 的字段为 decision、actions?、count_violation?、note?,见内容安全复审。统计接口名为 moderation.process_pending。
客户端管理方法
| 方法或属性 | 说明 |
|---|---|
withOptions(options) | 创建共用状态的配置视图 |
updateCredentials(clientId, clientSecret) | 更新应用凭据 |
token(options?): Promise<string> | 取得当前有效令牌;options 可传 signal。不要将返回值写入日志 |
appId | 首次换取令牌前为 null,之后为应用 ID |
stats(): Stats | 获取各接口请求、失败、重试和限流等待统计 |
close(): Promise<void> | 关闭客户端;视图的 close 不关闭原客户端 |
客户端配置见安装与创建客户端。回调处理器及框架适配见接收回调。
独立 RTC 频道:client.channels
服务只管理频道,不替用户加入媒体。参数及响应见频道 REST API。接口地址省略通用应用前缀。
| 方法 | REST 接口 | 参数说明 |
|---|---|---|
create | PUT /rtc/channels/{channel_id} | T.RTCChannelCreateParams 与可选 CallOptions |
list | GET /rtc/channels | T.RTCChannelListParams 与可选 CallOptions |
get | GET /rtc/channels/{channel_id} | 路径 ID 与可选 CallOptions |
update | PATCH /rtc/channels/{channel_id} | T.RTCChannelUpdateParams 与可选 CallOptions |
close | POST /rtc/channels/{channel_id}/close | T.RTCChannelCloseParams 与可选 CallOptions |
issueTickets | POST /rtc/channels/{channel_id}/tickets | T.RTCChannelIssueTicketsParams 与可选 CallOptions |
revokeTickets | POST /rtc/channels/{channel_id}/tickets/revoke | T.RTCChannelRevokeTicketsParams 与可选 CallOptions |
sessions | GET /rtc/channels/{channel_id}/sessions | T.RTCChannelSessionsParams 与可选 CallOptions |
removeMember | POST /rtc/channels/{channel_id}/members/{username}/remove | T.RTCChannelRemoveMemberParams 与可选 CallOptions |
bans | GET /rtc/channels/{channel_id}/bans | T.RTCChannelBansParams 与可选 CallOptions |
getBan | GET /rtc/channels/{channel_id}/bans/{username} | 路径 ID 与可选 CallOptions |
ban | PUT /rtc/channels/{channel_id}/bans/{username} | T.RTCChannelBanParams 与可选 CallOptions |
unban | DELETE /rtc/channels/{channel_id}/bans/{username} | T.RTCChannelUnbanParams 与可选 CallOptions |
stats | GET /rtc/channel-stats | T.RTCChannelStatsParams 与可选 CallOptions |
usageAdjustments | GET /rtc/channel-usage-adjustments | T.RTCChannelUsageAdjustmentsParams 与可选 CallOptions |
结果保留频道、会话、票据、封禁、统计和更正的具体模型及原始数据。创建包装的 created 来自 201,关闭 / 移出包装的 pending 来自 202;不是 HTTP 响应新增的同名字段。末页 next_cursor、无封禁 ban 及可清除期限保留 null。
这些频道分页返回具体页对象;使用 next_cursor 手动继续,不照搬原 Calls 的 All / iter。expires_at 保留“不传 / null 清除 / 值设置”三态。签票据不自动重试,移出和撤票使用固定 operation_id。
