┌─────────────────────────────────────────────────────────────┐
│ Application Layer │
│ (Business Logic, User Plugins, Custom Integrations) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Plugin Layer │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ ObjectQL │ │ Driver │ │ Hono │ │ Flow │ │
│ │ Plugin │ │ Plugin │ │ Server │ │ Engine │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ REST │ │ GraphQL │ │ Cache │ │ Auth │ │
│ │ API │ │ API │ │ Plugin │ │ Plugin │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ ObjectKernel (MiniKernel) │
│ ┌────────────────┐ ┌────────────────┐ ┌──────────────┐ │
│ │ Service │ │ Lifecycle │ │ Hook │ │
│ │ Registry │ │ Management │ │ System │ │
│ │ (DI) │ │ (init/start) │ │ (Events) │ │
│ └────────────────┘ └────────────────┘ └──────────────┘ │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Dependency Resolution (Topological Sort) │ │
│ └────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Infrastructure │
│ (Node.js Runtime, TypeScript, Zod, etc.) │
└─────────────────────────────────────────────────────────────┘
IDLE
│
▼
use(plugin) ────┐
│ │
│ │ (可以注册多个插件)
│ │
│◄──────────┘
│
▼
bootstrap()
│
├─── Phase 1: INIT ────────────────┐
│ (按依赖顺序) │
│ │
│ Plugin A: init(ctx) │
│ ├─ ctx.registerService('a') │
│ └─ 准备资源 │
│ │
│ Plugin B: init(ctx) │
│ ├─ ctx.registerService('b') │
│ └─ ctx.getService('a') │
│ │
│ Plugin C: init(ctx) │
│ └─ ctx.getService('b') │
│ │
├─── Phase 2: START ───────────────┤
│ (按依赖顺序) │
│ │
│ Plugin A: start(ctx) │
│ ├─ 启动服务器 │
│ └─ 连接数据库 │
│ │
│ Plugin B: start(ctx) │
│ └─ 注册路由 │
│ │
│ Plugin C: start(ctx) │
│ └─ 启动定时任务 │
│ │
├─── Phase 3: KERNEL READY ────────┤
│ │
│ trigger('kernel:ready') │
│ ├─ Hook Handler 1 │
│ ├─ Hook Handler 2 │
│ └─ Hook Handler 3 │
│ │
└───────────────────────────────────┘
│
▼
RUNNING
│
▼
shutdown()
│
├─── DESTROY (反向顺序) ────────────┐
│ │
│ Plugin C: destroy() │
│ Plugin B: destroy() │
│ Plugin A: destroy() │
│ │
└───────────────────────────────────┘
│
▼
STOPPED
┌─────────────────────────────────────────────────────────┐
│ PluginContext │
│ │
│ ┌────────────────────────────────────────────────┐ │
│ │ Service Registry (Map) │ │
│ │ │ │
│ │ ┌──────────────┬──────────────────────────┐ │ │
│ │ │ Service Name │ Service Instance │ │ │
│ │ ├──────────────┼──────────────────────────┤ │ │
│ │ │ 'objectql' │ ObjectQL Instance │ │ │
│ │ │ 'db' │ Database Connection │ │ │
│ │ │ 'http-server'│ Hono App Instance │ │ │
│ │ │ 'cache' │ Cache Manager │ │ │
│ │ │ 'logger' │ Winston Logger │ │ │
│ │ └──────────────┴──────────────────────────┘ │ │
│ │ │ │
│ │ Methods: │ │
│ │ • registerService(name, service) │ │
│ │ • getService<T>(name): T │ │
│ └────────────────────────────────────────────────┘ │
│ │
│ Plugin A Plugin B │
│ ┌─────────┐ ┌─────────┐ │
│ │ │ │ │ │
│ │ init() │───┬────────│ start() │ │
│ │ │ │ │ │ │
│ └─────────┘ │ └─────────┘ │
│ │ │ │
│ register │ │ consume │
│ Service │ │ │
│ │ │ │
│ ▼ ▼ │
│ registerService getService │
│ │
└─────────────────────────────────────────────────────────┘
注册顺序 (Registration Order):
┌────────┐ ┌────────┐ ┌────────┐
│Plugin C│→ │Plugin B│→ │Plugin A│
└────────┘ └────────┘ └────────┘
│ │ │
│ │ └── dependencies: []
│ └── dependencies: ['plugin-a']
└── dependencies: ['plugin-b']
依赖图 (Dependency Graph):
┌────────┐
│Plugin A│ (无依赖)
└────┬───┘
│ depends on
▼
┌────────┐
│Plugin B│
└────┬───┘
│ depends on
▼
┌────────┐
│Plugin C│
└────────┘
拓扑排序后的初始化顺序 (Topological Sort):
1. Plugin A (init → start)
2. Plugin B (init → start)
3. Plugin C (init → start)
错误检测 (Error Detection):
循环依赖:
A → B → C → A ❌ Error: Circular dependency
缺失依赖:
A requires 'non-existent' ❌ Error: Dependency not found
┌─────────────────────────────────────────────────────────┐
│ Hook Registry (Map) │
│ │
│ ┌──────────────────┬─────────────────────────────┐ │
│ │ Hook Name │ Handlers (Array) │ │
│ ├──────────────────┼─────────────────────────────┤ │
│ │ 'kernel:ready' │ [handler1, handler2, ...] │ │
│ │ 'data:insert' │ [validator, logger, ...] │ │
│ │ 'http:request' │ [auth, cors, ...] │ │
│ └──────────────────┴─────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
事件流 (Event Flow):
Plugin A Plugin B Plugin C
│ │ │
│ ctx.hook('event') │ │
├──────────────────────►│ │
│ │ │
│ │ ctx.hook('event') │
│ ├──────────────────────►│
│ │ │
│ │
│ ctx.trigger('event', data) │
├───────────────────────────────────────────────►
│ │ │
│ handler1(data) │
│ │ │
│ handler2(data) │
│ │ │
│◄──────────────────────┴───────────────────────┘
│
Plugin-based Architecture:
┌─────────────────────┐
│ ObjectKernel │
│ (MiniKernel) │
│ │
│ Service Registry: │
│ ┌───────────────┐ │
│ │ 'objectql' │ │ ← 注册为服务
│ │ → ObjectQL │ │
│ └───────────────┘ │
│ │
└─────────────────────┘
▲
│
┌─────┴──────┐
│ ObjectQL │
│ Plugin │ ← 可替换的插件
└────────────┘
优势:
1. ✅ ObjectQL 可以被替换
2. ✅ 可以提供自定义 ObjectQL 实例
3. ✅ 测试时可以 Mock
4. ✅ 插件间平等关系
┌─────────────────────────────────────────────────────────┐
│ ObjectKernel │
└─────────────────────────────────────────────────────────┘
│
┌─────────────────┼─────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ ObjectQL │ │ Memory │ │ Hono │
│ Plugin │ │ Driver │ │ Server │
│ │ │ Plugin │ │ Plugin │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
│ init: │ init: │ init:
│ register │ get objectql │ register
│ 'objectql' │ register driver │ 'http-server'
│ │ │
│ start: │ │ start:
│ init engine │ │ setup routes
│ │ │ listen on port
│ │ │
└─────────────────┴─────────────────┘
│
▼
trigger('kernel:ready')
│
▼
┌──────────────────┐
│ Server Starts │
│ on Port 3000 │
└──────────────────┘
模式 1: 服务注册与消费 (Service Registry)
───────────────────────────────────────────
Provider Plugin Consumer Plugin
│ │
│ init() │
├─ registerService() │
│ │
│ start()
│ ├─ getService()
│ │
└────────────────────────┘
模式 2: 事件钩子 (Event Hooks)
───────────────────────────────────────────
Publisher Plugin Subscriber Plugin
│ │
│ init()
│ ├─ hook('event')
│ │
│ start() │
├─ trigger('event') │
│ │ │
│ └──────────────►│
│ handler()
│ │
模式 3: 依赖声明 (Dependency Declaration)
───────────────────────────────────────────
Plugin A Plugin B
dependencies: [] dependencies: ['plugin-a']
│ │
│ init() │
│ │
└────────┬───────────────┘
│
(Kernel 保证 A 先初始化)
当前架构 (Current):
ObjectKernel → Plugin Interface → Built-in Plugins
未来扩展 (Future):
1. 配置化加载 (Config-based Loading)
┌─────────────────────┐
│ objectstack.config │
│ { │
│ plugins: [ │
│ "objectql", │
│ "hono-server", │
│ "my-plugin" │
│ ] │
│ } │
└──────────┬──────────┘
│
▼
Kernel.loadFromConfig()
2. 插件市场 (Plugin Marketplace)
npm install @company/custom-plugin
│
▼
kernel.use(CustomPlugin)
3. 热加载 (Hot Reload)
kernel.reload('plugin-name')
│
▼
destroy() → init() → start()
4. 沙箱隔离 (Sandboxing)
┌──────────────────┐
│ User Script │
│ (Isolated VM) │
└──────────────────┘
Apache-2.0