@rocicorp/zero 1.11.0-canary.3 → 1.11.0-canary.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (988) hide show
  1. package/out/analyze-query/src/analyze-cli.js +4 -4
  2. package/out/analyze-query/src/analyze-cli.js.map +1 -1
  3. package/out/analyze-query/src/bin-analyze.js +13 -12
  4. package/out/analyze-query/src/bin-analyze.js.map +1 -1
  5. package/out/analyze-query/src/bin-transform.js +1 -1
  6. package/out/analyze-query/src/bin-transform.js.map +1 -1
  7. package/out/ast-to-zql/src/ast-to-zql.d.ts +8 -1
  8. package/out/ast-to-zql/src/ast-to-zql.d.ts.map +1 -1
  9. package/out/ast-to-zql/src/ast-to-zql.js +25 -25
  10. package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
  11. package/out/otel/src/log-options.d.ts +16 -0
  12. package/out/otel/src/log-options.d.ts.map +1 -1
  13. package/out/otel/src/log-options.js +60 -6
  14. package/out/otel/src/log-options.js.map +1 -1
  15. package/out/replicache/src/bg-interval.d.ts +2 -1
  16. package/out/replicache/src/bg-interval.d.ts.map +1 -1
  17. package/out/replicache/src/bg-interval.js +13 -4
  18. package/out/replicache/src/bg-interval.js.map +1 -1
  19. package/out/replicache/src/btree/node.d.ts.map +1 -1
  20. package/out/replicache/src/btree/node.js +3 -6
  21. package/out/replicache/src/btree/node.js.map +1 -1
  22. package/out/replicache/src/dag/gc.d.ts.map +1 -1
  23. package/out/replicache/src/dag/gc.js +8 -11
  24. package/out/replicache/src/dag/gc.js.map +1 -1
  25. package/out/replicache/src/dag/invalid-ref-count-error.d.ts +12 -0
  26. package/out/replicache/src/dag/invalid-ref-count-error.d.ts.map +1 -0
  27. package/out/replicache/src/dag/invalid-ref-count-error.js +19 -0
  28. package/out/replicache/src/dag/invalid-ref-count-error.js.map +1 -0
  29. package/out/replicache/src/dag/lazy-store.d.ts +17 -4
  30. package/out/replicache/src/dag/lazy-store.d.ts.map +1 -1
  31. package/out/replicache/src/dag/lazy-store.js +35 -9
  32. package/out/replicache/src/dag/lazy-store.js.map +1 -1
  33. package/out/replicache/src/dag/store-impl.d.ts +12 -2
  34. package/out/replicache/src/dag/store-impl.d.ts.map +1 -1
  35. package/out/replicache/src/dag/store-impl.js +29 -9
  36. package/out/replicache/src/dag/store-impl.js.map +1 -1
  37. package/out/replicache/src/db/rebase.d.ts +14 -2
  38. package/out/replicache/src/db/rebase.d.ts.map +1 -1
  39. package/out/replicache/src/db/rebase.js +27 -5
  40. package/out/replicache/src/db/rebase.js.map +1 -1
  41. package/out/replicache/src/get-kv-store-provider.d.ts +1 -1
  42. package/out/replicache/src/get-kv-store-provider.d.ts.map +1 -1
  43. package/out/replicache/src/get-kv-store-provider.js +4 -4
  44. package/out/replicache/src/get-kv-store-provider.js.map +1 -1
  45. package/out/replicache/src/kv/expo-sqlite/store.d.ts.map +1 -1
  46. package/out/replicache/src/kv/expo-sqlite/store.js +28 -5
  47. package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
  48. package/out/replicache/src/kv/idb-store.d.ts +18 -0
  49. package/out/replicache/src/kv/idb-store.d.ts.map +1 -1
  50. package/out/replicache/src/kv/idb-store.js +30 -2
  51. package/out/replicache/src/kv/idb-store.js.map +1 -1
  52. package/out/replicache/src/kv/mem-fallback-store.d.ts +54 -0
  53. package/out/replicache/src/kv/mem-fallback-store.d.ts.map +1 -0
  54. package/out/replicache/src/kv/mem-fallback-store.js +177 -0
  55. package/out/replicache/src/kv/mem-fallback-store.js.map +1 -0
  56. package/out/replicache/src/kv/mem-store.d.ts +1 -0
  57. package/out/replicache/src/kv/mem-store.d.ts.map +1 -1
  58. package/out/replicache/src/kv/mem-store.js +3 -0
  59. package/out/replicache/src/kv/mem-store.js.map +1 -1
  60. package/out/replicache/src/kv/op-sqlite/store.d.ts.map +1 -1
  61. package/out/replicache/src/kv/op-sqlite/store.js +4 -4
  62. package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
  63. package/out/replicache/src/kv/sqlite-store.d.ts +22 -1
  64. package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
  65. package/out/replicache/src/kv/sqlite-store.js +159 -14
  66. package/out/replicache/src/kv/sqlite-store.js.map +1 -1
  67. package/out/replicache/src/kv/store.d.ts +6 -0
  68. package/out/replicache/src/kv/store.d.ts.map +1 -1
  69. package/out/replicache/src/new-client-channel.js.map +1 -1
  70. package/out/replicache/src/persist/client-gc.d.ts +2 -1
  71. package/out/replicache/src/persist/client-gc.d.ts.map +1 -1
  72. package/out/replicache/src/persist/client-gc.js +2 -2
  73. package/out/replicache/src/persist/client-gc.js.map +1 -1
  74. package/out/replicache/src/persist/client-group-gc.d.ts +2 -1
  75. package/out/replicache/src/persist/client-group-gc.d.ts.map +1 -1
  76. package/out/replicache/src/persist/client-group-gc.js +2 -2
  77. package/out/replicache/src/persist/client-group-gc.js.map +1 -1
  78. package/out/replicache/src/persist/clients.d.ts +2 -2
  79. package/out/replicache/src/persist/collect-idb-databases.d.ts +28 -8
  80. package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
  81. package/out/replicache/src/persist/collect-idb-databases.js +97 -20
  82. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
  83. package/out/replicache/src/persist/heartbeat.d.ts +2 -1
  84. package/out/replicache/src/persist/heartbeat.d.ts.map +1 -1
  85. package/out/replicache/src/persist/heartbeat.js +2 -2
  86. package/out/replicache/src/persist/heartbeat.js.map +1 -1
  87. package/out/replicache/src/persist/idb-databases-store-db-name.js +1 -1
  88. package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -1
  89. package/out/replicache/src/persist/persist.d.ts.map +1 -1
  90. package/out/replicache/src/persist/persist.js +18 -8
  91. package/out/replicache/src/persist/persist.js.map +1 -1
  92. package/out/replicache/src/persist/refresh.js +6 -2
  93. package/out/replicache/src/persist/refresh.js.map +1 -1
  94. package/out/replicache/src/replicache-impl.d.ts +85 -3
  95. package/out/replicache/src/replicache-impl.d.ts.map +1 -1
  96. package/out/replicache/src/replicache-impl.js +321 -29
  97. package/out/replicache/src/replicache-impl.js.map +1 -1
  98. package/out/replicache/src/replicache-options.d.ts +9 -0
  99. package/out/replicache/src/replicache-options.d.ts.map +1 -1
  100. package/out/replicache/src/storage-failure.d.ts +37 -0
  101. package/out/replicache/src/storage-failure.d.ts.map +1 -0
  102. package/out/replicache/src/storage-failure.js +31 -0
  103. package/out/replicache/src/storage-failure.js.map +1 -0
  104. package/out/shared/src/arrays.d.ts +5 -0
  105. package/out/shared/src/arrays.d.ts.map +1 -1
  106. package/out/shared/src/arrays.js +8 -10
  107. package/out/shared/src/arrays.js.map +1 -1
  108. package/out/shared/src/base64.d.ts +19 -0
  109. package/out/shared/src/base64.d.ts.map +1 -0
  110. package/out/shared/src/base64.js +40 -0
  111. package/out/shared/src/base64.js.map +1 -0
  112. package/out/shared/src/centroid.d.ts +0 -1
  113. package/out/shared/src/centroid.d.ts.map +1 -1
  114. package/out/shared/src/centroid.js +1 -4
  115. package/out/shared/src/centroid.js.map +1 -1
  116. package/out/shared/src/error.d.ts +11 -0
  117. package/out/shared/src/error.d.ts.map +1 -1
  118. package/out/shared/src/error.js +35 -1
  119. package/out/shared/src/error.js.map +1 -1
  120. package/out/shared/src/hash.d.ts.map +1 -1
  121. package/out/shared/src/hash.js +32 -7
  122. package/out/shared/src/hash.js.map +1 -1
  123. package/out/shared/src/iterables.d.ts +2 -0
  124. package/out/shared/src/iterables.d.ts.map +1 -1
  125. package/out/shared/src/iterables.js +18 -1
  126. package/out/shared/src/iterables.js.map +1 -1
  127. package/out/shared/src/map.d.ts +24 -2
  128. package/out/shared/src/map.d.ts.map +1 -1
  129. package/out/shared/src/map.js +18 -4
  130. package/out/shared/src/map.js.map +1 -1
  131. package/out/shared/src/options-types.d.ts +2 -2
  132. package/out/shared/src/options.d.ts.map +1 -1
  133. package/out/shared/src/options.js +10 -7
  134. package/out/shared/src/options.js.map +1 -1
  135. package/out/shared/src/packed-boolean-map.d.ts +7 -0
  136. package/out/shared/src/packed-boolean-map.d.ts.map +1 -0
  137. package/out/shared/src/packed-boolean-map.js +36 -0
  138. package/out/shared/src/packed-boolean-map.js.map +1 -0
  139. package/out/shared/src/random-values.js +12 -1
  140. package/out/shared/src/random-values.js.map +1 -1
  141. package/out/shared/src/ring-buffer.d.ts +10 -0
  142. package/out/shared/src/ring-buffer.d.ts.map +1 -1
  143. package/out/shared/src/ring-buffer.js +26 -1
  144. package/out/shared/src/ring-buffer.js.map +1 -1
  145. package/out/shared/src/tdigest.d.ts +10 -0
  146. package/out/shared/src/tdigest.d.ts.map +1 -1
  147. package/out/shared/src/tdigest.js +147 -63
  148. package/out/shared/src/tdigest.js.map +1 -1
  149. package/out/shared/src/valita.d.ts +13 -0
  150. package/out/shared/src/valita.d.ts.map +1 -1
  151. package/out/shared/src/valita.js +23 -23
  152. package/out/shared/src/valita.js.map +1 -1
  153. package/out/z2s/src/compiler.d.ts.map +1 -1
  154. package/out/z2s/src/compiler.js +10 -6
  155. package/out/z2s/src/compiler.js.map +1 -1
  156. package/out/z2s/src/sql.d.ts.map +1 -1
  157. package/out/z2s/src/sql.js +9 -5
  158. package/out/z2s/src/sql.js.map +1 -1
  159. package/out/zero/package.js +4 -5
  160. package/out/zero/package.js.map +1 -1
  161. package/out/zero/src/zero.js +2 -1
  162. package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
  163. package/out/zero-cache/src/auth/write-authorizer.js +1 -0
  164. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  165. package/out/zero-cache/src/config/normalize.d.ts +1 -0
  166. package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
  167. package/out/zero-cache/src/config/normalize.js +46 -4
  168. package/out/zero-cache/src/config/normalize.js.map +1 -1
  169. package/out/zero-cache/src/config/zero-config.d.ts +116 -24
  170. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  171. package/out/zero-cache/src/config/zero-config.js +409 -157
  172. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  173. package/out/zero-cache/src/custom/fetch.d.ts +1 -1
  174. package/out/zero-cache/src/custom/fetch.d.ts.map +1 -1
  175. package/out/zero-cache/src/custom/fetch.js.map +1 -1
  176. package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
  177. package/out/zero-cache/src/db/lite-tables.js +3 -4
  178. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  179. package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
  180. package/out/zero-cache/src/db/migration-lite.js +5 -3
  181. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  182. package/out/zero-cache/src/observability/events.js +4 -1
  183. package/out/zero-cache/src/observability/events.js.map +1 -1
  184. package/out/zero-cache/src/observability/log-throttle.d.ts +44 -0
  185. package/out/zero-cache/src/observability/log-throttle.d.ts.map +1 -0
  186. package/out/zero-cache/src/observability/log-throttle.js +76 -0
  187. package/out/zero-cache/src/observability/log-throttle.js.map +1 -0
  188. package/out/zero-cache/src/observability/metrics.d.ts.map +1 -1
  189. package/out/zero-cache/src/observability/metrics.js +2 -7
  190. package/out/zero-cache/src/observability/metrics.js.map +1 -1
  191. package/out/zero-cache/src/scripts/permissions.d.ts +16 -0
  192. package/out/zero-cache/src/scripts/permissions.d.ts.map +1 -1
  193. package/out/zero-cache/src/scripts/permissions.js +3 -3
  194. package/out/zero-cache/src/scripts/permissions.js.map +1 -1
  195. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  196. package/out/zero-cache/src/server/change-streamer.js +117 -77
  197. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  198. package/out/zero-cache/src/server/inspector-delegate.d.ts +28 -2
  199. package/out/zero-cache/src/server/inspector-delegate.d.ts.map +1 -1
  200. package/out/zero-cache/src/server/inspector-delegate.js +37 -17
  201. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
  202. package/out/zero-cache/src/server/main.d.ts.map +1 -1
  203. package/out/zero-cache/src/server/main.js +8 -1
  204. package/out/zero-cache/src/server/main.js.map +1 -1
  205. package/out/zero-cache/src/server/mutator.js +2 -0
  206. package/out/zero-cache/src/server/mutator.js.map +1 -1
  207. package/out/zero-cache/src/server/reaper.d.ts.map +1 -1
  208. package/out/zero-cache/src/server/reaper.js +2 -0
  209. package/out/zero-cache/src/server/reaper.js.map +1 -1
  210. package/out/zero-cache/src/server/replicator.d.ts +3 -0
  211. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  212. package/out/zero-cache/src/server/replicator.js +95 -21
  213. package/out/zero-cache/src/server/replicator.js.map +1 -1
  214. package/out/zero-cache/src/server/runner/zero-dispatcher.d.ts.map +1 -1
  215. package/out/zero-cache/src/server/runner/zero-dispatcher.js +5 -0
  216. package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
  217. package/out/zero-cache/src/server/syncer-assigner.d.ts +14 -0
  218. package/out/zero-cache/src/server/syncer-assigner.d.ts.map +1 -0
  219. package/out/zero-cache/src/server/syncer-assigner.js +72 -0
  220. package/out/zero-cache/src/server/syncer-assigner.js.map +1 -0
  221. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  222. package/out/zero-cache/src/server/syncer.js +24 -2
  223. package/out/zero-cache/src/server/syncer.js.map +1 -1
  224. package/out/zero-cache/src/server/worker-dispatcher.d.ts.map +1 -1
  225. package/out/zero-cache/src/server/worker-dispatcher.js +21 -4
  226. package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -1
  227. package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
  228. package/out/zero-cache/src/services/analyze.js +11 -9
  229. package/out/zero-cache/src/services/analyze.js.map +1 -1
  230. package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts.map +1 -1
  231. package/out/zero-cache/src/services/change-source/common/backfill-manager.js +198 -24
  232. package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
  233. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.d.ts.map +1 -1
  234. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js +16 -4
  235. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -1
  236. package/out/zero-cache/src/services/change-source/common/init-cleanup.d.ts +24 -0
  237. package/out/zero-cache/src/services/change-source/common/init-cleanup.d.ts.map +1 -0
  238. package/out/zero-cache/src/services/change-source/common/init-cleanup.js +44 -0
  239. package/out/zero-cache/src/services/change-source/common/init-cleanup.js.map +1 -0
  240. package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts +92 -2
  241. package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts.map +1 -1
  242. package/out/zero-cache/src/services/change-source/common/replica-restore.js +27 -10
  243. package/out/zero-cache/src/services/change-source/common/replica-restore.js.map +1 -1
  244. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts +1 -0
  245. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
  246. package/out/zero-cache/src/services/change-source/common/replica-schema.js +15 -3
  247. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  248. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts +1 -1
  249. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
  250. package/out/zero-cache/src/services/change-source/custom/change-source.js +7 -3
  251. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  252. package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts +9 -0
  253. package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts.map +1 -1
  254. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +206 -19
  255. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
  256. package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts +55 -0
  257. package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts.map +1 -0
  258. package/out/zero-cache/src/services/change-source/pg/change-source-init.js +305 -0
  259. package/out/zero-cache/src/services/change-source/pg/change-source-init.js.map +1 -0
  260. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +31 -18
  261. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  262. package/out/zero-cache/src/services/change-source/pg/change-source.js +130 -157
  263. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  264. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +38 -2
  265. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  266. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +55 -21
  267. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  268. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts +31 -0
  269. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts.map +1 -1
  270. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +102 -3
  271. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  272. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts +16 -0
  273. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts.map +1 -0
  274. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js +113 -0
  275. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js.map +1 -0
  276. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts +40 -15
  277. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts.map +1 -1
  278. package/out/zero-cache/src/services/change-source/pg/replication-slots.js +149 -27
  279. package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
  280. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts.map +1 -1
  281. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js +68 -8
  282. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js.map +1 -1
  283. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
  284. package/out/zero-cache/src/services/change-source/pg/schema/init.js +32 -1
  285. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  286. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.d.ts +10 -0
  287. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.d.ts.map +1 -0
  288. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js +6 -0
  289. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js.map +1 -0
  290. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +50 -27
  291. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
  292. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +98 -34
  293. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  294. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts +68 -0
  295. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts.map +1 -0
  296. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js +141 -0
  297. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js.map +1 -0
  298. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +45 -2
  299. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
  300. package/out/zero-cache/src/services/change-source/protocol/current/data.js +10 -1
  301. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  302. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +60 -3
  303. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
  304. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts +23 -10
  305. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts.map +1 -1
  306. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js +17 -7
  307. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -1
  308. package/out/zero-cache/src/services/change-source/protocol/current.js +2 -1
  309. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts +72 -0
  310. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts.map +1 -0
  311. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js +162 -0
  312. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js.map +1 -0
  313. package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts +50 -0
  314. package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts.map +1 -0
  315. package/out/zero-cache/src/services/change-streamer/backfill-state.js +268 -0
  316. package/out/zero-cache/src/services/change-streamer/backfill-state.js.map +1 -0
  317. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts.map +1 -1
  318. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js +6 -17
  319. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js.map +1 -1
  320. package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts.map +1 -1
  321. package/out/zero-cache/src/services/change-streamer/backup-monitor.js +59 -8
  322. package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
  323. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts +8 -2
  324. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts.map +1 -1
  325. package/out/zero-cache/src/services/change-streamer/broadcast.js +24 -4
  326. package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
  327. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts +19 -4
  328. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts.map +1 -1
  329. package/out/zero-cache/src/services/change-streamer/change-log-codec.js +28 -8
  330. package/out/zero-cache/src/services/change-streamer/change-log-codec.js.map +1 -1
  331. package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts +17 -0
  332. package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts.map +1 -1
  333. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js +44 -1
  334. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js.map +1 -1
  335. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +48 -6
  336. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  337. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +131 -34
  338. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  339. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +22 -0
  340. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  341. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +149 -78
  342. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  343. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +38 -16
  344. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
  345. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  346. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts +3 -3
  347. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -1
  348. package/out/zero-cache/src/services/change-streamer/forwarder.js +36 -5
  349. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
  350. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts +53 -0
  351. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts.map +1 -0
  352. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js +156 -0
  353. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js.map +1 -0
  354. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +58 -1
  355. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
  356. package/out/zero-cache/src/services/change-streamer/schema/tables.js +107 -16
  357. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  358. package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts +92 -0
  359. package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts.map +1 -0
  360. package/out/zero-cache/src/services/change-streamer/snapshot-message.js +42 -0
  361. package/out/zero-cache/src/services/change-streamer/snapshot-message.js.map +1 -0
  362. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts +1 -1
  363. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts.map +1 -1
  364. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js +16 -4
  365. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js.map +1 -1
  366. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts +7 -69
  367. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts.map +1 -1
  368. package/out/zero-cache/src/services/change-streamer/snapshot.js +21 -53
  369. package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -1
  370. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts +6 -1
  371. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts.map +1 -1
  372. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js +27 -9
  373. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js.map +1 -1
  374. package/out/zero-cache/src/services/change-streamer/storer.d.ts +95 -4
  375. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  376. package/out/zero-cache/src/services/change-streamer/storer.js +293 -83
  377. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  378. package/out/zero-cache/src/services/change-streamer/subscribe.d.ts +446 -0
  379. package/out/zero-cache/src/services/change-streamer/subscribe.d.ts.map +1 -0
  380. package/out/zero-cache/src/services/change-streamer/subscribe.js +76 -0
  381. package/out/zero-cache/src/services/change-streamer/subscribe.js.map +1 -0
  382. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +58 -1
  383. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
  384. package/out/zero-cache/src/services/change-streamer/subscriber.js +123 -12
  385. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  386. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts +19 -1
  387. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts.map +1 -1
  388. package/out/zero-cache/src/services/change-streamer/upstream-acker.js +23 -3
  389. package/out/zero-cache/src/services/change-streamer/upstream-acker.js.map +1 -1
  390. package/out/zero-cache/src/services/http-service.d.ts +1 -1
  391. package/out/zero-cache/src/services/http-service.d.ts.map +1 -1
  392. package/out/zero-cache/src/services/http-service.js.map +1 -1
  393. package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
  394. package/out/zero-cache/src/services/life-cycle.js +3 -1
  395. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  396. package/out/zero-cache/src/services/litestream/commands.d.ts +34 -3
  397. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  398. package/out/zero-cache/src/services/litestream/commands.js +121 -35
  399. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  400. package/out/zero-cache/src/services/litestream/config-v5.yml +6 -7
  401. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js +51 -24
  402. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js.map +1 -1
  403. package/out/zero-cache/src/services/litestream/litestream-controller.d.ts +10 -2
  404. package/out/zero-cache/src/services/litestream/litestream-controller.d.ts.map +1 -1
  405. package/out/zero-cache/src/services/litestream/litestream-controller.js +3 -2
  406. package/out/zero-cache/src/services/litestream/litestream-controller.js.map +1 -1
  407. package/out/zero-cache/src/services/litestream/restore-progress.d.ts +24 -0
  408. package/out/zero-cache/src/services/litestream/restore-progress.d.ts.map +1 -0
  409. package/out/zero-cache/src/services/litestream/restore-progress.js +91 -0
  410. package/out/zero-cache/src/services/litestream/restore-progress.js.map +1 -0
  411. package/out/zero-cache/src/services/litestream/wal-keeper.d.ts +33 -0
  412. package/out/zero-cache/src/services/litestream/wal-keeper.d.ts.map +1 -0
  413. package/out/zero-cache/src/services/litestream/wal-keeper.js +49 -0
  414. package/out/zero-cache/src/services/litestream/wal-keeper.js.map +1 -0
  415. package/out/zero-cache/src/services/mutagen/mutagen.d.ts +5 -0
  416. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  417. package/out/zero-cache/src/services/mutagen/mutagen.js +7 -1
  418. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  419. package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
  420. package/out/zero-cache/src/services/mutagen/pusher.js +5 -6
  421. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  422. package/out/zero-cache/src/services/plannerz.d.ts +163 -0
  423. package/out/zero-cache/src/services/plannerz.d.ts.map +1 -0
  424. package/out/zero-cache/src/services/plannerz.js +267 -0
  425. package/out/zero-cache/src/services/plannerz.js.map +1 -0
  426. package/out/zero-cache/src/services/profz.d.ts +30 -0
  427. package/out/zero-cache/src/services/profz.d.ts.map +1 -0
  428. package/out/zero-cache/src/services/profz.js +163 -0
  429. package/out/zero-cache/src/services/profz.js.map +1 -0
  430. package/out/zero-cache/src/services/replicator/change-log-cookies.js +1 -1
  431. package/out/zero-cache/src/services/replicator/change-log-cookies.js.map +1 -1
  432. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts +5 -4
  433. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts.map +1 -1
  434. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js +20 -22
  435. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js.map +1 -1
  436. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
  437. package/out/zero-cache/src/services/replicator/change-processor.js +51 -5
  438. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  439. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +5 -2
  440. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  441. package/out/zero-cache/src/services/replicator/incremental-sync.js +54 -21
  442. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  443. package/out/zero-cache/src/services/replicator/replication-status.d.ts +35 -1
  444. package/out/zero-cache/src/services/replicator/replication-status.d.ts.map +1 -1
  445. package/out/zero-cache/src/services/replicator/replication-status.js +99 -8
  446. package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
  447. package/out/zero-cache/src/services/replicator/replicator.d.ts +4 -1
  448. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
  449. package/out/zero-cache/src/services/replicator/replicator.js +5 -2
  450. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  451. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts +16 -1
  452. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts.map +1 -1
  453. package/out/zero-cache/src/services/replicator/reporter/recorder.js +70 -27
  454. package/out/zero-cache/src/services/replicator/reporter/recorder.js.map +1 -1
  455. package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts +23 -2
  456. package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts.map +1 -1
  457. package/out/zero-cache/src/services/replicator/schema/backfilling.js +54 -2
  458. package/out/zero-cache/src/services/replicator/schema/backfilling.js.map +1 -1
  459. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts +6 -6
  460. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts.map +1 -1
  461. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js +19 -14
  462. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js.map +1 -1
  463. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts +11 -3
  464. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts.map +1 -1
  465. package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
  466. package/out/zero-cache/src/services/replicator/write-worker.js +5 -1
  467. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
  468. package/out/zero-cache/src/services/run-ast.d.ts +12 -0
  469. package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
  470. package/out/zero-cache/src/services/run-ast.js +42 -22
  471. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  472. package/out/zero-cache/src/services/runner.d.ts +2 -1
  473. package/out/zero-cache/src/services/runner.d.ts.map +1 -1
  474. package/out/zero-cache/src/services/runner.js +10 -2
  475. package/out/zero-cache/src/services/runner.js.map +1 -1
  476. package/out/zero-cache/src/services/statz.d.ts +4 -0
  477. package/out/zero-cache/src/services/statz.d.ts.map +1 -1
  478. package/out/zero-cache/src/services/statz.js +22 -5
  479. package/out/zero-cache/src/services/statz.js.map +1 -1
  480. package/out/zero-cache/src/services/view-syncer/advancement-metrics.d.ts +26 -0
  481. package/out/zero-cache/src/services/view-syncer/advancement-metrics.d.ts.map +1 -0
  482. package/out/zero-cache/src/services/view-syncer/advancement-metrics.js +26 -0
  483. package/out/zero-cache/src/services/view-syncer/advancement-metrics.js.map +1 -0
  484. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +19 -2
  485. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
  486. package/out/zero-cache/src/services/view-syncer/client-handler.js +42 -30
  487. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  488. package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts +2 -1
  489. package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts.map +1 -1
  490. package/out/zero-cache/src/services/view-syncer/connection-context-manager.js +1 -0
  491. package/out/zero-cache/src/services/view-syncer/connection-context-manager.js.map +1 -1
  492. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +27 -2
  493. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  494. package/out/zero-cache/src/services/view-syncer/cvr-store.js +85 -20
  495. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  496. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +76 -11
  497. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  498. package/out/zero-cache/src/services/view-syncer/cvr.js +214 -40
  499. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  500. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts +81 -0
  501. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts.map +1 -0
  502. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js +128 -0
  503. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js.map +1 -0
  504. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts +14 -1
  505. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts.map +1 -1
  506. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +30 -4
  507. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
  508. package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts +33 -0
  509. package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts.map +1 -0
  510. package/out/zero-cache/src/services/view-syncer/hydration-budget.js +62 -0
  511. package/out/zero-cache/src/services/view-syncer/hydration-budget.js.map +1 -0
  512. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts +51 -0
  513. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts.map +1 -0
  514. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js +78 -0
  515. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js.map +1 -0
  516. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts +10 -1
  517. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts.map +1 -1
  518. package/out/zero-cache/src/services/view-syncer/inspect-handler.js +18 -4
  519. package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
  520. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +80 -6
  521. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  522. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +658 -195
  523. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  524. package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts +7 -0
  525. package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts.map +1 -0
  526. package/out/zero-cache/src/services/view-syncer/plan-warnings.js +35 -0
  527. package/out/zero-cache/src/services/view-syncer/plan-warnings.js.map +1 -0
  528. package/out/zero-cache/src/services/view-syncer/query-covering.d.ts.map +1 -1
  529. package/out/zero-cache/src/services/view-syncer/query-covering.js +2 -6
  530. package/out/zero-cache/src/services/view-syncer/query-covering.js.map +1 -1
  531. package/out/zero-cache/src/services/view-syncer/query-shape.d.ts +25 -0
  532. package/out/zero-cache/src/services/view-syncer/query-shape.d.ts.map +1 -0
  533. package/out/zero-cache/src/services/view-syncer/query-shape.js +28 -0
  534. package/out/zero-cache/src/services/view-syncer/query-shape.js.map +1 -0
  535. package/out/zero-cache/src/services/view-syncer/query-stats.d.ts +82 -0
  536. package/out/zero-cache/src/services/view-syncer/query-stats.d.ts.map +1 -0
  537. package/out/zero-cache/src/services/view-syncer/query-stats.js +214 -0
  538. package/out/zero-cache/src/services/view-syncer/query-stats.js.map +1 -0
  539. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +2 -107
  540. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +1 -1
  541. package/out/zero-cache/src/services/view-syncer/schema/types.js +5 -20
  542. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  543. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts +95 -0
  544. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts.map +1 -0
  545. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js +155 -0
  546. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js.map +1 -0
  547. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +96 -14
  548. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  549. package/out/zero-cache/src/services/view-syncer/snapshotter.js +214 -30
  550. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  551. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +11 -1
  552. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  553. package/out/zero-cache/src/services/view-syncer/view-syncer.js +566 -107
  554. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  555. package/out/zero-cache/src/types/pg-data-type.d.ts +2 -0
  556. package/out/zero-cache/src/types/pg-data-type.d.ts.map +1 -1
  557. package/out/zero-cache/src/types/pg-data-type.js +6 -1
  558. package/out/zero-cache/src/types/pg-data-type.js.map +1 -1
  559. package/out/zero-cache/src/types/pg.d.ts.map +1 -1
  560. package/out/zero-cache/src/types/pg.js +1 -1
  561. package/out/zero-cache/src/types/pg.js.map +1 -1
  562. package/out/zero-cache/src/types/processes.d.ts +39 -0
  563. package/out/zero-cache/src/types/processes.d.ts.map +1 -1
  564. package/out/zero-cache/src/types/processes.js +43 -4
  565. package/out/zero-cache/src/types/processes.js.map +1 -1
  566. package/out/zero-cache/src/types/profiler.d.ts +12 -0
  567. package/out/zero-cache/src/types/profiler.d.ts.map +1 -1
  568. package/out/zero-cache/src/types/profiler.js +46 -1
  569. package/out/zero-cache/src/types/profiler.js.map +1 -1
  570. package/out/zero-cache/src/types/row-key.d.ts +1 -15
  571. package/out/zero-cache/src/types/row-key.d.ts.map +1 -1
  572. package/out/zero-cache/src/types/row-key.js +6 -8
  573. package/out/zero-cache/src/types/row-key.js.map +1 -1
  574. package/out/zero-cache/src/types/streams.d.ts +49 -7
  575. package/out/zero-cache/src/types/streams.d.ts.map +1 -1
  576. package/out/zero-cache/src/types/streams.js +190 -58
  577. package/out/zero-cache/src/types/streams.js.map +1 -1
  578. package/out/zero-cache/src/types/subscription.d.ts +15 -0
  579. package/out/zero-cache/src/types/subscription.d.ts.map +1 -1
  580. package/out/zero-cache/src/types/subscription.js +123 -31
  581. package/out/zero-cache/src/types/subscription.js.map +1 -1
  582. package/out/zero-cache/src/types/websocket-handoff.d.ts +1 -1
  583. package/out/zero-cache/src/types/websocket-handoff.d.ts.map +1 -1
  584. package/out/zero-cache/src/types/websocket-handoff.js +18 -9
  585. package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
  586. package/out/zero-cache/src/types/ws.d.ts.map +1 -1
  587. package/out/zero-cache/src/types/ws.js +1 -16
  588. package/out/zero-cache/src/types/ws.js.map +1 -1
  589. package/out/zero-cache/src/workers/connect-params.d.ts +18 -1
  590. package/out/zero-cache/src/workers/connect-params.d.ts.map +1 -1
  591. package/out/zero-cache/src/workers/connect-params.js +25 -1
  592. package/out/zero-cache/src/workers/connect-params.js.map +1 -1
  593. package/out/zero-cache/src/workers/connection.d.ts +4 -4
  594. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  595. package/out/zero-cache/src/workers/connection.js +8 -8
  596. package/out/zero-cache/src/workers/connection.js.map +1 -1
  597. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
  598. package/out/zero-cache/src/workers/replicator.js +15 -7
  599. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  600. package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +1 -1
  601. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +21 -16
  602. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  603. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  604. package/out/zero-cache/src/workers/syncer.js +55 -4
  605. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  606. package/out/zero-client/src/client/active-clients-manager.d.ts.map +1 -1
  607. package/out/zero-client/src/client/active-clients-manager.js +4 -1
  608. package/out/zero-client/src/client/active-clients-manager.js.map +1 -1
  609. package/out/zero-client/src/client/connection-manager.d.ts +20 -0
  610. package/out/zero-client/src/client/connection-manager.d.ts.map +1 -1
  611. package/out/zero-client/src/client/connection-manager.js +77 -13
  612. package/out/zero-client/src/client/connection-manager.js.map +1 -1
  613. package/out/zero-client/src/client/connection-status-enum.d.ts +2 -0
  614. package/out/zero-client/src/client/connection-status-enum.d.ts.map +1 -1
  615. package/out/zero-client/src/client/connection-status-enum.js +3 -1
  616. package/out/zero-client/src/client/connection-status-enum.js.map +1 -1
  617. package/out/zero-client/src/client/connection.d.ts +6 -0
  618. package/out/zero-client/src/client/connection.d.ts.map +1 -1
  619. package/out/zero-client/src/client/connection.js +2 -1
  620. package/out/zero-client/src/client/connection.js.map +1 -1
  621. package/out/zero-client/src/client/context.d.ts +23 -13
  622. package/out/zero-client/src/client/context.d.ts.map +1 -1
  623. package/out/zero-client/src/client/context.js +94 -26
  624. package/out/zero-client/src/client/context.js.map +1 -1
  625. package/out/zero-client/src/client/crud-impl.d.ts.map +1 -1
  626. package/out/zero-client/src/client/crud-impl.js +1 -1
  627. package/out/zero-client/src/client/crud-impl.js.map +1 -1
  628. package/out/zero-client/src/client/custom.d.ts +5 -4
  629. package/out/zero-client/src/client/custom.d.ts.map +1 -1
  630. package/out/zero-client/src/client/custom.js +3 -3
  631. package/out/zero-client/src/client/custom.js.map +1 -1
  632. package/out/zero-client/src/client/inspector/lazy-inspector.js +1 -1
  633. package/out/zero-client/src/client/ivm-branch.d.ts.map +1 -1
  634. package/out/zero-client/src/client/ivm-branch.js +20 -3
  635. package/out/zero-client/src/client/ivm-branch.js.map +1 -1
  636. package/out/zero-client/src/client/keys.d.ts.map +1 -1
  637. package/out/zero-client/src/client/keys.js +19 -1
  638. package/out/zero-client/src/client/keys.js.map +1 -1
  639. package/out/zero-client/src/client/make-mutate-property.d.ts +1 -1
  640. package/out/zero-client/src/client/make-mutate-property.d.ts.map +1 -1
  641. package/out/zero-client/src/client/make-mutate-property.js.map +1 -1
  642. package/out/zero-client/src/client/make-replicache-mutators.d.ts.map +1 -1
  643. package/out/zero-client/src/client/make-replicache-mutators.js +1 -1
  644. package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
  645. package/out/zero-client/src/client/mutation-tracker.d.ts +2 -2
  646. package/out/zero-client/src/client/mutation-tracker.d.ts.map +1 -1
  647. package/out/zero-client/src/client/mutation-tracker.js +3 -7
  648. package/out/zero-client/src/client/mutation-tracker.js.map +1 -1
  649. package/out/zero-client/src/client/mutator-proxy.d.ts.map +1 -1
  650. package/out/zero-client/src/client/mutator-proxy.js +9 -4
  651. package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
  652. package/out/zero-client/src/client/options.d.ts +33 -0
  653. package/out/zero-client/src/client/options.d.ts.map +1 -1
  654. package/out/zero-client/src/client/options.js.map +1 -1
  655. package/out/zero-client/src/client/query-manager.d.ts +9 -0
  656. package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
  657. package/out/zero-client/src/client/query-manager.js +47 -14
  658. package/out/zero-client/src/client/query-manager.js.map +1 -1
  659. package/out/zero-client/src/client/reload-error-handler.js +2 -2
  660. package/out/zero-client/src/client/reload-error-handler.js.map +1 -1
  661. package/out/zero-client/src/client/version.js +1 -1
  662. package/out/zero-client/src/client/zero-rep.d.ts +1 -0
  663. package/out/zero-client/src/client/zero-rep.d.ts.map +1 -1
  664. package/out/zero-client/src/client/zero-rep.js +8 -6
  665. package/out/zero-client/src/client/zero-rep.js.map +1 -1
  666. package/out/zero-client/src/client/zero.d.ts +18 -3
  667. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  668. package/out/zero-client/src/client/zero.js +89 -50
  669. package/out/zero-client/src/client/zero.js.map +1 -1
  670. package/out/zero-client/src/mod.d.ts +2 -1
  671. package/out/zero-client/src/mod.d.ts.map +1 -1
  672. package/out/zero-client/src/mod.js +1 -0
  673. package/out/zero-client/src/types/query-result.d.ts +2 -0
  674. package/out/zero-client/src/types/query-result.d.ts.map +1 -1
  675. package/out/zero-events/src/status.d.ts +64 -0
  676. package/out/zero-events/src/status.d.ts.map +1 -1
  677. package/out/zero-protocol/src/analyze-query-result.d.ts +5 -0
  678. package/out/zero-protocol/src/analyze-query-result.d.ts.map +1 -1
  679. package/out/zero-protocol/src/analyze-query-result.js.map +1 -1
  680. package/out/zero-protocol/src/ast.d.ts.map +1 -1
  681. package/out/zero-protocol/src/ast.js +13 -14
  682. package/out/zero-protocol/src/ast.js.map +1 -1
  683. package/out/zero-protocol/src/connect.d.ts +16 -0
  684. package/out/zero-protocol/src/connect.d.ts.map +1 -1
  685. package/out/zero-protocol/src/connect.js +27 -1
  686. package/out/zero-protocol/src/connect.js.map +1 -1
  687. package/out/zero-protocol/src/down.d.ts +31 -31
  688. package/out/zero-protocol/src/feature-flag-enum.d.ts +14 -0
  689. package/out/zero-protocol/src/feature-flag-enum.d.ts.map +1 -0
  690. package/out/zero-protocol/src/feature-flag-enum.js +10 -0
  691. package/out/zero-protocol/src/feature-flag-enum.js.map +1 -0
  692. package/out/zero-protocol/src/feature-flag.d.ts +5 -0
  693. package/out/zero-protocol/src/feature-flag.d.ts.map +1 -0
  694. package/out/zero-protocol/src/inspect-down.d.ts +16 -16
  695. package/out/zero-protocol/src/poke.d.ts +17 -10
  696. package/out/zero-protocol/src/poke.d.ts.map +1 -1
  697. package/out/zero-protocol/src/poke.js +3 -2
  698. package/out/zero-protocol/src/poke.js.map +1 -1
  699. package/out/zero-protocol/src/protocol-version.d.ts +30 -6
  700. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
  701. package/out/zero-protocol/src/protocol-version.js +1 -1
  702. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  703. package/out/zero-protocol/src/query-hash.d.ts.map +1 -1
  704. package/out/zero-protocol/src/query-hash.js +2 -5
  705. package/out/zero-protocol/src/query-hash.js.map +1 -1
  706. package/out/zero-react/src/use-query.d.ts +5 -4
  707. package/out/zero-react/src/use-query.d.ts.map +1 -1
  708. package/out/zero-react/src/use-query.js +74 -7
  709. package/out/zero-react/src/use-query.js.map +1 -1
  710. package/out/zero-react/src/zero.js +1 -0
  711. package/out/zero-server/src/adapters/drizzle.d.ts +2 -1
  712. package/out/zero-server/src/adapters/drizzle.d.ts.map +1 -1
  713. package/out/zero-server/src/adapters/drizzle.js +12 -7
  714. package/out/zero-server/src/adapters/drizzle.js.map +1 -1
  715. package/out/zero-server/src/adapters/kysely.d.ts +2 -1
  716. package/out/zero-server/src/adapters/kysely.d.ts.map +1 -1
  717. package/out/zero-server/src/adapters/kysely.js +8 -2
  718. package/out/zero-server/src/adapters/kysely.js.map +1 -1
  719. package/out/zero-server/src/adapters/pg.d.ts +5 -1
  720. package/out/zero-server/src/adapters/pg.d.ts.map +1 -1
  721. package/out/zero-server/src/adapters/pg.js +28 -7
  722. package/out/zero-server/src/adapters/pg.js.map +1 -1
  723. package/out/zero-server/src/adapters/postgresjs.d.ts +1 -0
  724. package/out/zero-server/src/adapters/postgresjs.d.ts.map +1 -1
  725. package/out/zero-server/src/adapters/postgresjs.js +7 -1
  726. package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
  727. package/out/zero-server/src/adapters/prisma.d.ts +3 -2
  728. package/out/zero-server/src/adapters/prisma.d.ts.map +1 -1
  729. package/out/zero-server/src/adapters/prisma.js +8 -2
  730. package/out/zero-server/src/adapters/prisma.js.map +1 -1
  731. package/out/zero-server/src/closable-db-transaction.d.ts +16 -0
  732. package/out/zero-server/src/closable-db-transaction.d.ts.map +1 -0
  733. package/out/zero-server/src/closable-db-transaction.js +31 -0
  734. package/out/zero-server/src/closable-db-transaction.js.map +1 -0
  735. package/out/zero-server/src/custom.d.ts +10 -4
  736. package/out/zero-server/src/custom.d.ts.map +1 -1
  737. package/out/zero-server/src/custom.js +15 -6
  738. package/out/zero-server/src/custom.js.map +1 -1
  739. package/out/zero-server/src/logging.d.ts +2 -2
  740. package/out/zero-server/src/logging.d.ts.map +1 -1
  741. package/out/zero-server/src/logging.js +2 -2
  742. package/out/zero-server/src/logging.js.map +1 -1
  743. package/out/zero-server/src/mod.d.ts +1 -1
  744. package/out/zero-server/src/mod.d.ts.map +1 -1
  745. package/out/zero-server/src/pg-query-executor.d.ts +2 -2
  746. package/out/zero-server/src/pg-query-executor.d.ts.map +1 -1
  747. package/out/zero-server/src/pg-query-executor.js +2 -2
  748. package/out/zero-server/src/pg-query-executor.js.map +1 -1
  749. package/out/zero-server/src/process-mutations.d.ts +25 -4
  750. package/out/zero-server/src/process-mutations.d.ts.map +1 -1
  751. package/out/zero-server/src/process-mutations.js +103 -52
  752. package/out/zero-server/src/process-mutations.js.map +1 -1
  753. package/out/zero-server/src/push-processor.d.ts +8 -2
  754. package/out/zero-server/src/push-processor.d.ts.map +1 -1
  755. package/out/zero-server/src/push-processor.js +12 -4
  756. package/out/zero-server/src/push-processor.js.map +1 -1
  757. package/out/zero-server/src/schema.d.ts +2 -2
  758. package/out/zero-server/src/schema.d.ts.map +1 -1
  759. package/out/zero-server/src/schema.js +3 -2
  760. package/out/zero-server/src/schema.js.map +1 -1
  761. package/out/zero-server/src/zql-database.d.ts +21 -1
  762. package/out/zero-server/src/zql-database.d.ts.map +1 -1
  763. package/out/zero-server/src/zql-database.js +61 -24
  764. package/out/zero-server/src/zql-database.js.map +1 -1
  765. package/out/zero-solid/src/solid-view.d.ts +17 -0
  766. package/out/zero-solid/src/solid-view.d.ts.map +1 -1
  767. package/out/zero-solid/src/solid-view.js +39 -1
  768. package/out/zero-solid/src/solid-view.js.map +1 -1
  769. package/out/zero-solid/src/use-query.js +1 -2
  770. package/out/zero-solid/src/use-query.js.map +1 -1
  771. package/out/zero-solid/src/zero.js +1 -0
  772. package/out/zql/src/builder/builder.d.ts +25 -0
  773. package/out/zql/src/builder/builder.d.ts.map +1 -1
  774. package/out/zql/src/builder/builder.js +69 -19
  775. package/out/zql/src/builder/builder.js.map +1 -1
  776. package/out/zql/src/builder/correlated-predicate-pushdown.d.ts +43 -0
  777. package/out/zql/src/builder/correlated-predicate-pushdown.d.ts.map +1 -0
  778. package/out/zql/src/builder/correlated-predicate-pushdown.js +161 -0
  779. package/out/zql/src/builder/correlated-predicate-pushdown.js.map +1 -0
  780. package/out/zql/src/builder/debug-delegate.d.ts +6 -1
  781. package/out/zql/src/builder/debug-delegate.d.ts.map +1 -1
  782. package/out/zql/src/builder/debug-delegate.js +14 -2
  783. package/out/zql/src/builder/debug-delegate.js.map +1 -1
  784. package/out/zql/src/ivm/array-view.d.ts +29 -0
  785. package/out/zql/src/ivm/array-view.d.ts.map +1 -1
  786. package/out/zql/src/ivm/array-view.js +74 -16
  787. package/out/zql/src/ivm/array-view.js.map +1 -1
  788. package/out/zql/src/ivm/cap.d.ts +2 -1
  789. package/out/zql/src/ivm/cap.d.ts.map +1 -1
  790. package/out/zql/src/ivm/cap.js +14 -4
  791. package/out/zql/src/ivm/cap.js.map +1 -1
  792. package/out/zql/src/ivm/data.d.ts.map +1 -1
  793. package/out/zql/src/ivm/data.js +8 -3
  794. package/out/zql/src/ivm/data.js.map +1 -1
  795. package/out/zql/src/ivm/deferred-input.d.ts.map +1 -1
  796. package/out/zql/src/ivm/deferred-input.js +3 -2
  797. package/out/zql/src/ivm/deferred-input.js.map +1 -1
  798. package/out/zql/src/ivm/exists.d.ts +3 -1
  799. package/out/zql/src/ivm/exists.d.ts.map +1 -1
  800. package/out/zql/src/ivm/exists.js +4 -1
  801. package/out/zql/src/ivm/exists.js.map +1 -1
  802. package/out/zql/src/ivm/fan-in.d.ts +6 -2
  803. package/out/zql/src/ivm/fan-in.d.ts.map +1 -1
  804. package/out/zql/src/ivm/fan-in.js +13 -5
  805. package/out/zql/src/ivm/fan-in.js.map +1 -1
  806. package/out/zql/src/ivm/fan-out.d.ts +5 -2
  807. package/out/zql/src/ivm/fan-out.d.ts.map +1 -1
  808. package/out/zql/src/ivm/fan-out.js +4 -0
  809. package/out/zql/src/ivm/fan-out.js.map +1 -1
  810. package/out/zql/src/ivm/filter-operators.d.ts +8 -6
  811. package/out/zql/src/ivm/filter-operators.d.ts.map +1 -1
  812. package/out/zql/src/ivm/filter-operators.js +19 -8
  813. package/out/zql/src/ivm/filter-operators.js.map +1 -1
  814. package/out/zql/src/ivm/filter.d.ts +5 -2
  815. package/out/zql/src/ivm/filter.d.ts.map +1 -1
  816. package/out/zql/src/ivm/filter.js +10 -4
  817. package/out/zql/src/ivm/filter.js.map +1 -1
  818. package/out/zql/src/ivm/flipped-join.d.ts +9 -4
  819. package/out/zql/src/ivm/flipped-join.d.ts.map +1 -1
  820. package/out/zql/src/ivm/flipped-join.js +97 -46
  821. package/out/zql/src/ivm/flipped-join.js.map +1 -1
  822. package/out/zql/src/ivm/join-index-tap.d.ts +33 -0
  823. package/out/zql/src/ivm/join-index-tap.d.ts.map +1 -0
  824. package/out/zql/src/ivm/join-index-tap.js +70 -0
  825. package/out/zql/src/ivm/join-index-tap.js.map +1 -0
  826. package/out/zql/src/ivm/join-index.d.ts +35 -0
  827. package/out/zql/src/ivm/join-index.d.ts.map +1 -0
  828. package/out/zql/src/ivm/join-index.js +141 -0
  829. package/out/zql/src/ivm/join-index.js.map +1 -0
  830. package/out/zql/src/ivm/join-utils.d.ts +6 -0
  831. package/out/zql/src/ivm/join-utils.d.ts.map +1 -1
  832. package/out/zql/src/ivm/join-utils.js +22 -1
  833. package/out/zql/src/ivm/join-utils.js.map +1 -1
  834. package/out/zql/src/ivm/join.d.ts +19 -1
  835. package/out/zql/src/ivm/join.d.ts.map +1 -1
  836. package/out/zql/src/ivm/join.js +107 -15
  837. package/out/zql/src/ivm/join.js.map +1 -1
  838. package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts +1 -1
  839. package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts.map +1 -1
  840. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +6 -4
  841. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
  842. package/out/zql/src/ivm/memory-source.d.ts +29 -4
  843. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  844. package/out/zql/src/ivm/memory-source.js +70 -34
  845. package/out/zql/src/ivm/memory-source.js.map +1 -1
  846. package/out/zql/src/ivm/memory-storage.d.ts +1 -0
  847. package/out/zql/src/ivm/memory-storage.d.ts.map +1 -1
  848. package/out/zql/src/ivm/memory-storage.js +1 -0
  849. package/out/zql/src/ivm/memory-storage.js.map +1 -1
  850. package/out/zql/src/ivm/operator.d.ts +45 -10
  851. package/out/zql/src/ivm/operator.d.ts.map +1 -1
  852. package/out/zql/src/ivm/operator.js +9 -4
  853. package/out/zql/src/ivm/operator.js.map +1 -1
  854. package/out/zql/src/ivm/push-accumulated.d.ts +6 -1
  855. package/out/zql/src/ivm/push-accumulated.d.ts.map +1 -1
  856. package/out/zql/src/ivm/push-accumulated.js +47 -2
  857. package/out/zql/src/ivm/push-accumulated.js.map +1 -1
  858. package/out/zql/src/ivm/skip.d.ts +2 -1
  859. package/out/zql/src/ivm/skip.d.ts.map +1 -1
  860. package/out/zql/src/ivm/skip.js +3 -0
  861. package/out/zql/src/ivm/skip.js.map +1 -1
  862. package/out/zql/src/ivm/take-gate.d.ts +57 -0
  863. package/out/zql/src/ivm/take-gate.d.ts.map +1 -0
  864. package/out/zql/src/ivm/take-gate.js +106 -0
  865. package/out/zql/src/ivm/take-gate.js.map +1 -0
  866. package/out/zql/src/ivm/take.d.ts +8 -2
  867. package/out/zql/src/ivm/take.d.ts.map +1 -1
  868. package/out/zql/src/ivm/take.js +139 -103
  869. package/out/zql/src/ivm/take.js.map +1 -1
  870. package/out/zql/src/ivm/union-fan-in.d.ts +3 -0
  871. package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
  872. package/out/zql/src/ivm/union-fan-in.js +63 -10
  873. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  874. package/out/zql/src/ivm/union-fan-out.d.ts +2 -1
  875. package/out/zql/src/ivm/union-fan-out.d.ts.map +1 -1
  876. package/out/zql/src/ivm/union-fan-out.js +5 -0
  877. package/out/zql/src/ivm/union-fan-out.js.map +1 -1
  878. package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
  879. package/out/zql/src/ivm/view-apply-change.js +9 -4
  880. package/out/zql/src/ivm/view-apply-change.js.map +1 -1
  881. package/out/zql/src/ivm/view.d.ts +15 -0
  882. package/out/zql/src/ivm/view.d.ts.map +1 -1
  883. package/out/zql/src/mutate/custom.d.ts +53 -1
  884. package/out/zql/src/mutate/custom.d.ts.map +1 -1
  885. package/out/zql/src/mutate/custom.js.map +1 -1
  886. package/out/zql/src/mutate/mutator-registry.d.ts.map +1 -1
  887. package/out/zql/src/mutate/mutator-registry.js +3 -3
  888. package/out/zql/src/mutate/mutator-registry.js.map +1 -1
  889. package/out/zql/src/mutate/mutator.d.ts +2 -2
  890. package/out/zql/src/mutate/mutator.d.ts.map +1 -1
  891. package/out/zql/src/mutate/mutator.js.map +1 -1
  892. package/out/zql/src/planner/planner-builder.d.ts +23 -3
  893. package/out/zql/src/planner/planner-builder.d.ts.map +1 -1
  894. package/out/zql/src/planner/planner-builder.js +34 -17
  895. package/out/zql/src/planner/planner-builder.js.map +1 -1
  896. package/out/zql/src/planner/planner-connection.d.ts +58 -2
  897. package/out/zql/src/planner/planner-connection.d.ts.map +1 -1
  898. package/out/zql/src/planner/planner-connection.js +103 -11
  899. package/out/zql/src/planner/planner-connection.js.map +1 -1
  900. package/out/zql/src/planner/planner-debug.d.ts.map +1 -1
  901. package/out/zql/src/planner/planner-debug.js +3 -8
  902. package/out/zql/src/planner/planner-debug.js.map +1 -1
  903. package/out/zql/src/planner/planner-graph.d.ts +10 -0
  904. package/out/zql/src/planner/planner-graph.d.ts.map +1 -1
  905. package/out/zql/src/planner/planner-graph.js +14 -0
  906. package/out/zql/src/planner/planner-graph.js.map +1 -1
  907. package/out/zql/src/planner/planner-source.d.ts +2 -2
  908. package/out/zql/src/planner/planner-source.d.ts.map +1 -1
  909. package/out/zql/src/planner/planner-source.js +2 -2
  910. package/out/zql/src/planner/planner-source.js.map +1 -1
  911. package/out/zql/src/planner/planner-warnings.d.ts +83 -0
  912. package/out/zql/src/planner/planner-warnings.d.ts.map +1 -0
  913. package/out/zql/src/planner/planner-warnings.js +78 -0
  914. package/out/zql/src/planner/planner-warnings.js.map +1 -0
  915. package/out/zql/src/query/measure-push-operator.d.ts +9 -2
  916. package/out/zql/src/query/measure-push-operator.d.ts.map +1 -1
  917. package/out/zql/src/query/measure-push-operator.js +52 -5
  918. package/out/zql/src/query/measure-push-operator.js.map +1 -1
  919. package/out/zql/src/query/query-delegate-base.d.ts +4 -2
  920. package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
  921. package/out/zql/src/query/query-delegate-base.js +66 -33
  922. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  923. package/out/zql/src/query/query-delegate.d.ts +33 -6
  924. package/out/zql/src/query/query-delegate.d.ts.map +1 -1
  925. package/out/zql/src/query/query-impl.d.ts +1 -0
  926. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  927. package/out/zql/src/query/query-impl.js +6 -23
  928. package/out/zql/src/query/query-impl.js.map +1 -1
  929. package/out/zql/src/query/query-transitions.d.ts.map +1 -1
  930. package/out/zql/src/query/query-transitions.js +2 -5
  931. package/out/zql/src/query/query-transitions.js.map +1 -1
  932. package/out/zql/src/query/query.d.ts +22 -5
  933. package/out/zql/src/query/query.d.ts.map +1 -1
  934. package/out/zql/src/query/runnable-query-impl.d.ts +1 -0
  935. package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -1
  936. package/out/zql/src/query/runnable-query-impl.js +2 -10
  937. package/out/zql/src/query/runnable-query-impl.js.map +1 -1
  938. package/out/zql/src/query/typed-view.d.ts +1 -1
  939. package/out/zql/src/query/typed-view.d.ts.map +1 -1
  940. package/out/zqlite/src/database-storage.d.ts.map +1 -1
  941. package/out/zqlite/src/database-storage.js +9 -1
  942. package/out/zqlite/src/database-storage.js.map +1 -1
  943. package/out/zqlite/src/db.d.ts +9 -1
  944. package/out/zqlite/src/db.d.ts.map +1 -1
  945. package/out/zqlite/src/db.js +62 -30
  946. package/out/zqlite/src/db.js.map +1 -1
  947. package/out/zqlite/src/index-usage.d.ts +19 -0
  948. package/out/zqlite/src/index-usage.d.ts.map +1 -0
  949. package/out/zqlite/src/index-usage.js +49 -0
  950. package/out/zqlite/src/index-usage.js.map +1 -0
  951. package/out/zqlite/src/pending-delta.d.ts +110 -0
  952. package/out/zqlite/src/pending-delta.d.ts.map +1 -0
  953. package/out/zqlite/src/pending-delta.js +278 -0
  954. package/out/zqlite/src/pending-delta.js.map +1 -0
  955. package/out/zqlite/src/query-builder.d.ts +17 -1
  956. package/out/zqlite/src/query-builder.d.ts.map +1 -1
  957. package/out/zqlite/src/query-builder.js +111 -20
  958. package/out/zqlite/src/query-builder.js.map +1 -1
  959. package/out/zqlite/src/query-delegate.d.ts.map +1 -1
  960. package/out/zqlite/src/query-delegate.js +10 -7
  961. package/out/zqlite/src/query-delegate.js.map +1 -1
  962. package/out/zqlite/src/resolve-scalar-subqueries.d.ts +3 -1
  963. package/out/zqlite/src/resolve-scalar-subqueries.d.ts.map +1 -1
  964. package/out/zqlite/src/resolve-scalar-subqueries.js +1 -0
  965. package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
  966. package/out/zqlite/src/sqlite-cost-model.d.ts.map +1 -1
  967. package/out/zqlite/src/sqlite-cost-model.js +52 -1
  968. package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
  969. package/out/zqlite/src/sqlite-stat-fanout.d.ts.map +1 -1
  970. package/out/zqlite/src/sqlite-stat-fanout.js +5 -31
  971. package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
  972. package/out/zqlite/src/sqlite-stat4-sample.d.ts +37 -0
  973. package/out/zqlite/src/sqlite-stat4-sample.d.ts.map +1 -0
  974. package/out/zqlite/src/sqlite-stat4-sample.js +61 -0
  975. package/out/zqlite/src/sqlite-stat4-sample.js.map +1 -0
  976. package/out/zqlite/src/table-source.d.ts +87 -2
  977. package/out/zqlite/src/table-source.d.ts.map +1 -1
  978. package/out/zqlite/src/table-source.js +276 -42
  979. package/out/zqlite/src/table-source.js.map +1 -1
  980. package/package.json +4 -5
  981. package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts +0 -25
  982. package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts.map +0 -1
  983. package/out/replicache/src/kv/idb-store-with-mem-fallback.js +0 -83
  984. package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +0 -1
  985. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts +0 -29
  986. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts.map +0 -1
  987. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js +0 -154
  988. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js.map +0 -1
