@yss123/cage-http 0.2.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 +64 -7
- package/dist/openapi.js.map +1 -1
- package/dist/routes.d.ts +14 -2
- package/dist/routes.js +22 -4
- package/dist/routes.js.map +1 -1
- package/dist/server.d.ts +45 -2
- package/dist/server.js +102 -26
- package/dist/server.js.map +1 -1
- package/dist/transfers.d.ts +7 -0
- package/dist/transfers.js +7 -0
- package/dist/transfers.js.map +1 -1
- 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/files.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// 分片路由使用原始字节流,复用会话/CSRF;不经过全局 JSON 解析器和 1 MiB 请求体限制。
|
|
2
|
+
import { Readable } from 'node:stream';
|
|
3
|
+
import { cageError } from '@yss123/cage-kernel';
|
|
4
|
+
import { beginUploadSchema } from '@yss123/cage-files';
|
|
5
|
+
import { transferKey } from './transfers.js';
|
|
6
|
+
/** 上传会话与私有下载的协议清单;具体授权依赖会话和目标对象,无法用单个固定 capability 表达。 */
|
|
7
|
+
export const fileRoutes = [
|
|
8
|
+
{ method: 'POST', url: '/api/sys/uploads', kind: 'upload-begin', input: beginUploadSchema },
|
|
9
|
+
{ method: 'GET', url: '/api/sys/uploads', kind: 'upload-list' },
|
|
10
|
+
{ method: 'GET', url: '/api/sys/uploads/:id', kind: 'upload-get' },
|
|
11
|
+
{ method: 'POST', url: '/api/sys/uploads/:id/parts/:number', kind: 'upload-part' },
|
|
12
|
+
{ method: 'POST', url: '/api/sys/uploads/:id/complete', kind: 'upload-complete' },
|
|
13
|
+
{ method: 'POST', url: '/api/sys/uploads/:id/cancel', kind: 'upload-cancel' },
|
|
14
|
+
{ method: 'GET', url: '/api/sys/files/:id', kind: 'file-info' },
|
|
15
|
+
{ method: 'GET', url: '/api/sys/files/:id/download', kind: 'file-download' },
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* 将 HTTP 字节流交给 FileService,统一复用当前请求的登录上下文和全局 CSRF 保护。
|
|
19
|
+
* 分片要求 Content-Length 与 SHA-256,长度上限使用服务配置;准确字节数和摘要由存储层校验。
|
|
20
|
+
* 下载仅支持一个闭区间 bytes 范围,非法范围返回 416;有效范围返回 206 和准确 Content-Length。
|
|
21
|
+
* 元数据读取及实际下载分别复核访问条件,FileService 在交付前记录审计;响应禁止共享缓存并强制附件下载。
|
|
22
|
+
*/
|
|
23
|
+
export async function registerFiles(app, files) {
|
|
24
|
+
app.post('/api/sys/uploads', req => files.begin(req.body, req.cageCtx, transferKey(req)));
|
|
25
|
+
app.get('/api/sys/uploads', req => {
|
|
26
|
+
const query = req.query;
|
|
27
|
+
if (!query.command || !query.field)
|
|
28
|
+
throw cageError('INVALID_INPUT', '需要 command 和 field');
|
|
29
|
+
return files.list(query.command, query.field, query.targetId ?? null, req.cageCtx);
|
|
30
|
+
});
|
|
31
|
+
app.get('/api/sys/uploads/:id', req => files.get(req.params.id, req.cageCtx));
|
|
32
|
+
app.post('/api/sys/uploads/:id/complete', req => files.complete(req.params.id, req.cageCtx));
|
|
33
|
+
app.post('/api/sys/uploads/:id/cancel', req => files.cancel(req.params.id, req.cageCtx));
|
|
34
|
+
// 解析器只在这个封装作用域生效;流式存储自己校验准确分片长度和校验和。
|
|
35
|
+
await app.register(async (scope) => {
|
|
36
|
+
scope.addContentTypeParser('application/octet-stream', (_req, payload, done) => done(null, payload));
|
|
37
|
+
scope.post('/api/sys/uploads/:id/parts/:number', {
|
|
38
|
+
bodyLimit: files.partBytes,
|
|
39
|
+
onRequest: async (req) => {
|
|
40
|
+
const length = Number(req.headers['content-length']);
|
|
41
|
+
if (!Number.isSafeInteger(length) || length < 1 || length > files.partBytes)
|
|
42
|
+
throw cageError('INVALID_INPUT', '分片需要合法的 Content-Length');
|
|
43
|
+
},
|
|
44
|
+
}, req => {
|
|
45
|
+
const { id, number } = req.params;
|
|
46
|
+
const hash = req.headers['x-content-sha256'];
|
|
47
|
+
if (!(req.body instanceof Readable) || typeof hash !== 'string' || !/^[1-9]\d*$/.test(number))
|
|
48
|
+
throw cageError('INVALID_INPUT');
|
|
49
|
+
return files.putPart(id, Number(number), hash, req.body, req.cageCtx);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
app.get('/api/sys/files/:id', req => files.info(req.params.id, req.cageCtx));
|
|
53
|
+
app.get('/api/sys/files/:id/download', async (req, reply) => {
|
|
54
|
+
const id = req.params.id;
|
|
55
|
+
const info = await files.info(id, req.cageCtx);
|
|
56
|
+
const header = req.headers.range;
|
|
57
|
+
let range;
|
|
58
|
+
if (header) {
|
|
59
|
+
const match = /^bytes=(\d*)-(\d*)$/.exec(header);
|
|
60
|
+
const invalid = () => reply.code(416).header('content-range', `bytes */${info.bytes}`).send();
|
|
61
|
+
if (!match || (!match[1] && !match[2]))
|
|
62
|
+
return invalid();
|
|
63
|
+
const start = match[1] ? Number(match[1]) : Math.max(0, info.bytes - Number(match[2]));
|
|
64
|
+
const end = match[1] && match[2] ? Math.min(Number(match[2]), info.bytes - 1) : info.bytes - 1;
|
|
65
|
+
if (!Number.isSafeInteger(start) || !Number.isSafeInteger(end) || start < 0 || start >= info.bytes || end < start || (!match[1] && Number(match[2]) === 0))
|
|
66
|
+
return invalid();
|
|
67
|
+
range = { start, end };
|
|
68
|
+
}
|
|
69
|
+
const result = await files.download(id, req.cageCtx, range);
|
|
70
|
+
reply.header('cache-control', 'private, no-store').header('x-content-type-options', 'nosniff')
|
|
71
|
+
.header('content-type', info.contentType).header('accept-ranges', 'bytes')
|
|
72
|
+
.header('content-disposition', `attachment; filename="download"; filename*=UTF-8''${encodeURIComponent(info.filename).replace(/['()*]/g, ch => `%${ch.charCodeAt(0).toString(16)}`)}`)
|
|
73
|
+
.header('content-length', range ? range.end - range.start + 1 : info.bytes);
|
|
74
|
+
if (range)
|
|
75
|
+
reply.code(206).header('content-range', `bytes ${range.start}-${range.end}/${info.bytes}`);
|
|
76
|
+
return reply.send(result.stream);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
/** 应用 API 启动的公共入口。createServer 组合组织模型、安全插件、声明路由与运行时扩展,
|
|
2
|
+
* 并返回显式 ready/listen/close 生命周期;导入本模块本身不会监听端口或执行数据库迁移。
|
|
3
|
+
* 低层认证和日志导出用于受控集成,不能绕过命令内核的业务授权;worker 入口单独从子路径使用。
|
|
4
|
+
*/
|
|
5
|
+
export { createServer, type ServerOptions, type CageServer, type ServerHealth } from './server.js';
|
|
2
6
|
export { registerRoutes, routeTable, commandUrl, type RouteInfo } from './routes.js';
|
|
3
7
|
export { buildOpenApi } from './openapi.js';
|
|
4
|
-
export { buildLogger, sensitiveFieldPaths } from './logger.js';
|
|
8
|
+
export { buildLogger, sensitiveFieldPaths, createLogSanitizer, createSafeLogger } from './logger.js';
|
|
5
9
|
export { CtxCache } from './ctx.js';
|
|
6
|
-
export { Sessions, verifyPassword, SESSION_COOKIE, type AuthOptions } from './auth.js';
|
|
10
|
+
export { Sessions, PasswordVerifier, verifyPassword, SESSION_COOKIE, type AuthOptions } from './auth.js';
|
|
7
11
|
export { upsertUserFromSso } from './oidc.js';
|
|
12
|
+
export { FileService, LocalFileStorage, type FileServiceOptions, type FileStorage } from '@yss123/cage-files';
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
// @yss123/cage-http:Fastify 插件、路由生成、认证、安全基线。
|
|
2
|
+
/** 应用 API 启动的公共入口。createServer 组合组织模型、安全插件、声明路由与运行时扩展,
|
|
3
|
+
* 并返回显式 ready/listen/close 生命周期;导入本模块本身不会监听端口或执行数据库迁移。
|
|
4
|
+
* 低层认证和日志导出用于受控集成,不能绕过命令内核的业务授权;worker 入口单独从子路径使用。
|
|
5
|
+
*/
|
|
2
6
|
export { createServer } from './server.js';
|
|
3
7
|
export { registerRoutes, routeTable, commandUrl } from './routes.js';
|
|
4
8
|
export { buildOpenApi } from './openapi.js';
|
|
5
|
-
export { buildLogger, sensitiveFieldPaths } from './logger.js';
|
|
9
|
+
export { buildLogger, sensitiveFieldPaths, createLogSanitizer, createSafeLogger } from './logger.js';
|
|
6
10
|
export { CtxCache } from './ctx.js';
|
|
7
|
-
export { Sessions, verifyPassword, SESSION_COOKIE } from './auth.js';
|
|
11
|
+
export { Sessions, PasswordVerifier, verifyPassword, SESSION_COOKIE } from './auth.js';
|
|
8
12
|
export { upsertUserFromSso } from './oidc.js';
|
|
13
|
+
export { FileService, LocalFileStorage } from '@yss123/cage-files';
|
|
9
14
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C;;;GAGG;AACH,OAAO,EAAE,YAAY,EAA0D,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAkB,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAoB,MAAM,WAAW,CAAC;AACzG,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAA6C,MAAM,oBAAoB,CAAC"}
|
package/dist/logger.d.ts
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
|
-
import type { Registry } from '@yss123/cage-kernel';
|
|
1
|
+
import type { Logger, Registry } from '@yss123/cage-kernel';
|
|
2
|
+
/** URL 的查询参数、片段和用户信息均不进入日志。 */
|
|
3
|
+
export declare function logUrl(value: unknown): string | undefined;
|
|
4
|
+
/** 错误文本与堆栈可能包含 SQL、凭据或业务值,只保留机器可读的错误类别。 */
|
|
5
|
+
export declare function logError(value: unknown): Record<string, unknown>;
|
|
6
|
+
/** 供受控结构化日志使用;数组、嵌套字段、循环引用均有明确处理,原对象保持不变。 */
|
|
7
|
+
export declare function createLogSanitizer(reg: Registry): (value: unknown) => unknown;
|
|
8
|
+
/** 保留兼容入口;真正的日志处理由递归序列化器承担。 */
|
|
2
9
|
export declare function sensitiveFieldPaths(reg: Registry): string[];
|
|
10
|
+
/**
|
|
11
|
+
* 构建 Fastify/Pino 配置:先只允许固定执行元数据进入日志,再递归脱敏保留下来的对象。
|
|
12
|
+
* 请求仅记录 ID、方法和路径,响应仅记录状态;请求体、查询参数、SQL 与错误堆栈均不默认输出。
|
|
13
|
+
* 业务新增日志字段不会自动获得输出许可,应先判断是否属于可公开的诊断元数据。
|
|
14
|
+
*/
|
|
3
15
|
export declare function buildLogger(reg: Registry): object;
|
|
16
|
+
/**
|
|
17
|
+
* 无 HTTP 服务实例的 worker 也使用同一元数据白名单,并按 LOG_LEVEL 输出单行 JSON。
|
|
18
|
+
* message 字符串原样进入日志,因此调用方只能传固定诊断文案,不能拼入凭据或业务载荷。
|
|
19
|
+
* 未识别的级别回落到 info 阈值;时间使用 ISO UTC,便于多进程时间线合并。
|
|
20
|
+
*/
|
|
21
|
+
export declare function createSafeLogger(reg: Registry): Logger;
|
package/dist/logger.js
CHANGED
|
@@ -1,27 +1,138 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
const SECRET_NAMES = ['password', 'passwordHash', 'password_hash', 'cookie', 'authorization', 'token', 'access_token', 'refresh_token', 'client_secret', 'secret', 'x-csrf-token', 'set-cookie'];
|
|
2
|
+
const METADATA = new Set(['requestId', 'capability', 'command', 'aggregate', 'aggregateId', 'outboxId', 'event', 'attempts', 'job', 'tenant', 'process', 'code', 'statusCode', 'durationMs', 'rows', 'addr', 'operation', 'kind', 'task', 'reason', 'consumer', 'connector', 'workerId', 'phase', 'retryable']);
|
|
3
|
+
/** 汇总内置密钥名称及声明中的敏感/隐藏字段,递归覆盖 JSON 结构,同时匹配驼峰与数据库下划线命名。 */
|
|
4
|
+
function sensitiveNames(reg) {
|
|
5
|
+
const names = new Set(SECRET_NAMES.map((name) => name.toLowerCase()));
|
|
6
|
+
const collect = (fields) => {
|
|
7
|
+
for (const [name, field] of Object.entries(fields)) {
|
|
8
|
+
if (field.sensitiveKind || field.isHidden) {
|
|
9
|
+
names.add(name.toLowerCase());
|
|
10
|
+
names.add(name.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`));
|
|
11
|
+
}
|
|
12
|
+
if (field.shape)
|
|
13
|
+
collect(field.shape);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
for (const declaration of [...reg.aggregates, ...reg.events]) {
|
|
17
|
+
collect(declaration.fields);
|
|
18
|
+
}
|
|
19
|
+
return names;
|
|
20
|
+
}
|
|
21
|
+
/** URL 的查询参数、片段和用户信息均不进入日志。 */
|
|
22
|
+
export function logUrl(value) {
|
|
23
|
+
if (typeof value !== 'string')
|
|
24
|
+
return undefined;
|
|
25
|
+
try {
|
|
26
|
+
return new URL(value, 'http://cage.invalid').pathname;
|
|
7
27
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
if (f.sensitiveKind)
|
|
11
|
-
names.add(k);
|
|
28
|
+
catch {
|
|
29
|
+
return undefined;
|
|
12
30
|
}
|
|
13
|
-
return [...names].flatMap((n) => [`*.${n}`, `req.body.${n}`]);
|
|
14
31
|
}
|
|
32
|
+
/** 错误文本与堆栈可能包含 SQL、凭据或业务值,只保留机器可读的错误类别。 */
|
|
33
|
+
export function logError(value) {
|
|
34
|
+
const error = value && typeof value === 'object' ? value : {};
|
|
35
|
+
const code = typeof error.code === 'string' && /^[A-Z0-9_-]{1,64}$/.test(error.code) ? error.code : undefined;
|
|
36
|
+
return { type: error instanceof TypeError ? 'TypeError' : 'Error', ...(code ? { code } : {}) };
|
|
37
|
+
}
|
|
38
|
+
/** 供受控结构化日志使用;数组、嵌套字段、循环引用均有明确处理,原对象保持不变。 */
|
|
39
|
+
export function createLogSanitizer(reg) {
|
|
40
|
+
const names = sensitiveNames(reg);
|
|
41
|
+
return (value) => {
|
|
42
|
+
const seen = new WeakSet();
|
|
43
|
+
const visit = (item, key = '') => {
|
|
44
|
+
if (names.has(key.toLowerCase()))
|
|
45
|
+
return '***';
|
|
46
|
+
if (key === 'err' || item instanceof Error)
|
|
47
|
+
return logError(item);
|
|
48
|
+
if (key === 'url')
|
|
49
|
+
return logUrl(item);
|
|
50
|
+
if (!item || typeof item !== 'object')
|
|
51
|
+
return item;
|
|
52
|
+
if (seen.has(item))
|
|
53
|
+
return '[Circular]';
|
|
54
|
+
seen.add(item);
|
|
55
|
+
const result = Array.isArray(item) ? item.map((child) => visit(child))
|
|
56
|
+
: Object.fromEntries(Object.entries(item).map(([name, child]) => [name, visit(child, name)]));
|
|
57
|
+
seen.delete(item);
|
|
58
|
+
return result;
|
|
59
|
+
};
|
|
60
|
+
return visit(value);
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/** 保留兼容入口;真正的日志处理由递归序列化器承担。 */
|
|
64
|
+
export function sensitiveFieldPaths(reg) {
|
|
65
|
+
const names = new Set();
|
|
66
|
+
const collect = (fields) => {
|
|
67
|
+
for (const [name, field] of Object.entries(fields)) {
|
|
68
|
+
if (field.sensitiveKind || field.isHidden)
|
|
69
|
+
names.add(name);
|
|
70
|
+
if (field.shape)
|
|
71
|
+
collect(field.shape);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
for (const declaration of [...reg.aggregates, ...reg.events])
|
|
75
|
+
collect(declaration.fields);
|
|
76
|
+
return [...names].flatMap((name) => [`*.${name}`, `req.body.${name}`]);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 构建 Fastify/Pino 配置:先只允许固定执行元数据进入日志,再递归脱敏保留下来的对象。
|
|
80
|
+
* 请求仅记录 ID、方法和路径,响应仅记录状态;请求体、查询参数、SQL 与错误堆栈均不默认输出。
|
|
81
|
+
* 业务新增日志字段不会自动获得输出许可,应先判断是否属于可公开的诊断元数据。
|
|
82
|
+
*/
|
|
15
83
|
export function buildLogger(reg) {
|
|
84
|
+
const sanitize = createLogSanitizer(reg);
|
|
16
85
|
return {
|
|
17
86
|
level: process.env.LOG_LEVEL ?? 'info',
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
87
|
+
serializers: {
|
|
88
|
+
err: logError,
|
|
89
|
+
req: (req) => ({ id: req.id, method: req.method, url: logUrl(req.url) }),
|
|
90
|
+
res: (res) => ({ statusCode: res.statusCode }),
|
|
91
|
+
},
|
|
92
|
+
formatters: {
|
|
93
|
+
log(record) {
|
|
94
|
+
const safe = {};
|
|
95
|
+
for (const [key, value] of Object.entries(record)) {
|
|
96
|
+
if (key === 'err')
|
|
97
|
+
safe.err = logError(value);
|
|
98
|
+
else if (key === 'url')
|
|
99
|
+
safe.url = logUrl(value);
|
|
100
|
+
else if (key === 'req' && value && typeof value === 'object') {
|
|
101
|
+
const req = value;
|
|
102
|
+
safe.req = { id: req.id, method: req.method, url: logUrl(req.url) };
|
|
103
|
+
}
|
|
104
|
+
else if (key === 'res' && value && typeof value === 'object')
|
|
105
|
+
safe.res = { statusCode: value.statusCode };
|
|
106
|
+
else if (METADATA.has(key) && ['string', 'number', 'boolean'].includes(typeof value))
|
|
107
|
+
safe[key] = value;
|
|
108
|
+
}
|
|
109
|
+
return sanitize(safe);
|
|
110
|
+
},
|
|
24
111
|
},
|
|
25
112
|
};
|
|
26
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* 无 HTTP 服务实例的 worker 也使用同一元数据白名单,并按 LOG_LEVEL 输出单行 JSON。
|
|
116
|
+
* message 字符串原样进入日志,因此调用方只能传固定诊断文案,不能拼入凭据或业务载荷。
|
|
117
|
+
* 未识别的级别回落到 info 阈值;时间使用 ISO UTC,便于多进程时间线合并。
|
|
118
|
+
*/
|
|
119
|
+
export function createSafeLogger(reg) {
|
|
120
|
+
const options = buildLogger(reg);
|
|
121
|
+
const levels = ['debug', 'info', 'warn', 'error'];
|
|
122
|
+
const thresholds = { trace: 0, debug: 0, info: 1, warn: 2, error: 3, fatal: 4, silent: Infinity };
|
|
123
|
+
const threshold = thresholds[process.env.LOG_LEVEL ?? 'info'] ?? 1;
|
|
124
|
+
const output = (level, object, message) => {
|
|
125
|
+
if (levels.indexOf(level) < threshold)
|
|
126
|
+
return;
|
|
127
|
+
const record = typeof object === 'string' ? {} : options.formatters.log(object);
|
|
128
|
+
const serialized = JSON.stringify({ time: new Date().toISOString(), level, ...record, msg: message ?? (typeof object === 'string' ? object : undefined) });
|
|
129
|
+
console[level](serialized);
|
|
130
|
+
};
|
|
131
|
+
return {
|
|
132
|
+
debug: (object, message) => output('debug', object, message),
|
|
133
|
+
info: (object, message) => output('info', object, message),
|
|
134
|
+
warn: (object, message) => output('warn', object, message),
|
|
135
|
+
error: (object, message) => output('error', object, message),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
27
138
|
//# sourceMappingURL=logger.js.map
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
package/dist/oidc.d.ts
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import { type Kernel } from '@yss123/cage-kernel';
|
|
2
2
|
import type { FastifyInstance } from 'fastify';
|
|
3
3
|
import { type AuthOptions, type Sessions } from './auth.js';
|
|
4
|
+
/** 按需注册 SSO 跳转和回调。签名短期 Cookie 保存 state/PKCE verifier,回调核对后即清除。
|
|
5
|
+
* 身份提供方网络访问发生在业务命令事务外;拿到 userinfo 后通过组织命令同步,再创建本地会话。
|
|
6
|
+
* 无 oidc 配置则不挂载路由;令牌或用户信息端点返回非成功状态时按 UNAUTHENTICATED 拒绝,不降级本地登录。
|
|
7
|
+
*/
|
|
4
8
|
export declare function oidcRoutes(app: FastifyInstance, k: Kernel, sessions: Sessions, opts: AuthOptions): void;
|
|
9
|
+
/** 将可信 userinfo 映射为默认租户用户,按 SSO subject 或用户名寻找已有身份。
|
|
10
|
+
* 部门 claim 按 code 匹配,缺失/未命中时归根部门;已有禁用用户不可借 SSO 重新激活。
|
|
11
|
+
* external 上下文仅授 User.create/update,所有写入仍走内核审计;不会自动分配任何业务角色。
|
|
12
|
+
*/
|
|
5
13
|
export declare function upsertUserFromSso(k: Kernel, claims: Record<string, any>, deptClaim?: string): Promise<{
|
|
6
14
|
id: string;
|
|
7
15
|
}>;
|
package/dist/oidc.js
CHANGED
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
import { createHash, randomBytes } from 'node:crypto';
|
|
4
4
|
import { cageError, DEFAULT_TENANT, systemCtx } from '@yss123/cage-kernel';
|
|
5
5
|
import { setSessionCookie } from './auth.js';
|
|
6
|
+
/** 按需注册 SSO 跳转和回调。签名短期 Cookie 保存 state/PKCE verifier,回调核对后即清除。
|
|
7
|
+
* 身份提供方网络访问发生在业务命令事务外;拿到 userinfo 后通过组织命令同步,再创建本地会话。
|
|
8
|
+
* 无 oidc 配置则不挂载路由;令牌或用户信息端点返回非成功状态时按 UNAUTHENTICATED 拒绝,不降级本地登录。
|
|
9
|
+
*/
|
|
6
10
|
export function oidcRoutes(app, k, sessions, opts) {
|
|
7
11
|
const o = opts.oidc;
|
|
8
12
|
if (!o)
|
|
@@ -60,6 +64,10 @@ export function oidcRoutes(app, k, sessions, opts) {
|
|
|
60
64
|
return reply.redirect('/');
|
|
61
65
|
});
|
|
62
66
|
}
|
|
67
|
+
/** 将可信 userinfo 映射为默认租户用户,按 SSO subject 或用户名寻找已有身份。
|
|
68
|
+
* 部门 claim 按 code 匹配,缺失/未命中时归根部门;已有禁用用户不可借 SSO 重新激活。
|
|
69
|
+
* external 上下文仅授 User.create/update,所有写入仍走内核审计;不会自动分配任何业务角色。
|
|
70
|
+
*/
|
|
63
71
|
export async function upsertUserFromSso(k, claims, deptClaim = 'department') {
|
|
64
72
|
const tenantId = DEFAULT_TENANT;
|
|
65
73
|
const ctx = systemCtx({ kind: 'external', name: 'sso', tenantId, capabilities: ['User.create', 'User.update'] });
|
package/dist/oidc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oidc.js","sourceRoot":"","sources":["../src/oidc.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yCAAyC;AACzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAe,MAAM,qBAAqB,CAAC;AAExF,OAAO,EAAE,gBAAgB,EAAmC,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"oidc.js","sourceRoot":"","sources":["../src/oidc.ts"],"names":[],"mappings":"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"}
|
package/dist/openapi.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { type Kernel } from '@yss123/cage-kernel';
|
|
2
2
|
import type { RouteInfo } from './routes.js';
|
|
3
|
+
/**
|
|
4
|
+
* 基于当前运行注册表生成 OpenAPI 3.1 文档,不读取业务数据,也不授予访问文档中操作的能力。
|
|
5
|
+
* 聚合响应排除隐藏字段和关系字段,敏感字段描述为可能掩码的字符串/空值;关联集合使用独立分页接口。
|
|
6
|
+
* 按路由种类补齐任务 202、文件 Range、上传分片和幂等头等协议,最后合并运行时扩展公开的操作。
|
|
7
|
+
* 生成结果表达接口形状与能力名称,真实授权、数据范围、状态和事务约束仍由执行路径判定。
|
|
8
|
+
*/
|
|
3
9
|
export declare function buildOpenApi(k: Kernel, routes: RouteInfo[], info?: {
|
|
4
10
|
title?: string;
|
|
5
11
|
version?: string;
|
package/dist/openapi.js
CHANGED
|
@@ -1,15 +1,37 @@
|
|
|
1
1
|
// 启动时根据注册表输出一份 OpenAPI 文档;前端 SDK 由 cage gen 从声明里的 Zod schema 生成。
|
|
2
|
-
import { hiddenFields, isRelation } from '@yss123/cage-kernel';
|
|
2
|
+
import { hiddenFields, isRelation, runtimeServices } from '@yss123/cage-kernel';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
const ERR = { $ref: '#/components/schemas/CageError' };
|
|
5
|
+
/**
|
|
6
|
+
* 将输入 Zod schema 投影为 OpenAPI 可表达的 JSON Schema,不声称覆盖全部服务端行为。
|
|
7
|
+
* 自定义检查、转换和带标志正则等无法等价表示时标记服务端校验;避免文档产生错误的客户端约束。
|
|
8
|
+
* catch/overwrite 会改变接受值或结果,清除不再可靠的结构描述;实际请求仍按原 Zod 声明处理。
|
|
9
|
+
*/
|
|
5
10
|
function schemaOf(s) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
return z.toJSONSchema(s, {
|
|
12
|
+
unrepresentable: 'any', io: 'input',
|
|
13
|
+
override: ({ zodSchema, jsonSchema }) => {
|
|
14
|
+
const def = zodSchema._zod?.def;
|
|
15
|
+
const custom = def?.checks?.some((check) => ['custom', 'overwrite'].includes(check._zod?.def?.check));
|
|
16
|
+
const flaggedPattern = def?.checks?.some((check) => check._zod?.def?.pattern instanceof RegExp && check._zod.def.pattern.flags);
|
|
17
|
+
if (def?.type === 'catch' || def?.checks?.some((check) => check._zod?.def?.check === 'overwrite'))
|
|
18
|
+
for (const key of Object.keys(jsonSchema))
|
|
19
|
+
delete jsonSchema[key];
|
|
20
|
+
else if (flaggedPattern) {
|
|
21
|
+
delete jsonSchema.pattern;
|
|
22
|
+
delete jsonSchema.allOf;
|
|
23
|
+
}
|
|
24
|
+
if (custom || flaggedPattern || def?.coerce || ['transform', 'pipe', 'date', 'bigint', 'custom', 'catch', 'prefault', 'lazy', 'undefined', 'void', 'file', 'readonly', 'map', 'set', 'symbol', 'promise', 'function'].includes(def?.type))
|
|
25
|
+
Object.assign(jsonSchema, { 'x-cage-server-validation': true, 'x-cage-validation-note': '自定义或不可表达的校验仅在服务端执行;本 schema 不代表完整验证。' });
|
|
26
|
+
},
|
|
27
|
+
});
|
|
12
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* 基于当前运行注册表生成 OpenAPI 3.1 文档,不读取业务数据,也不授予访问文档中操作的能力。
|
|
31
|
+
* 聚合响应排除隐藏字段和关系字段,敏感字段描述为可能掩码的字符串/空值;关联集合使用独立分页接口。
|
|
32
|
+
* 按路由种类补齐任务 202、文件 Range、上传分片和幂等头等协议,最后合并运行时扩展公开的操作。
|
|
33
|
+
* 生成结果表达接口形状与能力名称,真实授权、数据范围、状态和事务约束仍由执行路径判定。
|
|
34
|
+
*/
|
|
13
35
|
export function buildOpenApi(k, routes, info = {}) {
|
|
14
36
|
const schemas = {
|
|
15
37
|
CageError: {
|
|
@@ -83,8 +105,43 @@ export function buildOpenApi(k, routes, info = {}) {
|
|
|
83
105
|
op.responses[200] = { description: '本人已完成且未过期的文件;重新检查权限', content: { 'text/csv': { schema: { type: 'string' } }, 'application/json': { schema: { type: 'object' } } } };
|
|
84
106
|
if (['command', 'export', 'import'].includes(r.kind))
|
|
85
107
|
op.parameters = [...(op.parameters ?? []), { name: 'Idempotency-Key', in: 'header', required: r.kind !== 'command', schema: { type: 'string', minLength: 1, maxLength: 200 } }];
|
|
108
|
+
if (r.kind.startsWith('upload-')) {
|
|
109
|
+
const sessionSchema = {
|
|
110
|
+
type: 'object', required: ['id', 'status', 'partBytes', 'partCount', 'parts', 'bytes', 'expiresAt'],
|
|
111
|
+
properties: { id: { type: 'string', format: 'uuid' }, status: { type: 'string', enum: ['uploading', 'completing', 'ready', 'bound', 'deleting', 'deleted'] },
|
|
112
|
+
partBytes: { type: 'integer' }, partCount: { type: 'integer' }, bytes: { type: 'integer' }, filename: { type: 'string' }, contentType: { type: 'string' },
|
|
113
|
+
aggregate: { type: 'string' }, field: { type: 'string' }, command: { type: 'string' }, targetId: { type: ['string', 'null'], format: 'uuid' }, expiresAt: { type: 'string', format: 'date-time' },
|
|
114
|
+
parts: { type: 'array', items: { type: 'object', properties: { number: { type: 'integer' }, bytes: { type: 'integer' }, sha256: { type: 'string' } } } } },
|
|
115
|
+
};
|
|
116
|
+
if (['upload-begin', 'upload-get', 'upload-complete', 'upload-list'].includes(r.kind))
|
|
117
|
+
op.responses[200].content['application/json'].schema = r.kind === 'upload-list' ? { type: 'array', items: sessionSchema } : sessionSchema;
|
|
118
|
+
op.description = '需要登录及目标用户命令能力;修改已有对象时检查 read/范围和命令起始状态。会话只对上传者开放。';
|
|
119
|
+
if (r.kind === 'upload-begin')
|
|
120
|
+
op.parameters = [{ name: 'Idempotency-Key', in: 'header', required: true, schema: { type: 'string', maxLength: 200 } }];
|
|
121
|
+
if (r.kind === 'upload-list')
|
|
122
|
+
op.parameters = [
|
|
123
|
+
{ name: 'command', in: 'query', required: true, schema: { type: 'string' } }, { name: 'field', in: 'query', required: true, schema: { type: 'string' } }, { name: 'targetId', in: 'query', schema: { type: 'string', format: 'uuid' } },
|
|
124
|
+
];
|
|
125
|
+
if (r.kind === 'upload-part') {
|
|
126
|
+
op.parameters = [...(op.parameters ?? []), { name: 'number', in: 'path', required: true, schema: { type: 'integer', minimum: 1 } },
|
|
127
|
+
{ name: 'X-Content-SHA256', in: 'header', required: true, schema: { type: 'string', pattern: '^[0-9a-f]{64}$' } },
|
|
128
|
+
{ name: 'Content-Length', in: 'header', required: true, schema: { type: 'integer', minimum: 1 } }];
|
|
129
|
+
op.requestBody = { required: true, content: { 'application/octet-stream': { schema: { type: 'string', format: 'binary' } } } };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (r.kind === 'file-info')
|
|
133
|
+
op.responses[200].content['application/json'].schema = { type: 'object', properties: { id: { type: 'string', format: 'uuid' }, filename: { type: 'string' }, bytes: { type: 'integer' }, contentType: { type: 'string' } } };
|
|
134
|
+
if (r.kind === 'file-download') {
|
|
135
|
+
op.description = '按所属对象当前 read/范围授权,交付前可靠审计;临时文件仅上传者可下载。';
|
|
136
|
+
op.parameters = [...(op.parameters ?? []), { name: 'Range', in: 'header', schema: { type: 'string' }, description: '单个 bytes 范围,支持后缀范围' }];
|
|
137
|
+
op.responses = { 200: { description: '完整私有文件', content: { 'application/octet-stream': { schema: { type: 'string', format: 'binary' } } } },
|
|
138
|
+
206: { description: '单段文件内容' }, 416: { description: '范围非法' }, default: { description: '错误', content: { 'application/json': { schema: ERR } } } };
|
|
139
|
+
}
|
|
86
140
|
(paths[url] ??= {})[r.method.toLowerCase()] = op;
|
|
87
141
|
}
|
|
142
|
+
for (const service of runtimeServices(k))
|
|
143
|
+
for (const [path, operations] of Object.entries(service.openapi?.() ?? {}))
|
|
144
|
+
paths[path] = { ...paths[path], ...operations };
|
|
88
145
|
return { openapi: '3.1.0', info: { title: info.title ?? 'cage api', version: info.version ?? '0.0.0' }, paths, components: { schemas } };
|
|
89
146
|
}
|
|
90
147
|
//# sourceMappingURL=openapi.js.map
|
package/dist/openapi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"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"}
|
package/dist/routes.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
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' | 'related' | 'export' | 'query' | 'hook' | 'import' | 'transfer-list' | 'transfer-get' | 'transfer-download' | 'transfer-options';
|
|
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;
|
|
10
11
|
/** related 的响应类型来自目标聚合,所属对象仍在 aggregate 中。 */
|
|
@@ -13,7 +14,18 @@ export interface RouteInfo {
|
|
|
13
14
|
command?: RegisteredCommand;
|
|
14
15
|
input?: z.ZodType;
|
|
15
16
|
}
|
|
17
|
+
/** 创建命令尚无对象 ID,其余命令将 ID 放入路径;命名转换与生成契约保持一致。 */
|
|
16
18
|
export declare function commandUrl(c: RegisteredCommand): string;
|
|
17
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
* 注册表转换为路由清单,供 HTTP 文档及生成工具使用;本函数本身不注册 Fastify handler。
|
|
21
|
+
* 仅 user 命令有浏览器入口,流程/任务/外部命令必须通过各自受控调用链执行。
|
|
22
|
+
* 关联读取列出源、目标双方能力;查询列出 reads 依赖,使消费者看到完整读权限边界。
|
|
23
|
+
*/
|
|
18
24
|
export declare function routeTable(k: Kernel): RouteInfo[];
|
|
25
|
+
/**
|
|
26
|
+
* 将请求上下文与输入交给内核,并返回相同注册表派生的文档清单。
|
|
27
|
+
* 对象命令使用路径 ID 覆盖请求体 ID,防止 URL 与实际写目标不一致;用户命令幂等键最多取 200 字符。
|
|
28
|
+
* 入站回调先使用原始请求体验签,再验证载荷并映射命令;external 身份仅持有该目标命令能力。
|
|
29
|
+
* 文件路由在 server 中另行注册,通用导入导出在这里注册;二者仍出现在返回的完整清单中。
|
|
30
|
+
*/
|
|
19
31
|
export declare function registerRoutes(app: FastifyInstance, k: Kernel): RouteInfo[];
|