@yss123/cage-kernel 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.
Files changed (140) hide show
  1. package/README.md +71 -9
  2. package/dist/authorization.d.ts +34 -0
  3. package/dist/authorization.js +89 -0
  4. package/dist/authorization.js.map +1 -0
  5. package/dist/brands.d.ts +10 -0
  6. package/dist/brands.js +11 -1
  7. package/dist/brands.js.map +1 -1
  8. package/dist/db/connect.d.ts +14 -0
  9. package/dist/db/connect.js +18 -2
  10. package/dist/db/connect.js.map +1 -1
  11. package/dist/db/ddl.d.ts +40 -1
  12. package/dist/db/ddl.js +111 -7
  13. package/dist/db/ddl.js.map +1 -1
  14. package/dist/db/event-version-schema.d.ts +9 -0
  15. package/dist/db/event-version-schema.js +10 -0
  16. package/dist/db/event-version-schema.js.map +1 -0
  17. package/dist/db/index.d.ts +4 -0
  18. package/dist/db/index.js +4 -0
  19. package/dist/db/index.js.map +1 -1
  20. package/dist/db/migrate.d.ts +10 -0
  21. package/dist/db/migrate.js +9 -1
  22. package/dist/db/migrate.js.map +1 -1
  23. package/dist/db/rows.d.ts +2 -0
  24. package/dist/db/rows.js +6 -0
  25. package/dist/db/rows.js.map +1 -1
  26. package/dist/db/runtime-schema.d.ts +9 -0
  27. package/dist/db/runtime-schema.js +41 -0
  28. package/dist/db/runtime-schema.js.map +1 -0
  29. package/dist/db/session.d.ts +6 -0
  30. package/dist/db/session.js +6 -0
  31. package/dist/db/session.js.map +1 -1
  32. package/dist/errors.d.ts +12 -0
  33. package/dist/errors.js +14 -0
  34. package/dist/errors.js.map +1 -1
  35. package/dist/files/links.d.ts +10 -0
  36. package/dist/files/links.js +50 -0
  37. package/dist/files/links.js.map +1 -0
  38. package/dist/files/schema.d.ts +9 -0
  39. package/dist/files/schema.js +51 -0
  40. package/dist/files/schema.js.map +1 -0
  41. package/dist/index.d.ts +12 -2
  42. package/dist/index.js +12 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/kernel.d.ts +88 -0
  45. package/dist/kernel.js +82 -41
  46. package/dist/kernel.js.map +1 -1
  47. package/dist/mask.d.ts +7 -1
  48. package/dist/mask.js +11 -0
  49. package/dist/mask.js.map +1 -1
  50. package/dist/org.d.ts +7 -0
  51. package/dist/org.js +5 -0
  52. package/dist/org.js.map +1 -1
  53. package/dist/pipeline/draft.d.ts +16 -0
  54. package/dist/pipeline/draft.js +39 -0
  55. package/dist/pipeline/draft.js.map +1 -0
  56. package/dist/pipeline/idempotency.d.ts +6 -0
  57. package/dist/pipeline/idempotency.js +6 -0
  58. package/dist/pipeline/idempotency.js.map +1 -1
  59. package/dist/pipeline/invoker.d.ts +9 -0
  60. package/dist/pipeline/invoker.js +22 -0
  61. package/dist/pipeline/invoker.js.map +1 -0
  62. package/dist/pipeline/load.d.ts +13 -0
  63. package/dist/pipeline/load.js +22 -6
  64. package/dist/pipeline/load.js.map +1 -1
  65. package/dist/primitives/aggregate.d.ts +95 -2
  66. package/dist/primitives/aggregate.js +15 -1
  67. package/dist/primitives/aggregate.js.map +1 -1
  68. package/dist/primitives/business-process.d.ts +128 -0
  69. package/dist/primitives/business-process.js +62 -0
  70. package/dist/primitives/business-process.js.map +1 -0
  71. package/dist/primitives/collection.d.ts +65 -0
  72. package/dist/primitives/collection.js +79 -0
  73. package/dist/primitives/collection.js.map +1 -0
  74. package/dist/primitives/command.d.ts +110 -11
  75. package/dist/primitives/command.js +16 -0
  76. package/dist/primitives/command.js.map +1 -1
  77. package/dist/primitives/constraints.d.ts +30 -1
  78. package/dist/primitives/constraints.js +14 -0
  79. package/dist/primitives/constraints.js.map +1 -1
  80. package/dist/primitives/event.d.ts +36 -0
  81. package/dist/primitives/event.js +12 -1
  82. package/dist/primitives/event.js.map +1 -1
  83. package/dist/primitives/fields.d.ts +176 -36
  84. package/dist/primitives/fields.js +134 -14
  85. package/dist/primitives/fields.js.map +1 -1
  86. package/dist/primitives/flow.d.ts +173 -8
  87. package/dist/primitives/flow.js +29 -2
  88. package/dist/primitives/flow.js.map +1 -1
  89. package/dist/primitives/states.d.ts +34 -2
  90. package/dist/primitives/states.js +15 -0
  91. package/dist/primitives/states.js.map +1 -1
  92. package/dist/read.d.ts +39 -3
  93. package/dist/read.js +193 -48
  94. package/dist/read.js.map +1 -1
  95. package/dist/registry.d.ts +51 -1
  96. package/dist/registry.js +105 -5
  97. package/dist/registry.js.map +1 -1
  98. package/dist/relations.d.ts +21 -0
  99. package/dist/relations.js +65 -0
  100. package/dist/relations.js.map +1 -0
  101. package/dist/runtime.d.ts +35 -0
  102. package/dist/runtime.js +9 -0
  103. package/dist/runtime.js.map +1 -0
  104. package/dist/scope/index.d.ts +5 -0
  105. package/dist/scope/index.js +5 -0
  106. package/dist/scope/index.js.map +1 -1
  107. package/dist/telemetry.d.ts +8 -0
  108. package/dist/telemetry.js +28 -3
  109. package/dist/telemetry.js.map +1 -1
  110. package/dist/transfer/csv.d.ts +19 -0
  111. package/dist/transfer/csv.js +125 -0
  112. package/dist/transfer/csv.js.map +1 -0
  113. package/dist/transfer/index.d.ts +67 -0
  114. package/dist/transfer/index.js +271 -0
  115. package/dist/transfer/index.js.map +1 -0
  116. package/dist/transfer/schema.d.ts +9 -0
  117. package/dist/transfer/schema.js +36 -0
  118. package/dist/transfer/schema.js.map +1 -0
  119. package/dist/types.d.ts +38 -2
  120. package/dist/types.js +8 -0
  121. package/dist/types.js.map +1 -1
  122. package/dist/util/names.d.ts +6 -0
  123. package/dist/util/names.js +6 -0
  124. package/dist/util/names.js.map +1 -1
  125. package/dist/worker/consumers.d.ts +7 -0
  126. package/dist/worker/consumers.js +21 -9
  127. package/dist/worker/consumers.js.map +1 -1
  128. package/dist/worker/health.d.ts +38 -0
  129. package/dist/worker/health.js +20 -0
  130. package/dist/worker/health.js.map +1 -0
  131. package/dist/worker/index.d.ts +34 -1
  132. package/dist/worker/index.js +176 -37
  133. package/dist/worker/index.js.map +1 -1
  134. package/dist/worker/outbox.d.ts +25 -2
  135. package/dist/worker/outbox.js +40 -2
  136. package/dist/worker/outbox.js.map +1 -1
  137. package/dist/worker/scheduler.d.ts +10 -1
  138. package/dist/worker/scheduler.js +34 -4
  139. package/dist/worker/scheduler.js.map +1 -1
  140. package/package.json +1 -1