@@ -1,6 +1,8 @@
1
1
  import { assert, unreachable } from "../../../../shared/src/asserts.js";
2
2
  import { deepEqual } from "../../../../shared/src/json.js";
3
+ import { getOrInsertComputed } from "../../../../shared/src/map.js";
3
4
  import { must } from "../../../../shared/src/must.js";
5
+ import { assignProperty } from "../../../../shared/src/objects.js";
4
6
  import { skipYields } from "../../../../zql/src/ivm/skip-yields.js";
5
7
  import { throwOutput } from "../../../../zql/src/ivm/operator.js";
6
8
  import { MeasurePushOperator } from "../../../../zql/src/query/measure-push-operator.js";
@@ -14,13 +16,18 @@ import { resolveSimpleScalarSubqueries } from "../../../../zqlite/src/resolve-sc
14
16
  import { randInt } from "../../../../shared/src/rand.js";
15
17
  import { createSQLiteCostModel } from "../../../../zqlite/src/sqlite-cost-model.js";
16
18
  import { reloadPermissionsIfChanged } from "../../auth/load-permissions.js";
19
+ import { LogThrottle } from "../../observability/log-throttle.js";
17
20
  import { getOrCreateCounter, getOrCreateLatencyHistogram } from "../../observability/metrics.js";
