@rocicorp/zero 1.11.0-canary.2 → 1.11.0-canary.20

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 (832) hide show
  1. package/out/analyze-query/src/bin-analyze.js +9 -8
  2. package/out/analyze-query/src/bin-analyze.js.map +1 -1
  3. package/out/ast-to-zql/src/ast-to-zql.d.ts +8 -1
  4. package/out/ast-to-zql/src/ast-to-zql.d.ts.map +1 -1
  5. package/out/ast-to-zql/src/ast-to-zql.js +25 -25
  6. package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
  7. package/out/otel/src/log-options.d.ts +16 -0
  8. package/out/otel/src/log-options.d.ts.map +1 -1
  9. package/out/otel/src/log-options.js +54 -1
  10. package/out/otel/src/log-options.js.map +1 -1
  11. package/out/replicache/src/bg-interval.d.ts +2 -1
  12. package/out/replicache/src/bg-interval.d.ts.map +1 -1
  13. package/out/replicache/src/bg-interval.js +13 -4
  14. package/out/replicache/src/bg-interval.js.map +1 -1
  15. package/out/replicache/src/btree/node.d.ts.map +1 -1
  16. package/out/replicache/src/btree/node.js +3 -6
  17. package/out/replicache/src/btree/node.js.map +1 -1
  18. package/out/replicache/src/dag/gc.d.ts.map +1 -1
  19. package/out/replicache/src/dag/gc.js +8 -11
  20. package/out/replicache/src/dag/gc.js.map +1 -1
  21. package/out/replicache/src/dag/invalid-ref-count-error.d.ts +12 -0
  22. package/out/replicache/src/dag/invalid-ref-count-error.d.ts.map +1 -0
  23. package/out/replicache/src/dag/invalid-ref-count-error.js +19 -0
  24. package/out/replicache/src/dag/invalid-ref-count-error.js.map +1 -0
  25. package/out/replicache/src/dag/lazy-store.d.ts +17 -4
  26. package/out/replicache/src/dag/lazy-store.d.ts.map +1 -1
  27. package/out/replicache/src/dag/lazy-store.js +35 -9
  28. package/out/replicache/src/dag/lazy-store.js.map +1 -1
  29. package/out/replicache/src/dag/store-impl.d.ts +12 -2
  30. package/out/replicache/src/dag/store-impl.d.ts.map +1 -1
  31. package/out/replicache/src/dag/store-impl.js +29 -9
  32. package/out/replicache/src/dag/store-impl.js.map +1 -1
  33. package/out/replicache/src/db/rebase.d.ts +14 -2
  34. package/out/replicache/src/db/rebase.d.ts.map +1 -1
  35. package/out/replicache/src/db/rebase.js +27 -5
  36. package/out/replicache/src/db/rebase.js.map +1 -1
  37. package/out/replicache/src/get-kv-store-provider.d.ts +1 -1
  38. package/out/replicache/src/get-kv-store-provider.d.ts.map +1 -1
  39. package/out/replicache/src/get-kv-store-provider.js +4 -4
  40. package/out/replicache/src/get-kv-store-provider.js.map +1 -1
  41. package/out/replicache/src/kv/expo-sqlite/store.d.ts.map +1 -1
  42. package/out/replicache/src/kv/expo-sqlite/store.js +28 -5
  43. package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
  44. package/out/replicache/src/kv/idb-store.d.ts +18 -0
  45. package/out/replicache/src/kv/idb-store.d.ts.map +1 -1
  46. package/out/replicache/src/kv/idb-store.js +30 -2
  47. package/out/replicache/src/kv/idb-store.js.map +1 -1
  48. package/out/replicache/src/kv/mem-fallback-store.d.ts +54 -0
  49. package/out/replicache/src/kv/mem-fallback-store.d.ts.map +1 -0
  50. package/out/replicache/src/kv/mem-fallback-store.js +177 -0
  51. package/out/replicache/src/kv/mem-fallback-store.js.map +1 -0
  52. package/out/replicache/src/kv/mem-store.d.ts +1 -0
  53. package/out/replicache/src/kv/mem-store.d.ts.map +1 -1
  54. package/out/replicache/src/kv/mem-store.js +3 -0
  55. package/out/replicache/src/kv/mem-store.js.map +1 -1
  56. package/out/replicache/src/kv/op-sqlite/store.d.ts.map +1 -1
  57. package/out/replicache/src/kv/op-sqlite/store.js +4 -4
  58. package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
  59. package/out/replicache/src/kv/sqlite-store.d.ts +22 -1
  60. package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
  61. package/out/replicache/src/kv/sqlite-store.js +159 -14
  62. package/out/replicache/src/kv/sqlite-store.js.map +1 -1
  63. package/out/replicache/src/kv/store.d.ts +6 -0
  64. package/out/replicache/src/kv/store.d.ts.map +1 -1
  65. package/out/replicache/src/new-client-channel.js.map +1 -1
  66. package/out/replicache/src/persist/client-gc.d.ts +2 -1
  67. package/out/replicache/src/persist/client-gc.d.ts.map +1 -1
  68. package/out/replicache/src/persist/client-gc.js +2 -2
  69. package/out/replicache/src/persist/client-gc.js.map +1 -1
  70. package/out/replicache/src/persist/client-group-gc.d.ts +2 -1
  71. package/out/replicache/src/persist/client-group-gc.d.ts.map +1 -1
  72. package/out/replicache/src/persist/client-group-gc.js +2 -2
  73. package/out/replicache/src/persist/client-group-gc.js.map +1 -1
  74. package/out/replicache/src/persist/collect-idb-databases.d.ts +28 -8
  75. package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
  76. package/out/replicache/src/persist/collect-idb-databases.js +97 -20
  77. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
  78. package/out/replicache/src/persist/heartbeat.d.ts +2 -1
  79. package/out/replicache/src/persist/heartbeat.d.ts.map +1 -1
  80. package/out/replicache/src/persist/heartbeat.js +2 -2
  81. package/out/replicache/src/persist/heartbeat.js.map +1 -1
  82. package/out/replicache/src/persist/idb-databases-store-db-name.js +1 -1
  83. package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -1
  84. package/out/replicache/src/persist/persist.d.ts.map +1 -1
  85. package/out/replicache/src/persist/persist.js +18 -8
  86. package/out/replicache/src/persist/persist.js.map +1 -1
  87. package/out/replicache/src/persist/refresh.js +6 -2
  88. package/out/replicache/src/persist/refresh.js.map +1 -1
  89. package/out/replicache/src/replicache-impl.d.ts +85 -3
  90. package/out/replicache/src/replicache-impl.d.ts.map +1 -1
  91. package/out/replicache/src/replicache-impl.js +321 -29
  92. package/out/replicache/src/replicache-impl.js.map +1 -1
  93. package/out/replicache/src/replicache-options.d.ts +9 -0
  94. package/out/replicache/src/replicache-options.d.ts.map +1 -1
  95. package/out/replicache/src/storage-failure.d.ts +37 -0
  96. package/out/replicache/src/storage-failure.d.ts.map +1 -0
  97. package/out/replicache/src/storage-failure.js +31 -0
  98. package/out/replicache/src/storage-failure.js.map +1 -0
  99. package/out/shared/src/arrays.d.ts +5 -0
  100. package/out/shared/src/arrays.d.ts.map +1 -1
  101. package/out/shared/src/arrays.js +8 -10
  102. package/out/shared/src/arrays.js.map +1 -1
  103. package/out/shared/src/error.d.ts +11 -0
  104. package/out/shared/src/error.d.ts.map +1 -1
  105. package/out/shared/src/error.js +35 -1
  106. package/out/shared/src/error.js.map +1 -1
  107. package/out/shared/src/iterables.d.ts +2 -0
  108. package/out/shared/src/iterables.d.ts.map +1 -1
  109. package/out/shared/src/iterables.js +18 -1
  110. package/out/shared/src/iterables.js.map +1 -1
  111. package/out/shared/src/map.d.ts +24 -2
  112. package/out/shared/src/map.d.ts.map +1 -1
  113. package/out/shared/src/map.js +18 -4
  114. package/out/shared/src/map.js.map +1 -1
  115. package/out/shared/src/random-values.js +12 -1
  116. package/out/shared/src/random-values.js.map +1 -1
  117. package/out/shared/src/ring-buffer.d.ts +10 -0
  118. package/out/shared/src/ring-buffer.d.ts.map +1 -1
  119. package/out/shared/src/ring-buffer.js +26 -1
  120. package/out/shared/src/ring-buffer.js.map +1 -1
  121. package/out/z2s/src/compiler.js +1 -1
  122. package/out/z2s/src/sql.d.ts.map +1 -1
  123. package/out/z2s/src/sql.js +2 -2
  124. package/out/z2s/src/sql.js.map +1 -1
  125. package/out/zero/package.js +3 -4
  126. package/out/zero/package.js.map +1 -1
  127. package/out/zero/src/zero.js +2 -1
  128. package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
  129. package/out/zero-cache/src/auth/write-authorizer.js +1 -0
  130. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  131. package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
  132. package/out/zero-cache/src/config/normalize.js +26 -2
  133. package/out/zero-cache/src/config/normalize.js.map +1 -1
  134. package/out/zero-cache/src/config/zero-config.d.ts +102 -6
  135. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  136. package/out/zero-cache/src/config/zero-config.js +254 -57
  137. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  138. package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
  139. package/out/zero-cache/src/db/lite-tables.js +3 -4
  140. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  141. package/out/zero-cache/src/observability/events.js +4 -1
  142. package/out/zero-cache/src/observability/events.js.map +1 -1
  143. package/out/zero-cache/src/observability/log-throttle.d.ts +44 -0
  144. package/out/zero-cache/src/observability/log-throttle.d.ts.map +1 -0
  145. package/out/zero-cache/src/observability/log-throttle.js +76 -0
  146. package/out/zero-cache/src/observability/log-throttle.js.map +1 -0
  147. package/out/zero-cache/src/observability/metrics.d.ts.map +1 -1
  148. package/out/zero-cache/src/observability/metrics.js +2 -7
  149. package/out/zero-cache/src/observability/metrics.js.map +1 -1
  150. package/out/zero-cache/src/scripts/permissions.d.ts +16 -0
  151. package/out/zero-cache/src/scripts/permissions.d.ts.map +1 -1
  152. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  153. package/out/zero-cache/src/server/change-streamer.js +27 -10
  154. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  155. package/out/zero-cache/src/server/inspector-delegate.d.ts +28 -2
  156. package/out/zero-cache/src/server/inspector-delegate.d.ts.map +1 -1
  157. package/out/zero-cache/src/server/inspector-delegate.js +37 -17
  158. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
  159. package/out/zero-cache/src/server/main.d.ts.map +1 -1
  160. package/out/zero-cache/src/server/main.js +8 -1
  161. package/out/zero-cache/src/server/main.js.map +1 -1
  162. package/out/zero-cache/src/server/mutator.js +2 -0
  163. package/out/zero-cache/src/server/mutator.js.map +1 -1
  164. package/out/zero-cache/src/server/reaper.d.ts.map +1 -1
  165. package/out/zero-cache/src/server/reaper.js +2 -0
  166. package/out/zero-cache/src/server/reaper.js.map +1 -1
  167. package/out/zero-cache/src/server/replicator.d.ts +3 -0
  168. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  169. package/out/zero-cache/src/server/replicator.js +79 -15
  170. package/out/zero-cache/src/server/replicator.js.map +1 -1
  171. package/out/zero-cache/src/server/runner/zero-dispatcher.d.ts.map +1 -1
  172. package/out/zero-cache/src/server/runner/zero-dispatcher.js +5 -0
  173. package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
  174. package/out/zero-cache/src/server/syncer-assigner.d.ts +14 -0
  175. package/out/zero-cache/src/server/syncer-assigner.d.ts.map +1 -0
  176. package/out/zero-cache/src/server/syncer-assigner.js +72 -0
  177. package/out/zero-cache/src/server/syncer-assigner.js.map +1 -0
  178. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  179. package/out/zero-cache/src/server/syncer.js +24 -2
  180. package/out/zero-cache/src/server/syncer.js.map +1 -1
  181. package/out/zero-cache/src/server/worker-dispatcher.d.ts.map +1 -1
  182. package/out/zero-cache/src/server/worker-dispatcher.js +21 -4
  183. package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -1
  184. package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
  185. package/out/zero-cache/src/services/analyze.js +11 -9
  186. package/out/zero-cache/src/services/analyze.js.map +1 -1
  187. package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts.map +1 -1
  188. package/out/zero-cache/src/services/change-source/common/backfill-manager.js +198 -24
  189. package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
  190. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.d.ts.map +1 -1
  191. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js +15 -3
  192. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -1
  193. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts +1 -0
  194. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
  195. package/out/zero-cache/src/services/change-source/common/replica-schema.js +15 -3
  196. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  197. package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts +9 -0
  198. package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts.map +1 -1
  199. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +204 -18
  200. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
  201. package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts +25 -0
  202. package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts.map +1 -0
  203. package/out/zero-cache/src/services/change-source/pg/change-source-init.js +202 -0
  204. package/out/zero-cache/src/services/change-source/pg/change-source-init.js.map +1 -0
  205. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +14 -16
  206. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  207. package/out/zero-cache/src/services/change-source/pg/change-source.js +64 -143
  208. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  209. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +37 -2
  210. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  211. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +53 -21
  212. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  213. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts +16 -0
  214. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts.map +1 -0
  215. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js +113 -0
  216. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js.map +1 -0
  217. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts +21 -15
  218. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts.map +1 -1
  219. package/out/zero-cache/src/services/change-source/pg/replication-slots.js +86 -23
  220. package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
  221. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts.map +1 -1
  222. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js +68 -8
  223. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js.map +1 -1
  224. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
  225. package/out/zero-cache/src/services/change-source/pg/schema/init.js +32 -1
  226. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  227. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.d.ts +10 -0
  228. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.d.ts.map +1 -0
  229. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js +6 -0
  230. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js.map +1 -0
  231. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +50 -27
  232. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
  233. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +100 -34
  234. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  235. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts +68 -0
  236. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts.map +1 -0
  237. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js +141 -0
  238. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js.map +1 -0
  239. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +43 -0
  240. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
  241. package/out/zero-cache/src/services/change-source/protocol/current/data.js +10 -1
  242. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  243. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +57 -0
  244. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
  245. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts +20 -6
  246. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts.map +1 -1
  247. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js +17 -7
  248. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -1
  249. package/out/zero-cache/src/services/change-source/protocol/current.js +2 -1
  250. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts +66 -0
  251. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts.map +1 -0
  252. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js +154 -0
  253. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js.map +1 -0
  254. package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts +50 -0
  255. package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts.map +1 -0
  256. package/out/zero-cache/src/services/change-streamer/backfill-state.js +268 -0
  257. package/out/zero-cache/src/services/change-streamer/backfill-state.js.map +1 -0
  258. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts.map +1 -1
  259. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js +2 -0
  260. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js.map +1 -1
  261. package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts.map +1 -1
  262. package/out/zero-cache/src/services/change-streamer/backup-monitor.js +58 -7
  263. package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
  264. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts +8 -2
  265. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts.map +1 -1
  266. package/out/zero-cache/src/services/change-streamer/broadcast.js +24 -4
  267. package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
  268. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts +19 -4
  269. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts.map +1 -1
  270. package/out/zero-cache/src/services/change-streamer/change-log-codec.js +28 -8
  271. package/out/zero-cache/src/services/change-streamer/change-log-codec.js.map +1 -1
  272. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +48 -6
  273. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  274. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +130 -34
  275. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  276. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +11 -0
  277. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  278. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +118 -68
  279. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  280. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +37 -15
  281. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
  282. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  283. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts +3 -3
  284. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -1
  285. package/out/zero-cache/src/services/change-streamer/forwarder.js +36 -5
  286. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
  287. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts +51 -0
  288. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts.map +1 -0
  289. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js +132 -0
  290. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js.map +1 -0
  291. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +1 -1
  292. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
  293. package/out/zero-cache/src/services/change-streamer/schema/tables.js +19 -8
  294. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  295. package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts +92 -0
  296. package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts.map +1 -0
  297. package/out/zero-cache/src/services/change-streamer/snapshot-message.js +42 -0
  298. package/out/zero-cache/src/services/change-streamer/snapshot-message.js.map +1 -0
  299. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts +1 -1
  300. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts.map +1 -1
  301. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js +16 -4
  302. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js.map +1 -1
  303. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts +7 -69
  304. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts.map +1 -1
  305. package/out/zero-cache/src/services/change-streamer/snapshot.js +21 -53
  306. package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -1
  307. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts +6 -1
  308. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts.map +1 -1
  309. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js +27 -9
  310. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js.map +1 -1
  311. package/out/zero-cache/src/services/change-streamer/storer.d.ts +2 -2
  312. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  313. package/out/zero-cache/src/services/change-streamer/storer.js +9 -6
  314. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  315. package/out/zero-cache/src/services/change-streamer/subscribe.d.ts +446 -0
  316. package/out/zero-cache/src/services/change-streamer/subscribe.d.ts.map +1 -0
  317. package/out/zero-cache/src/services/change-streamer/subscribe.js +76 -0
  318. package/out/zero-cache/src/services/change-streamer/subscribe.js.map +1 -0
  319. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +33 -1
  320. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
  321. package/out/zero-cache/src/services/change-streamer/subscriber.js +76 -0
  322. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  323. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts +17 -1
  324. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts.map +1 -1
  325. package/out/zero-cache/src/services/change-streamer/upstream-acker.js +19 -3
  326. package/out/zero-cache/src/services/change-streamer/upstream-acker.js.map +1 -1
  327. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts +5 -0
  328. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts.map +1 -1
  329. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js +35 -5
  330. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js.map +1 -1
  331. package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
  332. package/out/zero-cache/src/services/life-cycle.js +3 -1
  333. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  334. package/out/zero-cache/src/services/litestream/commands.d.ts +15 -3
  335. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  336. package/out/zero-cache/src/services/litestream/commands.js +24 -7
  337. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  338. package/out/zero-cache/src/services/litestream/config-v5.yml +11 -4
  339. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js +51 -24
  340. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js.map +1 -1
  341. package/out/zero-cache/src/services/litestream/litestream-controller.d.ts +10 -2
  342. package/out/zero-cache/src/services/litestream/litestream-controller.d.ts.map +1 -1
  343. package/out/zero-cache/src/services/litestream/litestream-controller.js +3 -2
  344. package/out/zero-cache/src/services/litestream/litestream-controller.js.map +1 -1
  345. package/out/zero-cache/src/services/litestream/restore-progress.d.ts +24 -0
  346. package/out/zero-cache/src/services/litestream/restore-progress.d.ts.map +1 -0
  347. package/out/zero-cache/src/services/litestream/restore-progress.js +91 -0
  348. package/out/zero-cache/src/services/litestream/restore-progress.js.map +1 -0
  349. package/out/zero-cache/src/services/mutagen/mutagen.d.ts +5 -0
  350. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  351. package/out/zero-cache/src/services/mutagen/mutagen.js +7 -1
  352. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  353. package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
  354. package/out/zero-cache/src/services/mutagen/pusher.js +5 -6
  355. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  356. package/out/zero-cache/src/services/plannerz.d.ts +163 -0
  357. package/out/zero-cache/src/services/plannerz.d.ts.map +1 -0
  358. package/out/zero-cache/src/services/plannerz.js +267 -0
  359. package/out/zero-cache/src/services/plannerz.js.map +1 -0
  360. package/out/zero-cache/src/services/profz.d.ts +30 -0
  361. package/out/zero-cache/src/services/profz.d.ts.map +1 -0
  362. package/out/zero-cache/src/services/profz.js +145 -0
  363. package/out/zero-cache/src/services/profz.js.map +1 -0
  364. package/out/zero-cache/src/services/replicator/change-log-cookies.js +1 -1
  365. package/out/zero-cache/src/services/replicator/change-log-cookies.js.map +1 -1
  366. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts +5 -4
  367. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts.map +1 -1
  368. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js +20 -22
  369. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js.map +1 -1
  370. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
  371. package/out/zero-cache/src/services/replicator/change-processor.js +49 -5
  372. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  373. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +3 -2
  374. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  375. package/out/zero-cache/src/services/replicator/incremental-sync.js +50 -20
  376. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  377. package/out/zero-cache/src/services/replicator/replication-status.d.ts +35 -1
  378. package/out/zero-cache/src/services/replicator/replication-status.d.ts.map +1 -1
  379. package/out/zero-cache/src/services/replicator/replication-status.js +96 -6
  380. package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
  381. package/out/zero-cache/src/services/replicator/replicator.d.ts +2 -1
  382. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
  383. package/out/zero-cache/src/services/replicator/replicator.js +2 -2
  384. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  385. package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts +23 -2
  386. package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts.map +1 -1
  387. package/out/zero-cache/src/services/replicator/schema/backfilling.js +54 -2
  388. package/out/zero-cache/src/services/replicator/schema/backfilling.js.map +1 -1
  389. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts +6 -6
  390. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts.map +1 -1
  391. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js +19 -14
  392. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js.map +1 -1
  393. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts +11 -3
  394. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts.map +1 -1
  395. package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
  396. package/out/zero-cache/src/services/replicator/write-worker.js +5 -1
  397. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
  398. package/out/zero-cache/src/services/run-ast.d.ts +12 -0
  399. package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
  400. package/out/zero-cache/src/services/run-ast.js +26 -14
  401. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  402. package/out/zero-cache/src/services/runner.d.ts +2 -1
  403. package/out/zero-cache/src/services/runner.d.ts.map +1 -1
  404. package/out/zero-cache/src/services/runner.js +10 -2
  405. package/out/zero-cache/src/services/runner.js.map +1 -1
  406. package/out/zero-cache/src/services/statz.d.ts +4 -0
  407. package/out/zero-cache/src/services/statz.d.ts.map +1 -1
  408. package/out/zero-cache/src/services/statz.js +22 -5
  409. package/out/zero-cache/src/services/statz.js.map +1 -1
  410. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +19 -2
  411. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
  412. package/out/zero-cache/src/services/view-syncer/client-handler.js +42 -30
  413. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  414. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +19 -1
  415. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  416. package/out/zero-cache/src/services/view-syncer/cvr-store.js +34 -11
  417. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  418. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +51 -2
  419. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  420. package/out/zero-cache/src/services/view-syncer/cvr.js +142 -6
  421. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  422. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts +81 -0
  423. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts.map +1 -0
  424. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js +128 -0
  425. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js.map +1 -0
  426. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts +14 -1
  427. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts.map +1 -1
  428. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +30 -4
  429. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
  430. package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts +33 -0
  431. package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts.map +1 -0
  432. package/out/zero-cache/src/services/view-syncer/hydration-budget.js +62 -0
  433. package/out/zero-cache/src/services/view-syncer/hydration-budget.js.map +1 -0
  434. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts +51 -0
  435. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts.map +1 -0
  436. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js +78 -0
  437. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js.map +1 -0
  438. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts +1 -1
  439. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts.map +1 -1
  440. package/out/zero-cache/src/services/view-syncer/inspect-handler.js +3 -3
  441. package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
  442. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +50 -2
  443. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  444. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +471 -62
  445. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  446. package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts +7 -0
  447. package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts.map +1 -0
  448. package/out/zero-cache/src/services/view-syncer/plan-warnings.js +35 -0
  449. package/out/zero-cache/src/services/view-syncer/plan-warnings.js.map +1 -0
  450. package/out/zero-cache/src/services/view-syncer/query-covering.d.ts.map +1 -1
  451. package/out/zero-cache/src/services/view-syncer/query-covering.js +2 -6
  452. package/out/zero-cache/src/services/view-syncer/query-covering.js.map +1 -1
  453. package/out/zero-cache/src/services/view-syncer/query-shape.d.ts +25 -0
  454. package/out/zero-cache/src/services/view-syncer/query-shape.d.ts.map +1 -0
  455. package/out/zero-cache/src/services/view-syncer/query-shape.js +28 -0
  456. package/out/zero-cache/src/services/view-syncer/query-shape.js.map +1 -0
  457. package/out/zero-cache/src/services/view-syncer/query-stats.d.ts +77 -0
  458. package/out/zero-cache/src/services/view-syncer/query-stats.d.ts.map +1 -0
  459. package/out/zero-cache/src/services/view-syncer/query-stats.js +206 -0
  460. package/out/zero-cache/src/services/view-syncer/query-stats.js.map +1 -0
  461. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts +95 -0
  462. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts.map +1 -0
  463. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js +155 -0
  464. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js.map +1 -0
  465. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +78 -4
  466. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  467. package/out/zero-cache/src/services/view-syncer/snapshotter.js +158 -28
  468. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  469. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +11 -1
  470. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  471. package/out/zero-cache/src/services/view-syncer/view-syncer.js +587 -103
  472. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  473. package/out/zero-cache/src/types/processes.d.ts +39 -0
  474. package/out/zero-cache/src/types/processes.d.ts.map +1 -1
  475. package/out/zero-cache/src/types/processes.js +43 -4
  476. package/out/zero-cache/src/types/processes.js.map +1 -1
  477. package/out/zero-cache/src/types/profiler.d.ts +12 -0
  478. package/out/zero-cache/src/types/profiler.d.ts.map +1 -1
  479. package/out/zero-cache/src/types/profiler.js +46 -1
  480. package/out/zero-cache/src/types/profiler.js.map +1 -1
  481. package/out/zero-cache/src/types/row-key.d.ts.map +1 -1
  482. package/out/zero-cache/src/types/row-key.js +5 -5
  483. package/out/zero-cache/src/types/row-key.js.map +1 -1
  484. package/out/zero-cache/src/types/streams.d.ts +49 -7
  485. package/out/zero-cache/src/types/streams.d.ts.map +1 -1
  486. package/out/zero-cache/src/types/streams.js +190 -58
  487. package/out/zero-cache/src/types/streams.js.map +1 -1
  488. package/out/zero-cache/src/types/subscription.d.ts +15 -0
  489. package/out/zero-cache/src/types/subscription.d.ts.map +1 -1
  490. package/out/zero-cache/src/types/subscription.js +123 -31
  491. package/out/zero-cache/src/types/subscription.js.map +1 -1
  492. package/out/zero-cache/src/types/websocket-handoff.d.ts +1 -1
  493. package/out/zero-cache/src/types/websocket-handoff.d.ts.map +1 -1
  494. package/out/zero-cache/src/types/websocket-handoff.js +18 -9
  495. package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
  496. package/out/zero-cache/src/types/ws.d.ts.map +1 -1
  497. package/out/zero-cache/src/types/ws.js +1 -16
  498. package/out/zero-cache/src/types/ws.js.map +1 -1
  499. package/out/zero-cache/src/workers/connect-params.d.ts +1 -0
  500. package/out/zero-cache/src/workers/connect-params.d.ts.map +1 -1
  501. package/out/zero-cache/src/workers/connect-params.js.map +1 -1
  502. package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +1 -1
  503. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +21 -16
  504. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  505. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  506. package/out/zero-cache/src/workers/syncer.js +55 -4
  507. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  508. package/out/zero-client/src/client/active-clients-manager.d.ts.map +1 -1
  509. package/out/zero-client/src/client/active-clients-manager.js +4 -1
  510. package/out/zero-client/src/client/active-clients-manager.js.map +1 -1
  511. package/out/zero-client/src/client/connection-manager.d.ts +20 -0
  512. package/out/zero-client/src/client/connection-manager.d.ts.map +1 -1
  513. package/out/zero-client/src/client/connection-manager.js +77 -13
  514. package/out/zero-client/src/client/connection-manager.js.map +1 -1
  515. package/out/zero-client/src/client/connection-status-enum.d.ts +2 -0
  516. package/out/zero-client/src/client/connection-status-enum.d.ts.map +1 -1
  517. package/out/zero-client/src/client/connection-status-enum.js +3 -1
  518. package/out/zero-client/src/client/connection-status-enum.js.map +1 -1
  519. package/out/zero-client/src/client/connection.d.ts +6 -0
  520. package/out/zero-client/src/client/connection.d.ts.map +1 -1
  521. package/out/zero-client/src/client/connection.js +2 -1
  522. package/out/zero-client/src/client/connection.js.map +1 -1
  523. package/out/zero-client/src/client/context.d.ts +22 -12
  524. package/out/zero-client/src/client/context.d.ts.map +1 -1
  525. package/out/zero-client/src/client/context.js +92 -25
  526. package/out/zero-client/src/client/context.js.map +1 -1
  527. package/out/zero-client/src/client/custom.js +2 -2
  528. package/out/zero-client/src/client/custom.js.map +1 -1
  529. package/out/zero-client/src/client/error.js +1 -1
  530. package/out/zero-client/src/client/ivm-branch.d.ts.map +1 -1
  531. package/out/zero-client/src/client/ivm-branch.js +20 -3
  532. package/out/zero-client/src/client/ivm-branch.js.map +1 -1
  533. package/out/zero-client/src/client/mutator-proxy.d.ts.map +1 -1
  534. package/out/zero-client/src/client/mutator-proxy.js +5 -2
  535. package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
  536. package/out/zero-client/src/client/options.d.ts +33 -0
  537. package/out/zero-client/src/client/options.d.ts.map +1 -1
  538. package/out/zero-client/src/client/options.js.map +1 -1
  539. package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
  540. package/out/zero-client/src/client/query-manager.js +44 -11
  541. package/out/zero-client/src/client/query-manager.js.map +1 -1
  542. package/out/zero-client/src/client/version.js +1 -1
  543. package/out/zero-client/src/client/zero-rep.d.ts +1 -0
  544. package/out/zero-client/src/client/zero-rep.d.ts.map +1 -1
  545. package/out/zero-client/src/client/zero-rep.js +8 -6
  546. package/out/zero-client/src/client/zero-rep.js.map +1 -1
  547. package/out/zero-client/src/client/zero.d.ts +18 -3
  548. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  549. package/out/zero-client/src/client/zero.js +83 -46
  550. package/out/zero-client/src/client/zero.js.map +1 -1
  551. package/out/zero-client/src/mod.d.ts +1 -0
  552. package/out/zero-client/src/mod.d.ts.map +1 -1
  553. package/out/zero-client/src/mod.js +1 -0
  554. package/out/zero-client/src/types/query-result.d.ts +2 -0
  555. package/out/zero-client/src/types/query-result.d.ts.map +1 -1
  556. package/out/zero-events/src/status.d.ts +58 -0
  557. package/out/zero-events/src/status.d.ts.map +1 -1
  558. package/out/zero-protocol/src/ast.d.ts.map +1 -1
  559. package/out/zero-protocol/src/ast.js +13 -14
  560. package/out/zero-protocol/src/ast.js.map +1 -1
  561. package/out/zero-protocol/src/down.d.ts +29 -29
  562. package/out/zero-protocol/src/query-hash.d.ts.map +1 -1
  563. package/out/zero-protocol/src/query-hash.js +2 -5
  564. package/out/zero-protocol/src/query-hash.js.map +1 -1
  565. package/out/zero-react/src/use-query.d.ts +5 -4
  566. package/out/zero-react/src/use-query.d.ts.map +1 -1
  567. package/out/zero-react/src/use-query.js +62 -4
  568. package/out/zero-react/src/use-query.js.map +1 -1
  569. package/out/zero-react/src/zero.js +1 -0
  570. package/out/zero-server/src/adapters/drizzle.d.ts +2 -1
  571. package/out/zero-server/src/adapters/drizzle.d.ts.map +1 -1
  572. package/out/zero-server/src/adapters/drizzle.js +12 -7
  573. package/out/zero-server/src/adapters/drizzle.js.map +1 -1
  574. package/out/zero-server/src/adapters/kysely.d.ts +2 -1
  575. package/out/zero-server/src/adapters/kysely.d.ts.map +1 -1
  576. package/out/zero-server/src/adapters/kysely.js +8 -2
  577. package/out/zero-server/src/adapters/kysely.js.map +1 -1
  578. package/out/zero-server/src/adapters/pg.d.ts +1 -0
  579. package/out/zero-server/src/adapters/pg.d.ts.map +1 -1
  580. package/out/zero-server/src/adapters/pg.js +8 -2
  581. package/out/zero-server/src/adapters/pg.js.map +1 -1
  582. package/out/zero-server/src/adapters/postgresjs.d.ts +1 -0
  583. package/out/zero-server/src/adapters/postgresjs.d.ts.map +1 -1
  584. package/out/zero-server/src/adapters/postgresjs.js +7 -1
  585. package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
  586. package/out/zero-server/src/adapters/prisma.d.ts +3 -2
  587. package/out/zero-server/src/adapters/prisma.d.ts.map +1 -1
  588. package/out/zero-server/src/adapters/prisma.js +8 -2
  589. package/out/zero-server/src/adapters/prisma.js.map +1 -1
  590. package/out/zero-server/src/custom.d.ts +5 -1
  591. package/out/zero-server/src/custom.d.ts.map +1 -1
  592. package/out/zero-server/src/custom.js +6 -3
  593. package/out/zero-server/src/custom.js.map +1 -1
  594. package/out/zero-server/src/logging.d.ts +2 -2
  595. package/out/zero-server/src/logging.d.ts.map +1 -1
  596. package/out/zero-server/src/logging.js +2 -2
  597. package/out/zero-server/src/logging.js.map +1 -1
  598. package/out/zero-server/src/mod.d.ts +1 -1
  599. package/out/zero-server/src/mod.d.ts.map +1 -1
  600. package/out/zero-server/src/pg-query-executor.d.ts +2 -2
  601. package/out/zero-server/src/pg-query-executor.d.ts.map +1 -1
  602. package/out/zero-server/src/pg-query-executor.js +2 -2
  603. package/out/zero-server/src/pg-query-executor.js.map +1 -1
  604. package/out/zero-server/src/process-mutations.d.ts +12 -3
  605. package/out/zero-server/src/process-mutations.d.ts.map +1 -1
  606. package/out/zero-server/src/process-mutations.js +13 -8
  607. package/out/zero-server/src/process-mutations.js.map +1 -1
  608. package/out/zero-server/src/push-processor.d.ts +8 -2
  609. package/out/zero-server/src/push-processor.d.ts.map +1 -1
  610. package/out/zero-server/src/push-processor.js +12 -4
  611. package/out/zero-server/src/push-processor.js.map +1 -1
  612. package/out/zero-server/src/schema.d.ts +2 -2
  613. package/out/zero-server/src/schema.d.ts.map +1 -1
  614. package/out/zero-server/src/schema.js +2 -2
  615. package/out/zero-server/src/schema.js.map +1 -1
  616. package/out/zero-server/src/zql-database.d.ts +21 -1
  617. package/out/zero-server/src/zql-database.d.ts.map +1 -1
  618. package/out/zero-server/src/zql-database.js +33 -2
  619. package/out/zero-server/src/zql-database.js.map +1 -1
  620. package/out/zero-solid/src/solid-view.d.ts +17 -0
  621. package/out/zero-solid/src/solid-view.d.ts.map +1 -1
  622. package/out/zero-solid/src/solid-view.js +39 -1
  623. package/out/zero-solid/src/solid-view.js.map +1 -1
  624. package/out/zero-solid/src/use-query.js +1 -2
  625. package/out/zero-solid/src/use-query.js.map +1 -1
  626. package/out/zero-solid/src/zero.js +1 -0
  627. package/out/zql/src/builder/builder.d.ts +25 -0
  628. package/out/zql/src/builder/builder.d.ts.map +1 -1
  629. package/out/zql/src/builder/builder.js +69 -19
  630. package/out/zql/src/builder/builder.js.map +1 -1
  631. package/out/zql/src/builder/correlated-predicate-pushdown.d.ts +43 -0
  632. package/out/zql/src/builder/correlated-predicate-pushdown.d.ts.map +1 -0
  633. package/out/zql/src/builder/correlated-predicate-pushdown.js +161 -0
  634. package/out/zql/src/builder/correlated-predicate-pushdown.js.map +1 -0
  635. package/out/zql/src/builder/debug-delegate.d.ts +6 -1
  636. package/out/zql/src/builder/debug-delegate.d.ts.map +1 -1
  637. package/out/zql/src/builder/debug-delegate.js +14 -2
  638. package/out/zql/src/builder/debug-delegate.js.map +1 -1
  639. package/out/zql/src/ivm/array-view.d.ts +29 -0
  640. package/out/zql/src/ivm/array-view.d.ts.map +1 -1
  641. package/out/zql/src/ivm/array-view.js +58 -9
  642. package/out/zql/src/ivm/array-view.js.map +1 -1
  643. package/out/zql/src/ivm/cap.d.ts +2 -1
  644. package/out/zql/src/ivm/cap.d.ts.map +1 -1
  645. package/out/zql/src/ivm/cap.js +14 -4
  646. package/out/zql/src/ivm/cap.js.map +1 -1
  647. package/out/zql/src/ivm/connection-index.d.ts +68 -0
  648. package/out/zql/src/ivm/connection-index.d.ts.map +1 -0
  649. package/out/zql/src/ivm/connection-index.js +149 -0
  650. package/out/zql/src/ivm/connection-index.js.map +1 -0
  651. package/out/zql/src/ivm/data.d.ts.map +1 -1
  652. package/out/zql/src/ivm/data.js +8 -3
  653. package/out/zql/src/ivm/data.js.map +1 -1
  654. package/out/zql/src/ivm/deferred-input.d.ts.map +1 -1
  655. package/out/zql/src/ivm/deferred-input.js +3 -2
  656. package/out/zql/src/ivm/deferred-input.js.map +1 -1
  657. package/out/zql/src/ivm/exists.d.ts +3 -1
  658. package/out/zql/src/ivm/exists.d.ts.map +1 -1
  659. package/out/zql/src/ivm/exists.js +4 -1
  660. package/out/zql/src/ivm/exists.js.map +1 -1
  661. package/out/zql/src/ivm/fan-in.d.ts +6 -2
  662. package/out/zql/src/ivm/fan-in.d.ts.map +1 -1
  663. package/out/zql/src/ivm/fan-in.js +13 -5
  664. package/out/zql/src/ivm/fan-in.js.map +1 -1
  665. package/out/zql/src/ivm/fan-out.d.ts +5 -2
  666. package/out/zql/src/ivm/fan-out.d.ts.map +1 -1
  667. package/out/zql/src/ivm/fan-out.js +4 -0
  668. package/out/zql/src/ivm/fan-out.js.map +1 -1
  669. package/out/zql/src/ivm/filter-operators.d.ts +8 -6
  670. package/out/zql/src/ivm/filter-operators.d.ts.map +1 -1
  671. package/out/zql/src/ivm/filter-operators.js +19 -8
  672. package/out/zql/src/ivm/filter-operators.js.map +1 -1
  673. package/out/zql/src/ivm/filter.d.ts +5 -2
  674. package/out/zql/src/ivm/filter.d.ts.map +1 -1
  675. package/out/zql/src/ivm/filter.js +10 -4
  676. package/out/zql/src/ivm/filter.js.map +1 -1
  677. package/out/zql/src/ivm/flipped-join.d.ts +9 -4
  678. package/out/zql/src/ivm/flipped-join.d.ts.map +1 -1
  679. package/out/zql/src/ivm/flipped-join.js +97 -46
  680. package/out/zql/src/ivm/flipped-join.js.map +1 -1
  681. package/out/zql/src/ivm/join-index-tap.d.ts +33 -0
  682. package/out/zql/src/ivm/join-index-tap.d.ts.map +1 -0
  683. package/out/zql/src/ivm/join-index-tap.js +70 -0
  684. package/out/zql/src/ivm/join-index-tap.js.map +1 -0
  685. package/out/zql/src/ivm/join-index.d.ts +35 -0
  686. package/out/zql/src/ivm/join-index.d.ts.map +1 -0
  687. package/out/zql/src/ivm/join-index.js +141 -0
  688. package/out/zql/src/ivm/join-index.js.map +1 -0
  689. package/out/zql/src/ivm/join-utils.d.ts +6 -0
  690. package/out/zql/src/ivm/join-utils.d.ts.map +1 -1
  691. package/out/zql/src/ivm/join-utils.js +22 -1
  692. package/out/zql/src/ivm/join-utils.js.map +1 -1
  693. package/out/zql/src/ivm/join.d.ts +19 -1
  694. package/out/zql/src/ivm/join.d.ts.map +1 -1
  695. package/out/zql/src/ivm/join.js +107 -15
  696. package/out/zql/src/ivm/join.js.map +1 -1
  697. package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts +1 -1
  698. package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts.map +1 -1
  699. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +6 -4
  700. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
  701. package/out/zql/src/ivm/memory-source.d.ts +28 -3
  702. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  703. package/out/zql/src/ivm/memory-source.js +69 -33
  704. package/out/zql/src/ivm/memory-source.js.map +1 -1
  705. package/out/zql/src/ivm/memory-storage.d.ts +1 -0
  706. package/out/zql/src/ivm/memory-storage.d.ts.map +1 -1
  707. package/out/zql/src/ivm/memory-storage.js +1 -0
  708. package/out/zql/src/ivm/memory-storage.js.map +1 -1
  709. package/out/zql/src/ivm/operator.d.ts +45 -10
  710. package/out/zql/src/ivm/operator.d.ts.map +1 -1
  711. package/out/zql/src/ivm/operator.js +9 -4
  712. package/out/zql/src/ivm/operator.js.map +1 -1
  713. package/out/zql/src/ivm/push-accumulated.d.ts +6 -1
  714. package/out/zql/src/ivm/push-accumulated.d.ts.map +1 -1
  715. package/out/zql/src/ivm/push-accumulated.js +47 -2
  716. package/out/zql/src/ivm/push-accumulated.js.map +1 -1
  717. package/out/zql/src/ivm/skip.d.ts +2 -1
  718. package/out/zql/src/ivm/skip.d.ts.map +1 -1
  719. package/out/zql/src/ivm/skip.js +3 -0
  720. package/out/zql/src/ivm/skip.js.map +1 -1
  721. package/out/zql/src/ivm/take-gate.d.ts +57 -0
  722. package/out/zql/src/ivm/take-gate.d.ts.map +1 -0
  723. package/out/zql/src/ivm/take-gate.js +106 -0
  724. package/out/zql/src/ivm/take-gate.js.map +1 -0
  725. package/out/zql/src/ivm/take.d.ts +8 -2
  726. package/out/zql/src/ivm/take.d.ts.map +1 -1
  727. package/out/zql/src/ivm/take.js +139 -103
  728. package/out/zql/src/ivm/take.js.map +1 -1
  729. package/out/zql/src/ivm/union-fan-in.d.ts +3 -0
  730. package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
  731. package/out/zql/src/ivm/union-fan-in.js +63 -10
  732. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  733. package/out/zql/src/ivm/union-fan-out.d.ts +2 -1
  734. package/out/zql/src/ivm/union-fan-out.d.ts.map +1 -1
  735. package/out/zql/src/ivm/union-fan-out.js +5 -0
  736. package/out/zql/src/ivm/union-fan-out.js.map +1 -1
  737. package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
  738. package/out/zql/src/ivm/view-apply-change.js +9 -4
  739. package/out/zql/src/ivm/view-apply-change.js.map +1 -1
  740. package/out/zql/src/ivm/view.d.ts +15 -0
  741. package/out/zql/src/ivm/view.d.ts.map +1 -1
  742. package/out/zql/src/mutate/custom.d.ts +24 -1
  743. package/out/zql/src/mutate/custom.d.ts.map +1 -1
  744. package/out/zql/src/mutate/custom.js.map +1 -1
  745. package/out/zql/src/mutate/mutator-registry.d.ts.map +1 -1
  746. package/out/zql/src/mutate/mutator-registry.js +2 -2
  747. package/out/zql/src/mutate/mutator-registry.js.map +1 -1
  748. package/out/zql/src/planner/planner-builder.d.ts +23 -3
  749. package/out/zql/src/planner/planner-builder.d.ts.map +1 -1
  750. package/out/zql/src/planner/planner-builder.js +34 -17
  751. package/out/zql/src/planner/planner-builder.js.map +1 -1
  752. package/out/zql/src/planner/planner-connection.d.ts +58 -2
  753. package/out/zql/src/planner/planner-connection.d.ts.map +1 -1
  754. package/out/zql/src/planner/planner-connection.js +103 -11
  755. package/out/zql/src/planner/planner-connection.js.map +1 -1
  756. package/out/zql/src/planner/planner-debug.d.ts.map +1 -1
  757. package/out/zql/src/planner/planner-debug.js +3 -8
  758. package/out/zql/src/planner/planner-debug.js.map +1 -1
  759. package/out/zql/src/planner/planner-graph.d.ts +10 -0
  760. package/out/zql/src/planner/planner-graph.d.ts.map +1 -1
  761. package/out/zql/src/planner/planner-graph.js +14 -0
  762. package/out/zql/src/planner/planner-graph.js.map +1 -1
  763. package/out/zql/src/planner/planner-source.d.ts +2 -2
  764. package/out/zql/src/planner/planner-source.d.ts.map +1 -1
  765. package/out/zql/src/planner/planner-source.js +2 -2
  766. package/out/zql/src/planner/planner-source.js.map +1 -1
  767. package/out/zql/src/planner/planner-warnings.d.ts +83 -0
  768. package/out/zql/src/planner/planner-warnings.d.ts.map +1 -0
  769. package/out/zql/src/planner/planner-warnings.js +78 -0
  770. package/out/zql/src/planner/planner-warnings.js.map +1 -0
  771. package/out/zql/src/query/measure-push-operator.d.ts +2 -1
  772. package/out/zql/src/query/measure-push-operator.d.ts.map +1 -1
  773. package/out/zql/src/query/measure-push-operator.js +33 -4
  774. package/out/zql/src/query/measure-push-operator.js.map +1 -1
  775. package/out/zql/src/query/query-delegate-base.d.ts +4 -2
  776. package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
  777. package/out/zql/src/query/query-delegate-base.js +66 -33
  778. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  779. package/out/zql/src/query/query-delegate.d.ts +33 -6
  780. package/out/zql/src/query/query-delegate.d.ts.map +1 -1
  781. package/out/zql/src/query/query-impl.d.ts +1 -0
  782. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  783. package/out/zql/src/query/query-impl.js +6 -23
  784. package/out/zql/src/query/query-impl.js.map +1 -1
  785. package/out/zql/src/query/query-transitions.d.ts.map +1 -1
  786. package/out/zql/src/query/query-transitions.js +2 -5
  787. package/out/zql/src/query/query-transitions.js.map +1 -1
  788. package/out/zql/src/query/query.d.ts +11 -2
  789. package/out/zql/src/query/query.d.ts.map +1 -1
  790. package/out/zql/src/query/runnable-query-impl.d.ts +1 -0
  791. package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -1
  792. package/out/zql/src/query/runnable-query-impl.js +2 -10
  793. package/out/zql/src/query/runnable-query-impl.js.map +1 -1
  794. package/out/zql/src/query/typed-view.d.ts +1 -1
  795. package/out/zql/src/query/typed-view.d.ts.map +1 -1
  796. package/out/zqlite/src/database-storage.d.ts.map +1 -1
  797. package/out/zqlite/src/database-storage.js +9 -1
  798. package/out/zqlite/src/database-storage.js.map +1 -1
  799. package/out/zqlite/src/db.d.ts +9 -1
  800. package/out/zqlite/src/db.d.ts.map +1 -1
  801. package/out/zqlite/src/db.js +31 -27
  802. package/out/zqlite/src/db.js.map +1 -1
  803. package/out/zqlite/src/pending-delta.d.ts +110 -0
  804. package/out/zqlite/src/pending-delta.d.ts.map +1 -0
  805. package/out/zqlite/src/pending-delta.js +278 -0
  806. package/out/zqlite/src/pending-delta.js.map +1 -0
  807. package/out/zqlite/src/query-builder.d.ts +17 -1
  808. package/out/zqlite/src/query-builder.d.ts.map +1 -1
  809. package/out/zqlite/src/query-builder.js +111 -20
  810. package/out/zqlite/src/query-builder.js.map +1 -1
  811. package/out/zqlite/src/query-delegate.d.ts.map +1 -1
  812. package/out/zqlite/src/query-delegate.js +10 -7
  813. package/out/zqlite/src/query-delegate.js.map +1 -1
  814. package/out/zqlite/src/sqlite-cost-model.d.ts.map +1 -1
  815. package/out/zqlite/src/sqlite-cost-model.js +52 -1
  816. package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
  817. package/out/zqlite/src/sqlite-stat-fanout.d.ts.map +1 -1
  818. package/out/zqlite/src/sqlite-stat-fanout.js +5 -31
  819. package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
  820. package/out/zqlite/src/sqlite-stat4-sample.d.ts +37 -0
  821. package/out/zqlite/src/sqlite-stat4-sample.d.ts.map +1 -0
  822. package/out/zqlite/src/sqlite-stat4-sample.js +61 -0
  823. package/out/zqlite/src/sqlite-stat4-sample.js.map +1 -0
  824. package/out/zqlite/src/table-source.d.ts +83 -2
  825. package/out/zqlite/src/table-source.d.ts.map +1 -1
  826. package/out/zqlite/src/table-source.js +264 -38
  827. package/out/zqlite/src/table-source.js.map +1 -1
  828. package/package.json +3 -4
  829. package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts +0 -25
  830. package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts.map +0 -1
  831. package/out/replicache/src/kv/idb-store-with-mem-fallback.js +0 -83
  832. package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +0 -1
