@heybox/hb-sdk 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.
Files changed (64) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +2 -2
  3. package/dist/cli-chunks/{build-DPe1Ycjd.cjs → build-bVThH3Z5.cjs} +4 -4
  4. package/dist/cli-chunks/{context-BSUhAv3Z.cjs → context-DpKqGnjp.cjs} +2 -2
  5. package/dist/cli-chunks/{create-CaiKrGnb.cjs → create-BWC2343y.cjs} +1 -1
  6. package/dist/cli-chunks/{dev-BG1o8Q-0.cjs → dev-t14YpHHY.cjs} +9 -9
  7. package/dist/cli-chunks/{doctor-DutO2P5H.cjs → doctor-BWkrE0Hj.cjs} +1 -1
  8. package/dist/cli-chunks/{index-CKIyipP9.cjs → index-CDtcZVWv.cjs} +15 -15
  9. package/dist/cli-chunks/{index-Bur0U2z1.cjs → index-D3FMcOZq.cjs} +2 -2
  10. package/dist/cli-chunks/{index.esm-BPlpP-O0.cjs → index.esm-BrJBaJWS.cjs} +7 -7
  11. package/dist/cli-chunks/{login-C1JlLEza.cjs → login-DRMl7nFH.cjs} +2 -2
  12. package/dist/cli-chunks/{project-vite-Bd0WzAqQ.cjs → project-vite-CXgdzIYw.cjs} +1 -1
  13. package/dist/cli-chunks/{remote-DTFEf3Dj.cjs → remote-ibQybNiM.cjs} +6 -6
  14. package/dist/cli-chunks/{runtime-permission-env-C2S34ldj.cjs → runtime-permission-env-DiTeD75Q.cjs} +576 -20
  15. package/dist/cli-chunks/{session-zXVkHuhY.cjs → session-CIoBspg-.cjs} +1 -1
  16. package/dist/cli-chunks/{skill-CCB3DyXk.cjs → skill-5labzuWk.cjs} +2 -2
  17. package/dist/cli-chunks/{version-0qwlEyZC.cjs → version-QiVEs76a.cjs} +1 -1
  18. package/dist/cli.cjs +1 -1
  19. package/dist/devtools/browser-dev-host/assets/browser-dev-host-DxzOkljJ.js +101 -0
  20. package/dist/devtools/browser-dev-host/assets/{desktop-app-launch-DOfl5YvO.js → desktop-app-launch-B4KsgItx.js} +1 -1
  21. package/dist/devtools/browser-dev-host/assets/{index-CFr28-0O.js → index-9Nb3XhtI.js} +3 -3
  22. package/dist/devtools/browser-dev-host/index.html +2 -2
  23. package/dist/index.cjs.js +948 -44
  24. package/dist/index.esm.js +948 -44
  25. package/dist/miniapp-publish.cjs.js +536 -30
  26. package/dist/miniapp-publish.esm.js +536 -30
  27. package/dist/protocol.cjs.js +807 -2
  28. package/dist/protocol.esm.js +807 -2
  29. package/dist/vite.cjs.js +184 -1
  30. package/dist/vite.esm.js +184 -1
  31. package/package.json +7 -7
  32. package/skill/references/api-root.md +192 -8
  33. package/skill/references/recipes.md +45 -7
  34. package/skill/skill.json +5 -5
  35. package/types/core/errors.d.ts +33 -9
  36. package/types/core/handshake-state.d.ts +32 -2
  37. package/types/core/singleton.d.ts +265 -6
  38. package/types/miniapp-manifest/bindings.d.ts +65 -0
  39. package/types/miniapp-manifest/schema.d.ts +136 -19
  40. package/types/miniapp-publish/index.d.ts +425 -29
  41. package/types/modules/auth/index.d.ts +159 -5
  42. package/types/modules/cloud/index.d.ts +514 -40
  43. package/types/modules/companion/index.d.ts +1518 -17
  44. package/types/modules/device/index.d.ts +140 -9
  45. package/types/modules/environment/index.d.ts +172 -4
  46. package/types/modules/files/types.d.ts +1396 -21
  47. package/types/modules/navigation/app-pages/types.d.ts +81 -24
  48. package/types/modules/navigation/index.d.ts +230 -7
  49. package/types/modules/network/index.d.ts +297 -26
  50. package/types/modules/share/copy-link.d.ts +35 -5
  51. package/types/modules/share/index.d.ts +210 -0
  52. package/types/modules/share/screenshot.d.ts +23 -5
  53. package/types/modules/share/show-share-menu.d.ts +18 -5
  54. package/types/modules/share/types.d.ts +148 -23
  55. package/types/modules/storage/index.d.ts +139 -9
  56. package/types/modules/ui/index.d.ts +249 -18
  57. package/types/modules/user/get-info.d.ts +29 -8
  58. package/types/modules/user/index.d.ts +157 -0
  59. package/types/modules/user/revoke-authorization.d.ts +26 -2
  60. package/types/modules/user/steam-game-list.d.ts +96 -15
  61. package/types/modules/viewport/index.d.ts +158 -22
  62. package/types/protocol/types.d.ts +19 -1
  63. package/types/vite/index.d.ts +159 -1
  64. package/dist/devtools/browser-dev-host/assets/browser-dev-host-pUcws1MK.js +0 -101