18
21
  import "../../types/row-key.js";
19
22
  import { getSubscriptionState } from "../replicator/schema/replication-state.js";
20
23
  import { checkClientSchema } from "./client-schema.js";
24
+ import { planWarningMessage } from "./plan-warnings.js";
25
+ import { queryShape } from "./query-shape.js";
21
26
  import { rowIDSignatureUnit } from "./row-set-signature.js";
22
27
  import { ResetPipelinesSignal } from "./snapshotter.js";
23
28
  //#region ../zero-cache/src/services/view-syncer/pipeline-driver.ts
29
+ /** The most queries a log of an advancement timeout lists. */
30
+ var ADVANCE_TIMEOUT_LOG_MAX_QUERIES = 3;
24
31
  /**
25
32
  * No matter how fast hydration is, advancement is given at least this long to
26
33
  * complete before doing a pipeline reset.
@@ -33,6 +40,8 @@ var MIN_PROJECTED_ADVANCEMENT_SAMPLE_MS = 5;
33
40
  var MIN_PROJECTED_ADVANCEMENT_CHANGES = 16;
34
41
  var PROJECTED_ADVANCEMENT_RESET_MULTIPLIER = 1.5;
35
42
  var LATE_ADVANCEMENT_FINISH_PROGRESS = .8;
43
+ var planWarningLogThrottle = new LogThrottle({ windowMs: 60 * 6e4 });
44
+ var slowAdvanceLogThrottle = new LogThrottle({ windowMs: 5 * 6e4 });
36
45
  function randomID() {
37
46
  return randInt(1, Number.MAX_SAFE_INTEGER).toString(36);
38
47
  }
@@ -46,9 +55,11 @@ function advancementResetTimeLimitMs(totalHydrationTimeMs) {
46
55
  function minProjectedAdvancementSampleChanges(numChanges) {
47
56
  return Math.max(MIN_PROJECTED_ADVANCEMENT_SAMPLE_CHANGES, Math.min(MAX_PROJECTED_ADVANCEMENT_SAMPLE_CHANGES, Math.ceil(numChanges * PROJECTED_ADVANCEMENT_SAMPLE_FRACTION)));
48
57
  }
49
- function shouldResetProjectedAdvancement(elapsedMs, projectedTotalTimeMs, processedChanges, numChanges, totalHydrationTimeMs) {
50
- if (projectedTotalTimeMs === void 0 || numChanges < MIN_PROJECTED_ADVANCEMENT_CHANGES || processedChanges < minProjectedAdvancementSampleChanges(numChanges) || elapsedMs < MIN_PROJECTED_ADVANCEMENT_SAMPLE_MS) return false;
51
- return projectedTotalTimeMs > advancementResetTimeLimitMs(totalHydrationTimeMs) * PROJECTED_ADVANCEMENT_RESET_MULTIPLIER;
58
+ function canProjectAdvancement(elapsedMs, projectedTotalTimeMs, processedChanges, numChanges) {
59
+ return projectedTotalTimeMs !== void 0 && numChanges >= MIN_PROJECTED_ADVANCEMENT_CHANGES && processedChanges >= minProjectedAdvancementSampleChanges(numChanges) && elapsedMs >= MIN_PROJECTED_ADVANCEMENT_SAMPLE_MS;
60
+ }
61
+ function shouldResetProjectedAdvancement(elapsedMs, projectedTotalTimeMs, totalHydrationTimeMs) {
62
+ return projectedTotalTimeMs - elapsedMs > advancementResetTimeLimitMs(totalHydrationTimeMs) * PROJECTED_ADVANCEMENT_RESET_MULTIPLIER;
52
63
  }
53
64
  function shouldFinishLateAdvancement(processedChanges, numChanges) {
54
65
  return numChanges > 0 && processedChanges / numChanges >= LATE_ADVANCEMENT_FINISH_PROGRESS;
@@ -56,6 +67,14 @@ function shouldFinishLateAdvancement(processedChanges, numChanges) {
56
67
  function shouldResetSlowCurrentChange(currentChangeElapsedMs, totalHydrationTimeMs) {
57
68
  return currentChangeElapsedMs > MIN_ADVANCEMENT_TIME_LIMIT_MS && currentChangeElapsedMs > advancementResetTimeLimitMs(totalHydrationTimeMs);
58
69
  }
70
+ function formatAdvancementBreakdown(advanceContext, elapsed) {
71
+ const { diff, pushTimeMs, stage, currentChangeStartMs, currentTable } = advanceContext;
72
+ const totalPushMs = pushTimeMs + (stage === "push" && currentChangeStartMs !== void 0 ? Math.max(0, elapsed - currentChangeStartMs) : 0);
73
+ const stats = diff.stats;
74
+ const diffTimeMs = stats?.totalDiffMs ?? 0;
75
+ const clMs = stats ? ` [changelog: ${stats.changeLogReadMs.toFixed(1)}ms, parse: ${stats.parseMs.toFixed(1)}ms, rows: ${stats.rowReadMs.toFixed(1)}ms]` : "";
76
+ return `stage: ${stage}, diff: ${diffTimeMs.toFixed(1)}ms${clMs}, push: ${totalPushMs.toFixed(1)}ms` + (currentTable ? `, table: ${currentTable}` : "");
77
+ }
59
78
  /**
60
79
  * Manages the state of IVM pipelines for a given ViewSyncer (i.e. client group).
61
80
  */
