evaengine 0.11.2 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ai/analysis.md +657 -0
- package/.ai/architecture/runtime.md +504 -0
- package/.ai/contracts/public-api.md +447 -0
- package/.ai/external-project-guide.md +248 -0
- package/.ai/vision.md +314 -0
- package/README.md +51 -62
- package/bin/engine +15 -21
- package/index.js +2 -18
- package/package.json +60 -64
- package/src/commands/index.js +12 -0
- package/{lib → src}/commands/interface.js +5 -11
- package/src/commands/make_entity.js +490 -0
- package/src/commands/tramp.js +34 -0
- package/{lib → src}/config/index.js +7 -9
- package/{lib → src}/di.js +11 -26
- package/src/engine.js +551 -0
- package/{lib → src}/entities/index.js +72 -82
- package/{lib → src}/exceptions/index.js +71 -92
- package/src/index.js +57 -0
- package/src/middlewares/auth.js +67 -0
- package/src/middlewares/auth_kong.js +28 -0
- package/src/middlewares/debug.js +88 -0
- package/src/middlewares/index.js +18 -0
- package/src/middlewares/providers.js +73 -0
- package/src/middlewares/session.js +58 -0
- package/{lib → src}/middlewares/trace.js +74 -86
- package/src/middlewares/validator.js +50 -0
- package/src/middlewares/view_cache.js +127 -0
- package/{lib → src}/services/cache.js +45 -56
- package/src/services/config.js +111 -0
- package/src/services/env.js +28 -0
- package/src/services/event_manager.js +84 -0
- package/src/services/http_client.js +160 -0
- package/src/services/index.js +27 -0
- package/src/services/interface.js +5 -0
- package/src/services/joi.js +13 -0
- package/src/services/jwt_token.js +89 -0
- package/src/services/jwt_token_kong.js +75 -0
- package/src/services/logger.js +148 -0
- package/src/services/namespace.js +176 -0
- package/src/services/now.js +49 -0
- package/src/services/providers.js +158 -0
- package/src/services/redis.js +55 -0
- package/src/services/rest_client.js +112 -0
- package/src/swagger/index.js +668 -0
- package/{lib → src}/utils/api_scaffold.js +26 -39
- package/src/utils/case_converter.js +33 -0
- package/src/utils/crc32.js +44 -0
- package/src/utils/datetime.js +13 -0
- package/src/utils/host.js +39 -0
- package/src/utils/index.js +35 -0
- package/{lib → src}/utils/pagination.js +22 -31
- package/src/utils/random.js +23 -0
- package/{lib → src}/utils/smart_query.js +27 -27
- package/src/utils/test.js +48 -0
- package/src/utils/wrapper.js +8 -0
- package/bin/engine-babel +0 -38
- package/lib/commands/index.js +0 -25
- package/lib/commands/index.js.map +0 -1
- package/lib/commands/interface.js.map +0 -1
- package/lib/commands/make_entity.js +0 -549
- package/lib/commands/make_entity.js.map +0 -1
- package/lib/commands/tramp.js +0 -53
- package/lib/commands/tramp.js.map +0 -1
- package/lib/config/index.js.map +0 -1
- package/lib/di.js.map +0 -1
- package/lib/engine.js +0 -558
- package/lib/engine.js.map +0 -1
- package/lib/entities/index.js.map +0 -1
- package/lib/exceptions/index.js.map +0 -1
- package/lib/index.js +0 -105
- package/lib/index.js.map +0 -1
- package/lib/middlewares/auth.js +0 -97
- package/lib/middlewares/auth.js.map +0 -1
- package/lib/middlewares/auth_kong.js +0 -48
- package/lib/middlewares/auth_kong.js.map +0 -1
- package/lib/middlewares/debug.js +0 -68
- package/lib/middlewares/debug.js.map +0 -1
- package/lib/middlewares/index.js +0 -45
- package/lib/middlewares/index.js.map +0 -1
- package/lib/middlewares/providers.js +0 -102
- package/lib/middlewares/providers.js.map +0 -1
- package/lib/middlewares/session.js +0 -76
- package/lib/middlewares/session.js.map +0 -1
- package/lib/middlewares/trace.js.map +0 -1
- package/lib/middlewares/validator.js +0 -71
- package/lib/middlewares/validator.js.map +0 -1
- package/lib/middlewares/view_cache.js +0 -160
- package/lib/middlewares/view_cache.js.map +0 -1
- package/lib/services/cache.js.map +0 -1
- package/lib/services/config.js +0 -140
- package/lib/services/config.js.map +0 -1
- package/lib/services/env.js +0 -40
- package/lib/services/env.js.map +0 -1
- package/lib/services/event_manager.js +0 -110
- package/lib/services/event_manager.js.map +0 -1
- package/lib/services/http_client.js +0 -178
- package/lib/services/http_client.js.map +0 -1
- package/lib/services/index.js +0 -70
- package/lib/services/index.js.map +0 -1
- package/lib/services/interface.js +0 -12
- package/lib/services/interface.js.map +0 -1
- package/lib/services/joi.js +0 -28
- package/lib/services/joi.js.map +0 -1
- package/lib/services/jwt_token.js +0 -120
- package/lib/services/jwt_token.js.map +0 -1
- package/lib/services/jwt_token_kong.js +0 -111
- package/lib/services/jwt_token_kong.js.map +0 -1
- package/lib/services/logger.js +0 -172
- package/lib/services/logger.js.map +0 -1
- package/lib/services/namespace.js +0 -188
- package/lib/services/namespace.js.map +0 -1
- package/lib/services/now.js +0 -69
- package/lib/services/now.js.map +0 -1
- package/lib/services/providers.js +0 -195
- package/lib/services/providers.js.map +0 -1
- package/lib/services/redis.js +0 -77
- package/lib/services/redis.js.map +0 -1
- package/lib/services/rest_client.js +0 -136
- package/lib/services/rest_client.js.map +0 -1
- package/lib/swagger/index.js +0 -684
- package/lib/swagger/index.js.map +0 -1
- package/lib/utils/api_scaffold.js.map +0 -1
- package/lib/utils/case_converter.js +0 -48
- package/lib/utils/case_converter.js.map +0 -1
- package/lib/utils/crc32.js +0 -22
- package/lib/utils/crc32.js.map +0 -1
- package/lib/utils/datetime.js +0 -21
- package/lib/utils/datetime.js.map +0 -1
- package/lib/utils/host.js +0 -48
- package/lib/utils/host.js.map +0 -1
- package/lib/utils/index.js +0 -61
- package/lib/utils/index.js.map +0 -1
- package/lib/utils/pagination.js.map +0 -1
- package/lib/utils/random.js +0 -33
- package/lib/utils/random.js.map +0 -1
- package/lib/utils/smart_query.js.map +0 -1
- package/lib/utils/test.js +0 -62
- package/lib/utils/test.js.map +0 -1
- package/lib/utils/wrapper.js +0 -9
- package/lib/utils/wrapper.js.map +0 -1
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
# EvaEngine Runtime Architecture
|
|
2
|
+
|
|
3
|
+
**文档类型**: Runtime Architecture
|
|
4
|
+
**目标读者**: AI Coding Agent
|
|
5
|
+
**适用范围**: EvaEngine Runtime 及其后续演进
|
|
6
|
+
|
|
7
|
+
## 1. Runtime 的目的
|
|
8
|
+
|
|
9
|
+
EvaEngine Runtime 的目的,是把一个 Node.js 应用从“若干可执行模块”组织成“一个具有统一运行规则的应用系统”。
|
|
10
|
+
|
|
11
|
+
Runtime 解决的核心问题不是 HTTP 路由,而是:
|
|
12
|
+
|
|
13
|
+
- 不同应用入口如何共享同一套能力。
|
|
14
|
+
- 基础设施何时创建、如何替换、何时关闭。
|
|
15
|
+
- 配置、日志、缓存、认证、数据库和外部服务如何被统一装配。
|
|
16
|
+
- 应用组件如何在运行前被发现、注册和验证。
|
|
17
|
+
- CLI、Cron、HTTP 等入口如何进入相同的应用执行模型。
|
|
18
|
+
|
|
19
|
+
Runtime 的基本设计判断是:
|
|
20
|
+
|
|
21
|
+
> 入口可以不同,运行时能力和生命周期必须保持一致。
|
|
22
|
+
|
|
23
|
+
## 2. Runtime 的边界
|
|
24
|
+
|
|
25
|
+
Runtime 位于应用入口和基础设施之间:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
External Entry
|
|
29
|
+
HTTP / CLI / Cron / Worker
|
|
30
|
+
|
|
|
31
|
+
v
|
|
32
|
+
Application Runtime
|
|
33
|
+
Context / Providers / DI / Lifecycle
|
|
34
|
+
|
|
|
35
|
+
v
|
|
36
|
+
Application Capabilities
|
|
37
|
+
Config / Logger / Cache / DB / HTTP / Auth / Events
|
|
38
|
+
|
|
|
39
|
+
v
|
|
40
|
+
Infrastructure and Domain
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Runtime 不拥有具体业务规则,也不应成为所有业务逻辑的容器。它负责组装、协调和约束,而不是决定领域行为。
|
|
44
|
+
|
|
45
|
+
## 3. 生命周期
|
|
46
|
+
|
|
47
|
+
### 3.1 生命周期阶段
|
|
48
|
+
|
|
49
|
+
EvaEngine 当前的运行过程可以抽象为:
|
|
50
|
+
|
|
51
|
+
```text
|
|
52
|
+
Construct
|
|
53
|
+
-> Register
|
|
54
|
+
-> Bootstrap
|
|
55
|
+
-> Bind
|
|
56
|
+
-> Execute
|
|
57
|
+
-> Stop
|
|
58
|
+
-> Shutdown
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 3.2 Construct
|
|
62
|
+
|
|
63
|
+
Runtime 首先建立应用上下文,包括:
|
|
64
|
+
|
|
65
|
+
- 项目根目录。
|
|
66
|
+
- 配置目录。
|
|
67
|
+
- 源码目录。
|
|
68
|
+
- 运行模式。
|
|
69
|
+
- 端口和入口相关元数据。
|
|
70
|
+
|
|
71
|
+
设计原因:
|
|
72
|
+
|
|
73
|
+
所有后续组件都应从同一个 Runtime context 获取环境信息,而不是各自推断工作目录、配置位置或运行模式。
|
|
74
|
+
|
|
75
|
+
### 3.3 Register
|
|
76
|
+
|
|
77
|
+
Register 阶段声明 Runtime 将提供哪些能力:
|
|
78
|
+
|
|
79
|
+
- 基础服务。
|
|
80
|
+
- Web 专用服务。
|
|
81
|
+
- CLI 专用服务。
|
|
82
|
+
- Middleware。
|
|
83
|
+
- Command。
|
|
84
|
+
- 可选实现,例如不同 JWT provider。
|
|
85
|
+
|
|
86
|
+
Register 的主要职责是建立组件关系,不应在此阶段执行长时间外部操作。
|
|
87
|
+
|
|
88
|
+
### 3.4 Bootstrap
|
|
89
|
+
|
|
90
|
+
Bootstrap 阶段根据当前运行模式完成 Provider 装配:
|
|
91
|
+
|
|
92
|
+
```text
|
|
93
|
+
Runtime
|
|
94
|
+
-> Service Providers
|
|
95
|
+
-> DI bindings
|
|
96
|
+
-> Service graph
|
|
97
|
+
-> Middleware Providers
|
|
98
|
+
-> middleware bindings
|
|
99
|
+
-> Command registration
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Bootstrap 的意义是让应用在真正执行请求或命令之前拥有一个可预测的能力图谱。
|
|
103
|
+
|
|
104
|
+
### 3.5 Bind
|
|
105
|
+
|
|
106
|
+
Provider 把能力绑定到 DI container。绑定可以是:
|
|
107
|
+
|
|
108
|
+
- Class。
|
|
109
|
+
- Value。
|
|
110
|
+
- Factory/method。
|
|
111
|
+
- 根据配置选择的实现。
|
|
112
|
+
|
|
113
|
+
DI 负责延迟解析和构造对象。这样 Runtime 可以在装配阶段描述依赖,而不需要立即创建所有外部资源。
|
|
114
|
+
|
|
115
|
+
### 3.6 Execute
|
|
116
|
+
|
|
117
|
+
执行阶段由不同入口驱动:
|
|
118
|
+
|
|
119
|
+
- HTTP 请求进入 Express middleware chain。
|
|
120
|
+
- CLI 参数进入 Command。
|
|
121
|
+
- Cron schedule 触发 Command。
|
|
122
|
+
- 未来 Worker 可以进入同一 Command/Use Case boundary。
|
|
123
|
+
|
|
124
|
+
执行阶段应该只依赖已经完成 bootstrap 的 Runtime context。
|
|
125
|
+
|
|
126
|
+
### 3.7 Stop
|
|
127
|
+
|
|
128
|
+
Stop 阶段停止接受新的执行工作:
|
|
129
|
+
|
|
130
|
+
- 停止 Cron 调度。
|
|
131
|
+
- 停止接收新的 HTTP 请求。
|
|
132
|
+
- 停止派发新的后台任务。
|
|
133
|
+
- 等待必要的进行中操作完成。
|
|
134
|
+
|
|
135
|
+
### 3.8 Shutdown
|
|
136
|
+
|
|
137
|
+
Shutdown 阶段释放 Runtime 持有的资源:
|
|
138
|
+
|
|
139
|
+
- Redis/数据库连接。
|
|
140
|
+
- HTTP client 连接。
|
|
141
|
+
- Event/worker 资源。
|
|
142
|
+
- 日志和 tracing buffer。
|
|
143
|
+
- HTTP server。
|
|
144
|
+
|
|
145
|
+
当前实现对 shutdown 的协调仍然不完整。未来 Runtime 应将 shutdown 变成 Provider 的正式契约,而不是由调用者分别清理资源。
|
|
146
|
+
|
|
147
|
+
## 4. 核心组件关系
|
|
148
|
+
|
|
149
|
+
### 4.1 Engine
|
|
150
|
+
|
|
151
|
+
Engine 是 Runtime 的控制中心。它负责:
|
|
152
|
+
|
|
153
|
+
- 识别运行模式。
|
|
154
|
+
- 组织 Provider 注册顺序。
|
|
155
|
+
- 管理 HTTP/CLI/Cron 入口。
|
|
156
|
+
- 保存应用 metadata。
|
|
157
|
+
- 管理 Command registry。
|
|
158
|
+
- 安装默认错误处理。
|
|
159
|
+
- 持有 server 和 Cron 生命周期状态。
|
|
160
|
+
|
|
161
|
+
Engine 不应直接承担领域逻辑。它只应协调入口、能力和生命周期。
|
|
162
|
+
|
|
163
|
+
### 4.2 Runtime Context
|
|
164
|
+
|
|
165
|
+
当前 Runtime context 主要由 Engine metadata、DI container 和运行状态共同表达。
|
|
166
|
+
|
|
167
|
+
概念上,Runtime context 应包含:
|
|
168
|
+
|
|
169
|
+
```text
|
|
170
|
+
RuntimeContext
|
|
171
|
+
metadata
|
|
172
|
+
mode
|
|
173
|
+
configuration
|
|
174
|
+
provider registry
|
|
175
|
+
dependency container
|
|
176
|
+
resource registry
|
|
177
|
+
logger/observability
|
|
178
|
+
shutdown state
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
将这些状态显式集中在 Context 中,可以避免多个 Engine 实例之间共享隐式全局状态。
|
|
182
|
+
|
|
183
|
+
### 4.3 Provider Registry
|
|
184
|
+
|
|
185
|
+
Provider Registry 描述 Runtime 可以装配哪些能力。Provider 的作用是把能力从具体实现中隔离出来。
|
|
186
|
+
|
|
187
|
+
```text
|
|
188
|
+
Provider
|
|
189
|
+
-> choose implementation
|
|
190
|
+
-> configure implementation
|
|
191
|
+
-> bind capability
|
|
192
|
+
-> participate in lifecycle
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
例如,认证能力可以根据配置选择 local JWT 或 Kong JWT;缓存能力可以选择 Redis store 或 Null store。
|
|
196
|
+
|
|
197
|
+
### 4.4 DI Container
|
|
198
|
+
|
|
199
|
+
DI Container 是运行时对象图的解析器,而不是业务注册表。
|
|
200
|
+
|
|
201
|
+
它解决:
|
|
202
|
+
|
|
203
|
+
- 依赖关系解析。
|
|
204
|
+
- 延迟实例化。
|
|
205
|
+
- 测试替换。
|
|
206
|
+
- 命名 capability 绑定。
|
|
207
|
+
|
|
208
|
+
它不应成为业务状态的长期存储,也不应隐藏跨 Runtime 的共享状态。
|
|
209
|
+
|
|
210
|
+
### 4.5 Service Capabilities
|
|
211
|
+
|
|
212
|
+
服务是 Runtime 暴露给应用的能力边界,例如 Config、Logger、Redis、Cache、HTTP client、JWT 和 EventManager。
|
|
213
|
+
|
|
214
|
+
组件关系:
|
|
215
|
+
|
|
216
|
+
```text
|
|
217
|
+
Provider
|
|
218
|
+
-> DI binding
|
|
219
|
+
-> Service capability
|
|
220
|
+
-> Domain/Application consumer
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
应用依赖 capability 的行为,而不是依赖具体第三方库的对象结构。
|
|
224
|
+
|
|
225
|
+
### 4.6 Middleware Runtime
|
|
226
|
+
|
|
227
|
+
Middleware Provider 把认证、Session、Trace、Validation、Debug 和 Cache 等横切能力装配到 HTTP pipeline。
|
|
228
|
+
|
|
229
|
+
```text
|
|
230
|
+
Request
|
|
231
|
+
-> Session
|
|
232
|
+
-> Auth
|
|
233
|
+
-> Validation
|
|
234
|
+
-> Trace/Debug/Cache
|
|
235
|
+
-> Application handler
|
|
236
|
+
-> Error handler
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
Middleware 的设计原因是把跨请求的规则集中处理,避免业务 handler 重复实现安全、日志和观测逻辑。
|
|
240
|
+
|
|
241
|
+
### 4.7 Command Runtime
|
|
242
|
+
|
|
243
|
+
Command 是 CLI、Cron 和未来 Worker 入口的统一适配层。
|
|
244
|
+
|
|
245
|
+
```text
|
|
246
|
+
CLI/Cron/Worker
|
|
247
|
+
-> Command
|
|
248
|
+
-> Application operation
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Command 应保持轻量,负责输入解析和执行编排;业务规则应继续下沉到 Use Case 或 Domain service。
|
|
252
|
+
|
|
253
|
+
## 5. 数据流
|
|
254
|
+
|
|
255
|
+
### 5.1 Bootstrap 数据流
|
|
256
|
+
|
|
257
|
+
```text
|
|
258
|
+
Project metadata
|
|
259
|
+
-> Config path and runtime mode
|
|
260
|
+
-> Config capability
|
|
261
|
+
-> Provider decisions
|
|
262
|
+
-> DI bindings
|
|
263
|
+
-> Resolvable service graph
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
配置首先影响 Runtime context,随后影响 Provider 选择,最后影响具体服务实例。
|
|
267
|
+
|
|
268
|
+
因此配置不是普通的全局变量,而是 Runtime capability 的输入。
|
|
269
|
+
|
|
270
|
+
### 5.2 HTTP 数据流
|
|
271
|
+
|
|
272
|
+
```text
|
|
273
|
+
HTTP request
|
|
274
|
+
-> Runtime middleware chain
|
|
275
|
+
-> request context / namespace
|
|
276
|
+
-> authentication and validation
|
|
277
|
+
-> application handler
|
|
278
|
+
-> injected services
|
|
279
|
+
-> domain/persistence/external APIs
|
|
280
|
+
-> response
|
|
281
|
+
-> logs/traces/cache headers
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
请求数据应沿着明确的边界流动:
|
|
285
|
+
|
|
286
|
+
- Request metadata 由 middleware 提取。
|
|
287
|
+
- Auth 结果写入 request context。
|
|
288
|
+
- 业务逻辑通过 capability 访问外部资源。
|
|
289
|
+
- Response metadata 由 Trace、Cache 和错误处理统一补充。
|
|
290
|
+
|
|
291
|
+
### 5.3 CLI/Cron 数据流
|
|
292
|
+
|
|
293
|
+
```text
|
|
294
|
+
Arguments or schedule
|
|
295
|
+
-> Command metadata
|
|
296
|
+
-> parsed options
|
|
297
|
+
-> Command instance
|
|
298
|
+
-> injected capabilities
|
|
299
|
+
-> application operation
|
|
300
|
+
-> result / error / logs
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
CLI 和 Cron 不应重新创建一套基础设施。它们应复用同一 Runtime provider model。
|
|
304
|
+
|
|
305
|
+
### 5.4 Metadata 数据流
|
|
306
|
+
|
|
307
|
+
```text
|
|
308
|
+
Source / Entity / Exception metadata
|
|
309
|
+
-> scanner/parser
|
|
310
|
+
-> registry or fragment model
|
|
311
|
+
-> generated contract
|
|
312
|
+
-> Swagger/OpenAPI/diagnostic output
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
Metadata pipeline 的目的,是让 Runtime 可以理解和描述应用,而不是只执行应用。
|
|
316
|
+
|
|
317
|
+
## 6. 控制流
|
|
318
|
+
|
|
319
|
+
### 6.1 Web 控制流
|
|
320
|
+
|
|
321
|
+
```text
|
|
322
|
+
new Engine
|
|
323
|
+
-> bootstrap web providers
|
|
324
|
+
-> register middleware
|
|
325
|
+
-> attach error handling
|
|
326
|
+
-> start HTTP server
|
|
327
|
+
-> receive request
|
|
328
|
+
-> execute middleware chain
|
|
329
|
+
-> invoke application handler
|
|
330
|
+
-> finalize response
|
|
331
|
+
-> shutdown on process termination
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
Engine 控制入口,Provider 控制能力,Middleware 控制请求横切行为,Application handler 控制具体业务流程。
|
|
335
|
+
|
|
336
|
+
### 6.2 CLI 控制流
|
|
337
|
+
|
|
338
|
+
```text
|
|
339
|
+
new Engine(cli)
|
|
340
|
+
-> bootstrap CLI providers
|
|
341
|
+
-> register command classes
|
|
342
|
+
-> parse command name and options
|
|
343
|
+
-> instantiate selected command
|
|
344
|
+
-> execute command
|
|
345
|
+
-> report error
|
|
346
|
+
-> release resources
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
Command registry 是 CLI 控制流中的路由表。Command name 是外部入口到应用操作之间的稳定标识。
|
|
350
|
+
|
|
351
|
+
### 6.3 Cron 控制流
|
|
352
|
+
|
|
353
|
+
```text
|
|
354
|
+
register schedule
|
|
355
|
+
-> validate command exists
|
|
356
|
+
-> create scheduler handle
|
|
357
|
+
-> invoke command per schedule
|
|
358
|
+
-> retain handle
|
|
359
|
+
-> clear handles during stop
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
Cron handler 必须可被追踪和清理。调度器不能成为脱离 Runtime 生命周期的后台资源。
|
|
363
|
+
|
|
364
|
+
### 6.4 错误控制流
|
|
365
|
+
|
|
366
|
+
```text
|
|
367
|
+
failure in capability / middleware / command
|
|
368
|
+
-> wrapper or runtime boundary
|
|
369
|
+
-> normalized error
|
|
370
|
+
-> application error handler
|
|
371
|
+
-> log/trace
|
|
372
|
+
-> protocol-specific response or process result
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
错误处理的目的不是隐藏错误,而是让错误在正确的 Runtime boundary 被分类、观测和转换。
|
|
376
|
+
|
|
377
|
+
## 7. 扩展点
|
|
378
|
+
|
|
379
|
+
### 7.1 Service Provider
|
|
380
|
+
|
|
381
|
+
最主要的 Runtime 扩展点。
|
|
382
|
+
|
|
383
|
+
适用于:
|
|
384
|
+
|
|
385
|
+
- 新增基础设施能力。
|
|
386
|
+
- 替换现有实现。
|
|
387
|
+
- 根据配置选择实现。
|
|
388
|
+
- 为测试提供 fake capability。
|
|
389
|
+
|
|
390
|
+
新增 Provider 时必须定义:
|
|
391
|
+
|
|
392
|
+
- capability name。
|
|
393
|
+
- 输入配置。
|
|
394
|
+
- 依赖关系。
|
|
395
|
+
- 实例生命周期。
|
|
396
|
+
- 失败语义。
|
|
397
|
+
- shutdown 行为。
|
|
398
|
+
|
|
399
|
+
### 7.2 Middleware Provider
|
|
400
|
+
|
|
401
|
+
适用于 HTTP 横切能力:
|
|
402
|
+
|
|
403
|
+
- Authentication。
|
|
404
|
+
- Authorization。
|
|
405
|
+
- Validation。
|
|
406
|
+
- Tracing。
|
|
407
|
+
- Request/response logging。
|
|
408
|
+
- Rate limiting。
|
|
409
|
+
- Caching。
|
|
410
|
+
|
|
411
|
+
Middleware 不应直接把不可替换的基础设施对象暴露给业务层。
|
|
412
|
+
|
|
413
|
+
### 7.3 Command
|
|
414
|
+
|
|
415
|
+
适用于 CLI、Cron 和 Worker adapter。Command 应声明自己的名称、描述和输入规格,并将业务执行交给 Use Case。
|
|
416
|
+
|
|
417
|
+
### 7.4 Capability Adapter
|
|
418
|
+
|
|
419
|
+
当接入新的数据库、消息系统、外部 API 或观测系统时,应先增加 capability adapter,再由 Provider 绑定,而不是从 Engine 或业务代码直接调用第三方库。
|
|
420
|
+
|
|
421
|
+
### 7.5 Metadata Provider
|
|
422
|
+
|
|
423
|
+
适用于:
|
|
424
|
+
|
|
425
|
+
- OpenAPI/Swagger。
|
|
426
|
+
- Domain schema。
|
|
427
|
+
- AI tool schema。
|
|
428
|
+
- Command catalog。
|
|
429
|
+
- Event schema。
|
|
430
|
+
- Runtime diagnostics。
|
|
431
|
+
|
|
432
|
+
Metadata provider 必须使用明确 schema,不应依赖无法解释的隐式扫描结果。
|
|
433
|
+
|
|
434
|
+
## 8. 设计限制
|
|
435
|
+
|
|
436
|
+
### 8.1 当前生命周期不完整
|
|
437
|
+
|
|
438
|
+
Provider 当前以注册为主,boot/start/stop/shutdown 语义尚未完全统一。因此资源创建和释放仍可能分散在 Service、Engine 或调用者中。
|
|
439
|
+
|
|
440
|
+
### 8.2 全局状态风险
|
|
441
|
+
|
|
442
|
+
DI、Express app、配置、Redis client 或其他 registry 如果以全局状态存在,会限制多 Runtime 并存、测试隔离和多租户场景。
|
|
443
|
+
|
|
444
|
+
### 8.3 DI 是运行时类型系统
|
|
445
|
+
|
|
446
|
+
命名 DI 缺少编译期检查。错误的名称、错误的绑定顺序和错误的实例类型可能在运行时才暴露。
|
|
447
|
+
|
|
448
|
+
### 8.4 Entity 与 Persistence 耦合
|
|
449
|
+
|
|
450
|
+
Entity runtime 同时承担模型扫描、ORM model、查询和 metadata 来源。它不等同于独立 Domain Entity。
|
|
451
|
+
|
|
452
|
+
### 8.5 EventManager 不是可靠消息系统
|
|
453
|
+
|
|
454
|
+
进程内事件不提供持久化、重试、跨进程传递或 dead-letter 语义。
|
|
455
|
+
|
|
456
|
+
### 8.6 Middleware 顺序是隐含契约
|
|
457
|
+
|
|
458
|
+
Session、Auth、Trace、Validation、Cache 和 Error handler 的顺序会影响行为。新增 middleware 时必须明确其前置依赖和响应阶段行为。
|
|
459
|
+
|
|
460
|
+
### 8.7 自动扫描带来隐式依赖
|
|
461
|
+
|
|
462
|
+
文件扫描和 metadata 推断降低了配置成本,但也会使依赖关系不明显。扫描失败、文件命名变化或 schema 变化必须具有可诊断错误。
|
|
463
|
+
|
|
464
|
+
### 8.8 第三方实现不属于 Runtime contract
|
|
465
|
+
|
|
466
|
+
Redis client、ORM、HTTP client、logger、scheduler 等库都应被视为可替换实现。Runtime contract 不应暴露它们的内部字段、生命周期或错误类型,除非这是明确的兼容性承诺。
|
|
467
|
+
|
|
468
|
+
## 9. AI Agent 修改规则
|
|
469
|
+
|
|
470
|
+
AI Agent 在修改 Runtime 相关代码时,应按以下顺序判断:
|
|
471
|
+
|
|
472
|
+
1. 这是入口控制、能力装配、请求流、命令流还是资源生命周期问题?
|
|
473
|
+
2. 修改的是 public contract 还是内部实现?
|
|
474
|
+
3. 是否改变了 Provider 注册顺序或依赖图?
|
|
475
|
+
4. 是否引入了新的全局状态或隐式 singleton?
|
|
476
|
+
5. 是否需要新的 shutdown 行为?
|
|
477
|
+
6. 是否改变了 HTTP、CLI、Cron 之间的共享语义?
|
|
478
|
+
7. 是否需要 capability contract test,而不仅是单元测试?
|
|
479
|
+
8. 是否可以通过 adapter 隔离第三方依赖?
|
|
480
|
+
|
|
481
|
+
默认原则:
|
|
482
|
+
|
|
483
|
+
- 先保持 Runtime 语义,再优化实现。
|
|
484
|
+
- 先定义边界,再添加依赖。
|
|
485
|
+
- 先补生命周期,再引入长连接或后台任务。
|
|
486
|
+
- 先验证错误和关闭路径,再验证 happy path。
|
|
487
|
+
- 不把 Domain logic 放入 Engine、Provider 或 Middleware。
|
|
488
|
+
|
|
489
|
+
## 10. Runtime 结论
|
|
490
|
+
|
|
491
|
+
EvaEngine Runtime 的价值在于统一应用入口、集中装配能力、控制基础设施边界,并让应用可以在 Web、CLI 和 Cron 等运行模式之间共享同一套架构语义。
|
|
492
|
+
|
|
493
|
+
它的核心不是 Engine 对象本身,而是以下关系:
|
|
494
|
+
|
|
495
|
+
```text
|
|
496
|
+
Runtime controls lifecycle
|
|
497
|
+
Provider composes capabilities
|
|
498
|
+
DI resolves dependencies
|
|
499
|
+
Middleware shapes request flow
|
|
500
|
+
Command adapts non-HTTP entry points
|
|
501
|
+
Metadata explains application structure
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
未来 Runtime 的演进方向,应继续保留这些关系,同时加强 Context 隔离、Provider lifecycle、类型安全、可观测性和可靠资源关闭。
|