@yss123/cage-kernel 0.0.0-stage → 0.2.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.
Files changed (108) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +20 -2
  3. package/dist/brands.d.ts +32 -0
  4. package/dist/brands.js +35 -0
  5. package/dist/brands.js.map +1 -0
  6. package/dist/db/connect.d.ts +28 -0
  7. package/dist/db/connect.js +57 -0
  8. package/dist/db/connect.js.map +1 -0
  9. package/dist/db/ddl.d.ts +69 -0
  10. package/dist/db/ddl.js +522 -0
  11. package/dist/db/ddl.js.map +1 -0
  12. package/dist/db/index.d.ts +5 -0
  13. package/dist/db/index.js +7 -0
  14. package/dist/db/index.js.map +1 -0
  15. package/dist/db/migrate.d.ts +22 -0
  16. package/dist/db/migrate.js +87 -0
  17. package/dist/db/migrate.js.map +1 -0
  18. package/dist/db/rows.d.ts +10 -0
  19. package/dist/db/rows.js +59 -0
  20. package/dist/db/rows.js.map +1 -0
  21. package/dist/db/session.d.ts +4 -0
  22. package/dist/db/session.js +20 -0
  23. package/dist/db/session.js.map +1 -0
  24. package/dist/errors.d.ts +44 -0
  25. package/dist/errors.js +83 -0
  26. package/dist/errors.js.map +1 -0
  27. package/dist/index.d.ts +23 -0
  28. package/dist/index.js +25 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/kernel.d.ts +99 -0
  31. package/dist/kernel.js +456 -0
  32. package/dist/kernel.js.map +1 -0
  33. package/dist/mask.d.ts +13 -0
  34. package/dist/mask.js +67 -0
  35. package/dist/mask.js.map +1 -0
  36. package/dist/org.d.ts +46 -0
  37. package/dist/org.js +127 -0
  38. package/dist/org.js.map +1 -0
  39. package/dist/pipeline/idempotency.d.ts +10 -0
  40. package/dist/pipeline/idempotency.js +29 -0
  41. package/dist/pipeline/idempotency.js.map +1 -0
  42. package/dist/pipeline/load.d.ts +15 -0
  43. package/dist/pipeline/load.js +87 -0
  44. package/dist/pipeline/load.js.map +1 -0
  45. package/dist/primitives/aggregate.d.ts +75 -0
  46. package/dist/primitives/aggregate.js +69 -0
  47. package/dist/primitives/aggregate.js.map +1 -0
  48. package/dist/primitives/command.d.ts +101 -0
  49. package/dist/primitives/command.js +49 -0
  50. package/dist/primitives/command.js.map +1 -0
  51. package/dist/primitives/constraints.d.ts +36 -0
  52. package/dist/primitives/constraints.js +41 -0
  53. package/dist/primitives/constraints.js.map +1 -0
  54. package/dist/primitives/event.d.ts +31 -0
  55. package/dist/primitives/event.js +44 -0
  56. package/dist/primitives/event.js.map +1 -0
  57. package/dist/primitives/fields.d.ts +127 -0
  58. package/dist/primitives/fields.js +151 -0
  59. package/dist/primitives/fields.js.map +1 -0
  60. package/dist/primitives/flow.d.ts +126 -0
  61. package/dist/primitives/flow.js +90 -0
  62. package/dist/primitives/flow.js.map +1 -0
  63. package/dist/primitives/states.d.ts +19 -0
  64. package/dist/primitives/states.js +37 -0
  65. package/dist/primitives/states.js.map +1 -0
  66. package/dist/read.d.ts +53 -0
  67. package/dist/read.js +217 -0
  68. package/dist/read.js.map +1 -0
  69. package/dist/registry.d.ts +71 -0
  70. package/dist/registry.js +177 -0
  71. package/dist/registry.js.map +1 -0
  72. package/dist/relations.d.ts +14 -0
  73. package/dist/relations.js +58 -0
  74. package/dist/relations.js.map +1 -0
  75. package/dist/scope/index.d.ts +42 -0
  76. package/dist/scope/index.js +90 -0
  77. package/dist/scope/index.js.map +1 -0
  78. package/dist/telemetry.d.ts +11 -0
  79. package/dist/telemetry.js +35 -0
  80. package/dist/telemetry.js.map +1 -0
  81. package/dist/transfer/csv.d.ts +8 -0
  82. package/dist/transfer/csv.js +114 -0
  83. package/dist/transfer/csv.js.map +1 -0
  84. package/dist/transfer/index.d.ts +49 -0
  85. package/dist/transfer/index.js +245 -0
  86. package/dist/transfer/index.js.map +1 -0
  87. package/dist/transfer/schema.d.ts +4 -0
  88. package/dist/transfer/schema.js +31 -0
  89. package/dist/transfer/schema.js.map +1 -0
  90. package/dist/types.d.ts +52 -0
  91. package/dist/types.js +5 -0
  92. package/dist/types.js.map +1 -0
  93. package/dist/util/names.d.ts +9 -0
  94. package/dist/util/names.js +38 -0
  95. package/dist/util/names.js.map +1 -0
  96. package/dist/worker/consumers.d.ts +29 -0
  97. package/dist/worker/consumers.js +79 -0
  98. package/dist/worker/consumers.js.map +1 -0
  99. package/dist/worker/index.d.ts +36 -0
  100. package/dist/worker/index.js +122 -0
  101. package/dist/worker/index.js.map +1 -0
  102. package/dist/worker/outbox.d.ts +38 -0
  103. package/dist/worker/outbox.js +121 -0
  104. package/dist/worker/outbox.js.map +1 -0
  105. package/dist/worker/scheduler.d.ts +7 -0
  106. package/dist/worker/scheduler.js +77 -0
  107. package/dist/worker/scheduler.js.map +1 -0
  108. package/package.json +58 -3