@@ -67,21 +86,32 @@ var PipelineDriver = class {
67
86
  * query, maintained as RowChanges are yielded from {@link addQuery} and
68
87
  * {@link advance}. ADDs / REMOVEs XOR the row's unit in (XOR is
69
88
  * self-inverse, so one op serves both directions); EDITs are no-ops.
70
- * Hydration implicitly reseeds from `0n` because {@link addQuery} calls
71
- * {@link removeQuery} first, which deletes the entry.
89
+ * Hydration starts the query's entry at `0n` (the empty row set), so every
90
+ * hydrated query has one, even if it has no rows. A hydration that does not
91
+ * finish removes it.
72
92
  */
73
93
  #rowSetSignatures = /* @__PURE__ */ new Map();
94
+ /**
95
+ * IDs of the queries whose {@link #rowSetSignatures} entry changed since the
96
+ * last {@link clearChangedRowSetSignatures}, so that the CVR flush only has
97
+ * to look at those instead of every query.
98
+ */
99
+ #changedRowSetSignatures = /* @__PURE__ */ new Set();
74
100
  #lc;
75
101
  #snapshotter;
76
102
  #storage;
77
103
  #shardID;
78
104
  #logConfig;
79
105
  #config;
106
+ #deferredWrites;
80
107
  #tableSpecs = /* @__PURE__ */ new Map();
