package.json#heybox.companions 中声明的 Companion alias。必须完整匹配
[a-z][a-z0-9-]{0,31}:长度为 1 至 32,第一个字符是小写 ASCII 字母,其余字符
只能是小写字母、数字或连字符;SDK 不会 trim 或改变大小写。
Host 没有该 alias 的活动进程时返回 undefined;否则返回取得当前 controller
的 CompanionSession proxy。undefined 只表示没有正在运行的进程,可能是尚未
启动、已经退出或从未启动,不表示产物未准备。
HbMiniProgramSDKError alias 不符合格式时在请求前以 INVALID_PARAMS
拒绝;当前审核版本未声明 alias、目标平台不匹配或 Host 不支持时可能以
COMPANION_NOT_DECLARED、COMPANION_TARGET_UNSUPPORTED、COMPANION_UNSUPPORTED 或
METHOD_FORBIDDEN 拒绝。当前运行快照缺少或未启用 companion 权限时分别以
PERMISSION_NOT_IN_SNAPSHOT、PERMISSION_DENIED 拒绝;Host 返回非法 Session 快照时以
COMPANION_HOST_FAILED 拒绝,同一 Session ID 的 alias、target 或 capability 集合发生
不兼容变化时以 COMPANION_SESSION_VERSION_MISMATCH 拒绝。握手失败、SDK/Runtime 已
销毁、bridge 超时及其他 Host 失败会保留对应 SDK 错误码。
这不是只读状态查询。Host 成功返回活动 Session 时会把该 Session 的 controller 转移
给当前 Runtime,并使用递增的私有 generation 使旧 controller 失效;generation 不会暴露
在 CompanionSession 上。其他页面或 Runtime 后续取得控制权时,当前 proxy 的
CompanionSession.onOwnershipLost 会收到通知,之后 write()、closeStdin()、
terminate()、附件和通知等控制操作以 COMPANION_SESSION_OWNERSHIP_LOST 失败。
SDK 每次调用都会询问 Host,不会因为本地已有 proxy 而跳过请求。同一 SDK 页面内按
Session id 缓存 proxy:若 companion.launch
或本方法再次返回同一个 Session ID 和更新的 generation,SDK 更新同一个对象并返回原
引用,因此 === 保持成立,已注册的输出、状态、退出与 ownership listener,以及
CompanionSession.waitForExit 都继续有效。低于或等于当前值的旧 generation 不会
让已丢失控制权的 proxy 重新获得控制。页面 reload 会创建新的 SDK 和 proxy,不保证
JavaScript 对象身份跨页面保持。
返回的 proxy 公开稳定的 id、alias、target、只读 capabilities 和 state,不暴露
PID、物理路径、原生句柄或 generation。只有 Host 快照实际包含对应 capability 时,
stdio、attachments、notifications 才存在;调用前应按属性是否存在分支,不能只按
操作系统猜测。
失去控制权不会让进程退出,state 仍可为 running,
CompanionSession.waitForExit 也会继续等待同一进程的退出事件。需要继续控制时,
可在明确的恢复动作中重新调用本方法;不要轮询抢占 controller。该方法本身不会准备或
启动进程,也不需要可信用户手势或 Host 授权弹窗;创建新进程仍应由新的用户操作调用
launch()。
import hbSDK from '@heybox/hb-sdk'
const session = await hbSDK.companion.getActiveSession('runner')
if (!session) {
const preparation = await hbSDK.companion.getPreparationStatus('runner')
renderIdleState(preparation)
} else {
const stopOwnership = session.onOwnershipLost(() => {
disableCompanionControls()
})
try {
const exit = await session.waitForExit()
renderExit(exit)
} finally {
stopOwnership()
}
}
取得指定 alias 当前活动 Session 的控制权。