#4602(subscribeMetadata/MetadataEvent 同病)修复时的范围外发现,按第十条军规立案,unassigned。#4602 的 PR 只修 metadata 侧;data 侧是同构缺陷但生产者不同,需单独裁决与实施。
现象
@objectstack/spec/api 的 DataEventSchema 声明顶层字段 id(uuid,必填)、object、recordId(必填)、changes?、before?、after?、userId?、timestamp。但:
- 生产侧(
packages/objectql/src/engine.ts 的 data.record.* 发布)发的是 RealtimeEventPayload 信封,record 数据嵌在 payload({ recordId, after, changes }),从不生成 id/userId。
- 消费侧
packages/client/src/realtime-api.ts subscribeData 把信封 callback(event as any as DataEvent);client-react 的 useDataSubscription / useDataSubscriptionCallback / useAutoRefresh 同源。
订阅者写 event.recordId / event.changes(类型系统说存在)运行时是 undefined;必填的 event.id 不存在。
处置方向
与 #4602 的裁决同族(生产者履约,消费端边界 DataEventSchema.safeParse 响亮拒绝,删除 as any as 双铸)。注意 data 侧的生产者是 ObjectQL engine(热路径,每次 insert/update/delete),且 webhook auto-enqueuer 等服务端消费者直接读信封 payload(packages/plugins/plugin-webhooks/src/auto-enqueuer.ts 读 payload.recordId ?? payload.id ?? …)——迁移时需要同时核对这些信封依赖,成本比 metadata 侧高,需单独评审。
另注意 DataEventType 里的 data.field.changed 疑似无生产者(declared ≠ enforced 同族,cf. #3197)。
参照:#4602 的实施(producer 生成完整 spec 事件放入信封 payload,client 边界 parse)。
#4602(subscribeMetadata/MetadataEvent 同病)修复时的范围外发现,按第十条军规立案,unassigned。#4602 的 PR 只修 metadata 侧;data 侧是同构缺陷但生产者不同,需单独裁决与实施。
现象
@objectstack/spec/api的DataEventSchema声明顶层字段id(uuid,必填)、object、recordId(必填)、changes?、before?、after?、userId?、timestamp。但:packages/objectql/src/engine.ts的data.record.*发布)发的是RealtimeEventPayload信封,record 数据嵌在payload({ recordId, after, changes }),从不生成id/userId。packages/client/src/realtime-api.tssubscribeData把信封callback(event as any as DataEvent);client-react的useDataSubscription/useDataSubscriptionCallback/useAutoRefresh同源。订阅者写
event.recordId/event.changes(类型系统说存在)运行时是undefined;必填的event.id不存在。处置方向
与 #4602 的裁决同族(生产者履约,消费端边界
DataEventSchema.safeParse响亮拒绝,删除as any as双铸)。注意 data 侧的生产者是 ObjectQL engine(热路径,每次 insert/update/delete),且 webhook auto-enqueuer 等服务端消费者直接读信封payload(packages/plugins/plugin-webhooks/src/auto-enqueuer.ts读payload.recordId ?? payload.id ?? …)——迁移时需要同时核对这些信封依赖,成本比 metadata 侧高,需单独评审。另注意
DataEventType里的data.field.changed疑似无生产者(declared ≠ enforced 同族,cf. #3197)。参照:#4602 的实施(producer 生成完整 spec 事件放入信封
payload,client 边界 parse)。