package/dist/read.js CHANGED
@@ -6,39 +6,94 @@ import { viewRowToObject } from './db/rows.js';
6
6
  import { setSessionVars } from './db/session.js';
7
7
  import { cageError } from './errors.js';
8
8
  import { hiddenFields, sensitiveFields } from './primitives/aggregate.js';
9
+ import { isRelation } from './primitives/fields.js';
9
10
  import { snake } from './util/names.js';
11
+ import { csvCell } from './transfer/csv.js';
12
+ import { relationTable } from './relations.js';
10
13
  const SYS = { id: 'id', status: 'status', version: 'version', createdAt: 'created_at', updatedAt: 'updated_at' };
11
14
  const RESERVED = new Set(['page', 'pageSize', 'sort', 'createdAfter', 'createdBefore']);
12
- function coerce(kind, v) {
13
- if (typeof v !== 'string')
14
- return v;
15
- if (kind === 'int' || kind === 'number')
16
- return Number(v);
17
- if (kind === 'bool')
18
- return v === 'true';
15
+ function invalid(path, message) {
16
+ throw cageError('INVALID_INPUT', [{ path, message }]);
17
+ }
18
+ /** 拒绝负数、小数、Infinity 和非数字字符串;只有缺省值可采用默认值,错误输入不静默归一。 */
19
+ function pageNumber(value, path, fallback) {
20
+ if (value === undefined)
21
+ return fallback;
22
+ if ((typeof value !== 'number' && typeof value !== 'string') || (typeof value === 'string' && !/^[0-9]+$/.test(value)))
23
+ return invalid(path, '必须为正整数');
24
+ const n = Number(value);
25
+ return Number.isSafeInteger(n) && n > 0 ? n : invalid(path, '必须为有限的正安全整数');
26
+ }
27
+ /** 日期过滤只接受合法日期或带时区的 ISO 时间,避免服务器本地时区猜测用户输入。 */
28
+ function dateParam(value, path) {
29
+ if (typeof value !== 'string' || !(z.iso.date().safeParse(value).success || z.iso.datetime({ offset: true }).safeParse(value).success))
30
+ return invalid(path, '必须为合法日期或带时区的 ISO 时间');
31
+ return new Date(value);
32
+ }
33
+ /** 先将 URL 数值/布尔文本转换,再用字段基础 schema 校验;金额保持字符串而不转浮点数。 */
34
+ function coerce(field, value, path) {
35
+ let v = value;
36
+ if (field?.kind === 'int' || field?.kind === 'number' || path === 'version') {
37
+ if (typeof v === 'string' && /^-?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?$/i.test(v))
38
+ v = Number(v);
39
+ if (typeof v !== 'number' || !Number.isFinite(v))
40
+ return invalid(path, '必须为有限数值');
41
+ if ((field?.kind === 'int' || path === 'version') && !Number.isSafeInteger(v))
42
+ return invalid(path, '必须为安全整数');
43
+ }
44
+ else if (field?.kind === 'bool') {
45
+ if (v === 'true')
46
+ v = true;
47
+ else if (v === 'false')
48
+ v = false;
49
+ if (typeof v !== 'boolean')
50
+ return invalid(path, '布尔值只接受 true 或 false');
51
+ }
52
+ if (field?.kind === 'date' && !z.iso.date().safeParse(v).success)
53
+ return invalid(path, '必须为合法日期');
54
+ if (field) {
55
+ const parsed = field.base.safeParse(v);
56
+ if (!parsed.success)
57
+ return invalid(path, parsed.error.issues.map((issue) => issue.message).join('; '));
58
+ return parsed.data;
59
+ }
60
+ if (path === 'createdAt' || path === 'updatedAt')
61
+ return dateParam(v, path);
62
+ if (path === 'id' && !z.uuid().safeParse(v).success)
63
+ return invalid(path, '必须为 UUID');
64
+ if (typeof v !== 'string' && path !== 'version')
65
+ return invalid(path, '必须为字符串');
19
66
  return v;
20
67
  }
68
+ /**
69
+ * 面向用户的统一只读服务。能力检查在 TypeScript 层,行级范围与敏感掩码由 safe 视图执行。
70
+ * 有明文交付或导出时先可靠写审计;审计失败不会返回已经查询到的数据,避免先泄露后补日志。
71
+ */
21
72
  export class ReadSide {
22
73
  k;
23
74
  constructor(k) {
24
75
  this.k = k;
25
76
  }
26
77
  /** 读侧账号上的只读事务,已写入会话变量 */
27
- async tx(ctx, fn) {
78
+ /** 所有查询共享此边界;repeatable read 用于多次读取必须看到同一快照的关联/导出场景。 */
79
+ async tx(ctx, fn, isolation = 'read committed') {
28
80
  return this.k.readDb
29
81
  .transaction()
82
+ .setIsolationLevel(isolation)
30
83
  .setAccessMode('read only')
31
84
  .execute(async (tx) => {
32
85
  await setSessionVars(tx, ctx);
33
86
  return fn(tx);
34
87
  });
35
88
  }
89
+ /** 解析注册聚合,未知名称统一 NOT_FOUND,不暴露内部注册细节。 */
36
90
  agg(a) {
37
91
  const agg = typeof a === 'string' ? this.k.registry.aggregate(a) : a;
38
92
  if (!agg)
39
93
  throw cageError('NOT_FOUND');
40
94
  return agg;
41
95
  }
96
+ /** read/export 能力与数据范围分开检查;通过此函数不意味着某条记录可见。 */
42
97
  need(ctx, cap) {
43
98
  if (!ctx.actor || ctx.actor.kind === 'anonymous')
44
99
  throw cageError('UNAUTHENTICATED');
@@ -46,90 +101,160 @@ export class ReadSide {
46
101
  throw cageError('FORBIDDEN', { capability: cap });
47
102
  }
48
103
  /** 明文读取敏感字段要写读审计 */
49
- async auditUnmask(agg, ctx, ids, kind) {
104
+ async auditUnmask(agg, ctx, ids, kind, metadata = {}, auditDb = this.k.app) {
50
105
  const kinds = [...new Set(Object.values(sensitiveFields(agg)))].filter((x) => ctx.unmask.includes(`${agg.name}.${x}`) || ctx.unmask.includes(`*.${x}`));
51
106
  if (kind === 'read' && kinds.length === 0)
52
107
  return;
53
- await this.k.writeAudit(this.k.app, {
54
- tenantId: ctx.tenantId, actor: ctx.actor?.id ?? 'anonymous', actorKind: ctx.actor?.kind ?? 'anonymous',
55
- onBehalfOf: ctx.onBehalfOf ?? null, source: ctx.source, kind: 'read',
56
- capability: `${agg.name}.${kind}`, command: null, aggregate: agg.name,
57
- aggregateId: ids.length === 1 ? ids[0] : null, result: 'ok',
58
- diff: { unmasked: kinds, rows: ids.length }, requestId: ctx.requestId ?? null, client: ctx.client ?? null,
59
- }).catch((e) => this.k.log.warn({ err: String(e) }, '读审计写入失败'));
108
+ try {
109
+ await this.k.writeAudit(auditDb, {
110
+ tenantId: ctx.tenantId, actor: ctx.actor?.id ?? 'anonymous', actorKind: ctx.actor?.kind ?? 'anonymous',
111
+ onBehalfOf: ctx.onBehalfOf ?? null, source: ctx.source, kind: 'read',
112
+ capability: `${agg.name}.${kind}`, command: null, aggregate: agg.name,
113
+ aggregateId: ids.length === 1 ? ids[0] : null, result: 'ok',
114
+ diff: { unmasked: kinds, rows: ids.length, ...metadata }, requestId: ctx.requestId ?? null, client: ctx.client ?? null,
115
+ });
116
+ }
117
+ catch {
118
+ this.k.log.error({ code: 'CAGE-AUDIT-001', aggregate: agg.name, kind, requestId: ctx.requestId }, '读取审计失败,未交付数据');
119
+ throw cageError('INTERNAL', { diagnostic: 'CAGE-AUDIT-001', phase: 'audit', operation: kind, retryable: true });
120
+ }
60
121
  }
122
+ /** 查询单条安全视图记录;非法 ID、范围外和不存在都按 NOT_FOUND 处理,明文审计后才交付。 */
61
123
  async get(a, id, ctx) {
62
124
  const agg = this.agg(a);
63
125
  this.need(ctx, `${agg.name}.read`);
64
- if (!/^[0-9a-f-]{36}$/i.test(id))
126
+ if (!z.uuid().safeParse(id).success)
65
127
  throw cageError('NOT_FOUND');
66
128
  const row = await this.tx(ctx, (tx) => tx.selectFrom(`safe.${agg.table.name}`).selectAll().where('id', '=', id).executeTakeFirst());
67
129
  if (!row)
68
130
  throw cageError('NOT_FOUND');
69
- void this.auditUnmask(agg, ctx, [id], 'read');
131
+ await this.auditUnmask(agg, ctx, [id], 'read');
70
132
  return viewRowToObject(row);
71
133
  }
134
+ /** 普通页面最多每页 200 条;输出由安全视图已掩码,关联集合需另调 related。 */
72
135
  async list(a, params, ctx) {
73
136
  const agg = this.agg(a);
74
137
  this.need(ctx, `${agg.name}.read`);
75
138
  const res = await this.tx(ctx, (tx) => this.listIn(tx, agg, params, 200));
76
- void this.auditUnmask(agg, ctx, res.items.map((r) => r.id), 'read');
139
+ await this.auditUnmask(agg, ctx, res.items.map((r) => r.id), 'read');
77
140
  return res;
78
141
  }
79
- async listIn(tx, agg, params, maxPageSize) {
80
- const page = Math.max(1, Number(params.page ?? 1) || 1);
81
- const pageSize = Math.min(maxPageSize, Math.max(1, Number(params.pageSize ?? 20) || 20));
142
+ /** 关联按需分页:先确认所属对象可见,再从目标安全视图读取;两侧能力、范围和掩码都生效。 */
143
+ async related(a, id, fieldName, params, ctx) {
144
+ const owner = this.agg(a), field = owner.fields[fieldName];
145
+ this.need(ctx, `${owner.name}.read`);
146
+ if (!field || !isRelation(field) || !z.uuid().safeParse(id).success)
147
+ throw cageError('NOT_FOUND');
148
+ const target = this.agg(field.ref);
149
+ this.need(ctx, `${target.name}.read`);
150
+ const res = await this.tx(ctx, async (tx) => {
151
+ const source = await tx.selectFrom(`safe.${owner.table.name}`).select('id').where('id', '=', id).where('status', '<>', 'deleted').executeTakeFirst();
152
+ if (!source)
153
+ throw cageError('NOT_FOUND');
154
+ const table = relationTable(owner, fieldName);
155
+ const restrict = field.kind === 'hasMany'
156
+ ? (q) => q.where(sql.ref(snake(field.mappedBy)), '=', id)
157
+ : (q) => q.where('id', 'in', tx.selectFrom(`safe.${table.name}`).select('target_id').where('source_id', '=', id));
158
+ return this.listIn(tx, target, params, 200, true, restrict);
159
+ }, 'repeatable read');
160
+ await this.auditUnmask(target, ctx, res.items.map((row) => row.id), 'read');
161
+ return res;
162
+ }
163
+ /**
164
+ * 构造安全视图分页和同口径计数,restrict 让关联读取复用相同过滤逻辑。
165
+ * 隐藏、敏感、JSON 和集合字段不能被普通等值筛选旁路探测;默认排除 deleted。
166
+ * 排序追加 id 作为稳定次序;时间窗口为 createdAfter 含边界、createdBefore 不含边界。
167
+ */
168
+ async listIn(tx, agg, params, maxPageSize, count = true, restrict = (q) => q) {
169
+ const page = pageNumber(params.page, 'page', 1);
170
+ const pageSize = Math.min(maxPageSize, pageNumber(params.pageSize, 'pageSize', 20));
171
+ if (!Number.isSafeInteger((page - 1) * pageSize))
172
+ invalid('page', '分页偏移超过安全整数范围');
173
+ const after = params.createdAfter === undefined ? undefined : dateParam(params.createdAfter, 'createdAfter');
174
+ const before = params.createdBefore === undefined ? undefined : dateParam(params.createdBefore, 'createdBefore');
175
+ if (after && before && after >= before)
176
+ invalid('createdBefore', '必须晚于 createdAfter');
82
177
  const hidden = new Set(hiddenFields(agg));
83
178
  const view = `safe.${agg.table.name}`;
84
179
  const apply = (q) => {
85
180
  for (const [k, v] of Object.entries(params)) {
86
- if (RESERVED.has(k) || v === undefined || v === '')
181
+ if (RESERVED.has(k) || v === undefined)
87
182
  continue;
88
183
  const f = agg.fields[k];
89
- const col = SYS[k] ?? (f && !hidden.has(k) && f.sql !== 'jsonb' && !f.sensitiveKind ? snake(k) : undefined);
184
+ const col = SYS[k] ?? (f && !isRelation(f) && !hidden.has(k) && f.sql !== 'jsonb' && !f.sensitiveKind ? snake(k) : undefined);
90
185
  if (!col)
91
186
  throw cageError('INVALID_INPUT', [{ path: k, message: `不能按 ${k} 过滤` }]);
92
- if (k === 'status' && typeof v === 'string' && v.includes(','))
93
- q = q.where('status', 'in', v.split(','));
187
+ if (k === 'status') {
188
+ if (typeof v !== 'string')
189
+ invalid(k, '状态必须为字符串');
190
+ const statuses = v.split(',');
191
+ if (statuses.some((status) => !agg.states.values.includes(status)))
192
+ invalid(k, '包含未声明的状态');
193
+ q = q.where('status', 'in', statuses);
194
+ }
94
195
  else
95
- q = q.where(sql.ref(col), '=', coerce(f?.kind ?? 'text', v));
196
+ q = q.where(sql.ref(col), '=', coerce(f, v, k));
96
197
  }
97
198
  if (params.status === undefined)
98
199
  q = q.where('status', '<>', 'deleted');
99
- if (params.createdAfter)
100
- q = q.where('created_at', '>=', new Date(String(params.createdAfter)));
101
- if (params.createdBefore)
102
- q = q.where('created_at', '<', new Date(String(params.createdBefore)));
103
- return q;
200
+ if (after)
201
+ q = q.where('created_at', '>=', after);
202
+ if (before)
203
+ q = q.where('created_at', '<', before);
204
+ return restrict(q);
104
205
  };
105
206
  let q = apply(tx.selectFrom(view).selectAll());
106
- const sortKey = typeof params.sort === 'string' && params.sort ? params.sort.replace(/^-/, '') : 'createdAt';
107
- const sortCol = SYS[sortKey] ?? (agg.fields[sortKey] && !hidden.has(sortKey) ? snake(sortKey) : undefined);
207
+ if (params.sort !== undefined && (typeof params.sort !== 'string' || !params.sort))
208
+ invalid('sort', '必须为非空字段名');
209
+ const sortKey = typeof params.sort === 'string' ? params.sort.replace(/^-/, '') : 'createdAt';
210
+ const sortField = agg.fields[sortKey];
211
+ const sortCol = SYS[sortKey] ?? (sortField && !isRelation(sortField) && !hidden.has(sortKey) && sortField.sql !== 'jsonb' ? snake(sortKey) : undefined);
108
212
  if (!sortCol)
109
213
  throw cageError('INVALID_INPUT', [{ path: 'sort', message: `不能按 ${sortKey} 排序` }]);
110
214
  const desc = typeof params.sort === 'string' ? params.sort.startsWith('-') : true;
111
215
  q = q.orderBy(sql.ref(sortCol), desc ? 'desc' : 'asc').orderBy('id').limit(pageSize).offset((page - 1) * pageSize);
112
216
  const rows = await q.execute();
113
- const cnt = await apply(tx.selectFrom(view).select(sql `count(*)::int`.as('n'))).executeTakeFirst();
217
+ const cnt = count ? await apply(tx.selectFrom(view).select(sql `count(*)::int`.as('n'))).executeTakeFirst() : null;
114
218
  return { items: rows.map(viewRowToObject), total: Number(cnt?.n ?? 0), page, pageSize };
115
219
  }
116
- /** 导出:就是读,走安全视图,自然带范围和脱敏;需要 聚合.export 能力,并写读审计 */
117
- async export(a, params, ctx) {
220
+ /**
221
+ * worker 使用的导出构建器:同一只读快照内分批读取,避免翻页期间数据变化导致漏行或重复。
222
+ * 上限用于约束单任务内存与数据库文件存储;超限明确失败,绝不能静默截断成“成功文件”。
223
+ * HTTP 只提交任务,保留本方法供受控的服务端调用。
224
+ */
225
+ async export(a, params, ctx, auditTransaction) {
118
226
  const agg = this.agg(a);
119
227
  this.need(ctx, `${agg.name}.export`);
120
- const res = await this.tx(ctx, (tx) => this.listIn(tx, agg, { ...params, page: 1, pageSize: 10000 }, 10000));
121
- const cols = ['id', ...Object.keys(agg.fields).filter((k) => !hiddenFields(agg).includes(k)), 'status', 'version', 'createdAt', 'updatedAt'];
122
- const cell = (v) => {
123
- const s = v === null || v === undefined ? '' : typeof v === 'object' ? JSON.stringify(v) : String(v);
124
- // 防 CSV 公式注入
125
- const safe = /^[=+\-@\t\r]/.test(s) ? `'${s}` : s;
126
- return /[",\n]/.test(safe) ? `"${safe.replace(/"/g, '""')}"` : safe;
127
- };
128
- const body = [cols.join(','), ...res.items.map((r) => cols.map((c) => cell(r[c])).join(','))].join('\n');
129
- await this.auditUnmask(agg, ctx, res.items.map((r) => r.id), 'export');
130
- return { filename: `${agg.table.name}.csv`, contentType: 'text/csv; charset=utf-8', body: '' + body, rows: res.items.length };
228
+ const cols = ['id', ...Object.entries(agg.fields).filter(([, f]) => !f.isHidden && !isRelation(f)).map(([k]) => k), 'status', 'version', 'createdAt', 'updatedAt'];
229
+ const lines = ['\uFEFF' + cols.map(csvCell).join(',')], ids = [];
230
+ let bytes = Buffer.byteLength(lines[0]);
231
+ await this.tx(ctx, async (tx) => {
232
+ let total = 0;
233
+ for (let page = 1; page === 1 || ids.length < total; page++) {
234
+ const res = await this.listIn(tx, agg, { ...params, page, pageSize: 1000 }, 1000, page === 1);
235
+ if (page === 1)
236
+ total = res.total;
237
+ if (total > 100_000)
238
+ throw cageError('INVALID_INPUT', '导出最多支持 100000 行,请缩小筛选范围');
239
+ for (const row of res.items) {
240
+ const line = cols.map((c) => csvCell(row[c])).join(',');
241
+ bytes += Buffer.byteLength(line) + 1;
242
+ if (bytes > 20 * 1024 * 1024)
243
+ throw cageError('INVALID_INPUT', '导出文件超过 20 MiB,请缩小筛选范围');
244
+ lines.push(line);
245
+ ids.push(row.id);
246
+ }
247
+ }
248
+ }, 'repeatable read');
249
+ // worker 已持有任务事务时,生成审计与文件持久化共同提交,不能再向同一 app 池领取连接。
250
+ await this.auditUnmask(agg, ctx, ids, 'export', {}, auditTransaction);
251
+ return { filename: `${agg.table.name}.csv`, contentType: 'text/csv; charset=utf-8', body: lines.join('\n'), rows: ids.length };
131
252
  }
132
253
  /** 执行 query 声明:需要 reads 里每个聚合的 read 能力;手写 SQL 用 :name 占位,全部参数化 */
254
+ /**
255
+ * SQL/build 在只读事务中执行;任意报表无法反推出全部对象 ID,因此按声明 reads 保守记录明文审计。
256
+ * audit.purpose 另形成用途审计,任一可靠审计失败都会阻止交付,不能以空结果冒充成功。
257
+ */
133
258
  async run(q, raw, ctx) {
134
259
  const query = typeof q === 'string' ? this.k.registry.queries.find((x) => x.name === q) : q;
135
260
  if (!query)
@@ -147,10 +272,29 @@ export class ReadSide {
147
272
  const r = await compiled.execute(tx);
148
273
  return r.rows;
149
274
  });
275
+ // 任意报表无法可靠推导对象 ID,按 query 用途、涉及聚合及结果行数记录。
276
+ // 即使无法静态判定 SELECT 是否投影了明文,也不得让自定义查询绕过敏感读取审计。
277
+ for (const aggregate of query.reads)
278
+ await this.auditUnmask(aggregate, ctx, [], 'read', { query: query.name, rows: rows.length, purpose: query.audit?.purpose });
279
+ if (query.audit) {
280
+ try {
281
+ await this.k.writeAudit(this.k.app, {
282
+ tenantId: ctx.tenantId, actor: ctx.actor.id, actorKind: ctx.actor.kind, source: ctx.source,
283
+ kind: 'read', capability: `query:${query.name}`, aggregate: null, result: 'ok',
284
+ diff: { query: query.name, purpose: query.audit.purpose, rows: rows.length, reads: query.reads.map((a) => a.name) },
285
+ requestId: ctx.requestId ?? null, client: ctx.client ?? null,
286
+ });
287
+ }
288
+ catch {
289
+ this.k.log.error({ code: 'CAGE-AUDIT-001', operation: `query:${query.name}`, requestId: ctx.requestId }, '查询用途审计失败,未交付数据');
290
+ throw cageError('INTERNAL', { diagnostic: 'CAGE-AUDIT-001', phase: 'audit', operation: `query:${query.name}`, retryable: true });
291
+ }
292
+ }
150
293
  return rows.map(viewRowToObject);
151
294
  }
152
295
  }
153
296
  /** :name 占位 → 参数化 SQL(:: 类型转换不受影响) */
297
+ /** SQL 模板必须来自可信声明,用户只能提供占位参数;缺少命名参数立即报 INVALID_INPUT。 */
154
298
  export function compileNamedSql(text, input) {
155
299
  const parts = [];
156
300
  const re = /(?<![:\w]):([a-zA-Z_][a-zA-Z0-9_]*)/g;
@@ -166,5 +310,6 @@ export function compileNamedSql(text, input) {
166
310
  parts.push(sql.raw(text.slice(last)));
167
311
  return sql `${sql.join(parts, sql.raw(''))}`;
168
312
  }
313
+ /** 外层接收字段名动态的查询参数;具体白名单、类型、分页边界在 listIn 中结合聚合校验。 */
169
314
  export const listParamsSchema = z.record(z.string(), z.unknown());
170
315
  //# sourceMappingURL=read.js.map
package/dist/read.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"read.js","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"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"}
@@ -3,61 +3,99 @@ import { type AnyAggregate } from './primitives/aggregate.js';
3
3
  import type { AnyCommand } from './primitives/command.js';
4
4
  import type { AnyEvent } from './primitives/event.js';
5
5
  import type { AnyQuery, AnyReaction, Approval, Job } from './primitives/flow.js';
6
+ import type { BusinessProcess } from './primitives/business-process.js';
6
7
  export interface RegisteredCommand {
8
+ /** 原始命令声明,保留聚合、输入与 handler 等执行规格。 */
7
9
  readonly cmd: AnyCommand;
8
10
  /** 命令名(导出名或显式 name) */
9
11
  readonly name: string;
10
12
  /** 能力点:聚合名.命令名 */
11
13
  readonly capability: string;
14
+ /** 发现声明时使用的 domain 导出名,用于诊断及来源定位;可与显式命令名不同。 */
12
15
  readonly exportName: string;
13
16
  }
17
+ /** 可授予能力的目录条目;目录声明不等于任何用户/角色已获得该能力。 */
14
18
  export interface CatalogEntry {
19
+ /** 稳定能力字符串,如聚合.read 或聚合.命令名;显示文字不能替代此标识。 */
15
20
  capability: string;
21
+ /** 区分命令、读取、导出、敏感明文及系统能力,以便工具和管理界面分类。 */
16
22
  kind: 'command' | 'read' | 'export' | 'unmask' | 'system';
23
+ /** 能力所属聚合名;独立系统能力可省略。 */
17
24
  aggregate?: string;
25
+ /** 来自声明的可选公开说明,不参与授权判定。 */
18
26
  description?: string;
19
27
  /** 命令的调用方限制,管理界面据此提示 */
20
28
  invokedBy?: readonly string[];
21
29
  }
30
+ /** 可选包通过品牌协议进入注册表,内核保存描述,实际装配由 HTTP/worker 对应适配器完成。 */
22
31
  export interface RuntimeExtension {
23
- kind: 'CONNECTOR' | 'OUTBOUND' | 'INBOUND' | 'ROUTE';
32
+ /** 扩展声明品牌种类,决定由连接器、审批或运行时适配器解释。 */
33
+ kind: 'CONNECTOR' | 'OUTBOUND' | 'INBOUND' | 'ROUTE' | 'RUNTIME';
34
+ /** 从 domain 导出确定的扩展名称,供诊断和装配引用。 */
24
35
  name: string;
36
+ /** 扩展包拥有的声明对象,内核只按品牌协议接入,不复制其业务逻辑。 */
25
37
  value: any;
26
38
  }
39
+ /**
40
+ * 当前 domain 导出的运行规格及索引,API、worker、DDL 和 CLI 应使用同一份版本。
41
+ * 对象身份用于识别重复 re-export 和引用关系;字符串 capability 用于协议调用及授权。
42
+ */
27
43
  export interface Registry {
44
+ /** 已去重且校验过的聚合声明集合,用于路由、schema 与读侧。 */
28
45
  readonly aggregates: readonly AnyAggregate[];
46
+ /** 命令声明及解析后的名称/能力索引,不包含未导出的模块局部变量。 */
29
47
  readonly commands: readonly RegisteredCommand[];
48
+ /** 可被 emits 引用的事件声明,载荷与版本由声明决定。 */
30
49
  readonly events: readonly AnyEvent[];
50
+ /** 已命名反应与原始声明,执行顺序由规则决定,不能按数组书写位置推断事务顺序。 */
31
51
  readonly reactions: readonly {
32
52
  r: AnyReaction;
33
53
  name: string;
34
54
  }[];
55
+ /** 已注册只读查询声明;运行时仍校验 reads 能力及输入。 */
35
56
  readonly queries: readonly AnyQuery[];
57
+ /** 聚合审批声明与导出名,实际选人由对应审批路由实现。 */
36
58
  readonly approvals: readonly {
37
59
  a: Approval;
38
60
  name: string;
39
61
  }[];
62
+ /** 已注册定时任务规格;注册不等于调度器正在运行。 */
40
63
  readonly jobs: readonly Job[];
64
+ /** 用于业务图谱和规则检查的流程说明,不代替真实命令/事件执行。 */
65
+ readonly businessProcesses: readonly BusinessProcess[];
66
+ /** 可选包声明的统一接入口,实际服务由宿主装配。 */
41
67
  readonly extensions: readonly RuntimeExtension[];
68
+ /** 框架及扩展提供的系统建表片段,用于准备 schema,不在建注册表时执行。 */
42
69
  readonly systemDdl: readonly string[];
70
+ /** 扩展提供的具名系统迁移,数据库应用与历史校验在迁移层进行。 */
71
+ readonly systemMigrations: readonly {
72
+ name: string;
73
+ sql: string;
74
+ }[];
75
+ /** 按注册聚合名查询,未知返回 undefined。 */
43
76
  aggregate(name: string): AnyAggregate | undefined;
44
77
  /** 按能力点或命令对象找命令 */
45
78
  command(ref: string | AnyCommand): RegisteredCommand | undefined;
79
+ /** 取得已注册命令的能力字符串;陌生命令抛出声明错误而非生成临时权限。 */
46
80
  capabilityOf(cmd: AnyCommand): string;
47
81
  /** 任意原语对象的导出名 */
48
82
  nameOf(v: object): string | undefined;
83
+ /** 返回订阅指定事件的反应,供内核与 worker 筛选并执行。 */
49
84
  reactionsFor(eventName: string): {
50
85
  r: AnyReaction;
51
86
  name: string;
52
87
  }[];
88
+ /** 按聚合查找其审批声明,没有配置时返回 undefined。 */
53
89
  approvalFor(aggName: string): {
54
90
  a: Approval;
55
91
  name: string;
56
92
  } | undefined;
93
+ /** 按流程标识查审批声明,供路由与引擎装配校验。 */
57
94
  approvalByProcess(process: string): {
58
95
  a: Approval;
59
96
  name: string;
60
97
  } | undefined;
98
+ /** 派生全部可用能力的目录;返回可授予项,不意味着任何账号已获授权。 */
61
99
  capabilityCatalog(): CatalogEntry[];
62
100
  /** 带 CONSUMERS 标记的声明对象(连接器出站映射等) */
63
101
  consumerProviders(): any[];
@@ -67,5 +105,17 @@ export interface RegistryOptions {
67
105
  extraCapabilities?: CatalogEntry[];
68
106
  }
69
107
  /** 遍历一个或多个 domain 模块的导出,建立注册表。 */
108
+ /**
109
+ * 分三阶段建立注册表:收集品牌声明和扩展迁移,校验跨声明引用/命名/步骤顺序,建立查询索引。
110
+ * 同一对象重复导出保留首次名称,不同对象撞聚合名或能力名则立即失败;引用到未导出的实现也拒绝。
111
+ * 完成基础一致性后执行可选扩展 validate,防止服务在启动或消费事件时才发现缺失配置。
112
+ * 此过程不连数据库,但扩展的元数据回调必须保持声明期无业务副作用。
113
+ */
70
114
  export declare function buildRegistry(domains: object | object[], opts?: RegistryOptions): Registry;
71
115
  export { CONNECTOR, INBOUND, OUTBOUND, ROUTE };
116
+ /** 同一编译产物的声明指纹,用于发现 API/worker 加载版本错配;不是任意 JS 等价性证明。 */
117
+ /**
118
+ * 按稳定键序列化结构、schema 和执行回调源码再做 SHA-256;源码文本变化可能影响结果。
119
+ * 指纹只比较进程实际装载规格,不能证明任意两段 JavaScript 语义等价,也不代表数据库已迁移。
120
+ */
121
+ export declare function registryFingerprint(registry: Registry): string;