81
108
  #allTableNames = /* @__PURE__ */ new Set();
82
109
  #costModels;
110
+ #planWarningThresholds;
83
111
  #yieldThresholdMs;
84
112
  #streamer = null;
113
+ /** The row changes of the push in progress, until #push yields them. */
114
+ #pushedRowChanges = null;
85
115
  #hydrateContext = null;
86
116
  #advanceContext = null;
87
117
  #replicaVersion = null;
@@ -89,17 +119,34 @@ var PipelineDriver = class {
89
119
  #permissions = null;
90
120
  #advanceTime = getOrCreateLatencyHistogram("sync", "ivm.advance-time", "Time to advance all queries for a given client group in response to a single change.");
91
121
  #conflictRowsDeleted = getOrCreateCounter("sync", "ivm.conflict-rows-deleted", "Number of rows deleted because they conflicted with added row");
122
+ #deferredWritesFallbacks = getOrCreateCounter("sync", "ivm.deferred-writes-fallbacks", "Number of advancements written through to the replica snapshot because their changes did not fit in the deferred IVM writes budget, from the start or partway (because of the bytes held, a change that needed more rows than were left, or more rows held than reserved)");
92
123
  #inspectorDelegate;
93
- constructor(lc, logConfig, snapshotter, shardID, storage, clientGroupID, inspectorDelegate, yieldThresholdMs, enablePlanner, config) {
124
+ #queryStats;
125
+ /**
126
+ * Passes the pipelines' metrics on to the inspector, and accounts the time
127
+ * spent pushing to each query to the advancement in progress.
128
+ */
129
+ #metricsDelegate = { addMetric: (metric, value, ...args) => {
130
+ this.#inspectorDelegate.addMetric(metric, value, ...args);
131
+ if (metric === "query-update-server") this.#recordAdvancePush(args[0], value);
132
+ } };
133
+ constructor(lc, logConfig, snapshotter, shardID, storage, clientGroupID, inspectorDelegate, yieldThresholdMs, enablePlanner, config, deferredWrites, queryStats) {
94
134
  this.#lc = lc.withContext("clientGroupID", clientGroupID);
95
135
  this.#snapshotter = snapshotter;
96
136
  this.#storage = storage;
97
137
  this.#shardID = shardID;
98
138
  this.#logConfig = logConfig;
99
139
  this.#config = config;
140
+ this.#deferredWrites = deferredWrites;
100
141
  this.#inspectorDelegate = inspectorDelegate;
101
142
  this.#costModels = enablePlanner ? /* @__PURE__ */ new WeakMap() : void 0;
143
+ const planWarningThresholds = {
144
+ rows: logConfig.planWarningRowThreshold,
145
+ cost: logConfig.planWarningCostThreshold
146
+ };
147
+ this.#planWarningThresholds = planWarningThresholds.rows > 0 || planWarningThresholds.cost > 0 ? planWarningThresholds : void 0;
102
148
  this.#yieldThresholdMs = yieldThresholdMs;
149
+ this.#queryStats = queryStats;
103
150
  }
104
151
  /**
105
152
  * Initializes the PipelineDriver to the current head of the database.
@@ -131,6 +178,7 @@ var PipelineDriver = class {
131
178
  this.#tables.clear();
132
179
  this.#allTableNames.clear();
133
180
  this.#rowSetSignatures.clear();
181
+ this.#changedRowSetSignatures.clear();
134
182
  this.#initAndResetCommon(clientSchema);
135
183
  }
136
184
  #initAndResetCommon(clientSchema) {
@@ -140,11 +188,9 @@ var PipelineDriver = class {
140
188
  checkClientSchema(this.#shardID, clientSchema, this.#tableSpecs, fullTables);
141
189
  this.#allTableNames.clear();
142
190
  for (const table of fullTables.keys()) this.#allTableNames.add(table);
143
- const primaryKeys = this.#primaryKeys ?? /* @__PURE__ */ new Map();
191
+ const primaryKeys = buildRowKeys(clientSchema, this.#tableSpecs, this.#primaryKeys ?? void 0);
144
192
  this.#primaryKeys = primaryKeys;
145
- primaryKeys.clear();
146
- for (const [table, spec] of this.#tableSpecs.entries()) primaryKeys.set(table, spec.tableSpec.primaryKey);
147
- buildPrimaryKeys(clientSchema, primaryKeys);
193
+ this.#streamer ??= new Streamer(primaryKeys, this.#tableSpecs);
148
194
  const { replicaVersion } = getSubscriptionState(db);
149
195
  this.#replicaVersion = replicaVersion;
150
196
  }
@@ -173,10 +219,23 @@ var PipelineDriver = class {
173
219
  }
174
220
  return this.#permissions;
175
221
  }
222
+ /**
223
+ * Advances the snapshot to the head of the database without diffing the
224
+ * change log, in preparation for hydrating queries at head.
225
+ *
226
+ * Throws a {@link ResetPipelinesSignal} if the change log records a
227
+ * schema change since the previous snapshot. The table specs (and any
228
+ * TableSources built from them) were computed at or before that snapshot
229
+ * and are stale with respect to the new head, so the caller must
230
+ * {@link reset()} before hydrating. ({@link advance()} detects this when
231
+ * the diff encounters the RESET op; this path skips the diff and so must
232
+ * check explicitly.)
233
+ */
176
234
  advanceWithoutDiff() {
177
- const { db, version } = this.#snapshotter.advanceWithoutDiff().curr;
178
- for (const table of this.#tables.values()) table.setDB(db.db);
179
- return version;
235
+ const { prev, curr } = this.#snapshotter.advanceWithoutDiff();
236
+ if (curr.schemaChangedSince(prev.version)) throw new ResetPipelinesSignal(`schema changed between ${prev.version} and ${curr.version}`, "schema-change");
237
+ for (const table of this.#tables.values()) table.setDB(curr.db.db);
238
+ return curr.version;
180
239
  }
181
240
  #ensureCostModelExistsIfEnabled(db) {
182
241
  let existing = this.#costModels?.get(db);
@@ -196,7 +255,9 @@ var PipelineDriver = class {
196
255
  this.#pipelines.delete(queryID);
197
256
  this.#destroyPipeline(queryID, pipeline, "destroy");
198
257
  }
258
+ this.#tables.clear();
199
259
  this.#rowSetSignatures.clear();
260
+ this.#changedRowSetSignatures.clear();
200
261
  this.#storage.destroy();
201
262
  this.#snapshotter.destroy();
202
263
  }
@@ -204,18 +265,76 @@ var PipelineDriver = class {
204
265
  queries() {
205
266
  return this.#pipelines;
206
267
  }
268
+ /**
269
+ * Stats from the hydration of the pipeline for `queryID`, or `undefined` if
270
+ * the query has no pipeline.
271
+ */
272
+ hydrationStats(queryID) {
273
+ const pipeline = this.#pipelines.get(queryID);
274
+ return pipeline ? {
275
+ rowCount: pipeline.hydrationRowCount,
276
+ rowsRead: pipeline.hydrationRowsRead,
277
+ planWarnings: pipeline.planWarnings,
278
+ shape: pipeline.shape
279
+ } : void 0;
280
+ }
281
+ /**
282
+ * Logs what the planner warned about the plan it chose for `query`, at
283
+ * most once per query shape per {@link PLAN_WARNING_LOG_WINDOW_MS}.
284
+ */
285
+ #logPlanWarnings(shape, { queryHash, transformationHash, queryName }, warnings) {
286
+ if (!this.#lc.warn) return;
287
+ const suppressed = planWarningLogThrottle.admit(`${queryName ?? ""}:${shape.hash}`);
288
+ if (suppressed === void 0) return;
289
+ const messages = warnings.map(planWarningMessage);
290
+ this.#lc.warn(`Query plan warning${queryName === void 0 ? "" : ` for ${queryName}`}: ` + messages.join(" "), {
291
+ zeroEvent: "query-plan-warning",
292
+ queryHash,
293
+ transformationHash,
294
+ ...queryName !== void 0 && { queryName },
295
+ queryShape: shape.hash,
296
+ warnings,
297
+ ...suppressed > 0 && { suppressedSinceLastLog: suppressed },
298
+ zql: shape.zql
299
+ });
300
+ }
301
+ #totalRowsRead() {
302
+ let total = 0;
303
+ for (const table of this.#tables.values()) total += table.rowsRead;
304
+ return total;
305
+ }
207
306
  totalHydrationTimeMs() {
208
307
  let total = 0;
209
308
  for (const pipeline of this.#pipelines.values()) total += pipeline.hydrationTimeMs;
210
309
  return total;
211
310
  }
212
- #logQueryPipelineLifecycle({ zeroEvent, pipelineRunID, queryHash, transformationHash, queryName, hydrationReason, stopReason, hydrationTimeMs, hydrationRowCount, pipelineLifetimeMs }) {
311
+ /**
312
+ * The rows the sources hold in memory for the advancement in progress.
313
+ * The advancement's reservation from the {@link DeferredWritesBudget}
314
+ * bounds this.
315
+ */
316
+ get pendingRows() {
317
+ let total = 0;
318
+ for (const source of this.#tables.values()) total += source.pendingRows;
319
+ return total;
320
+ }
321
+ /**
322
+ * The estimated bytes of {@link pendingRows}, which are added to the
323
+ * {@link DeferredWritesBudget}'s held bytes as the advancement goes.
324
+ */
325
+ get pendingBytes() {
326
+ let total = 0;
327
+ for (const source of this.#tables.values()) total += source.pendingBytes;
328
+ return total;
329
+ }
330
+ #logQueryPipelineLifecycle({ zeroEvent, pipelineRunID, queryHash, transformationHash, queryName, hydrationReason, stopReason, hydrationTimeMs, hydrationRowCount, hydrationRowsRead, pipelineLifetimeMs }) {
213
331
  let lc = this.#lc.withContext("zeroEvent", zeroEvent).withContext("pipelineRunID", pipelineRunID).withContext("queryHash", queryHash).withContext("transformationHash", transformationHash);
214
332
  if (queryName !== void 0) lc = lc.withContext("queryName", queryName);
215
333
  if (hydrationReason !== void 0) lc = lc.withContext("hydrationReason", hydrationReason);
216
334
  if (stopReason !== void 0) lc = lc.withContext("stopReason", stopReason);
217
335
  if (hydrationTimeMs !== void 0) lc = lc.withContext("hydrationTimeMs", hydrationTimeMs);
218
336
  if (hydrationRowCount !== void 0) lc = lc.withContext("hydrationRowCount", hydrationRowCount);
337
+ if (hydrationRowsRead !== void 0) lc = lc.withContext("hydrationRowsRead", hydrationRowsRead);
219
338
  if (pipelineLifetimeMs !== void 0) lc = lc.withContext("pipelineLifetimeMs", pipelineLifetimeMs);
220
339
  lc.info?.("query pipeline lifecycle");
221
340
  }
@@ -232,11 +351,15 @@ var PipelineDriver = class {
232
351
  this.#lc.warn?.(`Ignoring {scalar: true} on the "${table}" subquery of query ${queryID}: it does not constrain every column of any unique key ${keys.length > 0 ? `[${keys}]` : "(none on this table)"} to a literal with "=", so it is not provably limited to one row. The gate runs as a plain EXISTS.`);
233
352
  }
234
353
  }
354
+ #disableCorrelatedPredicatePushdown() {
355
+ return this.#config?.enableCorrelatedPredicatePushdown === false;
356
+ }
235
357
  #resolveScalarSubqueries(ast) {
236
- const companionRows = [];
237
358
  const companionInputs = [];
