#4639 实施(PR #4677 )的范围内发现,按第十条军规立案。
现象
#4677 给谓词写(multi: true)加了聚合事件契约,并在 @objectstack/client 上开了 subscribeBulkData(object, cb)。但 @objectstack/client-react 没有跟上:
packages/client-react/src/realtime-hooks.tsx 里三个 hook 全部委托 client.events.subscribeData(:94、:183),没有任何一个订阅 data.records.*:
useDataSubscription (:84)
useDataSubscriptionCallback (:173)
useAutoRefresh (:251)
于是 React 用户拿不到批量写事件 —— client SDK 有这个能力,hooks 层没暴露。
最刺眼的是 useAutoRefresh
它的语义就是"数据变了就重取"。而谓词写恰恰是最该重取 的场景 —— 一次改掉/删掉 40 行,列表页整页都脏了。现在它对此完全不刷新,而对单条记录改动反而会刷。
这不是性能取舍,是语义漏洞:一个叫 "auto refresh" 的 hook 在数据变化最大的那次写入上静默不动。
处置方向
新增 useBulkDataSubscription(和 useBulkDataSubscriptionCallback,如果要与现有成对结构保持一致),委托 subscribeBulkData;
useAutoRefresh 同时订两条流 —— 逐记录和批量都触发重取。它的返回值是刷新信号,不是事件体,所以两种事件在这里天然同构,不存在 declared ≠ enforced:引擎 multi:true 谓词写入没有 data.record.* 事件,webhook / 知识同步对其静默(REST 批量端点不受影响) #4639 里那个"形状不同不能混"的问题(那条约束针对的是把 BulkDataEvent 交给 (event: DataEvent) => void 回调,useAutoRefresh 不暴露事件体);
useDataSubscription / useDataSubscriptionCallback 保持只收逐记录 —— 它们的回调签名是 DataEvent,混进来就是 client realtime declared ≠ enforced:subscribeData 回调把 RealtimeEventPayload 硬铸成 DataEvent,顶层 recordId/changes/id 运行时是 undefined #4626 消灭的那个缺陷。
参考
#4639 实施(PR #4677)的范围内发现,按第十条军规立案。
现象
#4677 给谓词写(
multi: true)加了聚合事件契约,并在@objectstack/client上开了subscribeBulkData(object, cb)。但@objectstack/client-react没有跟上:packages/client-react/src/realtime-hooks.tsx里三个 hook 全部委托client.events.subscribeData(:94、:183),没有任何一个订阅data.records.*:useDataSubscription(:84)useDataSubscriptionCallback(:173)useAutoRefresh(:251)于是 React 用户拿不到批量写事件 —— client SDK 有这个能力,hooks 层没暴露。
最刺眼的是
useAutoRefresh它的语义就是"数据变了就重取"。而谓词写恰恰是最该重取的场景 —— 一次改掉/删掉 40 行,列表页整页都脏了。现在它对此完全不刷新,而对单条记录改动反而会刷。
这不是性能取舍,是语义漏洞:一个叫 "auto refresh" 的 hook 在数据变化最大的那次写入上静默不动。
处置方向
useBulkDataSubscription(和useBulkDataSubscriptionCallback,如果要与现有成对结构保持一致),委托subscribeBulkData;useAutoRefresh同时订两条流 —— 逐记录和批量都触发重取。它的返回值是刷新信号,不是事件体,所以两种事件在这里天然同构,不存在 declared ≠ enforced:引擎 multi:true 谓词写入没有 data.record.* 事件,webhook / 知识同步对其静默(REST 批量端点不受影响) #4639 里那个"形状不同不能混"的问题(那条约束针对的是把BulkDataEvent交给(event: DataEvent) => void回调,useAutoRefresh不暴露事件体);useDataSubscription/useDataSubscriptionCallback保持只收逐记录 —— 它们的回调签名是DataEvent,混进来就是 client realtime declared ≠ enforced:subscribeData 回调把 RealtimeEventPayload 硬铸成 DataEvent,顶层 recordId/changes/id 运行时是 undefined #4626 消灭的那个缺陷。参考
packages/client/src/realtime-api.ts——subscribeBulkData的边界校验写法packages/client-react/src/realtime-hooks.tsx