跳转到主要内容

Hook 系统 — 拦截与增强启动器方法

插件可通过 Hook 系统在启动器的方法执行前后注入逻辑:修改参数、修改返回值、阻止执行或完全替换实现。适用于功能强化、性能优化、逻辑重构(例如:为启动注入自定义 JVM 参数、为版本扫描添加虚拟版本、拦截下载等)。

执行模型:Koa 式洋葱管道

每个 hook 是一个中间件函数 (ctx, next) => Promise<void>,按洋葱模型执行:
  • before:await next() 之前的代码,可修改 ctx.args(参数)
  • after:await next() 之后的代码,可修改 ctx.result(返回值)
  • 阻止:调用 ctx.prevent() 跳过默认实现与后续 hook
  • 替换:ctx.prevent() + 设置 ctx.result 即完全替换实现
  • 嵌套:多个插件按注册顺序洋葱执行,先注册者在外层

权限与声明

权限

hook:register(危险级)。manifest permissions 需包含,否则注册被拒绝。

manifest 声明(可选)

声明用于文档化与权限预检;实际处理函数在运行时用 registerHook 注册。

registerHook — 注册 hook

  • 权限:hook:register
  • 参数:(method: string, handler: (ctx, next) => Promise<void>)
  • method 为启动器可 hook 的方法名(见下表)
  • 插件停用时自动注销其全部 hooks

Context 对象

可 hook 的方法

典型示例

阻止特定实例启动

完全替换实现

修改启动参数(注入 JVM 参数)

执行位置与架构

插件 hook 函数在插件 iframe 沙箱中执行,默认实现(impl)在主窗口执行。两者经两阶段桥通信(before → impl → after),保证洋葱语义跨窗口成立:

已知限制

  • 仅覆盖前端方法层(用 hookable() 包装器暴露的方法);后端 Rust 进程内 hook 规划中。
  • 内联渲染插件(render: "inline")的 hook 在主窗口上下文直接执行(共享同一注册表)。
  • L4 WebView 插件暂未接入跨窗口 registerHook。