@@ -1,5 +1,6 @@
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";
4
5
  import { skipYields } from "../../../../zql/src/ivm/skip-yields.js";
5
6
  import { throwOutput } from "../../../../zql/src/ivm/operator.js";
@@ -14,13 +15,18 @@ import { resolveSimpleScalarSubqueries } from "../../../../zqlite/src/resolve-sc
14
15
  import { randInt } from "../../../../shared/src/rand.js";
15
16
  import { createSQLiteCostModel } from "../../../../zqlite/src/sqlite-cost-model.js";
16
17
  import { reloadPermissionsIfChanged } from "../../auth/load-permissions.js";
18
+ import { LogThrottle } from "../../observability/log-throttle.js";
17
19
  import { getOrCreateCounter, getOrCreateLatencyHistogram } from "../../observability/metrics.js";
18
20
  import "../../types/row-key.js";
19
21
  import { getSubscriptionState } from "../replicator/schema/replication-state.js";
20
22
  import { checkClientSchema } from "./client-schema.js";
23
+ import { planWarningMessage } from "./plan-warnings.js";
24
+ import { queryShape } from "./query-shape.js";
21
25
  import { rowIDSignatureUnit } from "./row-set-signature.js";
22
26
  import { ResetPipelinesSignal } from "./snapshotter.js";
