@heybox/hb-sdk 0.6.3 → 0.6.4
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/README.md +4 -2
- package/dist/cli-chunks/{context-Bu0Zusj_.cjs → context-BEgbP7mM.cjs} +1 -1
- package/dist/cli-chunks/{create-CgAGcRtZ.cjs → create-BHsWWo3V.cjs} +1 -1
- package/dist/cli-chunks/{dev-g35-QcIa.cjs → dev-CSjs2OYB.cjs} +61 -47
- package/dist/cli-chunks/{doctor-klsQg82G.cjs → doctor-B3AOQgyN.cjs} +1 -1
- package/dist/cli-chunks/{index--P321c8v.cjs → index-B0zGksOA.cjs} +38 -13
- package/dist/cli-chunks/{index-CbsbCgtf.cjs → index-BGFf6g7V.cjs} +2 -2
- package/dist/cli-chunks/{login-DEoReXOe.cjs → login-ClQuL2r6.cjs} +2 -2
- package/dist/cli-chunks/{remote-CZ-G3RSH.cjs → remote-ib5THDbw.cjs} +4 -4
- package/dist/cli-chunks/{session-vlPGi1Z8.cjs → session-D7nmqMiy.cjs} +1 -1
- package/dist/cli.cjs +1 -1
- package/dist/devtools/mock-host/index.html +35 -1
- package/dist/devtools/mock-host/main.js +213 -42
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/protocol.cjs.js +54 -0
- package/dist/protocol.esm.js +53 -1
- package/dist/vite.cjs.js +1 -1
- package/dist/vite.esm.js +1 -1
- package/package.json +2 -2
- package/skill/SKILL.md +4 -2
- package/skill/references/api-protocol.md +18 -17
- package/skill/references/api-root.md +4 -2
- package/skill/references/cli.md +26 -33
- package/skill/references/recipes.md +78 -29
- package/skill/scripts/sync-references.mjs +2 -0
- package/skill/skill.json +4 -4
- package/types/protocol/runtime-permissions.d.ts +41 -0
- package/types/protocol.d.ts +4 -2
package/skill/references/cli.md
CHANGED
|
@@ -76,13 +76,13 @@ Top-level `hb-sdk deploy` has been hard-cut and must not be documented as a vali
|
|
|
76
76
|
## 创建外部小程序模板
|
|
77
77
|
|
|
78
78
|
```bash
|
|
79
|
-
hb-sdk create my-miniapp
|
|
79
|
+
npx @heybox/hb-sdk create my-miniapp
|
|
80
80
|
cd my-miniapp
|
|
81
81
|
npm install
|
|
82
82
|
npm run dev
|
|
83
83
|
```
|
|
84
84
|
|
|
85
|
-
`hb-sdk create <
|
|
85
|
+
`hb-sdk create <target-path>` 会生成 Vue 3、Vite、TypeScript 和 npm 模板。参数可以是目录名、相对/绝对路径或 `.`;生成的 `package.json.name` 取解析后目标目录的 basename,并校验为合法的非 scoped npm 包名。目标目录不存在时会创建;目标目录已存在但非空时会拒绝覆盖。模板使用 Vite 8,需要 Node.js `^20.19.0` 或 `>=22.12.0`。
|
|
86
86
|
|
|
87
87
|
CLI 只生成文件,不会自动安装依赖、初始化 git 或打开编辑器。生成模板后优先运行 `npm run dev`,它会启动 Vite 服务和内置 mock runtime host。
|
|
88
88
|
|
|
@@ -103,7 +103,7 @@ Agent rules:
|
|
|
103
103
|
hb-sdk dev
|
|
104
104
|
```
|
|
105
105
|
|
|
106
|
-
`hb-sdk dev` 会从当前目录向上查找最近的 `package.json
|
|
106
|
+
`hb-sdk dev` 会从当前目录向上查找最近的 `package.json`。Vite、内置 mock runtime host、Mac 启动协议和手机二维码的基础启动只依赖本地页面地址,不要求项目先绑定或 CLI 先登录。项目已绑定时,CLI 会限时 3 秒读取远端 dev context;成功后用真实 Runtime 权限快照初始化 Mock Host,失败或超时则输出脱敏警告并继续匿名调试,`network.request` 等受管能力默认拒绝。需要定位降级原因时可使用 `hb-sdk dev --verbose`;详细错误只写入本地调试日志,其中 URL 用户名、密码和敏感 query/hash 会被遮蔽,不会进入 LAN bootstrap。公开 `detail` 查询不再是 dev 启动门禁。本地 `package.json` 无法解析等配置错误不会被降级,命令会直接报错。调试页默认自动打开;需要真实黑盒小程序容器加载同一页面时,点击调试页里的「在 Mac 版 APP 中启动」按钮,或在「Mobile App」区域选择局域网网卡后用手机小黑盒 APP 扫码。
|
|
107
107
|
|
|
108
108
|
常用参数:
|
|
109
109
|
|
|
@@ -116,11 +116,13 @@ hb-sdk dev
|
|
|
116
116
|
|
|
117
117
|
## Mock runtime 边界
|
|
118
118
|
|
|
119
|
-
`hb-sdk dev` 会把实际小程序页面地址编码到 mock host 的 `mini_url` query 中,由 mock host iframe 加载页面并补齐小程序 bridge
|
|
119
|
+
`hb-sdk dev` 会把实际小程序页面地址编码到 mock host 的 `mini_url` query 中,由 mock host iframe 加载页面并补齐小程序 bridge 环境。Mac 协议和手机二维码始终携带本地页面地址;远端 dev context 可用时还会携带已验证的小程序 ID,不可用时则进入匿名本地沙箱。真机 dev shell 不依赖公开 `detail` 查询完成启动。真实 Mac / Mobile App dev shell 加载开发 `mini_url` 前会提示“即将打开未经验证的开发网页。该页面可能由本机或局域网服务提供,请确认来源可信后继续。”,用户确认后才继续加载。Codex、VSCode 等内嵌浏览器可能无法唤起系统 APP;遇到这种情况时,请在系统浏览器中打开同一个调试页后重试。
|
|
120
120
|
|
|
121
121
|
不要为了本地调试再创建独立 mock runtime 包。CLI、模板和 mock host 都归属 `@heybox/hb-sdk`。
|
|
122
122
|
|
|
123
|
-
|
|
123
|
+
浏览器 Mock 的权限状态只存在于 Mock Host 内存中,URL query 不能提供或覆盖权限。远端 dev context 可用时,Mock Host 以线上快照作为初始值;不可用时匿名状态默认拒绝受管能力。开发者可以在调试页临时切换 `network.request` 权限;官方域名权限只读取线上快照,不能在 devtools 中手动调整。变更只会重建 devtools-only mock runtime,不会重建 iframe 或中断 Vite HMR,也不会修改线上配置。调试页会对比线上快照并提示本地放开但上线后会返回 `PERMISSION_DENIED` 的差异。
|
|
124
|
+
|
|
125
|
+
本地 mock runtime 下已授权的 `network.request()` 会通过 `hb-sdk` 本地 mock network proxy 转发真实 HTTP(S) 请求,用于避免浏览器 CORS 影响本地调试。proxy 不会把黑盒客户端私有协议字段暴露给 iframe 业务代码。CLI 登录态和远端 dev context 也不会注入 iframe。
|
|
124
126
|
|
|
125
127
|
Use `hb-sdk dev` for local browser SDK debugging. Use the Mock runtime host's "在 Mac 版 APP 中启动" button for Mac App debugging, or the "Mobile App" QR code after selecting a LAN interface for phone App debugging. The phone must be on the same LAN and use a Heybox App version that supports the mini-program dev shell. If the mock host is open inside Codex, VSCode, or another embedded browser, ask the user to open the same debug page in the system browser before retrying because embedded browsers may block the `heybox://` protocol handoff.
|
|
126
128
|
|
|
@@ -132,16 +134,13 @@ Use `hb-sdk dev` for local browser SDK debugging. Use the Mock runtime host's "
|
|
|
132
134
|
hb-sdk remote deploy --release-note "修复登录状态展示,补充异常提示"
|
|
133
135
|
hb-sdk remote deploy --release-note "审核通过后自动发布" --auto-publish
|
|
134
136
|
hb-sdk remote deploy --from-version 1.2.3 --release-note "复用 1.2.3 历史产物"
|
|
135
|
-
hb-sdk remote deploy --api-base-url https://api.test.xiaoheihe.cn --login-base-url https://login.test.xiaoheihe.cn --release-note "测试环境验证"
|
|
136
|
-
hb-sdk remote deploy --verbose --api-base-url https://api.test.xiaoheihe.cn --login-base-url https://login.test.xiaoheihe.cn --release-note "排查预检失败"
|
|
137
|
-
HB_SDK_ALLOW_UNSAFE_API_BASE_URL=1 hb-sdk remote deploy --api-base-url http://127.0.0.1:8080 --release-note "本地后台联调"
|
|
138
137
|
```
|
|
139
138
|
|
|
140
139
|
`hb-sdk remote deploy` 把预检、构建、上传和提交审核串成一条命令。顶层 `hb-sdk deploy` 已硬切删除,不再作为兼容别名保留:
|
|
141
140
|
|
|
142
141
|
1. 读取 `package.json.heybox.miniProgramId`,缺失即报错。
|
|
143
142
|
2. 校验登录态,需先 `hb-sdk login`。
|
|
144
|
-
3.
|
|
143
|
+
3. 运行 `hb-sdk remote access` 确认当前主体具备开发者资格;未开通时按开放平台的小程序工坊申请入口提交申请。
|
|
145
144
|
4. 读取并校验 `--release-note`;TTY 环境缺失时会提示输入,CI / 非 TTY 环境缺失时直接失败。建议让 AI 生成 1-5 条简短发布日志。
|
|
146
145
|
5. 普通 remote deploy 先读取 `package.json.version`,登录后、build 前调用版本预检接口;预检通过后才执行 `<pm> run build`。
|
|
147
146
|
6. `--from-version <version>` 跳过本地构建、`dist/` 读取和上传,复用指定历史版本产物提交审核。
|
|
@@ -149,8 +148,8 @@ HB_SDK_ALLOW_UNSAFE_API_BASE_URL=1 hb-sdk remote deploy --api-base-url http://12
|
|
|
149
148
|
8. 普通 remote deploy 的 `dist/manifest.json.version` 必须与预检使用的 `package.json.version` 一致,否则失败且不上传。
|
|
150
149
|
9. 遍历 `dist/` 文件,过滤掉 `manifest.json`、`.DS_Store`、`*.map`;遇到 symbolic link 或 `node_modules` 路径直接报错。
|
|
151
150
|
10. 校验上传路径长度不超过 64,并在任何上传请求发生前限制实际上传产物总大小不超过 100MiB。错误提示中使用 `100MB`,方便开发者理解。
|
|
152
|
-
11.
|
|
153
|
-
12. 默认只展示上传阶段和文件总数,例如 `正在上传 137/244 个文件`;`--verbose`
|
|
151
|
+
11. CLI 会分批上传构建产物并校验平台返回的文件集合;任何批次异常都会停止后续上传且不会提交审核。
|
|
152
|
+
12. 默认只展示上传阶段和文件总数,例如 `正在上传 137/244 个文件`;`--verbose` 会补充逐文件诊断,但不会输出 keys、签名、cookie、pkey、token 或临时密钥。
|
|
154
153
|
13. 全部上传成功后调用提交审核接口;`--from-version` 路径会直接提交 `source_version`。CLI 输出提交审核成功、发布策略和可用的 preview URL。
|
|
155
154
|
|
|
156
155
|
`mini_program_id` 没有 CLI flag,必须落在 `package.json` 里:
|
|
@@ -165,30 +164,22 @@ HB_SDK_ALLOW_UNSAFE_API_BASE_URL=1 hb-sdk remote deploy --api-base-url http://12
|
|
|
165
164
|
|
|
166
165
|
`manifest.json` 仅作为提交审核接口的 `manifest` 字段提交,不会上传到 CDN。Vite 项目通过 `miniappManifest()` 插件生成;CLI 不会自动注入插件,请在 `vite.config.ts` 中显式挂载。小程序构建产物需要使用相对资源路径;`hb-sdk create` 模板会显式配置 `base: './'`,未配置 `base` 的项目也会由 `miniappManifest()` 在 build 时默认补成 `./`。构建产物只能在兼容的小黑盒 Runtime 中启动,普通浏览器直接打开时不会执行标准业务脚本。
|
|
167
166
|
|
|
168
|
-
`dev
|
|
169
|
-
|
|
170
|
-
默认发布策略是 `auto_publish=false`:运营审核通过后使用 `hb-sdk remote versions` 查看版本状态,再用 `hb-sdk remote release <version>` 发布。需要审核通过后自动发布并下架旧线上版本时,使用 `--auto-publish`。如需让指定用户预览未发布候选版本,使用 `hb-sdk remote allowlist add <heybox_id>` 管理预览白名单。
|
|
167
|
+
CLI 的 `dev` 启动、本地 Vite build、`remote deploy` 本地构建和 `--from-version` 路径都不主动查询或比较 `minimumSdkVersion`;Mac / Mobile dev shell 仍会在加载 iframe 前执行宿主侧兼容性与平台配置检查。Manifest 结构校验、版本 precheck 和服务端 submit-audit 策略仍然生效。
|
|
171
168
|
|
|
172
|
-
|
|
169
|
+
默认发布策略是 `auto_publish=false`:运营审核通过后使用 `hb-sdk remote versions` 查看版本状态,再用 `hb-sdk remote release <version>` 发布。`--auto-publish` 只适用于普通低风险版本;重大功能、活动联动、商业化、用户数据、外部账号绑定或风控策略变更应保持手动发布。需要指定用户预览未发布候选版本时,使用 `hb-sdk remote allowlist add <heybox_id>` 管理预览白名单。
|
|
173
170
|
|
|
174
|
-
`
|
|
175
|
-
|
|
176
|
-
切换测试环境时往往需要同时配置后台 host、登录 host 和 service tag。CLI 支持加载 `.env.<name>` 预设,把其中的 `HB_SDK_*` 变量一次性注入当前进程(不覆盖已有值):`--env <name>` 读取项目根下的 `.env.<name>`,`--env-file <path>` 显式指定路径且优先级更高,也可用 `HB_SDK_ENV=<name>` 触发。使用 `--env <name>` 或 `HB_SDK_ENV=<name>` 执行 `remote deploy` 时,CLI 还会把同一个 `name` 作为 `--mode <name>` 传给项目 build,使 CLI 后端环境与 Vite mode 保持一致。文件仅支持 `KEY=VALUE`、空行和 `#` 注释,不做变量插值;文件不存在时静默跳过。
|
|
171
|
+
需要给构建选择 Vite mode 时,可以使用 `--env <name>` 或 `HB_SDK_ENV=<name>`。CLI 会从当前目录向上找到项目根,读取 `.env.<name>`,把其中所有合法 key 注入当前进程和后续 build(不覆盖已有值),并将同一个 `name` 作为 `--mode <name>` 传给项目 build。`--env-file <path>` 可以相对调用目录指定其他预设文件,且优先级高于 `--env`。文件仅支持 `KEY=VALUE`、空行和 `#` 注释,不做变量插值;文件不存在时静默跳过,其他读取错误会直接失败。
|
|
177
172
|
|
|
178
173
|
```bash
|
|
179
|
-
# 项目根准备 .env.
|
|
180
|
-
#
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
hb-sdk remote deploy --env
|
|
185
|
-
hb-sdk remote info --env test
|
|
186
|
-
HB_SDK_ENV=test hb-sdk remote versions
|
|
187
|
-
hb-sdk remote deploy --env-file .env.local --release-note "本地联调"
|
|
188
|
-
hb-sdk remote deploy --env test --service-tag other-tag --release-note "灰度" # 单项 flag 覆盖预设
|
|
174
|
+
# 项目根准备 .env.preview
|
|
175
|
+
# VITE_API_ORIGIN=https://api.example.com
|
|
176
|
+
|
|
177
|
+
hb-sdk remote deploy --env preview --release-note "预览模式构建"
|
|
178
|
+
HB_SDK_ENV=preview hb-sdk remote deploy --release-note "预览模式构建"
|
|
179
|
+
hb-sdk remote deploy --env-file .env.local --release-note "本地配置构建"
|
|
189
180
|
```
|
|
190
181
|
|
|
191
|
-
|
|
182
|
+
预设不会覆盖进程已有的同名环境变量,因此优先级为进程 env > `.env` 预设 > 默认值。
|
|
192
183
|
|
|
193
184
|
Before precheck, build, upload, or submit audit, `hb-sdk remote deploy` must verify that the current project's bound mini-program belongs to the server-side current entity. If `detail.entity_id` differs from the current entity, the command fails with both entity ids/names and suggests `hb-sdk remote entity switch <entity-id>`. It must not auto-switch entities and must not continue into precheck/build/upload/submit on mismatch.
|
|
194
185
|
|
|
@@ -239,6 +230,9 @@ Agent rules:
|
|
|
239
230
|
|
|
240
231
|
```bash
|
|
241
232
|
hb-sdk remote access
|
|
233
|
+
hb-sdk remote entity list
|
|
234
|
+
hb-sdk remote entity current
|
|
235
|
+
hb-sdk remote entity switch <entity-id>
|
|
242
236
|
hb-sdk remote list
|
|
243
237
|
hb-sdk remote create
|
|
244
238
|
hb-sdk remote bind mp_xxxxxxxx
|
|
@@ -260,9 +254,9 @@ hb-sdk remote square show
|
|
|
260
254
|
|
|
261
255
|
`hb-sdk remote square hide` 会隐藏当前绑定小程序在普通用户侧的小程序工坊广场展示;白名单用户仍可在小程序工坊广场看到,直接链接访问已发布版本也不受影响。`hb-sdk remote square show` 会恢复普通用户侧的小程序工坊广场展示。
|
|
262
256
|
|
|
263
|
-
`hb-sdk remote release`、`
|
|
257
|
+
`hb-sdk remote release`、`withdraw`、`take-down`、`reopen` 和 `square hide` 会改变审核、发布或用户侧可见状态。交互式终端会展示目标和变更内容后要求确认;非 TTY 环境必须传 `--yes`。`entity switch`、`square show` 和 allowlist 写操作当前不会进行这层 CLI 确认,自动化脚本不要为它们假设存在确认保护。
|
|
264
258
|
|
|
265
|
-
所有 `hb-sdk remote` 子命令都支持 `--json`。开启后 stdout 只输出一个 JSON 对象;进度、警告、版本提醒和 verbose 诊断不能污染 stdout
|
|
259
|
+
所有 `hb-sdk remote` 子命令都支持 `--json`。开启后 stdout 只输出一个 JSON 对象;进度、警告、版本提醒和 verbose 诊断不能污染 stdout。`remote deploy --json` 不进行交互式 release note 提示,必须显式传 `--release-note`。
|
|
266
260
|
|
|
267
261
|
Agent rules:
|
|
268
262
|
|
|
@@ -283,13 +277,12 @@ Agent rules:
|
|
|
283
277
|
|
|
284
278
|
```bash
|
|
285
279
|
hb-sdk login
|
|
286
|
-
hb-sdk login --login-base-url https://login.test.xiaoheihe.cn
|
|
287
280
|
hb-sdk login status
|
|
288
281
|
hb-sdk login clear
|
|
289
282
|
```
|
|
290
283
|
|
|
291
284
|
- `hb-sdk login` 会打开 `login.xiaoheihe.cn`,通过本地临时回调服务接收登录结果。
|
|
292
|
-
-
|
|
285
|
+
- 登录成功后默认还会查询开发者主体;`--no-select-entity` 会跳过登录后的主体选择。
|
|
293
286
|
- `hb-sdk login status` 默认展示脱敏状态、`heyboxId`、`loginBaseUrl` 和登录时间;`--verbose` 额外展示 cache 路径。不输出 `pkey`、cookie 或完整请求头。
|
|
294
287
|
- `hb-sdk login clear` 只清理 `hb-sdk` 自己命名空间中的 Heybox 登录态。
|
|
295
288
|
|
|
@@ -46,9 +46,10 @@ bootstrap()
|
|
|
46
46
|
|
|
47
47
|
## 推荐业务写法
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
业务页通常还需要监听登录态变化。下面以 Vue 3 为例:初始化只读取状态,登录必须由按钮等明确的用户操作触发,监听在组件卸载时清理。
|
|
50
50
|
|
|
51
51
|
```ts
|
|
52
|
+
import { onUnmounted } from 'vue'
|
|
52
53
|
import hbSDK from '@heybox/hb-sdk'
|
|
53
54
|
|
|
54
55
|
const stopAuthChange = hbSDK.on('authChange', result => {
|
|
@@ -59,15 +60,22 @@ const stopAuthChange = hbSDK.on('authChange', result => {
|
|
|
59
60
|
|
|
60
61
|
await hbSDK.ready()
|
|
61
62
|
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
const initialUser = await hbSDK.user.getInfo()
|
|
64
|
+
|
|
65
|
+
async function loginFromUserAction() {
|
|
66
|
+
const result = await hbSDK.auth.login()
|
|
67
|
+
if (!result.isLogin || !result.userInfo) {
|
|
68
|
+
return
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
console.log('用户已登录', result.userInfo.heybox_id)
|
|
65
72
|
}
|
|
66
73
|
|
|
67
|
-
|
|
68
|
-
stopAuthChange()
|
|
74
|
+
onUnmounted(stopAuthChange)
|
|
69
75
|
```
|
|
70
76
|
|
|
77
|
+
把 `loginFromUserAction` 绑定到登录按钮;不要在页面 bootstrap 阶段自动调用 `auth.login()`。
|
|
78
|
+
|
|
71
79
|
## ready 的含义
|
|
72
80
|
|
|
73
81
|
`ready()` 表示 SDK 已完成与父容器的握手,可以安全调用开放能力。SDK 在收到 `ready` 前会自动重试握手;如果超过总超时时间仍未成功,会抛出 `READY_TIMEOUT`。它不等价于“用户已登录”,用户状态需要通过 `user.getInfo()` 或 `authChange` 判断。
|
|
@@ -87,6 +95,10 @@ stopAuthChange()
|
|
|
87
95
|
|
|
88
96
|
- `user.getInfo()`:静默读取当前登录态与公开基础资料。
|
|
89
97
|
- `auth.login()`:唤起黑盒登录流程,并返回登录后的最新公开用户资料。
|
|
98
|
+
- `user.getCurrentUserDetail()`:读取当前用户展示详情。
|
|
99
|
+
- `user.getCurrentUserProfile()`:读取当前用户敏感资料,需要对应 Runtime 权限。
|
|
100
|
+
- `user.getPlatformAccountOverview()` / `getPlatformAccountInfo()`:读取平台账号概览或指定平台详情。
|
|
101
|
+
- `user.getSteamGameList()`:读取当前用户 Steam 游戏库。
|
|
90
102
|
|
|
91
103
|
## 静默读取用户信息
|
|
92
104
|
|
|
@@ -123,9 +135,9 @@ async function ensureLogin() {
|
|
|
123
135
|
}
|
|
124
136
|
```
|
|
125
137
|
|
|
126
|
-
##
|
|
138
|
+
## 基础资料与扩展资料
|
|
127
139
|
|
|
128
|
-
|
|
140
|
+
`user.getInfo()` 和 `auth.login()` 的 `userInfo` 只包含三项公开基础字段:
|
|
129
141
|
|
|
130
142
|
| 字段 | 类型 | 说明 |
|
|
131
143
|
| ----------- | -------- | ------------ |
|
|
@@ -135,18 +147,35 @@ SDK 只暴露允许给外部小程序读取的公开字段:
|
|
|
135
147
|
|
|
136
148
|
不会暴露 token、cookie、手机号或任何可用于调用主站私有接口的凭据。
|
|
137
149
|
|
|
150
|
+
current-user scoped API 返回独立的 `UserScopedResult<T>`。未登录时是 `{ isLogin: false, data: null }`;已登录时才有 `data`。其中 `getCurrentUserProfile()` 可能返回生日、邮箱、教育和职业等敏感资料,必须按最小必要原则使用,并以 Runtime 权限结果为准;不要把这些字段理解为 `getInfo()` 的默认返回值。
|
|
151
|
+
|
|
152
|
+
```ts
|
|
153
|
+
const profile = await user.getCurrentUserProfile()
|
|
154
|
+
if (profile.isLogin) {
|
|
155
|
+
console.log(profile.data.email)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const platforms = await user.getPlatformAccountOverview()
|
|
159
|
+
if (platforms.isLogin) {
|
|
160
|
+
console.log(platforms.data)
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
138
164
|
## 监听登录态变化
|
|
139
165
|
|
|
140
166
|
如果页面上同时存在登录按钮、权限态 UI 和业务数据,建议监听 `authChange`。
|
|
141
167
|
|
|
142
168
|
```ts
|
|
169
|
+
import { onUnmounted } from 'vue'
|
|
143
170
|
import { on } from '@heybox/hb-sdk'
|
|
144
171
|
|
|
145
|
-
const
|
|
172
|
+
const stopAuthChange = on('authChange', result => {
|
|
146
173
|
if (result.isLogin) {
|
|
147
174
|
console.log('登录态更新', result.userInfo?.heybox_id)
|
|
148
175
|
}
|
|
149
176
|
})
|
|
177
|
+
|
|
178
|
+
onUnmounted(stopAuthChange)
|
|
150
179
|
```
|
|
151
180
|
|
|
152
181
|
## Lifecycle events
|
|
@@ -157,28 +186,28 @@ const stop = on('authChange', result => {
|
|
|
157
186
|
SDK 通过 `on` 监听父容器派发的小程序生命周期和业务事件。
|
|
158
187
|
|
|
159
188
|
```ts
|
|
160
|
-
import {
|
|
189
|
+
import { onUnmounted } from 'vue'
|
|
190
|
+
import { on } from '@heybox/hb-sdk'
|
|
161
191
|
|
|
162
192
|
function handleShow(payload: { timestamp: number; source?: string }) {
|
|
163
193
|
console.log('show from', payload.source)
|
|
164
194
|
}
|
|
165
195
|
|
|
166
|
-
on('show', handleShow)
|
|
167
|
-
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
`on` 也会返回取消监听函数,推荐在组件卸载时调用:
|
|
171
|
-
|
|
172
|
-
```ts
|
|
173
|
-
import { on } from '@heybox/hb-sdk'
|
|
174
|
-
|
|
175
|
-
const stop = on('hide', () => {
|
|
196
|
+
const stopShow = on('show', handleShow)
|
|
197
|
+
const stopHide = on('hide', () => {
|
|
176
198
|
console.log('小程序页面隐藏')
|
|
177
199
|
})
|
|
178
200
|
|
|
179
|
-
|
|
201
|
+
function stopLifecycleEvents() {
|
|
202
|
+
stopShow()
|
|
203
|
+
stopHide()
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
onUnmounted(stopLifecycleEvents)
|
|
180
207
|
```
|
|
181
208
|
|
|
209
|
+
框架外也可以保存 `on()` 返回的取消函数,在页面或业务模块真正销毁时调用。需要按 handler 精确移除时再使用 `off(event, handler)`;不要在注册后的同一执行流里立即取消。
|
|
210
|
+
|
|
182
211
|
## 事件列表
|
|
183
212
|
|
|
184
213
|
| 事件 | 触发时机 | 典型用途 |
|
|
@@ -187,7 +216,7 @@ stop()
|
|
|
187
216
|
| `ready` | SDK 可安全调用开放能力 | 标记 bridge 可用 |
|
|
188
217
|
| `show` | 小程序页面展示 | 刷新可见态数据 |
|
|
189
218
|
| `hide` | 小程序页面隐藏 | 暂停轮询、暂停播放 |
|
|
190
|
-
| `unload` |
|
|
219
|
+
| `unload` | 当前 Runtime 上下文终止 | 清理资源并停止请求 |
|
|
191
220
|
| `error` | 父容器或开放能力运行异常 | 统一错误上报 |
|
|
192
221
|
| `authChange` | 登录状态变化 | 刷新用户信息和权限 |
|
|
193
222
|
|
|
@@ -202,23 +231,37 @@ stop()
|
|
|
202
231
|
- UI 可见性相关逻辑放在 `show`、`hide`。
|
|
203
232
|
- 用户状态不要只在页面加载时读一次,登录入口附近要监听 `authChange`。
|
|
204
233
|
- 组件或页面销毁时清理 `on` 注册的监听,避免重复响应。
|
|
234
|
+
- 事件只派发给注册当时存在的监听器,不会重放;一次性 `launch`/`ready` 状态应以 `ready()` Promise 为准。
|
|
235
|
+
- 收到 `unload` 后,当前 SDK 上下文不可恢复,未完成请求会失败;不要在同一页面上下文继续重试能力调用。
|
|
205
236
|
|
|
206
237
|
## Error handling
|
|
207
238
|
|
|
208
239
|
|
|
209
240
|
# 错误处理
|
|
210
241
|
|
|
211
|
-
SDK
|
|
242
|
+
SDK 公开两类标准错误:`HbMiniProgramSDKError` 表示 handshake、bridge、Runtime 或 capability 故障;`HbMiniProgramNetworkError` 表示 HTTP 已完成,但状态没有通过 `validateStatus`。
|
|
212
243
|
|
|
213
244
|
```ts
|
|
214
|
-
import {
|
|
245
|
+
import {
|
|
246
|
+
HbMiniProgramNetworkError,
|
|
247
|
+
HbMiniProgramSDKError,
|
|
248
|
+
network,
|
|
249
|
+
} from '@heybox/hb-sdk'
|
|
215
250
|
|
|
216
251
|
try {
|
|
217
|
-
await
|
|
252
|
+
await network.request({ url: 'https://api.example.com/data' })
|
|
218
253
|
} catch (error) {
|
|
254
|
+
if (error instanceof HbMiniProgramNetworkError) {
|
|
255
|
+
console.log(error.status, error.data, error.headers)
|
|
256
|
+
return
|
|
257
|
+
}
|
|
258
|
+
|
|
219
259
|
if (error instanceof HbMiniProgramSDKError) {
|
|
220
260
|
console.log(error.code, error.message, error.data)
|
|
261
|
+
return
|
|
221
262
|
}
|
|
263
|
+
|
|
264
|
+
throw error
|
|
222
265
|
}
|
|
223
266
|
```
|
|
224
267
|
|
|
@@ -229,8 +272,10 @@ try {
|
|
|
229
272
|
| `NOT_IN_IFRAME` | 当前页面不在小程序沙盒 iframe 中 | 提示运行环境错误,检查父容器接入 |
|
|
230
273
|
| `MISSING_NONCE` | URL 中缺少 `hb_mini_bridge_nonce` | 检查父容器 URL 注入逻辑 |
|
|
231
274
|
| `READY_TIMEOUT` | SDK 握手超时 | 检查父容器是否幂等响应重试的 `sdk.handshake` |
|
|
275
|
+
| `HANDSHAKE_FAILED` | 握手消息发送失败 | 检查 iframe、nonce 与 Host 消息通道 |
|
|
276
|
+
| `RUNTIME_UNAVAILABLE` | Runtime 已执行 `unload` | 停止当前上下文请求并结束页面工作 |
|
|
232
277
|
| `REQUEST_TIMEOUT` | 开放能力调用超时 | 提示重试,并上报 method |
|
|
233
|
-
| `
|
|
278
|
+
| `INVALID_NETWORK_RESPONSE` | Host 返回的网络响应结构无效 | 上报 Host/Runtime 协议问题 |
|
|
234
279
|
|
|
235
280
|
父容器返回失败响应时,SDK 也会包装成 `HbMiniProgramSDKError`,此时 `code` 由父容器开放能力定义。
|
|
236
281
|
|
|
@@ -239,14 +284,18 @@ try {
|
|
|
239
284
|
```ts
|
|
240
285
|
import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'
|
|
241
286
|
|
|
242
|
-
|
|
287
|
+
type UserViewState =
|
|
288
|
+
| { status: 'ready'; user: Awaited<ReturnType<typeof hbSDK.user.getInfo>> }
|
|
289
|
+
| { status: 'failed'; error: HbMiniProgramSDKError }
|
|
290
|
+
|
|
291
|
+
async function loadUser(): Promise<UserViewState> {
|
|
243
292
|
try {
|
|
244
293
|
await hbSDK.ready()
|
|
245
|
-
return await hbSDK.user.getInfo()
|
|
294
|
+
return { status: 'ready', user: await hbSDK.user.getInfo() }
|
|
246
295
|
} catch (error) {
|
|
247
296
|
if (error instanceof HbMiniProgramSDKError) {
|
|
248
297
|
reportSDKError(error.code, error.message, error.data)
|
|
249
|
-
return {
|
|
298
|
+
return { status: 'failed', error }
|
|
250
299
|
}
|
|
251
300
|
|
|
252
301
|
throw error
|
|
@@ -100,6 +100,8 @@ function rewriteBundledProtocolIndexLinks(markdown) {
|
|
|
100
100
|
return markdown
|
|
101
101
|
.replaceAll('(./root/)', '(api-root.md)')
|
|
102
102
|
.replaceAll('(./protocol/)', '(#public-protocol-entrypoint)')
|
|
103
|
+
.replaceAll('(./miniapp-publish/)', '(https://open.xiaoheihe.cn/docs/hb_sdk/reference/miniapp-publish/)')
|
|
104
|
+
.replaceAll('(./vite/)', '(https://open.xiaoheihe.cn/docs/hb_sdk/reference/vite/)')
|
|
103
105
|
.replaceAll('(../guide/)', '(recipes.md)');
|
|
104
106
|
}
|
|
105
107
|
|
package/skill/skill.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hb-sdk",
|
|
3
|
-
"skillVersion": "0.6.
|
|
3
|
+
"skillVersion": "0.6.4+skill.36b02466ef23",
|
|
4
4
|
"sdk": {
|
|
5
5
|
"package": "@heybox/hb-sdk",
|
|
6
|
-
"version": "0.6.
|
|
7
|
-
"compatibility": "0.6.
|
|
6
|
+
"version": "0.6.4",
|
|
7
|
+
"compatibility": "0.6.4"
|
|
8
8
|
},
|
|
9
9
|
"source": "https://open.xiaoheihe.cn/agent-skills/hb-sdk",
|
|
10
|
-
"integrity": "sha256-
|
|
10
|
+
"integrity": "sha256-36b02466ef23a54c71c1eff6f9610dfa63d25d423529b20a6d8d50c8f1e85eaf"
|
|
11
11
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 判断 permission key 是否由 Runtime 权限快照管理。
|
|
3
|
+
*
|
|
4
|
+
* @param key 待判断的 permission key。
|
|
5
|
+
* @returns 该 key 需要读取 Runtime 权限快照时返回 `true`。
|
|
6
|
+
*/
|
|
7
|
+
export declare function isManagedMiniProgramRuntimePermissionKey(key: string): boolean;
|
|
8
|
+
/** Runtime 权限项的启用状态。 */
|
|
9
|
+
export type MiniProgramRuntimePermissionStatus = 'enabled' | 'disabled';
|
|
10
|
+
/** Runtime 权限快照中的单项权限配置。 */
|
|
11
|
+
export interface MiniProgramRuntimePermissionEntry {
|
|
12
|
+
/** permission key。 */
|
|
13
|
+
key: string;
|
|
14
|
+
/** 当前权限状态。 */
|
|
15
|
+
status: MiniProgramRuntimePermissionStatus;
|
|
16
|
+
/** 由具体 permission key 定义的配置。 */
|
|
17
|
+
config: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
/** 服务端下发的 Runtime schema v1 权限快照。 */
|
|
20
|
+
export interface MiniProgramRuntimePermissionsSnapshot {
|
|
21
|
+
/** 权限快照 schema 版本,当前固定为 `1`。 */
|
|
22
|
+
schema_version: 1;
|
|
23
|
+
/** 可选的非负整数修订号。 */
|
|
24
|
+
revision?: number;
|
|
25
|
+
/** 权限配置列表。 */
|
|
26
|
+
entries: MiniProgramRuntimePermissionEntry[];
|
|
27
|
+
}
|
|
28
|
+
/** Runtime 权限快照的 fail-closed 解析结果。 */
|
|
29
|
+
export interface ParsedMiniProgramRuntimePermissions {
|
|
30
|
+
/** 整份快照是否通过格式校验。 */
|
|
31
|
+
valid: boolean;
|
|
32
|
+
/** 通过校验的受管权限,以 permission key 索引。 */
|
|
33
|
+
permissions: Record<string, MiniProgramRuntimePermissionEntry>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 解析服务端权限快照;格式不完整时整份快照失效并 fail closed。
|
|
37
|
+
*
|
|
38
|
+
* @param snapshot 待校验的服务端权限快照。
|
|
39
|
+
* @returns 解析状态和通过校验的受管权限。
|
|
40
|
+
*/
|
|
41
|
+
export declare function parseMiniProgramRuntimePermissions(snapshot: unknown): ParsedMiniProgramRuntimePermissions;
|
package/types/protocol.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { MINI_PROGRAM_BRIDGE_NONCE_PARAM, MINI_PROGRAM_MESSAGE_NAMESPACE, MINI_PROGRAM_MESSAGE_VERSION, RUNTIME_LOCATION_PROBE_METHOD, SDK_CSP_VIOLATION_METHOD, SDK_HANDSHAKE_METHOD, SDK_LOCATION_REPORT_METHOD, } from './protocol/constants';
|
|
2
2
|
export { isMiniProgramBridgeMessage } from './protocol/guards';
|
|
3
|
+
export { isManagedMiniProgramRuntimePermissionKey, parseMiniProgramRuntimePermissions } from './protocol/runtime-permissions';
|
|
4
|
+
export type { MiniProgramRuntimePermissionEntry, MiniProgramRuntimePermissionStatus, MiniProgramRuntimePermissionsSnapshot, ParsedMiniProgramRuntimePermissions, } from './protocol/runtime-permissions';
|
|
3
5
|
export type { MiniProgramBridgeError, MiniProgramBridgeMessage, MiniProgramBridgeMessageType, MiniProgramEventHandler, MiniProgramEventName, MiniProgramEventPayloadMap, RuntimeLocationProbePayload, SDKCSPBlockedResourceType, SDKCSPViolationPayload, SDKHandshakePayload, SDKLocationReportPayload, SDKLocationReportTrigger, } from './protocol/types';
|
|
4
6
|
export { AUTH_LOGIN_METHOD, CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD, CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD, CLOUD_LEADERBOARD_GET_INFO_METHOD, CLOUD_LEADERBOARD_GET_LIST_METHOD, CLOUD_LEADERBOARD_SUBMIT_METHOD, DEVICE_SET_CLIPBOARD_METHOD, DEVICE_VIBRATE_METHOD, MINI_PROGRAM_PROTOCOL_CAPABILITIES, NAVIGATION_CLOSE_METHOD, NAVIGATION_OPEN_APP_PAGE_METHOD, NAVIGATION_RELOAD_METHOD, NETWORK_REQUEST_METHOD, SHARE_SCREENSHOT_METHOD, SHARE_SHOW_SHARE_MENU_METHOD, STORAGE_GET_STORAGE_METHOD, STORAGE_SET_STORAGE_METHOD, UI_HIDE_LOADING_METHOD, UI_SHOW_LOADING_METHOD, UI_SHOW_TOAST_METHOD, USER_GET_CURRENT_USER_DETAIL_METHOD, USER_GET_CURRENT_USER_PROFILE_METHOD, USER_GET_INFO_METHOD, USER_GET_PLATFORM_ACCOUNT_INFO_METHOD, USER_GET_PLATFORM_ACCOUNT_OVERVIEW_METHOD, USER_GET_STEAM_GAME_LIST_METHOD, VIEWPORT_GET_WINDOW_INFO_METHOD, VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD, } from './protocol/capabilities';
|
|
5
7
|
export type { MiniProgramDeviceMethod, MiniProgramAuthMethod, MiniProgramBridgeMethod, MiniProgramCapabilityDefinition, MiniProgramCapabilityModule, MiniProgramCapabilityPayload, MiniProgramCapabilityPayloadMap, MiniProgramCapabilityResult, MiniProgramCapabilityResultMap, MiniProgramCapabilityRisk, MiniProgramCloudMethod, MiniProgramNavigationMethod, MiniProgramNetworkMethod, MiniProgramShareMethod, MiniProgramStorageMethod, MiniProgramUiMethod, MiniProgramUserMethod, MiniProgramViewportMethod, } from './protocol/capabilities';
|
|
@@ -9,9 +11,9 @@ export type { GetCurrentUserDetailPayload, GetCurrentUserDetailResult, GetCurren
|
|
|
9
11
|
export type { ScreenshotPayload, ScreenshotResult } from './modules/share/screenshot';
|
|
10
12
|
export type { ShowShareMenuPayload, ShowShareMenuResult } from './modules/share/show-share-menu';
|
|
11
13
|
export type { MiniProgramScreenshotOptions, MiniProgramScreenshotRect, MiniProgramShareChannel, MiniProgramShowShareMenuOptions, } from './modules/share';
|
|
12
|
-
export type { GetStoragePayload, GetStorageResult, SetStoragePayload
|
|
14
|
+
export type { GetStoragePayload, GetStorageResult, SetStoragePayload } from './modules/storage';
|
|
13
15
|
export type { GetWindowInfoPayload, GetWindowInfoResult, MiniProgramNavigationBarForegroundStyle, MiniProgramSafeArea, MiniProgramSetNavigationBarStyleOptions, MiniProgramWindowInfoResult, SetNavigationBarStylePayload, SetNavigationBarStyleResult, } from './modules/viewport';
|
|
14
16
|
export type { MiniProgramNetworkHeaders, MiniProgramNetworkParams, MiniProgramNetworkRequestConfig, MiniProgramNetworkRequestMethod, MiniProgramNetworkResponse, MiniProgramNetworkValidateStatus, NetworkRequestPayload, NetworkResponsePayload, } from './modules/network';
|
|
15
17
|
export type { HideLoadingPayload, HideLoadingResult, MiniProgramToastStatus, ShowLoadingPayload, ShowLoadingResult, ShowToastPayload, ShowToastResult, } from './modules/ui';
|
|
16
|
-
export type { MiniProgramVibrateIntensity, SetClipboardPayload, SetClipboardResult, VibratePayload, VibrateResult
|
|
18
|
+
export type { MiniProgramVibrateIntensity, SetClipboardPayload, SetClipboardResult, VibratePayload, VibrateResult } from './modules/device';
|
|
17
19
|
export type { ClosePayload, CloseResult, OpenAppPagePayload, OpenAppPageResult, OpenGameDetailAppPagePayload, OpenPostDetailAppPagePayload, OpenUserDetailAppPagePayload, ReloadPayload, ReloadResult, } from './modules/navigation';
|