@@ -0,0 +1,90 @@
1
+ import { z } from 'zod';
2
+ import { APPROVAL, JOB, QUERY, REACTION, UNSAFE } from '../brands.js';
3
+ import { declError } from '../errors.js';
4
+ export function reaction(ev, def) {
5
+ if (def.target && def.target !== def.command.agg) {
6
+ throw declError('CAGE-REACT-001', `反应的 target 与 command 所属聚合不一致`);
7
+ }
8
+ return Object.freeze({
9
+ [REACTION]: true,
10
+ event: ev,
11
+ command: def.command,
12
+ target: def.command.agg,
13
+ map: def.map,
14
+ tx: def.tx ?? 'outbox',
15
+ acquires: def.acquires,
16
+ releases: def.releases,
17
+ name: def.name,
18
+ });
19
+ }
20
+ export function query(name, def) {
21
+ if (!/^[a-z][A-Za-z0-9]*$/.test(name))
22
+ throw declError('CAGE-NAME-005', `查询名 ${name} 必须是小驼峰`);
23
+ if (!def.sql === !def.build)
24
+ throw declError('CAGE-QUERY-001', `查询 ${name} 必须二选一:sql 或 build`);
25
+ if (def.sql && /\bcore\.|\bsys\./i.test(def.sql)) {
26
+ throw declError('CAGE-QUERY-002', `查询 ${name} 引用了基表,只能引用 safe.* 安全视图`);
27
+ }
28
+ return Object.freeze({
29
+ [QUERY]: true,
30
+ name,
31
+ reads: Object.freeze([...def.reads]),
32
+ input: (def.input ?? z.object({})),
33
+ sql: def.sql,
34
+ build: def.build,
35
+ description: def.description,
36
+ });
37
+ }
38
+ export function approval(agg, def) {
39
+ for (const f of def.routable) {
40
+ if (!(f in agg.fields))
41
+ throw declError('CAGE-APPR-001', `可路由字段 ${agg.name}.${f} 不存在`);
42
+ }
43
+ for (const c of [def.onApproved, def.onRejected]) {
44
+ if (c.agg !== agg)
45
+ throw declError('CAGE-APPR-002', `审批结论命令必须属于 ${agg.name}`);
46
+ if (!c.invokedBy.includes('process')) {
47
+ throw declError('CAGE-APPR-003', `审批结论命令必须声明 invokedBy: 'process'`);
48
+ }
49
+ }
50
+ return Object.freeze({
51
+ [APPROVAL]: true,
52
+ agg,
53
+ process: def.process,
54
+ start: def.start,
55
+ cancelOn: Object.freeze([...(def.cancelOn ?? [])]),
56
+ routable: Object.freeze([...def.routable]),
57
+ onApproved: def.onApproved,
58
+ onRejected: def.onRejected,
59
+ });
60
+ }
61
+ export function job(name, def) {
62
+ if (!/^[a-z][A-Za-z0-9]*$/.test(name))
63
+ throw declError('CAGE-NAME-006', `任务名 ${name} 必须是小驼峰`);
64
+ if (def.cron.trim().split(/\s+/).length < 5)
65
+ throw declError('CAGE-JOB-001', `任务 ${name} 的 cron 表达式不合法`);
66
+ return Object.freeze({
67
+ [JOB]: true,
68
+ name,
69
+ cron: def.cron,
70
+ reads: Object.freeze([...(def.reads ?? [])]),
71
+ calls: Object.freeze([...(def.calls ?? [])]),
72
+ run: def.run,
73
+ description: def.description,
74
+ });
75
+ }
76
+ /** 前 N 天 */
77
+ export function daysAgo(n, from = new Date()) {
78
+ return new Date(from.getTime() - n * 24 * 3600 * 1000);
79
+ }
80
+ /**
81
+ * 逃生口:声明表达不了时使用,必须写明原因和负责人。lint 检查参数,计数进 PR 摘要。
82
+ * const v = unsafe({ reason: '…', owner: 'zhangsan' }, () => …)
83
+ */
84
+ export function unsafe(tag, fn) {
85
+ if (!tag?.reason || !tag?.owner)
86
+ throw declError('CAGE-UNSAFE-001', 'unsafe 必须写明 reason 和 owner');
87
+ return fn();
88
+ }
89
+ unsafe[UNSAFE] = true;
90
+ //# sourceMappingURL=flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow.js","sourceRoot":"","sources":["../../src/primitives/flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { STATES } from '../brands.js';
2
+ export interface StatesDef<S extends string = string> {
3
+ readonly [STATES]: true;
4
+ readonly values: readonly S[];
5
+ readonly terminal: readonly S[];
6
+ readonly initial: S;
7
+ }
8
+ type StatesOpts<S extends string> = {
9
+ terminal?: NoInfer<S>[];
10
+ initial?: NoInfer<S>;
11
+ };
12
+ /**
13
+ * states('draft', 'pending_approval', 'approved', { terminal: ['approved'] })
14
+ */
15
+ export declare function states<const S extends string>(...args: [...S[]] | [...S[], StatesOpts<S>]): StatesDef<S>;
16
+ export declare function isStates(v: unknown): v is StatesDef;
17
+ /** 没有声明状态的聚合使用默认生命周期:active → deleted(业务数据不物理删除) */
18
+ export declare const DEFAULT_STATES: StatesDef<string>;
19
+ export {};
@@ -0,0 +1,37 @@
1
+ // states 原语:有限状态集,可标记终态。第一个状态是新建命令的默认初始状态。
2
+ import { STATES } from '../brands.js';
3
+ import { declError } from '../errors.js';
4
+ /**
5
+ * states('draft', 'pending_approval', 'approved', { terminal: ['approved'] })
6
+ */
7
+ export function states(...args) {
8
+ const all = args;
9
+ const last = all[all.length - 1];
10
+ const opts = (typeof last === 'object' && last !== null ? last : {});
11
+ const values = all.filter((a) => typeof a === 'string');
12
+ if (values.length === 0)
13
+ throw declError('CAGE-STATE-002', 'states() 至少需要一个状态');
14
+ for (const v of values) {
15
+ if (!/^[a-z][a-z0-9_]*$/.test(v))
16
+ throw declError('CAGE-STATE-003', `状态名 ${v} 必须是小写下划线`);
17
+ }
18
+ if (new Set(values).size !== values.length)
19
+ throw declError('CAGE-STATE-004', '状态名重复');
20
+ const terminal = opts.terminal ?? [];
21
+ for (const t of [...terminal, ...(opts.initial ? [opts.initial] : [])]) {
22
+ if (!values.includes(t))
23
+ throw declError('CAGE-STATE-001', `状态 ${t} 未在 states 中声明`);
24
+ }
25
+ return Object.freeze({
26
+ [STATES]: true,
27
+ values: Object.freeze([...values]),
28
+ terminal: Object.freeze([...terminal]),
29
+ initial: (opts.initial ?? values[0]),
30
+ });
31
+ }
32
+ export function isStates(v) {
33
+ return !!v && typeof v === 'object' && v[STATES] === true;
34
+ }
35
+ /** 没有声明状态的聚合使用默认生命周期:active → deleted(业务数据不物理删除) */
36
+ export const DEFAULT_STATES = states('active', 'deleted', { terminal: ['deleted'] });
37
+ //# sourceMappingURL=states.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"states.js","sourceRoot":"","sources":["../../src/primitives/states.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAWzC;;GAEG;AACH,MAAM,UAAU,MAAM,CAAyB,GAAG,IAAwC;IACxF,MAAM,GAAG,GAAG,IAAiB,CAAC;IAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAoC,CAAC;IACxG,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAU,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAChE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,SAAS,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;IAChF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,MAAM,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;QAAE,MAAM,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,MAAM,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,CAAC,MAAM,CAAC,EAAE,IAAa;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;QACtC,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAM;KAC1C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAU;IACjC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAK,CAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;AACrE,CAAC;AAED,oDAAoD;AACpD,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC"}
package/dist/read.d.ts ADDED
@@ -0,0 +1,53 @@
1
+ import { type Transaction } from 'kysely';
2
+ import { z } from 'zod';
3
+ import type { Kernel } from './kernel.js';
4
+ import { type AnyAggregate } from './primitives/aggregate.js';
5
+ import type { AnyQuery } from './primitives/flow.js';
6
+ import type { Ctx } from './types.js';
7
+ export interface ListParams {
8
+ page?: number | string;
9
+ pageSize?: number | string;
10
+ /** 排序:字段名,前面加 - 表示倒序,例如 -createdAt */
11
+ sort?: string;
12
+ createdAfter?: string;
13
+ createdBefore?: string;
14
+ /** 其他键:字段等值过滤;status 可以逗号分隔多个 */
15
+ [field: string]: unknown;
16
+ }
17
+ export interface Page<T> {
18
+ items: T[];
19
+ total: number;
20
+ page: number;
21
+ pageSize: number;
22
+ }
23
+ export declare class ReadSide {
24
+ private readonly k;
25
+ constructor(k: Kernel);
26
+ /** 读侧账号上的只读事务,已写入会话变量 */
27
+ tx<T>(ctx: Ctx, fn: (tx: Transaction<any>) => Promise<T>, isolation?: 'read committed' | 'repeatable read'): Promise<T>;
28
+ private agg;
29
+ private need;
30
+ /** 明文读取敏感字段要写读审计 */
31
+ private auditUnmask;
32
+ get(a: AnyAggregate | string, id: string, ctx: Ctx): Promise<Record<string, any>>;
33
+ list(a: AnyAggregate | string, params: ListParams, ctx: Ctx): Promise<Page<Record<string, any>>>;
34
+ /** 关联按需分页:先确认所属对象可见,再从目标安全视图读取;两侧能力、范围和掩码都生效。 */
35
+ related(a: AnyAggregate | string, id: string, fieldName: string, params: ListParams, ctx: Ctx): Promise<Page<Record<string, any>>>;
36
+ private listIn;
37
+ /**
38
+ * worker 使用的导出构建器:同一只读快照内分批读取,避免翻页期间数据变化导致漏行或重复。
39
+ * 上限用于约束单任务内存与数据库文件存储;超限明确失败,绝不能静默截断成“成功文件”。
40
+ * HTTP 只提交任务,保留本方法供受控的服务端调用。
41
+ */
42
+ export(a: AnyAggregate | string, params: ListParams, ctx: Ctx): Promise<{
43
+ filename: string;
44
+ contentType: string;
45
+ body: string;
46
+ rows: number;
47
+ }>;
48
+ /** 执行 query 声明:需要 reads 里每个聚合的 read 能力;手写 SQL 用 :name 占位,全部参数化 */
49
+ run(q: AnyQuery | string, raw: unknown, ctx: Ctx): Promise<Record<string, any>[]>;
50
+ }
51
+ /** :name 占位 → 参数化 SQL(:: 类型转换不受影响) */
52
+ export declare function compileNamedSql(text: string, input: Record<string, unknown>): import("kysely").RawBuilder<Record<string, unknown>>;
53
+ export declare const listParamsSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
package/dist/read.js ADDED
@@ -0,0 +1,217 @@
1
+ // 读侧:只用读侧账号,只查 safe 模式下的安全视图;内核在只读事务开头写会话变量,
2
+ // 行级策略和掩码由数据库兜底。忘了设置上下文时一条都查不到。
3
+ import { sql } from 'kysely';
4
+ import { z } from 'zod';
5
+ import { viewRowToObject } from './db/rows.js';
6
+ import { setSessionVars } from './db/session.js';
7
+ import { cageError } from './errors.js';
8
+ import { hiddenFields, sensitiveFields } from './primitives/aggregate.js';
9
+ import { isRelation } from './primitives/fields.js';
10
+ import { snake } from './util/names.js';
11
+ import { csvCell } from './transfer/csv.js';
12
+ import { relationTable } from './relations.js';
13
+ const SYS = { id: 'id', status: 'status', version: 'version', createdAt: 'created_at', updatedAt: 'updated_at' };
14
+ const RESERVED = new Set(['page', 'pageSize', 'sort', 'createdAfter', 'createdBefore']);
15
+ function coerce(kind, v) {
16
+ if (typeof v !== 'string')
17
+ return v;
18
+ if (kind === 'int' || kind === 'number')
19
+ return Number(v);
20
+ if (kind === 'bool')
21
+ return v === 'true';
22
+ return v;
23
+ }
24
+ export class ReadSide {
25
+ k;
26
+ constructor(k) {
27
+ this.k = k;
28
+ }
29
+ /** 读侧账号上的只读事务,已写入会话变量 */
30
+ async tx(ctx, fn, isolation = 'read committed') {
31
+ return this.k.readDb
32
+ .transaction()
33
+ .setIsolationLevel(isolation)
34
+ .setAccessMode('read only')
35
+ .execute(async (tx) => {
36
+ await setSessionVars(tx, ctx);
37
+ return fn(tx);
38
+ });
39
+ }
40
+ agg(a) {
41
+ const agg = typeof a === 'string' ? this.k.registry.aggregate(a) : a;
42
+ if (!agg)
43
+ throw cageError('NOT_FOUND');
44
+ return agg;
45
+ }
46
+ need(ctx, cap) {
47
+ if (!ctx.actor || ctx.actor.kind === 'anonymous')
48
+ throw cageError('UNAUTHENTICATED');
49
+ if (!ctx.capabilities.has(cap))
50
+ throw cageError('FORBIDDEN', { capability: cap });
51
+ }
52
+ /** 明文读取敏感字段要写读审计 */
53
+ async auditUnmask(agg, ctx, ids, kind) {
54
+ const kinds = [...new Set(Object.values(sensitiveFields(agg)))].filter((x) => ctx.unmask.includes(`${agg.name}.${x}`) || ctx.unmask.includes(`*.${x}`));
55
+ if (kind === 'read' && kinds.length === 0)
56
+ return;
57
+ await this.k.writeAudit(this.k.app, {
58
+ tenantId: ctx.tenantId, actor: ctx.actor?.id ?? 'anonymous', actorKind: ctx.actor?.kind ?? 'anonymous',
59
+ onBehalfOf: ctx.onBehalfOf ?? null, source: ctx.source, kind: 'read',
60
+ capability: `${agg.name}.${kind}`, command: null, aggregate: agg.name,
61
+ aggregateId: ids.length === 1 ? ids[0] : null, result: 'ok',
62
+ diff: { unmasked: kinds, rows: ids.length }, requestId: ctx.requestId ?? null, client: ctx.client ?? null,
63
+ }).catch((e) => {
64
+ // 导出会产生可离线保存的文件,审计失败不能交付文件;交给任务系统重试。
65
+ if (kind === 'export')
66
+ throw e;
67
+ this.k.log.warn({ err: String(e) }, '读审计写入失败');
68
+ });
69
+ }
70
+ async get(a, id, ctx) {
71
+ const agg = this.agg(a);
72
+ this.need(ctx, `${agg.name}.read`);
73
+ if (!/^[0-9a-f-]{36}$/i.test(id))
74
+ throw cageError('NOT_FOUND');
75
+ const row = await this.tx(ctx, (tx) => tx.selectFrom(`safe.${agg.table.name}`).selectAll().where('id', '=', id).executeTakeFirst());
76
+ if (!row)
77
+ throw cageError('NOT_FOUND');
78
+ void this.auditUnmask(agg, ctx, [id], 'read');
79
+ return viewRowToObject(row);
80
+ }
81
+ async list(a, params, ctx) {
82
+ const agg = this.agg(a);
83
+ this.need(ctx, `${agg.name}.read`);
84
+ const res = await this.tx(ctx, (tx) => this.listIn(tx, agg, params, 200));
85
+ void this.auditUnmask(agg, ctx, res.items.map((r) => r.id), 'read');
86
+ return res;
87
+ }
88
+ /** 关联按需分页:先确认所属对象可见,再从目标安全视图读取;两侧能力、范围和掩码都生效。 */
89
+ async related(a, id, fieldName, params, ctx) {
90
+ const owner = this.agg(a), field = owner.fields[fieldName];
91
+ this.need(ctx, `${owner.name}.read`);
92
+ if (!field || !isRelation(field) || !/^[0-9a-f-]{36}$/i.test(id))
93
+ throw cageError('NOT_FOUND');
94
+ const target = this.agg(field.ref);
95
+ this.need(ctx, `${target.name}.read`);
96
+ const res = await this.tx(ctx, async (tx) => {
97
+ const source = await tx.selectFrom(`safe.${owner.table.name}`).select('id').where('id', '=', id).where('status', '<>', 'deleted').executeTakeFirst();
98
+ if (!source)
99
+ throw cageError('NOT_FOUND');
100
+ const table = relationTable(owner, fieldName);
101
+ const restrict = field.kind === 'hasMany'
102
+ ? (q) => q.where(sql.ref(snake(field.mappedBy)), '=', id)
103
+ : (q) => q.where('id', 'in', tx.selectFrom(`safe.${table.name}`).select('target_id').where('source_id', '=', id));
104
+ return this.listIn(tx, target, params, 200, true, restrict);
105
+ }, 'repeatable read');
106
+ void this.auditUnmask(target, ctx, res.items.map((row) => row.id), 'read');
107
+ return res;
108
+ }
109
+ async listIn(tx, agg, params, maxPageSize, count = true, restrict = (q) => q) {
110
+ const page = Math.max(1, Number(params.page ?? 1) || 1);
111
+ const pageSize = Math.min(maxPageSize, Math.max(1, Number(params.pageSize ?? 20) || 20));
112
+ const hidden = new Set(hiddenFields(agg));
113
+ const view = `safe.${agg.table.name}`;
114
+ const apply = (q) => {
115
+ for (const [k, v] of Object.entries(params)) {
116
+ if (RESERVED.has(k) || v === undefined || v === '')
117
+ continue;
118
+ const f = agg.fields[k];
119
+ const col = SYS[k] ?? (f && !isRelation(f) && !hidden.has(k) && f.sql !== 'jsonb' && !f.sensitiveKind ? snake(k) : undefined);
120
+ if (!col)
121
+ throw cageError('INVALID_INPUT', [{ path: k, message: `不能按 ${k} 过滤` }]);
122
+ if (k === 'status' && typeof v === 'string' && v.includes(','))
123
+ q = q.where('status', 'in', v.split(','));
124
+ else
125
+ q = q.where(sql.ref(col), '=', coerce(f?.kind ?? 'text', v));
126
+ }
127
+ if (params.status === undefined)
128
+ q = q.where('status', '<>', 'deleted');
129
+ if (params.createdAfter)
130
+ q = q.where('created_at', '>=', new Date(String(params.createdAfter)));
131
+ if (params.createdBefore)
132
+ q = q.where('created_at', '<', new Date(String(params.createdBefore)));
133
+ return restrict(q);
134
+ };
135
+ let q = apply(tx.selectFrom(view).selectAll());
136
+ const sortKey = typeof params.sort === 'string' && params.sort ? params.sort.replace(/^-/, '') : 'createdAt';
137
+ const sortField = agg.fields[sortKey];
138
+ const sortCol = SYS[sortKey] ?? (sortField && !isRelation(sortField) && !hidden.has(sortKey) ? snake(sortKey) : undefined);
139
+ if (!sortCol)
140
+ throw cageError('INVALID_INPUT', [{ path: 'sort', message: `不能按 ${sortKey} 排序` }]);
141
+ const desc = typeof params.sort === 'string' ? params.sort.startsWith('-') : true;
142
+ q = q.orderBy(sql.ref(sortCol), desc ? 'desc' : 'asc').orderBy('id').limit(pageSize).offset((page - 1) * pageSize);
143
+ const rows = await q.execute();
144
+ const cnt = count ? await apply(tx.selectFrom(view).select(sql `count(*)::int`.as('n'))).executeTakeFirst() : null;
145
+ return { items: rows.map(viewRowToObject), total: Number(cnt?.n ?? 0), page, pageSize };
146
+ }
147
+ /**
148
+ * worker 使用的导出构建器:同一只读快照内分批读取,避免翻页期间数据变化导致漏行或重复。
149
+ * 上限用于约束单任务内存与数据库文件存储;超限明确失败,绝不能静默截断成“成功文件”。
150
+ * HTTP 只提交任务,保留本方法供受控的服务端调用。
151
+ */
152
+ async export(a, params, ctx) {
153
+ const agg = this.agg(a);
154
+ this.need(ctx, `${agg.name}.export`);
155
+ const cols = ['id', ...Object.entries(agg.fields).filter(([, f]) => !f.isHidden && !isRelation(f)).map(([k]) => k), 'status', 'version', 'createdAt', 'updatedAt'];
156
+ const lines = ['\uFEFF' + cols.map(csvCell).join(',')], ids = [];
157
+ let bytes = Buffer.byteLength(lines[0]);
158
+ await this.tx(ctx, async (tx) => {
159
+ let total = 0;
160
+ for (let page = 1; page === 1 || ids.length < total; page++) {
161
+ const res = await this.listIn(tx, agg, { ...params, page, pageSize: 1000 }, 1000, page === 1);
162
+ if (page === 1)
163
+ total = res.total;
164
+ if (total > 100_000)
165
+ throw cageError('INVALID_INPUT', '导出最多支持 100000 行,请缩小筛选范围');
166
+ for (const row of res.items) {
167
+ const line = cols.map((c) => csvCell(row[c])).join(',');
168
+ bytes += Buffer.byteLength(line) + 1;
169
+ if (bytes > 20 * 1024 * 1024)
170
+ throw cageError('INVALID_INPUT', '导出文件超过 20 MiB,请缩小筛选范围');
171
+ lines.push(line);
172
+ ids.push(row.id);
173
+ }
174
+ }
175
+ }, 'repeatable read');
176
+ await this.auditUnmask(agg, ctx, ids, 'export');
177
+ return { filename: `${agg.table.name}.csv`, contentType: 'text/csv; charset=utf-8', body: lines.join('\n'), rows: ids.length };
178
+ }
179
+ /** 执行 query 声明:需要 reads 里每个聚合的 read 能力;手写 SQL 用 :name 占位,全部参数化 */
180
+ async run(q, raw, ctx) {
181
+ const query = typeof q === 'string' ? this.k.registry.queries.find((x) => x.name === q) : q;
182
+ if (!query)
183
+ throw cageError('NOT_FOUND');
184
+ for (const a of query.reads)
185
+ this.need(ctx, `${a.name}.read`);
186
+ const parsed = query.input.safeParse(raw ?? {});
187
+ if (!parsed.success)
188
+ throw cageError('INVALID_INPUT', parsed.error.issues.map((i) => ({ path: i.path.join('.'), message: i.message })));
189
+ const input = parsed.data;
190
+ const rows = await this.tx(ctx, async (tx) => {
191
+ if (query.build)
192
+ return (await query.build(tx, input).execute());
193
+ const compiled = compileNamedSql(query.sql, input);
194
+ const r = await compiled.execute(tx);
195
+ return r.rows;
196
+ });
197
+ return rows.map(viewRowToObject);
198
+ }
199
+ }
200
+ /** :name 占位 → 参数化 SQL(:: 类型转换不受影响) */
201
+ export function compileNamedSql(text, input) {
202
+ const parts = [];
203
+ const re = /(?<![:\w]):([a-zA-Z_][a-zA-Z0-9_]*)/g;
204
+ let last = 0;
205
+ let m;
206
+ while ((m = re.exec(text))) {
207
+ parts.push(sql.raw(text.slice(last, m.index)));
208
+ if (!(m[1] in input))
209
+ throw cageError('INVALID_INPUT', [{ path: m[1], message: `缺少查询参数 ${m[1]}` }]);
210
+ parts.push(sql `${input[m[1]]}`);
211
+ last = m.index + m[0].length;
212
+ }
213
+ parts.push(sql.raw(text.slice(last)));
214
+ return sql `${sql.join(parts, sql.raw(''))}`;
215
+ }
216
+ export const listParamsSchema = z.record(z.string(), z.unknown());
217
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { CONNECTOR, INBOUND, OUTBOUND, ROUTE } from './brands.js';
2
+ import { type AnyAggregate } from './primitives/aggregate.js';
3
+ import type { AnyCommand } from './primitives/command.js';
4
+ import type { AnyEvent } from './primitives/event.js';
5
+ import type { AnyQuery, AnyReaction, Approval, Job } from './primitives/flow.js';
6
+ export interface RegisteredCommand {
7
+ readonly cmd: AnyCommand;
8
+ /** 命令名(导出名或显式 name) */
9
+ readonly name: string;
10
+ /** 能力点:聚合名.命令名 */
11
+ readonly capability: string;
12
+ readonly exportName: string;
13
+ }
14
+ export interface CatalogEntry {
15
+ capability: string;
16
+ kind: 'command' | 'read' | 'export' | 'unmask' | 'system';
17
+ aggregate?: string;
18
+ description?: string;
19
+ /** 命令的调用方限制,管理界面据此提示 */
20
+ invokedBy?: readonly string[];
21
+ }
22
+ export interface RuntimeExtension {
23
+ kind: 'CONNECTOR' | 'OUTBOUND' | 'INBOUND' | 'ROUTE';
24
+ name: string;
25
+ value: any;
26
+ }
27
+ export interface Registry {
28
+ readonly aggregates: readonly AnyAggregate[];
29
+ readonly commands: readonly RegisteredCommand[];
30
+ readonly events: readonly AnyEvent[];
31
+ readonly reactions: readonly {
32
+ r: AnyReaction;
33
+ name: string;
34
+ }[];
35
+ readonly queries: readonly AnyQuery[];
36
+ readonly approvals: readonly {
37
+ a: Approval;
38
+ name: string;
39
+ }[];
40
+ readonly jobs: readonly Job[];
41
+ readonly extensions: readonly RuntimeExtension[];
42
+ readonly systemDdl: readonly string[];
43
+ aggregate(name: string): AnyAggregate | undefined;
44
+ /** 按能力点或命令对象找命令 */
45
+ command(ref: string | AnyCommand): RegisteredCommand | undefined;
46
+ capabilityOf(cmd: AnyCommand): string;
47
+ /** 任意原语对象的导出名 */
48
+ nameOf(v: object): string | undefined;
49
+ reactionsFor(eventName: string): {
50
+ r: AnyReaction;
51
+ name: string;
52
+ }[];
53
+ approvalFor(aggName: string): {
54
+ a: Approval;
55
+ name: string;
56
+ } | undefined;
57
+ approvalByProcess(process: string): {
58
+ a: Approval;
59
+ name: string;
60
+ } | undefined;
61
+ capabilityCatalog(): CatalogEntry[];
62
+ /** 带 CONSUMERS 标记的声明对象(连接器出站映射等) */
63
+ consumerProviders(): any[];
64
+ }
65
+ export interface RegistryOptions {
66
+ /** 框架额外的系统能力点,例如 Sys.audit.read */
67
+ extraCapabilities?: CatalogEntry[];
68
+ }
69
+ /** 遍历一个或多个 domain 模块的导出,建立注册表。 */
70
+ export declare function buildRegistry(domains: object | object[], opts?: RegistryOptions): Registry;
71
+ export { CONNECTOR, INBOUND, OUTBOUND, ROUTE };