23
27
  //#region ../zero-cache/src/services/view-syncer/pipeline-driver.ts
28
+ /** The most queries a log of an advancement timeout lists. */
29
+ var ADVANCE_TIMEOUT_LOG_MAX_QUERIES = 3;
24
30
  /**
25
31
  * No matter how fast hydration is, advancement is given at least this long to
26
32
  * complete before doing a pipeline reset.
@@ -33,6 +39,8 @@ var MIN_PROJECTED_ADVANCEMENT_SAMPLE_MS = 5;
33
39
  var MIN_PROJECTED_ADVANCEMENT_CHANGES = 16;
34
40
  var PROJECTED_ADVANCEMENT_RESET_MULTIPLIER = 1.5;
35
41
  var LATE_ADVANCEMENT_FINISH_PROGRESS = .8;
42
+ var planWarningLogThrottle = new LogThrottle({ windowMs: 60 * 6e4 });
43
+ var slowAdvanceLogThrottle = new LogThrottle({ windowMs: 5 * 6e4 });
36
44
  function randomID() {
37
45
  return randInt(1, Number.MAX_SAFE_INTEGER).toString(36);
38
46
  }
@@ -48,7 +56,7 @@ function minProjectedAdvancementSampleChanges(numChanges) {
48
56
  }
49
57
  function shouldResetProjectedAdvancement(elapsedMs, projectedTotalTimeMs, processedChanges, numChanges, totalHydrationTimeMs) {
50
58
  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;
59
+ return projectedTotalTimeMs - elapsedMs > advancementResetTimeLimitMs(totalHydrationTimeMs) * PROJECTED_ADVANCEMENT_RESET_MULTIPLIER;
52
60
  }
53
61
  function shouldFinishLateAdvancement(processedChanges, numChanges) {
54
62
  return numChanges > 0 && processedChanges / numChanges >= LATE_ADVANCEMENT_FINISH_PROGRESS;
@@ -77,9 +85,11 @@ var PipelineDriver = class {
77
85
  #shardID;
78
86
  #logConfig;
79
87
  #config;
88
+ #deferredWrites;
80
89
  #tableSpecs = /* @__PURE__ */ new Map();
