@yss123/cage-http 0.1.0 → 0.3.0
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/README.md +58 -8
- package/dist/auth.d.ts +46 -1
- package/dist/auth.js +100 -10
- package/dist/auth.js.map +1 -1
- package/dist/ctx.d.ts +18 -1
- package/dist/ctx.js +70 -19
- package/dist/ctx.js.map +1 -1
- package/dist/files.d.ts +12 -0
- package/dist/files.js +79 -0
- package/dist/files.js.map +1 -0
- package/dist/index.d.ts +8 -3
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +19 -1
- package/dist/logger.js +128 -17
- package/dist/logger.js.map +1 -1
- package/dist/oidc.d.ts +8 -0
- package/dist/oidc.js +8 -0
- package/dist/oidc.js.map +1 -1
- package/dist/openapi.d.ts +6 -0
- package/dist/openapi.js +108 -10
- package/dist/openapi.js.map +1 -1
- package/dist/routes.d.ts +17 -2
- package/dist/routes.js +37 -8
- package/dist/routes.js.map +1 -1
- package/dist/server.d.ts +47 -2
- package/dist/server.js +115 -41
- package/dist/server.js.map +1 -1
- package/dist/transfers.d.ts +14 -0
- package/dist/transfers.js +56 -0
- package/dist/transfers.js.map +1 -0
- package/dist/worker.d.ts +4 -0
- package/dist/worker.js +11 -1
- package/dist/worker.js.map +1 -1
- package/package.json +5 -4
package/dist/routes.d.ts
CHANGED
|
@@ -1,16 +1,31 @@
|
|
|
1
1
|
import { type Kernel, type RegisteredCommand } from '@yss123/cage-kernel';
|
|
2
2
|
import type { FastifyInstance } from 'fastify';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
+
/** HTTP 与 OpenAPI 共用的路由描述;capability 是文档元数据,不能替代执行时授权。 */
|
|
4
5
|
export interface RouteInfo {
|
|
5
6
|
method: 'GET' | 'POST';
|
|
6
7
|
url: string;
|
|
7
|
-
kind: 'command' | 'list' | 'get' | 'export' | 'query' | 'hook';
|
|
8
|
+
kind: 'command' | 'list' | 'get' | 'related' | 'export' | 'query' | 'hook' | 'import' | 'transfer-list' | 'transfer-get' | 'transfer-download' | 'transfer-options' | 'upload-begin' | 'upload-list' | 'upload-get' | 'upload-part' | 'upload-complete' | 'upload-cancel' | 'file-info' | 'file-download';
|
|
8
9
|
capability?: string;
|
|
9
10
|
aggregate?: string;
|
|
11
|
+
/** related 的响应类型来自目标聚合,所属对象仍在 aggregate 中。 */
|
|
12
|
+
targetAggregate?: string;
|
|
13
|
+
relation?: string;
|
|
10
14
|
command?: RegisteredCommand;
|
|
11
15
|
input?: z.ZodType;
|
|
12
16
|
}
|
|
17
|
+
/** 创建命令尚无对象 ID,其余命令将 ID 放入路径;命名转换与生成契约保持一致。 */
|
|
13
18
|
export declare function commandUrl(c: RegisteredCommand): string;
|
|
14
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
* 注册表转换为路由清单,供 HTTP 文档及生成工具使用;本函数本身不注册 Fastify handler。
|
|
21
|
+
* 仅 user 命令有浏览器入口,流程/任务/外部命令必须通过各自受控调用链执行。
|
|
22
|
+
* 关联读取列出源、目标双方能力;查询列出 reads 依赖,使消费者看到完整读权限边界。
|
|
23
|
+
*/
|
|
15
24
|
export declare function routeTable(k: Kernel): RouteInfo[];
|
|
25
|
+
/**
|
|
26
|
+
* 将请求上下文与输入交给内核,并返回相同注册表派生的文档清单。
|
|
27
|
+
* 对象命令使用路径 ID 覆盖请求体 ID,防止 URL 与实际写目标不一致;用户命令幂等键最多取 200 字符。
|
|
28
|
+
* 入站回调先使用原始请求体验签,再验证载荷并映射命令;external 身份仅持有该目标命令能力。
|
|
29
|
+
* 文件路由在 server 中另行注册,通用导入导出在这里注册;二者仍出现在返回的完整清单中。
|
|
30
|
+
*/
|
|
16
31
|
export declare function registerRoutes(app: FastifyInstance, k: Kernel): RouteInfo[];
|
package/dist/routes.js
CHANGED
|
@@ -1,14 +1,21 @@
|
|
|
1
|
-
//
|
|
1
|
+
// 路由生成:启动时遍历注册表,为命令、聚合、查询、入站回调挂路由;这里只做协议适配,业务授权与状态判断交给内核。
|
|
2
2
|
// 业务项目里禁止调用 app.get / app.post(lint 拦截),所以没有声明就没有路由。
|
|
3
|
-
import { cageError, kebab, systemCtx } from '@yss123/cage-kernel';
|
|
3
|
+
import { cageError, isRelation, kebab, systemCtx } from '@yss123/cage-kernel';
|
|
4
4
|
import { z } from 'zod';
|
|
5
|
+
import { registerTransfers, transferKey, transferRoutes } from './transfers.js';
|
|
6
|
+
import { fileRoutes } from './files.js';
|
|
7
|
+
/** 创建命令尚无对象 ID,其余命令将 ID 放入路径;命名转换与生成契约保持一致。 */
|
|
5
8
|
export function commandUrl(c) {
|
|
6
9
|
const base = `/api/${kebab(c.cmd.agg.name)}`;
|
|
7
10
|
return c.cmd.from === 'new' ? `${base}/${kebab(c.name)}` : `${base}/:id/${kebab(c.name)}`;
|
|
8
11
|
}
|
|
9
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* 注册表转换为路由清单,供 HTTP 文档及生成工具使用;本函数本身不注册 Fastify handler。
|
|
14
|
+
* 仅 user 命令有浏览器入口,流程/任务/外部命令必须通过各自受控调用链执行。
|
|
15
|
+
* 关联读取列出源、目标双方能力;查询列出 reads 依赖,使消费者看到完整读权限边界。
|
|
16
|
+
*/
|
|
10
17
|
export function routeTable(k) {
|
|
11
|
-
const out = [];
|
|
18
|
+
const out = [...transferRoutes, ...fileRoutes];
|
|
12
19
|
for (const c of k.registry.commands) {
|
|
13
20
|
if (!c.cmd.invokedBy.includes('user'))
|
|
14
21
|
continue; // 流程、任务、外部专用命令不对浏览器开放
|
|
@@ -19,6 +26,10 @@ export function routeTable(k) {
|
|
|
19
26
|
out.push({ method: 'GET', url: base, kind: 'list', capability: `${a.name}.read`, aggregate: a.name });
|
|
20
27
|
out.push({ method: 'POST', url: `${base}/export`, kind: 'export', capability: `${a.name}.export`, aggregate: a.name });
|
|
21
28
|
out.push({ method: 'GET', url: `${base}/:id`, kind: 'get', capability: `${a.name}.read`, aggregate: a.name });
|
|
29
|
+
for (const [key, field] of Object.entries(a.fields))
|
|
30
|
+
if (isRelation(field))
|
|
31
|
+
out.push({ method: 'GET', url: `${base}/:id/relations/${kebab(key)}`, kind: 'related',
|
|
32
|
+
capability: [...new Set([`${a.name}.read`, `${field.ref}.read`])].join(','), aggregate: a.name, targetAggregate: field.ref, relation: key });
|
|
22
33
|
}
|
|
23
34
|
for (const q of k.registry.queries) {
|
|
24
35
|
out.push({ method: 'GET', url: `/api/queries/${kebab(q.name)}`, kind: 'query', capability: q.reads.map((r) => `${r.name}.read`).join(','), input: q.input });
|
|
@@ -29,8 +40,15 @@ export function routeTable(k) {
|
|
|
29
40
|
}
|
|
30
41
|
return out;
|
|
31
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* 将请求上下文与输入交给内核,并返回相同注册表派生的文档清单。
|
|
45
|
+
* 对象命令使用路径 ID 覆盖请求体 ID,防止 URL 与实际写目标不一致;用户命令幂等键最多取 200 字符。
|
|
46
|
+
* 入站回调先使用原始请求体验签,再验证载荷并映射命令;external 身份仅持有该目标命令能力。
|
|
47
|
+
* 文件路由在 server 中另行注册,通用导入导出在这里注册;二者仍出现在返回的完整清单中。
|
|
48
|
+
*/
|
|
32
49
|
export function registerRoutes(app, k) {
|
|
33
50
|
const table = routeTable(k);
|
|
51
|
+
registerTransfers(app, k);
|
|
34
52
|
for (const c of k.registry.commands) {
|
|
35
53
|
if (!c.cmd.invokedBy.includes('user'))
|
|
36
54
|
continue;
|
|
@@ -71,17 +89,27 @@ export function registerRoutes(app, k) {
|
|
|
71
89
|
}
|
|
72
90
|
return table;
|
|
73
91
|
}
|
|
92
|
+
/** 聚合读取统一经过安全读侧;导出只创建异步任务并返回 202,不在 HTTP 请求里遍历全部数据。 */
|
|
74
93
|
function registerAggregate(app, k, a) {
|
|
75
94
|
const base = `/api/${kebab(a.name)}`;
|
|
76
95
|
app.get(base, async (req) => k.read.list(a, req.query, req.cageCtx));
|
|
77
96
|
app.get(`${base}/:id`, async (req) => k.read.get(a, req.params.id, req.cageCtx));
|
|
97
|
+
for (const [key, field] of Object.entries(a.fields))
|
|
98
|
+
if (isRelation(field))
|
|
99
|
+
app.get(`${base}/:id/relations/${kebab(key)}`, async (req) => k.read.related(a, req.params.id, key, req.query, req.cageCtx));
|
|
78
100
|
app.post(`${base}/export`, async (req, reply) => {
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
101
|
+
const parsed = z.record(z.string(), z.unknown()).safeParse(req.body ?? {});
|
|
102
|
+
if (!parsed.success)
|
|
103
|
+
throw cageError('INVALID_INPUT', '导出筛选参数必须是对象');
|
|
104
|
+
const task = await k.transfers.export(a.name, parsed.data, req.cageCtx, transferKey(req));
|
|
105
|
+
return reply.code(202).send(task);
|
|
82
106
|
});
|
|
83
107
|
}
|
|
84
|
-
/**
|
|
108
|
+
/**
|
|
109
|
+
* 为对象型查询输入适配 URL 字符串,只转换顶层数字与布尔字段;最终合法性仍由读侧 schema 校验。
|
|
110
|
+
* 布尔值采用当前协议的精确字符串规则:只有 true 字符串转换为真;其余字符串转换为假。
|
|
111
|
+
* 不修改原始 query,也不在这里递归展开数组或嵌套对象。
|
|
112
|
+
*/
|
|
85
113
|
function coerceQuery(schema, q) {
|
|
86
114
|
if (!(schema instanceof z.ZodObject))
|
|
87
115
|
return q;
|
|
@@ -98,6 +126,7 @@ function coerceQuery(schema, q) {
|
|
|
98
126
|
}
|
|
99
127
|
return out;
|
|
100
128
|
}
|
|
129
|
+
/** 去除可选、可空和默认值包装,只为识别基础标量类型;不执行默认值或实际校验。 */
|
|
101
130
|
function unwrap(s) {
|
|
102
131
|
let cur = s;
|
|
103
132
|
while (cur && (cur instanceof z.ZodOptional || cur instanceof z.ZodNullable || cur instanceof z.ZodDefault))
|
package/dist/routes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import { type DatabaseUrls, type Kernel } from '@yss123/cage-kernel';
|
|
2
|
-
import { type FastifyInstance } from 'fastify';
|
|
2
|
+
import { type FastifyInstance, type FastifyServerOptions } from 'fastify';
|
|
3
3
|
import { type AuthOptions } from './auth.js';
|
|
4
|
+
import { FileService, type FileServiceOptions } from '@yss123/cage-files';
|
|
5
|
+
/** HTTP 进程的组合配置;领域声明决定能力与路由,选项只负责部署、认证和服务生命周期。 */
|
|
4
6
|
export interface ServerOptions {
|
|
7
|
+
/** 私有文件存储与上传限制;默认本地 .cage-files。 */
|
|
8
|
+
files?: FileServiceOptions;
|
|
5
9
|
/** domain 包的导出:import * as domain from '@app/domain' */
|
|
6
10
|
domain: object;
|
|
11
|
+
/** 写账号与只读账号由内核分别使用;省略时从项目环境读取,不在启动时建库或执行迁移。 */
|
|
7
12
|
urls?: DatabaseUrls;
|
|
13
|
+
/** 密码认证选项及可选 OIDC issuer;具体凭据来源由认证模块和部署环境决定。 */
|
|
8
14
|
auth?: AuthOptions & {
|
|
9
15
|
oidcIssuer?: string;
|
|
10
16
|
};
|
|
@@ -12,9 +18,19 @@ export interface ServerOptions {
|
|
|
12
18
|
webDir?: string;
|
|
13
19
|
/** /admin 系统管理,默认开启 */
|
|
14
20
|
admin?: boolean;
|
|
15
|
-
/**
|
|
21
|
+
/** 系统管理显示名,使用 aggregate:/command:/capability: 等图谱键;覆盖本地配置。 */
|
|
22
|
+
adminLabels?: Record<string, string>;
|
|
23
|
+
/** 仅保留 false 的兼容入口。组织初始化请显式调用 bootstrapOrg,不在服务启动时执行。 */
|
|
16
24
|
bootstrap?: boolean;
|
|
25
|
+
/** 默认不信任转发头;反向代理部署应显式配置可信地址、网段或跳数。 */
|
|
26
|
+
trustProxy?: FastifyServerOptions['trustProxy'];
|
|
27
|
+
/** 默认读取 CAGE_COOKIE_SECRET;生产环境必须提供至少 32 字节的独立密钥。 */
|
|
28
|
+
cookieSecret?: string;
|
|
29
|
+
/** 就绪探测的每个数据库等待上限,默认 2000 毫秒。 */
|
|
30
|
+
readinessTimeoutMs?: number;
|
|
31
|
+
/** 默认监听端口;listen 调用参数优先,其次本选项、PORT 环境变量,最后 3000。 */
|
|
17
32
|
port?: number;
|
|
33
|
+
/** 默认监听地址;listen 调用参数优先,其次本选项、HOST 环境变量,最后 0.0.0.0。 */
|
|
18
34
|
host?: string;
|
|
19
35
|
/** 默认每个客户端每分钟 300 次 */
|
|
20
36
|
rateLimitPerMinute?: number;
|
|
@@ -22,17 +38,46 @@ export interface ServerOptions {
|
|
|
22
38
|
authRateLimitPerMinute?: number;
|
|
23
39
|
/** 关闭 CSRF(只用于测试) */
|
|
24
40
|
csrf?: boolean;
|
|
41
|
+
/** false 关闭 HTTP 日志;默认启用框架脱敏日志配置。 */
|
|
25
42
|
logger?: boolean;
|
|
43
|
+
/** 可选 OpenAPI 文档标题,仅用于接口说明。 */
|
|
26
44
|
title?: string;
|
|
27
45
|
}
|
|
46
|
+
/** 已创建但未必已开始监听的服务;嵌入式测试可只调用 ready,再通过 app 注入请求。 */
|
|
28
47
|
export interface CageServer {
|
|
48
|
+
/** 本服务拥有的文件协调器,HTTP 上传路由与关闭流程使用同一实例。 */
|
|
49
|
+
files: FileService;
|
|
50
|
+
/** Fastify 实例;ready 之后可用 inject 测试,listen 后才接受网络连接。 */
|
|
29
51
|
app: FastifyInstance;
|
|
52
|
+
/** 本 HTTP 服务装配的内核,业务请求通过它执行命令和安全读取。 */
|
|
30
53
|
kernel: Kernel;
|
|
54
|
+
/** 注册路由、启动扩展与授权监听;重复调用共享同一次初始化及其失败结果。 */
|
|
31
55
|
ready(): Promise<FastifyInstance>;
|
|
56
|
+
/** 检查数据库及授权监听等就绪依赖,返回状态快照,不证明异步业务已完成。 */
|
|
57
|
+
health(): Promise<ServerHealth>;
|
|
58
|
+
/** 先完成 ready,再按参数/配置监听网络;返回监听地址,启动失败向调用方抛出。 */
|
|
32
59
|
listen(opts?: {
|
|
33
60
|
port?: number;
|
|
34
61
|
host?: string;
|
|
35
62
|
}): Promise<string>;
|
|
63
|
+
/** 关闭 HTTP 及其装配资源;由宿主退出流程调用,不能把停止接收请求当作业务回滚。 */
|
|
36
64
|
close(): Promise<void>;
|
|
37
65
|
}
|
|
66
|
+
/** 就绪状态只覆盖当前 HTTP 进程依赖;异步 worker 的消费健康需单独探测。 */
|
|
67
|
+
export interface ServerHealth {
|
|
68
|
+
/** 当前就绪依赖均满足时为 true,不代表整个部署的 worker 或外部系统健康。 */
|
|
69
|
+
ok: boolean;
|
|
70
|
+
/** appDb/readDb 为连接探测,grantsListener 为授权监听状态;不包含秘密连接信息。 */
|
|
71
|
+
dependencies: {
|
|
72
|
+
appDb: boolean;
|
|
73
|
+
readDb: boolean;
|
|
74
|
+
grantsListener: boolean;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 组合组织模型、业务内核、文件服务和 HTTP 安全基线,返回由调用者掌控的启动/停止句柄。
|
|
79
|
+
* 创建阶段校验环境并建立资源对象,ready 才注册插件、扩展和监听;不会初始化组织或更新数据库。
|
|
80
|
+
* 生产密钥无效或显式要求隐式 bootstrap 时立即失败,避免服务启动产生不可审查的管理凭据。
|
|
81
|
+
* close 先停止 HTTP 及扩展后台活动,再关闭授权监听与内核连接,防止清理任务访问已关闭的连接池。
|
|
82
|
+
*/
|
|
38
83
|
export declare function createServer(opts: ServerOptions): CageServer;
|
package/dist/server.js
CHANGED
|
@@ -1,53 +1,111 @@
|
|
|
1
1
|
// createServer:安全基线默认开启(安全响应头、CSRF、限流、请求体大小、日志打码),业务项目不需要记得加。
|
|
2
|
-
import { existsSync } from 'node:fs';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
3
|
import { dirname, join, resolve } from 'node:path';
|
|
4
4
|
import { createRequire } from 'node:module';
|
|
5
|
-
import {
|
|
5
|
+
import { randomBytes } from 'node:crypto';
|
|
6
6
|
import cookie from '@fastify/cookie';
|
|
7
7
|
import csrf from '@fastify/csrf-protection';
|
|
8
8
|
import helmet from '@fastify/helmet';
|
|
9
9
|
import rateLimit from '@fastify/rate-limit';
|
|
10
10
|
import fastifyStatic from '@fastify/static';
|
|
11
11
|
import * as adminDomain from '@yss123/cage-admin/domain';
|
|
12
|
-
import { adminRoutes
|
|
12
|
+
import { adminRoutes } from '@yss123/cage-admin';
|
|
13
13
|
import { approvalRoutes } from '@yss123/cage-approval';
|
|
14
|
-
import { createKernel, toCageError, urlsFromEnv } from '@yss123/cage-kernel';
|
|
14
|
+
import { createKernel, runtimeServices, toCageError, urlsFromEnv } from '@yss123/cage-kernel';
|
|
15
15
|
import Fastify from 'fastify';
|
|
16
|
+
import { sql } from 'kysely';
|
|
16
17
|
import { authRoutes, csrfRoute, registerAuthHook, Sessions } from './auth.js';
|
|
17
18
|
import { CtxCache } from './ctx.js';
|
|
18
19
|
import { buildLogger } from './logger.js';
|
|
19
20
|
import { oidcRoutes } from './oidc.js';
|
|
20
21
|
import { buildOpenApi } from './openapi.js';
|
|
21
22
|
import { registerRoutes } from './routes.js';
|
|
22
|
-
|
|
23
|
+
import { FileService } from '@yss123/cage-files';
|
|
24
|
+
import { registerFiles } from './files.js';
|
|
25
|
+
/** 从实际安装的 admin 包定位已构建静态资源;未附带 UI 时返回 null,仍可注册管理 API。 */
|
|
23
26
|
function adminUiDir() {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
const dir = resolve(here, '../../admin/ui');
|
|
32
|
-
return existsSync(dir) ? dir : null;
|
|
33
|
-
}
|
|
27
|
+
// 通过包公开入口定位资源;package.json 未被 exports 公开,且安装后的 pnpm
|
|
28
|
+
// 目录与 monorepo 不同,不能依赖 ../../admin 的工作区相对路径。
|
|
29
|
+
const entry = createRequire(import.meta.url).resolve('@yss123/cage-admin');
|
|
30
|
+
const dir = resolve(dirname(entry), '../ui');
|
|
31
|
+
return existsSync(dir) ? dir : null;
|
|
34
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* 组合组织模型、业务内核、文件服务和 HTTP 安全基线,返回由调用者掌控的启动/停止句柄。
|
|
35
|
+
* 创建阶段校验环境并建立资源对象,ready 才注册插件、扩展和监听;不会初始化组织或更新数据库。
|
|
36
|
+
* 生产密钥无效或显式要求隐式 bootstrap 时立即失败,避免服务启动产生不可审查的管理凭据。
|
|
37
|
+
* close 先停止 HTTP 及扩展后台活动,再关闭授权监听与内核连接,防止清理任务访问已关闭的连接池。
|
|
38
|
+
*/
|
|
35
39
|
export function createServer(opts) {
|
|
40
|
+
const production = process.env.NODE_ENV === 'production';
|
|
41
|
+
const configuredSecret = opts.cookieSecret ?? process.env.CAGE_COOKIE_SECRET;
|
|
42
|
+
if (production && (!configuredSecret || Buffer.byteLength(configuredSecret) < 32 || /change.?me|replace.with|cage-dev-cookie-secret/i.test(configuredSecret))) {
|
|
43
|
+
throw new Error('[CAGE-ENV-002] 生产环境必须配置至少 32 字节的 CAGE_COOKIE_SECRET,不能使用开发占位值');
|
|
44
|
+
}
|
|
45
|
+
if (opts.bootstrap)
|
|
46
|
+
throw new Error('[CAGE-ENV-003] 服务启动不再隐式初始化组织;请在受控初始化入口显式调用 bootstrapOrg 并安全交付初始凭据');
|
|
47
|
+
const readinessTimeoutMs = opts.readinessTimeoutMs ?? 2000;
|
|
48
|
+
if (!Number.isSafeInteger(readinessTimeoutMs) || readinessTimeoutMs < 1)
|
|
49
|
+
throw new Error('[CAGE-ENV-002] readinessTimeoutMs 必须为正整数');
|
|
50
|
+
// 开发会话密钥也是随机值,重启会使旧 CSRF/OIDC cookie 失效;多实例必须显式共享配置。
|
|
51
|
+
const cookieSecret = configuredSecret ?? randomBytes(32).toString('hex');
|
|
36
52
|
const urls = opts.urls ?? urlsFromEnv();
|
|
53
|
+
// 组织模型永远在注册表里(同一对象重复导出会自动去重)。
|
|
54
|
+
const kernel = createKernel({ domain: [adminDomain, opts.domain], urls, logger: undefined });
|
|
55
|
+
const files = new FileService(kernel, opts.files);
|
|
56
|
+
const services = runtimeServices(kernel);
|
|
37
57
|
const app = Fastify({
|
|
38
58
|
bodyLimit: 1_048_576, // 请求体最大 1 MB
|
|
39
|
-
trustProxy:
|
|
40
|
-
logger: false,
|
|
59
|
+
trustProxy: opts.trustProxy ?? false,
|
|
60
|
+
logger: opts.logger === false ? false : buildLogger(kernel.registry),
|
|
41
61
|
genReqId: () => crypto.randomUUID(),
|
|
42
62
|
});
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (opts.logger !== false) {
|
|
46
|
-
const pino = Fastify({ logger: buildLogger(kernel.registry) }).log;
|
|
47
|
-
kernel.log = pino;
|
|
48
|
-
app.log = pino;
|
|
49
|
-
}
|
|
63
|
+
if (opts.logger !== false)
|
|
64
|
+
kernel.log = app.log;
|
|
50
65
|
const cache = new CtxCache(kernel);
|
|
66
|
+
let closing = false;
|
|
67
|
+
let fileCleanup = null;
|
|
68
|
+
let fileTimer;
|
|
69
|
+
/** 一次只允许一个清理批次运行;失败留待下周期重试,停止时等待当前批次完成。 */
|
|
70
|
+
const cleanFiles = () => {
|
|
71
|
+
if (closing || fileCleanup)
|
|
72
|
+
return;
|
|
73
|
+
fileCleanup = files.cleanup().catch(err => kernel.log.error({ err }, '文件清理失败,将在下一周期重试')).finally(() => { fileCleanup = null; });
|
|
74
|
+
};
|
|
75
|
+
app.addHook('preClose', async () => {
|
|
76
|
+
closing = true;
|
|
77
|
+
clearInterval(fileTimer);
|
|
78
|
+
await files.close();
|
|
79
|
+
await Promise.all(services.map(service => service.close()));
|
|
80
|
+
await fileCleanup;
|
|
81
|
+
});
|
|
82
|
+
const probes = new Map();
|
|
83
|
+
/** 检查账号能否访问它应访问的 schema;超时只结束本次等待,不取消底层尚未返回的查询。 */
|
|
84
|
+
const probe = async (name) => {
|
|
85
|
+
// 超时的探测不重复申请连接,避免依赖故障时探针本身耗尽连接池。
|
|
86
|
+
let pending = probes.get(name);
|
|
87
|
+
if (!pending) {
|
|
88
|
+
pending = Promise.resolve().then(() => name === 'appDb'
|
|
89
|
+
? sql `select 1 from sys.user limit 0`.execute(kernel.app)
|
|
90
|
+
: sql `select 1 from safe.user limit 0`.execute(kernel.readDb)).then(() => true, () => false);
|
|
91
|
+
probes.set(name, pending);
|
|
92
|
+
void pending.finally(() => probes.delete(name));
|
|
93
|
+
}
|
|
94
|
+
let timer;
|
|
95
|
+
try {
|
|
96
|
+
return await Promise.race([pending, new Promise((resolve) => { timer = setTimeout(() => resolve(false), readinessTimeoutMs); })]);
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
if (timer)
|
|
100
|
+
clearTimeout(timer);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
/** readiness 同时要求写库、只读安全视图和撤权通知可用;关闭期间固定为不可接流量。 */
|
|
104
|
+
const health = async () => {
|
|
105
|
+
const [appDb, readDb] = closing ? [false, false] : await Promise.all([probe('appDb'), probe('readDb')]);
|
|
106
|
+
const dependencies = { appDb, readDb, grantsListener: cache.healthy };
|
|
107
|
+
return { ok: !closing && Object.values(dependencies).every(Boolean), dependencies };
|
|
108
|
+
};
|
|
51
109
|
const authOpts = {
|
|
52
110
|
...opts.auth,
|
|
53
111
|
oidc: opts.auth?.oidc ?? (opts.auth?.oidcIssuer && process.env.OIDC_CLIENT_ID
|
|
@@ -60,6 +118,7 @@ export function createServer(opts) {
|
|
|
60
118
|
: undefined),
|
|
61
119
|
};
|
|
62
120
|
const sessions = new Sessions(kernel, authOpts.sessionHours ?? 8);
|
|
121
|
+
/** 注册顺序保证会话、CSRF 和统一错误处理覆盖业务路由;原始 JSON 同时供第三方回调验签。 */
|
|
63
122
|
const build = async () => {
|
|
64
123
|
// 原始请求体:入站回调验签要用
|
|
65
124
|
app.addContentTypeParser('application/json', { parseAs: 'string' }, (req, body, done) => {
|
|
@@ -77,7 +136,7 @@ export function createServer(opts) {
|
|
|
77
136
|
contentSecurityPolicy: { directives: { defaultSrc: ["'self'"], scriptSrc: ["'self'"], styleSrc: ["'self'", "'unsafe-inline'"], imgSrc: ["'self'", 'data:'] } },
|
|
78
137
|
});
|
|
79
138
|
await app.register(rateLimit, { max: opts.rateLimitPerMinute ?? 300, timeWindow: '1 minute' });
|
|
80
|
-
await app.register(cookie, { secret:
|
|
139
|
+
await app.register(cookie, { secret: cookieSecret });
|
|
81
140
|
await app.register(csrf, { sessionPlugin: '@fastify/cookie', cookieOpts: { signed: true, httpOnly: true, sameSite: 'lax', path: '/' } });
|
|
82
141
|
registerAuthHook(app, kernel, sessions, cache);
|
|
83
142
|
if (opts.csrf !== false) {
|
|
@@ -95,10 +154,12 @@ export function createServer(opts) {
|
|
|
95
154
|
reply.status(e.http).send({ code: e.code, ...(e.domainCode ? { domainCode: e.domainCode } : {}), detail: e.code === 'INTERNAL' ? undefined : e.detail, requestId: req.id });
|
|
96
155
|
});
|
|
97
156
|
app.setNotFoundHandler((req, reply) => {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
157
|
+
const path = req.url.split('?')[0];
|
|
158
|
+
// History 路由的深链接由业务 SPA 接管;API、系统管理和静态资源有各自的 404。
|
|
159
|
+
// 只有浏览器请求页面时回退,不能把丢失的 JS/CSS 或未知写接口伪装成成功 HTML。
|
|
160
|
+
const backendOrAsset = /^\/(api|hooks|auth|admin|assets)(\/|$)/.test(path);
|
|
161
|
+
const page = (req.method === 'GET' || req.method === 'HEAD') && req.headers.accept?.includes('text/html');
|
|
162
|
+
if (page && !backendOrAsset && opts.webDir && existsSync(join(opts.webDir, 'index.html')))
|
|
102
163
|
return reply.sendFile('index.html', opts.webDir);
|
|
103
164
|
return reply.status(404).send({ code: 'NOT_FOUND' });
|
|
104
165
|
});
|
|
@@ -110,13 +171,27 @@ export function createServer(opts) {
|
|
|
110
171
|
});
|
|
111
172
|
csrfRoute(app);
|
|
112
173
|
app.get('/healthz', async () => ({ ok: true }));
|
|
174
|
+
app.get('/readyz', async (_req, reply) => {
|
|
175
|
+
const state = await health();
|
|
176
|
+
return reply.status(state.ok ? 200 : 503).send(state);
|
|
177
|
+
});
|
|
113
178
|
const routes = registerRoutes(app, kernel);
|
|
179
|
+
await registerFiles(app, files);
|
|
114
180
|
app.get('/api/openapi.json', async () => buildOpenApi(kernel, routes, { title: opts.title }));
|
|
115
|
-
if (opts.admin !== false)
|
|
116
|
-
|
|
181
|
+
if (opts.admin !== false) {
|
|
182
|
+
// CLI dev 和部署均以项目根为工作目录。展示文案复用已有图谱配置,业务无需维护两份翻译。
|
|
183
|
+
// 直接调用 createServer 的应用也可通过 adminLabels 提供文案,不依赖文件。
|
|
184
|
+
const configFile = resolve('cage.config.json');
|
|
185
|
+
const labels = existsSync(configFile) ? JSON.parse(readFileSync(configFile, 'utf8')).graph?.labels : {};
|
|
186
|
+
adminRoutes(app, kernel, { ...labels, ...opts.adminLabels });
|
|
187
|
+
}
|
|
117
188
|
const engines = kernel.registry.extensions.filter((e) => e.kind === 'ROUTE').map((e) => e.value.engine(kernel));
|
|
118
189
|
if (engines.length)
|
|
119
190
|
approvalRoutes(app, { kernel, engines, ctxOf: (req) => req.cageCtx });
|
|
191
|
+
for (const service of services) {
|
|
192
|
+
await service.ready();
|
|
193
|
+
await service.http?.(app);
|
|
194
|
+
}
|
|
120
195
|
const ui = opts.admin !== false ? adminUiDir() : null;
|
|
121
196
|
if (ui) {
|
|
122
197
|
await app.register(fastifyStatic, { root: ui, prefix: '/admin/', decorateReply: !opts.webDir });
|
|
@@ -126,25 +201,23 @@ export function createServer(opts) {
|
|
|
126
201
|
await app.register(fastifyStatic, { root: opts.webDir, prefix: '/', decorateReply: true, wildcard: false });
|
|
127
202
|
}
|
|
128
203
|
await cache.listen(urls.app);
|
|
129
|
-
if (opts.bootstrap !== false) {
|
|
130
|
-
const b = await bootstrapOrg(kernel).catch((e) => {
|
|
131
|
-
kernel.log.warn({ err: String(e) }, '组织初始化失败(是否已执行 cage migrate?)');
|
|
132
|
-
return { created: false };
|
|
133
|
-
});
|
|
134
|
-
if (b.created) {
|
|
135
|
-
// 初始管理员账号只在终端里打印一次
|
|
136
|
-
console.log(`\n 初始管理员 用户名 ${b.username} 密码 ${b.password}\n 请登录 /admin 后立即修改密码\n`);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
204
|
await app.ready();
|
|
205
|
+
if (kernel.registry.aggregates.some(a => Object.values(a.fields).some((f) => f.kind === 'file' || f.kind === 'files'))) {
|
|
206
|
+
cleanFiles();
|
|
207
|
+
fileTimer = setInterval(cleanFiles, 60_000);
|
|
208
|
+
fileTimer.unref();
|
|
209
|
+
}
|
|
140
210
|
return app;
|
|
141
211
|
};
|
|
212
|
+
// 共享初始化 Promise,避免 listen、测试和健康管理代码并发调用时重复挂载路由或后台任务。
|
|
142
213
|
let readyP = null;
|
|
143
214
|
const ready = () => (readyP ??= build());
|
|
144
215
|
return {
|
|
145
216
|
app,
|
|
146
217
|
kernel,
|
|
218
|
+
files,
|
|
147
219
|
ready,
|
|
220
|
+
health,
|
|
148
221
|
async listen(l = {}) {
|
|
149
222
|
await ready();
|
|
150
223
|
const port = l.port ?? opts.port ?? Number(process.env.PORT ?? 3000);
|
|
@@ -154,6 +227,7 @@ export function createServer(opts) {
|
|
|
154
227
|
return addr;
|
|
155
228
|
},
|
|
156
229
|
async close() {
|
|
230
|
+
closing = true;
|
|
157
231
|
await app.close();
|
|
158
232
|
await cache.close();
|
|
159
233
|
await kernel.close();
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type Kernel } from '@yss123/cage-kernel';
|
|
2
|
+
import type { FastifyInstance, FastifyRequest } from 'fastify';
|
|
3
|
+
import type { RouteInfo } from './routes.js';
|
|
4
|
+
/** 任务枚举、提交、状态与下载共用的系统路由,供 OpenAPI 和客户端能力发现使用。 */
|
|
5
|
+
export declare const transferRoutes: RouteInfo[];
|
|
6
|
+
/** 不截断幂等键,避免两个不同请求因前缀相同而被当作同一次提交。 */
|
|
7
|
+
export declare function transferKey(req: FastifyRequest): string;
|
|
8
|
+
/**
|
|
9
|
+
* 挂载通用导入导出入口:options 按当前能力筛选候选,任务服务在提交、执行和下载时继续复核授权。
|
|
10
|
+
* 导入只接受用户可调用命令,CSV 列来自命令输入 schema,逐行写入仍经过完整命令流水线。
|
|
11
|
+
* 提交返回 202 与任务 ID;状态和结果属于提交者,下载不通过公开静态目录暴露文件。
|
|
12
|
+
* options 中的 limits 是前端交互提示,实际资源限制由内核任务服务强制执行。
|
|
13
|
+
*/
|
|
14
|
+
export declare function registerTransfers(app: FastifyInstance, k: Kernel): void;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// 通用任务接口始终挂载(不依赖 /admin 是否开启),因此业务前端也能使用生成的 SDK。
|
|
2
|
+
import { cageError, importRequestSchema, kebab } from '@yss123/cage-kernel';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
/** 任务枚举、提交、状态与下载共用的系统路由,供 OpenAPI 和客户端能力发现使用。 */
|
|
5
|
+
export const transferRoutes = [
|
|
6
|
+
{ method: 'GET', url: '/api/sys/transfers', kind: 'transfer-list' },
|
|
7
|
+
{ method: 'GET', url: '/api/sys/transfers/options', kind: 'transfer-options' },
|
|
8
|
+
{ method: 'POST', url: '/api/sys/transfers/import', kind: 'import', input: importRequestSchema },
|
|
9
|
+
{ method: 'GET', url: '/api/sys/transfers/:id', kind: 'transfer-get' },
|
|
10
|
+
{ method: 'GET', url: '/api/sys/transfers/:id/download', kind: 'transfer-download' },
|
|
11
|
+
];
|
|
12
|
+
/** 不截断幂等键,避免两个不同请求因前缀相同而被当作同一次提交。 */
|
|
13
|
+
export function transferKey(req) {
|
|
14
|
+
const key = req.headers['idempotency-key'];
|
|
15
|
+
if (typeof key !== 'string' || !key || key.length > 200)
|
|
16
|
+
throw cageError('INVALID_INPUT', '任务提交需要 Idempotency-Key(1–200 字符)');
|
|
17
|
+
return key;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 挂载通用导入导出入口:options 按当前能力筛选候选,任务服务在提交、执行和下载时继续复核授权。
|
|
21
|
+
* 导入只接受用户可调用命令,CSV 列来自命令输入 schema,逐行写入仍经过完整命令流水线。
|
|
22
|
+
* 提交返回 202 与任务 ID;状态和结果属于提交者,下载不通过公开静态目录暴露文件。
|
|
23
|
+
* options 中的 limits 是前端交互提示,实际资源限制由内核任务服务强制执行。
|
|
24
|
+
*/
|
|
25
|
+
export function registerTransfers(app, k) {
|
|
26
|
+
app.get('/api/sys/transfers', (req) => k.transfers.list(req.cageCtx, req.query.aggregate));
|
|
27
|
+
app.get('/api/sys/transfers/options', async (req) => {
|
|
28
|
+
if (!req.cageCtx.userId)
|
|
29
|
+
throw cageError('UNAUTHENTICATED');
|
|
30
|
+
const can = (cap) => req.cageCtx.capabilities.has(cap);
|
|
31
|
+
return {
|
|
32
|
+
exports: k.registry.aggregates.filter((a) => can(`${a.name}.export`)).map((a) => ({
|
|
33
|
+
name: a.name, title: a.description ?? a.name, url: `/api/${kebab(a.name)}/export`,
|
|
34
|
+
})),
|
|
35
|
+
imports: k.registry.commands.filter((c) => c.cmd.invokedBy.includes('user') && c.cmd.input instanceof z.ZodObject && can(c.capability)).map((c) => ({
|
|
36
|
+
command: c.capability, title: c.cmd.description ?? c.capability,
|
|
37
|
+
// 这是输入表头,不能使用读侧导出表头:读侧包含系统列、掩码值,不能直接回写。
|
|
38
|
+
fields: Object.entries(c.cmd.input.shape).map(([name, schema]) => ({ name, required: !schema.isOptional() })),
|
|
39
|
+
})),
|
|
40
|
+
limits: { importBytes: 1_048_576, importRows: 1000, exportRows: 100000, exportBytes: 20 * 1024 * 1024, retentionHours: 24 },
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
// 文件由浏览器读取为 UTF-8 CSV,通过 JSON 上传;6 MiB 覆盖 JSON 转义膨胀,
|
|
44
|
+
// 服务仍按解码后 1 MiB 限制原文件。其他接口继续保持原来的 1 MiB 上限。
|
|
45
|
+
app.post('/api/sys/transfers/import', { bodyLimit: 6 * 1024 * 1024 }, async (req, reply) => {
|
|
46
|
+
const task = await k.transfers.import(req.body, req.cageCtx, transferKey(req));
|
|
47
|
+
return reply.code(202).send(task);
|
|
48
|
+
});
|
|
49
|
+
app.get('/api/sys/transfers/:id', (req) => k.transfers.get(req.params.id, req.cageCtx));
|
|
50
|
+
app.get('/api/sys/transfers/:id/download', async (req, reply) => {
|
|
51
|
+
const file = await k.transfers.download(req.params.id, req.cageCtx);
|
|
52
|
+
return reply.header('cache-control', 'no-store').header('content-type', file.contentType)
|
|
53
|
+
.header('content-disposition', `attachment; filename="${file.filename}"`).send(file.body);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=transfers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfers.js","sourceRoot":"","sources":["../src/transfers.ts"],"names":[],"mappings":"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"}
|