@heybox/hb-sdk 0.7.1 → 0.7.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 (39) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +11 -11
  3. package/dist/cli-chunks/{build-i36rHC8w.cjs → build-DvPd8Z03.cjs} +2 -2
  4. package/dist/cli-chunks/{context-DmtAhQC7.cjs → context-B8RhXSIn.cjs} +2 -2
  5. package/dist/cli-chunks/{create-D5bC0jY_.cjs → create-BnoTI3uE.cjs} +1 -1
  6. package/dist/cli-chunks/{dev-CKPzEVZs.cjs → dev-cujCrkqz.cjs} +5 -5
  7. package/dist/cli-chunks/{doctor-CPdodzWY.cjs → doctor-bgqFvpfQ.cjs} +1 -1
  8. package/dist/cli-chunks/{index-Dyim0XNM.cjs → index-CxDUgJ7Y.cjs} +1 -1
  9. package/dist/cli-chunks/{index-BYXJJ0O2.cjs → index-D2DLvveO.cjs} +14 -14
  10. package/dist/cli-chunks/{login-Da9gejmw.cjs → login-CPEIFPSg.cjs} +2 -2
  11. package/dist/cli-chunks/{project-vite-DgIxZGf7.cjs → project-vite-CoApr_-L.cjs} +1 -1
  12. package/dist/cli-chunks/{remote-iftAjHWt.cjs → remote-BfbWxVM8.cjs} +4 -4
  13. package/dist/cli-chunks/{session-Y0Eur0YE.cjs → session-CFd3REzM.cjs} +1 -1
  14. package/dist/cli.cjs +1 -1
  15. package/dist/devtools/mock-host/main.js +34 -55
  16. package/dist/index.cjs.js +3 -11
  17. package/dist/index.esm.js +3 -11
  18. package/dist/protocol.cjs.js +0 -10
  19. package/dist/protocol.esm.js +1 -10
  20. package/dist/vite.cjs.js +1 -1
  21. package/dist/vite.esm.js +1 -1
  22. package/package.json +1 -1
  23. package/skill/SKILL.md +5 -5
  24. package/skill/references/api-protocol.md +2 -5
  25. package/skill/references/api-root.md +10 -19
  26. package/skill/references/cli.md +4 -4
  27. package/skill/references/examples.md +5 -11
  28. package/skill/references/recipes.md +16 -33
  29. package/skill/references/safety-boundaries.md +3 -3
  30. package/skill/scripts/sync-references.mjs +6 -12
  31. package/skill/scripts/validate-skill.mjs +7 -1
  32. package/skill/skill.json +4 -4
  33. package/types/index.d.ts +1 -1
  34. package/types/modules/user/get-info.d.ts +2 -2
  35. package/types/modules/user/index.d.ts +1 -5
  36. package/types/modules/user/types.d.ts +5 -3
  37. package/types/protocol/capabilities.d.ts +2 -12
  38. package/types/protocol.d.ts +2 -2
  39. package/types/modules/user/get-local-identity.d.ts +0 -9
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.7.2
4
+
5
+ ### SDK / Runtime
6
+
7
+ - 移除 `user.getLocalIdentity()`;未开通网络权限的小程序改用 `user.getInfo()` 静默获取 `userInfo.app_user_id`,不再展示身份授权弹窗。
8
+ - 未开通网络权限且用户已登录时,`user.getInfo()` 会静默建立或读取当前小程序隔离身份,并在每次成功调用后广播 `identity: granted`;撤销授权后再次调用会建立新的隔离身份。
9
+ - Runtime 不再兼容缺少 canonical `miniProgramId` 的无参 `getUserInfo()` adapter 路径;身份缺失时 `user.getInfo()` 返回 `INVALID_STATE`。
10
+
3
11
  ## 0.7.1
4
12
 
5
13
  ### Docs / Agent Skill
package/README.md CHANGED
@@ -23,20 +23,20 @@ npm run dev
23
23
  npm install @heybox/hb-sdk
24
24
  ```
25
25
 
26
- SDK 会在导入时启动握手,能力调用会自动等待 SDK 就绪。未开通网络权限的小程序可以读取当前小程序内的隔离身份:
26
+ SDK 会在导入时启动握手,能力调用会自动等待 SDK 就绪。未开通网络权限的小程序通过 `user.getInfo()` 静默读取当前小程序内的隔离身份:
27
27
 
28
28
  需要可信用户手势的按钮不能在点击回调里等待握手。页面加载时先用 `getHandshakeState()` 读取当前状态,再用 `onHandshakeStateChange()` 订阅并立即接收当前状态;仅在 `status === 'ready'` 时启用按钮,并在组件或页面销毁时调用订阅返回的取消函数。`ready` 生命周期事件只是握手成功瞬间派发、不会重放的边沿通知,不能用来判断当前状态。
29
29
 
30
30
  ```ts
31
31
  import hbSDK from '@heybox/hb-sdk';
32
32
 
