Skip to content
页面信息
📝 描述构成 Hydro 可扩展性基础的核心插件系统类
📥 导入import { Context, Service, Fiber, FiberState } from 'hydrooj'

Context 与 Service

构成 Hydro 可扩展性基础的核心插件系统类。基类来自 cordis

ts
import { Context, Service, Fiber, FiberState } from 'hydrooj';

Context

每个插件可访问的核心对象。提供事件订阅、服务注入、路由注册和生命周期管理功能。

Context 继承自 cordis.Context,通过 ApiMixin 服务添加了 Hydro 特有的方法。WebService 还混入了 RouteConnectionwithHandlerClass

路由方法

WebService 混入,用于注册 HTTP 和 WebSocket 处理器。

方法说明
Route(name, path, Handler, ...permPrivChecker)注册 HTTP 路由;绑定 namepathHandler 类,可附加权限/特权守卫。
Connection(name, path, Handler, ...permPrivChecker)注册 WebSocket 连接端点;签名与 Route 相同,但用于持久连接。

事件方法

继承自 cordis.Context。Hydro 定义了自己的 EventMap(参见 Events),包含领域相关事件。

方法说明
on(event, callback)订阅事件;返回一个 Disposable,调用即可移除监听器。
emit(event, ...args)同步触发事件,通知所有已注册的监听器。
parallel(event, ...args)触发事件并并发运行所有监听器;返回 Promise,在所有监听器完成后 resolve。
broadcast(event, ...args)跨所有集群进程广播事件(PM2 或 MongoDB 总线);在每个节点上调用 parallel

生命周期与插件方法

继承自 cordis.Context,用于管理插件和副作用。

方法说明
plugin(Plugin, config?)在当前上下文注册并初始化插件(类或函数);返回 Fiber
effect(() => Disposable)注册副作用;返回的清理函数在上下文销毁时调用。
mixin(serviceId, methods)将服务实例上的命名方法混入上下文原型,使其可通过 ctx.method() 调用。
inject在插件/服务类上声明服务依赖(静态 inject 数组)。

Hydro 特有方法

ApiMixin 添加 —— 可作为每个上下文实例的直接方法调用。

方法说明
addScript(name, description, schema, run)注册一个具名管理脚本,包含输入验证和异步执行函数。
provideModule(type, id, module)注册一个可插拔模块(如 'hash''problemSearch')到全局模块注册表。
injectUI(node, name, args?, ...permPrivChecker)将 UI 组件注入到前端插槽(NavProblemAddControlPanel 等),可附加权限守卫。
setImmediate(callback)在下一个事件循环 tick 调度回调;上下文销毁时自动清理。

Context 属性

属性类型说明
loaderLoader管理插件生命周期和热重载的插件加载器服务。
checkCheckService用于健康监测的检查/ping 服务。
domainDomainDoc?当前域文档(在域作用域的上下文中可用)。
geoipGeoIP?GeoIP 解析服务(可选,可能未加载)。

Service

所有 Hydro 服务的抽象基类。继承 cordis.Service<T, Context>

ts
import { Service } from 'hydrooj';

export default class MyService extends Service {
    static inject = ['database'];  // 声明依赖

    constructor(ctx: Context) {
        super(ctx, 'myService');
    }
}

服务通过 ctx.plugin(MyService) 注册,以其服务 ID 在上下文中可用。其他插件通过静态 inject 数组声明依赖。


类型

FiberFiberStatehydrooj 重新导出(源自 cordis,适配 Hydro 的 Context)。DisposablePlugincordis 内部类型,供参考。

类型说明
Fibercordis.Fiber<Context> —— 表示插件在上下文树中的生命周期节点;追踪状态(pending、loading、active、disposed)。
FiberStateFiber 生命周期状态枚举:PENDINGLOADINGACTIVEDISPOSED 等。
Disposable() => void —— 由 on()effect() 等注册方法返回的清理函数(cordis 类型,需从 cordis 直接导入)。
Plugin插件定义的类型别名 —— 可以是继承 Service 的类或 (ctx, config) => void 函数(cordis 类型,需从 cordis 直接导入)。