@heybox/hb-sdk-protocol 0.8.1 → 0.8.2-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.js +807 -2
- package/dist/index.esm.js +807 -2
- package/package.json +1 -1
- package/src/bridge.ts +24 -0
- package/src/capabilities.ts +19 -0
- package/src/constants.ts +25 -0
- package/src/guards.ts +645 -0
- package/src/payloads.ts +454 -34
- package/src/permissions.ts +141 -0
- package/types/bridge.d.ts +23 -0
- package/types/capabilities.d.ts +19 -0
- package/types/constants.d.ts +22 -0
- package/types/guards.d.ts +645 -0
- package/types/payloads.d.ts +393 -21
- package/types/permissions.d.ts +141 -0
package/src/payloads.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/** 当前用户信息与登录能力支持的完整 scope
|
|
2
|
-
export const USER_INFO_AUTHORIZATION_SCOPES = ['identity', 'profile'] as const;
|
|
1
|
+
/** 当前用户信息与登录能力支持的完整 scope 目录(canonical 顺序)。 */
|
|
2
|
+
export const USER_INFO_AUTHORIZATION_SCOPES = ['identity', 'profile', 'steam_account'] as const;
|
|
3
3
|
|
|
4
4
|
/** 用户信息授权 scope。 */
|
|
5
5
|
export type UserInfoAuthorizationScope = (typeof USER_INFO_AUTHORIZATION_SCOPES)[number];
|
|
@@ -13,98 +13,256 @@ export interface LoginResult {
|
|
|
13
13
|
scopes: LoginScope[];
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* 单个用户信息 scope 对当前小程序的授权状态。
|
|
18
|
+
*
|
|
19
|
+
* @remarks
|
|
20
|
+
* - `not_required`:Host 判定该 scope 无需单独征得用户同意。
|
|
21
|
+
* - `not_requested`:当前授权上下文尚未申请或授予该 scope。
|
|
22
|
+
* - `granted`:当前小程序可以读取该 scope 对应的资料。
|
|
23
|
+
* - `denied`:用户拒绝过该 scope,或该 scope 已被撤销。
|
|
24
|
+
*
|
|
25
|
+
* 该状态描述用户授权,不代表 `package.json#heybox.permissions` 的声明或平台审批结果。
|
|
26
|
+
* 当前 Runtime 成功执行 `user.getInfo()` 时会静默授予 `identity` 与 `profile`,因此两项均为
|
|
27
|
+
* `granted`;其余状态仍保留在公共协议中,供兼容 Host 和授权状态事件使用。
|
|
28
|
+
*/
|
|
17
29
|
export type UserInfoAuthorizationStatus = 'not_required' | 'not_requested' | 'granted' | 'denied';
|
|
18
30
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
31
|
+
/**
|
|
32
|
+
* 当前小程序对 canonical 用户信息 scope 的授权状态。
|
|
33
|
+
*
|
|
34
|
+
* @remarks
|
|
35
|
+
* 该对象固定包含 `identity` 与 `profile`,新能力版本还可能包含可选的 `steam_account`。
|
|
36
|
+
* `steam_account` 已授权不代表当前一定已绑定 Steam,只有
|
|
37
|
+
* {@link AuthorizedUserInfo.steam_id} 存在才表示当前有主绑定。该对象只反映用户授权层;开发者仍需
|
|
38
|
+
* 在 Manifest 中声明 `userInfo` / `steamLibrary`,两层门禁不能互相替代。
|
|
39
|
+
*/
|
|
40
|
+
export interface UserInfoAuthorization {
|
|
41
|
+
/**
|
|
42
|
+
* 隔离身份授权状态;控制 `AuthorizedUserInfo.app_user_id` 是否可向当前小程序披露。
|
|
43
|
+
*/
|
|
44
|
+
identity: UserInfoAuthorizationStatus;
|
|
45
|
+
/**
|
|
46
|
+
* 公开资料授权状态;控制 `AuthorizedUserInfo.profile` 中昵称和头像是否可披露。
|
|
47
|
+
*/
|
|
48
|
+
profile: UserInfoAuthorizationStatus;
|
|
49
|
+
/** Steam 账号授权状态;legacy Runtime/Version 可能缺失该键。 */
|
|
50
|
+
steam_account?: UserInfoAuthorizationStatus;
|
|
51
|
+
}
|
|
23
52
|
|
|
24
53
|
/**
|
|
25
54
|
* 已获准向当前小程序披露的用户资料。
|
|
26
55
|
*
|
|
27
56
|
* @remarks
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
57
|
+
* 当前黑盒 APP 用户已登录时,Runtime 会隐式授予 `identity` 与 `profile`,静默建立或
|
|
58
|
+
* 读取隔离身份,并由 `user.getInfo()` 返回该对象。此过程只要求 Manifest 声明
|
|
59
|
+
* `userInfo`,不要求公开 `network` 权限,也不会返回授权码或创建开发者服务端会话。
|
|
60
|
+
*
|
|
61
|
+
* 撤销授权后旧身份失效;调用方应停止使用旧值,并清理本地缓存与开发者服务端会话。
|
|
62
|
+
* 再次调用 `user.getInfo()` 会按当前账号重新建立隔离身份,不能假定新旧 `app_user_id`
|
|
63
|
+
* 相同。
|
|
64
|
+
*
|
|
65
|
+
* @see [auth.login](/reference/sdk/auth/login) 获取供开发者服务端换票的一次性授权码。
|
|
66
|
+
* @see [user.revokeAuthorization](/reference/sdk/user/revokeAuthorization) 撤销当前小程序的用户授权。
|
|
32
67
|
*/
|
|
33
68
|
export interface AuthorizedUserInfo {
|
|
34
69
|
/**
|
|
35
|
-
*
|
|
70
|
+
* 当前用户在当前小程序与当前授权有效期内稳定的隔离标识;不是黑盒用户 ID 或登录凭据。
|
|
36
71
|
*
|
|
37
72
|
* @remarks
|
|
38
|
-
*
|
|
39
|
-
*
|
|
73
|
+
* 该值在当前授权有效期内可作为“当前用户 × 当前小程序”的稳定关联键;同一用户在不同
|
|
74
|
+
* 小程序中的值不同,授权撤销后旧值失效。它不是黑盒用户 ID、登录凭据或主站私有接口凭据。
|
|
75
|
+
* 示例:
|
|
40
76
|
* `au_1_x7K9mQ2pL4vN8cR3tY6wB1zD5fH`。调用方必须把完整值视为不透明字符串,
|
|
41
|
-
*
|
|
77
|
+
* 不应解析格式、依赖固定长度或尝试跨小程序关联用户。
|
|
42
78
|
*/
|
|
43
79
|
app_user_id: string;
|
|
44
|
-
/**
|
|
45
|
-
|
|
80
|
+
/**
|
|
81
|
+
* `profile` 获准披露时返回公开资料:`nickname` 是展示昵称,`avatar` 是头像资源字符串;
|
|
82
|
+
* 未获准披露时为 `null`。
|
|
83
|
+
*
|
|
84
|
+
* @remarks
|
|
85
|
+
* 当前 Runtime 的静默读取会授予 `profile`;资料读取暂时失败时仍可能返回对象,但
|
|
86
|
+
* `nickname` 或 `avatar` 为空字符串。它们只适合展示,不应作为登录态、授权状态、
|
|
87
|
+
* 唯一用户标识或鉴权依据。
|
|
88
|
+
*/
|
|
89
|
+
profile: {
|
|
90
|
+
/** 当前小黑盒账号的公开展示昵称;空字符串表示本次未取得可展示昵称。 */
|
|
91
|
+
nickname: string;
|
|
92
|
+
/** 当前小黑盒账号的公开头像资源字符串;空字符串表示本次未取得可展示头像。 */
|
|
93
|
+
avatar: string;
|
|
94
|
+
} | null;
|
|
95
|
+
/**
|
|
96
|
+
* `steam_account` 已授权且当前已绑定 Steam 时返回 canonical SteamID64。
|
|
97
|
+
*
|
|
98
|
+
* @remarks
|
|
99
|
+
* 始终表示为 string,禁止作为 JSON number 使用;未绑定时省略该字段,不返回空字符串或
|
|
100
|
+
* `null`。只返回主绑定 SteamID64,不包含 Steam 昵称、头像、好友码、公开状态或绑定来源。
|
|
101
|
+
*/
|
|
102
|
+
steam_id?: string;
|
|
46
103
|
}
|
|
47
104
|
|
|
48
105
|
/**
|
|
49
106
|
* 当前黑盒 APP 登录态、授权状态和已获准披露的用户资料。
|
|
50
107
|
*
|
|
51
108
|
* @remarks
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
109
|
+
* 以 `isHeyboxAppLoggedIn` 作为判别字段处理返回值:
|
|
110
|
+
*
|
|
111
|
+
* - `false`:当前 Host 没有已登录的小黑盒账号,`authorization` 与 `userInfo` 固定为 `null`。
|
|
112
|
+
* 这是正常业务分支,不会抛出登录错误。
|
|
113
|
+
* - `true` 且 `userInfo` 非空:`authorization` 固定包含 `identity`、`profile` 两项状态;
|
|
114
|
+
* `userInfo` 包含当前小程序隔离的 `app_user_id`,而 `profile` 仍需独立判空。
|
|
115
|
+
* - `true` 且 `userInfo` 为 `null`:公共协议为兼容 Host 保留的“已登录但资料未披露/不可用”分支。
|
|
116
|
+
* 当前 Runtime 成功读取隔离身份时返回非空对象,但调用方仍应按类型处理该分支。
|
|
117
|
+
*
|
|
118
|
+
* `user.getInfo()` 不返回 `code`、token、cookie 或黑盒用户 ID。需要建立开发者服务端会话时,
|
|
119
|
+
* 应在可信用户操作中调用 `auth.login()`,再把一次性 `code` 交给开发者自己的服务端。
|
|
120
|
+
*
|
|
121
|
+
* @see [auth.login](/reference/sdk/auth/login)
|
|
122
|
+
* @see [user.revokeAuthorization](/reference/sdk/user/revokeAuthorization)
|
|
56
123
|
*/
|
|
57
124
|
export type MiniProgramUserInfoResult =
|
|
58
|
-
| {
|
|
59
|
-
|
|
125
|
+
| {
|
|
126
|
+
/** `false` 是未登录分支的稳定判别值。 */
|
|
127
|
+
isHeyboxAppLoggedIn: false;
|
|
128
|
+
/** 未登录时没有当前小程序的用户授权上下文。 */
|
|
129
|
+
authorization: null;
|
|
130
|
+
/** 未登录时不会披露隔离身份或公开资料。 */
|
|
131
|
+
userInfo: null;
|
|
132
|
+
}
|
|
133
|
+
| {
|
|
134
|
+
/** `true` 表示 Host 当前有已登录的小黑盒账号,不等同于开发者服务端已建立会话。 */
|
|
135
|
+
isHeyboxAppLoggedIn: true;
|
|
136
|
+
/** 当前小程序的用户授权状态;与 Manifest 权限声明是两层独立门禁。 */
|
|
137
|
+
authorization: UserInfoAuthorization;
|
|
138
|
+
/** 已获准披露的隔离身份与公开资料;兼容 Host 可能返回 `null`。 */
|
|
139
|
+
userInfo: AuthorizedUserInfo | null;
|
|
140
|
+
};
|
|
141
|
+
/** `user.getInfo` 不接收入参,也不能由页面指定小程序或用户身份。 */
|
|
60
142
|
export type GetUserInfoPayload = void;
|
|
143
|
+
/** `user.getInfo` 的判别联合返回值;先判断 `isHeyboxAppLoggedIn`,再判断 `userInfo`。 */
|
|
61
144
|
export type GetUserInfoResult = MiniProgramUserInfoResult;
|
|
145
|
+
/**
|
|
146
|
+
* `user.revokeAuthorization` 不接受 wire payload。
|
|
147
|
+
*
|
|
148
|
+
* @remarks
|
|
149
|
+
* 小程序 ID、当前小黑盒用户和可信手势状态由 Host 注入;发送任何非 `undefined` payload
|
|
150
|
+
* 都会返回 `INVALID_PARAMS`。该 method 无需 Manifest 权限,但仍要求当前用户已登录且调用
|
|
151
|
+
* 来自可信用户操作。
|
|
152
|
+
*
|
|
153
|
+
* @see [App-facing user.revokeAuthorization](/reference/sdk/user/revokeAuthorization)
|
|
154
|
+
*/
|
|
62
155
|
export type RevokeAuthorizationPayload = void;
|
|
156
|
+
/**
|
|
157
|
+
* 撤销成功后的 wire 结果为 `undefined`。
|
|
158
|
+
*
|
|
159
|
+
* @remarks
|
|
160
|
+
* 成功后 Runtime 会使缓存的用户授权和隔离身份失效,并发布
|
|
161
|
+
* `user_info_authorization_change`;业务持久化数据和开发者服务端会话不在该结果的清理范围内。
|
|
162
|
+
*/
|
|
63
163
|
export type RevokeAuthorizationResult = void;
|
|
164
|
+
/**
|
|
165
|
+
* Steam 游戏库排序维度:`weeks` 按最近两周时长,`all` 按累计时长,`achieved` 按成就数。
|
|
166
|
+
*/
|
|
64
167
|
export type SteamGameListSort = 'weeks' | 'all' | 'achieved';
|
|
168
|
+
/** `user.getSteamGameList` 的 wire 请求对象;字段校验和默认值由 Host Runtime 执行。 */
|
|
65
169
|
interface GetSteamGameListRequest {
|
|
170
|
+
/** trim 后的非空 Steam ID;省略时使用当前用户的默认绑定账号。 */
|
|
66
171
|
steamId?: string;
|
|
172
|
+
/** 正整数页大小,默认 `20`,大于 `100` 时收窄为 `100`。 */
|
|
67
173
|
limit?: number;
|
|
174
|
+
/** 非负整数 offset,默认 `0`。 */
|
|
68
175
|
offset?: number;
|
|
176
|
+
/** 排序维度,默认 `weeks`。 */
|
|
69
177
|
sort?: SteamGameListSort;
|
|
178
|
+
/** trim 后最多保留前 100 个 UTF-16 code unit;空值会被省略。 */
|
|
70
179
|
q?: string;
|
|
180
|
+
/** 是否包含隐藏游戏,默认 `false`;仅接受 boolean。 */
|
|
71
181
|
includeHidden?: boolean;
|
|
72
182
|
}
|
|
183
|
+
/**
|
|
184
|
+
* `user.getSteamGameList` 的可选 wire payload;`undefined` 使用全部默认查询值。
|
|
185
|
+
*
|
|
186
|
+
* @remarks
|
|
187
|
+
* Host 会拒绝未知字段、数字字符串和用 `0` / `1` 代替 boolean 的值。该 method 要求
|
|
188
|
+
* `steamLibrary` 权限,但不要求公开 `network` 权限或可信用户手势。
|
|
189
|
+
*
|
|
190
|
+
* @see [App-facing user.getSteamGameList](/reference/sdk/user/getSteamGameList)
|
|
191
|
+
*/
|
|
73
192
|
export type GetSteamGameListPayload = GetSteamGameListRequest | undefined;
|
|
193
|
+
/**
|
|
194
|
+
* Steam 游戏价格 wire 结果。所有字段都可省略,且协议不携带币种或最小货币单位。
|
|
195
|
+
*/
|
|
74
196
|
export type SteamGamePrice = {
|
|
197
|
+
/** 当前售价的非空展示文本。 */
|
|
75
198
|
current?: string;
|
|
199
|
+
/** 原价的非空展示文本。 */
|
|
76
200
|
initial?: string;
|
|
201
|
+
/** 服务端原始折扣数值;协议不承诺比例、百分比或取值范围。 */
|
|
77
202
|
discount?: number;
|
|
203
|
+
/** 服务端最低价数值;币种和缩放单位不属于本协议。 */
|
|
78
204
|
lowestPrice?: number;
|
|
205
|
+
/** 截止时间展示文本,不保证可解析为日期。 */
|
|
79
206
|
deadlineDate?: string;
|
|
207
|
+
/** 服务端原始折扣截止时间数值;协议不承诺单位或时钟来源。 */
|
|
80
208
|
deadlineTimestamp?: number;
|
|
81
209
|
};
|
|
210
|
+
/**
|
|
211
|
+
* 经过 Host Runtime 规范化的 Steam 游戏条目;无效必填字段会导致整条记录被移除。
|
|
212
|
+
*/
|
|
82
213
|
export interface SteamGameListItem {
|
|
214
|
+
/** 小黑盒游戏目录 ID。 */
|
|
83
215
|
appid: number;
|
|
216
|
+
/** Steam App ID;缺失时由 Host 回退为 `appid`。 */
|
|
84
217
|
steamAppid: number;
|
|
218
|
+
/** trim 后的非空名称。 */
|
|
85
219
|
name: string;
|
|
220
|
+
/** 非空封面或主图 URL 字符串。 */
|
|
86
221
|
image?: string;
|
|
222
|
+
/** 非空 Steam 图标 URL 字符串。 */
|
|
87
223
|
icon?: string;
|
|
224
|
+
/** 服务端原始累计游玩时长数值;协议不承诺单位。 */
|
|
88
225
|
playtimeForever?: number;
|
|
226
|
+
/** 服务端原始最近游玩时长数值;协议不承诺单位。 */
|
|
89
227
|
playtime2Weeks?: number;
|
|
228
|
+
/** 非空标签列表;没有有效标签时省略。 */
|
|
90
229
|
tags?: string[];
|
|
230
|
+
/** 至少有一个可用价格字段时存在。 */
|
|
91
231
|
price?: SteamGamePrice;
|
|
92
232
|
}
|
|
233
|
+
/** Steam 游戏库的 offset 分页结果。 */
|
|
93
234
|
export interface SteamGameListData {
|
|
235
|
+
/** 当前页通过规范化校验的游戏条目。 */
|
|
94
236
|
gameList: SteamGameListItem[];
|
|
237
|
+
/** 服务端游戏总数;缺失或无效时省略。 */
|
|
95
238
|
total?: number;
|
|
239
|
+
/** 有 `total` 时按 `nextOffset < total` 计算,否则按本页是否达到有效 `limit` 推断。 */
|
|
96
240
|
hasMore: boolean;
|
|
241
|
+
/** `请求 offset + gameList.length`;下一页应直接复用该值。 */
|
|
97
242
|
nextOffset: number;
|
|
243
|
+
/** 服务端对结果是否属于当前用户本人的标记;不可识别时省略。 */
|
|
98
244
|
isMe?: boolean;
|
|
99
245
|
}
|
|
246
|
+
/**
|
|
247
|
+
* `user.getSteamGameList` 的判别联合结果。
|
|
248
|
+
*
|
|
249
|
+
* @remarks
|
|
250
|
+
* - `isLogin: false`:未登录,`isBound` 固定为 `false`,`data` 固定为 `null`。
|
|
251
|
+
* - `isLogin: true, isBound: false`:已登录但未绑定 Steam,`data` 固定为 `null`。
|
|
252
|
+
* - 两者均为 `true`:`data` 固定为 {@link SteamGameListData},其中 `gameList` 可以为空。
|
|
253
|
+
*/
|
|
100
254
|
export type GetSteamGameListResult =
|
|
101
255
|
| { isLogin: false; isBound: false; data: null }
|
|
102
256
|
| { isLogin: true; isBound: false; data: null }
|
|
103
257
|
| { isLogin: true; isBound: true; data: SteamGameListData };
|
|
104
258
|
|
|
259
|
+
/** 公开分享渠道;Host 可以只支持其中一部分,值区分大小写。 */
|
|
105
260
|
export type MiniProgramShareChannel = 'wechatSession' | 'wechatTimeline' | 'qqFriend' | 'qzone' | 'weibo';
|
|
261
|
+
/** 社区发帖页的可编辑分区与话题预置。 */
|
|
106
262
|
export interface MiniProgramSharePostOptions {
|
|
263
|
+
/** 正安全整数或 trim 后非空字符串;Runtime 转为字符串并去重。 */
|
|
107
264
|
topicIds?: (string | number)[];
|
|
265
|
+
/** trim 后非空且不以 `#` 开头或结尾的字符串;Runtime 去重。 */
|
|
108
266
|
topics?: string[];
|
|
109
267
|
}
|
|
110
268
|
export interface MiniProgramScreenshotRect {
|
|
@@ -113,14 +271,31 @@ export interface MiniProgramScreenshotRect {
|
|
|
113
271
|
width: number;
|
|
114
272
|
height: number;
|
|
115
273
|
}
|
|
274
|
+
/**
|
|
275
|
+
* `share.showShareMenu` 的 wire payload;落地页由 Runtime 固定生成,不接受 `url` 字段。
|
|
276
|
+
*/
|
|
116
277
|
export type ShowShareMenuPayload = {
|
|
278
|
+
/** trim 后必须非空;原字符串会交给 Host。 */
|
|
117
279
|
title: string;
|
|
280
|
+
/** trim 后必须非空;原字符串会交给 Host。 */
|
|
118
281
|
desc: string;
|
|
282
|
+
/** 经 Runtime 校验并编码到固定分享 URL 的 JSON-compatible 状态。 */
|
|
119
283
|
extra?: unknown;
|
|
284
|
+
/** 可解析的绝对 HTTP(S) 缩略图 URL。 */
|
|
120
285
|
imageUrl?: string;
|
|
286
|
+
/** 可选站外渠道;不能与有效社区 `post` 同时使用。 */
|
|
121
287
|
channel?: MiniProgramShareChannel;
|
|
288
|
+
/**
|
|
289
|
+
* 可编辑社区预置;`null` 等同省略。普通分享最多保留一个分区,开发态严格拒绝无效项,
|
|
290
|
+
* 生产态过滤无效项并在与 `channel` 冲突时省略 `post`。
|
|
291
|
+
*/
|
|
122
292
|
post?: MiniProgramSharePostOptions | null;
|
|
123
293
|
};
|
|
294
|
+
/**
|
|
295
|
+
* Host 分享面板返回的不透明值。
|
|
296
|
+
*
|
|
297
|
+
* @remarks 可能是 `undefined` 或任意对象;不能依赖结构或真假值判断用户分享结果。
|
|
298
|
+
*/
|
|
124
299
|
export type ShowShareMenuResult = unknown;
|
|
125
300
|
export type CopyLinkPayload = { extra?: unknown } | undefined;
|
|
126
301
|
export type CopyLinkResult = string;
|
|
@@ -413,29 +588,96 @@ export interface SetClipboardPayload {
|
|
|
413
588
|
}
|
|
414
589
|
export type SetClipboardResult = void;
|
|
415
590
|
|
|
591
|
+
/**
|
|
592
|
+
* `navigation.close` 的无参 wire payload。
|
|
593
|
+
*
|
|
594
|
+
* @remarks
|
|
595
|
+
* App-facing API 发送 `undefined`。Host Runtime 为兼容协议也接受空普通对象,但非空对象、
|
|
596
|
+
* 数组或其他值会返回 `INVALID_PARAMS`;payload 不能携带强制关闭、原因或窗口标识。
|
|
597
|
+
*
|
|
598
|
+
* @see [App-facing navigation.close](/reference/sdk/navigation/close)
|
|
599
|
+
*/
|
|
416
600
|
export type ClosePayload = void;
|
|
601
|
+
/**
|
|
602
|
+
* Host 接受关闭请求后的 wire 结果为 `undefined`。
|
|
603
|
+
*
|
|
604
|
+
* @remarks
|
|
605
|
+
* 该结果不保证 iframe 在响应抵达后继续存活,也不包含最终关闭状态。Host 销毁环境时会尽力
|
|
606
|
+
* 派发 `unload`;关键持久化不能依赖 Promise 后续语句或 `unload` 回调。
|
|
607
|
+
*/
|
|
417
608
|
export type CloseResult = void;
|
|
609
|
+
/**
|
|
610
|
+
* `navigation.reload` 的无参 wire payload。
|
|
611
|
+
*
|
|
612
|
+
* @remarks
|
|
613
|
+
* App-facing API 发送 `undefined`。Host Runtime 为兼容协议也接受空普通对象,但非空对象、
|
|
614
|
+
* 数组或其他值会返回 `INVALID_PARAMS`;payload 不能指定缓存策略、目标 URL 或 reload 模式。
|
|
615
|
+
*
|
|
616
|
+
* @see [App-facing navigation.reload](/reference/sdk/navigation/reload)
|
|
617
|
+
*/
|
|
418
618
|
export type ReloadPayload = void;
|
|
619
|
+
/**
|
|
620
|
+
* Host 接受 reload 请求后的 wire 结果为 `undefined`。
|
|
621
|
+
*
|
|
622
|
+
* @remarks
|
|
623
|
+
* 该结果不包含新页面加载状态或新 SDK 实例。旧页面内存、监听和 pending 请求不会跨 reload
|
|
624
|
+
* 保留;关键持久化不能依赖 Promise 后续语句或 `unload` 回调。
|
|
625
|
+
*/
|
|
419
626
|
export type ReloadResult = void;
|
|
627
|
+
/** 允许打开的 App 页面目标白名单;不包含任意 URL、scheme 或内部路由。 */
|
|
420
628
|
export type MiniProgramAppPageTarget = 'game_detail' | 'user_detail' | 'post_detail';
|
|
629
|
+
/** 游戏平台类型:PC、主机或移动游戏。 */
|
|
421
630
|
export type MiniProgramGameDetailGameType = 'pc' | 'console' | 'mobile';
|
|
631
|
+
/** 游戏详情首屏:详情主页或百科页。 */
|
|
422
632
|
export type MiniProgramGameDetailPage = 'game' | 'wiki';
|
|
633
|
+
/** 打开游戏详情页的规范化 wire payload。 */
|
|
423
634
|
export type OpenGameDetailAppPagePayload = {
|
|
635
|
+
/** 固定判别值。 */
|
|
424
636
|
target: 'game_detail';
|
|
637
|
+
/** trim 后的非空游戏 app ID 字符串。 */
|
|
425
638
|
appId: string;
|
|
639
|
+
/** 只允许 `pc`、`console`、`mobile`。 */
|
|
426
640
|
gameType: MiniProgramGameDetailGameType;
|
|
641
|
+
/** 可选首屏,只允许 `game` 或 `wiki`。 */
|
|
427
642
|
page?: MiniProgramGameDetailPage;
|
|
643
|
+
/** trim 后的非空来源标识。 */
|
|
428
644
|
hSrc?: string;
|
|
645
|
+
/** trim 后的非空 SKU ID 字符串。 */
|
|
429
646
|
skuId?: string;
|
|
430
647
|
};
|
|
431
|
-
|
|
648
|
+
/** 打开用户详情页的规范化 wire payload。 */
|
|
649
|
+
export type OpenUserDetailAppPagePayload = {
|
|
650
|
+
/** 固定判别值。 */
|
|
651
|
+
target: 'user_detail';
|
|
652
|
+
/** trim 后的非空 `heybox_id` 字符串。 */
|
|
653
|
+
userId: string;
|
|
654
|
+
};
|
|
655
|
+
/** 打开帖子详情页的规范化 wire payload。 */
|
|
432
656
|
export type OpenPostDetailAppPagePayload = {
|
|
657
|
+
/** 固定判别值。 */
|
|
433
658
|
target: 'post_detail';
|
|
659
|
+
/** trim 后的非空帖子 ID 字符串。 */
|
|
434
660
|
linkId: string;
|
|
661
|
+
/** 可选的非空根评论 ID 字符串。 */
|
|
435
662
|
rootCommentId?: string;
|
|
663
|
+
/** 可选的非空目标评论 ID 字符串。 */
|
|
436
664
|
commentId?: string;
|
|
437
665
|
};
|
|
666
|
+
/**
|
|
667
|
+
* `navigation.openAppPage` 的判别联合 wire payload。
|
|
668
|
+
*
|
|
669
|
+
* @remarks
|
|
670
|
+
* Runtime 只读取上述白名单字段并构造固定 Host 路由;额外 URL、path、scheme 或窗口字段
|
|
671
|
+
* 不会透传。移动端 Host 支持三个目标,当前 PC Host 只支持 `game_detail` 且只消费 `appId`。
|
|
672
|
+
*
|
|
673
|
+
* @see [App-facing navigation.openAppPage](/reference/sdk/navigation/openAppPage)
|
|
674
|
+
*/
|
|
438
675
|
export type OpenAppPagePayload = OpenGameDetailAppPagePayload | OpenUserDetailAppPagePayload | OpenPostDetailAppPagePayload;
|
|
676
|
+
/**
|
|
677
|
+
* Host 接收参数并发起受控路由后的结果为 `undefined`。
|
|
678
|
+
*
|
|
679
|
+
* @remarks 不表示目标页加载完成,也不返回目标页数据、关闭结果或回调值。
|
|
680
|
+
*/
|
|
439
681
|
export type OpenAppPageResult = void;
|
|
440
682
|
|
|
441
683
|
export type LeaderboardOrder = 'asc' | 'desc';
|
|
@@ -483,9 +725,38 @@ export interface GetLeaderboardInfoResult {
|
|
|
483
725
|
rankLimit: number;
|
|
484
726
|
}
|
|
485
727
|
|
|
486
|
-
/**
|
|
728
|
+
/**
|
|
729
|
+
* 当前 Companion 产物声明并由 Host 确认的可选能力。
|
|
730
|
+
*
|
|
731
|
+
* @remarks
|
|
732
|
+
* - `stdio`:启动后的 Session 可以读写原始 stdin/stdout/stderr 字节流。
|
|
733
|
+
* - `attachments`:Session 可以按 opaque ID 打开 Host 衰减为只读的受控附件。
|
|
734
|
+
* - `notifications`:Session 可以请求 Host 展示固定类别的系统通知。
|
|
735
|
+
*
|
|
736
|
+
* 能力出现在 {@link CompanionInfo.capabilities} 只描述当前产物合同,不表示已经准备完成、
|
|
737
|
+
* 已经启动或当前 Host 一定能成功执行每次操作。启动后仍应按 `CompanionSession` 对应可选
|
|
738
|
+
* 属性是否存在进行分支。
|
|
739
|
+
*/
|
|
487
740
|
export type CompanionCapability = 'stdio' | 'attachments' | 'notifications';
|
|
741
|
+
|
|
742
|
+
/**
|
|
743
|
+
* 当前 Host 为 Companion 选择的目标制品。
|
|
744
|
+
*
|
|
745
|
+
* @remarks
|
|
746
|
+
* V1 仅支持 Windows x64 与 macOS arm64。该值是当前运行 Host 选中的一个 target,不是
|
|
747
|
+
* Manifest 声明的全部 target 列表;当前平台没有匹配制品时 `companion.getInfo()` 会拒绝,
|
|
748
|
+
* 不会返回猜测值。
|
|
749
|
+
*/
|
|
488
750
|
export type CompanionTarget = 'windows-x64' | 'macos-arm64';
|
|
751
|
+
|
|
752
|
+
/**
|
|
753
|
+
* Host 对当前 Companion 制品给出的签名检查状态。
|
|
754
|
+
*
|
|
755
|
+
* @remarks
|
|
756
|
+
* `unsigned` 表示未签名,`valid` 表示 Host 已确认签名有效,`invalid` 表示签名校验失败,
|
|
757
|
+
* `unknown` 表示 Host 尚不能确认。该字段用于展示和诊断,不会替代准备完整性校验、Host
|
|
758
|
+
* 授权或操作系统安全策略;本地开发制品可以是 `unsigned`。
|
|
759
|
+
*/
|
|
489
760
|
export type CompanionSignatureStatus = 'unsigned' | 'valid' | 'invalid' | 'unknown';
|
|
490
761
|
|
|
491
762
|
/** Companion alias 的跨构建、Runtime 与 Host 规范。 */
|
|
@@ -520,36 +791,185 @@ export const COMPANION_ERROR_CODES = [
|
|
|
520
791
|
] as const;
|
|
521
792
|
export type CompanionErrorCode = (typeof COMPANION_ERROR_CODES)[number];
|
|
522
793
|
|
|
794
|
+
/**
|
|
795
|
+
* Host 针对当前小程序版本与当前平台确认的 Companion 描述快照。
|
|
796
|
+
*
|
|
797
|
+
* @remarks
|
|
798
|
+
* Runtime 会校验字段、去重并冻结 `capabilities`,再返回冻结对象;页面不应修改或缓存为
|
|
799
|
+
* 跨版本事实。该结构刻意不包含准备 `state`、进度、`preparedAt`、Session ID、PID、物理
|
|
800
|
+
* 路径、下载 URL、SHA-256、entrypoint 或单独的 Companion 版本号。
|
|
801
|
+
*
|
|
802
|
+
* 准备状态通过 `companion.getPreparationStatus()` 查询。Companion 随当前小程序审核版本、
|
|
803
|
+
* 精确预览版本或本地开发快照绑定;`source` 只说明来源类别,不提供版本号,也不能用于
|
|
804
|
+
* 比较版本新旧。
|
|
805
|
+
*
|
|
806
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/reference/sdk/companion/getInfo.html | companion.getInfo}
|
|
807
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/reference/sdk/companion/getPreparationStatus.html | companion.getPreparationStatus}
|
|
808
|
+
*/
|
|
523
809
|
export interface CompanionInfo {
|
|
810
|
+
/**
|
|
811
|
+
* 规范 alias;必须与请求值及 `package.json#heybox.companions` 中的 key 完全一致。
|
|
812
|
+
*/
|
|
524
813
|
alias: string;
|
|
814
|
+
/**
|
|
815
|
+
* Host 确认的用户可见名称,只用于展示;不要把它当作稳定标识、文件名或版本号。
|
|
816
|
+
*/
|
|
525
817
|
displayName: string;
|
|
818
|
+
/** 当前 Host 选中的目标制品;不是项目声明的全部 target。 */
|
|
526
819
|
target: CompanionTarget;
|
|
820
|
+
/**
|
|
821
|
+
* 当前产物声明且 Host 确认的去重能力列表;可能为空,不代表产物已准备或已启动。
|
|
822
|
+
*/
|
|
527
823
|
capabilities: readonly CompanionCapability[];
|
|
824
|
+
/** 当前压缩归档大小,单位字节;是大于等于 `0` 的安全整数,不是解压后磁盘占用。 */
|
|
528
825
|
archiveBytes: number;
|
|
826
|
+
/** Host 对当前制品给出的签名检查状态;不能替代完整性校验或系统安全判断。 */
|
|
529
827
|
signatureStatus: CompanionSignatureStatus;
|
|
530
|
-
/**
|
|
828
|
+
/**
|
|
829
|
+
* Host 确认的产物来源。
|
|
830
|
+
*
|
|
831
|
+
* @remarks
|
|
832
|
+
* `local-dev` 是当前 `hb-sdk dev` 绑定的本地快照;`preview` 是精确审核前预览版本;
|
|
833
|
+
* `released` 是已发布版本。旧 Host 缺省时为 `undefined`,只表示来源未知,不应回退为
|
|
834
|
+
* `released`。不要根据 alias、displayName、签名状态或页面 URL 自行推断来源。
|
|
835
|
+
*/
|
|
531
836
|
source?: 'local-dev' | 'preview' | 'released';
|
|
532
837
|
}
|
|
533
838
|
|
|
839
|
+
/**
|
|
840
|
+
* Host 最近一次 Companion 准备失败的公开摘要。
|
|
841
|
+
*
|
|
842
|
+
* @remarks
|
|
843
|
+
* Runtime 只保留稳定领域错误码、规范化文案和重试建议;原生路径、下载地址、堆栈和其他
|
|
844
|
+
* Host 诊断信息不会下发。该摘要描述最近一次准备,不代表当前正在自动重试。
|
|
845
|
+
*/
|
|
534
846
|
export interface CompanionErrorSummary {
|
|
847
|
+
/** 稳定的 Companion 领域错误码;业务分支应比较该字段,不要比较 `message`。 */
|
|
535
848
|
code: CompanionErrorCode;
|
|
849
|
+
/** Runtime 根据错误码生成的安全展示文案;不承诺保留 Host 原始 message。 */
|
|
536
850
|
message: string;
|
|
851
|
+
/**
|
|
852
|
+
* Host 对“以新的可信用户操作再次调用 `prepare()` 是否可能成功”的建议。
|
|
853
|
+
*
|
|
854
|
+
* `true` 不会触发自动重试,也不绕过权限、授权、完整性或手势要求;调用方仍应采用
|
|
855
|
+
* 有界重试。`false` 表示不应原样循环重试,通常需要修改产物、配置或环境。
|
|
856
|
+
*/
|
|
537
857
|
retryable: boolean;
|
|
538
858
|
}
|
|
539
859
|
|
|
860
|
+
/**
|
|
861
|
+
* Host 持有的 Companion 准备操作的最近进度快照。
|
|
862
|
+
*
|
|
863
|
+
* @remarks
|
|
864
|
+
* 三个阶段的计数都是非负安全整数。Runtime 只保证同一进度对象内当前值不大于已知总量,
|
|
865
|
+
* 不定义 verifying/extracting 与下载字节之间的换算,也不保证不同阶段的 total 相同;进度
|
|
866
|
+
* 只能用于展示当前阶段,不能作为归档完整性证据。
|
|
867
|
+
*/
|
|
540
868
|
export type CompanionPrepareProgress =
|
|
541
|
-
| {
|
|
542
|
-
|
|
543
|
-
|
|
869
|
+
| {
|
|
870
|
+
/** 下载阶段判别值。 */
|
|
871
|
+
phase: 'downloading';
|
|
872
|
+
/** Host 已下载的非负安全整数计数。 */
|
|
873
|
+
loaded: number;
|
|
874
|
+
/** Host 已知总量;未知时省略,存在时为不小于 `loaded` 的非负安全整数。 */
|
|
875
|
+
total?: number;
|
|
876
|
+
}
|
|
877
|
+
| {
|
|
878
|
+
/** 校验阶段判别值。 */
|
|
879
|
+
phase: 'verifying';
|
|
880
|
+
/** Host 已校验的非负安全整数计数,且不大于 `total`。 */
|
|
881
|
+
processed: number;
|
|
882
|
+
/** 当前校验阶段的非负安全整数总量。 */
|
|
883
|
+
total: number;
|
|
884
|
+
}
|
|
885
|
+
| {
|
|
886
|
+
/** 解压阶段判别值。 */
|
|
887
|
+
phase: 'extracting';
|
|
888
|
+
/** Host 已处理的非负安全整数计数,且不大于 `total`。 */
|
|
889
|
+
processed: number;
|
|
890
|
+
/** 当前解压阶段的非负安全整数总量。 */
|
|
891
|
+
total: number;
|
|
892
|
+
};
|
|
544
893
|
|
|
894
|
+
/**
|
|
895
|
+
* 当前小程序版本、当前平台与指定 alias 对应的 Host 准备状态快照。
|
|
896
|
+
*
|
|
897
|
+
* @remarks
|
|
898
|
+
* 这是以 `state` 为判别字段的四态联合,Runtime 会冻结返回对象及嵌套的 `progress` 或
|
|
899
|
+
* `error`。它描述 Host 持久状态,不等同于某个页面中 `prepare()` Promise 的状态,也不会
|
|
900
|
+
* 随后台操作自动变化;需要最新值时重新调用 `companion.getPreparationStatus()`。
|
|
901
|
+
*
|
|
902
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/reference/sdk/companion/getPreparationStatus.html | companion.getPreparationStatus}
|
|
903
|
+
*/
|
|
545
904
|
export type CompanionPreparationStatus =
|
|
546
|
-
| {
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
905
|
+
| {
|
|
906
|
+
/** 当前版本与 target 尚无已原子提交的本地产物,也没有在途准备。 */
|
|
907
|
+
state: 'not-prepared';
|
|
908
|
+
}
|
|
909
|
+
| {
|
|
910
|
+
/** Host 正在下载、校验或解压;页面 reload 或隐藏不会自动取消该操作。 */
|
|
911
|
+
state: 'preparing';
|
|
912
|
+
/** 查询时 Host 保存的最近进度;这是快照,不是持续订阅。 */
|
|
913
|
+
progress: CompanionPrepareProgress;
|
|
914
|
+
}
|
|
915
|
+
| {
|
|
916
|
+
/** 当前版本产物已原子提交,可以由新的可信用户操作调用 `launch()`。 */
|
|
917
|
+
state: 'ready';
|
|
918
|
+
/**
|
|
919
|
+
* Host 提供的非负安全整数准备完成时间戳。
|
|
920
|
+
*
|
|
921
|
+
* 协议不公开时钟来源、时区或过期语义;只适合展示和诊断,不应用于授权、版本比较
|
|
922
|
+
* 或判断产物仍然有效。
|
|
923
|
+
*/
|
|
924
|
+
preparedAt: number;
|
|
925
|
+
}
|
|
926
|
+
| {
|
|
927
|
+
/** 最近一次准备已失败,当前没有可由该状态直接启动的新产物。 */
|
|
928
|
+
state: 'failed';
|
|
929
|
+
/** 经过 Runtime 脱敏和规范化的失败摘要。 */
|
|
930
|
+
error: CompanionErrorSummary;
|
|
931
|
+
};
|
|
550
932
|
|
|
933
|
+
/**
|
|
934
|
+
* Host 归一化后的 Companion 进程终止原因。
|
|
935
|
+
*
|
|
936
|
+
* @remarks
|
|
937
|
+
* - `exited`:进程自行退出并提供 exit code;不表示 code 必然为 `0`。
|
|
938
|
+
* - `terminated`:Host 报告进程已被显式终止。
|
|
939
|
+
* - `crashed`:Host 把终态归类为异常崩溃。
|
|
940
|
+
* - `host-shutdown`:Host 或其进程监管环境关闭。
|
|
941
|
+
* - `permission-revoked`:Companion 权限撤销导致 Session 终止。
|
|
942
|
+
* - `output-limit`:Host 的输出上限导致 Session 终止。
|
|
943
|
+
*
|
|
944
|
+
* 该枚举描述 Host 确认的终态,不包含 controller ownership 转移;后者不会结束进程。
|
|
945
|
+
*/
|
|
551
946
|
export type CompanionExitReason = 'exited' | 'terminated' | 'crashed' | 'host-shutdown' | 'permission-revoked' | 'output-limit';
|
|
552
|
-
|
|
947
|
+
|
|
948
|
+
/**
|
|
949
|
+
* Companion Session 的一次性退出结果。
|
|
950
|
+
*
|
|
951
|
+
* @remarks
|
|
952
|
+
* 这是以 `reason` 判别的只读语义结果。Runtime 只接受上方固定 reason,并要求所有出现的
|
|
953
|
+
* `exitCode` 都是 safe integer;非法 Host 事件会被丢弃,不会进入 SDK Session。
|
|
954
|
+
* `reason: 'exited'` 必须携带 `exitCode`,其余 Host 终止原因可携带或省略。exit code 的正负、
|
|
955
|
+
* 具体编号和成功含义由 Companion 与目标操作系统决定,SDK 不把它转换为 HTTP 状态、信号或错误码。
|
|
956
|
+
*
|
|
957
|
+
* @see [CompanionSession.waitForExit()](/reference/symbols/root/interfaces/CompanionSession#waitforexit)
|
|
958
|
+
* @see [CompanionSession.onExit()](/reference/symbols/root/interfaces/CompanionSession#onexit)
|
|
959
|
+
*/
|
|
960
|
+
export type CompanionExit =
|
|
961
|
+
| {
|
|
962
|
+
/** 进程自行退出;该分支始终提供一个 safe-integer `exitCode`。 */
|
|
963
|
+
reason: 'exited';
|
|
964
|
+
/** Companion / 操作系统提供的进程退出码;调用方应按自己的进程合同解释。 */
|
|
965
|
+
exitCode: number;
|
|
966
|
+
}
|
|
967
|
+
| {
|
|
968
|
+
/** Host 确认的非普通退出原因;不会取值 `exited`。 */
|
|
969
|
+
reason: Exclude<CompanionExitReason, 'exited'>;
|
|
970
|
+
/** Host 可提供的 safe-integer 进程退出码;缺失时不要自行填充 `0` 或其他哨兵值。 */
|
|
971
|
+
exitCode?: number;
|
|
972
|
+
};
|
|
553
973
|
|
|
554
974
|
/** 活动 Session 的 wire 快照;不包含路径、PID 或原生句柄。 */
|
|
555
975
|
export interface CompanionSessionSnapshot {
|