81
90
  #allTableNames = /* @__PURE__ */ new Set();
82
91
  #costModels;
92
+ #planWarningThresholds;
83
93
  #yieldThresholdMs;
84
94
  #streamer = null;
85
95
  #hydrateContext = null;
@@ -89,17 +99,34 @@ var PipelineDriver = class {
89
99
  #permissions = null;
90
100
  #advanceTime = getOrCreateLatencyHistogram("sync", "ivm.advance-time", "Time to advance all queries for a given client group in response to a single change.");
91
101
  #conflictRowsDeleted = getOrCreateCounter("sync", "ivm.conflict-rows-deleted", "Number of rows deleted because they conflicted with added row");
102
+ #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
103
  #inspectorDelegate;
93
- constructor(lc, logConfig, snapshotter, shardID, storage, clientGroupID, inspectorDelegate, yieldThresholdMs, enablePlanner, config) {
104
+ #queryStats;
105
+ /**
106
+ * Passes the pipelines' metrics on to the inspector, and accounts the time
107
+ * spent pushing to each query to the advancement in progress.
108
+ */
109
+ #metricsDelegate = { addMetric: (metric, value, ...args) => {
110
+ this.#inspectorDelegate.addMetric(metric, value, ...args);
111
+ if (metric === "query-update-server") this.#recordAdvancePush(args[0], value);
112
+ } };
113
+ constructor(lc, logConfig, snapshotter, shardID, storage, clientGroupID, inspectorDelegate, yieldThresholdMs, enablePlanner, config, deferredWrites, queryStats) {
94
114
  this.#lc = lc.withContext("clientGroupID", clientGroupID);
95
115
  this.#snapshotter = snapshotter;
96
116
  this.#storage = storage;
97
117
  this.#shardID = shardID;
98
118
  this.#logConfig = logConfig;
99
119
  this.#config = config;
120
+ this.#deferredWrites = deferredWrites;
100
121
  this.#inspectorDelegate = inspectorDelegate;
101
122
  this.#costModels = enablePlanner ? /* @__PURE__ */ new WeakMap() : void 0;
123
+ const planWarningThresholds = {
124
+ rows: logConfig.planWarningRowThreshold,
125
+ cost: logConfig.planWarningCostThreshold
126
+ };
127
+ this.#planWarningThresholds = planWarningThresholds.rows > 0 || planWarningThresholds.cost > 0 ? planWarningThresholds : void 0;
102
128
  this.#yieldThresholdMs = yieldThresholdMs;
129
+ this.#queryStats = queryStats;
103
130
  }
