扩展系统 (Extensions)
ModuleRegistry 提供了一个基于钩子(hook)的扩展系统,用于向运行时动态添加模块化的扩展能力。
模块结构 (Module structure)
每个模块均包含一个描述信息块(info block)、一个指向模块实例状态的上下文指针(context pointer)以及可选的生命周期钩子(lifecycle hooks):
zig
const MyModule = struct {
data: u32 = 0,
fn start(context: *anyopaque, runtime: zero_native.extensions.RuntimeContext) anyerror!void {
_ = runtime;
const self: *@This() = @ptrCast(@alignCast(context));
self.data = 42;
}
fn command(context: *anyopaque, runtime: zero_native.extensions.RuntimeContext, cmd: zero_native.extensions.Command) anyerror!void {
_ = runtime;
const self: *@This() = @ptrCast(@alignCast(context));
if (std.mem.eql(u8, cmd.name, "reset")) self.data = 0;
}
};注册模块 (Registering modules)
zig
var my_module = MyModule{};
const caps = [_]zero_native.extensions.Capability{.{ .kind = .native_module }};
const modules = [_]zero_native.extensions.Module{.{
.info = .{ .id = 1, .name = "my-module", .capabilities = &caps },
.context = &my_module,
.hooks = .{ .start_fn = MyModule.start, .command_fn = MyModule.command },
}};
const registry = zero_native.extensions.ModuleRegistry{ .modules = &modules };
var runtime = zero_native.Runtime.init(.{
.platform = my_platform,
.extensions = registry,
});模块字段说明
| 字段名 | 类型 | 描述 |
|---|---|---|
info.id | u64 | 唯一的数字标识符(在注册校验时若检测到重复的 ID 则会被拒绝)。 |
info.name | []const u8 | 易于阅读的模块名称。 |
info.capabilities | []const Capability | 该模块所提供的一组能力能力声明。 |
context | *anyopaque | 指向模块自定义状态的类型擦除指针(Opaque pointer)。 |
hooks.start_fn | optional | 当运行时启动时被调用。 |
hooks.stop_fn | optional | 当运行时停止时被调用(以模块注册的相反顺序进行逆序调用)。 |
hooks.command_fn | optional | 当有命令分发给扩展模块时被调用。 |
注册表方法 (Registry methods)
| 方法 | 描述 |
|---|---|
validate() | 检查并校验是否存在重复的模块 ID。 |
startAll(runtime) | 依次调用所有模块的 start_fn 启动钩子。 |
stopAll(runtime) | 逆序调用所有模块的 stop_fn 停止钩子(先进后出原则)。 |
dispatchCommand(runtime, command) | 向所有注册的扩展模块分发并调用对应的 command_fn。 |
hasCapability(kind) | 检查是否有任何已注册的扩展模块声明并提供了指定的某种能力。 |
能力类型 (Capability kinds)
| 能力种类 | 描述 |
|---|---|
native_module | 原生 Zig 模块。 |
webview | WebView 页面渲染能力。 |
js_bridge | JavaScript 桥接通道能力。 |
filesystem | 本地文件系统访问权限。 |
network | 网络访问权限。 |
clipboard | 剪贴板读写访问权限。 |
custom | 自定义能力(带有一个额外的 name 名称字段)。 |
这些能力类型直接映射到 app.zon 中的 capabilities 声明列表中。运行时可以使用 registry.hasCapability(.filesystem) 来动态查询是否有任何扩展模块为应用提供了指定的能力(例如 filesystem)。
原生 JS 引擎(实验性特性)
js 模块提供了一个底层的抽象层,用于从原生 Zig 直接调用原生 JavaScript 引擎。这与 WebView 的桥接器是各自独立的,主要用于未来的原生底层模块的集成开发。
| 类型 | 描述 |
|---|---|
Value | 标记联合体(Tagged union),可表示为:null、布尔值(boolean)、数字(number)、字符串(string)。 |
Call | 代表一个函数调用,包含:调用模块(module)、调用函数(function)以及参数(args)。 |
Bridge | 用于通过 RuntimeHooks 来校验并分发原生函数调用。 |
NullEngine | 引擎不可用时的预留存根(Stub),调用时始终返回 EngineUnavailable 错误。 |