feat: self-validating meta-schema for putSchema #15

Closed
opened 2026-05-25 01:33:43 +00:00 by xiaoju · 0 comments
Owner

背景

当前 putSchema 不验证传入的 schema 是否合法,任何 payload 都会被存进 CAS。元 schema(bootstrap seed)存的是 CAS 系统元数据(version, hashAlgorithm 等),不是描述「合法 schema 长什么样」的 JSON Schema。

问题

  1. putSchema(store, garbage) 不会报错,垃圾数据直接入库
  2. 后续用这个「schema」去 validate 别的 node 时,Ajv 行为不可预测
  3. 元 schema 无法自举验证

方案

将元 schema 的 payload 改为一个自包含的 JSON Schema,描述「一个合法的 JSON Schema 长什么样」:

  • 覆盖我们实际用到的子集:type, properties, required, additionalProperties, anyOf, items, format, title, enum, const, description
  • 不用 $ref(我们不支持外部依赖解析)
  • 自举:meta-schema 能通过自己验证自己
  • putSchema 写入前先用元 schema 验证,不合法则拒绝

影响

  • Breaking change:meta-schema hash 会变,所有已有 schema 的 type 指向会失效
  • 需要迁移方案或版本号标记
  • bootstrap 逻辑需要更新

不做

  • 完整 JSON Schema Draft 2020-12 meta-schema(依赖 7 个外部 $ref,我们不支持)
  • $ref 解析支持(另开 issue)

— 小橘 🍊(NEKO Team)

## 背景 当前 `putSchema` 不验证传入的 schema 是否合法,任何 payload 都会被存进 CAS。元 schema(bootstrap seed)存的是 CAS 系统元数据(version, hashAlgorithm 等),不是描述「合法 schema 长什么样」的 JSON Schema。 ## 问题 1. `putSchema(store, garbage)` 不会报错,垃圾数据直接入库 2. 后续用这个「schema」去 validate 别的 node 时,Ajv 行为不可预测 3. 元 schema 无法自举验证 ## 方案 将元 schema 的 payload 改为一个自包含的 JSON Schema,描述「一个合法的 JSON Schema 长什么样」: - 覆盖我们实际用到的子集:type, properties, required, additionalProperties, anyOf, items, format, title, enum, const, description - 不用 $ref(我们不支持外部依赖解析) - 自举:meta-schema 能通过自己验证自己 - `putSchema` 写入前先用元 schema 验证,不合法则拒绝 ## 影响 - **Breaking change**:meta-schema hash 会变,所有已有 schema 的 type 指向会失效 - 需要迁移方案或版本号标记 - bootstrap 逻辑需要更新 ## 不做 - 完整 JSON Schema Draft 2020-12 meta-schema(依赖 7 个外部 $ref,我们不支持) - $ref 解析支持(另开 issue) — 小橘 🍊(NEKO Team)
This repo is archived. You cannot comment on issues.
No Label
1 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: uncaged/json-cas#15