33
- async function getLocalIdentityFromUserAction() {
34
- const { appUserId } = await hbSDK.user.getLocalIdentity();
35
- return appUserId;
33
+ async function getCurrentUser() {
34
+ const result = await hbSDK.user.getInfo();
35
+ return result.userInfo?.app_user_id;
36
36
  }
37
37
  ```
38
38
 
39
- `getLocalIdentityFromUserAction` 绑定到按钮点击等可信用户操作。首次登录或 identity consent 需要 UI 而缺少可信手势时返回 `USER_GESTURE_REQUIRED`;用户取消或关闭时返回 `AUTHORIZATION_CANCELLED`,不会确认或改变授权状态。
39
+ `user.getInfo()` 不展示授权弹窗,也不要求可信用户手势。未登录时返回 `isHeyboxAppLoggedIn: false`;已登录时默认返回当前小程序隔离的 `app_user_id`。
40
40
 
41
41
  已开通网络权限的小程序在按钮点击等明确的用户操作中调用 `auth.login()`:
42
42
 
@@ -52,7 +52,7 @@ async function loginFromUserAction() {
52
52
  }
53
53
  ```
54
54
 
55
- `auth.login()` 返回 `{ code, expiresIn: 300, scopes }`,其中 `identity` 隐式强制包含;它不返回 user、profile、`appUserId` 或 token。页面只能把 code 交给开发者服务端,再由服务端按后端 OpenAPI 文档换取 token。未开通网络权限的小程序使用 `user.getLocalIdentity()`,无法获取 code 或调用 OpenAPI。完整边界见[用户身份与登录](https://docs.xiaoheihe.cn/hb_sdk/guide/auth)。
55
+ `auth.login()` 返回 `{ code, expiresIn: 300, scopes }`,其中 `identity` 隐式强制包含;它不返回 user、profile、`app_user_id` 或 token。页面只能把 code 交给开发者服务端,再由服务端按后端 OpenAPI 文档换取 token。未开通网络权限的小程序使用 `user.getInfo()`,无法获取 code 或调用 OpenAPI。完整边界见[用户身份与登录](https://docs.xiaoheihe.cn/hb_sdk/guide/auth)。
56
56
 
57
57
  用户可以在明确的按钮点击和二次确认后撤销当前小程序的授权:
58
58
 
@@ -62,7 +62,7 @@ async function revokeAuthorizationFromUserAction() {
62
62
  if (!confirmed) return;
63
63
 
64
64
  await hbSDK.user.revokeAuthorization();
65
- // 同步清理业务保存的 appUserId、用户资料和服务端会话。
65
+ // 同步清理业务保存的 app_user_id、用户资料和服务端会话。
66
66
  }
67
67
  ```
68
68
 
@@ -107,7 +107,7 @@ SDK 还提供 `getHandshakeState()` / `onHandshakeStateChange()` 管理持久握
107
107
  | 模块 | 用途 |
108
108
  | ------------ | ------------------------------------------------------------ |
109
109
  | `auth` | 获取交给开发者服务端交换的短期授权码 |
110
- | `user` | 使用 Host current-user APIs 或读取无网络小程序的本地隔离身份 |
110
+ | `user` | 读取 Host 当前用户资料、隔离身份或撤销授权 |
111
111
  | `share` | 打开分享或截图分享流程 |
112
112
  | `ui` | 展示 Toast 和 Loading |
113
113
  | `device` | 调用振动和剪贴板能力 |
@@ -127,14 +127,14 @@ SDK 还提供 `getHandshakeState()` / `onHandshakeStateChange()` 管理持久握
127
127
  - `auth.login({ scopes? })` 只返回 `{ code, expiresIn: 300, scopes }`;identity 隐式强制包含,code 只能提交给开发者服务端。
128
128
  - 需要授权 UI 时,`auth.login()` 必须来自可信用户手势,否则返回 `USER_GESTURE_REQUIRED`;用户取消或关闭时返回 `AUTHORIZATION_CANCELLED`。已授权时可以静默返回新 code。
129
129
  - `user.getSteamGameList()` 仅供未开通网络权限的小程序通过 Host 读取;已开通网络权限时返回 `SERVER_API_REQUIRED`,且授权码与 OpenAPI 不提供 Steam 游戏库 scope 或资源接口。
130
- - 已开通网络权限时,公开的 `user.getInfo()` 和 `user.getLocalIdentity()` 返回 `SERVER_API_REQUIRED`;对应身份和资料数据应由开发者服务端通过 OpenAPI 获取。
131
- - 未开通网络权限时,只用 `user.getLocalIdentity()` 获取 `{ appUserId }`,不能获取 code 或调用 OpenAPI。
130
+ - 已开通网络权限时,公开的 `user.getInfo()` 返回 `SERVER_API_REQUIRED`;对应身份和资料数据应由开发者服务端通过 OpenAPI 获取。
131
+ - 未开通网络权限时,使用 `user.getInfo()` 静默读取 `userInfo.app_user_id`,不能获取 code 或调用 OpenAPI。
132
132
  - `user.revokeAuthorization()` 在两种网络模式下都要求可信用户手势;成功后必须停止使用并清理业务缓存的旧身份、资料和服务端会话。
133
133
  - `on()` 返回取消监听函数,组件卸载或页面销毁时需要调用。
134
134
  - 业务网络请求使用 `network.request()`,不要依赖浏览器原生网络出口。
135
135
  - `network.request()` 不能访问平台保留的 runtime auth 与 OpenAPI 内部路径;页面不得持有或交换服务端应用凭据。
136
136
  - `network.request` 不支持 `multipart/form-data`;App Host 仅支持 form(`application/x-www-form-urlencoded`)与 JSON。表单请用 `URLSearchParams#toString()` 作为 `data`,文件上传请走专用上传能力。
137
- - 仅当远端已启用 `network.request` 且 `useOfficialDomain=true` 时,`hb-sdk dev` 与 `hb-sdk remote deploy` 构建才会跳过平台 CSP;其他构建继续注入平台 CSP
137
+ - 仅当远端已启用 `network.request` 时,`hb-sdk dev` 与 `hb-sdk remote deploy` 构建才会跳过平台 CSP;其他构建继续注入平台 CSP。`useOfficialDomain` 不参与 CSP 跳过判定。
138
138
  - 构建必须启用 `miniappManifest()`,推荐统一使用 `hb-sdk build`。
139
139
 
140
140
  ## 云端排行榜
@@ -5,8 +5,8 @@ var fs = require('node:fs/promises');
5
5
  var path = require('node:path');
6
6
  var runtimePermissionEnv = require('./runtime-permission-env-D-8_jPG3.cjs');
7
7
  var runtimeGate = require('./runtime-gate-CtV7rWyX.cjs');
8
- var index = require('./index-BYXJJ0O2.cjs');
9
- var projectVite = require('./project-vite-DgIxZGf7.cjs');
8
+ var index = require('./index-D2DLvveO.cjs');
9
+ var projectVite = require('./project-vite-CoApr_-L.cjs');
10
10
  require('node:async_hooks');
11
11
  require('node:module');
12
12
  require('path');
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var session = require('./session-Y0Eur0YE.cjs');
3
+ var session = require('./session-CFd3REzM.cjs');
4
4
  var runtimePermissionEnv = require('./runtime-permission-env-D-8_jPG3.cjs');
5
5
  var fs$1 = require('node:fs');
6
6
  var fs = require('node:fs/promises');
@@ -61,7 +61,7 @@ function isRecord(value) {
61
61
  function shouldSkipMiniappPlatformCsp(runtimePermissions) {
62
62
  const parsed = parseMiniProgramRuntimePermissions(runtimePermissions);
63
63
  const networkRequest = parsed.permissions['network.request'];
64
- return parsed.valid && networkRequest?.status === 'enabled' && networkRequest.config.useOfficialDomain === true;
64
+ return parsed.valid && networkRequest?.status === 'enabled';
65
65
  }
66
66
  const DEFAULT_PERMISSION_STATE = {
67
67
  networkRequest: {
@@ -5,7 +5,7 @@ var fs = require('node:fs/promises');
5
5
  var path = require('node:path');
6
6
  var require$$0 = require('fs');
7
7
  var require$$1 = require('path');
8
- var index = require('./index-BYXJJ0O2.cjs');
8
+ var index = require('./index-D2DLvveO.cjs');
9
9
  require('node:module');
10
10
  require('os');
11
11
  require('readline');
@@ -6,15 +6,15 @@ var path = require('node:path');
6
6
  var net = require('node:net');
7
7
  var promises = require('node:dns/promises');
8
8
  var node_http = require('node:http');
9
- var context = require('./context-DmtAhQC7.cjs');
9
+ var context = require('./context-B8RhXSIn.cjs');
10
10
  var node_crypto = require('node:crypto');
11
11
  var undici = require('undici');
12
12
  var browser = require('./browser-RAy8e8cV.cjs');
13
- var index = require('./index-BYXJJ0O2.cjs');
14
- var projectVite = require('./project-vite-DgIxZGf7.cjs');
13
+ var index = require('./index-D2DLvveO.cjs');
14
+ var projectVite = require('./project-vite-CoApr_-L.cjs');
15
15
  var fs$1 = require('node:fs/promises');
16
16
  var runtimePermissionEnv = require('./runtime-permission-env-D-8_jPG3.cjs');
17
- require('./session-Y0Eur0YE.cjs');
17
+ require('./session-CFd3REzM.cjs');
18
18
  require('fs');
19
19
  require('constants');
20
20
  require('stream');
@@ -1347,7 +1347,7 @@ function createHeyboxProtocol(payload) {
1347
1347
  /** 构建时替换为当前发布包的实际版本。 */
1348
1348
  const HB_SDK_VERSION = typeof undefined === 'string'
1349
1349
  ? undefined
1350
- : '0.7.1';
1350
+ : '0.7.2';
1351
1351
 
1352
1352
  class DevPermissionOverrideStoreError extends Error {
1353
1353
  code;
@@ -4,7 +4,7 @@ var fs$1 = require('node:fs');
4
4
  var fs = require('node:fs/promises');
5
5
  var os = require('node:os');
6
6
  var path = require('node:path');
7
- var index = require('./index-BYXJJ0O2.cjs');
7
+ var index = require('./index-D2DLvveO.cjs');
8
8
  require('node:module');
9
9
  require('path');
10
10
  require('os');
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index$2 = require('./index-BYXJJ0O2.cjs');
3
+ var index$2 = require('./index-D2DLvveO.cjs');
4
4
  var require$$0$2 = require('fs');
5
5
  var require$$2$1 = require('crypto');
6
6
  var require$$1$2 = require('path');
@@ -234,19 +234,19 @@ function requireArgument () {
234
234
 
235
235
  var command = {};
236
236
 
237
- const require$5 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-BYXJJ0O2.cjs', document.baseURI).href)));
237
+ const require$5 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-D2DLvveO.cjs', document.baseURI).href)));
238
238
  function __require$4() { return require$5("node:events"); }
239
239
 
240
- const require$4 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-BYXJJ0O2.cjs', document.baseURI).href)));
240
+ const require$4 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-D2DLvveO.cjs', document.baseURI).href)));
241
241
  function __require$3() { return require$4("node:child_process"); }
242
242
 
243
- const require$3 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-BYXJJ0O2.cjs', document.baseURI).href)));
243
+ const require$3 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-D2DLvveO.cjs', document.baseURI).href)));
244
244
  function __require$2() { return require$3("node:path"); }
245
245
 
246
- const require$2 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-BYXJJ0O2.cjs', document.baseURI).href)));
246
+ const require$2 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-D2DLvveO.cjs', document.baseURI).href)));
247
247
  function __require$1() { return require$2("node:fs"); }
248
248
 
249
- const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-BYXJJ0O2.cjs', document.baseURI).href)));
249
+ const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-D2DLvveO.cjs', document.baseURI).href)));
250
250
  function __require() { return require$1("node:process"); }
251
251
 
252
252
  var help = {};
@@ -13347,7 +13347,7 @@ function getPathname(pathWithQuery) {
13347
13347
  }
13348
13348
 
13349
13349
  const CLI_VERSION_PLACEHOLDER = ['__HB', 'SDK', 'CLI', 'VERSION__'].join('_');
13350
- const BUILT_CLI_VERSION = '0.7.1';
13350
+ const BUILT_CLI_VERSION = '0.7.2';
13351
13351
  const PACKAGE_JSON_CANDIDATES = [
13352
13352
  path.resolve(__dirname, '..', '..', 'package.json'),
13353
13353
  path.resolve(__dirname, '..', 'package.json'),
@@ -13681,35 +13681,35 @@ function createCommandLoggerResolver(options) {
13681
13681
  };
13682
13682
  }
13683
13683
  const defaultClearLoginStatus = async (...args) => {
13684
- const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-Da9gejmw.cjs'); });
13684
+ const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-CPEIFPSg.cjs'); });
13685
13685
  return clearLoginStatus(...args);
13686
13686
  };
13687
13687
  const defaultLoginToHeybox = async (...args) => {
13688
- const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-Da9gejmw.cjs'); });
13688
+ const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-CPEIFPSg.cjs'); });
13689
13689
  return loginToHeybox(...args);
13690
13690
  };
13691
13691
  const defaultPrintLoginStatus = async (...args) => {
13692
- const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-Da9gejmw.cjs'); });
13692
+ const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-CPEIFPSg.cjs'); });
13693
13693
  return printLoginStatus(...args);
13694
13694
  };
13695
13695
  const defaultRunBuildCommand = async (...args) => {
13696
- const { runBuildCommand } = await Promise.resolve().then(function () { return require('./build-i36rHC8w.cjs'); });
13696
+ const { runBuildCommand } = await Promise.resolve().then(function () { return require('./build-DvPd8Z03.cjs'); });
13697
13697
  return runBuildCommand(...args);
13698
13698
  };
13699
13699
  const defaultRunCreateCommand = async (...args) => {
13700
- const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-D5bC0jY_.cjs'); });
13700
+ const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-BnoTI3uE.cjs'); });
13701
13701
  return runCreateCommand(...args);
13702
13702
  };
13703
13703
  const defaultRunDevCommand = async (...args) => {
13704
- const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-CKPzEVZs.cjs'); });
13704
+ const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-cujCrkqz.cjs'); });
13705
13705
  return runDevCommand(...args);
13706
13706
  };
13707
13707
  const defaultRunDoctorCommand = async (...args) => {
13708
- const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-CPdodzWY.cjs'); });
13708
+ const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-bgqFvpfQ.cjs'); });
13709
13709
  return runDoctorCommand(...args);
13710
13710
  };
13711
13711
  const defaultRunRemoteCommand = async (...args) => {
13712
- const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-iftAjHWt.cjs'); });
13712
+ const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-BfbWxVM8.cjs'); });
13713
13713
  return runRemoteCommand(...args);
13714
13714
  };
13715
13715
  function resolveStandaloneLogger(options, verbose) {
@@ -3,9 +3,9 @@
3
3
  var promises = require('node:readline/promises');
4
4
  var node_crypto = require('node:crypto');
5
5
  var node_http = require('node:http');
6
- var session = require('./session-Y0Eur0YE.cjs');
6
+ var session = require('./session-CFd3REzM.cjs');
7
7
  var browser = require('./browser-RAy8e8cV.cjs');
8
- var index = require('./index-BYXJJ0O2.cjs');
8
+ var index = require('./index-D2DLvveO.cjs');
9
9
  require('node:path');
10
10
  require('fs');
11
11
  require('constants');
@@ -5,7 +5,7 @@ var fs$1 = require('node:fs/promises');
5
5
  var node_module = require('node:module');
6
6
  var path = require('node:path');
7
7
  var node_url = require('node:url');
8
- var index = require('./index-BYXJJ0O2.cjs');
8
+ var index = require('./index-D2DLvveO.cjs');
9
9
 
10
10
  function findProjectRoot(startDir) {
11
11
  let current = path.resolve(startDir);
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var promises = require('node:readline/promises');
4
- var index = require('./index-BYXJJ0O2.cjs');
5
- var session = require('./session-Y0Eur0YE.cjs');
4
+ var index = require('./index-D2DLvveO.cjs');
5
+ var session = require('./session-CFd3REzM.cjs');
6
6
  var childProcess = require('node:child_process');
7
7
  var fs = require('node:fs');
8
8
  var fs$1 = require('node:fs/promises');
@@ -10,7 +10,7 @@ var path = require('node:path');
10
10
  var runtimePermissionEnv = require('./runtime-permission-env-D-8_jPG3.cjs');
11
11
  var runtimeGate = require('./runtime-gate-CtV7rWyX.cjs');
12
12
  var node_crypto = require('node:crypto');
13
- var context = require('./context-DmtAhQC7.cjs');
13
+ var context = require('./context-B8RhXSIn.cjs');
14
14
  require('node:module');
15
15
  require('path');
16
16
  require('os');
@@ -271,7 +271,7 @@ function createDefaultCosClient(uploadToken, COS) {
271
271
  };
272
272
  }
273
273
  async function loadCosConstructor() {
274
- const cosModule = await Promise.resolve().then(function () { return require('./index-Dyim0XNM.cjs'); }).then(function (n) { return n.index; });
274
+ const cosModule = await Promise.resolve().then(function () { return require('./index-CxDUgJ7Y.cjs'); }).then(function (n) { return n.index; });
275
275
  return cosModule.default;
276
276
  }
277
277
  function formatSize(bytes) {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-BYXJJ0O2.cjs');
3
+ var index = require('./index-D2DLvveO.cjs');
4
4
  var node_crypto = require('node:crypto');
5
5
  var path = require('node:path');
6
6
  var require$$0$2 = require('fs');
package/dist/cli.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./cli-chunks/index-BYXJJ0O2.cjs');
3
+ var index = require('./cli-chunks/index-D2DLvveO.cjs');
4
4
  require('node:module');
5
5
  require('node:fs');
6
6
  require('node:fs/promises');
@@ -163,8 +163,6 @@ function normalizeDecodedNetworkPathname(decoded) {
163
163
  const AUTH_LOGIN_METHOD = 'auth.login';
164
164
  /** 读取当前登录态、授权状态和已获准披露资料的 bridge method 标识。 */
165
165
  const USER_GET_INFO_METHOD = 'user.getInfo';
166
- /** 读取当前用户小程序隔离身份的 bridge method 标识。 */
167
- const USER_GET_LOCAL_IDENTITY_METHOD = 'user.getLocalIdentity';
168
166
  /** 撤销当前用户授予本小程序授权的 bridge method 标识。 */
169
167
  const USER_REVOKE_AUTHORIZATION_METHOD = 'user.revokeAuthorization';
170
168
  /** 读取当前已登录用户 Steam 游戏库的 bridge method 标识。 */
@@ -265,13 +263,6 @@ const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
265
263
  permission: 'user.getInfo',
266
264
  risk: 'medium',
267
265
  },
268
- {
269
- method: USER_GET_LOCAL_IDENTITY_METHOD,
270
- module: 'user',
271
- capability: USER_GET_LOCAL_IDENTITY_METHOD,
272
- permission: 'user.getLocalIdentity',
273
- risk: 'medium',
274
- },
275
266
  {
276
267
  method: USER_REVOKE_AUTHORIZATION_METHOD,
277
268
  module: 'user',
@@ -5189,34 +5180,15 @@ function hashString(value) {
5189
5180
  }
5190
5181
 
5191
5182
  async function getMiniProgramRuntimeUserInfo(platformAdapter, identity) {
5192
- const miniProgramId = identity?.miniProgramId?.trim();
5193
- return miniProgramId
5194
- ? platformAdapter.user.getUserInfo({ miniProgramId })
5195
- : platformAdapter.user.getUserInfo();
5196
- }
5197
-
5198
- async function getMiniProgramRuntimeLocalIdentity(payload, platformAdapter, identity, trustedUserGesture) {
5199
- if (payload !== undefined) {
5200
- throw createMiniProgramRuntimeBridgeError('INVALID_PARAMS', 'user.getLocalIdentity 不接收入参');
5201
- }
5202
5183
  const miniProgramId = identity?.miniProgramId?.trim();
5203
5184
  if (!miniProgramId) {
5204
- throw createMiniProgramRuntimeBridgeError('INVALID_STATE', 'user.getLocalIdentity 缺少可信小程序身份');
5185
+ throw createMiniProgramRuntimeBridgeError('INVALID_STATE', 'user.getInfo 缺少可信小程序身份');
5205
5186
  }
5206
- const result = await platformAdapter.user.getLocalIdentity({
5207
- miniProgramId,
5208
- trustedUserGesture,
5209
- });
5210
- if (!isMiniProgramRuntimeRecord(result)
5211
- || typeof result.appUserId !== 'string'
5212
- || !result.appUserId.trim()) {
5213
- throw createMiniProgramRuntimeBridgeError('INVALID_RESPONSE', 'Host user.getLocalIdentity 返回无效');
5187
+ const result = await platformAdapter.user.getUserInfo({ miniProgramId });
5188
+ if (result.isHeyboxAppLoggedIn) {
5189
+ platformAdapter.auth.emitAuthEvent?.('user_info_authorization_change', result.authorization);
5214
5190
  }
5215
- platformAdapter.auth.emitAuthEvent?.('user_info_authorization_change', {
5216
- identity: 'granted',
5217
- profile: 'not_requested',
5218
- });
5219
- return { appUserId: result.appUserId };
5191
+ return result;
5220
5192
  }
5221
5193
 
5222
5194
  async function revokeMiniProgramRuntimeAuthorization(payload, platformAdapter, identity, trustedUserGesture) {
@@ -5568,7 +5540,6 @@ const MINI_PROGRAM_MOCK_RUNTIME_METHODS = MINI_PROGRAM_PROTOCOL_CAPABILITIES.map
5568
5540
  const MINI_PROGRAM_MOCK_RUNTIME_METHOD_HANDLER_MAP = {
5569
5541
  [AUTH_LOGIN_METHOD]: (runtime, payload, context) => runtime.login(payload, context),
5570
5542
  [USER_GET_INFO_METHOD]: (runtime) => runtime.getUserInfo(),
5571
- [USER_GET_LOCAL_IDENTITY_METHOD]: (runtime, payload, context) => runtime.getLocalIdentity(payload, context),
5572
5543
  [USER_REVOKE_AUTHORIZATION_METHOD]: (runtime, payload, context) => runtime.revokeAuthorization(payload, context),
5573
5544
  [USER_GET_STEAM_GAME_LIST_METHOD]: (runtime, payload) => runtime.getSteamGameList(payload),
5574
5545
  [SHARE_SHOW_SHARE_MENU_METHOD]: (runtime, payload) => runtime.showShareMenu(payload),
@@ -5610,6 +5581,9 @@ function createBrowserMockRuntimePlatformAdapter(options) {
5610
5581
  },
5611
5582
  },
5612
5583
  auth: {
5584
+ emitAuthEvent(name, payload) {
5585
+ options.onAuthEvent?.(name, payload);
5586
+ },
5613
5587
  async getCurrentUserId() {
5614
5588
  const user = options.getCurrentUser();
5615
5589
  return user?.app_user_id;
@@ -5629,27 +5603,21 @@ function createBrowserMockRuntimePlatformAdapter(options) {
5629
5603
  },
5630
5604
  },
5631
5605
  user: {
5632
- async getUserInfo() {
5606
+ async getUserInfo(identity) {
5633
5607
  const currentUser = options.getCurrentUser();
5634
5608
  const appUserId = currentUser?.app_user_id;
5635
- return appUserId
5609
+ const miniProgramId = identity?.miniProgramId;
5610
+ return appUserId && miniProgramId
5636
5611
  ? {
5637
5612
  isHeyboxAppLoggedIn: true,
5638
5613
  authorization: { identity: 'granted', profile: 'not_requested' },
5639
5614
  userInfo: {
5640
- app_user_id: appUserId,
5615
+ app_user_id: `${appUserId}:${miniProgramId}`,
5641
5616
  profile: { nickname: currentUser?.nickname || '', avatar: currentUser?.avatar || '' },
5642
5617
  },
5643
5618
  }
5644
5619
  : { isHeyboxAppLoggedIn: false, authorization: null, userInfo: null };
5645
5620
  },
5646
- async getLocalIdentity() {
5647
- const appUserId = options.getCurrentUser()?.app_user_id;
5648
- if (!appUserId) {
5649
- throw createMockBridgeError('NOT_LOGGED_IN', '当前 Mock 用户未登录');
5650
- }
5651
- return { appUserId };
5652
- },
5653
5621
  async revokeAuthorization(request) {
5654
5622
  if (!request.trustedUserGesture) {
5655
5623
  throw createMockBridgeError('USER_GESTURE_REQUIRED', 'Mock 撤销授权需要可信用户手势');
@@ -5838,10 +5806,6 @@ class MiniProgramMockRuntime {
5838
5806
  this.assertMockHostUserApiEnabled();
5839
5807
  return getMiniProgramRuntimeUserInfo(this.adapter, this.options.identity);
5840
5808
  }
5841
- getLocalIdentity(payload, context) {
5842
- this.assertMockHostUserApiEnabled();
5843
- return getMiniProgramRuntimeLocalIdentity(payload, this.adapter, this.options.identity, context.trustedUserGesture);
5844
- }
5845
5809
  revokeAuthorization(payload, context) {
5846
5810
  if (!this.authorizationMutationEnabled) {
5847
5811
  throw createMockBridgeError('SERVER_API_REQUIRED', '当前模式缺少有效的小程序权限快照');
@@ -6852,8 +6816,10 @@ const storage = new Map();
6852
6816
  const logs = [];
6853
6817
  let handshaken = false;
6854
6818
  let navigationBarStyle = 'dark';
6819
+ let mockHostDisposed = false;
6855
6820
  let mobileQrGeneration = 0;
6856
6821
  let mobileQrRefreshTimer;
6822
+ let nativeLaunchConfigRefreshTimer;
6857
6823
  let mobileDevSessionCreation = Promise.resolve();
6858
6824
  let currentUser = {
6859
6825
  app_user_id: 'au_debug_user',
@@ -6913,6 +6879,7 @@ const platformAdapter = createBrowserMockRuntimePlatformAdapter({
6913
6879
  currentUser = createUserFromForm();
6914
6880
  updateUserStatus();
6915
6881
  },
6882
+ onAuthEvent: (name, payload) => postEvent(name, payload),
6916
6883
  requestNetwork,
6917
6884
  setDocumentTitle(title) {
6918
6885
  document.title = title;
@@ -6931,10 +6898,7 @@ updateUserStatus();
6931
6898
  updateStorageSnapshot();
6932
6899
  updatePermissionControls();
6933
6900
  window.addEventListener('message', handleMessage);
6934
- window.addEventListener('beforeunload', () => {
6935
- clearMobileQrRefreshTimer();
6936
- postEvent('unload', { timestamp: Date.now() });
6937
- });
6901
+ window.addEventListener('beforeunload', disposeMockHost);
6938
6902
  queryElement('#login-button').addEventListener('click', () => {
6939
6903
  void runtime.login();
6940
6904
  });
@@ -6967,13 +6931,13 @@ elements.resetPermissionsButton.addEventListener('click', () => {
6967
6931
  const mobileAppQrReady = setupMobileAppQr();
6968
6932
  if (bootstrap.devContext.source === 'remote') {
6969
6933
  void mobileAppQrReady.then(() => {
6970
- window.setInterval(() => void refreshNativeLaunchConfig(), NATIVE_LAUNCH_CONFIG_REFRESH_MS);
6934
+ if (mockHostDisposed)
6935
+ return;
6936
+ nativeLaunchConfigRefreshTimer = window.setInterval(() => void refreshNativeLaunchConfig(), NATIVE_LAUNCH_CONFIG_REFRESH_MS);
6971
6937
  });
6972
6938
  }
6973
6939
  function createRuntime() {
6974
6940
  return new MiniProgramMockRuntime(platformAdapter, {
6975
- onHeyboxAppLoginChange: payload => postEvent('heybox_app_login_change', payload),
6976
- onUserInfoAuthorizationChange: authorization => postEvent('user_info_authorization_change', authorization),
6977
6941
  runtimePermissions: createMiniProgramMockRuntimePermissions(permissionState),
6978
6942
  });
6979
6943
  }
@@ -7475,6 +7439,8 @@ function setupMobileLanSelect() {
7475
7439
  elements.mobileLanSelect.disabled = !hasLanAddress;
7476
7440
  }
7477
7441
  async function updateMobileQrCode() {
7442
+ if (mockHostDisposed)
7443
+ return;
7478
7444
  const generation = ++mobileQrGeneration;
7479
7445
  clearMobileQrRefreshTimer();
7480
7446
  if (nativeAppLaunchUnavailableReason) {
@@ -7586,6 +7552,19 @@ function clearMobileQrRefreshTimer() {
7586
7552
  window.clearTimeout(mobileQrRefreshTimer);
7587
7553
  mobileQrRefreshTimer = undefined;
7588
7554
  }
7555
+ function disposeMockHost() {
7556
+ if (mockHostDisposed)
7557
+ return;
7558
+ mockHostDisposed = true;
7559
+ mobileQrGeneration += 1;
7560
+ clearMobileQrRefreshTimer();
7561
+ if (nativeLaunchConfigRefreshTimer !== undefined) {
7562
+ window.clearInterval(nativeLaunchConfigRefreshTimer);
7563
+ nativeLaunchConfigRefreshTimer = undefined;
7564
+ }
7565
+ window.removeEventListener('message', handleMessage);
7566
+ postEvent('unload', { timestamp: Date.now() });
7567
+ }
7589
7568
  function applyDevContextToMobileQrPayload(payload, devContextUrl) {
7590
7569
  const protocolMarker = payload.includes('#heybox://') ? '#heybox://' : 'heybox://';
7591
7570
  const protocolIndex = payload.indexOf(protocolMarker);
package/dist/index.cjs.js CHANGED
@@ -640,7 +640,7 @@ function createMessageId() {
640
640
  /** 构建时替换为当前发布包的实际版本。 */
641
641
  const HB_SDK_VERSION = typeof undefined === 'string'
642
642
  ? undefined
643
- : '0.7.1';
643
+ : '0.7.2';
644
644
 
645
645
  /**
646
646
  * 判断未知数据是否符合小程序 bridge 消息信封。
@@ -1019,8 +1019,6 @@ class MiniProgramBridgeClient {
1019
1019
  const AUTH_LOGIN_METHOD = 'auth.login';
1020
1020
  /** 读取当前登录态、授权状态和已获准披露资料的 bridge method 标识。 */
1021
1021
  const USER_GET_INFO_METHOD = 'user.getInfo';
1022
- /** 读取当前用户小程序隔离身份的 bridge method 标识。 */
1023
- const USER_GET_LOCAL_IDENTITY_METHOD = 'user.getLocalIdentity';
1024
1022
  /** 撤销当前用户授予本小程序授权的 bridge method 标识。 */
1025
1023
  const USER_REVOKE_AUTHORIZATION_METHOD = 'user.revokeAuthorization';
1026
1024
  /** 读取当前已登录用户 Steam 游戏库的 bridge method 标识。 */
@@ -1450,8 +1448,8 @@ function createViewportModule(requester) {
1450
1448
  *
1451
1449
  * @returns 当前用户的登录态与公开基础资料。
1452
1450
  *
1453
- * 该能力仅在身份授权后返回按小程序隔离的 `app_user_id`,仅在 profile
1454
- * 授权后返回昵称与头像。未登录时返回
1451
+ * 未开通网络权限且当前黑盒 APP 用户已登录时,该能力会静默建立或读取按小程序隔离的
1452
+ * `app_user_id`,不展示授权 UI;仅在 profile 授权后返回昵称与头像。未登录时返回
1455
1453
  * `{ isHeyboxAppLoggedIn: false, authorization: null, userInfo: null }`。
1456
1454
  *
1457
1455
  * @throws {HbMiniProgramSDKError} 当 SDK 调用失败时抛出。
@@ -1460,10 +1458,6 @@ function getInfo(requester) {
1460
1458
  return requester.request(USER_GET_INFO_METHOD);
1461
1459
  }
1462
1460
 
1463
- function getLocalIdentity(requester) {
1464
- return requester.request(USER_GET_LOCAL_IDENTITY_METHOD);
1465
- }
1466
-
1467
1461
  function revokeAuthorization(requester) {
1468
1462
  return requester.request(USER_REVOKE_AUTHORIZATION_METHOD);
1469
1463
  }
@@ -1482,7 +1476,6 @@ function getSteamGameList(requester, options) {
1482
1476
  function createUserModule(requester) {
1483
1477
  return {
1484
1478
  getInfo: () => getInfo(requester),
1485
- getLocalIdentity: () => getLocalIdentity(requester),
1486
1479
  revokeAuthorization: () => revokeAuthorization(requester),
1487
1480
  getSteamGameList: (options) => getSteamGameList(requester, options),
1488
1481
  };
@@ -1785,7 +1778,6 @@ const auth = {
1785
1778
  /** 默认 SDK 实例的用户资料模块。 */
1786
1779
  const user = {
1787
1780
  getInfo: () => getDefaultSDK().user.getInfo(),
1788
- getLocalIdentity: () => getDefaultSDK().user.getLocalIdentity(),
1789
1781
  revokeAuthorization: () => getDefaultSDK().user.revokeAuthorization(),
1790
1782
  getSteamGameList: (options) => getDefaultSDK().user.getSteamGameList(options),
1791
1783
  };
package/dist/index.esm.js CHANGED
@@ -636,7 +636,7 @@ function createMessageId() {
636
636
  /** 构建时替换为当前发布包的实际版本。 */
637
637
  const HB_SDK_VERSION = typeof undefined === 'string'
638
638
  ? undefined
639
- : '0.7.1';
639
+ : '0.7.2';
640
640
 
641
641
  /**
642
642
  * 判断未知数据是否符合小程序 bridge 消息信封。
@@ -1015,8 +1015,6 @@ class MiniProgramBridgeClient {
1015
1015
  const AUTH_LOGIN_METHOD = 'auth.login';
1016
1016
  /** 读取当前登录态、授权状态和已获准披露资料的 bridge method 标识。 */
1017
1017
  const USER_GET_INFO_METHOD = 'user.getInfo';
1018
- /** 读取当前用户小程序隔离身份的 bridge method 标识。 */
1019
- const USER_GET_LOCAL_IDENTITY_METHOD = 'user.getLocalIdentity';
1020
1018
  /** 撤销当前用户授予本小程序授权的 bridge method 标识。 */
1021
1019
  const USER_REVOKE_AUTHORIZATION_METHOD = 'user.revokeAuthorization';
1022
1020
  /** 读取当前已登录用户 Steam 游戏库的 bridge method 标识。 */
@@ -1446,8 +1444,8 @@ function createViewportModule(requester) {
1446
1444
  *
1447
1445
  * @returns 当前用户的登录态与公开基础资料。
1448
1446
  *
1449
- * 该能力仅在身份授权后返回按小程序隔离的 `app_user_id`,仅在 profile
1450
- * 授权后返回昵称与头像。未登录时返回
1447
+ * 未开通网络权限且当前黑盒 APP 用户已登录时,该能力会静默建立或读取按小程序隔离的
1448
+ * `app_user_id`,不展示授权 UI;仅在 profile 授权后返回昵称与头像。未登录时返回
1451
1449
  * `{ isHeyboxAppLoggedIn: false, authorization: null, userInfo: null }`。
1452
1450
  *
1453
1451
  * @throws {HbMiniProgramSDKError} 当 SDK 调用失败时抛出。
@@ -1456,10 +1454,6 @@ function getInfo(requester) {
1456
1454
  return requester.request(USER_GET_INFO_METHOD);
1457
1455
  }
1458
1456
 
1459
- function getLocalIdentity(requester) {
1460
- return requester.request(USER_GET_LOCAL_IDENTITY_METHOD);
1461
- }
1462
-
1463
1457
  function revokeAuthorization(requester) {
1464
1458
  return requester.request(USER_REVOKE_AUTHORIZATION_METHOD);
1465
1459
  }
@@ -1478,7 +1472,6 @@ function getSteamGameList(requester, options) {
1478
1472
  function createUserModule(requester) {
1479
1473
  return {
1480
1474
  getInfo: () => getInfo(requester),
1481
- getLocalIdentity: () => getLocalIdentity(requester),
1482
1475
  revokeAuthorization: () => revokeAuthorization(requester),
1483
1476
  getSteamGameList: (options) => getSteamGameList(requester, options),
1484
1477
  };
@@ -1781,7 +1774,6 @@ const auth = {
1781
1774
  /** 默认 SDK 实例的用户资料模块。 */
1782
1775
  const user = {
1783
1776
  getInfo: () => getDefaultSDK().user.getInfo(),
1784
- getLocalIdentity: () => getDefaultSDK().user.getLocalIdentity(),
1785
1777
  revokeAuthorization: () => getDefaultSDK().user.revokeAuthorization(),
1786
1778
  getSteamGameList: (options) => getDefaultSDK().user.getSteamGameList(options),
1787
1779
  };