Extra(扩展玩法)
Extra 承载整块可插拔玩法,但第三方不能新增大插件。具体玩法由外部小插件在 gameplay:module@1 登记;Extra 负责受控生命周期,不提供某一套具体玩法规则。
接口
| 名称 | 类型 | policy | 用途 |
|---|---|---|---|
extra:modules | 服务 | trusted | 查询模块 ID、进入指定模块、退出容器中的活动模块 |
extra:resolve-module | 机制插槽 | trusted | 把请求的模块 ID 解析为实际 ID;默认原样返回 |
extra:on-module-enter | 通知 | — | 实际挂载后广播 { id } |
extra:on-module-exit | 通知 | — | 实际撤下后广播 { id } |
gameplay:module@1 | 实现位(multi) | public | 登记玩法模块;无内置实现,卸载即空缺 |
模块条目
条目提供 mount(container, params?),同步返回撤销函数。Extra 在调用方容器内新建子容器,将复制后的 JSON 参数交给模块。模块使用自己的 Cordis 作用域,能力和写边仍按清单准入;不会得到根控制面或其他插件的上下文。
子容器只界定 DOM 清理所有权,不构成安全隔离。需要异步工作的模块在自己的作用域登记撤销;本期没有异步挂起协议。
ts
export const inject = ['gameplay:module@1']
export function apply(ctx) {
ctx['gameplay:module@1'].register('demo', {
mount(container, params) {
container.textContent = 'Demo'
return () => { container.textContent = '' }
},
})
}进入、退出与失败
extra:modules.list()返回独立的模块 ID 数组。enter(id, container, params?)经extra:resolve-module解析后挂载。找不到模块或同一容器已有活动模块时拒绝,不覆盖正在运行的模块。exit(container)调用撤销函数并移除本次子容器;没有活动模块时不报错。撤销函数出错也会清除活动登记、移除子容器,再把错误交回调用方。- 进入失败不发进入通知;实际挂载、撤下后才广播对应通知。
- 模块卸载或根插件撤销会清理所有活动实例,不依赖模块自行监听卸载。
验证范围
test/contract/extra.test.ts 使用原创的签名外部插件夹具,覆盖登记、参数复制、真实 DOM、重复进入、退出通知、机制改写审计、撤销异常与卸载清理。
当前状态:已完成(本页所述受控生命周期范围)。Node 与浏览器定向用例共 13 项通过、1 项按环境跳过;Windows WebView2 与 Android 原生共用契约各 420 项通过、2 项按条件跳过,其中 Extra 的 7 项在两端均通过。此状态不代表 Phase 3 整体或其他玩法已完成。