You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
discovery 的 data 槽位仍是硬编 available —— 目前只靠 plugin-dev 的加载顺序约定兜住,不是构造上的保证 #4130
而 plugin-dev 的 data 实现在 DEV_STUB_SELF_INFO 里被分类为最严重的一档(packages/plugins/plugin-dev/src/dev-plugin.ts):
'data': { status: 'stub', message: 'Dev stub — find() always returns [], insert() mints an id and stores nothing. Register ObjectQLPlugin for a real engine.' }
按 Prime Directive #10 记录,#4089 / PR #4114 期间核对出的同类残留。当前无害,记下来是因为它靠的是一条约定而非构造保证。
现象
#4114 把两个 discovery builder 的
metadata槽位改成读实现自己的__serviceInfo(ADR-0076 D12)。同一个"kernel-provided (always available)"硬编块里还有一条data,两边都仍是写死的available:packages/runtime/src/http-dispatcher.tsdata: svcAvailable(routes.data, 'kernel')—— 不传 svc,等价于无条件available+handlerReady: truepackages/metadata-protocol/src/protocol.tsdata: { enabled: true, status: 'available', route: '/api/v1/data', provider: 'objectql' }而 plugin-dev 的
data实现在DEV_STUB_SELF_INFO里被分类为最严重的一档(packages/plugins/plugin-dev/src/dev-plugin.ts):stub的handlerReady默认false。如果它进了槽位而 builder 仍报available+handlerReady: true,那就是 D12 要消灭的那类过度声明 —— 而且发生在整个平台最核心的槽位上。为什么现在打不中
data只有一个 producer:ObjectQLPlugin(packages/objectql/src/plugin.ts里ctx.registerService('data', this.ql))。plugin-dev 的 stub 注册循环只在ctx.getService(svc)抛错(槽位为空)时才填,而 plugin-dev 总是把ObjectQLPlugin作为子插件加载(dev-plugin.ts:523-525),所以在任何能构建 discovery 的栈里,data槽位都已被真引擎占住,stub 进不去。也就是说:这条硬编现在说的是真话,但真话来自 plugin-dev 的加载顺序约定,不是来自 builder 的计算。#4089 的教训正是这个 ——
metadata那两条硬编当年也曾各自"大致成立",直到内核给它注入了 fallback、MetadataPlugin 又给它接了sys_metadata,两条硬编就同时开始撒谎,且方向相反。什么时候会被打中
dataproducer(例如某个自称degraded的只读 / 远端引擎实现);ObjectQLPlugin(extraPlugins/ 裁剪过的 dev 配置),槽位就会落到那个find() => []的 stub 上,而 discovery 仍报available+handlerReady: true。需要的决定
二选一,倾向第 1 条:
data也走同一条路:dispatcher 侧resolveService('data')后交给svcAvailable(routes.data, 'kernel', dataSvc)(这一支已经会读__serviceInfo),metadata-protocol 侧同样读registeredServices.get('data')。改动很小,且把"真话"从约定变成构造保证 —— 与 fix(runtime,metadata-protocol): 两个 discovery builder 计算metadata槽位,不再互相矛盾 (#4089) #4114 对metadata做的完全一致。需要注意的一点:dispatcher 的/datadomain 实际上是走 protocol / ObjectQL,不是走data服务,所以handlerReady该不该跟着自述走要单独想清楚(metadata那边的结论是 不跟 —— 路由由 protocol 提供,槽位里放个 degraded 实现不会把它卸掉)。data槽位里出现带__serviceInfo的实现就失败,让"约定"至少有个守卫。比第 1 条便宜,但仍然是"declared ≠ enforced"的债,只是让它响一声。关联:#4089、#4058、#4000、#2462、ADR-0076 D12、PR #4114。