插件系统
VentoStack 提供了完整的插件系统,支持插件注册、依赖管理和沙箱隔离执行。
import { createPluginRegistry } from "@ventostack/core";
const registry = createPluginRegistry();
// 注册一个插件registry.register({ name: "my-plugin", version: "1.0.0", description: "示例插件", setup: async (ctx) => { // 插件初始化逻辑 console.log("插件已加载"); }});插件可以声明依赖其他插件:
registry.register({ name: "auth-plugin", version: "1.0.0", dependencies: ["database-plugin"], // 依赖 database-plugin setup: async (ctx) => { // 此时 database-plugin 已初始化 const db = ctx.get("database"); // 使用数据库... }});
registry.register({ name: "database-plugin", version: "1.0.0", setup: async (ctx) => { const db = createQueryBuilder({ url: process.env.DATABASE_URL! }); ctx.set("database", db); // 向 context 注入 }});
// 按依赖顺序初始化所有插件await registry.init();createPluginSandbox 提供隔离的执行环境,防止插件访问未授权资源:
import { createPluginSandbox } from "@ventostack/core";
const sandbox = createPluginSandbox({ allowedModules: ["node:path", "node:os"], // 允许访问的模块 timeout: 5000, // 执行超时(ms)});
// 在沙箱中执行代码const result = await sandbox.execute(` const path = require("node:path"); return path.join("a", "b", "c");`);
console.log(result.output); // "a/b/c"PluginRegistry 接口
Section titled “PluginRegistry 接口”interface PluginManifest { name: string; version: string; description?: string; dependencies?: string[]; setup: (ctx: PluginContext) => void | Promise<void>;}
interface PluginRegistry { register(manifest: PluginManifest): void; init(): Promise<void>; get(name: string): PluginEntry | undefined; list(): PluginEntry[];}