@@ -11,6 +11,57 @@ export interface MiniProgramUserModule {
11
11
  /**
12
12
  * 获取当前黑盒 APP 登录态、授权状态和已获准披露的资料。
13
13
  *
14
+ * @returns 以 `isHeyboxAppLoggedIn` 为判别字段的联合结果:
15
+ *
16
+ * - `false`:当前未登录,`authorization` 和 `userInfo` 固定为 `null`。
17
+ * - `true`:`authorization` 固定包含 `identity`、`profile` 两项状态;兼容 Host 的
18
+ * `userInfo` 仍可能为 `null`,非空时包含隔离 `app_user_id` 与可空 `profile`。
19
+ *
20
+ * @throws {@link HbMiniProgramSDKError} `PERMISSION_NOT_DECLARED` / `PERMISSION_DENIED` 表示
21
+ * `userInfo` Manifest 权限不可用;`INVALID_STATE` 表示缺少 canonical 小程序身份;
22
+ * `REQUEST_FAILED` / `REQUEST_UNSUPPORTED` / `INVALID_RESPONSE` 表示 Host 或资料读取失败;
23
+ * `HEYBOX_APP_LOGIN_REQUIRED` 表示初次登录态检查后,Host 会话在隔离身份读取期间失效;
24
+ * `AUTHORIZATION_CONTEXT_CHANGED` 表示请求期间发生账号切换或授权撤销;
25
+ * `RUNTIME_DESTROYED` 表示 Runtime 已终止。握手失败也会以该错误类型拒绝调用。
26
+ *
27
+ * @remarks
28
+ * 该读取不展示授权 UI,也不要求可信用户手势。Manifest 中必须声明 `userInfo`,但不需要
29
+ * 公开 `network` 权限;Manifest 权限与 `authorization.identity/profile` 表示的用户授权是
30
+ * 两层独立门禁。
31
+ *
32
+ * 当前账号未登录是正常返回分支,不是 `HEYBOX_APP_LOGIN_REQUIRED` 错误。已登录时 Runtime
33
+ * 会静默建立或读取本小程序隔离身份,并授予 `identity` 与 `profile`。`app_user_id` 只在
34
+ * 当前小程序与当前授权有效期内作为稳定、不透明的关联键;它不是黑盒用户 ID、授权码或
35
+ * 登录凭据。`profile.nickname` / `avatar` 只用于展示,可能为空字符串,不应用于鉴权。
36
+ *
37
+ * 该方法不返回 code、token 或 cookie,也不会创建开发者服务端会话。需要服务端身份时,
38
+ * 在可信用户操作中调用 [auth.login](/reference/sdk/auth/login) 获取一次性 code;需要停止
39
+ * 使用现有身份时,调用 [user.revokeAuthorization](/reference/sdk/user/revokeAuthorization)
40
+ * 并同步清理业务缓存与服务端会话。
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * import hbSDK from '@heybox/hb-sdk'
45
+ *
46
+ * const result = await hbSDK.user.getInfo()
47
+ * if (!result.isHeyboxAppLoggedIn) {
48
+ * showHeyboxLoginHint()
49
+ * } else if (!result.userInfo) {
50
+ * showUserInfoUnavailable()
51
+ * } else {
52
+ * const { app_user_id, profile } = result.userInfo
53
+ * bindLocalIdentity(app_user_id)
54
+ * if (result.authorization.profile === 'granted' && profile) {
55
+ * renderProfile(profile.nickname, profile.avatar)
56
+ * }
57
+ * }
58
+ * ```
59
+ *
60
+ * @see [auth.login](/reference/sdk/auth/login)
61
+ * @see [user.revokeAuthorization](/reference/sdk/user/revokeAuthorization)
62
+ * @see [用户身份与登录](/guide/auth)
63
+ * @see [权限声明](/guide/permissions)
64
+ *
14
65
  * @since 0.2.0-alpha.0
15
66
  * @hbPlatform android
16
67
  * @hbPlatform ios
@@ -27,6 +78,55 @@ export interface MiniProgramUserModule {
27
78
  /**
28
79
  * 撤销当前用户授予本小程序的授权;必须由可信用户操作触发。
29
80
  *
81
+ * @returns Host 确认撤销后 resolve `undefined`;不会返回被撤销的身份、scope 或清理结果。
82
+ * @throws {@link HbMiniProgramSDKError} `USER_GESTURE_REQUIRED` 表示调用不在按钮点击、确认
83
+ * 等可信用户操作中;校验发生在网络 I/O 之前。
84
+ * @throws {@link HbMiniProgramSDKError} `HEYBOX_APP_LOGIN_REQUIRED` 表示当前 Host 没有已登录的
85
+ * 小黑盒账号;该方法不会主动拉起登录流程。
86
+ * @throws {@link HbMiniProgramSDKError} `INVALID_STATE` 表示缺少 canonical 小程序身份;
87
+ * `METHOD_FORBIDDEN` 表示当前 Host 缺少该能力依赖;通过底层协议传入任何 payload 时返回
88
+ * `INVALID_PARAMS`。
89
+ * @throws {@link HbMiniProgramSDKError} `REQUEST_UNSUPPORTED` / `REQUEST_FAILED` /
90
+ * `INVALID_RESPONSE` 表示 Host 请求能力、撤销请求或响应失败;`AUTHORIZATION_CONTEXT_CHANGED`
91
+ * 表示请求期间切换了账号或授权上下文已变化。
92
+ * @throws {@link HbMiniProgramSDKError} `RUNTIME_DESTROYED` / `SDK_DESTROYED` 表示 Runtime 或 SDK
93
+ * 已终止。SDK 握手失败或超过调用超时时间时,还会返回对应握手错误码或 `REQUEST_TIMEOUT`。
94
+ * @remarks
95
+ * 该方法没有参数。页面不能传入小程序 ID、黑盒用户 ID 或手势标记;Runtime 从受信 Host
96
+ * 启动上下文读取当前小程序和当前用户,并校验真实用户手势。
97
+ *
98
+ * `user.revokeAuthorization` 位于无需声明白名单,不要求 `userInfo`、`network` 或其他
99
+ * `package.json#heybox.permissions` 项,也不会修改 Manifest 声明或平台批准状态。它使用 Host
100
+ * 的受信请求撤销当前用户授予当前小程序的用户授权。
101
+ *
102
+ * 只有服务端确认成功且请求期间账号未变化时,Runtime 才清空缓存的隔离身份和授权 scope,
103
+ * 并通过 [on](/reference/sdk/lifecycle/on) 发布 `user_info_authorization_change`,payload 为
104
+ * `{ identity: 'denied', profile: 'denied' }`。失败或过期的撤销结果不会发布该成功事件。
105
+ *
106
+ * 成功后必须立即停止使用旧 `app_user_id` 和资料,并由业务自行清理 localStorage、SDK
107
+ * `storage` 中的业务值、cookie、数据库以及开发者服务端 session;SDK 不会代为删除这些
108
+ * 数据。随后调用 [auth.login](/reference/sdk/auth/login) 会重新进入授权流程;随后调用
109
+ * [user.getInfo](/reference/sdk/user/getInfo) 会按当前规则重新读取或建立隔离身份,不能假定
110
+ * 新旧 `app_user_id` 相同。
111
+ *
112
+ * @example
113
+ * ```ts
114
+ * import hbSDK from '@heybox/hb-sdk'
115
+ *
116
+ * async function revokeFromSettingsButton() {
117
+ * if (!window.confirm('确定撤销当前小程序的用户授权吗?')) return
118
+ *
119
+ * await hbSDK.user.revokeAuthorization()
120
+ * clearPersistedUserProfile()
121
+ * await deleteDeveloperSession()
122
+ * }
123
+ * ```
124
+ *
125
+ * @see [user.getInfo](/reference/sdk/user/getInfo)
126
+ * @see [auth.login](/reference/sdk/auth/login)
127
+ * @see [用户身份与登录](/guide/auth#撤销当前小程序授权)
128
+ * @see [权限声明](/guide/permissions#无需声明的-api)
129
+ *
30
130
  * @since 0.7.0-alpha.1
31
131
  * @hbPlatform android
32
132
  * @hbPlatform ios
@@ -43,6 +143,63 @@ export interface MiniProgramUserModule {
43
143
  /**
44
144
  * 获取当前用户的 Steam 游戏库。
45
145
  *
146
+ * @param options - Steam 账号、分页、排序和过滤条件;不传时使用默认账号、`limit: 20`、
147
+ * `offset: 0`、`sort: 'weeks'`、`includeHidden: false`。
148
+ * @returns 以 `isLogin`、`isBound` 为判别字段的联合结果:未登录或未绑定 Steam 时
149
+ * `data` 为 `null`;两者均为 `true` 时返回游戏列表、`hasMore` 和 `nextOffset`。
150
+ * @throws {@link HbMiniProgramSDKError} `INVALID_PARAMS` 表示存在未知字段,或参数类型、范围
151
+ * 不合法。
152
+ * @throws {@link HbMiniProgramSDKError} `PERMISSION_NOT_DECLARED` / `PERMISSION_DENIED` 表示
153
+ * `steamLibrary` 未声明或未启用;`METHOD_FORBIDDEN` 表示当前 Host 缺少该能力依赖。
154
+ * @throws {@link HbMiniProgramSDKError} `INVALID_STATE` 表示缺少 canonical 小程序身份;
155
+ * `REQUEST_UNSUPPORTED` / `REQUEST_FAILED` / `INVALID_RESPONSE` 表示 Host 请求能力、Steam
156
+ * 请求或响应失败;`HEYBOX_APP_LOGIN_REQUIRED` 表示请求期间 Host 登录态失效。
157
+ * @throws {@link HbMiniProgramSDKError} `AUTHORIZATION_CONTEXT_CHANGED` 表示请求期间切换账号
158
+ * 或撤销授权;`RUNTIME_DESTROYED` / `SDK_DESTROYED` 表示 Runtime 或 SDK 已终止。SDK 握手失败
159
+ * 或超过调用超时时间时,还会返回对应的握手错误码或 `REQUEST_TIMEOUT`。
160
+ * @remarks
161
+ * 项目必须在 `package.json#heybox.permissions` 声明 `steamLibrary`。该能力通过 Host 的受信
162
+ * 请求读取当前账号数据,不要求公开 `network` 权限,也不展示授权 UI 或要求可信用户手势。
163
+ * 它不会调用 `auth.login()`,也不会返回授权码、token 或可供开发者服务端使用的 Steam
164
+ * scope;公开 OpenAPI 当前也没有 Steam 游戏库资源。
165
+ *
166
+ * `steamId` 与 `q` 会 trim;空 `q` 会被省略,非空 `q` 最多保留前 100 个 UTF-16 code
167
+ * unit。`limit` 必须为正整数并在大于 100 时收窄为 100。继续分页时把返回的
168
+ * `data.nextOffset` 原样传给下一次调用。
169
+ *
170
+ * 先检查 `isLogin` 和 `isBound`,再读取 `data`。需要单独读取小黑盒登录态和当前小程序
171
+ * 隔离身份时使用 [user.getInfo](/reference/sdk/user/getInfo);需要为开发者服务端建立会话时,
172
+ * 在可信用户操作中使用 [auth.login](/reference/sdk/auth/login)。这两个 API 都要求
173
+ * `userInfo`,不能替代本方法的 `steamLibrary` 权限。
174
+ *
175
+ * @example
176
+ * ```ts
177
+ * import hbSDK from '@heybox/hb-sdk'
178
+ *
179
+ * const result = await hbSDK.user.getSteamGameList({
180
+ * limit: 20,
181
+ * offset: 0,
182
+ * sort: 'weeks',
183
+ * q: '合作',
184
+ * })
185
+ *
186
+ * if (!result.isLogin) {
187
+ * showHeyboxLoginHint()
188
+ * } else if (!result.isBound) {
189
+ * showSteamBindingHint()
190
+ * } else {
191
+ * renderGames(result.data.gameList)
192
+ * if (result.data.hasMore) {
193
+ * saveNextOffset(result.data.nextOffset)
194
+ * }
195
+ * }
196
+ * ```
197
+ *
198
+ * @see [user.getInfo](/reference/sdk/user/getInfo)
199
+ * @see [auth.login](/reference/sdk/auth/login)
200
+ * @see [用户身份与登录](/guide/auth)
201
+ * @see [权限声明](/guide/permissions)
202
+ *
46
203
  * @since 0.5.0
47
204
  * @hbPlatform android
48
205
  * @hbPlatform ios
@@ -1,7 +1,31 @@
1
1
  import type { MiniProgramRequester } from '../../core/client';
2
2
  export { USER_REVOKE_AUTHORIZATION_METHOD } from '../../protocol/capabilities';
3
- /** `user.revokeAuthorization` 不接收入参。 */
3
+ /**
4
+ * `user.revokeAuthorization` 不接收入参。
5
+ *
6
+ * @remarks
7
+ * 小程序 ID、当前小黑盒用户和可信手势状态均由 Host 上下文提供,页面不能通过 payload
8
+ * 指定或伪造。直接通过 bridge 发送非 `undefined` payload 会返回 `INVALID_PARAMS`。
9
+ *
10
+ * @see [user.revokeAuthorization](/reference/sdk/user/revokeAuthorization)
11
+ */
4
12
  export type RevokeAuthorizationPayload = void;
5
- /** 撤销成功后不返回用户身份或资料。 */
13
+ /**
14
+ * 撤销成功后不返回用户身份或资料,Promise resolve 值为 `undefined`。
15
+ *
16
+ * @remarks
17
+ * resolve 表示 Host 已确认撤销,并已使当前 Runtime 缓存的用户授权和隔离身份失效;它不表示
18
+ * SDK 已清理小程序自己的存储、cookie、数据库或开发者服务端会话。
19
+ */
6
20
  export type RevokeAuthorizationResult = void;
21
+ /**
22
+ * 撤销当前用户授予本小程序的授权。
23
+ *
24
+ * @param requester - 底层 bridge 请求能力。
25
+ * @returns 撤销完成后 resolve `undefined`。
26
+ * @throws {@link HbMiniProgramSDKError} 缺少可信用户手势、当前用户未登录、Host 请求失败、
27
+ * 账号上下文变化或 SDK / Runtime 已终止时抛出;具体稳定错误码见公开模块方法文档。
28
+ * @remarks 该能力无需 Manifest 权限;撤销成功后由调用方清理自己的持久化数据和服务端会话。
29
+ * @see [user.revokeAuthorization](/reference/sdk/user/revokeAuthorization)
30
+ */
7
31
  export declare function revokeAuthorization(requester: MiniProgramRequester): Promise<RevokeAuthorizationResult>;
@@ -1,53 +1,130 @@
1
1
  import type { MiniProgramRequester } from '../../core/client';
2
- /** Steam 游戏库排序方式。 */
2
+ /**
3
+ * Steam 游戏库的服务端排序维度。
4
+ *
5
+ * @remarks
6
+ * - `weeks`:按最近两周游玩时长排序,也是默认值。
7
+ * - `all`:按累计游玩时长排序。
8
+ * - `achieved`:按已解锁成就数排序。
9
+ */
3
10
  export type SteamGameListSort = 'weeks' | 'all' | 'achieved';
4
- /** Steam 游戏库查询与分页参数。 */
11
+ /**
12
+ * Steam 游戏库查询与 offset 分页参数。
13
+ *
14
+ * @remarks
15
+ * Runtime 会拒绝未知字段和类型不匹配的值,不会把数字字符串或 `0` / `1` 自动转换为
16
+ * `number` / `boolean`。所有默认值和规范化均在 Host 发出 Steam 请求前完成。
17
+ */
5
18
  export interface GetSteamGameListOptions {
6
- /** 指定当前用户绑定的 Steam ID;不传时使用默认主账号。 */
19
+ /**
20
+ * 要查询的 Steam ID;省略时使用当前小黑盒用户的默认绑定账号。
21
+ * 首尾空白会被移除,trim 后为空会以 `INVALID_PARAMS` 拒绝。
22
+ */
7
23
  steamId?: string;
8
- /** 分页数量,默认 20,最大 100。 */
24
+ /** 单页数量,默认 `20`;必须是大于等于 `1` 的整数,大于 `100` 时按 `100` 查询。 */
9
25
  limit?: number;
10
- /** 分页偏移量,默认 0。 */
26
+ /** 分页偏移量,默认 `0`;必须是大于等于 `0` 的整数,不接受数字字符串。 */
11
27
  offset?: number;
12
- /** 排序方式,默认 `weeks`。 */
28
+ /** 排序维度,默认 `weeks`;只接受大小写完全一致的 `weeks`、`all` 或 `achieved`。 */
13
29
  sort?: SteamGameListSort;
14
- /** 搜索关键词。 */
30
+ /**
31
+ * 游戏名称搜索词。Runtime 会先 trim,再保留前 `100` 个 UTF-16 code unit;trim 后为空时
32
+ * 不向服务端发送 `q`,等价于不按关键词过滤。
33
+ */
15
34
  q?: string;
16
- /** 是否包含当前用户隐藏的游戏,默认 `false`。 */
35
+ /** 是否包含当前用户隐藏的游戏,默认 `false`;只接受 boolean,不接受 `0` / `1`。 */
17
36
  includeHidden?: boolean;
18
37
  }
19
- /** `user.getSteamGameList` 请求参数。 */
38
+ /**
39
+ * `user.getSteamGameList` 请求参数;省略时使用默认 Steam 账号和全部默认查询值。
40
+ *
41
+ * @see [user.getSteamGameList](/reference/sdk/user/getSteamGameList)
42
+ */
20
43
  export type GetSteamGameListPayload = GetSteamGameListOptions | undefined;
21
- /** Steam 游戏库条目。 */
44
+ /**
45
+ * Steam 游戏的可用价格信息。
46
+ *
47
+ * @remarks
48
+ * 整个 `price` 及其中每个字段都可能缺失;服务端返回 `null`、空字符串或不可用数值时,
49
+ * Runtime 会省略相应字段。协议不携带币种或最小货币单位,不能把数值字段自行解释为
50
+ * “分”或固定币种;直接展示价格时优先使用 `current` / `initial`。
51
+ */
22
52
  export interface SteamGamePrice {
53
+ /** 当前售价的非空展示文本;币种与格式由服务端决定。 */
23
54
  current?: string;
55
+ /** 原价的非空展示文本;币种与格式由服务端决定。 */
24
56
  initial?: string;
57
+ /** 服务端原始折扣数值;当前公开合同不承诺比例、百分比或取值范围。 */
25
58
  discount?: number;
59
+ /** 服务端最低价数值;协议不提供币种和缩放单位。 */
26
60
  lowestPrice?: number;
61
+ /** 截止时间的非空展示文本,例如剩余天数;不要把它当作可解析日期。 */
27
62
  deadlineDate?: string;
63
+ /** 服务端原始折扣截止时间数值;当前公开合同不承诺单位或时钟来源。 */
28
64
  deadlineTimestamp?: number;
29
65
  }
30
- /** Steam 游戏库条目。 */
66
+ /**
67
+ * 经过 Runtime 规范化的 Steam 游戏库条目。
68
+ *
69
+ * @remarks
70
+ * 原始记录缺少有效 `appid`、`steamAppid`/`appid` 或非空 `name` 时,整条记录会从
71
+ * `gameList` 中移除。其余可选字段在服务端缺失、为空或类型无效时会被省略,而不是填充
72
+ * `null`。
73
+ */
31
74
  export interface SteamGameListItem {
75
+ /** 游戏在小黑盒游戏目录中的有限数值 ID。 */
32
76
  appid: number;
77
+ /** Steam App ID;服务端未提供有效值时回退为 `appid`。 */
33
78
  steamAppid: number;
79
+ /** trim 后的非空游戏名称。 */
34
80
  name: string;
81
+ /** 非空的游戏封面或主图 URL 字符串;Runtime 不保证 URL 协议。 */
35
82
  image?: string;
83
+ /** 非空的 Steam 图标 URL 字符串;优先读取服务端 `appicon`。 */
36
84
  icon?: string;
85
+ /** 服务端原始累计游玩时长数值;`0` 是有效值,当前公开合同不承诺单位。 */
37
86
  playtimeForever?: number;
87
+ /** 服务端原始最近游玩时长数值;`0` 是有效值,当前公开合同不承诺单位。 */
38
88
  playtime2Weeks?: number;
89
+ /** trim 后的非空游戏标签;没有有效标签时整个字段省略。 */
39
90
  tags?: string[];
91
+ /** 至少有一个可用字段时返回价格信息;免费游戏或价格不可用时省略。 */
40
92
  price?: SteamGamePrice;
41
93
  }
42
- /** Steam 游戏库分页数据。 */
94
+ /**
95
+ * Steam 游戏库的 offset 分页数据。
96
+ *
97
+ * @remarks
98
+ * `nextOffset` 始终按“本次请求的有效 `offset` + `gameList.length`”计算。服务端返回有效
99
+ * `total` 时,`hasMore` 等于 `nextOffset < total`;没有 `total` 时,以本页有效条目数是否
100
+ * 达到规范化后的 `limit` 推断。继续加载应直接传回 `nextOffset`,不要自行加请求的原始
101
+ * `limit`。
102
+ */
43
103
  export interface SteamGameListData {
104
+ /** 当前页通过必填字段校验的游戏条目;没有结果时为空数组。 */
44
105
  gameList: SteamGameListItem[];
106
+ /** 服务端返回的游戏总数;缺失或不是有限数值时省略。 */
45
107
  total?: number;
108
+ /** 按 `total` 或当前页有效条目数推导的下一页标记。 */
46
109
  hasMore: boolean;
110
+ /** 下一页应使用的 offset;始终存在,即使 `hasMore` 为 `false`。 */
47
111
  nextOffset: number;
112
+ /** 服务端对“结果是否属于当前用户本人”的标记;缺失或不可识别时省略。 */
48
113
  isMe?: boolean;
49
114
  }
50
- /** `user.getSteamGameList` 返回当前用户的 Steam 绑定状态和游戏库。 */
115
+ /**
116
+ * `user.getSteamGameList` 返回当前用户的 Steam 绑定状态和游戏库。
117
+ *
118
+ * @remarks
119
+ * 这是以 `isLogin` 和 `isBound` 为判别字段的联合类型:
120
+ *
121
+ * - `{ isLogin: false, isBound: false, data: null }`:当前小黑盒账号未登录;这是正常结果。
122
+ * - `{ isLogin: true, isBound: false, data: null }`:已登录,但当前账号没有 Steam 绑定信息。
123
+ * - `{ isLogin: true, isBound: true, data }`:已登录且已绑定,`data.gameList` 可以为空数组。
124
+ *
125
+ * 不存在 `isLogin: false, isBound: true` 分支。必须先缩窄两个判别字段再访问 `data`,不能
126
+ * 把前两个状态当作“绑定账号的空游戏库”。
127
+ */
51
128
  export type GetSteamGameListResult = {
52
129
  isLogin: false;
53
130
  isBound: false;
@@ -65,8 +142,12 @@ export type GetSteamGameListResult = {
65
142
  * 获取当前用户 Steam 游戏库。
66
143
  *
67
144
  * @param requester - 底层 bridge 请求能力。
68
- * @param options - 查询与分页参数。
69
- * @returns 当前用户 Steam 游戏库;未登录或未绑定 Steam 时返回状态对象。
145
+ * @param options - 查询与分页参数;省略时采用默认 Steam 账号、分页和排序。
146
+ * @returns 登录态、Steam 绑定态以及绑定成功时的规范化分页数据。
147
+ * @throws {@link HbMiniProgramSDKError} 参数、权限、Host 能力、服务端响应、账号上下文或
148
+ * SDK 生命周期不满足要求时抛出;具体稳定错误码见公开模块方法文档。
149
+ * @remarks 该能力要求 `steamLibrary`,但不要求公开 `network` 权限或可信用户手势。
150
+ * @see [user.getSteamGameList](/reference/sdk/user/getSteamGameList)
70
151
  */
71
152
  export declare function getSteamGameList(requester: MiniProgramRequester, options?: GetSteamGameListOptions): Promise<GetSteamGameListResult>;
72
153
  export { USER_GET_STEAM_GAME_LIST_METHOD } from '../../protocol/capabilities';
@@ -3,72 +3,117 @@ import type { MiniProgramRequester } from '../../core/client';
3
3
  * 小程序安全区域信息。
4
4
  *
5
5
  * @remarks
6
- * 所有字段单位均为像素,基于当前小程序可用窗口坐标系。
6
+ * 所有字段单位均为逻辑像素,坐标原点是当前小程序可用窗口的左上角。Runtime 会把
7
+ * 四条边界夹取到窗口范围内,并保证 `right >= left`、`bottom >= top`;`width` 恒等于
8
+ * `right - left`,`height` 恒等于 `bottom - top`。
9
+ *
10
+ * Host 未提供安全区域或某条边界无效时,Runtime 分别以 `left = 0`、
11
+ * `right = windowWidth`、`top = statusBarHeight`、`bottom = windowHeight` 降级,再把结果
12
+ * 夹取到当前窗口范围内。因此安全区域可能退化为零宽或零高矩形,但不会越过窗口边界。
13
+ *
14
+ * @see {@link MiniProgramWindowInfoResult}
7
15
  */
8
16
  export interface MiniProgramSafeArea {
9
- /** 安全区域左上角横坐标。 */
17
+ /** 安全区域左边界横坐标;从窗口左边缘起算,范围为 `0` 到 `windowWidth`。 */
10
18
  left: number;
11
- /** 安全区域右下角横坐标。 */
19
+ /** 安全区域右边界横坐标;从窗口左边缘起算,且不小于 `left`。 */
12
20
  right: number;
13
- /** 安全区域左上角纵坐标。 */
21
+ /** 安全区域上边界纵坐标;从窗口上边缘起算,Host 未提供有效值时取 `statusBarHeight`。 */
14
22
  top: number;
15
- /** 安全区域右下角纵坐标。 */
23
+ /** 安全区域下边界纵坐标;从窗口上边缘起算,且不小于 `top`。 */
16
24
  bottom: number;
17
- /** 安全区域宽度,单位 px。 */
25
+ /** 安全区域宽度,恒等于 `right - left`,单位逻辑像素。 */
18
26
  width: number;
19
- /** 安全区域高度,单位 px。 */
27
+ /** 安全区域高度,恒等于 `bottom - top`,单位逻辑像素。 */
20
28
  height: number;
21
29
  }
22
30
  /**
23
31
  * 小程序窗口信息。
24
32
  *
25
33
  * @remarks
26
- * 该结构统一描述屏幕尺寸、可用窗口尺寸、安全区域与顶部偏移等容器信息。
34
+ * 该结构统一描述调用时的屏幕尺寸、可用窗口尺寸、安全区域与顶部偏移等容器信息。
35
+ * 窗口可缩放的平台上,尺寸可能在后续用户拖拽后变化;需要最新值时重新调用
36
+ * `viewport.getWindowInfo()`。
37
+ *
38
+ * Runtime 会把无效 `pixelRatio` 降级为 `1`,把无效屏幕尺寸降级为对应窗口尺寸,
39
+ * 把无效窗口尺寸降级为 `0`。导航栏高度读取失败或返回无效值时,`statusBarHeight`
40
+ * 与 `screenTop` 均降级为 `0`;安全区域再基于这些归一化值计算。
41
+ *
42
+ * @see {@link MiniProgramViewportModule.getWindowInfo}
27
43
  */
28
44
  export interface MiniProgramWindowInfoResult {
29
- /** 设备像素比。 */
45
+ /** 设备像素比;Host 返回非有限值或非正数时为 `1`。 */
30
46
  pixelRatio: number;
31
- /** 屏幕宽度,单位 px。 */
47
+ /** 屏幕宽度,单位逻辑像素;Host 值无效时退回到 `windowWidth`。 */
32
48
  screenWidth: number;
33
- /** 屏幕高度,单位 px。 */
49
+ /** 屏幕高度,单位逻辑像素;Host 值无效时退回到 `windowHeight`。 */
34
50
  screenHeight: number;
35
- /** 可使用窗口宽度,单位 px。 */
51
+ /** 当前小程序可使用的窗口内容宽度,单位逻辑像素;Host 值无效时为 `0`。 */
36
52
  windowWidth: number;
37
- /** 可使用窗口高度,单位 px。 */
53
+ /** 当前小程序可使用的窗口内容高度,单位逻辑像素;Host 值无效时为 `0`。 */
38
54
  windowHeight: number;
39
- /** 状态栏高度;黑盒环境按顶部可用偏移兼容。 */
55
+ /** 状态栏或顶部导航占用高度,单位逻辑像素;读取失败或值无效时为 `0`。 */
40
56
  statusBarHeight: number;
41
- /** 安全区域。 */
57
+ /** 当前窗口内经过边界夹取并补齐 `width`、`height` 的安全区域。 */
42
58
  safeArea: MiniProgramSafeArea;
43
- /** 窗口上边缘的 y 值。 */
59
+ /** 顶部可用偏移兼容值,单位逻辑像素;当前恒等于 `statusBarHeight`。 */
44
60
  screenTop: number;
45
61
  }
46
62
  export { VIEWPORT_GET_WINDOW_INFO_METHOD } from '../../protocol/capabilities';
47
63
  export { VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD } from '../../protocol/capabilities';
48
- /** `viewport.getWindowInfo` 不需要入参。 */
64
+ /** `viewport.getWindowInfo` 不接收 options 或 payload,调用时无需传入参数。 */
49
65
  export type GetWindowInfoPayload = void;
50
- /** `viewport.getWindowInfo` 返回当前小程序可用窗口信息。 */
66
+ /** `viewport.getWindowInfo` 返回调用时经过 Runtime 归一化的窗口快照。 */
51
67
  export type GetWindowInfoResult = MiniProgramWindowInfoResult;
52
68
  /**
53
69
  * 导航栏关闭按钮与状态栏图标/文字的前景样式。
54
70
  *
55
71
  * @remarks
56
- * `light` 表示白色前景,适合深色背景;`dark` 表示黑色前景,适合浅色背景。
72
+ * `light` 请求 Host 使用白色或浅色前景,适合深色背景;`dark` 请求 Host 使用黑色
73
+ * 或深色前景,适合浅色背景。该类型没有 `auto`、`system` 或恢复默认值;需要跟随
74
+ * 页面主题时,应在主题变化后重新调用
75
+ * {@link MiniProgramViewportModule.setNavigationBarStyle}。
76
+ *
77
+ * 取值表达的是对比度语义,不是固定色号。具体颜色、透明度以及状态栏和关闭按钮的
78
+ * 渲染方式由当前 Host 与操作系统决定。
79
+ *
80
+ * @see {@link MiniProgramSetNavigationBarStyleOptions.foregroundStyle}
57
81
  */
58
82
  export type MiniProgramNavigationBarForegroundStyle = 'light' | 'dark';
59
83
  /**
60
84
  * 设置导航栏样式的配置。
61
85
  *
62
86
  * @remarks
87
+ * `options` 必须是对象,且 `foregroundStyle` 是必填字段。Runtime 只接受精确的
88
+ * `light` 或 `dark` 字符串;缺少字段、传入 `null`、数组或其他值都会以
89
+ * `INVALID_PARAMS` 拒绝。
90
+ *
63
91
  * 当前仅开放关闭按钮与状态栏图标/文字的前景明暗样式,不设置导航栏背景色。
92
+ *
93
+ * @see {@link MiniProgramNavigationBarForegroundStyle}
64
94
  */
65
95
  export interface MiniProgramSetNavigationBarStyleOptions {
66
- /** 导航栏关闭按钮与状态栏图标/文字的前景样式。 */
96
+ /**
97
+ * 导航栏关闭按钮与状态栏图标/文字的前景样式。
98
+ *
99
+ * @remarks
100
+ * 该字段必填且仅接受 `light` 或 `dark`。`light` 适合深色背景,`dark` 适合浅色
101
+ * 背景;它不读取网页背景,也不会自动跟随 `prefers-color-scheme`。
102
+ */
67
103
  foregroundStyle: MiniProgramNavigationBarForegroundStyle;
68
104
  }
69
- /** `viewport.setNavigationBarStyle` 的入参。 */
105
+ /**
106
+ * `viewport.setNavigationBarStyle` 的必填入参。
107
+ *
108
+ * @see {@link MiniProgramSetNavigationBarStyleOptions}
109
+ */
70
110
  export type SetNavigationBarStylePayload = MiniProgramSetNavigationBarStyleOptions;
71
- /** `viewport.setNavigationBarStyle` 无稳定返回值。 */
111
+ /**
112
+ * `viewport.setNavigationBarStyle` 的结果;Host 完成设置后固定以 `undefined` resolve。
113
+ *
114
+ * @remarks
115
+ * Host 内部返回的其他值不会透传给 Mini-program,该结果也不包含最终渲染色值。
116
+ */
72
117
  export type SetNavigationBarStyleResult = void;
73
118
  export type { MiniProgramViewportMethod } from '../../protocol/capabilities';
74
119
  /** 外部小程序可调用的 Viewport 模块。 */
@@ -76,6 +121,44 @@ export interface MiniProgramViewportModule {
76
121
  /**
77
122
  * 获取当前小程序窗口信息。
78
123
  *
124
+ * @returns 调用时经过 Runtime 归一化的设备像素比、屏幕与窗口尺寸、安全区域及顶部偏移快照。
125
+ * @throws {@link HbMiniProgramSDKError} 当前 Host 未开放窗口测量能力时以 `METHOD_FORBIDDEN`
126
+ * 拒绝;握手失败、Runtime 已卸载、SDK 已销毁、请求超时或 Host 测量失败时抛出对应
127
+ * bridge / Runtime 错误。
128
+ *
129
+ * @remarks
130
+ * 该方法无入参,不触发用户授权,也无需在 `package.json#heybox.permissions` 中声明。
131
+ * 每次调用都会重新读取当前窗口并返回一次性快照;它不订阅尺寸变化。PC 可缩放窗口
132
+ * 可能在用户拖拽、Host 恢复窗口或系统缩放变化后得到新尺寸,需要最新值时应重新调用。
133
+ *
134
+ * `package.json#heybox.window` 的 `defaultWidth`、`defaultHeight`、`minWidth`、
135
+ * `minHeight` 与 `resizable` 只控制开窗初值和用户拖拽约束,不能替代本 API 的运行时
136
+ * 查询。该方法只读取几何信息;导航栏前景色由
137
+ * {@link MiniProgramViewportModule.setNavigationBarStyle} 单独设置。
138
+ *
139
+ * @example
140
+ * ```ts
141
+ * import hbSDK from '@heybox/hb-sdk'
142
+ *
143
+ * const info = await hbSDK.viewport.getWindowInfo()
144
+ * const safeInsets = {
145
+ * top: info.safeArea.top,
146
+ * right: info.windowWidth - info.safeArea.right,
147
+ * bottom: info.windowHeight - info.safeArea.bottom,
148
+ * left: info.safeArea.left,
149
+ * }
150
+ *
151
+ * const root = document.documentElement
152
+ * for (const [edge, value] of Object.entries(safeInsets)) {
153
+ * root.style.setProperty(`--safe-area-${edge}`, `${value}px`)
154
+ * }
155
+ * // 窗口尺寸变化后重新调用 getWindowInfo(),不要长期缓存这次结果。
156
+ * ```
157
+ *
158
+ * @see {@link MiniProgramWindowInfoResult}
159
+ * @see {@link MiniProgramViewportModule.setNavigationBarStyle}
160
+ * @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/window-size/ | 窗口尺寸与可缩放性}
161
+ *
79
162
  * @since 0.2.0-alpha.0
80
163
  * @hbPlatform android
81
164
  * @hbPlatform ios
@@ -92,6 +175,59 @@ export interface MiniProgramViewportModule {
92
175
  /**
93
176
  * 设置导航栏关闭按钮与状态栏图标/文字的前景样式。
94
177
  *
178
+ * @param options - 必填的前景样式配置。`foregroundStyle` 只能是 `light` 或 `dark`。
179
+ * @returns Host 报告本次设置完成后以 `undefined` resolve;不会返回当前样式或实际渲染色值。
180
+ * @throws {@link HbMiniProgramSDKError} `options` 不是对象,或 `foregroundStyle` 缺失、
181
+ * 不是 `light`/`dark` 时以 `INVALID_PARAMS` 拒绝;当前 Host 未开放该能力时以
182
+ * `METHOD_FORBIDDEN` 拒绝,Host 无法处理当前请求时以 `REQUEST_UNSUPPORTED` 拒绝。
183
+ * 握手失败、SDK 或 Runtime 已销毁、bridge 请求超时以及 Host 设置失败时抛出对应
184
+ * SDK 错误。
185
+ *
186
+ * @remarks
187
+ * 该 API 无需在 `package.json#heybox.permissions` 中声明权限,也不要求可信用户手势
188
+ * 或平台批准;仍需当前 Host 开放 `viewport.setNavigationBarStyle` capability。
189
+ *
190
+ * 该方法只控制关闭按钮和状态栏图标/文字的前景明暗,不修改导航栏背景色,也不
191
+ * 改变网页自身的 `color-scheme`。它不提供读取接口、自动主题模式或恢复默认值;
192
+ * 后续调用可以覆盖先前样式,Host 重建容器后也不应依赖先前调用继续生效。
193
+ *
194
+ * 移动端 Host 将该语义应用到 App 顶部容器和系统状态栏,PC Host 将其应用到桌面
195
+ * 小程序窗口的导航控件;不同操作系统可以采用不同的实际颜色和渲染方式。Browser
196
+ * Dev Host 只更新本地设备预览中的 Host chrome,不能替代真机或桌面客户端验收。
197
+ *
198
+ * {@link MiniProgramViewportModule.getWindowInfo} 只读取窗口几何与安全区域,既不会
199
+ * 返回当前前景样式,也不是调用本方法的前置条件。`package.json#heybox.window` 只
200
+ * 声明开窗尺寸和可缩放性,与导航栏前景样式互不覆盖。
201
+ *
202
+ * @example
203
+ * ```ts
204
+ * import hbSDK from '@heybox/hb-sdk'
205
+ *
206
+ * const colorScheme = window.matchMedia('(prefers-color-scheme: dark)')
207
+ *
208
+ * async function syncNavigationBarStyle() {
209
+ * await hbSDK.viewport.setNavigationBarStyle({
210
+ * // 深色页面使用浅色前景,浅色页面使用深色前景。
211
+ * foregroundStyle: colorScheme.matches ? 'light' : 'dark',
212
+ * })
213
+ * }
214
+ *
215
+ * await syncNavigationBarStyle()
216
+ * const handleColorSchemeChange = () => {
217
+ * void syncNavigationBarStyle().catch(console.error)
218
+ * }
219
+ * colorScheme.addEventListener('change', handleColorSchemeChange)
220
+ * window.addEventListener('pagehide', () => {
221
+ * colorScheme.removeEventListener('change', handleColorSchemeChange)
222
+ * }, { once: true })
223
+ * ```
224
+ *
225
+ * @see {@link MiniProgramNavigationBarForegroundStyle}
226
+ * @see {@link MiniProgramSetNavigationBarStyleOptions}
227
+ * @see {@link MiniProgramViewportModule.getWindowInfo}
228
+ * @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/window-size/ | 窗口尺寸与可缩放性}
229
+ * @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/permissions | 权限声明}
230
+ *
95
231
  * @since 0.4.0
96
232
  * @hbPlatform android
97
233
  * @hbPlatform ios
@@ -1,4 +1,22 @@
1
1
  import type { MiniProgramEventName, MiniProgramEventPayloadMap } from '@heybox/hb-sdk-protocol';
2
2
  export type { MiniProgramBridgeError, MiniProgramBridgeCancelMessage, MiniProgramBridgeMessage, MiniProgramBridgeMessageType, MiniProgramBridgeProgressMessage, MiniProgramEventName, MiniProgramEventPayloadMap, RuntimeLocationProbePayload, SDKCSPBlockedResourceType, SDKCSPViolationPayload, SDKHandshakePayload, SDKLocationReportPayload, SDKLocationReportTrigger, } from '@heybox/hb-sdk-protocol';
3
- /** 小程序事件监听函数。 */
3
+ /**
4
+ * 小程序生命周期或业务事件监听函数。
5
+ *
6
+ * @typeParam T - 受
7
+ * [MiniProgramEventName](/reference/symbols/root/types/MiniProgramEventName) 约束的事件名;它决定
8
+ * `payload` 的精确类型。
9
+ * @param payload - 由
10
+ * [MiniProgramEventPayloadMap](/reference/symbols/root/interfaces/MiniProgramEventPayloadMap) 按 `T`
11
+ * 索引得到的事件载荷。
12
+ *
13
+ * @remarks
14
+ * handler 在 event bus 派发时同步调用,返回值会被忽略且 Promise 不会被等待。普通事件 handler
15
+ * 之间没有异常隔离:同步抛错会从当前派发传播,并可能阻止同一事件的后续 handler;异步 handler
16
+ * 的 rejected Promise 也不会被 SDK 捕获。监听器应在自身边界处理同步和异步错误。
17
+ *
18
+ * 生命周期事件不会重放,只派发给事件到达时已经注册的监听器。需要查询当前握手状态时,使用
19
+ * [getHandshakeState()](/reference/sdk/lifecycle/getHandshakeState) 或
20
+ * [onHandshakeStateChange()](/reference/sdk/lifecycle/onHandshakeStateChange)。
21
+ */
4
22
  export type MiniProgramEventHandler<T extends MiniProgramEventName = MiniProgramEventName> = (payload: MiniProgramEventPayloadMap[T]) => void;