@heybox/hb-sdk-protocol 0.8.1-alpha.2 → 0.8.1-alpha.6
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 +7 -1
- package/dist/index.cjs.js +137 -13
- package/dist/index.esm.js +119 -14
- package/package.json +1 -1
- package/src/bridge.ts +27 -5
- package/src/capabilities.ts +107 -2
- package/src/constants.ts +3 -0
- package/src/guards.ts +25 -2
- package/src/payloads.ts +134 -0
- package/src/permission-catalog.ts +24 -0
- package/src/permissions.ts +2 -1
- package/types/bridge.d.ts +9 -5
- package/types/capabilities.d.ts +56 -4
- package/types/constants.d.ts +3 -0
- package/types/guards.d.ts +3 -1
- package/types/payloads.d.ts +120 -0
- package/types/permission-catalog.d.ts +10 -1
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# @heybox/hb-sdk-protocol
|
|
2
2
|
|
|
3
|
+
目录引用的 `relativePath` 允许完整 `.` 表示当前根;普通相对路径及文件引用仍拒绝点段、父目录和绝对路径。
|
|
4
|
+
|
|
3
5
|
小黑盒外部小程序 SDK 与宿主 Runtime 共用的零依赖 wire contract。它只描述跨 iframe 边界传输的数据和校验规则,不执行 bridge、网络、登录、存储或任何平台能力。
|
|
4
6
|
|
|
5
7
|
## 边界
|
|
@@ -39,7 +41,11 @@ import { MINI_PROGRAM_PROTOCOL_CAPABILITIES, type MiniProgramBridgeMessage } fro
|
|
|
39
41
|
|
|
40
42
|
## 权限快照
|
|
41
43
|
|
|
42
|
-
`MINI_PROGRAM_PERMISSION_CATALOG` 定义
|
|
44
|
+
`MINI_PROGRAM_PERMISSION_CATALOG` 定义 9 个公开权限,`MINI_PROGRAM_PROTOCOL_CAPABILITIES[].requirement` 将每个 bridge method 显式分类为无需声明或要求全部列出的权限。`companion` 是无配置项的高风险平台审批权限,覆盖准备、启动、活动 Session 控制、stdio、附件与通知 wire method。`parseMiniProgramRuntimePermissions()` 是 schema v1 的 fail-closed 解析器;旧 `network.request` entry 仅在解析边界归一为 `network`,不得进入新配置。未知权限 entry 会被忽略,即使 `config` 为 `null` 或缺失,也不能让已认识的批准失效。跨语言目录由 `generated/permission-catalog.json` 提供。
|
|
45
|
+
|
|
46
|
+
耗时能力通过 `MiniProgramCapabilityProgressMap` 按 method 绑定进度 payload;当前覆盖 `network.download` 与 `companion.prepare`。Companion Session wire 只携带不透明 Session ID、controller generation、原始字节 chunk/ack、exit 和 ownership-lost 事件,不暴露 PID、路径或原生句柄。
|
|
47
|
+
|
|
48
|
+
`CompanionInfo.source` 由可信 Host 标识 `local-dev` 或 `released`,与 `signatureStatus` 一起供授权展示使用;旧 Host 未提供来源时保持未知,不能推定为已审核产物。
|
|
43
49
|
|
|
44
50
|
协议包不决定业务授权。`auth.login()` 的 UI、账号会话、授权码签发和 OpenAPI 都由 Host/服务端负责;协议层只传递经过约束的 request/response 数据。
|
|
45
51
|
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
const MINI_PROGRAM_MESSAGE_NAMESPACE = 'heybox:miniprogram';
|
|
4
|
+
const MINI_PROGRAM_MESSAGE_VERSION = 2;
|
|
5
|
+
const MINI_PROGRAM_BRIDGE_NONCE_PARAM = 'hb_mini_bridge_nonce';
|
|
6
|
+
const SDK_HANDSHAKE_METHOD = 'sdk.handshake';
|
|
7
|
+
const RUNTIME_LOCATION_PROBE_METHOD = 'runtime.location.probe';
|
|
8
|
+
const SDK_LOCATION_REPORT_METHOD = 'sdk.location.report';
|
|
9
|
+
const SDK_CSP_VIOLATION_METHOD = 'sdk.csp.violation';
|
|
10
|
+
const MINI_PROGRAM_OPERATION_PROGRESS_METHOD = 'operation.progress';
|
|
11
|
+
const COMPANION_SESSION_OUTPUT_EVENT = 'companion.session.output';
|
|
12
|
+
const COMPANION_SESSION_EXIT_EVENT = 'companion.session.exit';
|
|
13
|
+
const COMPANION_SESSION_OWNERSHIP_LOST_EVENT = 'companion.session.ownershipLost';
|
|
14
|
+
|
|
3
15
|
const AUTH_LOGIN_METHOD = 'auth.login';
|
|
4
16
|
const USER_GET_INFO_METHOD = 'user.getInfo';
|
|
5
17
|
const USER_REVOKE_AUTHORIZATION_METHOD = 'user.revokeAuthorization';
|
|
@@ -41,6 +53,18 @@ const CLOUD_LEADERBOARD_GET_LIST_METHOD = 'cloud.leaderboard.getList';
|
|
|
41
53
|
const CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.getCurrentUserEntry';
|
|
42
54
|
const CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.deleteCurrentUserEntry';
|
|
43
55
|
const CLOUD_LEADERBOARD_GET_INFO_METHOD = 'cloud.leaderboard.getInfo';
|
|
56
|
+
const COMPANION_GET_INFO_METHOD = 'companion.getInfo';
|
|
57
|
+
const COMPANION_GET_PREPARATION_STATUS_METHOD = 'companion.getPreparationStatus';
|
|
58
|
+
const COMPANION_PREPARE_METHOD = 'companion.prepare';
|
|
59
|
+
const COMPANION_CANCEL_PREPARATION_METHOD = 'companion.cancelPreparation';
|
|
60
|
+
const COMPANION_GET_ACTIVE_SESSION_METHOD = 'companion.getActiveSession';
|
|
61
|
+
const COMPANION_LAUNCH_METHOD = 'companion.launch';
|
|
62
|
+
const COMPANION_SESSION_WRITE_METHOD = 'companion.session.write';
|
|
63
|
+
const COMPANION_SESSION_CLOSE_STDIN_METHOD = 'companion.session.closeStdin';
|
|
64
|
+
const COMPANION_SESSION_TERMINATE_METHOD = 'companion.session.terminate';
|
|
65
|
+
const COMPANION_SESSION_ACK_OUTPUT_METHOD = 'companion.session.ackOutput';
|
|
66
|
+
const COMPANION_OPEN_ATTACHMENT_METHOD = 'companion.openAttachment';
|
|
67
|
+
const COMPANION_SHOW_NOTIFICATION_METHOD = 'companion.showNotification';
|
|
44
68
|
const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
|
|
45
69
|
{
|
|
46
70
|
method: AUTH_LOGIN_METHOD,
|
|
@@ -287,17 +311,28 @@ const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
|
|
|
287
311
|
requirement: { kind: 'all', permissions: ['leaderboard'] },
|
|
288
312
|
risk: 'low',
|
|
289
313
|
},
|
|
314
|
+
...[
|
|
315
|
+
COMPANION_GET_INFO_METHOD,
|
|
316
|
+
COMPANION_GET_PREPARATION_STATUS_METHOD,
|
|
317
|
+
COMPANION_PREPARE_METHOD,
|
|
318
|
+
COMPANION_CANCEL_PREPARATION_METHOD,
|
|
319
|
+
COMPANION_GET_ACTIVE_SESSION_METHOD,
|
|
320
|
+
COMPANION_LAUNCH_METHOD,
|
|
321
|
+
COMPANION_SESSION_WRITE_METHOD,
|
|
322
|
+
COMPANION_SESSION_CLOSE_STDIN_METHOD,
|
|
323
|
+
COMPANION_SESSION_TERMINATE_METHOD,
|
|
324
|
+
COMPANION_SESSION_ACK_OUTPUT_METHOD,
|
|
325
|
+
COMPANION_OPEN_ATTACHMENT_METHOD,
|
|
326
|
+
COMPANION_SHOW_NOTIFICATION_METHOD,
|
|
327
|
+
].map((method) => ({
|
|
328
|
+
method,
|
|
329
|
+
module: 'companion',
|
|
330
|
+
capability: method,
|
|
331
|
+
requirement: { kind: 'all', permissions: ['companion'] },
|
|
332
|
+
risk: 'high',
|
|
333
|
+
})),
|
|
290
334
|
];
|
|
291
335
|
|
|
292
|
-
const MINI_PROGRAM_MESSAGE_NAMESPACE = 'heybox:miniprogram';
|
|
293
|
-
const MINI_PROGRAM_MESSAGE_VERSION = 2;
|
|
294
|
-
const MINI_PROGRAM_BRIDGE_NONCE_PARAM = 'hb_mini_bridge_nonce';
|
|
295
|
-
const SDK_HANDSHAKE_METHOD = 'sdk.handshake';
|
|
296
|
-
const RUNTIME_LOCATION_PROBE_METHOD = 'runtime.location.probe';
|
|
297
|
-
const SDK_LOCATION_REPORT_METHOD = 'sdk.location.report';
|
|
298
|
-
const SDK_CSP_VIOLATION_METHOD = 'sdk.csp.violation';
|
|
299
|
-
const MINI_PROGRAM_OPERATION_PROGRESS_METHOD = 'operation.progress';
|
|
300
|
-
|
|
301
336
|
function isMiniProgramBridgeMessage(value) {
|
|
302
337
|
if (!isRecord$1(value))
|
|
303
338
|
return false;
|
|
@@ -319,7 +354,7 @@ function isMiniProgramBridgeMessage(value) {
|
|
|
319
354
|
if (!isNonEmptyString(value.method) || value.error !== undefined)
|
|
320
355
|
return false;
|
|
321
356
|
if (value.method === MINI_PROGRAM_OPERATION_PROGRESS_METHOD) {
|
|
322
|
-
return value.version === 2 && isNonEmptyString(value.id) &&
|
|
357
|
+
return value.version === 2 && isNonEmptyString(value.id) && isMiniProgramOperationProgressPayload(value.payload);
|
|
323
358
|
}
|
|
324
359
|
return value.id === undefined || isNonEmptyString(value.id);
|
|
325
360
|
}
|
|
@@ -357,7 +392,7 @@ function isMiniProgramDirectoryRef(value) {
|
|
|
357
392
|
if (isNonEmptyString(value.handleId)) {
|
|
358
393
|
return hasOnlyKeys(value, ['kind', 'handleId']);
|
|
359
394
|
}
|
|
360
|
-
return (isMiniProgramPathRootRef(value.root) && isMiniProgramRelativePath(value.relativePath) && hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
|
|
395
|
+
return (isMiniProgramPathRootRef(value.root) && (value.relativePath === '.' || isMiniProgramRelativePath(value.relativePath)) && hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
|
|
361
396
|
}
|
|
362
397
|
function isMiniProgramFileDescriptor(value) {
|
|
363
398
|
return (isRecord$1(value) &&
|
|
@@ -400,6 +435,24 @@ function isMiniProgramDownloadProgressPayload(value) {
|
|
|
400
435
|
return value.total === undefined;
|
|
401
436
|
return isNonNegativeSafeInteger(value.total) && value.loaded <= value.total;
|
|
402
437
|
}
|
|
438
|
+
function isMiniProgramCompanionPrepareProgress(value) {
|
|
439
|
+
if (!isRecord$1(value))
|
|
440
|
+
return false;
|
|
441
|
+
if (value.phase === 'downloading') {
|
|
442
|
+
return (isNonNegativeSafeInteger(value.loaded) &&
|
|
443
|
+
(value.total === undefined || (isNonNegativeSafeInteger(value.total) && value.loaded <= value.total)) &&
|
|
444
|
+
hasOnlyKeys(value, ['phase', 'loaded', 'total']));
|
|
445
|
+
}
|
|
446
|
+
if (value.phase !== 'verifying' && value.phase !== 'extracting')
|
|
447
|
+
return false;
|
|
448
|
+
return (isNonNegativeSafeInteger(value.processed) &&
|
|
449
|
+
isNonNegativeSafeInteger(value.total) &&
|
|
450
|
+
value.processed <= value.total &&
|
|
451
|
+
hasOnlyKeys(value, ['phase', 'processed', 'total']));
|
|
452
|
+
}
|
|
453
|
+
function isMiniProgramOperationProgressPayload(value) {
|
|
454
|
+
return isMiniProgramDownloadProgressPayload(value) || isMiniProgramCompanionPrepareProgress(value);
|
|
455
|
+
}
|
|
403
456
|
function isSDKHandshakePayload(value) {
|
|
404
457
|
return isRecord$1(value) && isNonEmptyString(value.href) && typeof value.userAgent === 'string' && isNonEmptyString(value.sdkVersion);
|
|
405
458
|
}
|
|
@@ -428,6 +481,34 @@ function isRecord$1(value) {
|
|
|
428
481
|
|
|
429
482
|
/** 当前用户信息与登录能力支持的完整 scope 目录。 */
|
|
430
483
|
const USER_INFO_AUTHORIZATION_SCOPES = ['identity', 'profile'];
|
|
484
|
+
/** Companion alias 的跨构建、Runtime 与 Host 规范。 */
|
|
485
|
+
const COMPANION_ALIAS_PATTERN = /^[a-z][a-z0-9-]{0,31}$/;
|
|
486
|
+
/** Companion Host 可跨 bridge 保留的稳定领域错误码。 */
|
|
487
|
+
const COMPANION_ERROR_CODES = [
|
|
488
|
+
'COMPANION_UNSUPPORTED',
|
|
489
|
+
'COMPANION_NOT_DECLARED',
|
|
490
|
+
'COMPANION_TARGET_UNSUPPORTED',
|
|
491
|
+
'COMPANION_NOT_PREPARED',
|
|
492
|
+
'COMPANION_PREPARATION_CANCELLED',
|
|
493
|
+
'COMPANION_DOWNLOAD_FAILED',
|
|
494
|
+
'COMPANION_DESCRIPTOR_UNAVAILABLE',
|
|
495
|
+
'COMPANION_ARCHIVE_INVALID',
|
|
496
|
+
'COMPANION_INTEGRITY_FAILED',
|
|
497
|
+
'COMPANION_ENTRYPOINT_INVALID',
|
|
498
|
+
'COMPANION_USER_CANCELLED',
|
|
499
|
+
'COMPANION_ELEVATION_DENIED',
|
|
500
|
+
'COMPANION_OS_BLOCKED',
|
|
501
|
+
'COMPANION_LAUNCH_FAILED',
|
|
502
|
+
'COMPANION_SESSION_VERSION_MISMATCH',
|
|
503
|
+
'COMPANION_SESSION_OWNERSHIP_LOST',
|
|
504
|
+
'COMPANION_SESSION_EXITED',
|
|
505
|
+
'COMPANION_PIPE_CLOSED',
|
|
506
|
+
'COMPANION_OUTPUT_LIMIT',
|
|
507
|
+
'COMPANION_PROCESS_CRASHED',
|
|
508
|
+
'COMPANION_ATTACHMENT_NOT_FOUND',
|
|
509
|
+
'COMPANION_NOTIFICATION_UNAVAILABLE',
|
|
510
|
+
'COMPANION_TERMINATE_FAILED',
|
|
511
|
+
];
|
|
431
512
|
|
|
432
513
|
const MINI_PROGRAM_PERMISSION_KEYS = [
|
|
433
514
|
'userInfo',
|
|
@@ -438,6 +519,7 @@ const MINI_PROGRAM_PERMISSION_KEYS = [
|
|
|
438
519
|
'clipboard',
|
|
439
520
|
'leaderboard',
|
|
440
521
|
'network',
|
|
522
|
+
'companion',
|
|
441
523
|
];
|
|
442
524
|
const MINI_PROGRAM_PERMISSION_CATALOG = [
|
|
443
525
|
{
|
|
@@ -550,6 +632,29 @@ const MINI_PROGRAM_PERMISSION_CATALOG = [
|
|
|
550
632
|
methods: ['network.request', 'network.download'],
|
|
551
633
|
conditions: ['声明后仍需平台批准,并继续执行网络安全策略。'],
|
|
552
634
|
},
|
|
635
|
+
{
|
|
636
|
+
key: 'companion',
|
|
637
|
+
name: '桌面辅助应用',
|
|
638
|
+
description: '下载、准备并运行随当前小程序版本发布的受管桌面程序。',
|
|
639
|
+
access: 'platform-approval',
|
|
640
|
+
risk: 'high',
|
|
641
|
+
config: {},
|
|
642
|
+
methods: [
|
|
643
|
+
'companion.getInfo',
|
|
644
|
+
'companion.getPreparationStatus',
|
|
645
|
+
'companion.prepare',
|
|
646
|
+
'companion.cancelPreparation',
|
|
647
|
+
'companion.getActiveSession',
|
|
648
|
+
'companion.launch',
|
|
649
|
+
'companion.session.write',
|
|
650
|
+
'companion.session.closeStdin',
|
|
651
|
+
'companion.session.terminate',
|
|
652
|
+
'companion.session.ackOutput',
|
|
653
|
+
'companion.openAttachment',
|
|
654
|
+
'companion.showNotification',
|
|
655
|
+
],
|
|
656
|
+
conditions: ['声明后仍需平台批准,并继续执行可信用户手势、Host 能力和当前版本 Manifest 校验。'],
|
|
657
|
+
},
|
|
553
658
|
];
|
|
554
659
|
const MINI_PROGRAM_NO_DECLARATION_METHODS = [
|
|
555
660
|
'user.revokeAuthorization',
|
|
@@ -592,8 +697,8 @@ function parseMiniProgramRuntimePermissions(snapshot) {
|
|
|
592
697
|
}
|
|
593
698
|
seenKeys.add(key);
|
|
594
699
|
if (!isManagedMiniProgramRuntimePermissionKey(key)) {
|
|
595
|
-
|
|
596
|
-
|
|
700
|
+
// 未知权限必须忽略,不能让 config:null / 缺字段把已认识的批准一起否掉。
|
|
701
|
+
// 服务端会对无 config 的 message 字段输出 null(Rylai EmitUnpopulated)。
|
|
597
702
|
continue;
|
|
598
703
|
}
|
|
599
704
|
if (key === 'network') {
|
|
@@ -629,6 +734,23 @@ exports.CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD = CLOUD_LEADERBOARD_GET_
|
|
|
629
734
|
exports.CLOUD_LEADERBOARD_GET_INFO_METHOD = CLOUD_LEADERBOARD_GET_INFO_METHOD;
|
|
630
735
|
exports.CLOUD_LEADERBOARD_GET_LIST_METHOD = CLOUD_LEADERBOARD_GET_LIST_METHOD;
|
|
631
736
|
exports.CLOUD_LEADERBOARD_SUBMIT_METHOD = CLOUD_LEADERBOARD_SUBMIT_METHOD;
|
|
737
|
+
exports.COMPANION_ALIAS_PATTERN = COMPANION_ALIAS_PATTERN;
|
|
738
|
+
exports.COMPANION_CANCEL_PREPARATION_METHOD = COMPANION_CANCEL_PREPARATION_METHOD;
|
|
739
|
+
exports.COMPANION_ERROR_CODES = COMPANION_ERROR_CODES;
|
|
740
|
+
exports.COMPANION_GET_ACTIVE_SESSION_METHOD = COMPANION_GET_ACTIVE_SESSION_METHOD;
|
|
741
|
+
exports.COMPANION_GET_INFO_METHOD = COMPANION_GET_INFO_METHOD;
|
|
742
|
+
exports.COMPANION_GET_PREPARATION_STATUS_METHOD = COMPANION_GET_PREPARATION_STATUS_METHOD;
|
|
743
|
+
exports.COMPANION_LAUNCH_METHOD = COMPANION_LAUNCH_METHOD;
|
|
744
|
+
exports.COMPANION_OPEN_ATTACHMENT_METHOD = COMPANION_OPEN_ATTACHMENT_METHOD;
|
|
745
|
+
exports.COMPANION_PREPARE_METHOD = COMPANION_PREPARE_METHOD;
|
|
746
|
+
exports.COMPANION_SESSION_ACK_OUTPUT_METHOD = COMPANION_SESSION_ACK_OUTPUT_METHOD;
|
|
747
|
+
exports.COMPANION_SESSION_CLOSE_STDIN_METHOD = COMPANION_SESSION_CLOSE_STDIN_METHOD;
|
|
748
|
+
exports.COMPANION_SESSION_EXIT_EVENT = COMPANION_SESSION_EXIT_EVENT;
|
|
749
|
+
exports.COMPANION_SESSION_OUTPUT_EVENT = COMPANION_SESSION_OUTPUT_EVENT;
|
|
750
|
+
exports.COMPANION_SESSION_OWNERSHIP_LOST_EVENT = COMPANION_SESSION_OWNERSHIP_LOST_EVENT;
|
|
751
|
+
exports.COMPANION_SESSION_TERMINATE_METHOD = COMPANION_SESSION_TERMINATE_METHOD;
|
|
752
|
+
exports.COMPANION_SESSION_WRITE_METHOD = COMPANION_SESSION_WRITE_METHOD;
|
|
753
|
+
exports.COMPANION_SHOW_NOTIFICATION_METHOD = COMPANION_SHOW_NOTIFICATION_METHOD;
|
|
632
754
|
exports.DEVICE_SET_CLIPBOARD_METHOD = DEVICE_SET_CLIPBOARD_METHOD;
|
|
633
755
|
exports.DEVICE_VIBRATE_METHOD = DEVICE_VIBRATE_METHOD;
|
|
634
756
|
exports.DIRECTORY_CREATE_METHOD = DIRECTORY_CREATE_METHOD;
|
|
@@ -680,6 +802,7 @@ exports.VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD = VIEWPORT_SET_NAVIGATION_BAR_S
|
|
|
680
802
|
exports.isManagedMiniProgramRuntimePermissionKey = isManagedMiniProgramRuntimePermissionKey;
|
|
681
803
|
exports.isMiniProgramBridgeMessage = isMiniProgramBridgeMessage;
|
|
682
804
|
exports.isMiniProgramByteArray = isMiniProgramByteArray;
|
|
805
|
+
exports.isMiniProgramCompanionPrepareProgress = isMiniProgramCompanionPrepareProgress;
|
|
683
806
|
exports.isMiniProgramDirectoryDescriptor = isMiniProgramDirectoryDescriptor;
|
|
684
807
|
exports.isMiniProgramDirectoryRef = isMiniProgramDirectoryRef;
|
|
685
808
|
exports.isMiniProgramDownloadProgressPayload = isMiniProgramDownloadProgressPayload;
|
|
@@ -687,6 +810,7 @@ exports.isMiniProgramFileDescriptor = isMiniProgramFileDescriptor;
|
|
|
687
810
|
exports.isMiniProgramFileRef = isMiniProgramFileRef;
|
|
688
811
|
exports.isMiniProgramFileStat = isMiniProgramFileStat;
|
|
689
812
|
exports.isMiniProgramFileSystemEntityDescriptor = isMiniProgramFileSystemEntityDescriptor;
|
|
813
|
+
exports.isMiniProgramOperationProgressPayload = isMiniProgramOperationProgressPayload;
|
|
690
814
|
exports.isMiniProgramPathRootRef = isMiniProgramPathRootRef;
|
|
691
815
|
exports.isMiniProgramPermissionKey = isMiniProgramPermissionKey;
|
|
692
816
|
exports.isMiniProgramRelativePath = isMiniProgramRelativePath;
|
package/dist/index.esm.js
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
const MINI_PROGRAM_MESSAGE_NAMESPACE = 'heybox:miniprogram';
|
|
2
|
+
const MINI_PROGRAM_MESSAGE_VERSION = 2;
|
|
3
|
+
const MINI_PROGRAM_BRIDGE_NONCE_PARAM = 'hb_mini_bridge_nonce';
|
|
4
|
+
const SDK_HANDSHAKE_METHOD = 'sdk.handshake';
|
|
5
|
+
const RUNTIME_LOCATION_PROBE_METHOD = 'runtime.location.probe';
|
|
6
|
+
const SDK_LOCATION_REPORT_METHOD = 'sdk.location.report';
|
|
7
|
+
const SDK_CSP_VIOLATION_METHOD = 'sdk.csp.violation';
|
|
8
|
+
const MINI_PROGRAM_OPERATION_PROGRESS_METHOD = 'operation.progress';
|
|
9
|
+
const COMPANION_SESSION_OUTPUT_EVENT = 'companion.session.output';
|
|
10
|
+
const COMPANION_SESSION_EXIT_EVENT = 'companion.session.exit';
|
|
11
|
+
const COMPANION_SESSION_OWNERSHIP_LOST_EVENT = 'companion.session.ownershipLost';
|
|
12
|
+
|
|
1
13
|
const AUTH_LOGIN_METHOD = 'auth.login';
|
|
2
14
|
const USER_GET_INFO_METHOD = 'user.getInfo';
|
|
3
15
|
const USER_REVOKE_AUTHORIZATION_METHOD = 'user.revokeAuthorization';
|
|
@@ -39,6 +51,18 @@ const CLOUD_LEADERBOARD_GET_LIST_METHOD = 'cloud.leaderboard.getList';
|
|
|
39
51
|
const CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.getCurrentUserEntry';
|
|
40
52
|
const CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.deleteCurrentUserEntry';
|
|
41
53
|
const CLOUD_LEADERBOARD_GET_INFO_METHOD = 'cloud.leaderboard.getInfo';
|
|
54
|
+
const COMPANION_GET_INFO_METHOD = 'companion.getInfo';
|
|
55
|
+
const COMPANION_GET_PREPARATION_STATUS_METHOD = 'companion.getPreparationStatus';
|
|
56
|
+
const COMPANION_PREPARE_METHOD = 'companion.prepare';
|
|
57
|
+
const COMPANION_CANCEL_PREPARATION_METHOD = 'companion.cancelPreparation';
|
|
58
|
+
const COMPANION_GET_ACTIVE_SESSION_METHOD = 'companion.getActiveSession';
|
|
59
|
+
const COMPANION_LAUNCH_METHOD = 'companion.launch';
|
|
60
|
+
const COMPANION_SESSION_WRITE_METHOD = 'companion.session.write';
|
|
61
|
+
const COMPANION_SESSION_CLOSE_STDIN_METHOD = 'companion.session.closeStdin';
|
|
62
|
+
const COMPANION_SESSION_TERMINATE_METHOD = 'companion.session.terminate';
|
|
63
|
+
const COMPANION_SESSION_ACK_OUTPUT_METHOD = 'companion.session.ackOutput';
|
|
64
|
+
const COMPANION_OPEN_ATTACHMENT_METHOD = 'companion.openAttachment';
|
|
65
|
+
const COMPANION_SHOW_NOTIFICATION_METHOD = 'companion.showNotification';
|
|
42
66
|
const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
|
|
43
67
|
{
|
|
44
68
|
method: AUTH_LOGIN_METHOD,
|
|
@@ -285,17 +309,28 @@ const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
|
|
|
285
309
|
requirement: { kind: 'all', permissions: ['leaderboard'] },
|
|
286
310
|
risk: 'low',
|
|
287
311
|
},
|
|
312
|
+
...[
|
|
313
|
+
COMPANION_GET_INFO_METHOD,
|
|
314
|
+
COMPANION_GET_PREPARATION_STATUS_METHOD,
|
|
315
|
+
COMPANION_PREPARE_METHOD,
|
|
316
|
+
COMPANION_CANCEL_PREPARATION_METHOD,
|
|
317
|
+
COMPANION_GET_ACTIVE_SESSION_METHOD,
|
|
318
|
+
COMPANION_LAUNCH_METHOD,
|
|
319
|
+
COMPANION_SESSION_WRITE_METHOD,
|
|
320
|
+
COMPANION_SESSION_CLOSE_STDIN_METHOD,
|
|
321
|
+
COMPANION_SESSION_TERMINATE_METHOD,
|
|
322
|
+
COMPANION_SESSION_ACK_OUTPUT_METHOD,
|
|
323
|
+
COMPANION_OPEN_ATTACHMENT_METHOD,
|
|
324
|
+
COMPANION_SHOW_NOTIFICATION_METHOD,
|
|
325
|
+
].map((method) => ({
|
|
326
|
+
method,
|
|
327
|
+
module: 'companion',
|
|
328
|
+
capability: method,
|
|
329
|
+
requirement: { kind: 'all', permissions: ['companion'] },
|
|
330
|
+
risk: 'high',
|
|
331
|
+
})),
|
|
288
332
|
];
|
|
289
333
|
|
|
290
|
-
const MINI_PROGRAM_MESSAGE_NAMESPACE = 'heybox:miniprogram';
|
|
291
|
-
const MINI_PROGRAM_MESSAGE_VERSION = 2;
|
|
292
|
-
const MINI_PROGRAM_BRIDGE_NONCE_PARAM = 'hb_mini_bridge_nonce';
|
|
293
|
-
const SDK_HANDSHAKE_METHOD = 'sdk.handshake';
|
|
294
|
-
const RUNTIME_LOCATION_PROBE_METHOD = 'runtime.location.probe';
|
|
295
|
-
const SDK_LOCATION_REPORT_METHOD = 'sdk.location.report';
|
|
296
|
-
const SDK_CSP_VIOLATION_METHOD = 'sdk.csp.violation';
|
|
297
|
-
const MINI_PROGRAM_OPERATION_PROGRESS_METHOD = 'operation.progress';
|
|
298
|
-
|
|
299
334
|
function isMiniProgramBridgeMessage(value) {
|
|
300
335
|
if (!isRecord$1(value))
|
|
301
336
|
return false;
|
|
@@ -317,7 +352,7 @@ function isMiniProgramBridgeMessage(value) {
|
|
|
317
352
|
if (!isNonEmptyString(value.method) || value.error !== undefined)
|
|
318
353
|
return false;
|
|
319
354
|
if (value.method === MINI_PROGRAM_OPERATION_PROGRESS_METHOD) {
|
|
320
|
-
return value.version === 2 && isNonEmptyString(value.id) &&
|
|
355
|
+
return value.version === 2 && isNonEmptyString(value.id) && isMiniProgramOperationProgressPayload(value.payload);
|
|
321
356
|
}
|
|
322
357
|
return value.id === undefined || isNonEmptyString(value.id);
|
|
323
358
|
}
|
|
@@ -355,7 +390,7 @@ function isMiniProgramDirectoryRef(value) {
|
|
|
355
390
|
if (isNonEmptyString(value.handleId)) {
|
|
356
391
|
return hasOnlyKeys(value, ['kind', 'handleId']);
|
|
357
392
|
}
|
|
358
|
-
return (isMiniProgramPathRootRef(value.root) && isMiniProgramRelativePath(value.relativePath) && hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
|
|
393
|
+
return (isMiniProgramPathRootRef(value.root) && (value.relativePath === '.' || isMiniProgramRelativePath(value.relativePath)) && hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
|
|
359
394
|
}
|
|
360
395
|
function isMiniProgramFileDescriptor(value) {
|
|
361
396
|
return (isRecord$1(value) &&
|
|
@@ -398,6 +433,24 @@ function isMiniProgramDownloadProgressPayload(value) {
|
|
|
398
433
|
return value.total === undefined;
|
|
399
434
|
return isNonNegativeSafeInteger(value.total) && value.loaded <= value.total;
|
|
400
435
|
}
|
|
436
|
+
function isMiniProgramCompanionPrepareProgress(value) {
|
|
437
|
+
if (!isRecord$1(value))
|
|
438
|
+
return false;
|
|
439
|
+
if (value.phase === 'downloading') {
|
|
440
|
+
return (isNonNegativeSafeInteger(value.loaded) &&
|
|
441
|
+
(value.total === undefined || (isNonNegativeSafeInteger(value.total) && value.loaded <= value.total)) &&
|
|
442
|
+
hasOnlyKeys(value, ['phase', 'loaded', 'total']));
|
|
443
|
+
}
|
|
444
|
+
if (value.phase !== 'verifying' && value.phase !== 'extracting')
|
|
445
|
+
return false;
|
|
446
|
+
return (isNonNegativeSafeInteger(value.processed) &&
|
|
447
|
+
isNonNegativeSafeInteger(value.total) &&
|
|
448
|
+
value.processed <= value.total &&
|
|
449
|
+
hasOnlyKeys(value, ['phase', 'processed', 'total']));
|
|
450
|
+
}
|
|
451
|
+
function isMiniProgramOperationProgressPayload(value) {
|
|
452
|
+
return isMiniProgramDownloadProgressPayload(value) || isMiniProgramCompanionPrepareProgress(value);
|
|
453
|
+
}
|
|
401
454
|
function isSDKHandshakePayload(value) {
|
|
402
455
|
return isRecord$1(value) && isNonEmptyString(value.href) && typeof value.userAgent === 'string' && isNonEmptyString(value.sdkVersion);
|
|
403
456
|
}
|
|
@@ -426,6 +479,34 @@ function isRecord$1(value) {
|
|
|
426
479
|
|
|
427
480
|
/** 当前用户信息与登录能力支持的完整 scope 目录。 */
|
|
428
481
|
const USER_INFO_AUTHORIZATION_SCOPES = ['identity', 'profile'];
|
|
482
|
+
/** Companion alias 的跨构建、Runtime 与 Host 规范。 */
|
|
483
|
+
const COMPANION_ALIAS_PATTERN = /^[a-z][a-z0-9-]{0,31}$/;
|
|
484
|
+
/** Companion Host 可跨 bridge 保留的稳定领域错误码。 */
|
|
485
|
+
const COMPANION_ERROR_CODES = [
|
|
486
|
+
'COMPANION_UNSUPPORTED',
|
|
487
|
+
'COMPANION_NOT_DECLARED',
|
|
488
|
+
'COMPANION_TARGET_UNSUPPORTED',
|
|
489
|
+
'COMPANION_NOT_PREPARED',
|
|
490
|
+
'COMPANION_PREPARATION_CANCELLED',
|
|
491
|
+
'COMPANION_DOWNLOAD_FAILED',
|
|
492
|
+
'COMPANION_DESCRIPTOR_UNAVAILABLE',
|
|
493
|
+
'COMPANION_ARCHIVE_INVALID',
|
|
494
|
+
'COMPANION_INTEGRITY_FAILED',
|
|
495
|
+
'COMPANION_ENTRYPOINT_INVALID',
|
|
496
|
+
'COMPANION_USER_CANCELLED',
|
|
497
|
+
'COMPANION_ELEVATION_DENIED',
|
|
498
|
+
'COMPANION_OS_BLOCKED',
|
|
499
|
+
'COMPANION_LAUNCH_FAILED',
|
|
500
|
+
'COMPANION_SESSION_VERSION_MISMATCH',
|
|
501
|
+
'COMPANION_SESSION_OWNERSHIP_LOST',
|
|
502
|
+
'COMPANION_SESSION_EXITED',
|
|
503
|
+
'COMPANION_PIPE_CLOSED',
|
|
504
|
+
'COMPANION_OUTPUT_LIMIT',
|
|
505
|
+
'COMPANION_PROCESS_CRASHED',
|
|
506
|
+
'COMPANION_ATTACHMENT_NOT_FOUND',
|
|
507
|
+
'COMPANION_NOTIFICATION_UNAVAILABLE',
|
|
508
|
+
'COMPANION_TERMINATE_FAILED',
|
|
509
|
+
];
|
|
429
510
|
|
|
430
511
|
const MINI_PROGRAM_PERMISSION_KEYS = [
|
|
431
512
|
'userInfo',
|
|
@@ -436,6 +517,7 @@ const MINI_PROGRAM_PERMISSION_KEYS = [
|
|
|
436
517
|
'clipboard',
|
|
437
518
|
'leaderboard',
|
|
438
519
|
'network',
|
|
520
|
+
'companion',
|
|
439
521
|
];
|
|
440
522
|
const MINI_PROGRAM_PERMISSION_CATALOG = [
|
|
441
523
|
{
|
|
@@ -548,6 +630,29 @@ const MINI_PROGRAM_PERMISSION_CATALOG = [
|
|
|
548
630
|
methods: ['network.request', 'network.download'],
|
|
549
631
|
conditions: ['声明后仍需平台批准,并继续执行网络安全策略。'],
|
|
550
632
|
},
|
|
633
|
+
{
|
|
634
|
+
key: 'companion',
|
|
635
|
+
name: '桌面辅助应用',
|
|
636
|
+
description: '下载、准备并运行随当前小程序版本发布的受管桌面程序。',
|
|
637
|
+
access: 'platform-approval',
|
|
638
|
+
risk: 'high',
|
|
639
|
+
config: {},
|
|
640
|
+
methods: [
|
|
641
|
+
'companion.getInfo',
|
|
642
|
+
'companion.getPreparationStatus',
|
|
643
|
+
'companion.prepare',
|
|
644
|
+
'companion.cancelPreparation',
|
|
645
|
+
'companion.getActiveSession',
|
|
646
|
+
'companion.launch',
|
|
647
|
+
'companion.session.write',
|
|
648
|
+
'companion.session.closeStdin',
|
|
649
|
+
'companion.session.terminate',
|
|
650
|
+
'companion.session.ackOutput',
|
|
651
|
+
'companion.openAttachment',
|
|
652
|
+
'companion.showNotification',
|
|
653
|
+
],
|
|
654
|
+
conditions: ['声明后仍需平台批准,并继续执行可信用户手势、Host 能力和当前版本 Manifest 校验。'],
|
|
655
|
+
},
|
|
551
656
|
];
|
|
552
657
|
const MINI_PROGRAM_NO_DECLARATION_METHODS = [
|
|
553
658
|
'user.revokeAuthorization',
|
|
@@ -590,8 +695,8 @@ function parseMiniProgramRuntimePermissions(snapshot) {
|
|
|
590
695
|
}
|
|
591
696
|
seenKeys.add(key);
|
|
592
697
|
if (!isManagedMiniProgramRuntimePermissionKey(key)) {
|
|
593
|
-
|
|
594
|
-
|
|
698
|
+
// 未知权限必须忽略,不能让 config:null / 缺字段把已认识的批准一起否掉。
|
|
699
|
+
// 服务端会对无 config 的 message 字段输出 null(Rylai EmitUnpopulated)。
|
|
595
700
|
continue;
|
|
596
701
|
}
|
|
597
702
|
if (key === 'network') {
|
|
@@ -621,4 +726,4 @@ function isRecord(value) {
|
|
|
621
726
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
622
727
|
}
|
|
623
728
|
|
|
624
|
-
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, DIRECTORY_CREATE_METHOD, DIRECTORY_EXISTS_METHOD, DIRECTORY_LIST_METHOD, DIRECTORY_REMOVE_METHOD, FILES_PICK_DIRECTORY_METHOD, FILES_PICK_FILES_METHOD, FILES_SAVE_FILE_METHOD, FILE_CREATE_METHOD, FILE_EXISTS_METHOD, FILE_READ_BYTES_METHOD, FILE_READ_TEXT_METHOD, FILE_REMOVE_METHOD, FILE_STAT_METHOD, FILE_WRITE_BYTES_METHOD, FILE_WRITE_TEXT_METHOD, MINI_PROGRAM_BRIDGE_NONCE_PARAM, MINI_PROGRAM_MESSAGE_NAMESPACE, MINI_PROGRAM_MESSAGE_VERSION, MINI_PROGRAM_NO_DECLARATION_METHODS, MINI_PROGRAM_OPERATION_PROGRESS_METHOD, MINI_PROGRAM_PERMISSION_CATALOG, MINI_PROGRAM_PERMISSION_KEYS, MINI_PROGRAM_PROTOCOL_CAPABILITIES, NAVIGATION_CLOSE_METHOD, NAVIGATION_OPEN_APP_PAGE_METHOD, NAVIGATION_RELOAD_METHOD, NETWORK_DOWNLOAD_METHOD, NETWORK_REQUEST_METHOD, RUNTIME_LOCATION_PROBE_METHOD, SDK_CSP_VIOLATION_METHOD, SDK_HANDSHAKE_METHOD, SDK_LOCATION_REPORT_METHOD, SHARE_COPY_LINK_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_INFO_METHOD, USER_GET_STEAM_GAME_LIST_METHOD, USER_INFO_AUTHORIZATION_SCOPES, USER_REVOKE_AUTHORIZATION_METHOD, VIEWPORT_GET_WINDOW_INFO_METHOD, VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD, isManagedMiniProgramRuntimePermissionKey, isMiniProgramBridgeMessage, isMiniProgramByteArray, isMiniProgramDirectoryDescriptor, isMiniProgramDirectoryRef, isMiniProgramDownloadProgressPayload, isMiniProgramFileDescriptor, isMiniProgramFileRef, isMiniProgramFileStat, isMiniProgramFileSystemEntityDescriptor, isMiniProgramPathRootRef, isMiniProgramPermissionKey, isMiniProgramRelativePath, parseMiniProgramRuntimePermissions };
|
|
729
|
+
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, COMPANION_ALIAS_PATTERN, COMPANION_CANCEL_PREPARATION_METHOD, COMPANION_ERROR_CODES, COMPANION_GET_ACTIVE_SESSION_METHOD, COMPANION_GET_INFO_METHOD, COMPANION_GET_PREPARATION_STATUS_METHOD, COMPANION_LAUNCH_METHOD, COMPANION_OPEN_ATTACHMENT_METHOD, COMPANION_PREPARE_METHOD, COMPANION_SESSION_ACK_OUTPUT_METHOD, COMPANION_SESSION_CLOSE_STDIN_METHOD, COMPANION_SESSION_EXIT_EVENT, COMPANION_SESSION_OUTPUT_EVENT, COMPANION_SESSION_OWNERSHIP_LOST_EVENT, COMPANION_SESSION_TERMINATE_METHOD, COMPANION_SESSION_WRITE_METHOD, COMPANION_SHOW_NOTIFICATION_METHOD, DEVICE_SET_CLIPBOARD_METHOD, DEVICE_VIBRATE_METHOD, DIRECTORY_CREATE_METHOD, DIRECTORY_EXISTS_METHOD, DIRECTORY_LIST_METHOD, DIRECTORY_REMOVE_METHOD, FILES_PICK_DIRECTORY_METHOD, FILES_PICK_FILES_METHOD, FILES_SAVE_FILE_METHOD, FILE_CREATE_METHOD, FILE_EXISTS_METHOD, FILE_READ_BYTES_METHOD, FILE_READ_TEXT_METHOD, FILE_REMOVE_METHOD, FILE_STAT_METHOD, FILE_WRITE_BYTES_METHOD, FILE_WRITE_TEXT_METHOD, MINI_PROGRAM_BRIDGE_NONCE_PARAM, MINI_PROGRAM_MESSAGE_NAMESPACE, MINI_PROGRAM_MESSAGE_VERSION, MINI_PROGRAM_NO_DECLARATION_METHODS, MINI_PROGRAM_OPERATION_PROGRESS_METHOD, MINI_PROGRAM_PERMISSION_CATALOG, MINI_PROGRAM_PERMISSION_KEYS, MINI_PROGRAM_PROTOCOL_CAPABILITIES, NAVIGATION_CLOSE_METHOD, NAVIGATION_OPEN_APP_PAGE_METHOD, NAVIGATION_RELOAD_METHOD, NETWORK_DOWNLOAD_METHOD, NETWORK_REQUEST_METHOD, RUNTIME_LOCATION_PROBE_METHOD, SDK_CSP_VIOLATION_METHOD, SDK_HANDSHAKE_METHOD, SDK_LOCATION_REPORT_METHOD, SHARE_COPY_LINK_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_INFO_METHOD, USER_GET_STEAM_GAME_LIST_METHOD, USER_INFO_AUTHORIZATION_SCOPES, USER_REVOKE_AUTHORIZATION_METHOD, VIEWPORT_GET_WINDOW_INFO_METHOD, VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD, isManagedMiniProgramRuntimePermissionKey, isMiniProgramBridgeMessage, isMiniProgramByteArray, isMiniProgramCompanionPrepareProgress, isMiniProgramDirectoryDescriptor, isMiniProgramDirectoryRef, isMiniProgramDownloadProgressPayload, isMiniProgramFileDescriptor, isMiniProgramFileRef, isMiniProgramFileStat, isMiniProgramFileSystemEntityDescriptor, isMiniProgramOperationProgressPayload, isMiniProgramPathRootRef, isMiniProgramPermissionKey, isMiniProgramRelativePath, parseMiniProgramRuntimePermissions };
|
package/package.json
CHANGED
package/src/bridge.ts
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
COMPANION_SESSION_EXIT_EVENT,
|
|
3
|
+
COMPANION_SESSION_OUTPUT_EVENT,
|
|
4
|
+
COMPANION_SESSION_OWNERSHIP_LOST_EVENT,
|
|
5
|
+
MINI_PROGRAM_MESSAGE_NAMESPACE,
|
|
6
|
+
MINI_PROGRAM_OPERATION_PROGRESS_METHOD,
|
|
7
|
+
} from './constants';
|
|
8
|
+
import type {
|
|
9
|
+
CompanionSessionExitPayload,
|
|
10
|
+
CompanionSessionOutputPayload,
|
|
11
|
+
CompanionSessionOwnershipLostPayload,
|
|
12
|
+
DownloadProgressPayload,
|
|
13
|
+
MiniProgramRuntimeEnvironmentInfo,
|
|
14
|
+
UserInfoAuthorization,
|
|
15
|
+
} from './payloads';
|
|
16
|
+
import type { MiniProgramCapabilityProgress, MiniProgramProgressMethod } from './capabilities';
|
|
3
17
|
|
|
4
18
|
export type MiniProgramBridgeMessageType = 'handshake' | 'request' | 'response' | 'event' | 'cancel';
|
|
5
19
|
export type MiniProgramEventName =
|
|
@@ -10,7 +24,10 @@ export type MiniProgramEventName =
|
|
|
10
24
|
| 'unload'
|
|
11
25
|
| 'error'
|
|
12
26
|
| 'heybox_app_login_change'
|
|
13
|
-
| 'user_info_authorization_change'
|
|
27
|
+
| 'user_info_authorization_change'
|
|
28
|
+
| typeof COMPANION_SESSION_OUTPUT_EVENT
|
|
29
|
+
| typeof COMPANION_SESSION_EXIT_EVENT
|
|
30
|
+
| typeof COMPANION_SESSION_OWNERSHIP_LOST_EVENT;
|
|
14
31
|
|
|
15
32
|
export interface MiniProgramBridgeError {
|
|
16
33
|
code: string;
|
|
@@ -71,12 +88,14 @@ export interface MiniProgramBridgeCancelMessage extends MiniProgramBridgeMessage
|
|
|
71
88
|
error?: never;
|
|
72
89
|
}
|
|
73
90
|
|
|
74
|
-
export interface MiniProgramBridgeProgressMessage
|
|
91
|
+
export interface MiniProgramBridgeProgressMessage<
|
|
92
|
+
TMethod extends MiniProgramProgressMethod = MiniProgramProgressMethod,
|
|
93
|
+
> extends MiniProgramBridgeMessage<MiniProgramCapabilityProgress<TMethod>> {
|
|
75
94
|
version: 2;
|
|
76
95
|
type: 'event';
|
|
77
96
|
id: string;
|
|
78
97
|
method: typeof MINI_PROGRAM_OPERATION_PROGRESS_METHOD;
|
|
79
|
-
payload:
|
|
98
|
+
payload: MiniProgramCapabilityProgress<TMethod>;
|
|
80
99
|
error?: never;
|
|
81
100
|
}
|
|
82
101
|
export interface MiniProgramEventPayloadMap {
|
|
@@ -88,4 +107,7 @@ export interface MiniProgramEventPayloadMap {
|
|
|
88
107
|
error: MiniProgramBridgeError;
|
|
89
108
|
heybox_app_login_change: { isHeyboxAppLoggedIn: boolean };
|
|
90
109
|
user_info_authorization_change: UserInfoAuthorization;
|
|
110
|
+
[COMPANION_SESSION_OUTPUT_EVENT]: CompanionSessionOutputPayload;
|
|
111
|
+
[COMPANION_SESSION_EXIT_EVENT]: CompanionSessionExitPayload;
|
|
112
|
+
[COMPANION_SESSION_OWNERSHIP_LOST_EVENT]: CompanionSessionOwnershipLostPayload;
|
|
91
113
|
}
|
package/src/capabilities.ts
CHANGED
|
@@ -1,4 +1,29 @@
|
|
|
1
1
|
import type {
|
|
2
|
+
CompanionCancelPreparationPayload,
|
|
3
|
+
CompanionCancelPreparationResult,
|
|
4
|
+
CompanionGetActiveSessionPayload,
|
|
5
|
+
CompanionGetActiveSessionResult,
|
|
6
|
+
CompanionGetInfoPayload,
|
|
7
|
+
CompanionGetInfoResult,
|
|
8
|
+
CompanionGetPreparationStatusPayload,
|
|
9
|
+
CompanionGetPreparationStatusResult,
|
|
10
|
+
CompanionLaunchPayload,
|
|
11
|
+
CompanionLaunchResult,
|
|
12
|
+
CompanionOpenAttachmentPayload,
|
|
13
|
+
CompanionOpenAttachmentResult,
|
|
14
|
+
CompanionPreparePayload,
|
|
15
|
+
CompanionPrepareProgress,
|
|
16
|
+
CompanionPrepareResult,
|
|
17
|
+
CompanionSessionAckOutputPayload,
|
|
18
|
+
CompanionSessionAckOutputResult,
|
|
19
|
+
CompanionSessionCloseStdinPayload,
|
|
20
|
+
CompanionSessionCloseStdinResult,
|
|
21
|
+
CompanionSessionTerminatePayload,
|
|
22
|
+
CompanionSessionTerminateResult,
|
|
23
|
+
CompanionSessionWritePayload,
|
|
24
|
+
CompanionSessionWriteResult,
|
|
25
|
+
CompanionShowNotificationPayload,
|
|
26
|
+
CompanionShowNotificationResult,
|
|
2
27
|
ClosePayload,
|
|
3
28
|
CloseResult,
|
|
4
29
|
CopyLinkPayload,
|
|
@@ -11,6 +36,7 @@ import type {
|
|
|
11
36
|
DirectoryListResult,
|
|
12
37
|
DirectoryRemovePayload,
|
|
13
38
|
DirectoryRemoveResult,
|
|
39
|
+
DownloadProgressPayload,
|
|
14
40
|
DeleteCurrentUserLeaderboardEntryPayload,
|
|
15
41
|
DeleteCurrentUserLeaderboardEntryResult,
|
|
16
42
|
GetCurrentUserLeaderboardEntryPayload,
|
|
@@ -122,6 +148,18 @@ export const CLOUD_LEADERBOARD_GET_LIST_METHOD = 'cloud.leaderboard.getList' as
|
|
|
122
148
|
export const CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.getCurrentUserEntry' as const;
|
|
123
149
|
export const CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.deleteCurrentUserEntry' as const;
|
|
124
150
|
export const CLOUD_LEADERBOARD_GET_INFO_METHOD = 'cloud.leaderboard.getInfo' as const;
|
|
151
|
+
export const COMPANION_GET_INFO_METHOD = 'companion.getInfo' as const;
|
|
152
|
+
export const COMPANION_GET_PREPARATION_STATUS_METHOD = 'companion.getPreparationStatus' as const;
|
|
153
|
+
export const COMPANION_PREPARE_METHOD = 'companion.prepare' as const;
|
|
154
|
+
export const COMPANION_CANCEL_PREPARATION_METHOD = 'companion.cancelPreparation' as const;
|
|
155
|
+
export const COMPANION_GET_ACTIVE_SESSION_METHOD = 'companion.getActiveSession' as const;
|
|
156
|
+
export const COMPANION_LAUNCH_METHOD = 'companion.launch' as const;
|
|
157
|
+
export const COMPANION_SESSION_WRITE_METHOD = 'companion.session.write' as const;
|
|
158
|
+
export const COMPANION_SESSION_CLOSE_STDIN_METHOD = 'companion.session.closeStdin' as const;
|
|
159
|
+
export const COMPANION_SESSION_TERMINATE_METHOD = 'companion.session.terminate' as const;
|
|
160
|
+
export const COMPANION_SESSION_ACK_OUTPUT_METHOD = 'companion.session.ackOutput' as const;
|
|
161
|
+
export const COMPANION_OPEN_ATTACHMENT_METHOD = 'companion.openAttachment' as const;
|
|
162
|
+
export const COMPANION_SHOW_NOTIFICATION_METHOD = 'companion.showNotification' as const;
|
|
125
163
|
|
|
126
164
|
export type MiniProgramAuthMethod = typeof AUTH_LOGIN_METHOD;
|
|
127
165
|
export type MiniProgramUserMethod = typeof USER_GET_INFO_METHOD | typeof USER_REVOKE_AUTHORIZATION_METHOD | typeof USER_GET_STEAM_GAME_LIST_METHOD;
|
|
@@ -153,6 +191,19 @@ export type MiniProgramCloudMethod =
|
|
|
153
191
|
| typeof CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD
|
|
154
192
|
| typeof CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD
|
|
155
193
|
| typeof CLOUD_LEADERBOARD_GET_INFO_METHOD;
|
|
194
|
+
export type MiniProgramCompanionMethod =
|
|
195
|
+
| typeof COMPANION_GET_INFO_METHOD
|
|
196
|
+
| typeof COMPANION_GET_PREPARATION_STATUS_METHOD
|
|
197
|
+
| typeof COMPANION_PREPARE_METHOD
|
|
198
|
+
| typeof COMPANION_CANCEL_PREPARATION_METHOD
|
|
199
|
+
| typeof COMPANION_GET_ACTIVE_SESSION_METHOD
|
|
200
|
+
| typeof COMPANION_LAUNCH_METHOD
|
|
201
|
+
| typeof COMPANION_SESSION_WRITE_METHOD
|
|
202
|
+
| typeof COMPANION_SESSION_CLOSE_STDIN_METHOD
|
|
203
|
+
| typeof COMPANION_SESSION_TERMINATE_METHOD
|
|
204
|
+
| typeof COMPANION_SESSION_ACK_OUTPUT_METHOD
|
|
205
|
+
| typeof COMPANION_OPEN_ATTACHMENT_METHOD
|
|
206
|
+
| typeof COMPANION_SHOW_NOTIFICATION_METHOD;
|
|
156
207
|
export type MiniProgramBridgeMethod =
|
|
157
208
|
| MiniProgramAuthMethod
|
|
158
209
|
| MiniProgramUserMethod
|
|
@@ -166,7 +217,8 @@ export type MiniProgramBridgeMethod =
|
|
|
166
217
|
| MiniProgramUiMethod
|
|
167
218
|
| MiniProgramDeviceMethod
|
|
168
219
|
| MiniProgramNavigationMethod
|
|
169
|
-
| MiniProgramCloudMethod
|
|
220
|
+
| MiniProgramCloudMethod
|
|
221
|
+
| MiniProgramCompanionMethod;
|
|
170
222
|
export type MiniProgramCapabilityModule =
|
|
171
223
|
| 'auth'
|
|
172
224
|
| 'user'
|
|
@@ -180,7 +232,8 @@ export type MiniProgramCapabilityModule =
|
|
|
180
232
|
| 'ui'
|
|
181
233
|
| 'device'
|
|
182
234
|
| 'navigation'
|
|
183
|
-
| 'cloud'
|
|
235
|
+
| 'cloud'
|
|
236
|
+
| 'companion';
|
|
184
237
|
export type MiniProgramCapabilityRisk = 'low' | 'medium' | 'high';
|
|
185
238
|
|
|
186
239
|
export interface MiniProgramCapabilityDefinition {
|
|
@@ -437,6 +490,26 @@ export const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
|
|
|
437
490
|
requirement: { kind: 'all', permissions: ['leaderboard'] },
|
|
438
491
|
risk: 'low',
|
|
439
492
|
},
|
|
493
|
+
...[
|
|
494
|
+
COMPANION_GET_INFO_METHOD,
|
|
495
|
+
COMPANION_GET_PREPARATION_STATUS_METHOD,
|
|
496
|
+
COMPANION_PREPARE_METHOD,
|
|
497
|
+
COMPANION_CANCEL_PREPARATION_METHOD,
|
|
498
|
+
COMPANION_GET_ACTIVE_SESSION_METHOD,
|
|
499
|
+
COMPANION_LAUNCH_METHOD,
|
|
500
|
+
COMPANION_SESSION_WRITE_METHOD,
|
|
501
|
+
COMPANION_SESSION_CLOSE_STDIN_METHOD,
|
|
502
|
+
COMPANION_SESSION_TERMINATE_METHOD,
|
|
503
|
+
COMPANION_SESSION_ACK_OUTPUT_METHOD,
|
|
504
|
+
COMPANION_OPEN_ATTACHMENT_METHOD,
|
|
505
|
+
COMPANION_SHOW_NOTIFICATION_METHOD,
|
|
506
|
+
].map((method) => ({
|
|
507
|
+
method,
|
|
508
|
+
module: 'companion' as const,
|
|
509
|
+
capability: method,
|
|
510
|
+
requirement: { kind: 'all' as const, permissions: ['companion' as const] },
|
|
511
|
+
risk: 'high' as const,
|
|
512
|
+
})),
|
|
440
513
|
] as const satisfies readonly MiniProgramCapabilityDefinition[];
|
|
441
514
|
|
|
442
515
|
export interface MiniProgramCapabilityPayloadMap {
|
|
@@ -481,6 +554,18 @@ export interface MiniProgramCapabilityPayloadMap {
|
|
|
481
554
|
[CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD]: GetCurrentUserLeaderboardEntryPayload | undefined;
|
|
482
555
|
[CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD]: DeleteCurrentUserLeaderboardEntryPayload | undefined;
|
|
483
556
|
[CLOUD_LEADERBOARD_GET_INFO_METHOD]: GetLeaderboardInfoPayload | undefined;
|
|
557
|
+
[COMPANION_GET_INFO_METHOD]: CompanionGetInfoPayload;
|
|
558
|
+
[COMPANION_GET_PREPARATION_STATUS_METHOD]: CompanionGetPreparationStatusPayload;
|
|
559
|
+
[COMPANION_PREPARE_METHOD]: CompanionPreparePayload;
|
|
560
|
+
[COMPANION_CANCEL_PREPARATION_METHOD]: CompanionCancelPreparationPayload;
|
|
561
|
+
[COMPANION_GET_ACTIVE_SESSION_METHOD]: CompanionGetActiveSessionPayload;
|
|
562
|
+
[COMPANION_LAUNCH_METHOD]: CompanionLaunchPayload;
|
|
563
|
+
[COMPANION_SESSION_WRITE_METHOD]: CompanionSessionWritePayload;
|
|
564
|
+
[COMPANION_SESSION_CLOSE_STDIN_METHOD]: CompanionSessionCloseStdinPayload;
|
|
565
|
+
[COMPANION_SESSION_TERMINATE_METHOD]: CompanionSessionTerminatePayload;
|
|
566
|
+
[COMPANION_SESSION_ACK_OUTPUT_METHOD]: CompanionSessionAckOutputPayload;
|
|
567
|
+
[COMPANION_OPEN_ATTACHMENT_METHOD]: CompanionOpenAttachmentPayload;
|
|
568
|
+
[COMPANION_SHOW_NOTIFICATION_METHOD]: CompanionShowNotificationPayload;
|
|
484
569
|
}
|
|
485
570
|
|
|
486
571
|
export interface MiniProgramCapabilityResultMap {
|
|
@@ -525,7 +610,27 @@ export interface MiniProgramCapabilityResultMap {
|
|
|
525
610
|
[CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD]: GetCurrentUserLeaderboardEntryResult;
|
|
526
611
|
[CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD]: DeleteCurrentUserLeaderboardEntryResult;
|
|
527
612
|
[CLOUD_LEADERBOARD_GET_INFO_METHOD]: GetLeaderboardInfoResult;
|
|
613
|
+
[COMPANION_GET_INFO_METHOD]: CompanionGetInfoResult;
|
|
614
|
+
[COMPANION_GET_PREPARATION_STATUS_METHOD]: CompanionGetPreparationStatusResult;
|
|
615
|
+
[COMPANION_PREPARE_METHOD]: CompanionPrepareResult;
|
|
616
|
+
[COMPANION_CANCEL_PREPARATION_METHOD]: CompanionCancelPreparationResult;
|
|
617
|
+
[COMPANION_GET_ACTIVE_SESSION_METHOD]: CompanionGetActiveSessionResult;
|
|
618
|
+
[COMPANION_LAUNCH_METHOD]: CompanionLaunchResult;
|
|
619
|
+
[COMPANION_SESSION_WRITE_METHOD]: CompanionSessionWriteResult;
|
|
620
|
+
[COMPANION_SESSION_CLOSE_STDIN_METHOD]: CompanionSessionCloseStdinResult;
|
|
621
|
+
[COMPANION_SESSION_TERMINATE_METHOD]: CompanionSessionTerminateResult;
|
|
622
|
+
[COMPANION_SESSION_ACK_OUTPUT_METHOD]: CompanionSessionAckOutputResult;
|
|
623
|
+
[COMPANION_OPEN_ATTACHMENT_METHOD]: CompanionOpenAttachmentResult;
|
|
624
|
+
[COMPANION_SHOW_NOTIFICATION_METHOD]: CompanionShowNotificationResult;
|
|
528
625
|
}
|
|
529
626
|
|
|
627
|
+
export interface MiniProgramCapabilityProgressMap {
|
|
628
|
+
[NETWORK_DOWNLOAD_METHOD]: DownloadProgressPayload;
|
|
629
|
+
[COMPANION_PREPARE_METHOD]: CompanionPrepareProgress;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
export type MiniProgramProgressMethod = keyof MiniProgramCapabilityProgressMap;
|
|
633
|
+
export type MiniProgramCapabilityProgress<T extends MiniProgramProgressMethod> = MiniProgramCapabilityProgressMap[T];
|
|
634
|
+
|
|
530
635
|
export type MiniProgramCapabilityPayload<T extends MiniProgramBridgeMethod> = MiniProgramCapabilityPayloadMap[T];
|
|
531
636
|
export type MiniProgramCapabilityResult<T extends MiniProgramBridgeMethod> = MiniProgramCapabilityResultMap[T];
|
package/src/constants.ts
CHANGED
|
@@ -6,3 +6,6 @@ export const RUNTIME_LOCATION_PROBE_METHOD = 'runtime.location.probe' as const;
|
|
|
6
6
|
export const SDK_LOCATION_REPORT_METHOD = 'sdk.location.report' as const;
|
|
7
7
|
export const SDK_CSP_VIOLATION_METHOD = 'sdk.csp.violation' as const;
|
|
8
8
|
export const MINI_PROGRAM_OPERATION_PROGRESS_METHOD = 'operation.progress' as const;
|
|
9
|
+
export const COMPANION_SESSION_OUTPUT_EVENT = 'companion.session.output' as const;
|
|
10
|
+
export const COMPANION_SESSION_EXIT_EVENT = 'companion.session.exit' as const;
|
|
11
|
+
export const COMPANION_SESSION_OWNERSHIP_LOST_EVENT = 'companion.session.ownershipLost' as const;
|
package/src/guards.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { MINI_PROGRAM_MESSAGE_NAMESPACE, MINI_PROGRAM_OPERATION_PROGRESS_METHOD, SDK_HANDSHAKE_METHOD } from './constants';
|
|
2
2
|
import type { MiniProgramBridgeMessage } from './bridge';
|
|
3
3
|
import type {
|
|
4
|
+
CompanionPrepareProgress,
|
|
4
5
|
DownloadProgressPayload,
|
|
5
6
|
MiniProgramDirectoryDescriptor,
|
|
6
7
|
MiniProgramDirectoryRef,
|
|
@@ -33,7 +34,7 @@ export function isMiniProgramBridgeMessage(value: unknown): value is MiniProgram
|
|
|
33
34
|
if (value.type === 'event') {
|
|
34
35
|
if (!isNonEmptyString(value.method) || value.error !== undefined) return false;
|
|
35
36
|
if (value.method === MINI_PROGRAM_OPERATION_PROGRESS_METHOD) {
|
|
36
|
-
return value.version === 2 && isNonEmptyString(value.id) &&
|
|
37
|
+
return value.version === 2 && isNonEmptyString(value.id) && isMiniProgramOperationProgressPayload(value.payload);
|
|
37
38
|
}
|
|
38
39
|
return value.id === undefined || isNonEmptyString(value.id);
|
|
39
40
|
}
|
|
@@ -75,7 +76,7 @@ export function isMiniProgramDirectoryRef(value: unknown): value is MiniProgramD
|
|
|
75
76
|
return hasOnlyKeys(value, ['kind', 'handleId']);
|
|
76
77
|
}
|
|
77
78
|
return (
|
|
78
|
-
isMiniProgramPathRootRef(value.root) && isMiniProgramRelativePath(value.relativePath) && hasOnlyKeys(value, ['kind', 'root', 'relativePath'])
|
|
79
|
+
isMiniProgramPathRootRef(value.root) && (value.relativePath === '.' || isMiniProgramRelativePath(value.relativePath)) && hasOnlyKeys(value, ['kind', 'root', 'relativePath'])
|
|
79
80
|
);
|
|
80
81
|
}
|
|
81
82
|
|
|
@@ -133,6 +134,28 @@ export function isMiniProgramDownloadProgressPayload(value: unknown): value is D
|
|
|
133
134
|
return isNonNegativeSafeInteger(value.total) && value.loaded <= value.total;
|
|
134
135
|
}
|
|
135
136
|
|
|
137
|
+
export function isMiniProgramCompanionPrepareProgress(value: unknown): value is CompanionPrepareProgress {
|
|
138
|
+
if (!isRecord(value)) return false;
|
|
139
|
+
if (value.phase === 'downloading') {
|
|
140
|
+
return (
|
|
141
|
+
isNonNegativeSafeInteger(value.loaded) &&
|
|
142
|
+
(value.total === undefined || (isNonNegativeSafeInteger(value.total) && value.loaded <= value.total)) &&
|
|
143
|
+
hasOnlyKeys(value, ['phase', 'loaded', 'total'])
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
if (value.phase !== 'verifying' && value.phase !== 'extracting') return false;
|
|
147
|
+
return (
|
|
148
|
+
isNonNegativeSafeInteger(value.processed) &&
|
|
149
|
+
isNonNegativeSafeInteger(value.total) &&
|
|
150
|
+
value.processed <= value.total &&
|
|
151
|
+
hasOnlyKeys(value, ['phase', 'processed', 'total'])
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export function isMiniProgramOperationProgressPayload(value: unknown): value is DownloadProgressPayload | CompanionPrepareProgress {
|
|
156
|
+
return isMiniProgramDownloadProgressPayload(value) || isMiniProgramCompanionPrepareProgress(value);
|
|
157
|
+
}
|
|
158
|
+
|
|
136
159
|
function isSDKHandshakePayload(value: unknown) {
|
|
137
160
|
return isRecord(value) && isNonEmptyString(value.href) && typeof value.userAgent === 'string' && isNonEmptyString(value.sdkVersion);
|
|
138
161
|
}
|
package/src/payloads.ts
CHANGED
|
@@ -484,3 +484,137 @@ export interface GetLeaderboardInfoResult {
|
|
|
484
484
|
order: LeaderboardOrder;
|
|
485
485
|
rankLimit: number;
|
|
486
486
|
}
|
|
487
|
+
|
|
488
|
+
/** 受管桌面程序可选能力。 */
|
|
489
|
+
export type CompanionCapability = 'stdio' | 'attachments' | 'notifications';
|
|
490
|
+
export type CompanionTarget = 'windows-x64' | 'macos-arm64';
|
|
491
|
+
export type CompanionSignatureStatus = 'unsigned' | 'valid' | 'invalid' | 'unknown';
|
|
492
|
+
|
|
493
|
+
/** Companion alias 的跨构建、Runtime 与 Host 规范。 */
|
|
494
|
+
export const COMPANION_ALIAS_PATTERN = /^[a-z][a-z0-9-]{0,31}$/;
|
|
495
|
+
|
|
496
|
+
/** Companion Host 可跨 bridge 保留的稳定领域错误码。 */
|
|
497
|
+
export const COMPANION_ERROR_CODES = [
|
|
498
|
+
'COMPANION_UNSUPPORTED',
|
|
499
|
+
'COMPANION_NOT_DECLARED',
|
|
500
|
+
'COMPANION_TARGET_UNSUPPORTED',
|
|
501
|
+
'COMPANION_NOT_PREPARED',
|
|
502
|
+
'COMPANION_PREPARATION_CANCELLED',
|
|
503
|
+
'COMPANION_DOWNLOAD_FAILED',
|
|
504
|
+
'COMPANION_DESCRIPTOR_UNAVAILABLE',
|
|
505
|
+
'COMPANION_ARCHIVE_INVALID',
|
|
506
|
+
'COMPANION_INTEGRITY_FAILED',
|
|
507
|
+
'COMPANION_ENTRYPOINT_INVALID',
|
|
508
|
+
'COMPANION_USER_CANCELLED',
|
|
509
|
+
'COMPANION_ELEVATION_DENIED',
|
|
510
|
+
'COMPANION_OS_BLOCKED',
|
|
511
|
+
'COMPANION_LAUNCH_FAILED',
|
|
512
|
+
'COMPANION_SESSION_VERSION_MISMATCH',
|
|
513
|
+
'COMPANION_SESSION_OWNERSHIP_LOST',
|
|
514
|
+
'COMPANION_SESSION_EXITED',
|
|
515
|
+
'COMPANION_PIPE_CLOSED',
|
|
516
|
+
'COMPANION_OUTPUT_LIMIT',
|
|
517
|
+
'COMPANION_PROCESS_CRASHED',
|
|
518
|
+
'COMPANION_ATTACHMENT_NOT_FOUND',
|
|
519
|
+
'COMPANION_NOTIFICATION_UNAVAILABLE',
|
|
520
|
+
'COMPANION_TERMINATE_FAILED',
|
|
521
|
+
] as const;
|
|
522
|
+
export type CompanionErrorCode = (typeof COMPANION_ERROR_CODES)[number];
|
|
523
|
+
|
|
524
|
+
export interface CompanionInfo {
|
|
525
|
+
alias: string;
|
|
526
|
+
displayName: string;
|
|
527
|
+
target: CompanionTarget;
|
|
528
|
+
capabilities: readonly CompanionCapability[];
|
|
529
|
+
archiveBytes: number;
|
|
530
|
+
signatureStatus: CompanionSignatureStatus;
|
|
531
|
+
/** Host 确认的产物来源;旧 Host 缺省时来源未知。 */
|
|
532
|
+
source?: 'local-dev' | 'released';
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
export interface CompanionErrorSummary {
|
|
536
|
+
code: CompanionErrorCode;
|
|
537
|
+
message: string;
|
|
538
|
+
retryable: boolean;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
export type CompanionPrepareProgress =
|
|
542
|
+
| { phase: 'downloading'; loaded: number; total?: number }
|
|
543
|
+
| { phase: 'verifying'; processed: number; total: number }
|
|
544
|
+
| { phase: 'extracting'; processed: number; total: number };
|
|
545
|
+
|
|
546
|
+
export type CompanionPreparationStatus =
|
|
547
|
+
| { state: 'not-prepared' }
|
|
548
|
+
| { state: 'preparing'; progress: CompanionPrepareProgress }
|
|
549
|
+
| { state: 'ready'; preparedAt: number }
|
|
550
|
+
| { state: 'failed'; error: CompanionErrorSummary };
|
|
551
|
+
|
|
552
|
+
export type CompanionExitReason = 'exited' | 'terminated' | 'crashed' | 'host-shutdown' | 'permission-revoked' | 'output-limit';
|
|
553
|
+
export type CompanionExit = { reason: 'exited'; exitCode: number } | { reason: Exclude<CompanionExitReason, 'exited'>; exitCode?: number };
|
|
554
|
+
|
|
555
|
+
/** 活动 Session 的 wire 快照;不包含路径、PID 或原生句柄。 */
|
|
556
|
+
export interface CompanionSessionSnapshot {
|
|
557
|
+
id: string;
|
|
558
|
+
alias: string;
|
|
559
|
+
target: CompanionTarget;
|
|
560
|
+
capabilities: readonly CompanionCapability[];
|
|
561
|
+
state: 'running';
|
|
562
|
+
controllerGeneration: number;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
export interface CompanionAliasPayload {
|
|
566
|
+
alias: string;
|
|
567
|
+
}
|
|
568
|
+
export type CompanionGetInfoPayload = CompanionAliasPayload;
|
|
569
|
+
export type CompanionGetInfoResult = CompanionInfo;
|
|
570
|
+
export type CompanionGetPreparationStatusPayload = CompanionAliasPayload;
|
|
571
|
+
export type CompanionGetPreparationStatusResult = CompanionPreparationStatus;
|
|
572
|
+
export type CompanionPreparePayload = CompanionAliasPayload;
|
|
573
|
+
export type CompanionPrepareResult = CompanionInfo;
|
|
574
|
+
export type CompanionCancelPreparationPayload = CompanionAliasPayload;
|
|
575
|
+
export type CompanionCancelPreparationResult = void;
|
|
576
|
+
export type CompanionGetActiveSessionPayload = CompanionAliasPayload;
|
|
577
|
+
export type CompanionGetActiveSessionResult = CompanionSessionSnapshot | undefined;
|
|
578
|
+
export type CompanionLaunchPayload = CompanionAliasPayload;
|
|
579
|
+
export type CompanionLaunchResult = CompanionSessionSnapshot;
|
|
580
|
+
|
|
581
|
+
export interface CompanionSessionControllerPayload {
|
|
582
|
+
sessionId: string;
|
|
583
|
+
controllerGeneration: number;
|
|
584
|
+
}
|
|
585
|
+
export interface CompanionSessionWritePayload extends CompanionSessionControllerPayload {
|
|
586
|
+
data: Uint8Array;
|
|
587
|
+
}
|
|
588
|
+
export type CompanionSessionWriteResult = void;
|
|
589
|
+
export type CompanionSessionCloseStdinPayload = CompanionSessionControllerPayload;
|
|
590
|
+
export type CompanionSessionCloseStdinResult = void;
|
|
591
|
+
export type CompanionSessionTerminatePayload = CompanionSessionControllerPayload;
|
|
592
|
+
export type CompanionSessionTerminateResult = void;
|
|
593
|
+
export interface CompanionSessionAckOutputPayload extends CompanionSessionControllerPayload {
|
|
594
|
+
stream: 'stdout' | 'stderr';
|
|
595
|
+
sequence: number;
|
|
596
|
+
}
|
|
597
|
+
export type CompanionSessionAckOutputResult = void;
|
|
598
|
+
export interface CompanionOpenAttachmentPayload extends CompanionSessionControllerPayload {
|
|
599
|
+
id: string;
|
|
600
|
+
}
|
|
601
|
+
export type CompanionOpenAttachmentResult = MiniProgramFileDescriptor;
|
|
602
|
+
export type CompanionNotificationCategory = 'completed' | 'failed' | 'stopped' | 'attention';
|
|
603
|
+
export interface CompanionShowNotificationPayload extends CompanionSessionControllerPayload {
|
|
604
|
+
category: CompanionNotificationCategory;
|
|
605
|
+
}
|
|
606
|
+
export type CompanionShowNotificationResult = void;
|
|
607
|
+
|
|
608
|
+
export interface CompanionSessionOutputPayload extends CompanionSessionControllerPayload {
|
|
609
|
+
stream: 'stdout' | 'stderr';
|
|
610
|
+
sequence: number;
|
|
611
|
+
data: Uint8Array;
|
|
612
|
+
}
|
|
613
|
+
export interface CompanionSessionExitPayload {
|
|
614
|
+
sessionId: string;
|
|
615
|
+
exit: CompanionExit;
|
|
616
|
+
}
|
|
617
|
+
export interface CompanionSessionOwnershipLostPayload {
|
|
618
|
+
sessionId: string;
|
|
619
|
+
controllerGeneration: number;
|
|
620
|
+
}
|
|
@@ -9,6 +9,7 @@ export const MINI_PROGRAM_PERMISSION_KEYS = [
|
|
|
9
9
|
'clipboard',
|
|
10
10
|
'leaderboard',
|
|
11
11
|
'network',
|
|
12
|
+
'companion',
|
|
12
13
|
] as const;
|
|
13
14
|
|
|
14
15
|
export type MiniProgramPermissionKey = (typeof MINI_PROGRAM_PERMISSION_KEYS)[number];
|
|
@@ -146,6 +147,29 @@ export const MINI_PROGRAM_PERMISSION_CATALOG = [
|
|
|
146
147
|
methods: ['network.request', 'network.download'],
|
|
147
148
|
conditions: ['声明后仍需平台批准,并继续执行网络安全策略。'],
|
|
148
149
|
},
|
|
150
|
+
{
|
|
151
|
+
key: 'companion',
|
|
152
|
+
name: '桌面辅助应用',
|
|
153
|
+
description: '下载、准备并运行随当前小程序版本发布的受管桌面程序。',
|
|
154
|
+
access: 'platform-approval',
|
|
155
|
+
risk: 'high',
|
|
156
|
+
config: {},
|
|
157
|
+
methods: [
|
|
158
|
+
'companion.getInfo',
|
|
159
|
+
'companion.getPreparationStatus',
|
|
160
|
+
'companion.prepare',
|
|
161
|
+
'companion.cancelPreparation',
|
|
162
|
+
'companion.getActiveSession',
|
|
163
|
+
'companion.launch',
|
|
164
|
+
'companion.session.write',
|
|
165
|
+
'companion.session.closeStdin',
|
|
166
|
+
'companion.session.terminate',
|
|
167
|
+
'companion.session.ackOutput',
|
|
168
|
+
'companion.openAttachment',
|
|
169
|
+
'companion.showNotification',
|
|
170
|
+
],
|
|
171
|
+
conditions: ['声明后仍需平台批准,并继续执行可信用户手势、Host 能力和当前版本 Manifest 校验。'],
|
|
172
|
+
},
|
|
149
173
|
] as const satisfies readonly MiniProgramPermissionDefinition[];
|
|
150
174
|
|
|
151
175
|
export const MINI_PROGRAM_NO_DECLARATION_METHODS = [
|
package/src/permissions.ts
CHANGED
|
@@ -42,7 +42,8 @@ export function parseMiniProgramRuntimePermissions(snapshot: unknown): ParsedMin
|
|
|
42
42
|
}
|
|
43
43
|
seenKeys.add(key);
|
|
44
44
|
if (!isManagedMiniProgramRuntimePermissionKey(key)) {
|
|
45
|
-
|
|
45
|
+
// 未知权限必须忽略,不能让 config:null / 缺字段把已认识的批准一起否掉。
|
|
46
|
+
// 服务端会对无 config 的 message 字段输出 null(Rylai EmitUnpopulated)。
|
|
46
47
|
continue;
|
|
47
48
|
}
|
|
48
49
|
if (key === 'network') {
|
package/types/bridge.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { MINI_PROGRAM_MESSAGE_NAMESPACE, MINI_PROGRAM_OPERATION_PROGRESS_METHOD } from './constants';
|
|
2
|
-
import type {
|
|
1
|
+
import { COMPANION_SESSION_EXIT_EVENT, COMPANION_SESSION_OUTPUT_EVENT, COMPANION_SESSION_OWNERSHIP_LOST_EVENT, MINI_PROGRAM_MESSAGE_NAMESPACE, MINI_PROGRAM_OPERATION_PROGRESS_METHOD } from './constants';
|
|
2
|
+
import type { CompanionSessionExitPayload, CompanionSessionOutputPayload, CompanionSessionOwnershipLostPayload, MiniProgramRuntimeEnvironmentInfo, UserInfoAuthorization } from './payloads';
|
|
3
|
+
import type { MiniProgramCapabilityProgress, MiniProgramProgressMethod } from './capabilities';
|
|
3
4
|
export type MiniProgramBridgeMessageType = 'handshake' | 'request' | 'response' | 'event' | 'cancel';
|
|
4
|
-
export type MiniProgramEventName = 'launch' | 'ready' | 'show' | 'hide' | 'unload' | 'error' | 'heybox_app_login_change' | 'user_info_authorization_change';
|
|
5
|
+
export type MiniProgramEventName = 'launch' | 'ready' | 'show' | 'hide' | 'unload' | 'error' | 'heybox_app_login_change' | 'user_info_authorization_change' | typeof COMPANION_SESSION_OUTPUT_EVENT | typeof COMPANION_SESSION_EXIT_EVENT | typeof COMPANION_SESSION_OWNERSHIP_LOST_EVENT;
|
|
5
6
|
export interface MiniProgramBridgeError {
|
|
6
7
|
code: string;
|
|
7
8
|
message: string;
|
|
@@ -59,12 +60,12 @@ export interface MiniProgramBridgeCancelMessage extends MiniProgramBridgeMessage
|
|
|
59
60
|
payload?: never;
|
|
60
61
|
error?: never;
|
|
61
62
|
}
|
|
62
|
-
export interface MiniProgramBridgeProgressMessage extends MiniProgramBridgeMessage<
|
|
63
|
+
export interface MiniProgramBridgeProgressMessage<TMethod extends MiniProgramProgressMethod = MiniProgramProgressMethod> extends MiniProgramBridgeMessage<MiniProgramCapabilityProgress<TMethod>> {
|
|
63
64
|
version: 2;
|
|
64
65
|
type: 'event';
|
|
65
66
|
id: string;
|
|
66
67
|
method: typeof MINI_PROGRAM_OPERATION_PROGRESS_METHOD;
|
|
67
|
-
payload:
|
|
68
|
+
payload: MiniProgramCapabilityProgress<TMethod>;
|
|
68
69
|
error?: never;
|
|
69
70
|
}
|
|
70
71
|
export interface MiniProgramEventPayloadMap {
|
|
@@ -91,4 +92,7 @@ export interface MiniProgramEventPayloadMap {
|
|
|
91
92
|
isHeyboxAppLoggedIn: boolean;
|
|
92
93
|
};
|
|
93
94
|
user_info_authorization_change: UserInfoAuthorization;
|
|
95
|
+
[COMPANION_SESSION_OUTPUT_EVENT]: CompanionSessionOutputPayload;
|
|
96
|
+
[COMPANION_SESSION_EXIT_EVENT]: CompanionSessionExitPayload;
|
|
97
|
+
[COMPANION_SESSION_OWNERSHIP_LOST_EVENT]: CompanionSessionOwnershipLostPayload;
|
|
94
98
|
}
|
package/types/capabilities.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ClosePayload, CloseResult, CopyLinkPayload, CopyLinkResult, DirectoryCreatePayload, DirectoryCreateResult, DirectoryExistsPayload, DirectoryExistsResult, DirectoryListPayload, DirectoryListResult, DirectoryRemovePayload, DirectoryRemoveResult, DeleteCurrentUserLeaderboardEntryPayload, DeleteCurrentUserLeaderboardEntryResult, GetCurrentUserLeaderboardEntryPayload, GetCurrentUserLeaderboardEntryResult, GetLeaderboardInfoPayload, GetLeaderboardInfoResult, GetLeaderboardListPayload, GetLeaderboardListResult, GetStoragePayload, GetStorageResult, GetSteamGameListPayload, GetSteamGameListResult, GetUserInfoPayload, GetUserInfoResult, GetWindowInfoPayload, GetWindowInfoResult, HideLoadingPayload, HideLoadingResult, FileCreatePayload, FileCreateResult, FileExistsPayload, FileExistsResult, FileReadBytesPayload, FileReadBytesResult, FileReadTextPayload, FileReadTextResult, FileRemovePayload, FileRemoveResult, FileStatPayload, FileStatResult, FileWriteBytesPayload, FileWriteBytesResult, FileWriteTextPayload, FileWriteTextResult, LoginPayload, LoginResult, NetworkDownloadPayload, NetworkDownloadResult, NetworkRequestPayload, NetworkResponsePayload, OpenAppPagePayload, OpenAppPageResult, PickDirectoryPayload, PickDirectoryResult, PickFilesPayload, PickFilesResult, ReloadPayload, ReloadResult, ScreenshotPayload, ScreenshotResult, SaveFilePayload, SaveFileResult, SetClipboardPayload, SetClipboardResult, SetNavigationBarStylePayload, SetNavigationBarStyleResult, SetStoragePayload, ShowLoadingPayload, ShowLoadingResult, ShowShareMenuPayload, ShowShareMenuResult, ShowToastPayload, ShowToastResult, SubmitLeaderboardEntryPayload, SubmitLeaderboardEntryResult, VibratePayload, VibrateResult } from './payloads';
|
|
1
|
+
import type { CompanionCancelPreparationPayload, CompanionCancelPreparationResult, CompanionGetActiveSessionPayload, CompanionGetActiveSessionResult, CompanionGetInfoPayload, CompanionGetInfoResult, CompanionGetPreparationStatusPayload, CompanionGetPreparationStatusResult, CompanionLaunchPayload, CompanionLaunchResult, CompanionOpenAttachmentPayload, CompanionOpenAttachmentResult, CompanionPreparePayload, CompanionPrepareProgress, CompanionPrepareResult, CompanionSessionAckOutputPayload, CompanionSessionAckOutputResult, CompanionSessionCloseStdinPayload, CompanionSessionCloseStdinResult, CompanionSessionTerminatePayload, CompanionSessionTerminateResult, CompanionSessionWritePayload, CompanionSessionWriteResult, CompanionShowNotificationPayload, CompanionShowNotificationResult, ClosePayload, CloseResult, CopyLinkPayload, CopyLinkResult, DirectoryCreatePayload, DirectoryCreateResult, DirectoryExistsPayload, DirectoryExistsResult, DirectoryListPayload, DirectoryListResult, DirectoryRemovePayload, DirectoryRemoveResult, DownloadProgressPayload, DeleteCurrentUserLeaderboardEntryPayload, DeleteCurrentUserLeaderboardEntryResult, GetCurrentUserLeaderboardEntryPayload, GetCurrentUserLeaderboardEntryResult, GetLeaderboardInfoPayload, GetLeaderboardInfoResult, GetLeaderboardListPayload, GetLeaderboardListResult, GetStoragePayload, GetStorageResult, GetSteamGameListPayload, GetSteamGameListResult, GetUserInfoPayload, GetUserInfoResult, GetWindowInfoPayload, GetWindowInfoResult, HideLoadingPayload, HideLoadingResult, FileCreatePayload, FileCreateResult, FileExistsPayload, FileExistsResult, FileReadBytesPayload, FileReadBytesResult, FileReadTextPayload, FileReadTextResult, FileRemovePayload, FileRemoveResult, FileStatPayload, FileStatResult, FileWriteBytesPayload, FileWriteBytesResult, FileWriteTextPayload, FileWriteTextResult, LoginPayload, LoginResult, NetworkDownloadPayload, NetworkDownloadResult, NetworkRequestPayload, NetworkResponsePayload, OpenAppPagePayload, OpenAppPageResult, PickDirectoryPayload, PickDirectoryResult, PickFilesPayload, PickFilesResult, ReloadPayload, ReloadResult, ScreenshotPayload, ScreenshotResult, SaveFilePayload, SaveFileResult, SetClipboardPayload, SetClipboardResult, SetNavigationBarStylePayload, SetNavigationBarStyleResult, SetStoragePayload, ShowLoadingPayload, ShowLoadingResult, ShowShareMenuPayload, ShowShareMenuResult, ShowToastPayload, ShowToastResult, SubmitLeaderboardEntryPayload, SubmitLeaderboardEntryResult, VibratePayload, VibrateResult } from './payloads';
|
|
2
2
|
import type { MiniProgramPermissionRequirement } from './permission-catalog';
|
|
3
3
|
export declare const AUTH_LOGIN_METHOD: "auth.login";
|
|
4
4
|
export declare const USER_GET_INFO_METHOD: "user.getInfo";
|
|
@@ -41,6 +41,18 @@ export declare const CLOUD_LEADERBOARD_GET_LIST_METHOD: "cloud.leaderboard.getLi
|
|
|
41
41
|
export declare const CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD: "cloud.leaderboard.getCurrentUserEntry";
|
|
42
42
|
export declare const CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD: "cloud.leaderboard.deleteCurrentUserEntry";
|
|
43
43
|
export declare const CLOUD_LEADERBOARD_GET_INFO_METHOD: "cloud.leaderboard.getInfo";
|
|
44
|
+
export declare const COMPANION_GET_INFO_METHOD: "companion.getInfo";
|
|
45
|
+
export declare const COMPANION_GET_PREPARATION_STATUS_METHOD: "companion.getPreparationStatus";
|
|
46
|
+
export declare const COMPANION_PREPARE_METHOD: "companion.prepare";
|
|
47
|
+
export declare const COMPANION_CANCEL_PREPARATION_METHOD: "companion.cancelPreparation";
|
|
48
|
+
export declare const COMPANION_GET_ACTIVE_SESSION_METHOD: "companion.getActiveSession";
|
|
49
|
+
export declare const COMPANION_LAUNCH_METHOD: "companion.launch";
|
|
50
|
+
export declare const COMPANION_SESSION_WRITE_METHOD: "companion.session.write";
|
|
51
|
+
export declare const COMPANION_SESSION_CLOSE_STDIN_METHOD: "companion.session.closeStdin";
|
|
52
|
+
export declare const COMPANION_SESSION_TERMINATE_METHOD: "companion.session.terminate";
|
|
53
|
+
export declare const COMPANION_SESSION_ACK_OUTPUT_METHOD: "companion.session.ackOutput";
|
|
54
|
+
export declare const COMPANION_OPEN_ATTACHMENT_METHOD: "companion.openAttachment";
|
|
55
|
+
export declare const COMPANION_SHOW_NOTIFICATION_METHOD: "companion.showNotification";
|
|
44
56
|
export type MiniProgramAuthMethod = typeof AUTH_LOGIN_METHOD;
|
|
45
57
|
export type MiniProgramUserMethod = typeof USER_GET_INFO_METHOD | typeof USER_REVOKE_AUTHORIZATION_METHOD | typeof USER_GET_STEAM_GAME_LIST_METHOD;
|
|
46
58
|
export type MiniProgramShareMethod = typeof SHARE_COPY_LINK_METHOD | typeof SHARE_SHOW_SHARE_MENU_METHOD | typeof SHARE_SCREENSHOT_METHOD;
|
|
@@ -54,8 +66,9 @@ export type MiniProgramUiMethod = typeof UI_SHOW_TOAST_METHOD | typeof UI_SHOW_L
|
|
|
54
66
|
export type MiniProgramDeviceMethod = typeof DEVICE_VIBRATE_METHOD | typeof DEVICE_SET_CLIPBOARD_METHOD;
|
|
55
67
|
export type MiniProgramNavigationMethod = typeof NAVIGATION_CLOSE_METHOD | typeof NAVIGATION_RELOAD_METHOD | typeof NAVIGATION_OPEN_APP_PAGE_METHOD;
|
|
56
68
|
export type MiniProgramCloudMethod = typeof CLOUD_LEADERBOARD_SUBMIT_METHOD | typeof CLOUD_LEADERBOARD_GET_LIST_METHOD | typeof CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD | typeof CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD | typeof CLOUD_LEADERBOARD_GET_INFO_METHOD;
|
|
57
|
-
export type
|
|
58
|
-
export type
|
|
69
|
+
export type MiniProgramCompanionMethod = typeof COMPANION_GET_INFO_METHOD | typeof COMPANION_GET_PREPARATION_STATUS_METHOD | typeof COMPANION_PREPARE_METHOD | typeof COMPANION_CANCEL_PREPARATION_METHOD | typeof COMPANION_GET_ACTIVE_SESSION_METHOD | typeof COMPANION_LAUNCH_METHOD | typeof COMPANION_SESSION_WRITE_METHOD | typeof COMPANION_SESSION_CLOSE_STDIN_METHOD | typeof COMPANION_SESSION_TERMINATE_METHOD | typeof COMPANION_SESSION_ACK_OUTPUT_METHOD | typeof COMPANION_OPEN_ATTACHMENT_METHOD | typeof COMPANION_SHOW_NOTIFICATION_METHOD;
|
|
70
|
+
export type MiniProgramBridgeMethod = MiniProgramAuthMethod | MiniProgramUserMethod | MiniProgramShareMethod | MiniProgramViewportMethod | MiniProgramStorageMethod | MiniProgramNetworkMethod | MiniProgramFilesMethod | MiniProgramFileMethod | MiniProgramDirectoryMethod | MiniProgramUiMethod | MiniProgramDeviceMethod | MiniProgramNavigationMethod | MiniProgramCloudMethod | MiniProgramCompanionMethod;
|
|
71
|
+
export type MiniProgramCapabilityModule = 'auth' | 'user' | 'share' | 'viewport' | 'storage' | 'network' | 'files' | 'file' | 'directory' | 'ui' | 'device' | 'navigation' | 'cloud' | 'companion';
|
|
59
72
|
export type MiniProgramCapabilityRisk = 'low' | 'medium' | 'high';
|
|
60
73
|
export interface MiniProgramCapabilityDefinition {
|
|
61
74
|
method: MiniProgramBridgeMethod;
|
|
@@ -423,7 +436,16 @@ export declare const MINI_PROGRAM_PROTOCOL_CAPABILITIES: readonly [{
|
|
|
423
436
|
readonly permissions: readonly ["leaderboard"];
|
|
424
437
|
};
|
|
425
438
|
readonly risk: "low";
|
|
426
|
-
}
|
|
439
|
+
}, ...{
|
|
440
|
+
method: "companion.getInfo" | "companion.getPreparationStatus" | "companion.prepare" | "companion.cancelPreparation" | "companion.getActiveSession" | "companion.launch" | "companion.session.write" | "companion.session.closeStdin" | "companion.session.terminate" | "companion.session.ackOutput" | "companion.openAttachment" | "companion.showNotification";
|
|
441
|
+
module: "companion";
|
|
442
|
+
capability: "companion.getInfo" | "companion.getPreparationStatus" | "companion.prepare" | "companion.cancelPreparation" | "companion.getActiveSession" | "companion.launch" | "companion.session.write" | "companion.session.closeStdin" | "companion.session.terminate" | "companion.session.ackOutput" | "companion.openAttachment" | "companion.showNotification";
|
|
443
|
+
requirement: {
|
|
444
|
+
kind: "all";
|
|
445
|
+
permissions: "companion"[];
|
|
446
|
+
};
|
|
447
|
+
risk: "high";
|
|
448
|
+
}[]];
|
|
427
449
|
export interface MiniProgramCapabilityPayloadMap {
|
|
428
450
|
[AUTH_LOGIN_METHOD]: LoginPayload;
|
|
429
451
|
[USER_GET_INFO_METHOD]: GetUserInfoPayload;
|
|
@@ -466,6 +488,18 @@ export interface MiniProgramCapabilityPayloadMap {
|
|
|
466
488
|
[CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD]: GetCurrentUserLeaderboardEntryPayload | undefined;
|
|
467
489
|
[CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD]: DeleteCurrentUserLeaderboardEntryPayload | undefined;
|
|
468
490
|
[CLOUD_LEADERBOARD_GET_INFO_METHOD]: GetLeaderboardInfoPayload | undefined;
|
|
491
|
+
[COMPANION_GET_INFO_METHOD]: CompanionGetInfoPayload;
|
|
492
|
+
[COMPANION_GET_PREPARATION_STATUS_METHOD]: CompanionGetPreparationStatusPayload;
|
|
493
|
+
[COMPANION_PREPARE_METHOD]: CompanionPreparePayload;
|
|
494
|
+
[COMPANION_CANCEL_PREPARATION_METHOD]: CompanionCancelPreparationPayload;
|
|
495
|
+
[COMPANION_GET_ACTIVE_SESSION_METHOD]: CompanionGetActiveSessionPayload;
|
|
496
|
+
[COMPANION_LAUNCH_METHOD]: CompanionLaunchPayload;
|
|
497
|
+
[COMPANION_SESSION_WRITE_METHOD]: CompanionSessionWritePayload;
|
|
498
|
+
[COMPANION_SESSION_CLOSE_STDIN_METHOD]: CompanionSessionCloseStdinPayload;
|
|
499
|
+
[COMPANION_SESSION_TERMINATE_METHOD]: CompanionSessionTerminatePayload;
|
|
500
|
+
[COMPANION_SESSION_ACK_OUTPUT_METHOD]: CompanionSessionAckOutputPayload;
|
|
501
|
+
[COMPANION_OPEN_ATTACHMENT_METHOD]: CompanionOpenAttachmentPayload;
|
|
502
|
+
[COMPANION_SHOW_NOTIFICATION_METHOD]: CompanionShowNotificationPayload;
|
|
469
503
|
}
|
|
470
504
|
export interface MiniProgramCapabilityResultMap {
|
|
471
505
|
[AUTH_LOGIN_METHOD]: LoginResult;
|
|
@@ -509,6 +543,24 @@ export interface MiniProgramCapabilityResultMap {
|
|
|
509
543
|
[CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD]: GetCurrentUserLeaderboardEntryResult;
|
|
510
544
|
[CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD]: DeleteCurrentUserLeaderboardEntryResult;
|
|
511
545
|
[CLOUD_LEADERBOARD_GET_INFO_METHOD]: GetLeaderboardInfoResult;
|
|
546
|
+
[COMPANION_GET_INFO_METHOD]: CompanionGetInfoResult;
|
|
547
|
+
[COMPANION_GET_PREPARATION_STATUS_METHOD]: CompanionGetPreparationStatusResult;
|
|
548
|
+
[COMPANION_PREPARE_METHOD]: CompanionPrepareResult;
|
|
549
|
+
[COMPANION_CANCEL_PREPARATION_METHOD]: CompanionCancelPreparationResult;
|
|
550
|
+
[COMPANION_GET_ACTIVE_SESSION_METHOD]: CompanionGetActiveSessionResult;
|
|
551
|
+
[COMPANION_LAUNCH_METHOD]: CompanionLaunchResult;
|
|
552
|
+
[COMPANION_SESSION_WRITE_METHOD]: CompanionSessionWriteResult;
|
|
553
|
+
[COMPANION_SESSION_CLOSE_STDIN_METHOD]: CompanionSessionCloseStdinResult;
|
|
554
|
+
[COMPANION_SESSION_TERMINATE_METHOD]: CompanionSessionTerminateResult;
|
|
555
|
+
[COMPANION_SESSION_ACK_OUTPUT_METHOD]: CompanionSessionAckOutputResult;
|
|
556
|
+
[COMPANION_OPEN_ATTACHMENT_METHOD]: CompanionOpenAttachmentResult;
|
|
557
|
+
[COMPANION_SHOW_NOTIFICATION_METHOD]: CompanionShowNotificationResult;
|
|
512
558
|
}
|
|
559
|
+
export interface MiniProgramCapabilityProgressMap {
|
|
560
|
+
[NETWORK_DOWNLOAD_METHOD]: DownloadProgressPayload;
|
|
561
|
+
[COMPANION_PREPARE_METHOD]: CompanionPrepareProgress;
|
|
562
|
+
}
|
|
563
|
+
export type MiniProgramProgressMethod = keyof MiniProgramCapabilityProgressMap;
|
|
564
|
+
export type MiniProgramCapabilityProgress<T extends MiniProgramProgressMethod> = MiniProgramCapabilityProgressMap[T];
|
|
513
565
|
export type MiniProgramCapabilityPayload<T extends MiniProgramBridgeMethod> = MiniProgramCapabilityPayloadMap[T];
|
|
514
566
|
export type MiniProgramCapabilityResult<T extends MiniProgramBridgeMethod> = MiniProgramCapabilityResultMap[T];
|
package/types/constants.d.ts
CHANGED
|
@@ -6,3 +6,6 @@ export declare const RUNTIME_LOCATION_PROBE_METHOD: "runtime.location.probe";
|
|
|
6
6
|
export declare const SDK_LOCATION_REPORT_METHOD: "sdk.location.report";
|
|
7
7
|
export declare const SDK_CSP_VIOLATION_METHOD: "sdk.csp.violation";
|
|
8
8
|
export declare const MINI_PROGRAM_OPERATION_PROGRESS_METHOD: "operation.progress";
|
|
9
|
+
export declare const COMPANION_SESSION_OUTPUT_EVENT: "companion.session.output";
|
|
10
|
+
export declare const COMPANION_SESSION_EXIT_EVENT: "companion.session.exit";
|
|
11
|
+
export declare const COMPANION_SESSION_OWNERSHIP_LOST_EVENT: "companion.session.ownershipLost";
|
package/types/guards.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { MiniProgramBridgeMessage } from './bridge';
|
|
2
|
-
import type { DownloadProgressPayload, MiniProgramDirectoryDescriptor, MiniProgramDirectoryRef, MiniProgramFileDescriptor, MiniProgramFileRef, MiniProgramFileStat, MiniProgramFileSystemEntityDescriptor, MiniProgramPathRootRef } from './payloads';
|
|
2
|
+
import type { CompanionPrepareProgress, DownloadProgressPayload, MiniProgramDirectoryDescriptor, MiniProgramDirectoryRef, MiniProgramFileDescriptor, MiniProgramFileRef, MiniProgramFileStat, MiniProgramFileSystemEntityDescriptor, MiniProgramPathRootRef } from './payloads';
|
|
3
3
|
export declare function isMiniProgramBridgeMessage(value: unknown): value is MiniProgramBridgeMessage;
|
|
4
4
|
export declare function isMiniProgramRelativePath(value: unknown): value is string;
|
|
5
5
|
export declare function isMiniProgramPathRootRef(value: unknown): value is MiniProgramPathRootRef;
|
|
@@ -11,3 +11,5 @@ export declare function isMiniProgramFileSystemEntityDescriptor(value: unknown):
|
|
|
11
11
|
export declare function isMiniProgramByteArray(value: unknown): value is Uint8Array;
|
|
12
12
|
export declare function isMiniProgramFileStat(value: unknown): value is MiniProgramFileStat;
|
|
13
13
|
export declare function isMiniProgramDownloadProgressPayload(value: unknown): value is DownloadProgressPayload;
|
|
14
|
+
export declare function isMiniProgramCompanionPrepareProgress(value: unknown): value is CompanionPrepareProgress;
|
|
15
|
+
export declare function isMiniProgramOperationProgressPayload(value: unknown): value is DownloadProgressPayload | CompanionPrepareProgress;
|
package/types/payloads.d.ts
CHANGED
|
@@ -463,4 +463,124 @@ export interface GetLeaderboardInfoResult {
|
|
|
463
463
|
order: LeaderboardOrder;
|
|
464
464
|
rankLimit: number;
|
|
465
465
|
}
|
|
466
|
+
/** 受管桌面程序可选能力。 */
|
|
467
|
+
export type CompanionCapability = 'stdio' | 'attachments' | 'notifications';
|
|
468
|
+
export type CompanionTarget = 'windows-x64' | 'macos-arm64';
|
|
469
|
+
export type CompanionSignatureStatus = 'unsigned' | 'valid' | 'invalid' | 'unknown';
|
|
470
|
+
/** Companion alias 的跨构建、Runtime 与 Host 规范。 */
|
|
471
|
+
export declare const COMPANION_ALIAS_PATTERN: RegExp;
|
|
472
|
+
/** Companion Host 可跨 bridge 保留的稳定领域错误码。 */
|
|
473
|
+
export declare const COMPANION_ERROR_CODES: readonly ["COMPANION_UNSUPPORTED", "COMPANION_NOT_DECLARED", "COMPANION_TARGET_UNSUPPORTED", "COMPANION_NOT_PREPARED", "COMPANION_PREPARATION_CANCELLED", "COMPANION_DOWNLOAD_FAILED", "COMPANION_DESCRIPTOR_UNAVAILABLE", "COMPANION_ARCHIVE_INVALID", "COMPANION_INTEGRITY_FAILED", "COMPANION_ENTRYPOINT_INVALID", "COMPANION_USER_CANCELLED", "COMPANION_ELEVATION_DENIED", "COMPANION_OS_BLOCKED", "COMPANION_LAUNCH_FAILED", "COMPANION_SESSION_VERSION_MISMATCH", "COMPANION_SESSION_OWNERSHIP_LOST", "COMPANION_SESSION_EXITED", "COMPANION_PIPE_CLOSED", "COMPANION_OUTPUT_LIMIT", "COMPANION_PROCESS_CRASHED", "COMPANION_ATTACHMENT_NOT_FOUND", "COMPANION_NOTIFICATION_UNAVAILABLE", "COMPANION_TERMINATE_FAILED"];
|
|
474
|
+
export type CompanionErrorCode = (typeof COMPANION_ERROR_CODES)[number];
|
|
475
|
+
export interface CompanionInfo {
|
|
476
|
+
alias: string;
|
|
477
|
+
displayName: string;
|
|
478
|
+
target: CompanionTarget;
|
|
479
|
+
capabilities: readonly CompanionCapability[];
|
|
480
|
+
archiveBytes: number;
|
|
481
|
+
signatureStatus: CompanionSignatureStatus;
|
|
482
|
+
/** Host 确认的产物来源;旧 Host 缺省时来源未知。 */
|
|
483
|
+
source?: 'local-dev' | 'released';
|
|
484
|
+
}
|
|
485
|
+
export interface CompanionErrorSummary {
|
|
486
|
+
code: CompanionErrorCode;
|
|
487
|
+
message: string;
|
|
488
|
+
retryable: boolean;
|
|
489
|
+
}
|
|
490
|
+
export type CompanionPrepareProgress = {
|
|
491
|
+
phase: 'downloading';
|
|
492
|
+
loaded: number;
|
|
493
|
+
total?: number;
|
|
494
|
+
} | {
|
|
495
|
+
phase: 'verifying';
|
|
496
|
+
processed: number;
|
|
497
|
+
total: number;
|
|
498
|
+
} | {
|
|
499
|
+
phase: 'extracting';
|
|
500
|
+
processed: number;
|
|
501
|
+
total: number;
|
|
502
|
+
};
|
|
503
|
+
export type CompanionPreparationStatus = {
|
|
504
|
+
state: 'not-prepared';
|
|
505
|
+
} | {
|
|
506
|
+
state: 'preparing';
|
|
507
|
+
progress: CompanionPrepareProgress;
|
|
508
|
+
} | {
|
|
509
|
+
state: 'ready';
|
|
510
|
+
preparedAt: number;
|
|
511
|
+
} | {
|
|
512
|
+
state: 'failed';
|
|
513
|
+
error: CompanionErrorSummary;
|
|
514
|
+
};
|
|
515
|
+
export type CompanionExitReason = 'exited' | 'terminated' | 'crashed' | 'host-shutdown' | 'permission-revoked' | 'output-limit';
|
|
516
|
+
export type CompanionExit = {
|
|
517
|
+
reason: 'exited';
|
|
518
|
+
exitCode: number;
|
|
519
|
+
} | {
|
|
520
|
+
reason: Exclude<CompanionExitReason, 'exited'>;
|
|
521
|
+
exitCode?: number;
|
|
522
|
+
};
|
|
523
|
+
/** 活动 Session 的 wire 快照;不包含路径、PID 或原生句柄。 */
|
|
524
|
+
export interface CompanionSessionSnapshot {
|
|
525
|
+
id: string;
|
|
526
|
+
alias: string;
|
|
527
|
+
target: CompanionTarget;
|
|
528
|
+
capabilities: readonly CompanionCapability[];
|
|
529
|
+
state: 'running';
|
|
530
|
+
controllerGeneration: number;
|
|
531
|
+
}
|
|
532
|
+
export interface CompanionAliasPayload {
|
|
533
|
+
alias: string;
|
|
534
|
+
}
|
|
535
|
+
export type CompanionGetInfoPayload = CompanionAliasPayload;
|
|
536
|
+
export type CompanionGetInfoResult = CompanionInfo;
|
|
537
|
+
export type CompanionGetPreparationStatusPayload = CompanionAliasPayload;
|
|
538
|
+
export type CompanionGetPreparationStatusResult = CompanionPreparationStatus;
|
|
539
|
+
export type CompanionPreparePayload = CompanionAliasPayload;
|
|
540
|
+
export type CompanionPrepareResult = CompanionInfo;
|
|
541
|
+
export type CompanionCancelPreparationPayload = CompanionAliasPayload;
|
|
542
|
+
export type CompanionCancelPreparationResult = void;
|
|
543
|
+
export type CompanionGetActiveSessionPayload = CompanionAliasPayload;
|
|
544
|
+
export type CompanionGetActiveSessionResult = CompanionSessionSnapshot | undefined;
|
|
545
|
+
export type CompanionLaunchPayload = CompanionAliasPayload;
|
|
546
|
+
export type CompanionLaunchResult = CompanionSessionSnapshot;
|
|
547
|
+
export interface CompanionSessionControllerPayload {
|
|
548
|
+
sessionId: string;
|
|
549
|
+
controllerGeneration: number;
|
|
550
|
+
}
|
|
551
|
+
export interface CompanionSessionWritePayload extends CompanionSessionControllerPayload {
|
|
552
|
+
data: Uint8Array;
|
|
553
|
+
}
|
|
554
|
+
export type CompanionSessionWriteResult = void;
|
|
555
|
+
export type CompanionSessionCloseStdinPayload = CompanionSessionControllerPayload;
|
|
556
|
+
export type CompanionSessionCloseStdinResult = void;
|
|
557
|
+
export type CompanionSessionTerminatePayload = CompanionSessionControllerPayload;
|
|
558
|
+
export type CompanionSessionTerminateResult = void;
|
|
559
|
+
export interface CompanionSessionAckOutputPayload extends CompanionSessionControllerPayload {
|
|
560
|
+
stream: 'stdout' | 'stderr';
|
|
561
|
+
sequence: number;
|
|
562
|
+
}
|
|
563
|
+
export type CompanionSessionAckOutputResult = void;
|
|
564
|
+
export interface CompanionOpenAttachmentPayload extends CompanionSessionControllerPayload {
|
|
565
|
+
id: string;
|
|
566
|
+
}
|
|
567
|
+
export type CompanionOpenAttachmentResult = MiniProgramFileDescriptor;
|
|
568
|
+
export type CompanionNotificationCategory = 'completed' | 'failed' | 'stopped' | 'attention';
|
|
569
|
+
export interface CompanionShowNotificationPayload extends CompanionSessionControllerPayload {
|
|
570
|
+
category: CompanionNotificationCategory;
|
|
571
|
+
}
|
|
572
|
+
export type CompanionShowNotificationResult = void;
|
|
573
|
+
export interface CompanionSessionOutputPayload extends CompanionSessionControllerPayload {
|
|
574
|
+
stream: 'stdout' | 'stderr';
|
|
575
|
+
sequence: number;
|
|
576
|
+
data: Uint8Array;
|
|
577
|
+
}
|
|
578
|
+
export interface CompanionSessionExitPayload {
|
|
579
|
+
sessionId: string;
|
|
580
|
+
exit: CompanionExit;
|
|
581
|
+
}
|
|
582
|
+
export interface CompanionSessionOwnershipLostPayload {
|
|
583
|
+
sessionId: string;
|
|
584
|
+
controllerGeneration: number;
|
|
585
|
+
}
|
|
466
586
|
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { MiniProgramBridgeMethod, MiniProgramCapabilityRisk } from './capabilities';
|
|
2
|
-
export declare const MINI_PROGRAM_PERMISSION_KEYS: readonly ["userInfo", "steamLibrary", "share", "storage", "filesystem", "clipboard", "leaderboard", "network"];
|
|
2
|
+
export declare const MINI_PROGRAM_PERMISSION_KEYS: readonly ["userInfo", "steamLibrary", "share", "storage", "filesystem", "clipboard", "leaderboard", "network", "companion"];
|
|
3
3
|
export type MiniProgramPermissionKey = (typeof MINI_PROGRAM_PERMISSION_KEYS)[number];
|
|
4
4
|
export type MiniProgramPermissionRequirement = {
|
|
5
5
|
readonly kind: 'none';
|
|
@@ -103,6 +103,15 @@ export declare const MINI_PROGRAM_PERMISSION_CATALOG: readonly [{
|
|
|
103
103
|
};
|
|
104
104
|
readonly methods: readonly ["network.request", "network.download"];
|
|
105
105
|
readonly conditions: readonly ["声明后仍需平台批准,并继续执行网络安全策略。"];
|
|
106
|
+
}, {
|
|
107
|
+
readonly key: "companion";
|
|
108
|
+
readonly name: "桌面辅助应用";
|
|
109
|
+
readonly description: "下载、准备并运行随当前小程序版本发布的受管桌面程序。";
|
|
110
|
+
readonly access: "platform-approval";
|
|
111
|
+
readonly risk: "high";
|
|
112
|
+
readonly config: {};
|
|
113
|
+
readonly methods: readonly ["companion.getInfo", "companion.getPreparationStatus", "companion.prepare", "companion.cancelPreparation", "companion.getActiveSession", "companion.launch", "companion.session.write", "companion.session.closeStdin", "companion.session.terminate", "companion.session.ackOutput", "companion.openAttachment", "companion.showNotification"];
|
|
114
|
+
readonly conditions: readonly ["声明后仍需平台批准,并继续执行可信用户手势、Host 能力和当前版本 Manifest 校验。"];
|
|
106
115
|
}];
|
|
107
116
|
export declare const MINI_PROGRAM_NO_DECLARATION_METHODS: readonly ["user.revokeAuthorization", "ui.showToast", "ui.showLoading", "ui.hideLoading", "viewport.getWindowInfo", "viewport.setNavigationBarStyle", "device.vibrate", "navigation.close", "navigation.reload", "navigation.openAppPage"];
|
|
108
117
|
export declare function isMiniProgramPermissionKey(key: string): key is MiniProgramPermissionKey;
|