资源方案 API
用途与前置条件
资源方案定义规则 pattern 如何匹配具体 resource。内置方案覆盖 HTTP 路由、api:、db:、ui: 和仅规则侧可用的全局 *。只有这些语法不能表示稳定应用资源域时,才添加自定义方案。
我想做什么
签名
scheme 遵循小写 URI scheme 语法,不能使用 api、db、http、ui。version 是行为版本,不是包版本。回调是可信同步配置代码,必须具有确定性。
定义字段与生命周期
new PermissionCore({ resourceSchemes })
- 用途:在 core 构造期注册应用自定义资源语法。
- 参数:定义数组最多 32 项;core 会快照配置,之后修改原对象无效。
- 状态影响:构造本身只创建实例;
init()才运行 probes 并比对持久化 schema contract。 - 原始返回:同步返回
PermissionCore,不是 scheme 注册结果。
validate(resource) 与 match(pattern, resource)
- 用途:
validate定义具体资源语法,match定义规则 pattern 覆盖关系。 - 参数:都只接收字符串;match 的第一个参数永远是规则 pattern。
- 状态影响:可信同步纯函数;不得访问时间、网络、随机数或可变外部状态。
- 原始返回:boolean。抛错、返回非 boolean 或 probes 两次不一致都会使
init()失败。
响应与副作用
构造时快照最多 32 个定义。init() 将每个 1..16 probe 执行两次,要求具体资源通过 validate,并验证预期 match 结果。方案名称/版本/probe 会进入持久化 schema contract digest,并由 health 返回。
规则 pattern 交给 match;具体 resource 先由 validate 接受。Pattern 和 resource 必须保持在声明的 scheme 内。
失败与限制
无效定义或不确定/抛错 probe 以 INVALID_CONFIGURATION 阻止初始化。未知/格式错误资源返回 INVALID_RESOURCE。名称最长 32 字符,版本最长 64,每个 pattern/resource 最多 1024 UTF-8 bytes。改变回调行为时必须改变 version,并向每个实例部署相同定义;否则 schema contract 可能分叉。
示例
该 JSON 是教程根据 topicScheme 与成功的 health 自行整理的摘要,不是 constructor、callback 或 init() 的原始返回。pc.init() 原始返回完整 PermissionCoreHealth;scheme contract 位于 health.schema.expectedSchemeContractDigest 和 health.namespace.schemeContractDigest。
初始化成功后,角色规则可以使用 topic:orders:* pattern,而 can/assert 传入 topic:orders:created 具体资源。独立的 permission-core/match 只覆盖内置方案,不会读取这里的自定义定义。