104
131
  /**
105
132
  * Initializes the PipelineDriver to the current head of the database.
@@ -173,10 +200,23 @@ var PipelineDriver = class {
173
200
  }
174
201
  return this.#permissions;
175
202
  }
203
+ /**
204
+ * Advances the snapshot to the head of the database without diffing the
205
+ * change log, in preparation for hydrating queries at head.
206
+ *
207
+ * Throws a {@link ResetPipelinesSignal} if the change log records a
208
+ * schema change since the previous snapshot. The table specs (and any
209
+ * TableSources built from them) were computed at or before that snapshot
210
+ * and are stale with respect to the new head, so the caller must
211
+ * {@link reset()} before hydrating. ({@link advance()} detects this when
212
+ * the diff encounters the RESET op; this path skips the diff and so must
213
+ * check explicitly.)
214
+ */
176
215
  advanceWithoutDiff() {
177
- const { db, version } = this.#snapshotter.advanceWithoutDiff().curr;
178
- for (const table of this.#tables.values()) table.setDB(db.db);
179
- return version;
216
+ const { prev, curr } = this.#snapshotter.advanceWithoutDiff();
217
+ if (curr.schemaChangedSince(prev.version)) throw new ResetPipelinesSignal(`schema changed between ${prev.version} and ${curr.version}`, "schema-change");
218
+ for (const table of this.#tables.values()) table.setDB(curr.db.db);
219
+ return curr.version;
180
220
  }
181
221
  #ensureCostModelExistsIfEnabled(db) {
182
222
  let existing = this.#costModels?.get(db);
@@ -196,6 +236,7 @@ var PipelineDriver = class {
196
236
  this.#pipelines.delete(queryID);
197
237
  this.#destroyPipeline(queryID, pipeline, "destroy");
198
238
  }
239
+ this.#tables.clear();
199
240
  this.#rowSetSignatures.clear();
200
241
  this.#storage.destroy();
201
242
  this.#snapshotter.destroy();
@@ -204,18 +245,76 @@ var PipelineDriver = class {
204
245
  queries() {
205
246
  return this.#pipelines;
206
247
  }
248
+ /**
249
+ * Stats from the hydration of the pipeline for `queryID`, or `undefined` if
250
+ * the query has no pipeline.
251
+ */
252
+ hydrationStats(queryID) {
253
+ const pipeline = this.#pipelines.get(queryID);
254
+ return pipeline ? {
255
+ rowCount: pipeline.hydrationRowCount,
256
+ rowsRead: pipeline.hydrationRowsRead,
257
+ planWarnings: pipeline.planWarnings,
258
+ shape: pipeline.shape
259
+ } : void 0;
260
+ }
261
+ /**
262
+ * Logs what the planner warned about the plan it chose for `query`, at
263
+ * most once per query shape per {@link PLAN_WARNING_LOG_WINDOW_MS}.
264
+ */
265
+ #logPlanWarnings(shape, { queryHash, transformationHash, queryName }, warnings) {
266
+ if (!this.#lc.warn) return;
267
+ const suppressed = planWarningLogThrottle.admit(`${queryName ?? ""}:${shape.hash}`);
268
+ if (suppressed === void 0) return;
269
+ const messages = warnings.map(planWarningMessage);
270
+ this.#lc.warn(`Query plan warning${queryName === void 0 ? "" : ` for ${queryName}`}: ` + messages.join(" "), {
271
+ zeroEvent: "query-plan-warning",
272
+ queryHash,
273
+ transformationHash,
274
+ ...queryName !== void 0 && { queryName },
275
+ queryShape: shape.hash,
276
+ warnings,
277
+ ...suppressed > 0 && { suppressedSinceLastLog: suppressed },
278
+ zql: shape.zql
279
+ });
280
+ }
281
+ #totalRowsRead() {
282
+ let total = 0;
283
+ for (const table of this.#tables.values()) total += table.rowsRead;
284
+ return total;
285
+ }
207
286
  totalHydrationTimeMs() {
208
287
  let total = 0;
209
288
  for (const pipeline of this.#pipelines.values()) total += pipeline.hydrationTimeMs;
210
289
  return total;
211
290
  }
212
- #logQueryPipelineLifecycle({ zeroEvent, pipelineRunID, queryHash, transformationHash, queryName, hydrationReason, stopReason, hydrationTimeMs, hydrationRowCount, pipelineLifetimeMs }) {
291
+ /**
292
+ * The rows the sources hold in memory for the advancement in progress.
293
+ * The advancement's reservation from the {@link DeferredWritesBudget}
294
+ * bounds this.
295
+ */
296
+ get pendingRows() {
297
+ let total = 0;
298
+ for (const source of this.#tables.values()) total += source.pendingRows;
299
+ return total;
300
+ }
301
+ /**
302
+ * The estimated bytes of {@link pendingRows}, which are added to the
303
+ * {@link DeferredWritesBudget}'s held bytes as the advancement goes.
304
+ */
305
+ get pendingBytes() {
306
+ let total = 0;
307
+ for (const source of this.#tables.values()) total += source.pendingBytes;
308
+ return total;
309
+ }
310
+ #logQueryPipelineLifecycle({ zeroEvent, pipelineRunID, queryHash, transformationHash, queryName, hydrationReason, stopReason, hydrationTimeMs, hydrationRowCount, hydrationRowsRead, pipelineLifetimeMs }) {
213
311
  let lc = this.#lc.withContext("zeroEvent", zeroEvent).withContext("pipelineRunID", pipelineRunID).withContext("queryHash", queryHash).withContext("transformationHash", transformationHash);
214
312
  if (queryName !== void 0) lc = lc.withContext("queryName", queryName);
215
313
  if (hydrationReason !== void 0) lc = lc.withContext("hydrationReason", hydrationReason);
216
314
  if (stopReason !== void 0) lc = lc.withContext("stopReason", stopReason);
217
315
  if (hydrationTimeMs !== void 0) lc = lc.withContext("hydrationTimeMs", hydrationTimeMs);
218
316
  if (hydrationRowCount !== void 0) lc = lc.withContext("hydrationRowCount", hydrationRowCount);
317
+ if (hydrationRowsRead !== void 0) lc = lc.withContext("hydrationRowsRead", hydrationRowsRead);
219
318
  if (pipelineLifetimeMs !== void 0) lc = lc.withContext("pipelineLifetimeMs", pipelineLifetimeMs);
220
319
  lc.info?.("query pipeline lifecycle");
221
320
  }
@@ -232,11 +331,15 @@ var PipelineDriver = class {
232
331
  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
332
  }
234
333
  }
334
+ #disableCorrelatedPredicatePushdown() {
335
+ return this.#config?.enableCorrelatedPredicatePushdown === false;
336
+ }
235
337
  #resolveScalarSubqueries(ast) {
236
338
  const companionRows = [];
237
339
  const companionInputs = [];
238
340
  const executor = (subqueryAST, childField) => {
239
341
  const input = buildPipeline(subqueryAST, {
342
+ disableCorrelatedPredicatePushdown: this.#disableCorrelatedPredicatePushdown(),
240
343
  getSource: (name) => this.#getSource(name),
241
344
  createStorage: () => this.#createStorage(),
242
345
  decorateSourceInput: (input) => input,
@@ -244,20 +347,25 @@ var PipelineDriver = class {
244
347
  addEdge() {},
245
348
  decorateFilterInput: (input) => input
246
349
  }, "scalar-subquery");
350
+ companionInputs.push(input);
247
351
  let node;
248
352
  for (const n of skipYields(input.fetch({}))) node ??= n;
249
- if (!node) {
250
- companionInputs.push(input);
251
- return;
252
- }
353
+ if (!node) return;
253
354
  companionRows.push({
254
355
  table: subqueryAST.table,
255
356
  row: node.row
256
357
  });
257
- companionInputs.push(input);
258
358
  return node.row[childField] ?? null;
259
359
  };
260
- const { ast: resolved, companions, ignoredScalarHints } = resolveSimpleScalarSubqueries(ast, this.#tableSpecs, executor);
360
+ let resolved;
361
+ let companions;
362
+ let ignoredScalarHints;
363
+ try {
364
+ ({ast: resolved, companions, ignoredScalarHints} = resolveSimpleScalarSubqueries(ast, this.#tableSpecs, executor));
365
+ } catch (e) {
366
+ for (const input of companionInputs) input.destroy();
367
+ throw e;
368
+ }
261
369
  return {
262
370
  ast: resolved,
263
371
  companionRows,
@@ -288,6 +396,7 @@ var PipelineDriver = class {
288
396
  assert(this.initialized(), "Pipeline driver must be initialized before adding queries");
289
397
  this.removeQuery(queryID, "replace-query");
290
398
  const pipelineRunID = randomID();
399
+ const shape = queryShape(query);
291
400
  this.#logQueryPipelineLifecycle({
292
401
  zeroEvent: "query-pipeline-hydrate-start",
293
402
  pipelineRunID,
@@ -296,33 +405,47 @@ var PipelineDriver = class {
296
405
  queryName,
297
406
  hydrationReason
298
407
  });
299
- const debugDelegate = runtimeDebugFlags.trackRowsVended ? new Debug() : void 0;
408
+ const debugDelegate = runtimeDebugFlags.trackRowsVended ? new Debug(true) : void 0;
300
409
  const costModel = this.#ensureCostModelExistsIfEnabled(this.#snapshotter.current().db.db);
301
410
  assert(this.#advanceContext === null, "Cannot hydrate while advance is in progress");
302
411
  this.#hydrateContext = { timer };
412
+ const rowsReadAtStart = this.#totalRowsRead();
303
413
  let hydrationFinished = false;
304
414
  let hydrationFailed = false;
305
415
  let hydrationRowCount = 0;
416
+ let planWarnings = [];
417
+ const planWarningThresholds = this.#planWarningThresholds;
418
+ let builtInputs = [];
306
419
  try {
307
420
  const { ast: resolvedQuery, companionRows, companions: companionMeta, companionInputs, ignoredScalarHints } = this.#resolveScalarSubqueries(query);
421
+ builtInputs = [...companionInputs];
308
422
  this.#warnIgnoredScalarHints(queryID, ignoredScalarHints);
309
423
  const input = buildPipeline(resolvedQuery, {
310
424
  debug: debugDelegate,
311
425
  enableNotExists: true,
426
+ disableCorrelatedPredicatePushdown: this.#disableCorrelatedPredicatePushdown(),
427
+ enablePlannerAwarePushdown: this.#config?.enablePlannerAwarePushdown !== false,
312
428
  getSource: (name) => this.#getSource(name),
313
429
  createStorage: () => this.#createStorage(),
314
- decorateSourceInput: (input, _queryID) => new MeasurePushOperator(new QueryFailureLoggingOperator(this.#lc, input, queryID, transformationHash, queryName), queryID, this.#inspectorDelegate, "query-update-server"),
430
+ decorateSourceInput: (input, _queryID) => new MeasurePushOperator(new QueryFailureLoggingOperator(this.#lc, input, queryID, transformationHash, queryName), queryID, this.#metricsDelegate, "query-update-server"),
315
431
  decorateInput: (input) => input,
316
432
  addEdge() {},
317
- decorateFilterInput: (input) => input
433
+ decorateFilterInput: (input) => input,
434
+ planWarnings: planWarningThresholds && {
435
+ thresholds: planWarningThresholds,
436
+ report: (warnings) => {
437
+ planWarnings = warnings;
438
+ }
439
+ }
318
440
  }, queryID, costModel);
441
+ builtInputs.push(input);
442
+ if (planWarnings.length > 0) this.#logPlanWarnings(shape, {
443
+ queryHash: queryID,
444
+ transformationHash,
445
+ queryName
446
+ }, planWarnings);
319
447
  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
- } });
448
+ input.setOutput({ push: (change) => this.#streamPushed(queryID, schema, change) });
326
449
  for (const change of hydrateInternal(input, queryID, must(this.#primaryKeys), this.#tableSpecs)) {
327
450
  if (change !== "yield") hydrationRowCount++;
328
451
  yield change;
@@ -339,6 +462,7 @@ var PipelineDriver = class {
339
462
  };
340
463
  }
341
464
  const hydrationTimeMs = timer.totalElapsed();
465
+ const hydrationRowsRead = this.#totalRowsRead() - rowsReadAtStart;
342
466
  if (runtimeDebugFlags.trackRowCountsVended) {
343
467
  if (hydrationTimeMs > this.#logConfig.slowHydrateThreshold) {
344
468
  let totalRowsConsidered = 0;
@@ -371,10 +495,7 @@ var PipelineDriver = class {
371
495
  case 3: return [];
372
496
  }
373
497
  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 [];
498
+ return this.#streamPushed(queryID, companionSchema, change);
378
499
  } });
379
500
  liveCompanions.push({
380
501
  input: companionInput,
@@ -387,15 +508,29 @@ var PipelineDriver = class {
387
508
  input,
388
509
  hydrationTimeMs,
389
510
  hydrationRowCount,
511
+ hydrationRowsRead,
512
+ planWarnings,
390
513
  hydrationReason,
391
514
  pipelineRunID,
392
515
  pipelineReadyAtMs,
393
516
  transformedAst: resolvedQuery,
517
+ originalAst: query,
518
+ shape,
394
519
  transformationHash,
395
520
  ...queryName !== void 0 && { queryName },
396
521
  companions: liveCompanions
397
522
  });
398
523
  hydrationFinished = true;
524
+ this.#queryStats?.recordHydration({
525
+ queryName,
526
+ shape
527
+ }, {
528
+ outcome: "finished",
529
+ timeMs: hydrationTimeMs,
530
+ rowCount: hydrationRowCount,
531
+ rowsRead: hydrationRowsRead,
532
+ planWarnings
533
+ });
399
534
  this.#logQueryPipelineLifecycle({
400
535
  zeroEvent: "query-pipeline-hydrate-finish",
401
536
  pipelineRunID,
@@ -404,10 +539,18 @@ var PipelineDriver = class {
404
539
  queryName,
405
540
  hydrationReason,
406
541
  hydrationTimeMs,
407
- hydrationRowCount
542
+ hydrationRowCount,
543
+ hydrationRowsRead
408
544
  });
409
545
  } catch (e) {
410
546
  hydrationFailed = true;
547
+ this.#queryStats?.recordHydration({
548
+ queryName,
549
+ shape
550
+ }, {
551
+ outcome: "failed",
552
+ timeMs: timer.totalElapsed()
553
+ });
411
554
  this.#logQueryPipelineLifecycle({
412
555
  zeroEvent: "query-pipeline-hydrate-failed",
413
556
  pipelineRunID,
@@ -425,16 +568,30 @@ var PipelineDriver = class {
425
568
  }, "query hydration failed", e);
426
569
  throw e;
427
570
  } 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
- });
571
+ if (!hydrationFinished && !hydrationFailed) {
572
+ this.#queryStats?.recordHydration({
573
+ queryName,
574
+ shape
575
+ }, {
576
+ outcome: "aborted",
577
+ timeMs: timer.totalElapsed()
578
+ });
579
+ this.#logQueryPipelineLifecycle({
580
+ zeroEvent: "query-pipeline-hydrate-aborted",
581
+ pipelineRunID,
582
+ queryHash: queryID,
583
+ transformationHash,
584
+ queryName,
585
+ hydrationReason,
586
+ hydrationTimeMs: timer.totalElapsed(),
587
+ hydrationRowCount
588
+ });
589
+ }
590
+ if (!hydrationFinished) {
591
+ for (const input of builtInputs) input.destroy();
592
+ this.#pruneUnusedTables();
593
+ this.#rowSetSignatures.delete(queryID);
594
+ }
438
595
  this.#hydrateContext = null;