238
359
  const executor = (subqueryAST, childField) => {
239
360
  const input = buildPipeline(subqueryAST, {
361
+ enableNotExists: true,
362
+ disableCorrelatedPredicatePushdown: this.#disableCorrelatedPredicatePushdown(),
240
363
  getSource: (name) => this.#getSource(name),
241
364
  createStorage: () => this.#createStorage(),
242
365
  decorateSourceInput: (input) => input,
@@ -244,23 +367,20 @@ var PipelineDriver = class {
244
367
  addEdge() {},
245
368
  decorateFilterInput: (input) => input
246
369
  }, "scalar-subquery");
247
- let node;
248
- for (const n of skipYields(input.fetch({}))) node ??= n;
249
- if (!node) {
250
- companionInputs.push(input);
251
- return;
252
- }
253
- companionRows.push({
254
- table: subqueryAST.table,
255
- row: node.row
256
- });
257
370
  companionInputs.push(input);
258
- return node.row[childField] ?? null;
371
+ return fetchScalarValue(input, childField);
259
372
  };
260
- const { ast: resolved, companions, ignoredScalarHints } = resolveSimpleScalarSubqueries(ast, this.#tableSpecs, executor);
373
+ let resolved;
374
+ let companions;
375
+ let ignoredScalarHints;
376
+ try {
377
+ ({ast: resolved, companions, ignoredScalarHints} = resolveSimpleScalarSubqueries(ast, this.#tableSpecs, executor));
378
+ } catch (e) {
379
+ for (const input of companionInputs) input.destroy();
380
+ throw e;
381
+ }
261
382
  return {
262
383
  ast: resolved,
263
- companionRows,
264
384
  companions,
265
385
  companionInputs,
266
386
  ignoredScalarHints
@@ -288,6 +408,7 @@ var PipelineDriver = class {
288
408
  assert(this.initialized(), "Pipeline driver must be initialized before adding queries");
289
409
  this.removeQuery(queryID, "replace-query");
290
410
  const pipelineRunID = randomID();
411
+ const shape = queryShape(query);
291
412
  this.#logQueryPipelineLifecycle({
292
413
  zeroEvent: "query-pipeline-hydrate-start",
293
414
  pipelineRunID,
@@ -296,49 +417,58 @@ var PipelineDriver = class {
296
417
  queryName,
297
418
  hydrationReason
298
419
  });
299
- const debugDelegate = runtimeDebugFlags.trackRowsVended ? new Debug() : void 0;
420
+ const debugDelegate = runtimeDebugFlags.trackRowsVended ? new Debug(true) : void 0;
300
421
  const costModel = this.#ensureCostModelExistsIfEnabled(this.#snapshotter.current().db.db);
301
422
  assert(this.#advanceContext === null, "Cannot hydrate while advance is in progress");
302
423
  this.#hydrateContext = { timer };
424
+ const rowsReadAtStart = this.#totalRowsRead();
303
425
  let hydrationFinished = false;
304
426
  let hydrationFailed = false;
305
427
  let hydrationRowCount = 0;
428
+ let planWarnings = [];
429
+ const planWarningThresholds = this.#planWarningThresholds;
430
+ let builtInputs = [];
306
431
  try {
307
- const { ast: resolvedQuery, companionRows, companions: companionMeta, companionInputs, ignoredScalarHints } = this.#resolveScalarSubqueries(query);
432
+ this.#rowSetSignatures.set(queryID, 0n);
433
+ this.#changedRowSetSignatures.add(queryID);
434
+ const { ast: resolvedQuery, companions: companionMeta, companionInputs, ignoredScalarHints } = this.#resolveScalarSubqueries(query);
435
+ builtInputs = [...companionInputs];
308
436
  this.#warnIgnoredScalarHints(queryID, ignoredScalarHints);
309
437
  const input = buildPipeline(resolvedQuery, {
310
438
  debug: debugDelegate,
311
439
  enableNotExists: true,
440
+ disableCorrelatedPredicatePushdown: this.#disableCorrelatedPredicatePushdown(),
441
+ enablePlannerAwarePushdown: this.#config?.enablePlannerAwarePushdown !== false,
312
442
  getSource: (name) => this.#getSource(name),
313
443
  createStorage: () => this.#createStorage(),
314
- decorateSourceInput: (input, _queryID) => new MeasurePushOperator(new QueryFailureLoggingOperator(this.#lc, input, queryID, transformationHash, queryName), queryID, this.#inspectorDelegate, "query-update-server"),
444
+ decorateSourceInput: (input, _queryID) => new MeasurePushOperator(new QueryFailureLoggingOperator(this.#lc, input, queryID, transformationHash, queryName), queryID, this.#metricsDelegate, "query-update-server"),
315
445
  decorateInput: (input) => input,
316
446
  addEdge() {},
317
- decorateFilterInput: (input) => input
447
+ decorateFilterInput: (input) => input,
448
+ planWarnings: planWarningThresholds && {
449
+ thresholds: planWarningThresholds,
450
+ report: (warnings) => {
451
+ planWarnings = warnings;
452
+ }
453
+ }
318
454
  }, queryID, costModel);
455
+ builtInputs.push(input);
456
+ if (planWarnings.length > 0) this.#logPlanWarnings(shape, {
457
+ queryHash: queryID,
458
+ transformationHash,
459
+ queryName
460
+ }, planWarnings);
319
461
  const schema = input.getSchema();
320
- input.setOutput({ push: (change) => {
321
- const streamer = this.#streamer;
322
- assert(streamer, "must #startAccumulating() before pushing changes");
323
- streamer.accumulate(queryID, schema, [change]);
324
- return [];
325
- } });
326
- for (const change of hydrateInternal(input, queryID, must(this.#primaryKeys), this.#tableSpecs)) {
327
- if (change !== "yield") hydrationRowCount++;
328
- yield change;
329
- }
330
- for (const { table, row } of companionRows) {
331
- const primaryKey = mustGetPrimaryKey(this.#primaryKeys, table);
332
- hydrationRowCount++;
333
- yield {
334
- type: 0,
335
- queryID,
336
- table,
337
- rowKey: getRowKey(primaryKey, row),
338
- row
339
- };
462
+ input.setOutput({ push: (change) => this.#streamPushed(queryID, schema, change) });
463
+ for (let i = -1; i < companionInputs.length; i++) {
464
+ const pipeline = i < 0 ? input : companionInputs[i];
465
+ for (const change of must(this.#streamer).streamNodes(queryID, i < 0 ? schema : companionStreamSchema(pipeline, companionMeta[i]), 0, pipeline.fetch({}))) {
466
+ if (change !== "yield") hydrationRowCount++;
467
+ yield change;
468
+ }
340
469
  }
341
470
  const hydrationTimeMs = timer.totalElapsed();
471
+ const hydrationRowsRead = this.#totalRowsRead() - rowsReadAtStart;
342
472
  if (runtimeDebugFlags.trackRowCountsVended) {
343
473
  if (hydrationTimeMs > this.#logConfig.slowHydrateThreshold) {
344
474
  let totalRowsConsidered = 0;
@@ -356,7 +486,7 @@ var PipelineDriver = class {
356
486
  for (let i = 0; i < companionMeta.length; i++) {
357
487
  const meta = companionMeta[i];
358
488
  const companionInput = companionInputs[i];
359
- const companionSchema = companionInput.getSchema();
489
+ const companionSchema = companionStreamSchema(companionInput, meta);
360
490
  const { childField, resolvedValue } = meta;
361
491
  companionInput.setOutput({ push: (change) => {
362
492
  let newValue;
@@ -368,13 +498,10 @@ var PipelineDriver = class {
368
498
  case 1:
369
499
  newValue = void 0;
370
500
  break;
371
- case 3: return [];
501
+ case 3: return this.#streamPushed(queryID, companionSchema, change);
372
502
  }
373
503
  if (!scalarValuesEqual(newValue, resolvedValue)) throw new ResetPipelinesSignal(`Scalar subquery value changed for ${meta.ast.table}: ${String(resolvedValue)} -> ${String(newValue)}`, "scalar-subquery");
374
- const streamer = this.#streamer;
375
- assert(streamer, "must #startAccumulating() before pushing changes");
376
- streamer.accumulate(queryID, companionSchema, [change]);
377
- return [];
504
+ return this.#streamPushed(queryID, companionSchema, change);
378
505
  } });
379
506
  liveCompanions.push({
380
507
  input: companionInput,
@@ -387,15 +514,29 @@ var PipelineDriver = class {
387
514
  input,
388
515
  hydrationTimeMs,
389
516
  hydrationRowCount,
517
+ hydrationRowsRead,
518
+ planWarnings,
390
519
  hydrationReason,
391
520
  pipelineRunID,
392
521
  pipelineReadyAtMs,
393
522
  transformedAst: resolvedQuery,
523
+ originalAst: query,
524
+ shape,
394
525
  transformationHash,
395
526
  ...queryName !== void 0 && { queryName },
396
527
  companions: liveCompanions
397
528
  });
398
529
  hydrationFinished = true;
530
+ this.#queryStats?.recordHydration({
531
+ queryName,
532
+ shape
533
+ }, {
534
+ outcome: "finished",
535
+ timeMs: hydrationTimeMs,
536
+ rowCount: hydrationRowCount,
537
+ rowsRead: hydrationRowsRead,
538
+ planWarnings
539
+ });
399
540
  this.#logQueryPipelineLifecycle({
400
541
  zeroEvent: "query-pipeline-hydrate-finish",
401
542
  pipelineRunID,
@@ -404,10 +545,18 @@ var PipelineDriver = class {
404
545
  queryName,
405
546
  hydrationReason,
406
547
  hydrationTimeMs,
407
- hydrationRowCount
548
+ hydrationRowCount,
549
+ hydrationRowsRead
408
550
  });
409
551
  } catch (e) {
410
552
  hydrationFailed = true;
553
+ this.#queryStats?.recordHydration({
554
+ queryName,
555
+ shape
556
+ }, {
557
+ outcome: "failed",
558
+ timeMs: timer.totalElapsed()
559
+ });
411
560
  this.#logQueryPipelineLifecycle({
412
561
  zeroEvent: "query-pipeline-hydrate-failed",
413
562
  pipelineRunID,
@@ -425,16 +574,30 @@ var PipelineDriver = class {
425
574
  }, "query hydration failed", e);
426
575
  throw e;
427
576
  } finally {
428
- if (!hydrationFinished && !hydrationFailed) this.#logQueryPipelineLifecycle({
429
- zeroEvent: "query-pipeline-hydrate-aborted",
430
- pipelineRunID,
431
- queryHash: queryID,
432
- transformationHash,
433
- queryName,
434
- hydrationReason,
435
- hydrationTimeMs: timer.totalElapsed(),
436
- hydrationRowCount
437
- });
577
+ if (!hydrationFinished && !hydrationFailed) {
578
+ this.#queryStats?.recordHydration({
579
+ queryName,
580
+ shape
581
+ }, {
582
+ outcome: "aborted",
583
+ timeMs: timer.totalElapsed()
584
+ });
585
+ this.#logQueryPipelineLifecycle({
586
+ zeroEvent: "query-pipeline-hydrate-aborted",
587
+ pipelineRunID,
588
+ queryHash: queryID,
589
+ transformationHash,
590
+ queryName,
591
+ hydrationReason,
592
+ hydrationTimeMs: timer.totalElapsed(),
593
+ hydrationRowCount
594
+ });
595
+ }
596
+ if (!hydrationFinished) {
597
+ for (const input of builtInputs) input.destroy();
598
+ this.#rowSetSignatures.delete(queryID);
599
+ this.#changedRowSetSignatures.delete(queryID);
600
+ }
438
601
  this.#hydrateContext = null;
439
602
  }
440
603
  }
@@ -449,6 +612,7 @@ var PipelineDriver = class {
449
612
  this.#destroyPipeline(queryID, pipeline, stopReason);
450
613
  }
451
614
  this.#rowSetSignatures.delete(queryID);
615
+ this.#changedRowSetSignatures.delete(queryID);
452
616
  }
453
617
  #destroyPipeline(queryID, pipeline, stopReason) {
454
618
  this.#logQueryPipelineLifecycle({
@@ -475,6 +639,20 @@ var PipelineDriver = class {
475
639
  return this.#rowSetSignatures.get(queryID);
476
640
  }
477
641
  /**
642
+ * IDs of the queries whose {@link rowSetSignature} changed (by an ADD or
643
+ * REMOVE from {@link addQuery} or {@link advance}) since the last call to
644
+ * {@link clearChangedRowSetSignatures}.
645
+ */
646
+ changedRowSetSignatures() {
647
+ return this.#changedRowSetSignatures;
648
+ }
649
+ /**
650
+ * Called once the {@link changedRowSetSignatures} have been persisted.
651
+ */
652
+ clearChangedRowSetSignatures() {
653
+ this.#changedRowSetSignatures.clear();
654
+ }
655
+ /**
478
656
  * Wraps an iterable of RowChanges, XORing each row's unit hash into the
479
657
  * query's signature (ADDs and REMOVEs share the same op; EDITs are no-ops).
480
658
  * Used to intercept the yield streams from {@link addQuery} and
@@ -490,6 +668,7 @@ var PipelineDriver = class {
490
668
  rowKey: change.rowKey
491
669
  });
492
670
  this.#rowSetSignatures.set(change.queryID, cur ^ unit);
671
+ this.#changedRowSetSignatures.add(change.queryID);
493
672
  }
494
673
  yield change;
495
674
  }
@@ -516,38 +695,74 @@ var PipelineDriver = class {
516
695
  */
517
696
  advance(timer) {
518
697
  assert(this.initialized(), "Pipeline driver must be initialized before advancing");
519
- const diff = this.#snapshotter.advance(this.#tableSpecs, this.#allTableNames);
698
+ const diff = this.#snapshotter.advance(this.#tableSpecs, this.#allTableNames, this.#tables, "divergent");
520
699
  const { prev, curr, changes } = diff;
521
700
  this.#lc.debug?.(`advance ${prev.version} => ${curr.version}: ${changes} changes`);
701
+ const progress = { changesProcessed: 0 };
522
702
  return {
523
703
  version: curr.version,
524
704
  numChanges: changes,
525
- changes: this.#trackRowSetSignatures(this.#advance(diff, timer, changes))
705
+ changes: this.#trackRowSetSignatures(this.#advance(diff, timer, changes, progress)),
706
+ progress: () => ({
707
+ changesScanned: diff.changesScanned,
708
+ changesProcessed: progress.changesProcessed,
709
+ changesSkipped: diff.changesSkipped
710
+ })
526
711
  };
527
712
  }
528
- *#advance(diff, timer, numChanges) {
713
+ *#advance(diff, timer, numChanges, progress) {
529
714
  assert(this.#hydrateContext === null, "Cannot advance while hydration is in progress");
530
715
  const totalHydrationTimeMs = this.totalHydrationTimeMs();
531
- this.#advanceContext = {
716
+ const advanceContext = {
532
717
  timer,
718
+ progress,
719
+ diff,
720
+ completedChanges: 0,
533
721
  totalHydrationTimeMs,
534
722
  numChanges,
723
+ reservedRows: void 0,
724
+ heldBytes: 0,
535
725
  currentChangeStartMs: void 0,
536
- pos: 0
726
+ pos: 0,
727
+ currentTable: void 0,
728
+ queryStats: /* @__PURE__ */ new Map(),
729
+ pushTimeMs: 0,
730
+ stage: "diff"
537
731
  };
538
- this.#lc.debug?.(`starting pipeline advancement of ${numChanges} changes with an advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`);
732
+ this.#advanceContext = advanceContext;
733
+ let timedOut = false;
539
734
  try {
540
- for (const { table, prevValues, nextValue } of diff) {
735
+ advanceContext.reservedRows = this.#reserveDeferredWrites(numChanges);
736
+ const deferWrites = advanceContext.reservedRows !== void 0;
737
+ if (deferWrites) diff.setPrevWrites("none");
738
+ for (const table of this.#tables.values()) table.setDeferWrites(deferWrites);
739
+ this.#lc.debug?.(`starting pipeline advancement of ${numChanges} changes with an advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms (${deferWrites ? "deferred" : "write-through"}).`);
740
+ for (const { table, prevValues: probedPrevValues, nextValue, rowKey } of diff) {
741
+ advanceContext.stage = "between";
742
+ advanceContext.completedChanges = diff.changesScanned - 1;
541
743
  if (this.#shouldAdvanceYieldMaybeAbortAdvance()) yield "yield";
542
744
  const start = timer.totalElapsed();
543
- const advanceContext = must(this.#advanceContext);
544
745
  advanceContext.currentChangeStartMs = start;
545
- let type;
746
+ advanceContext.currentTable = table;
747
+ advanceContext.stage = "push";
748
+ let holds = "fits";
749
+ let pushCompleted = false;
546
750
  try {
547
751
  try {
548
752
  const tableSource = this.#tables.get(table);
549
- if (!tableSource) continue;
753
+ if (!tableSource) {
754
+ pushCompleted = true;
755
+ continue;
756
+ }
550
757
  const primaryKey = mustGetPrimaryKey(this.#primaryKeys, table);
758
+ const isUnobservableAdd = probedPrevValues.length === 0 && nextValue !== null && !tableSource.mayAcceptRow(nextValue);
759
+ const isUnobservableEdit = probedPrevValues.length === 1 && nextValue !== null && !tableSource.mayAcceptRow(nextValue) && !tableSource.mayAcceptRow(probedPrevValues[0]) && deepEqual(getRowKey(primaryKey, probedPrevValues[0]), rowKey);
760
+ if (isUnobservableAdd || isUnobservableEdit) {
761
+ pushCompleted = true;
762
+ continue;
763
+ }
764
+ if (nextValue !== null && !this.#reserveSecondRow(advanceContext, rowKey, primaryKey)) holds = "rows";
765
+ const prevValues = tableSource.reconcilePendingConflicts(probedPrevValues, nextValue, rowKey, this.#tableSpecs.get(table)?.tableSpec.uniqueKeys ?? []);
551
766
  let editOldRow = void 0;
552
767
  for (const prevValue of prevValues) if (nextValue && deepEqual(getRowKey(primaryKey, prevValue), getRowKey(primaryKey, nextValue))) editOldRow = prevValue;
553
768
  else {
@@ -556,38 +771,232 @@ var PipelineDriver = class {
556
771
  }
557
772
  if (nextValue) if (editOldRow) yield* this.#push(tableSource, makeSourceChangeEdit(nextValue, editOldRow));
558
773
  else yield* this.#push(tableSource, makeSourceChangeAdd(nextValue));
774
+ pushCompleted = true;
559
775
  } finally {
560
776
  advanceContext.pos++;
777
+ if (pushCompleted) {
778
+ progress.changesProcessed++;
779
+ advanceContext.completedChanges = diff.changesScanned;
780
+ }
561
781
  }
562
782
  this.#shouldAdvanceYieldMaybeAbortAdvance(false);
783
+ if (holds === "fits") holds = this.#holdPendingRows(advanceContext);
563
784
  } finally {
785
+ advanceContext.pushTimeMs += timer.totalElapsed() - start;
786
+ advanceContext.stage = "diff";
564
787
  advanceContext.currentChangeStartMs = void 0;
565
788
  }
566
789
  const elapsed = timer.totalElapsed() - start;
567
- this.#advanceTime.recordMs(elapsed, {
568
- table,
569
- type
570
- });
790
+ this.#advanceTime.recordMs(elapsed, { table });
791
+ if (holds !== "fits") yield* this.#writeThrough(advanceContext, diff, holds);
571
792
  }
793
+ advanceContext.completedChanges = diff.changesScanned;
572
794
  const { curr } = diff;
573
795
  for (const table of this.#tables.values()) table.setDB(curr.db.db);
574
796
  this.#ensureCostModelExistsIfEnabled(curr.db.db);
575
797
  this.#lc.debug?.(`Advanced to ${curr.version}`);
798
+ this.#logSlowAdvances(advanceContext);
799
+ } catch (e) {
800
+ if (e instanceof ResetPipelinesSignal && e.reason === "advancement-timeout") {
801
+ timedOut = true;
802
+ this.#logAdvanceTimeout(advanceContext, e);
803
+ }
804
+ throw e;
576
805
  } finally {
806
+ if (advanceContext.reservedRows !== void 0) for (const table of this.#tables.values()) table.discardPendingChanges();
807
+ this.#releaseDeferredWrites(advanceContext);
577
808
  this.#advanceContext = null;
809
+ this.#recordAdvanceStats(advanceContext, timedOut);
578
810
  }
579
811
  }
812
+ /** Accounts the time each query took in an advancement to its shape. */
813
+ #recordAdvanceStats({ queryStats }, timedOut) {
814
+ if (this.#queryStats === void 0) return;
815
+ for (const [queryID, { timeMs, changes }] of queryStats) {
816
+ const pipeline = this.#pipelines.get(queryID);
817
+ if (pipeline !== void 0) this.#queryStats.recordAdvance(pipeline, {
818
+ timeMs,
819
+ changes,
820
+ timedOut
821
+ });
822
+ }
823
+ }
824
+ /**
825
+ * Decides how the sources apply an advancement's changes: in memory if
826
+ * they fit in the worker's {@link DeferredWritesBudget}, and otherwise
827
+ * written through to the `prev` snapshot. Returns the number of rows
828
+ * reserved if they are held in memory.
829
+ */
830
+ #reserveDeferredWrites(numChanges) {
831
+ const budget = this.#deferredWrites;
832
+ if (!budget) return;
833
+ if (budget.tryReserve(numChanges)) return numChanges;
834
+ this.#deferredWritesFallbacks.add(1, { stage: "start" });
835
+ this.#lc.debug?.(`writing through ${numChanges} changes: ${budget.reservedRows} rows of the deferred writes budget are reserved`);
836
+ }
837
+ /**
838
+ * If the change log identifies the rows of a table by a key other than its
839
+ * primary key here, an entry that sets a row can change its primary key,
840
+ * which is two rows to a source: the old and the new. (An entry that removes
841
+ * a row removes the one row its key identifies.) Reserves the second row for
842
+ * such an entry, if the advancement holds its changes in memory, and
843
+ * returns whether it fit.
844
+ */
845
+ #reserveSecondRow(advanceContext, rowKey, primaryKey) {
846
+ if (advanceContext.reservedRows === void 0 || isKeyedBy(rowKey, primaryKey)) return true;
847
+ if (!must(this.#deferredWrites).tryReserveMore(1)) return false;
848
+ advanceContext.reservedRows++;
849
+ return true;
850
+ }
851
+ /**
852
+ * Writes the changes that an advancement holds in memory through to the
853
+ * `prev` snapshot, and the rest of its changes after them, when they no
854
+ * longer fit (see {@link HeldRows}). The advancement then continues as if
855
+ * it had written through from the start.
856
+ */
857
+ *#writeThrough(advanceContext, diff, reason) {
858
+ const budget = must(this.#deferredWrites);
859
+ this.#deferredWritesFallbacks.add(1, {
860
+ stage: "partway",
861
+ reason
862
+ });
863
+ this.#lc.debug?.(`writing through (${reason}) at ${advanceContext.pos} of ${advanceContext.numChanges} changes, holding ${advanceContext.heldBytes} of the ${budget.heldBytes} estimated bytes held on this worker (budget: ${budget.maxBytes})`);
864
+ diff.setPrevWrites("divergent");
865
+ for (const source of this.#tables.values()) yield* source.writePendingChanges();
866
+ this.#releaseDeferredWrites(advanceContext);
867
+ }
868
+ #releaseDeferredWrites(advanceContext) {
869
+ const { reservedRows, heldBytes } = advanceContext;
870
+ if (reservedRows !== void 0) {
871
+ must(this.#deferredWrites).release(reservedRows, heldBytes);
872
+ advanceContext.reservedRows = void 0;
873
+ advanceContext.heldBytes = 0;
874
+ }
875
+ }
876
+ #recordAdvancePush(queryID, timeMs) {
877
+ const advance = this.#advanceContext;
878
+ if (advance === null) return;
879
+ const stats = getOrInsertComputed(advance.queryStats, queryID, () => ({
880
+ timeMs: 0,
881
+ changes: 0,
882
+ lastPos: -1,
883
+ timeMsByTable: /* @__PURE__ */ new Map()
884
+ }));
885
+ stats.timeMs += timeMs;
886
+ if (stats.lastPos !== advance.pos) {
887
+ stats.lastPos = advance.pos;
888
+ stats.changes++;
889
+ }
890
+ const table = advance.currentTable;
891
+ if (table !== void 0) stats.timeMsByTable.set(table, (stats.timeMsByTable.get(table) ?? 0) + timeMs);
892
+ }
893
+ /**
894
+ * The identity of the query of the pipeline for `queryID` and its
895
+ * {@link queryShape}, for logging.
896
+ */
897
+ #queryForLog(queryID) {
898
+ const pipeline = this.#pipelines.get(queryID);
899
+ if (pipeline === void 0) return;
900
+ const { transformationHash, queryName, shape } = pipeline;
901
+ return {
902
+ queryName,
903
+ shape,
904
+ fields: {
905
+ queryHash: queryID,
906
+ transformationHash,
907
+ ...queryName !== void 0 && { queryName },
908
+ queryShape: shape.hash
909
+ }
910
+ };
911
+ }
912
+ /** Compute once for an admitted log, without clocks or allocations per change. */
913
+ #advancementLogFields({ timer, diff, progress, completedChanges, queryStats, totalHydrationTimeMs }) {
914
+ const advancementTimeMs = timer.totalElapsed();
915
+ let queryPushTimeMs = 0;
916
+ for (const stats of queryStats.values()) queryPushTimeMs += stats.timeMs;
917
+ return {
918
+ advancementTimeMs,
919
+ queryPushTimeMs,
920
+ outsideQueryPushTimeMs: Math.max(0, advancementTimeMs - queryPushTimeMs),
921
+ totalHydrationTimeMs,
922
+ changesScanned: diff.changesScanned,
923
+ changesCompleted: completedChanges,
924
+ changesProcessed: progress.changesProcessed,
925
+ changesSkipped: diff.changesSkipped
926
+ };
927
+ }
928
+ /**
929
+ * Logs each query whose pushes took longer than the slow advance
930
+ * threshold, at most once per query shape per
931
+ * {@link SLOW_ADVANCE_LOG_WINDOW_MS}.
932
+ */
933
+ #logSlowAdvances(context) {
934
+ if (!this.#lc.warn) return;
935
+ const { queryStats, numChanges } = context;
936
+ let advancementFields;
937
+ for (const [queryID, stats] of queryStats) {
938
+ if (stats.timeMs <= this.#logConfig.slowAdvanceThreshold) continue;
939
+ const query = this.#queryForLog(queryID);
940
+ if (query === void 0) continue;
941
+ const suppressed = slowAdvanceLogThrottle.admit(`${query.queryName ?? ""}:${query.shape.hash}`);
942
+ if (suppressed === void 0) continue;
943
+ this.#lc.warn(`Slow query advancement${query.queryName === void 0 ? "" : ` for ${query.queryName}`}: ${Math.round(stats.timeMs)} ms for ${stats.changes} of ${numChanges} changes`, {
944
+ zeroEvent: "query-slow-advance",
945
+ ...query.fields,
946
+ advanceTimeMs: stats.timeMs,
947
+ changes: stats.changes,
948
+ advancementChanges: numChanges,
949
+ ...advancementFields ??= this.#advancementLogFields(context),
950
+ timeMsByTable: Object.fromEntries(stats.timeMsByTable),
951
+ ...suppressed > 0 && { suppressedSinceLastLog: suppressed },
952
+ zql: query.shape.zql
953
+ });
954
+ }
955
+ }
956
+ /**
957
+ * Logs the queries that took the most time in an advancement that timed
958
+ * out, since the reset that follows would otherwise not say what was slow.
959
+ * Throttled per query shape of the slowest query, with a shared fallback
960
+ * when the timeout happens before any query push timings are recorded.
961
+ */
962
+ #logAdvanceTimeout(context, reset) {
963
+ if (!this.#lc.warn) return;
964
+ const { queryStats, numChanges } = context;
965
+ const slowest = [...queryStats].toSorted(([, a], [, b]) => b.timeMs - a.timeMs).slice(0, ADVANCE_TIMEOUT_LOG_MAX_QUERIES).flatMap(([queryID, stats]) => {
966
+ const query = this.#queryForLog(queryID);
967
+ return query ? [{
968
+ query,
969
+ stats
970
+ }] : [];
971
+ });
972
+ const leadingQuery = slowest[0]?.query;
973
+ const suppressed = slowAdvanceLogThrottle.admit(leadingQuery ? `timeout:${leadingQuery.queryName ?? ""}:${leadingQuery.shape.hash}` : "timeout:outside-query-push");
974
+ if (suppressed === void 0) return;
975
+ const summary = slowest.map(({ query, stats }) => `${query.queryName ?? query.fields.queryHash} (${Math.round(stats.timeMs)} ms)`).join(", ");
976
+ this.#lc.warn(`Advancement of ${numChanges} changes timed out. ` + (summary ? `The queries that took the most time: ${summary}` : "No query push timings were recorded."), {
977
+ zeroEvent: "query-advance-timeout",
978
+ reason: reset.message,
979
+ advancementChanges: numChanges,
980
+ ...this.#advancementLogFields(context),
981
+ queries: slowest.map(({ query, stats }) => ({
982
+ ...query.fields,
983
+ advanceTimeMs: stats.timeMs,
984
+ changes: stats.changes,
985
+ zql: query.shape.zql
986
+ })),
987
+ ...suppressed > 0 && { suppressedSinceLastLog: suppressed }
988
+ });
989
+ }
580
990
  /** Implements `BuilderDelegate.getSource()` */
581
991
  #getSource(tableName) {
582
- let source = this.#tables.get(tableName);
583
- if (source) return source;
584
- const tableSpec = mustGetTableSpec(this.#tableSpecs, tableName);
585
- const primaryKey = mustGetPrimaryKey(this.#primaryKeys, tableName);
586
- const { db } = this.#snapshotter.current();
587
- source = new TableSource(this.#lc, this.#logConfig, db.db, tableName, tableSpec.zqlSpec, primaryKey, () => this.#shouldYield());
588
- this.#tables.set(tableName, source);
589
- this.#lc.debug?.(`created TableSource for ${tableName}`);
590
- return source;
992
+ return getOrInsertComputed(this.#tables, tableName, (tableName) => {
993
+ const tableSpec = mustGetTableSpec(this.#tableSpecs, tableName);
994
+ const primaryKey = mustGetPrimaryKey(this.#primaryKeys, tableName);
995
+ const { db } = this.#snapshotter.current();
996
+ const source = new TableSource(this.#lc, this.#logConfig, db.db, tableName, tableSpec.zqlSpec, primaryKey, () => this.#shouldYield(), { skipUnobservableChanges: true });
997
+ this.#lc.debug?.(`created TableSource for ${tableName}`);
998
+ return source;
999
+ });
591
1000
  }
592
1001
  #shouldYield() {
593
1002
  if (this.#hydrateContext) return this.#hydrateContext.timer.elapsedLap() > this.#yieldThresholdMs();
@@ -601,120 +1010,132 @@ var PipelineDriver = class {
601
1010
  * checks; a single pathological push always resets.
602
1011
  */
603
1012
  #shouldAdvanceYieldMaybeAbortAdvance(checkYield = true) {
604
- const { currentChangeStartMs, pos, numChanges, timer: advanceTimer, totalHydrationTimeMs } = must(this.#advanceContext);
1013
+ const { currentChangeStartMs, completedChanges, numChanges, timer: advanceTimer, totalHydrationTimeMs } = must(this.#advanceContext);
605
1014
  const elapsed = advanceTimer.totalElapsed();
606
1015
  const currentChangeElapsedMs = currentChangeStartMs === void 0 ? void 0 : elapsed - currentChangeStartMs;
607
- if (currentChangeElapsedMs !== void 0 && shouldResetSlowCurrentChange(currentChangeElapsedMs, totalHydrationTimeMs)) this.#throwSlowCurrentChangeReset(pos, numChanges, elapsed, currentChangeElapsedMs, totalHydrationTimeMs);
608
- const projectedTotalTimeMs = projectedAdvancementTimeMs(elapsed, pos, numChanges);
609
- const shouldFinish = shouldFinishLateAdvancement(pos, numChanges);
610
- if (!shouldFinish && shouldResetProjectedAdvancement(elapsed, projectedTotalTimeMs, pos, numChanges, totalHydrationTimeMs)) this.#throwProjectedAdvancementReset(pos, numChanges, elapsed, projectedTotalTimeMs, totalHydrationTimeMs);
611
- if (!shouldFinish && elapsed > MIN_ADVANCEMENT_TIME_LIMIT_MS && (elapsed > totalHydrationTimeMs || elapsed > totalHydrationTimeMs / 2 && pos <= numChanges / 2)) throw new ResetPipelinesSignal(`Advancement exceeded timeout at ${pos} of ${numChanges} changes after ${elapsed} ms. Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`, "advancement-timeout");
1016
+ if (currentChangeElapsedMs !== void 0 && shouldResetSlowCurrentChange(currentChangeElapsedMs, totalHydrationTimeMs)) this.#throwSlowCurrentChangeReset(completedChanges, numChanges, elapsed, currentChangeElapsedMs, totalHydrationTimeMs);
1017
+ const projectedTotalTimeMs = projectedAdvancementTimeMs(elapsed, completedChanges, numChanges);
1018
+ if (!shouldFinishLateAdvancement(completedChanges, numChanges)) {
1019
+ if (canProjectAdvancement(elapsed, projectedTotalTimeMs, completedChanges, numChanges)) {
1020
+ const projectedTotal = must(projectedTotalTimeMs);
1021
+ if (shouldResetProjectedAdvancement(elapsed, projectedTotal, totalHydrationTimeMs)) this.#throwProjectedAdvancementReset(completedChanges, numChanges, elapsed, projectedTotal, totalHydrationTimeMs);
1022
+ } else if (elapsed > MIN_ADVANCEMENT_TIME_LIMIT_MS && elapsed > totalHydrationTimeMs) {
1023
+ const breakdown = formatAdvancementBreakdown(must(this.#advanceContext), elapsed);
1024
+ this.#lc.warn?.(`Advancement exceeded timeout at ${completedChanges} of ${numChanges} changes after ${elapsed.toFixed(1)} ms (${breakdown}). Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`);
1025
+ throw new ResetPipelinesSignal(`Advancement exceeded timeout at ${completedChanges} of ${numChanges} changes after ${elapsed} ms. Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`, "advancement-timeout", breakdown);
1026
+ }
1027
+ }
612
1028
  return checkYield && advanceTimer.elapsedLap() > this.#yieldThresholdMs();
613
1029
  }
1030
+ /**
1031
+ * The rows an advancement holds in memory are bounded by its reservation,
1032
+ * but their width is not known in advance. So the bytes they are estimated
1033
+ * to hold are added to those held by the other advancements on this worker.
1034
+ * Says whether that takes them past the budget, or if the rows are not
1035
+ * bounded by the reservation after all.
1036
+ */
1037
+ #holdPendingRows(advanceContext) {
1038
+ const { reservedRows, heldBytes, pos, numChanges } = advanceContext;
1039
+ if (reservedRows === void 0) return "fits";
1040
+ const budget = must(this.#deferredWrites);
1041
+ const rows = this.pendingRows;
1042
+ const bytes = this.pendingBytes;
1043
+ advanceContext.heldBytes = bytes;
1044
+ const bytesFit = budget.holdBytes(bytes - heldBytes);
1045
+ if (rows > reservedRows) {
1046
+ budget.recordRowOverrun();
1047
+ this.#lc.error?.(`Advancement holds ${rows} rows at ${pos} of ${numChanges} changes, more than the ${reservedRows} it reserved. Writing through the rest.`);
1048
+ return "row-overrun";
1049
+ }
1050
+ return bytesFit ? "fits" : "bytes";
1051
+ }
614
1052
  #throwSlowCurrentChangeReset(pos, numChanges, elapsed, currentChangeElapsedMs, totalHydrationTimeMs) {
615
- throw new ResetPipelinesSignal(`Advancement exceeded timeout processing current change at ${pos} of ${numChanges} changes after ${currentChangeElapsedMs} ms (${elapsed} ms total). Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`, "advancement-timeout");
1053
+ const breakdown = this.#advanceContext ? formatAdvancementBreakdown(this.#advanceContext, elapsed) : void 0;
1054
+ this.#lc.warn?.(`Advancement slow current change at ${pos} of ${numChanges} changes after ${currentChangeElapsedMs.toFixed(1)} ms (${elapsed.toFixed(1)} ms total)` + (breakdown ? ` (${breakdown})` : "") + `. Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`);
1055
+ throw new ResetPipelinesSignal(`Advancement exceeded timeout processing current change at ${pos} of ${numChanges} changes after ${currentChangeElapsedMs} ms (${elapsed} ms total). Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`, "advancement-timeout", breakdown);
616
1056
  }
617
1057
  #throwProjectedAdvancementReset(pos, numChanges, elapsed, projectedTotalTimeMs, totalHydrationTimeMs) {
1058
+ const breakdown = this.#advanceContext ? formatAdvancementBreakdown(this.#advanceContext, elapsed) : void 0;
618
1059
  const projection = projectedTotalTimeMs === void 0 ? "" : ` Projected total advancement time is ${projectedTotalTimeMs} ms.`;
619
- throw new ResetPipelinesSignal(`Advancement projected to exceed hydration time at ${pos} of ${numChanges} changes after ${elapsed} ms.` + projection + ` Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`, "advancement-timeout");
1060
+ this.#lc.warn?.(`Advancement projected timeout at ${pos} of ${numChanges} changes after ${elapsed.toFixed(1)} ms` + projection + (breakdown ? ` (${breakdown})` : "") + `. Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`);
1061
+ throw new ResetPipelinesSignal(`Advancement projected to exceed hydration time at ${pos} of ${numChanges} changes after ${elapsed} ms.` + projection + ` Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`, "advancement-timeout", breakdown);
620
1062
  }
621
1063
  /** Implements `BuilderDelegate.createStorage()` */
622
1064
  #createStorage() {
623
1065
  return this.#storage.createStorage();
624
1066
  }
625
1067
  *#push(source, change) {
626
- this.#startAccumulating();
1068
+ assert(this.#pushedRowChanges === null, "push already in progress");
627
1069
  try {
1070
+ this.#pushedRowChanges = [];
628
1071
  for (const val of source.genPush(change)) {
629
1072
  if (val === "yield") yield "yield";
630
- for (const changeOrYield of this.#stopAccumulating().stream()) yield changeOrYield;
631
- this.#startAccumulating();
1073
+ const rowChanges = this.#pushedRowChanges;
1074
+ this.#pushedRowChanges = [];
1075
+ yield* rowChanges;
632
1076
  }
633
1077
  } finally {
634
- if (this.#streamer !== null) this.#stopAccumulating();
1078
+ this.#pushedRowChanges = null;
635
1079
  }
636
1080
  }
637
- #startAccumulating() {
638
- assert(this.#streamer === null, "Streamer already started");
639
- this.#streamer = new Streamer(must(this.#primaryKeys), this.#tableSpecs, (queryID, error) => this.#logQueryFailure(queryID, "query pipeline failed", error));
640
- }
641
- #stopAccumulating() {
642
- const streamer = this.#streamer;
643
- assert(streamer, "Streamer not started");
644
- this.#streamer = null;
645
- return streamer;
646
- }
647
- #logQueryFailure(queryID, message, error) {
648
- const pipeline = this.#pipelines.get(queryID);
649
- const queryInfo = pipeline ? {
650
- queryHash: queryID,
651
- transformationHash: pipeline.transformationHash,
652
- queryName: pipeline.queryName
653
- } : void 0;
654
- logQueryFailure(this.#lc, queryInfo, message, error);
1081
+ /**
1082
+ * Converts a change pushed out of a query pipeline into row changes during
1083
+ * the push. The relationships of a pushed node are lazy, and operators such
1084
+ * as Join compute them from the state of the push in progress: while a child
1085
+ * change is pushed to each matching parent in turn, parents not yet pushed
1086
+ * must not see it. Read after the push has moved on to the next parent, or
1087
+ * after it has finished, a node's relationships show the later state, and
1088
+ * rows that are also pushed separately are counted twice.
1089
+ */
1090
+ *#streamPushed(queryID, schema, change) {
1091
+ assert(this.#pushedRowChanges, "changes are only pushed by #push");
1092
+ for (const rowChange of must(this.#streamer).streamChange(queryID, schema, change)) {
1093
+ if (rowChange === "yield") {
1094
+ yield rowChange;
1095
+ continue;
1096
+ }
1097
+ must(this.#pushedRowChanges).push(rowChange);
1098
+ }
655
1099
  }
656
1100
  };
1101
+ /** Turns the output of query pipelines into the row changes sent to clients. */
657
1102
  var Streamer = class {
658
1103
  #primaryKeys;
659
1104
  #tableSpecs;
660
- #logQueryFailure;
661
- constructor(primaryKeys, tableSpecs, logQueryFailure) {
1105
+ constructor(primaryKeys, tableSpecs) {
662
1106
  this.#primaryKeys = primaryKeys;
663
1107
  this.#tableSpecs = tableSpecs;
664
- this.#logQueryFailure = logQueryFailure;
665
- }
666
- #changes = [];
667
- accumulate(queryID, schema, changes) {
668
- this.#changes.push([
669
- queryID,
670
- schema,
671
- changes
672
- ]);
673
- return this;
674
- }
675
- *stream() {
676
- for (const [queryID, schema, changes] of this.#changes) try {
677
- yield* this.#streamChanges(queryID, schema, changes);
678
- } catch (e) {
679
- this.#logQueryFailure?.(queryID, e);
680
- throw e;
681
- }
682
1108
  }
683
- *#streamChanges(queryID, schema, changes) {
1109
+ /** The row changes for a change pushed out of the pipeline of `queryID`. */
1110
+ *streamChange(queryID, schema, change) {
684
1111
  if (schema.system === "permissions") return;
685
- for (const change of changes) {
686
- if (change === "yield") {
687
- yield change;
688
- continue;
689
- }
690
- const type = change[0];
691
- switch (type) {
692
- case 1:
693
- case 0:
694
- yield* this.#streamNodes(queryID, schema, type, () => [change[1]]);
695
- break;
696
- case 3: {
697
- const child = change[2];
698
- const childSchema = must(schema.relationships[child.relationshipName]);
699
- yield* this.#streamChanges(queryID, childSchema, [child.change]);
700
- break;
701
- }
702
- case 2:
703
- yield* this.#streamNodes(queryID, schema, type, () => [{
704
- row: change[1].row,
705
- relationships: {}
706
- }]);
707
- break;
708
- default: unreachable(change[0]);
1112
+ const type = change[0];
1113
+ switch (type) {
1114
+ case 1:
1115
+ case 0:
1116
+ yield* this.streamNodes(queryID, schema, type, [change[1]]);
1117
+ break;
1118
+ case 3: {
1119
+ const child = change[2];
1120
+ yield* this.streamChange(queryID, must(schema.relationships[child.relationshipName]), child.change);
1121
+ break;
709
1122
  }
1123
+ case 2:
1124
+ yield* this.streamNodes(queryID, schema, type, [{
1125
+ row: change[1].row,
1126
+ relationships: {}
1127
+ }]);
1128
+ break;
1129
+ default: unreachable(change[0]);
710
1130
  }
711
1131
  }
712
- *#streamNodes(queryID, schema, op, nodes) {
1132
+ /** A row change of type `op` for each of `nodes` and their descendants. */
1133
+ *streamNodes(queryID, schema, op, nodes) {
713
1134
  const { tableName: table, system } = schema;
1135
+ if (system === "permissions") return;
714
1136
  const primaryKey = must(this.#primaryKeys.get(table));
715
1137
  const spec = must(this.#tableSpecs.get(table)).tableSpec;
716
- if (system === "permissions") return;
717
- for (const node of nodes()) {
1138
+ for (const node of nodes) {
718
1139
  if (node === "yield") {
719
1140
  yield node;
720
1141
  continue;
@@ -736,9 +1157,9 @@ var Streamer = class {
736
1157
  rowKey,
737
1158
  row: op === 1 ? void 0 : row
738
1159
  };
739
- for (const [relationship, children] of Object.entries(relationships)) {
1160
+ for (const relationship of Object.keys(relationships)) {
740
1161
  const childSchema = must(schema.relationships[relationship]);
741
- yield* this.#streamNodes(queryID, childSchema, op, children);
1162
+ if (childSchema.system !== "permissions") yield* this.streamNodes(queryID, childSchema, op, relationships[relationship]());
742
1163
  }
743
1164
  }
744
1165
  }
@@ -782,6 +1203,18 @@ var QueryFailureLoggingOperator = class {
782
1203
  throw e;
783
1204
  }
784
1205
  }
1206
+ *reconcile(_pusher) {
1207
+ if (this.#output.reconcile) try {
1208
+ yield* this.#output.reconcile(this);
1209
+ } catch (e) {
1210
+ logQueryFailure(this.#lc, {
1211
+ queryHash: this.#queryHash,
1212
+ transformationHash: this.#transformationHash,
1213
+ queryName: this.#queryName
1214
+ }, "query pipeline failed during reconcile", e);
1215
+ throw e;
1216
+ }
1217
+ }
785
1218
  };
786
1219
  function logQueryFailure(lc, queryInfo, message, error) {
787
1220
  if (error instanceof ResetPipelinesSignal) return;
@@ -792,43 +1225,73 @@ function logQueryFailure(lc, queryInfo, message, error) {
792
1225
  }
793
1226
  queryLC.error?.(message, error);
794
1227
  }
795
- function* toAdds(nodes) {
796
- for (const node of nodes) {
797
- if (node === "yield") {
798
- yield node;
799
- continue;
800
- }
801
- yield [
802
- 0,
803
- node,
804
- null
805
- ];
806
- }
807
- }
808
1228
  function getRowKey(cols, row) {
809
- return Object.fromEntries(cols.map((col) => [col, must(row[col])]));
1229
+ const rowKey = {};
1230
+ for (const col of cols) assignProperty(rowKey, col, must(row[col]));
1231
+ return rowKey;
1232
+ }
1233
+ /** Whether `rowKey` has exactly the columns of `primaryKey`. */
1234
+ function isKeyedBy(rowKey, primaryKey) {
1235
+ let cols = 0;
1236
+ for (const col in rowKey) {
1237
+ if (!primaryKey.includes(col)) return false;
1238
+ cols++;
1239
+ }
1240
+ return cols === primaryKey.length;
810
1241
  }
811
1242
  /**
812
1243
  * Core hydration logic used by {@link PipelineDriver#addQuery}, extracted to a
813
1244
  * function for reuse by the analyze-query RPC path so that analysis hydrates
814
- * queries the same way the view-syncer does in production.
1245
+ * queries the same way the view-syncer does in production. As there, the rows
1246
+ * of a table outside `clientSchema` are keyed by its key in the replica.
1247
+ */
1248
+ function hydrate(input, hash, clientSchema, tableSpecs) {
1249
+ return new Streamer(buildRowKeys(clientSchema, tableSpecs), tableSpecs).streamNodes(hash, input.getSchema(), 0, input.fetch({}));
1250
+ }
1251
+ /**
1252
+ * Returns the value of `childField` in the row of `input`, the pipeline of a
1253
+ * scalar subquery: `null` if the field is `NULL`, or `undefined` if there is
1254
+ * no row. Used by {@link PipelineDriver#addQuery} and the analyze-query RPC
1255
+ * path to resolve scalar subqueries the same way.
815
1256
  */
816
- function* hydrate(input, hash, clientSchema, tableSpecs) {
817
- const res = input.fetch({});
818
- yield* new Streamer(buildPrimaryKeys(clientSchema), tableSpecs).accumulate(hash, input.getSchema(), toAdds(res)).stream();
1257
+ function fetchScalarValue(input, childField) {
1258
+ let node;
1259
+ for (const n of skipYields(input.fetch({}))) node ??= n;
1260
+ if (!node) return;
1261
+ return node.row[childField] ?? null;
819
1262
  }
820
- function* hydrateInternal(input, hash, primaryKeys, tableSpecs) {
821
- const res = input.fetch({});
822
- yield* new Streamer(primaryKeys, tableSpecs).accumulate(hash, input.getSchema(), toAdds(res)).stream();
1263
+ /**
1264
+ * The schema the rows of a companion pipeline are streamed with. A companion is
1265
+ * built from the bare subquery, so its schema says `'client'` even when its
1266
+ * gate came from a permission rule. Rows read for a rule are never synced, so
1267
+ * such a companion takes the gate's system and the Streamer skips it, the rows
1268
+ * behind any EXISTS nested in it included.
1269
+ */
1270
+ function companionStreamSchema(input, { system }) {
1271
+ const schema = input.getSchema();
1272
+ return system === "permissions" ? {
1273
+ ...schema,
1274
+ system
1275
+ } : schema;
823
1276
  }
824
1277
  function buildPrimaryKeys(clientSchema, primaryKeys = /* @__PURE__ */ new Map()) {
825
1278
  for (const [tableName, { primaryKey }] of Object.entries(clientSchema.tables)) primaryKeys.set(tableName, primaryKey);
826
1279
  return primaryKeys;
827
1280
  }
1281
+ /**
1282
+ * Sets `primaryKeys` to the columns that key the synced rows of each table:
1283
+ * the table's primary key in `clientSchema`, or, for a table outside it, its
1284
+ * key in the replica.
1285
+ */
1286
+ function buildRowKeys(clientSchema, tableSpecs, primaryKeys = /* @__PURE__ */ new Map()) {
1287
+ primaryKeys.clear();
1288
+ for (const [table, spec] of tableSpecs.entries()) primaryKeys.set(table, spec.tableSpec.primaryKey);
1289
+ return buildPrimaryKeys(clientSchema, primaryKeys);
1290
+ }
828
1291
  function mustGetPrimaryKey(primaryKeys, table) {
829
1292
  const pKeys = must(primaryKeys, "primaryKey map must be non-null");
830
1293
  const rv = pKeys.get(table);
831
- assert(rv, () => `table '${table}' is not one of: ${[...pKeys.keys()].sort()}. Check the spelling and ensure that the table has a primary key.`);
1294
+ assert(rv, () => `table '${table}' is not one of: ${JSON.stringify([...pKeys.keys()].sort())}. Check the spelling and ensure that the table has a primary key.`);
832
1295
  return rv;
833
1296
  }
834
1297
  /**
@@ -841,6 +1304,6 @@ function scalarValuesEqual(a, b) {
841
1304
  return a === b;
842
1305
  }
843
1306
  //#endregion
844
- export { PipelineDriver, hydrate };
1307
+ export { PipelineDriver, fetchScalarValue, hydrate };
845
1308
 
846
1309
  //# sourceMappingURL=pipeline-driver.js.map