@taicode/common-server 4.0.0-beta.4 → 4.0.0-beta.6
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/LICENSE +21 -0
- package/output/app/index.d.ts +2 -1
- package/output/app/index.d.ts.map +1 -1
- package/output/app/index.js +47 -14
- package/output/auth/index.d.ts +3 -3
- package/output/auth/index.d.ts.map +1 -1
- package/output/auth/index.js +3 -2
- package/output/core/boot/context.d.ts +54 -34
- package/output/core/boot/context.d.ts.map +1 -1
- package/output/core/boot/context.js +42 -4
- package/output/core/boot/lifecycle.d.ts +39 -7
- package/output/core/boot/lifecycle.d.ts.map +1 -1
- package/output/core/boot/lifecycle.js +59 -19
- package/output/core/boot/shutdown.d.ts +9 -5
- package/output/core/boot/shutdown.d.ts.map +1 -1
- package/output/core/boot/shutdown.js +9 -4
- package/output/core/boot/signal.d.ts +1 -1
- package/output/core/boot/signal.js +1 -1
- package/output/core/boot/steps.d.ts +60 -29
- package/output/core/boot/steps.d.ts.map +1 -1
- package/output/core/boot/steps.js +72 -13
- package/output/core/entries.d.ts +49 -22
- package/output/core/entries.d.ts.map +1 -1
- package/output/core/entries.js +64 -30
- package/output/core/entries.test.js +251 -10
- package/output/core/env.d.ts +21 -0
- package/output/core/env.d.ts.map +1 -1
- package/output/core/env.js +28 -0
- package/output/core/resource.d.ts +56 -0
- package/output/core/resource.d.ts.map +1 -0
- package/output/core/resource.js +56 -0
- package/output/core/test-support/database.d.ts +2 -9
- package/output/core/test-support/database.d.ts.map +1 -1
- package/output/core/test-support/database.js +3 -16
- package/output/core/test-support/database.test.js +2 -1
- package/output/core/test-support/environment.d.ts +8 -3
- package/output/core/test-support/environment.d.ts.map +1 -1
- package/output/core/test-support/environment.js +10 -7
- package/output/core/test-support/test-server.d.ts +49 -19
- package/output/core/test-support/test-server.d.ts.map +1 -1
- package/output/core/test-support/test-server.js +22 -6
- package/output/core/test-support/test-server.test.js +7 -5
- package/output/core/test-support/testdata.d.ts +148 -0
- package/output/core/test-support/testdata.d.ts.map +1 -0
- package/output/core/test-support/testdata.js +202 -0
- package/output/core/test-support/testdata.test.d.ts +2 -0
- package/output/core/test-support/testdata.test.d.ts.map +1 -0
- package/output/core/test-support/testdata.test.js +220 -0
- package/output/core/types.d.ts +235 -71
- package/output/core/types.d.ts.map +1 -1
- package/output/cors/index.d.ts +2 -2
- package/output/cors/index.d.ts.map +1 -1
- package/output/cors/index.js +2 -1
- package/output/rate-limit/index.d.ts +2 -2
- package/output/rate-limit/index.d.ts.map +1 -1
- package/output/rate-limit/index.js +2 -1
- package/package.json +14 -15
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 TaicodeLabs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/output/app/index.d.ts
CHANGED
|
@@ -6,7 +6,8 @@ export { createCorsMiddleware } from '../cors/index.js';
|
|
|
6
6
|
export { createAuthMiddleware } from '../auth/index.js';
|
|
7
7
|
export { createRateLimitMiddleware } from '../rate-limit/index.js';
|
|
8
8
|
export { createRedis, createCache } from '../redis/index.js';
|
|
9
|
-
export
|
|
9
|
+
export { defineResource } from '../core/resource.js';
|
|
10
|
+
export type { AppEnv, AppInstance, ClientsContext, ClientsFactory, ClientsView, ConfigContext, LoggerLike, Middleware, MiddlewareContext, MiddlewareEntry, MiddlewareUnit, ResourceUnit, ResourcesContext, ResourcesView, RouterContext, ServiceContext, } from '../core/types.js';
|
|
10
11
|
export type { AuthVerifyInput, AuthVerifyMetadata, AuthVerifyResult } from '../auth/index.js';
|
|
11
12
|
export type { AuthMiddlewareOptions } from '../auth/index.js';
|
|
12
13
|
export type { AuthClient, AuthVerifyPayload, RegisterPermissionOperationsPayload, } from '../core/modules/auth-provider/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/app/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/app/index.ts"],"names":[],"mappings":"AA8HA,OAAO,yBAAyB,CAAA;AAGhC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAiE/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAA;AAyBtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAA;AAiC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAiBlE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAsB5D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAGpD,YAAY,EACV,MAAM,EACN,WAAW,EACX,cAAc,EACd,cAAc,EACd,WAAW,EACX,aAAa,EACb,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,cAAc,GACf,MAAM,kBAAkB,CAAA;AAEzB,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAC7F,YAAY,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAC7D,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,mCAAmC,GACpC,MAAM,wCAAwC,CAAA;AAC/C,YAAY,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAA"}
|
package/output/app/index.js
CHANGED
|
@@ -15,20 +15,23 @@
|
|
|
15
15
|
// export const server = defineServer({
|
|
16
16
|
// app: { service: 'release', title: 'Release Service', version: packageJson.version },
|
|
17
17
|
//
|
|
18
|
-
// // 我们拥有的基础设施:**只读 env
|
|
18
|
+
// // 我们拥有的基础设施:**只读 env**,构造时不建连。
|
|
19
|
+
// // 要扩展 env 类型?两种写法:① 手写首位泛型 `defineServer<{ FOO?: string }>({...})`(简单,但
|
|
20
|
+
// // 其余泛型会退化为 object);② 给工厂 ctx 标注 `ResourcesContext<{ FOO?: string }>`(其余泛型照常推导)。
|
|
21
|
+
// // 加载都走内置逻辑,框架不提供自定义加载。
|
|
19
22
|
// resources: ({ env, disposer }) => ({ database: createDatabase(env.DATABASE_URL) }),
|
|
20
23
|
//
|
|
21
24
|
// // 启动期的配置快照:可以读库,一次读完、进程内不再变
|
|
22
25
|
// config: ({ resources }) => loadConfig(resources),
|
|
23
26
|
//
|
|
24
|
-
// //
|
|
27
|
+
// // 可选:我们调用的外部服务(地址 / 凭证来自 config,故排在 config 之后);没有就省略
|
|
25
28
|
// clients: ({ config }) => ({ webhook: createWebhookClient(config.webhook) }),
|
|
26
29
|
//
|
|
27
30
|
// // 业务单元:**服务之间禁止互依**,要共享的东西放 clients
|
|
28
31
|
// services: ({ resources, config, clients }) => ({ user: createUserService({ resources, config, clients }) }),
|
|
29
32
|
//
|
|
30
|
-
// //
|
|
31
|
-
// middlewares: (ctx) =>
|
|
33
|
+
// // 中间件:**有序数组,数组位置即注册序**;标准工厂返回具名单元,直接按序摆进去
|
|
34
|
+
// middlewares: (ctx) => [createCorsMiddleware(ctx), createAuthMiddleware(ctx, { client })],
|
|
32
35
|
//
|
|
33
36
|
// // 业务路由:**只能拿 app / services / clients**(绕不过 service 直连数据层)
|
|
34
37
|
// routers: ({ app, services }) => {
|
|
@@ -59,13 +62,18 @@
|
|
|
59
62
|
//
|
|
60
63
|
// | 槽位 | ctx 里有 | 刻意没有 | 为什么 |
|
|
61
64
|
// |---|---|---|---|
|
|
62
|
-
// | `resources` | `env
|
|
63
|
-
// | `config` | `env
|
|
64
|
-
// | `clients
|
|
65
|
+
// | `resources` | `env`(可标注扩展) / `log` / `disposer` / `registerClassifyError` | `config` / `services` / `app` | 资源只依赖 env,从结构上消灭「资源依赖配置」的循环 |
|
|
66
|
+
// | `config` | `env`(可标注扩展) / `log` / `disposer` / `resources` | `services` / `app` | 此时服务还没构造 |
|
|
67
|
+
// | `clients`(可选) | `log` / `disposer` / `resources` / `config` | `env` / `services` / `app` | 运行期不许回头读 env;客户端地址来自 config |
|
|
65
68
|
// | `services` | `log` / `disposer` / `resources` / `config` / `clients` | `env` / `services` / `app` | 服务层属运行期;禁 service 互依 |
|
|
66
69
|
// | `middlewares` | `app` / `log` / `disposer` / `services` / `config` / `clients` | `resources` / `env` | 中间件碰数据必须穿过 service |
|
|
67
70
|
// | `routers` | `app` / `log` / `disposer` / `services` / `clients` | `resources` / `env` / `config` | 路由只能穿过 service |
|
|
68
71
|
//
|
|
72
|
+
// 唯一的**可选**槽位是 `clients`(省略即空客户端包);其余槽位恒定,没有业务路由也要写
|
|
73
|
+
// `routers: () => {}`。应用扩展 env **不是槽位**,而是 `defineServer` 的**第一个泛型**:可手写
|
|
74
|
+
// `defineServer<{ FOO?: string }>({...})`(简单,但其余泛型退化为 object),或给 `resources` /
|
|
75
|
+
// `config` 的 `ctx` 标注 `ResourcesContext<Env>`(其余泛型照常推导)。加载仍走内置逻辑,框架不提供自定义加载。
|
|
76
|
+
//
|
|
69
77
|
// 资源释放**在创建处登记**:`ctx.disposer.add(() => closeXxx())`,关闭时框架按阶段逆序 flush,
|
|
70
78
|
// 调用方不需要在任何地方再写一遍 close 逻辑。
|
|
71
79
|
//
|
|
@@ -141,7 +149,7 @@ export { defineServer, startServer, generateOpenApi } from '../core/entries.js';
|
|
|
141
149
|
// })
|
|
142
150
|
//
|
|
143
151
|
// afterAll(async () => {
|
|
144
|
-
// await testServer.app.close() //
|
|
152
|
+
// await testServer.app.close() // 八步关闭,与生产同一条路径
|
|
145
153
|
// })
|
|
146
154
|
//
|
|
147
155
|
// beforeEach(async () => {
|
|
@@ -210,16 +218,20 @@ export { createTestServer } from '../core/test-support/test-server.js';
|
|
|
210
218
|
export { loadRuntimeEnvironment } from '../core/test-support/environment.js';
|
|
211
219
|
// ── 可替换的标准中间件工厂 ────────────────────────────────────────
|
|
212
220
|
//
|
|
213
|
-
// 只在**要改默认行为**时才出现;不写就是框架默认。三者都接收 `middlewares` 槽位的 `ctx
|
|
221
|
+
// 只在**要改默认行为**时才出现;不写就是框架默认。三者都接收 `middlewares` 槽位的 `ctx`,
|
|
222
|
+
// 都返回**具名单元**(`MiddlewareUnit`),按顺序摆进 `middlewares` 数组即可:
|
|
214
223
|
//
|
|
215
224
|
// ```ts
|
|
216
|
-
// middlewares: (ctx) =>
|
|
217
|
-
//
|
|
218
|
-
//
|
|
219
|
-
//
|
|
220
|
-
//
|
|
225
|
+
// middlewares: (ctx) => [
|
|
226
|
+
// createCorsMiddleware(ctx), // 允许的源来自 config 的 `cors` 键(请求期现读)
|
|
227
|
+
// createAuthMiddleware(ctx, { client }), // client 必填:鉴权提供方实现
|
|
228
|
+
// createRateLimitMiddleware(ctx, { store }), // store 可选,缺省进程内 memory
|
|
229
|
+
// ]
|
|
221
230
|
// ```
|
|
222
231
|
//
|
|
232
|
+
// **数组位置即注册序**(cors → auth → rateLimit):不再用对象键序(键序由引擎决定、纯数字键
|
|
233
|
+
// 还会被重排)。要插入自定义中间件,返回具名单元 `{ name, register }` 或一个裸注册函数即可。
|
|
234
|
+
//
|
|
223
235
|
// `cors` / `rateLimit` 都**没有行为开关**,配置面只有输入参数:
|
|
224
236
|
// - `cors`:允许的源来自 `config.cors`(`{ enabled, origins }`);未配置 → 放行任意源并 warn 一次。
|
|
225
237
|
// - `rateLimit`:**限流规则写在路由上**,不在中间件里:
|
|
@@ -254,3 +266,24 @@ export { createRateLimitMiddleware } from '../rate-limit/index.js';
|
|
|
254
266
|
// Redis」因此是结构性的,而不是靠调用方自觉。`createCache` 不传 `redis` 也能用(自建客户端,
|
|
255
267
|
// 或在没有 `REDIS_URL` 时退化成纯进程内一级缓存)。
|
|
256
268
|
export { createRedis, createCache } from '../redis/index.js';
|
|
269
|
+
// ── 资源单元(槽位内的生命周期)────────────────────────────────
|
|
270
|
+
//
|
|
271
|
+
// 资源多是第三方对象(PrismaClient / Redis client),形状改不了,所以 `setup()` 挂在外壳上:
|
|
272
|
+
//
|
|
273
|
+
// ```ts
|
|
274
|
+
// resources: (ctx) => ({
|
|
275
|
+
// database: defineResource(createPrisma(ctx.env.DATABASE_URL), {
|
|
276
|
+
// async setup() { await pushSchema(ctx.env.DATABASE_URL) }, // 框架在 config 之前调
|
|
277
|
+
// }),
|
|
278
|
+
// })
|
|
279
|
+
// ```
|
|
280
|
+
//
|
|
281
|
+
// 两个生命周期各管一段:
|
|
282
|
+
// - `setup()` 框架在 `config` 之前调(两个入口都跑);
|
|
283
|
+
// - `dispose()` 框架在关闭流程最后一步调(两个入口都跑)。
|
|
284
|
+
//
|
|
285
|
+
// 「用例之间重置数据」(清表、清缓存、重新插入样本数据)**不在资源上**:资源只知道有哪些表 /
|
|
286
|
+
// 哪些 key,不知道谁往里写了什么。它由一套独立机制承担:`packages/server/testdata/*.ts|js`,
|
|
287
|
+
// 每个脚本自带 `load()` / `cleanup()`,框架在 `development` / `test` 下自动装载并执行。
|
|
288
|
+
// 详见 `createTestServer` 的 `resetTestData()`。
|
|
289
|
+
export { defineResource } from '../core/resource.js';
|
package/output/auth/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AuthClient, AuthVerifyPayload } from '../core/modules/auth-provider/index.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { MiddlewareContext, MiddlewareUnit } from '../core/types.js';
|
|
3
3
|
/**
|
|
4
4
|
* 标准中间件单元 `auth`(可替换)。
|
|
5
5
|
*
|
|
@@ -63,10 +63,10 @@ export interface AuthMiddlewareOptions {
|
|
|
63
63
|
cookieNames?: readonly string[];
|
|
64
64
|
}
|
|
65
65
|
/**
|
|
66
|
-
* 构造标准 `auth`
|
|
66
|
+
* 构造标准 `auth` 中间件(具名单元 `name: 'auth'`)。
|
|
67
67
|
*
|
|
68
68
|
* `client` **必填**(类型上)且必须有运行期实现:装了鉴权却没有校验实现是配置错误,
|
|
69
69
|
* 构造期直接抛错——不留「请求期才 fail-closed」的窗口,也不允许静默放行。
|
|
70
70
|
*/
|
|
71
|
-
export declare function createAuthMiddleware<C = unknown, S = unknown>(ctx: MiddlewareContext<C, S>, options: AuthMiddlewareOptions):
|
|
71
|
+
export declare function createAuthMiddleware<C = unknown, S = unknown>(ctx: MiddlewareContext<C, S>, options: AuthMiddlewareOptions): MiddlewareUnit;
|
|
72
72
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/auth/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAA;AAG3F,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/auth/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAA;AAG3F,OAAO,KAAK,EAAuC,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAG9G;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,gCAAgC;AAChC,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAA;AAE/C,4CAA4C;AAC5C,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AAElG;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;;;OAOG;IACH,MAAM,EAAE,UAAU,CAAA;IAClB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAChC;AAqID;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,qBAAqB,GAAG,cAAc,CAoE3I"}
|
package/output/auth/index.js
CHANGED
|
@@ -110,7 +110,7 @@ async function submitPermissionOperations(client, log, identity, operations) {
|
|
|
110
110
|
log.info({ service, version, count: operations.length }, '[PermissionOperation][auth] 权限目录自注册完成');
|
|
111
111
|
}
|
|
112
112
|
/**
|
|
113
|
-
* 构造标准 `auth`
|
|
113
|
+
* 构造标准 `auth` 中间件(具名单元 `name: 'auth'`)。
|
|
114
114
|
*
|
|
115
115
|
* `client` **必填**(类型上)且必须有运行期实现:装了鉴权却没有校验实现是配置错误,
|
|
116
116
|
* 构造期直接抛错——不留「请求期才 fail-closed」的窗口,也不允许静默放行。
|
|
@@ -120,7 +120,7 @@ export function createAuthMiddleware(ctx, options) {
|
|
|
120
120
|
if (!client || typeof client.verify !== 'function') {
|
|
121
121
|
throw new Error('[auth] auth 中间件缺少校验实现:请通过 `createAuthMiddleware(ctx, { client })` 注入鉴权提供方');
|
|
122
122
|
}
|
|
123
|
-
|
|
123
|
+
const register = (app) => {
|
|
124
124
|
const identity = readServerIdentity(app);
|
|
125
125
|
if (!identity) {
|
|
126
126
|
throw new Error('[auth] 读不到身份块:`createAuthMiddleware` 必须挂在 `startServer` / `generateOpenApi` 的 app 上');
|
|
@@ -173,4 +173,5 @@ export function createAuthMiddleware(ctx, options) {
|
|
|
173
173
|
await submitPermissionOperations(client, ctx.log, identity, collectPermissionOperations(app, ctx.log));
|
|
174
174
|
});
|
|
175
175
|
};
|
|
176
|
+
return { name: 'auth', register };
|
|
176
177
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import type { ResourceSetupUnit } from './lifecycle.js';
|
|
1
2
|
import type { Disposer } from '@taicode/common-base';
|
|
2
|
-
import type {
|
|
3
|
-
import type { AppInstance, ClientsContext, ClientsView, ConfigContext, ErrorClassifier, LoggerLike, MiddlewareContext, ResourcesContext, ResourcesView, RouterContext, ServiceContext } from '../types.js';
|
|
3
|
+
import type { AppEnv, AppInstance, ClientsContext, ClientsView, ConfigContext, ErrorClassifier, LoggerLike, MiddlewareContext, ResourcesContext, ResourcesView, RouterContext, ServiceContext } from '../types.js';
|
|
4
4
|
/**
|
|
5
5
|
* 分阶段 ctx 的运行时构造(N1 §2)。
|
|
6
6
|
*
|
|
@@ -8,10 +8,30 @@ import type { AppInstance, ClientsContext, ClientsView, ConfigContext, ErrorClas
|
|
|
8
8
|
* (`generateOpenApi` 不跑 `config` 槽位)读到它时抛 `SystemError('CONFIG_UNAVAILABLE')`
|
|
9
9
|
* —— 让「构造期不得读配置」有运行期护栏,而不仅是文档规则。
|
|
10
10
|
*/
|
|
11
|
-
/**
|
|
11
|
+
/**
|
|
12
|
+
* 运行时镜像 `Live<Value>`:剔除值为 `false` 的键(编译期静态关闭)。
|
|
13
|
+
*
|
|
14
|
+
* `resources` 与 `clients` 两个槽位共用这套口径。
|
|
15
|
+
*/
|
|
12
16
|
export declare function liveResources(resources: object): Record<string, unknown>;
|
|
13
|
-
/**
|
|
14
|
-
|
|
17
|
+
/**
|
|
18
|
+
* 把 `resources(ctx)` 的返回值拆成「对外视图」与「可执行生命周期列表」。
|
|
19
|
+
*
|
|
20
|
+
* 三件事:
|
|
21
|
+
* - **解包**:`defineResource(client, …)` → 视图里是 `client` 本身;裸对象原样(单元可选);
|
|
22
|
+
* - **收集**:有 `setup` / `dispose` 的单元按**对象声明序**收集成
|
|
23
|
+
* `{ name, setup, dispose }`,分别交给 `setupResourceUnits` / `disposeResourceUnits`
|
|
24
|
+
* 执行;
|
|
25
|
+
* - **剔除**:`false` 键与 `liveResources` 同口径(静态关闭的资源不参与生命周期)。
|
|
26
|
+
*
|
|
27
|
+
* ❗识别靠 `'value' in obj && !('then' in obj)`:`Resources` 允许是 Promise(`Awaited<>`
|
|
28
|
+
* 归一),但**单个资源值本身是 thenable 的极端情况**不当单元——宁可把它当裸值,
|
|
29
|
+
* 也不要把它错当单元。
|
|
30
|
+
*/
|
|
31
|
+
export declare function splitResourceUnits(resources: object): {
|
|
32
|
+
view: Record<string, unknown>;
|
|
33
|
+
units: ResourceSetupUnit[];
|
|
34
|
+
};
|
|
15
35
|
/**
|
|
16
36
|
* `config` 槽位的**读取能力**(不是容器)。
|
|
17
37
|
*
|
|
@@ -22,68 +42,68 @@ export declare function liveClients(clients: object): Record<string, unknown>;
|
|
|
22
42
|
* 写入通道是**私有 Symbol**(本文件内、不导出):调用方连键名都写不出来,只能通过
|
|
23
43
|
* `provideConfig()` 写,而它只被 `buildConfig` 调用。
|
|
24
44
|
*/
|
|
25
|
-
export interface ConfigAccess<
|
|
45
|
+
export interface ConfigAccess<Config> {
|
|
26
46
|
/** `config` 槽位是否已产出(出 spec 路径恒为 `false`) */
|
|
27
47
|
readonly available: boolean;
|
|
28
48
|
/** 读配置;未产出时抛 `SystemError('CONFIG_UNAVAILABLE')` */
|
|
29
|
-
read(): Awaited<
|
|
49
|
+
read(): Awaited<Config>;
|
|
30
50
|
}
|
|
31
|
-
export declare function createConfigAccess<
|
|
51
|
+
export declare function createConfigAccess<Config>(): ConfigAccess<Config>;
|
|
32
52
|
/** 写入 `config` 产物(唯一的写入口:由 `buildConfig` 调用,不在 `BootContext` 上暴露) */
|
|
33
|
-
export declare function provideConfig<
|
|
53
|
+
export declare function provideConfig<Config>(access: ConfigAccess<Config>, value: Awaited<Config>): void;
|
|
34
54
|
/** 按**已知键**从配置值里取字段(框架内置单元消费配置的单一入口;不做形状校验) */
|
|
35
55
|
export declare function readConfigKey(config: unknown, key: string): unknown;
|
|
36
56
|
/** `resources(ctx)` 入参 */
|
|
37
|
-
export interface ResourcesContextParams {
|
|
38
|
-
env:
|
|
57
|
+
export interface ResourcesContextParams<Env = object> {
|
|
58
|
+
env: AppEnv<Env>;
|
|
39
59
|
log: LoggerLike;
|
|
40
60
|
disposer: Disposer;
|
|
41
61
|
/** 收集器:`buildResources` 注入,把各资源注册的分类器按注册顺序收起来 */
|
|
42
62
|
registerClassifyError: (classifier: ErrorClassifier) => void;
|
|
43
63
|
}
|
|
44
|
-
export declare function createResourcesContext(params: ResourcesContextParams): ResourcesContext
|
|
64
|
+
export declare function createResourcesContext<Env = object>(params: ResourcesContextParams<Env>): ResourcesContext<Env>;
|
|
45
65
|
/** `config(ctx)` 入参 */
|
|
46
|
-
export interface ConfigContextParams<
|
|
47
|
-
env:
|
|
66
|
+
export interface ConfigContextParams<Resources, Env = object> {
|
|
67
|
+
env: AppEnv<Env>;
|
|
48
68
|
log: LoggerLike;
|
|
49
69
|
disposer: Disposer;
|
|
50
|
-
resources: ResourcesView<
|
|
70
|
+
resources: ResourcesView<Resources>;
|
|
51
71
|
}
|
|
52
|
-
export declare function createConfigContext<
|
|
72
|
+
export declare function createConfigContext<Resources, Env = object>(params: ConfigContextParams<Resources, Env>): ConfigContext<Resources, Env>;
|
|
53
73
|
/** `clients(ctx)` 入参(与 `services` 同依赖集:`resources` + `config`) */
|
|
54
|
-
export interface ClientsContextParams<
|
|
74
|
+
export interface ClientsContextParams<Resources, Config> {
|
|
55
75
|
log: LoggerLike;
|
|
56
76
|
disposer: Disposer;
|
|
57
|
-
resources: ResourcesView<
|
|
58
|
-
configAccess: ConfigAccess<
|
|
77
|
+
resources: ResourcesView<Resources>;
|
|
78
|
+
configAccess: ConfigAccess<Config>;
|
|
59
79
|
}
|
|
60
|
-
export declare function createClientsContext<
|
|
80
|
+
export declare function createClientsContext<Resources, Config>(params: ClientsContextParams<Resources, Config>): ClientsContext<Resources, Config>;
|
|
61
81
|
/** `services(ctx)` 入参 */
|
|
62
|
-
export interface ServiceContextParams<
|
|
82
|
+
export interface ServiceContextParams<Resources, Config, Clients> {
|
|
63
83
|
log: LoggerLike;
|
|
64
84
|
disposer: Disposer;
|
|
65
|
-
resources: ResourcesView<
|
|
66
|
-
configAccess: ConfigAccess<
|
|
67
|
-
clients: ClientsView<
|
|
85
|
+
resources: ResourcesView<Resources>;
|
|
86
|
+
configAccess: ConfigAccess<Config>;
|
|
87
|
+
clients: ClientsView<Clients>;
|
|
68
88
|
}
|
|
69
|
-
export declare function createServiceContext<
|
|
89
|
+
export declare function createServiceContext<Resources, Config, Clients>(params: ServiceContextParams<Resources, Config, Clients>): ServiceContext<Resources, Config, Clients>;
|
|
70
90
|
/** `middlewares(ctx)` 入参 */
|
|
71
|
-
export interface MiddlewareContextParams<
|
|
91
|
+
export interface MiddlewareContextParams<Config, Services, Clients> {
|
|
72
92
|
app: AppInstance;
|
|
73
93
|
log: LoggerLike;
|
|
74
94
|
disposer: Disposer;
|
|
75
|
-
services: Awaited<
|
|
76
|
-
configAccess: ConfigAccess<
|
|
77
|
-
clients: ClientsView<
|
|
95
|
+
services: Awaited<Services>;
|
|
96
|
+
configAccess: ConfigAccess<Config>;
|
|
97
|
+
clients: ClientsView<Clients>;
|
|
78
98
|
}
|
|
79
|
-
export declare function createMiddlewareContext<
|
|
99
|
+
export declare function createMiddlewareContext<Config, Services, Clients>(params: MiddlewareContextParams<Config, Services, Clients>): MiddlewareContext<Config, Services, Clients>;
|
|
80
100
|
/** `routers(ctx)` 入参 */
|
|
81
|
-
export interface RouterContextParams<
|
|
101
|
+
export interface RouterContextParams<Services, Clients> {
|
|
82
102
|
app: AppInstance;
|
|
83
103
|
log: LoggerLike;
|
|
84
104
|
disposer: Disposer;
|
|
85
|
-
services: Awaited<
|
|
86
|
-
clients: ClientsView<
|
|
105
|
+
services: Awaited<Services>;
|
|
106
|
+
clients: ClientsView<Clients>;
|
|
87
107
|
}
|
|
88
|
-
export declare function createRouterContext<
|
|
108
|
+
export declare function createRouterContext<Services, Clients>(params: RouterContextParams<Services, Clients>): RouterContext<Services, Clients>;
|
|
89
109
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../source/core/boot/context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../source/core/boot/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,11 @@ import { SystemError } from '@taicode/common-base';
|
|
|
6
6
|
* (`generateOpenApi` 不跑 `config` 槽位)读到它时抛 `SystemError('CONFIG_UNAVAILABLE')`
|
|
7
7
|
* —— 让「构造期不得读配置」有运行期护栏,而不仅是文档规则。
|
|
8
8
|
*/
|
|
9
|
-
/**
|
|
9
|
+
/**
|
|
10
|
+
* 运行时镜像 `Live<Value>`:剔除值为 `false` 的键(编译期静态关闭)。
|
|
11
|
+
*
|
|
12
|
+
* `resources` 与 `clients` 两个槽位共用这套口径。
|
|
13
|
+
*/
|
|
10
14
|
export function liveResources(resources) {
|
|
11
15
|
const result = {};
|
|
12
16
|
for (const [key, value] of Object.entries(resources)) {
|
|
@@ -16,9 +20,43 @@ export function liveResources(resources) {
|
|
|
16
20
|
}
|
|
17
21
|
return result;
|
|
18
22
|
}
|
|
19
|
-
/**
|
|
20
|
-
|
|
21
|
-
return
|
|
23
|
+
/** 单元外壳的运行时识别(`defineResource` 产物的唯一形状) */
|
|
24
|
+
function isResourceUnit(value) {
|
|
25
|
+
return typeof value === 'object' && value !== null && 'value' in value && !('then' in value);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 把 `resources(ctx)` 的返回值拆成「对外视图」与「可执行生命周期列表」。
|
|
29
|
+
*
|
|
30
|
+
* 三件事:
|
|
31
|
+
* - **解包**:`defineResource(client, …)` → 视图里是 `client` 本身;裸对象原样(单元可选);
|
|
32
|
+
* - **收集**:有 `setup` / `dispose` 的单元按**对象声明序**收集成
|
|
33
|
+
* `{ name, setup, dispose }`,分别交给 `setupResourceUnits` / `disposeResourceUnits`
|
|
34
|
+
* 执行;
|
|
35
|
+
* - **剔除**:`false` 键与 `liveResources` 同口径(静态关闭的资源不参与生命周期)。
|
|
36
|
+
*
|
|
37
|
+
* ❗识别靠 `'value' in obj && !('then' in obj)`:`Resources` 允许是 Promise(`Awaited<>`
|
|
38
|
+
* 归一),但**单个资源值本身是 thenable 的极端情况**不当单元——宁可把它当裸值,
|
|
39
|
+
* 也不要把它错当单元。
|
|
40
|
+
*/
|
|
41
|
+
export function splitResourceUnits(resources) {
|
|
42
|
+
const view = {};
|
|
43
|
+
const units = [];
|
|
44
|
+
for (const [key, value] of Object.entries(resources)) {
|
|
45
|
+
if (value === false) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (isResourceUnit(value)) {
|
|
49
|
+
view[key] = value.value;
|
|
50
|
+
const setup = typeof value.setup === 'function' ? value.setup.bind(value) : undefined;
|
|
51
|
+
const dispose = typeof value.dispose === 'function' ? value.dispose.bind(value) : undefined;
|
|
52
|
+
if (setup || dispose) {
|
|
53
|
+
units.push({ name: key, setup, dispose });
|
|
54
|
+
}
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
view[key] = value;
|
|
58
|
+
}
|
|
59
|
+
return { view, units };
|
|
22
60
|
}
|
|
23
61
|
const CONFIG_WRITE = Symbol('config.write');
|
|
24
62
|
export function createConfigAccess() {
|
|
@@ -17,7 +17,7 @@ import type { LoggerLike } from '../types.js';
|
|
|
17
17
|
* - `init` 按**对象声明序**,`dispose` **逆序**;
|
|
18
18
|
* - services 阶段内部**先 flush `ctx.disposer`**(构造期注册的清理),再逐单元 `dispose`。
|
|
19
19
|
*
|
|
20
|
-
* `middlewares`
|
|
20
|
+
* `middlewares` 按**数组顺序**注册;它只有 `disposer`,没有逐单元生命周期。
|
|
21
21
|
*/
|
|
22
22
|
export declare const RESOURCES_STAGE = "resources";
|
|
23
23
|
export declare const CONFIG_STAGE = "config";
|
|
@@ -25,12 +25,11 @@ export declare const CLIENTS_STAGE = "clients";
|
|
|
25
25
|
export declare const SERVICES_STAGE = "services";
|
|
26
26
|
export declare const MIDDLEWARES_STAGE = "middlewares";
|
|
27
27
|
export declare const ROUTERS_STAGE = "routers";
|
|
28
|
-
/** `middlewares` 的**注册期日志**阶段标签(与生命周期阶段同名) */
|
|
29
|
-
export declare const MIDDLEWARES_LOG_STAGE = "middlewares";
|
|
30
28
|
/** 生命周期相位(逐单元日志字段 `phase`) */
|
|
29
|
+
export declare const LIFECYCLE_PHASE_SETUP = "setup";
|
|
31
30
|
export declare const LIFECYCLE_PHASE_INIT = "init";
|
|
32
31
|
export declare const LIFECYCLE_PHASE_DISPOSE = "dispose";
|
|
33
|
-
export type LifecyclePhase = typeof LIFECYCLE_PHASE_INIT | typeof LIFECYCLE_PHASE_DISPOSE;
|
|
32
|
+
export type LifecyclePhase = typeof LIFECYCLE_PHASE_SETUP | typeof LIFECYCLE_PHASE_INIT | typeof LIFECYCLE_PHASE_DISPOSE;
|
|
34
33
|
/**
|
|
35
34
|
* 逐单元生命周期日志上下文。
|
|
36
35
|
*
|
|
@@ -51,20 +50,53 @@ export interface LifecycleUnitLogFields {
|
|
|
51
50
|
phase: LifecyclePhase;
|
|
52
51
|
}
|
|
53
52
|
/**
|
|
54
|
-
* `middlewares`
|
|
53
|
+
* `middlewares` 日志名字:**数组项的名字**(`MiddlewareUnit.name`,或裸函数的占位名 `middleware[i]`)。
|
|
55
54
|
*
|
|
56
|
-
*
|
|
55
|
+
* 名字为空串时退路 `<service>:middleware`(仅用于注册期日志,不影响注册序——顺序由数组位置决定)。
|
|
57
56
|
*/
|
|
58
|
-
export declare function middlewareUnitName(service: string,
|
|
57
|
+
export declare function middlewareUnitName(service: string, name: string): string;
|
|
59
58
|
/** `initServiceUnits` 入参(参数签名内联对象类型已按 lint 规则外提) */
|
|
60
59
|
export interface InitServiceUnitsParams extends LifecycleLogContext {
|
|
61
60
|
/** `services(ctx)` 返回的对象(**对象键即单元名**) */
|
|
62
61
|
services?: Record<string, unknown>;
|
|
63
62
|
}
|
|
63
|
+
/** `setupResourceUnits` / `disposeResourceUnits` 入参(资源单元有 `setup` / `dispose`) */
|
|
64
|
+
export interface ResourceLifecycleParams extends LifecycleLogContext {
|
|
65
|
+
/** 有生命周期方法的资源单元(**按 `resources` 对象声明序**) */
|
|
66
|
+
units?: readonly ResourceSetupUnit[];
|
|
67
|
+
}
|
|
68
|
+
/** 一个资源单元的可执行生命周期(含名字,用于日志) */
|
|
69
|
+
export interface ResourceSetupUnit {
|
|
70
|
+
/** `resources` 对象里的键 */
|
|
71
|
+
name: string;
|
|
72
|
+
/** `setup()` 本身(已从单元外壳上取好);无 `setup` 时为 `undefined` */
|
|
73
|
+
setup?: () => void | Promise<void>;
|
|
74
|
+
/** `dispose()` 本身(已从单元外壳上取好);无 `dispose` 时为 `undefined` */
|
|
75
|
+
dispose?: () => void | Promise<void>;
|
|
76
|
+
}
|
|
64
77
|
/**
|
|
65
78
|
* 启动序:`services` 按**对象声明序**逐项 `await init?.()`;逐项打日志。
|
|
66
79
|
*/
|
|
67
80
|
export declare function initServiceUnits(params: InitServiceUnitsParams): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* `resources` 的装配期准备:按**对象声明序**逐项 `await setup()`;逐项打日志。
|
|
83
|
+
*
|
|
84
|
+
* 与 `initServiceUnits` 同形,差别在单元来源:资源值往往是第三方对象(没有 `setup` 方法),
|
|
85
|
+
* 单元外壳由 `buildResources` 在解包时收集成 `{ name, setup, dispose }`。
|
|
86
|
+
*
|
|
87
|
+
* **失败即中断**:资源准备失败时后续资源、`config`、`services` 都没有意义,直接冒泡给入口,
|
|
88
|
+
* 由入口把已构造的资源释放掉(与「端口占用」同一处理)。不放进关闭流程聚合——那不是关闭失败。
|
|
89
|
+
*/
|
|
90
|
+
export declare function setupResourceUnits(params: ResourceLifecycleParams): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* `resources` 的关闭:按声明序**逆序**逐项 `await dispose()`。
|
|
93
|
+
*
|
|
94
|
+
* 与 `disposeServices` 同语义:单元级失败已 `log.error`,此处吞掉以保证单个资源不阻断其他资源。
|
|
95
|
+
*
|
|
96
|
+
* 在关闭流程中排在 `flushResources`(阶段 `Disposer`)**之前**:单元 `dispose` 是资源自己的
|
|
97
|
+
* 正事(断连),而 `disposer` 是本阶段临时产物的逃生口,后者不应挡住前者。
|
|
98
|
+
*/
|
|
99
|
+
export declare function disposeResourceUnits(params: ResourceLifecycleParams): Promise<void>;
|
|
68
100
|
/** `buildDisposeOrder` / `disposeServiceUnits` 入参(参数签名内联对象类型已按 lint 规则外提) */
|
|
69
101
|
export interface DisposeServiceUnitsParams extends LifecycleLogContext {
|
|
70
102
|
/** `services(ctx)` 返回的对象(**对象键即单元名**) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../source/core/boot/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C;;;;;;;;;;;;;;;;;;GAkBG;AAEH,eAAO,MAAM,eAAe,cAAc,CAAA;AAC1C,eAAO,MAAM,YAAY,WAAW,CAAA;AACpC,eAAO,MAAM,aAAa,YAAY,CAAA;AACtC,eAAO,MAAM,cAAc,aAAa,CAAA;AACxC,eAAO,MAAM,iBAAiB,gBAAgB,CAAA;AAC9C,eAAO,MAAM,aAAa,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../source/core/boot/lifecycle.ts"],"names":[],"mappings":"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"}
|