439
596
  }
440
597
  }
@@ -447,9 +604,13 @@ var PipelineDriver = class {
447
604
  if (pipeline) {
448
605
  this.#pipelines.delete(queryID);
449
606
  this.#destroyPipeline(queryID, pipeline, stopReason);
607
+ this.#pruneUnusedTables();
450
608
  }
451
609
  this.#rowSetSignatures.delete(queryID);
452
610
  }
611
+ #pruneUnusedTables() {
612
+ for (const [table, source] of this.#tables.entries()) if (!source.hasConnections()) this.#tables.delete(table);
613
+ }
453
614
  #destroyPipeline(queryID, pipeline, stopReason) {
454
615
  this.#logQueryPipelineLifecycle({
455
616
  zeroEvent: "query-pipeline-stop",
@@ -516,7 +677,7 @@ var PipelineDriver = class {
516
677
  */
517
678
  advance(timer) {
518
679
  assert(this.initialized(), "Pipeline driver must be initialized before advancing");
519
- const diff = this.#snapshotter.advance(this.#tableSpecs, this.#allTableNames);
680
+ const diff = this.#snapshotter.advance(this.#tableSpecs, this.#allTableNames, this.#tables, "divergent");
520
681
  const { prev, curr, changes } = diff;
521
682
  this.#lc.debug?.(`advance ${prev.version} => ${curr.version}: ${changes} changes`);
522
683
  return {
@@ -528,26 +689,38 @@ var PipelineDriver = class {
528
689
  *#advance(diff, timer, numChanges) {
529
690
  assert(this.#hydrateContext === null, "Cannot advance while hydration is in progress");
530
691
  const totalHydrationTimeMs = this.totalHydrationTimeMs();
531
- this.#advanceContext = {
692
+ const advanceContext = {
532
693
  timer,
533
694
  totalHydrationTimeMs,
534
695
  numChanges,
696
+ reservedRows: void 0,
697
+ heldBytes: 0,
535
698
  currentChangeStartMs: void 0,
536
- pos: 0
699
+ pos: 0,
700
+ currentTable: void 0,
701
+ queryStats: /* @__PURE__ */ new Map()
537
702
  };
538
- this.#lc.debug?.(`starting pipeline advancement of ${numChanges} changes with an advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`);
703
+ this.#advanceContext = advanceContext;
704
+ let timedOut = false;
539
705
  try {
540
- for (const { table, prevValues, nextValue } of diff) {
706
+ advanceContext.reservedRows = this.#reserveDeferredWrites(numChanges);
707
+ const deferWrites = advanceContext.reservedRows !== void 0;
708
+ if (deferWrites) diff.setPrevWrites("none");
709
+ for (const table of this.#tables.values()) table.setDeferWrites(deferWrites);
710
+ 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"}).`);
711
+ for (const { table, prevValues: probedPrevValues, nextValue, rowKey } of diff) {
541
712
  if (this.#shouldAdvanceYieldMaybeAbortAdvance()) yield "yield";
542
713
  const start = timer.totalElapsed();
543
- const advanceContext = must(this.#advanceContext);
544
714
  advanceContext.currentChangeStartMs = start;
545
- let type;
715
+ advanceContext.currentTable = table;
716
+ let holds = "fits";
546
717
  try {
547
718
  try {
548
719
  const tableSource = this.#tables.get(table);
549
720
  if (!tableSource) continue;
550
721
  const primaryKey = mustGetPrimaryKey(this.#primaryKeys, table);
722
+ if (nextValue !== null && !this.#reserveSecondRow(advanceContext, rowKey, primaryKey)) holds = "rows";
723
+ const prevValues = tableSource.reconcilePendingConflicts(probedPrevValues, nextValue, rowKey, this.#tableSpecs.get(table)?.tableSpec.uniqueKeys ?? []);
551
724
  let editOldRow = void 0;
552
725
  for (const prevValue of prevValues) if (nextValue && deepEqual(getRowKey(primaryKey, prevValue), getRowKey(primaryKey, nextValue))) editOldRow = prevValue;
553
726
  else {
@@ -560,34 +733,198 @@ var PipelineDriver = class {
560
733
  advanceContext.pos++;
561
734
  }
562
735
  this.#shouldAdvanceYieldMaybeAbortAdvance(false);
736
+ if (holds === "fits") holds = this.#holdPendingRows(advanceContext);
563
737
  } finally {
564
738
  advanceContext.currentChangeStartMs = void 0;
565
739
  }
566
740
  const elapsed = timer.totalElapsed() - start;
567
- this.#advanceTime.recordMs(elapsed, {
568
- table,
569
- type
570
- });
741
+ this.#advanceTime.recordMs(elapsed, { table });
742
+ if (holds !== "fits") yield* this.#writeThrough(advanceContext, diff, holds);
571
743
  }
572
744
  const { curr } = diff;
573
745
  for (const table of this.#tables.values()) table.setDB(curr.db.db);
574
746
  this.#ensureCostModelExistsIfEnabled(curr.db.db);
575
747
  this.#lc.debug?.(`Advanced to ${curr.version}`);
748
+ this.#logSlowAdvances(advanceContext);
749
+ } catch (e) {
750
+ if (e instanceof ResetPipelinesSignal && e.reason === "advancement-timeout") {
751
+ timedOut = true;
752
+ this.#logAdvanceTimeout(advanceContext, e);
753
+ }
754
+ throw e;
576
755
  } finally {
756
+ if (advanceContext.reservedRows !== void 0) for (const table of this.#tables.values()) table.discardPendingChanges();
757
+ this.#releaseDeferredWrites(advanceContext);
577
758
  this.#advanceContext = null;
759
+ this.#recordAdvanceStats(advanceContext, timedOut);
760
+ }
761
+ }
762
+ /** Accounts the time each query took in an advancement to its shape. */
763
+ #recordAdvanceStats({ queryStats }, timedOut) {
764
+ if (this.#queryStats === void 0) return;
765
+ for (const [queryID, { timeMs, changes }] of queryStats) {
766
+ const pipeline = this.#pipelines.get(queryID);
767
+ if (pipeline !== void 0) this.#queryStats.recordAdvance(pipeline, {
768
+ timeMs,
769
+ changes,
770
+ timedOut
771
+ });
772
+ }
773
+ }
774
+ /**
775
+ * Decides how the sources apply an advancement's changes: in memory if
776
+ * they fit in the worker's {@link DeferredWritesBudget}, and otherwise
777
+ * written through to the `prev` snapshot. Returns the number of rows
778
+ * reserved if they are held in memory.
779
+ */
780
+ #reserveDeferredWrites(numChanges) {
781
+ const budget = this.#deferredWrites;
782
+ if (!budget) return;
783
+ if (budget.tryReserve(numChanges)) return numChanges;
784
+ this.#deferredWritesFallbacks.add(1, { stage: "start" });
785
+ this.#lc.debug?.(`writing through ${numChanges} changes: ${budget.reservedRows} rows of the deferred writes budget are reserved`);
786
+ }
787
+ /**
788
+ * If the change log identifies the rows of a table by a key other than its
789
+ * primary key here, an entry that sets a row can change its primary key,
790
+ * which is two rows to a source: the old and the new. (An entry that removes
791
+ * a row removes the one row its key identifies.) Reserves the second row for
792
+ * such an entry, if the advancement holds its changes in memory, and
793
+ * returns whether it fit.
794
+ */
795
+ #reserveSecondRow(advanceContext, rowKey, primaryKey) {
796
+ if (advanceContext.reservedRows === void 0 || isKeyedBy(rowKey, primaryKey)) return true;
797
+ if (!must(this.#deferredWrites).tryReserveMore(1)) return false;
798
+ advanceContext.reservedRows++;
799
+ return true;
800
+ }
801
+ /**
802
+ * Writes the changes that an advancement holds in memory through to the
803
+ * `prev` snapshot, and the rest of its changes after them, when they no
804
+ * longer fit (see {@link HeldRows}). The advancement then continues as if
805
+ * it had written through from the start.
806
+ */
807
+ *#writeThrough(advanceContext, diff, reason) {
808
+ const budget = must(this.#deferredWrites);
809
+ this.#deferredWritesFallbacks.add(1, {
810
+ stage: "partway",
811
+ reason
812
+ });
813
+ 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})`);
814
+ diff.setPrevWrites("divergent");
815
+ for (const source of this.#tables.values()) yield* source.writePendingChanges();
816
+ this.#releaseDeferredWrites(advanceContext);
817
+ }
818
+ #releaseDeferredWrites(advanceContext) {
819
+ const { reservedRows, heldBytes } = advanceContext;
820
+ if (reservedRows !== void 0) {
821
+ must(this.#deferredWrites).release(reservedRows, heldBytes);
822
+ advanceContext.reservedRows = void 0;
823
+ advanceContext.heldBytes = 0;
578
824
  }
579
825
  }
826
+ #recordAdvancePush(queryID, timeMs) {
827
+ const advance = this.#advanceContext;
828
+ if (advance === null) return;
829
+ const stats = getOrInsertComputed(advance.queryStats, queryID, () => ({
830
+ timeMs: 0,
831
+ changes: 0,
832
+ lastPos: -1,
833
+ timeMsByTable: /* @__PURE__ */ new Map()
834
+ }));
835
+ stats.timeMs += timeMs;
836
+ if (stats.lastPos !== advance.pos) {
837
+ stats.lastPos = advance.pos;
838
+ stats.changes++;
839
+ }
840
+ const table = advance.currentTable;
841
+ if (table !== void 0) stats.timeMsByTable.set(table, (stats.timeMsByTable.get(table) ?? 0) + timeMs);
842
+ }
843
+ /**
844
+ * The identity of the query of the pipeline for `queryID` and its
845
+ * {@link queryShape}, for logging.
846
+ */
847
+ #queryForLog(queryID) {
848
+ const pipeline = this.#pipelines.get(queryID);
849
+ if (pipeline === void 0) return;
850
+ const { transformationHash, queryName, shape } = pipeline;
851
+ return {
852
+ queryName,
853
+ shape,
854
+ fields: {
855
+ queryHash: queryID,
856
+ transformationHash,
857
+ ...queryName !== void 0 && { queryName },
858
+ queryShape: shape.hash
859
+ }
860
+ };
861
+ }
862
+ /**
863
+ * Logs each query whose pushes took longer than the slow advance
864
+ * threshold, at most once per query shape per
865
+ * {@link SLOW_ADVANCE_LOG_WINDOW_MS}.
866
+ */
867
+ #logSlowAdvances({ queryStats, numChanges }) {
868
+ if (!this.#lc.warn) return;
869
+ for (const [queryID, stats] of queryStats) {
870
+ if (stats.timeMs <= this.#logConfig.slowAdvanceThreshold) continue;
871
+ const query = this.#queryForLog(queryID);
872
+ if (query === void 0) continue;
873
+ const suppressed = slowAdvanceLogThrottle.admit(`${query.queryName ?? ""}:${query.shape.hash}`);
874
+ if (suppressed === void 0) continue;
875
+ this.#lc.warn(`Slow query advancement${query.queryName === void 0 ? "" : ` for ${query.queryName}`}: ${Math.round(stats.timeMs)} ms for ${stats.changes} of ${numChanges} changes`, {
876
+ zeroEvent: "query-slow-advance",
877
+ ...query.fields,
878
+ advanceTimeMs: stats.timeMs,
879
+ changes: stats.changes,
880
+ advancementChanges: numChanges,
881
+ timeMsByTable: Object.fromEntries(stats.timeMsByTable),
882
+ ...suppressed > 0 && { suppressedSinceLastLog: suppressed },
883
+ zql: query.shape.zql
884
+ });
885
+ }
886
+ }
887
+ /**
888
+ * Logs the queries that took the most time in an advancement that timed
889
+ * out, since the reset that follows would otherwise not say what was slow.
890
+ * Throttled per query shape of the slowest query.
891
+ */
892
+ #logAdvanceTimeout({ queryStats, numChanges }, reset) {
893
+ if (!this.#lc.warn) return;
894
+ const slowest = [...queryStats].toSorted(([, a], [, b]) => b.timeMs - a.timeMs).slice(0, ADVANCE_TIMEOUT_LOG_MAX_QUERIES).flatMap(([queryID, stats]) => {
895
+ const query = this.#queryForLog(queryID);
896
+ return query ? [{
897
+ query,
898
+ stats
899
+ }] : [];
900
+ });
901
+ if (slowest.length === 0) return;
902
+ const suppressed = slowAdvanceLogThrottle.admit(`timeout:${slowest[0].query.queryName ?? ""}:${slowest[0].query.shape.hash}`);
903
+ if (suppressed === void 0) return;
904
+ const summary = slowest.map(({ query, stats }) => `${query.queryName ?? query.fields.queryHash} (${Math.round(stats.timeMs)} ms)`).join(", ");
905
+ this.#lc.warn(`Advancement of ${numChanges} changes timed out. The queries that took the most time: ${summary}`, {
906
+ zeroEvent: "query-advance-timeout",
907
+ reason: reset.message,
908
+ advancementChanges: numChanges,
909
+ queries: slowest.map(({ query, stats }) => ({
910
+ ...query.fields,
911
+ advanceTimeMs: stats.timeMs,
912
+ changes: stats.changes,
913
+ zql: query.shape.zql
914
+ })),
915
+ ...suppressed > 0 && { suppressedSinceLastLog: suppressed }
916
+ });
917
+ }
580
918
  /** Implements `BuilderDelegate.getSource()` */
581
919
  #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;
920
+ return getOrInsertComputed(this.#tables, tableName, (tableName) => {
921
+ const tableSpec = mustGetTableSpec(this.#tableSpecs, tableName);
922
+ const primaryKey = mustGetPrimaryKey(this.#primaryKeys, tableName);
923
+ const { db } = this.#snapshotter.current();
924
+ const source = new TableSource(this.#lc, this.#logConfig, db.db, tableName, tableSpec.zqlSpec, primaryKey, () => this.#shouldYield(), { skipUnobservableChanges: true });
925
+ this.#lc.debug?.(`created TableSource for ${tableName}`);
926
+ return source;
927
+ });
591
928
  }
592
929
  #shouldYield() {
593
930
  if (this.#hydrateContext) return this.#hydrateContext.timer.elapsedLap() > this.#yieldThresholdMs();
@@ -608,9 +945,31 @@ var PipelineDriver = class {
608
945
  const projectedTotalTimeMs = projectedAdvancementTimeMs(elapsed, pos, numChanges);
609
946
  const shouldFinish = shouldFinishLateAdvancement(pos, numChanges);
610
947
  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");
948
+ if (!shouldFinish && elapsed > MIN_ADVANCEMENT_TIME_LIMIT_MS && elapsed > totalHydrationTimeMs / 2 && (projectedTotalTimeMs === void 0 || projectedTotalTimeMs - elapsed > totalHydrationTimeMs)) 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");
612
949
  return checkYield && advanceTimer.elapsedLap() > this.#yieldThresholdMs();
613
950
  }
951
+ /**
952
+ * The rows an advancement holds in memory are bounded by its reservation,
953
+ * but their width is not known in advance. So the bytes they are estimated
954
+ * to hold are added to those held by the other advancements on this worker.
955
+ * Says whether that takes them past the budget, or if the rows are not
956
+ * bounded by the reservation after all.
957
+ */
958
+ #holdPendingRows(advanceContext) {
959
+ const { reservedRows, heldBytes, pos, numChanges } = advanceContext;
960
+ if (reservedRows === void 0) return "fits";
961
+ const budget = must(this.#deferredWrites);
962
+ const rows = this.pendingRows;
963
+ const bytes = this.pendingBytes;
964
+ advanceContext.heldBytes = bytes;
965
+ const bytesFit = budget.holdBytes(bytes - heldBytes);
966
+ if (rows > reservedRows) {
967
+ budget.recordRowOverrun();
968
+ this.#lc.error?.(`Advancement holds ${rows} rows at ${pos} of ${numChanges} changes, more than the ${reservedRows} it reserved. Writing through the rest.`);
969
+ return "row-overrun";
970
+ }
971
+ return bytesFit ? "fits" : "bytes";
972
+ }
614
973
  #throwSlowCurrentChangeReset(pos, numChanges, elapsed, currentChangeElapsedMs, totalHydrationTimeMs) {
615
974
  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");
616
975
  }
@@ -634,6 +993,26 @@ var PipelineDriver = class {
634
993
  if (this.#streamer !== null) this.#stopAccumulating();
635
994
  }
636
995
  }
996
+ /**
997
+ * Converts a change pushed out of a query pipeline into row changes during
998
+ * the push. The relationships of a pushed node are lazy, and operators such
999
+ * as Join compute them from the state of the push in progress: while a child
1000
+ * change is pushed to each matching parent in turn, parents not yet pushed
1001
+ * must not see it. Read after the push has moved on to the next parent, or
1002
+ * after it has finished, a node's relationships show the later state, and
1003
+ * rows that are also pushed separately are counted twice.
1004
+ */
1005
+ *#streamPushed(queryID, schema, change) {
1006
+ const streamer = this.#streamer;
1007
+ assert(streamer, "must #startAccumulating() before pushing changes");
1008
+ for (const rowChange of streamer.streamChange(queryID, schema, change)) {
1009
+ if (rowChange === "yield") {
1010
+ yield rowChange;
1011
+ continue;
1012
+ }
1013
+ must(this.#streamer).add(rowChange);
1014
+ }
1015
+ }
637
1016
  #startAccumulating() {
638
1017
  assert(this.#streamer === null, "Streamer already started");
639
1018
  this.#streamer = new Streamer(must(this.#primaryKeys), this.#tableSpecs, (queryID, error) => this.#logQueryFailure(queryID, "query pipeline failed", error));
@@ -664,6 +1043,14 @@ var Streamer = class {
664
1043
  this.#logQueryFailure = logQueryFailure;
665
1044
  }
666
1045
  #changes = [];
1046
+ /** Row changes that were already produced by {@link streamChange}. */
1047
+ #rowChanges = [];
1048
+ add(rowChange) {
1049
+ this.#rowChanges.push(rowChange);
1050
+ }
1051
+ streamChange(queryID, schema, change) {
1052
+ return this.#streamChanges(queryID, schema, [change]);
1053
+ }
667
1054
  accumulate(queryID, schema, changes) {
668
1055
  this.#changes.push([
669
1056
  queryID,
@@ -673,6 +1060,7 @@ var Streamer = class {
673
1060
  return this;
674
1061
  }
675
1062
  *stream() {
1063
+ yield* this.#rowChanges;
676
1064
  for (const [queryID, schema, changes] of this.#changes) try {
677
1065
  yield* this.#streamChanges(queryID, schema, changes);
678
1066
  } catch (e) {
@@ -782,6 +1170,18 @@ var QueryFailureLoggingOperator = class {
782
1170
  throw e;
783
1171
  }
784
1172
  }
1173
+ *reconcile(_pusher) {
1174
+ if (this.#output.reconcile) try {
1175
+ yield* this.#output.reconcile(this);
1176
+ } catch (e) {
1177
+ logQueryFailure(this.#lc, {
1178
+ queryHash: this.#queryHash,
1179
+ transformationHash: this.#transformationHash,
1180
+ queryName: this.#queryName
1181
+ }, "query pipeline failed during reconcile", e);
1182
+ throw e;
1183
+ }
1184
+ }
785
1185
  };
786
1186
  function logQueryFailure(lc, queryInfo, message, error) {
787
1187
  if (error instanceof ResetPipelinesSignal) return;
@@ -808,18 +1208,27 @@ function* toAdds(nodes) {
808
1208
  function getRowKey(cols, row) {
809
1209
  return Object.fromEntries(cols.map((col) => [col, must(row[col])]));
810
1210
  }
1211
+ /** Whether `rowKey` has exactly the columns of `primaryKey`. */
1212
+ function isKeyedBy(rowKey, primaryKey) {
1213
+ let cols = 0;
1214
+ for (const col in rowKey) {
1215
+ if (!primaryKey.includes(col)) return false;
1216
+ cols++;
1217
+ }
1218
+ return cols === primaryKey.length;
1219
+ }
811
1220
  /**
812
1221
  * Core hydration logic used by {@link PipelineDriver#addQuery}, extracted to a
813
1222
  * function for reuse by the analyze-query RPC path so that analysis hydrates
814
1223
  * queries the same way the view-syncer does in production.
815
1224
  */
816
- function* hydrate(input, hash, clientSchema, tableSpecs) {
1225
+ function hydrate(input, hash, clientSchema, tableSpecs) {
817
1226
  const res = input.fetch({});
818
- yield* new Streamer(buildPrimaryKeys(clientSchema), tableSpecs).accumulate(hash, input.getSchema(), toAdds(res)).stream();
1227
+ return new Streamer(buildPrimaryKeys(clientSchema), tableSpecs).accumulate(hash, input.getSchema(), toAdds(res)).stream();
819
1228
  }
820
- function* hydrateInternal(input, hash, primaryKeys, tableSpecs) {
1229
+ function hydrateInternal(input, hash, primaryKeys, tableSpecs) {
821
1230
  const res = input.fetch({});
822
- yield* new Streamer(primaryKeys, tableSpecs).accumulate(hash, input.getSchema(), toAdds(res)).stream();
1231
+ return new Streamer(primaryKeys, tableSpecs).accumulate(hash, input.getSchema(), toAdds(res)).stream();
823
1232
  }
824
1233
  function buildPrimaryKeys(clientSchema, primaryKeys = /* @__PURE__ */ new Map()) {
825
1234
  for (const [tableName, { primaryKey }] of Object.entries(clientSchema.tables)) primaryKeys.set(tableName, primaryKey);
@@ -828,7 +1237,7 @@ function buildPrimaryKeys(clientSchema, primaryKeys = /* @__PURE__ */ new Map())
828
1237
  function mustGetPrimaryKey(primaryKeys, table) {
829
1238
  const pKeys = must(primaryKeys, "primaryKey map must be non-null");
830
1239
  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.`);
1240
+ 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
1241
  return rv;
833
1242
  }
834
1243
  /**