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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (988) hide show
  1. package/out/analyze-query/src/analyze-cli.js +4 -4
  2. package/out/analyze-query/src/analyze-cli.js.map +1 -1
  3. package/out/analyze-query/src/bin-analyze.js +13 -12
  4. package/out/analyze-query/src/bin-analyze.js.map +1 -1
  5. package/out/analyze-query/src/bin-transform.js +1 -1
  6. package/out/analyze-query/src/bin-transform.js.map +1 -1
  7. package/out/ast-to-zql/src/ast-to-zql.d.ts +8 -1
  8. package/out/ast-to-zql/src/ast-to-zql.d.ts.map +1 -1
  9. package/out/ast-to-zql/src/ast-to-zql.js +25 -25
  10. package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
  11. package/out/otel/src/log-options.d.ts +16 -0
  12. package/out/otel/src/log-options.d.ts.map +1 -1
  13. package/out/otel/src/log-options.js +60 -6
  14. package/out/otel/src/log-options.js.map +1 -1
  15. package/out/replicache/src/bg-interval.d.ts +2 -1
  16. package/out/replicache/src/bg-interval.d.ts.map +1 -1
  17. package/out/replicache/src/bg-interval.js +13 -4
  18. package/out/replicache/src/bg-interval.js.map +1 -1
  19. package/out/replicache/src/btree/node.d.ts.map +1 -1
  20. package/out/replicache/src/btree/node.js +3 -6
  21. package/out/replicache/src/btree/node.js.map +1 -1
  22. package/out/replicache/src/dag/gc.d.ts.map +1 -1
  23. package/out/replicache/src/dag/gc.js +8 -11
  24. package/out/replicache/src/dag/gc.js.map +1 -1
  25. package/out/replicache/src/dag/invalid-ref-count-error.d.ts +12 -0
  26. package/out/replicache/src/dag/invalid-ref-count-error.d.ts.map +1 -0
  27. package/out/replicache/src/dag/invalid-ref-count-error.js +19 -0
  28. package/out/replicache/src/dag/invalid-ref-count-error.js.map +1 -0
  29. package/out/replicache/src/dag/lazy-store.d.ts +17 -4
  30. package/out/replicache/src/dag/lazy-store.d.ts.map +1 -1
  31. package/out/replicache/src/dag/lazy-store.js +35 -9
  32. package/out/replicache/src/dag/lazy-store.js.map +1 -1
  33. package/out/replicache/src/dag/store-impl.d.ts +12 -2
  34. package/out/replicache/src/dag/store-impl.d.ts.map +1 -1
  35. package/out/replicache/src/dag/store-impl.js +29 -9
  36. package/out/replicache/src/dag/store-impl.js.map +1 -1
  37. package/out/replicache/src/db/rebase.d.ts +14 -2
  38. package/out/replicache/src/db/rebase.d.ts.map +1 -1
  39. package/out/replicache/src/db/rebase.js +27 -5
  40. package/out/replicache/src/db/rebase.js.map +1 -1
  41. package/out/replicache/src/get-kv-store-provider.d.ts +1 -1
  42. package/out/replicache/src/get-kv-store-provider.d.ts.map +1 -1
  43. package/out/replicache/src/get-kv-store-provider.js +4 -4
  44. package/out/replicache/src/get-kv-store-provider.js.map +1 -1
  45. package/out/replicache/src/kv/expo-sqlite/store.d.ts.map +1 -1
  46. package/out/replicache/src/kv/expo-sqlite/store.js +28 -5
  47. package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
  48. package/out/replicache/src/kv/idb-store.d.ts +18 -0
  49. package/out/replicache/src/kv/idb-store.d.ts.map +1 -1
  50. package/out/replicache/src/kv/idb-store.js +30 -2
  51. package/out/replicache/src/kv/idb-store.js.map +1 -1
  52. package/out/replicache/src/kv/mem-fallback-store.d.ts +54 -0
  53. package/out/replicache/src/kv/mem-fallback-store.d.ts.map +1 -0
  54. package/out/replicache/src/kv/mem-fallback-store.js +177 -0
  55. package/out/replicache/src/kv/mem-fallback-store.js.map +1 -0
  56. package/out/replicache/src/kv/mem-store.d.ts +1 -0
  57. package/out/replicache/src/kv/mem-store.d.ts.map +1 -1
  58. package/out/replicache/src/kv/mem-store.js +3 -0
  59. package/out/replicache/src/kv/mem-store.js.map +1 -1
  60. package/out/replicache/src/kv/op-sqlite/store.d.ts.map +1 -1
  61. package/out/replicache/src/kv/op-sqlite/store.js +4 -4
  62. package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
  63. package/out/replicache/src/kv/sqlite-store.d.ts +22 -1
  64. package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
  65. package/out/replicache/src/kv/sqlite-store.js +159 -14
  66. package/out/replicache/src/kv/sqlite-store.js.map +1 -1
  67. package/out/replicache/src/kv/store.d.ts +6 -0
  68. package/out/replicache/src/kv/store.d.ts.map +1 -1
  69. package/out/replicache/src/new-client-channel.js.map +1 -1
  70. package/out/replicache/src/persist/client-gc.d.ts +2 -1
  71. package/out/replicache/src/persist/client-gc.d.ts.map +1 -1
  72. package/out/replicache/src/persist/client-gc.js +2 -2
  73. package/out/replicache/src/persist/client-gc.js.map +1 -1
  74. package/out/replicache/src/persist/client-group-gc.d.ts +2 -1
  75. package/out/replicache/src/persist/client-group-gc.d.ts.map +1 -1
  76. package/out/replicache/src/persist/client-group-gc.js +2 -2
  77. package/out/replicache/src/persist/client-group-gc.js.map +1 -1
  78. package/out/replicache/src/persist/clients.d.ts +2 -2
  79. package/out/replicache/src/persist/collect-idb-databases.d.ts +28 -8
  80. package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
  81. package/out/replicache/src/persist/collect-idb-databases.js +97 -20
  82. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
  83. package/out/replicache/src/persist/heartbeat.d.ts +2 -1
  84. package/out/replicache/src/persist/heartbeat.d.ts.map +1 -1
  85. package/out/replicache/src/persist/heartbeat.js +2 -2
  86. package/out/replicache/src/persist/heartbeat.js.map +1 -1
  87. package/out/replicache/src/persist/idb-databases-store-db-name.js +1 -1
  88. package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -1
  89. package/out/replicache/src/persist/persist.d.ts.map +1 -1
  90. package/out/replicache/src/persist/persist.js +18 -8
  91. package/out/replicache/src/persist/persist.js.map +1 -1
  92. package/out/replicache/src/persist/refresh.js +6 -2
  93. package/out/replicache/src/persist/refresh.js.map +1 -1
  94. package/out/replicache/src/replicache-impl.d.ts +85 -3
  95. package/out/replicache/src/replicache-impl.d.ts.map +1 -1
  96. package/out/replicache/src/replicache-impl.js +321 -29
  97. package/out/replicache/src/replicache-impl.js.map +1 -1
  98. package/out/replicache/src/replicache-options.d.ts +9 -0
  99. package/out/replicache/src/replicache-options.d.ts.map +1 -1
  100. package/out/replicache/src/storage-failure.d.ts +37 -0
  101. package/out/replicache/src/storage-failure.d.ts.map +1 -0
  102. package/out/replicache/src/storage-failure.js +31 -0
  103. package/out/replicache/src/storage-failure.js.map +1 -0
  104. package/out/shared/src/arrays.d.ts +5 -0
  105. package/out/shared/src/arrays.d.ts.map +1 -1
  106. package/out/shared/src/arrays.js +8 -10
  107. package/out/shared/src/arrays.js.map +1 -1
  108. package/out/shared/src/base64.d.ts +19 -0
  109. package/out/shared/src/base64.d.ts.map +1 -0
  110. package/out/shared/src/base64.js +40 -0
  111. package/out/shared/src/base64.js.map +1 -0
  112. package/out/shared/src/centroid.d.ts +0 -1
  113. package/out/shared/src/centroid.d.ts.map +1 -1
  114. package/out/shared/src/centroid.js +1 -4
  115. package/out/shared/src/centroid.js.map +1 -1
  116. package/out/shared/src/error.d.ts +11 -0
  117. package/out/shared/src/error.d.ts.map +1 -1
  118. package/out/shared/src/error.js +35 -1
  119. package/out/shared/src/error.js.map +1 -1
  120. package/out/shared/src/hash.d.ts.map +1 -1
  121. package/out/shared/src/hash.js +32 -7
  122. package/out/shared/src/hash.js.map +1 -1
  123. package/out/shared/src/iterables.d.ts +2 -0
  124. package/out/shared/src/iterables.d.ts.map +1 -1
  125. package/out/shared/src/iterables.js +18 -1
  126. package/out/shared/src/iterables.js.map +1 -1
  127. package/out/shared/src/map.d.ts +24 -2
  128. package/out/shared/src/map.d.ts.map +1 -1
  129. package/out/shared/src/map.js +18 -4
  130. package/out/shared/src/map.js.map +1 -1
  131. package/out/shared/src/options-types.d.ts +2 -2
  132. package/out/shared/src/options.d.ts.map +1 -1
  133. package/out/shared/src/options.js +10 -7
  134. package/out/shared/src/options.js.map +1 -1
  135. package/out/shared/src/packed-boolean-map.d.ts +7 -0
  136. package/out/shared/src/packed-boolean-map.d.ts.map +1 -0
  137. package/out/shared/src/packed-boolean-map.js +36 -0
  138. package/out/shared/src/packed-boolean-map.js.map +1 -0
  139. package/out/shared/src/random-values.js +12 -1
  140. package/out/shared/src/random-values.js.map +1 -1
  141. package/out/shared/src/ring-buffer.d.ts +10 -0
  142. package/out/shared/src/ring-buffer.d.ts.map +1 -1
  143. package/out/shared/src/ring-buffer.js +26 -1
  144. package/out/shared/src/ring-buffer.js.map +1 -1
  145. package/out/shared/src/tdigest.d.ts +10 -0
  146. package/out/shared/src/tdigest.d.ts.map +1 -1
  147. package/out/shared/src/tdigest.js +147 -63
  148. package/out/shared/src/tdigest.js.map +1 -1
  149. package/out/shared/src/valita.d.ts +13 -0
  150. package/out/shared/src/valita.d.ts.map +1 -1
  151. package/out/shared/src/valita.js +23 -23
  152. package/out/shared/src/valita.js.map +1 -1
  153. package/out/z2s/src/compiler.d.ts.map +1 -1
  154. package/out/z2s/src/compiler.js +10 -6
  155. package/out/z2s/src/compiler.js.map +1 -1
  156. package/out/z2s/src/sql.d.ts.map +1 -1
  157. package/out/z2s/src/sql.js +9 -5
  158. package/out/z2s/src/sql.js.map +1 -1
  159. package/out/zero/package.js +4 -5
  160. package/out/zero/package.js.map +1 -1
  161. package/out/zero/src/zero.js +2 -1
  162. package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
  163. package/out/zero-cache/src/auth/write-authorizer.js +1 -0
  164. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  165. package/out/zero-cache/src/config/normalize.d.ts +1 -0
  166. package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
  167. package/out/zero-cache/src/config/normalize.js +46 -4
  168. package/out/zero-cache/src/config/normalize.js.map +1 -1
  169. package/out/zero-cache/src/config/zero-config.d.ts +116 -24
  170. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  171. package/out/zero-cache/src/config/zero-config.js +409 -157
  172. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  173. package/out/zero-cache/src/custom/fetch.d.ts +1 -1
  174. package/out/zero-cache/src/custom/fetch.d.ts.map +1 -1
  175. package/out/zero-cache/src/custom/fetch.js.map +1 -1
  176. package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
  177. package/out/zero-cache/src/db/lite-tables.js +3 -4
  178. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  179. package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
  180. package/out/zero-cache/src/db/migration-lite.js +5 -3
  181. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  182. package/out/zero-cache/src/observability/events.js +4 -1
  183. package/out/zero-cache/src/observability/events.js.map +1 -1
  184. package/out/zero-cache/src/observability/log-throttle.d.ts +44 -0
  185. package/out/zero-cache/src/observability/log-throttle.d.ts.map +1 -0
  186. package/out/zero-cache/src/observability/log-throttle.js +76 -0
  187. package/out/zero-cache/src/observability/log-throttle.js.map +1 -0
  188. package/out/zero-cache/src/observability/metrics.d.ts.map +1 -1
  189. package/out/zero-cache/src/observability/metrics.js +2 -7
  190. package/out/zero-cache/src/observability/metrics.js.map +1 -1
  191. package/out/zero-cache/src/scripts/permissions.d.ts +16 -0
  192. package/out/zero-cache/src/scripts/permissions.d.ts.map +1 -1
  193. package/out/zero-cache/src/scripts/permissions.js +3 -3
  194. package/out/zero-cache/src/scripts/permissions.js.map +1 -1
  195. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  196. package/out/zero-cache/src/server/change-streamer.js +117 -77
  197. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  198. package/out/zero-cache/src/server/inspector-delegate.d.ts +28 -2
  199. package/out/zero-cache/src/server/inspector-delegate.d.ts.map +1 -1
  200. package/out/zero-cache/src/server/inspector-delegate.js +37 -17
  201. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
  202. package/out/zero-cache/src/server/main.d.ts.map +1 -1
  203. package/out/zero-cache/src/server/main.js +8 -1
  204. package/out/zero-cache/src/server/main.js.map +1 -1
  205. package/out/zero-cache/src/server/mutator.js +2 -0
  206. package/out/zero-cache/src/server/mutator.js.map +1 -1
  207. package/out/zero-cache/src/server/reaper.d.ts.map +1 -1
  208. package/out/zero-cache/src/server/reaper.js +2 -0
  209. package/out/zero-cache/src/server/reaper.js.map +1 -1
  210. package/out/zero-cache/src/server/replicator.d.ts +3 -0
  211. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  212. package/out/zero-cache/src/server/replicator.js +95 -21
  213. package/out/zero-cache/src/server/replicator.js.map +1 -1
  214. package/out/zero-cache/src/server/runner/zero-dispatcher.d.ts.map +1 -1
  215. package/out/zero-cache/src/server/runner/zero-dispatcher.js +5 -0
  216. package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
  217. package/out/zero-cache/src/server/syncer-assigner.d.ts +14 -0
  218. package/out/zero-cache/src/server/syncer-assigner.d.ts.map +1 -0
  219. package/out/zero-cache/src/server/syncer-assigner.js +72 -0
  220. package/out/zero-cache/src/server/syncer-assigner.js.map +1 -0
  221. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  222. package/out/zero-cache/src/server/syncer.js +24 -2
  223. package/out/zero-cache/src/server/syncer.js.map +1 -1
  224. package/out/zero-cache/src/server/worker-dispatcher.d.ts.map +1 -1
  225. package/out/zero-cache/src/server/worker-dispatcher.js +21 -4
  226. package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -1
  227. package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
  228. package/out/zero-cache/src/services/analyze.js +11 -9
  229. package/out/zero-cache/src/services/analyze.js.map +1 -1
  230. package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts.map +1 -1
  231. package/out/zero-cache/src/services/change-source/common/backfill-manager.js +198 -24
  232. package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
  233. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.d.ts.map +1 -1
  234. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js +16 -4
  235. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -1
  236. package/out/zero-cache/src/services/change-source/common/init-cleanup.d.ts +24 -0
  237. package/out/zero-cache/src/services/change-source/common/init-cleanup.d.ts.map +1 -0
  238. package/out/zero-cache/src/services/change-source/common/init-cleanup.js +44 -0
  239. package/out/zero-cache/src/services/change-source/common/init-cleanup.js.map +1 -0
  240. package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts +92 -2
  241. package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts.map +1 -1
  242. package/out/zero-cache/src/services/change-source/common/replica-restore.js +27 -10
  243. package/out/zero-cache/src/services/change-source/common/replica-restore.js.map +1 -1
  244. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts +1 -0
  245. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
  246. package/out/zero-cache/src/services/change-source/common/replica-schema.js +15 -3
  247. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  248. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts +1 -1
  249. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
  250. package/out/zero-cache/src/services/change-source/custom/change-source.js +7 -3
  251. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  252. package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts +9 -0
  253. package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts.map +1 -1
  254. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +206 -19
  255. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
  256. package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts +55 -0
  257. package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts.map +1 -0
  258. package/out/zero-cache/src/services/change-source/pg/change-source-init.js +305 -0
  259. package/out/zero-cache/src/services/change-source/pg/change-source-init.js.map +1 -0
  260. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +31 -18
  261. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  262. package/out/zero-cache/src/services/change-source/pg/change-source.js +130 -157
  263. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  264. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +38 -2
  265. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  266. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +55 -21
  267. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  268. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts +31 -0
  269. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts.map +1 -1
  270. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +102 -3
  271. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  272. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts +16 -0
  273. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts.map +1 -0
  274. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js +113 -0
  275. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js.map +1 -0
  276. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts +40 -15
  277. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts.map +1 -1
  278. package/out/zero-cache/src/services/change-source/pg/replication-slots.js +149 -27
  279. package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
  280. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts.map +1 -1
  281. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js +68 -8
  282. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js.map +1 -1
  283. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
  284. package/out/zero-cache/src/services/change-source/pg/schema/init.js +32 -1
  285. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  286. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.d.ts +10 -0
  287. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.d.ts.map +1 -0
  288. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js +6 -0
  289. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js.map +1 -0
  290. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +50 -27
  291. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
  292. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +98 -34
  293. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  294. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts +68 -0
  295. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts.map +1 -0
  296. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js +141 -0
  297. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js.map +1 -0
  298. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +45 -2
  299. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
  300. package/out/zero-cache/src/services/change-source/protocol/current/data.js +10 -1
  301. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  302. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +60 -3
  303. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
  304. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts +23 -10
  305. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts.map +1 -1
  306. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js +17 -7
  307. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -1
  308. package/out/zero-cache/src/services/change-source/protocol/current.js +2 -1
  309. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts +72 -0
  310. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts.map +1 -0
  311. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js +162 -0
  312. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js.map +1 -0
  313. package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts +50 -0
  314. package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts.map +1 -0
  315. package/out/zero-cache/src/services/change-streamer/backfill-state.js +268 -0
  316. package/out/zero-cache/src/services/change-streamer/backfill-state.js.map +1 -0
  317. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts.map +1 -1
  318. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js +6 -17
  319. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js.map +1 -1
  320. package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts.map +1 -1
  321. package/out/zero-cache/src/services/change-streamer/backup-monitor.js +59 -8
  322. package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
  323. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts +8 -2
  324. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts.map +1 -1
  325. package/out/zero-cache/src/services/change-streamer/broadcast.js +24 -4
  326. package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
  327. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts +19 -4
  328. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts.map +1 -1
  329. package/out/zero-cache/src/services/change-streamer/change-log-codec.js +28 -8
  330. package/out/zero-cache/src/services/change-streamer/change-log-codec.js.map +1 -1
  331. package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts +17 -0
  332. package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts.map +1 -1
  333. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js +44 -1
  334. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js.map +1 -1
  335. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +48 -6
  336. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  337. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +131 -34
  338. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  339. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +22 -0
  340. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  341. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +149 -78
  342. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  343. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +38 -16
  344. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
  345. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  346. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts +3 -3
  347. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -1
  348. package/out/zero-cache/src/services/change-streamer/forwarder.js +36 -5
  349. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
  350. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts +53 -0
  351. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts.map +1 -0
  352. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js +156 -0
  353. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js.map +1 -0
  354. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +58 -1
  355. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
  356. package/out/zero-cache/src/services/change-streamer/schema/tables.js +107 -16
  357. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  358. package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts +92 -0
  359. package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts.map +1 -0
  360. package/out/zero-cache/src/services/change-streamer/snapshot-message.js +42 -0
  361. package/out/zero-cache/src/services/change-streamer/snapshot-message.js.map +1 -0
  362. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts +1 -1
  363. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts.map +1 -1
  364. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js +16 -4
  365. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js.map +1 -1
  366. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts +7 -69
  367. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts.map +1 -1
  368. package/out/zero-cache/src/services/change-streamer/snapshot.js +21 -53
  369. package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -1
  370. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts +6 -1
  371. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts.map +1 -1
  372. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js +27 -9
  373. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js.map +1 -1
  374. package/out/zero-cache/src/services/change-streamer/storer.d.ts +95 -4
  375. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  376. package/out/zero-cache/src/services/change-streamer/storer.js +293 -83
  377. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  378. package/out/zero-cache/src/services/change-streamer/subscribe.d.ts +446 -0
  379. package/out/zero-cache/src/services/change-streamer/subscribe.d.ts.map +1 -0
  380. package/out/zero-cache/src/services/change-streamer/subscribe.js +76 -0
  381. package/out/zero-cache/src/services/change-streamer/subscribe.js.map +1 -0
  382. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +58 -1
  383. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
  384. package/out/zero-cache/src/services/change-streamer/subscriber.js +123 -12
  385. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  386. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts +19 -1
  387. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts.map +1 -1
  388. package/out/zero-cache/src/services/change-streamer/upstream-acker.js +23 -3
  389. package/out/zero-cache/src/services/change-streamer/upstream-acker.js.map +1 -1
  390. package/out/zero-cache/src/services/http-service.d.ts +1 -1
  391. package/out/zero-cache/src/services/http-service.d.ts.map +1 -1
  392. package/out/zero-cache/src/services/http-service.js.map +1 -1
  393. package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
  394. package/out/zero-cache/src/services/life-cycle.js +3 -1
  395. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  396. package/out/zero-cache/src/services/litestream/commands.d.ts +34 -3
  397. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  398. package/out/zero-cache/src/services/litestream/commands.js +121 -35
  399. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  400. package/out/zero-cache/src/services/litestream/config-v5.yml +6 -7
  401. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js +51 -24
  402. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js.map +1 -1
  403. package/out/zero-cache/src/services/litestream/litestream-controller.d.ts +10 -2
  404. package/out/zero-cache/src/services/litestream/litestream-controller.d.ts.map +1 -1
  405. package/out/zero-cache/src/services/litestream/litestream-controller.js +3 -2
  406. package/out/zero-cache/src/services/litestream/litestream-controller.js.map +1 -1
  407. package/out/zero-cache/src/services/litestream/restore-progress.d.ts +24 -0
  408. package/out/zero-cache/src/services/litestream/restore-progress.d.ts.map +1 -0
  409. package/out/zero-cache/src/services/litestream/restore-progress.js +91 -0
  410. package/out/zero-cache/src/services/litestream/restore-progress.js.map +1 -0
  411. package/out/zero-cache/src/services/litestream/wal-keeper.d.ts +33 -0
  412. package/out/zero-cache/src/services/litestream/wal-keeper.d.ts.map +1 -0
  413. package/out/zero-cache/src/services/litestream/wal-keeper.js +49 -0
  414. package/out/zero-cache/src/services/litestream/wal-keeper.js.map +1 -0
  415. package/out/zero-cache/src/services/mutagen/mutagen.d.ts +5 -0
  416. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  417. package/out/zero-cache/src/services/mutagen/mutagen.js +7 -1
  418. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  419. package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
  420. package/out/zero-cache/src/services/mutagen/pusher.js +5 -6
  421. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  422. package/out/zero-cache/src/services/plannerz.d.ts +163 -0
  423. package/out/zero-cache/src/services/plannerz.d.ts.map +1 -0
  424. package/out/zero-cache/src/services/plannerz.js +267 -0
  425. package/out/zero-cache/src/services/plannerz.js.map +1 -0
  426. package/out/zero-cache/src/services/profz.d.ts +30 -0
  427. package/out/zero-cache/src/services/profz.d.ts.map +1 -0
  428. package/out/zero-cache/src/services/profz.js +163 -0
  429. package/out/zero-cache/src/services/profz.js.map +1 -0
  430. package/out/zero-cache/src/services/replicator/change-log-cookies.js +1 -1
  431. package/out/zero-cache/src/services/replicator/change-log-cookies.js.map +1 -1
  432. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts +5 -4
  433. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts.map +1 -1
  434. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js +20 -22
  435. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js.map +1 -1
  436. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
  437. package/out/zero-cache/src/services/replicator/change-processor.js +51 -5
  438. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  439. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +5 -2
  440. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  441. package/out/zero-cache/src/services/replicator/incremental-sync.js +54 -21
  442. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  443. package/out/zero-cache/src/services/replicator/replication-status.d.ts +35 -1
  444. package/out/zero-cache/src/services/replicator/replication-status.d.ts.map +1 -1
  445. package/out/zero-cache/src/services/replicator/replication-status.js +99 -8
  446. package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
  447. package/out/zero-cache/src/services/replicator/replicator.d.ts +4 -1
  448. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
  449. package/out/zero-cache/src/services/replicator/replicator.js +5 -2
  450. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  451. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts +16 -1
  452. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts.map +1 -1
  453. package/out/zero-cache/src/services/replicator/reporter/recorder.js +70 -27
  454. package/out/zero-cache/src/services/replicator/reporter/recorder.js.map +1 -1
  455. package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts +23 -2
  456. package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts.map +1 -1
  457. package/out/zero-cache/src/services/replicator/schema/backfilling.js +54 -2
  458. package/out/zero-cache/src/services/replicator/schema/backfilling.js.map +1 -1
  459. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts +6 -6
  460. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts.map +1 -1
  461. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js +19 -14
  462. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js.map +1 -1
  463. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts +11 -3
  464. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts.map +1 -1
  465. package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
  466. package/out/zero-cache/src/services/replicator/write-worker.js +5 -1
  467. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
  468. package/out/zero-cache/src/services/run-ast.d.ts +12 -0
  469. package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
  470. package/out/zero-cache/src/services/run-ast.js +42 -22
  471. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  472. package/out/zero-cache/src/services/runner.d.ts +2 -1
  473. package/out/zero-cache/src/services/runner.d.ts.map +1 -1
  474. package/out/zero-cache/src/services/runner.js +10 -2
  475. package/out/zero-cache/src/services/runner.js.map +1 -1
  476. package/out/zero-cache/src/services/statz.d.ts +4 -0
  477. package/out/zero-cache/src/services/statz.d.ts.map +1 -1
  478. package/out/zero-cache/src/services/statz.js +22 -5
  479. package/out/zero-cache/src/services/statz.js.map +1 -1
  480. package/out/zero-cache/src/services/view-syncer/advancement-metrics.d.ts +26 -0
  481. package/out/zero-cache/src/services/view-syncer/advancement-metrics.d.ts.map +1 -0
  482. package/out/zero-cache/src/services/view-syncer/advancement-metrics.js +26 -0
  483. package/out/zero-cache/src/services/view-syncer/advancement-metrics.js.map +1 -0
  484. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +19 -2
  485. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
  486. package/out/zero-cache/src/services/view-syncer/client-handler.js +42 -30
  487. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  488. package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts +2 -1
  489. package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts.map +1 -1
  490. package/out/zero-cache/src/services/view-syncer/connection-context-manager.js +1 -0
  491. package/out/zero-cache/src/services/view-syncer/connection-context-manager.js.map +1 -1
  492. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +27 -2
  493. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  494. package/out/zero-cache/src/services/view-syncer/cvr-store.js +85 -20
  495. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  496. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +76 -11
  497. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  498. package/out/zero-cache/src/services/view-syncer/cvr.js +214 -40
  499. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  500. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts +81 -0
  501. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts.map +1 -0
  502. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js +128 -0
  503. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js.map +1 -0
  504. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts +14 -1
  505. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts.map +1 -1
  506. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +30 -4
  507. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
  508. package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts +33 -0
  509. package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts.map +1 -0
  510. package/out/zero-cache/src/services/view-syncer/hydration-budget.js +62 -0
  511. package/out/zero-cache/src/services/view-syncer/hydration-budget.js.map +1 -0
  512. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts +51 -0
  513. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts.map +1 -0
  514. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js +78 -0
  515. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js.map +1 -0
  516. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts +10 -1
  517. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts.map +1 -1
  518. package/out/zero-cache/src/services/view-syncer/inspect-handler.js +18 -4
  519. package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
  520. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +80 -6
  521. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  522. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +658 -195
  523. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  524. package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts +7 -0
  525. package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts.map +1 -0
  526. package/out/zero-cache/src/services/view-syncer/plan-warnings.js +35 -0
  527. package/out/zero-cache/src/services/view-syncer/plan-warnings.js.map +1 -0
  528. package/out/zero-cache/src/services/view-syncer/query-covering.d.ts.map +1 -1
  529. package/out/zero-cache/src/services/view-syncer/query-covering.js +2 -6
  530. package/out/zero-cache/src/services/view-syncer/query-covering.js.map +1 -1
  531. package/out/zero-cache/src/services/view-syncer/query-shape.d.ts +25 -0
  532. package/out/zero-cache/src/services/view-syncer/query-shape.d.ts.map +1 -0
  533. package/out/zero-cache/src/services/view-syncer/query-shape.js +28 -0
  534. package/out/zero-cache/src/services/view-syncer/query-shape.js.map +1 -0
  535. package/out/zero-cache/src/services/view-syncer/query-stats.d.ts +82 -0
  536. package/out/zero-cache/src/services/view-syncer/query-stats.d.ts.map +1 -0
  537. package/out/zero-cache/src/services/view-syncer/query-stats.js +214 -0
  538. package/out/zero-cache/src/services/view-syncer/query-stats.js.map +1 -0
  539. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +2 -107
  540. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +1 -1
  541. package/out/zero-cache/src/services/view-syncer/schema/types.js +5 -20
  542. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  543. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts +95 -0
  544. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts.map +1 -0
  545. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js +155 -0
  546. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js.map +1 -0
  547. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +96 -14
  548. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  549. package/out/zero-cache/src/services/view-syncer/snapshotter.js +214 -30
  550. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  551. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +11 -1
  552. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  553. package/out/zero-cache/src/services/view-syncer/view-syncer.js +566 -107
  554. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  555. package/out/zero-cache/src/types/pg-data-type.d.ts +2 -0
  556. package/out/zero-cache/src/types/pg-data-type.d.ts.map +1 -1
  557. package/out/zero-cache/src/types/pg-data-type.js +6 -1
  558. package/out/zero-cache/src/types/pg-data-type.js.map +1 -1
  559. package/out/zero-cache/src/types/pg.d.ts.map +1 -1
  560. package/out/zero-cache/src/types/pg.js +1 -1
  561. package/out/zero-cache/src/types/pg.js.map +1 -1
  562. package/out/zero-cache/src/types/processes.d.ts +39 -0
  563. package/out/zero-cache/src/types/processes.d.ts.map +1 -1
  564. package/out/zero-cache/src/types/processes.js +43 -4
  565. package/out/zero-cache/src/types/processes.js.map +1 -1
  566. package/out/zero-cache/src/types/profiler.d.ts +12 -0
  567. package/out/zero-cache/src/types/profiler.d.ts.map +1 -1
  568. package/out/zero-cache/src/types/profiler.js +46 -1
  569. package/out/zero-cache/src/types/profiler.js.map +1 -1
  570. package/out/zero-cache/src/types/row-key.d.ts +1 -15
  571. package/out/zero-cache/src/types/row-key.d.ts.map +1 -1
  572. package/out/zero-cache/src/types/row-key.js +6 -8
  573. package/out/zero-cache/src/types/row-key.js.map +1 -1
  574. package/out/zero-cache/src/types/streams.d.ts +49 -7
  575. package/out/zero-cache/src/types/streams.d.ts.map +1 -1
  576. package/out/zero-cache/src/types/streams.js +190 -58
  577. package/out/zero-cache/src/types/streams.js.map +1 -1
  578. package/out/zero-cache/src/types/subscription.d.ts +15 -0
  579. package/out/zero-cache/src/types/subscription.d.ts.map +1 -1
  580. package/out/zero-cache/src/types/subscription.js +123 -31
  581. package/out/zero-cache/src/types/subscription.js.map +1 -1
  582. package/out/zero-cache/src/types/websocket-handoff.d.ts +1 -1
  583. package/out/zero-cache/src/types/websocket-handoff.d.ts.map +1 -1
  584. package/out/zero-cache/src/types/websocket-handoff.js +18 -9
  585. package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
  586. package/out/zero-cache/src/types/ws.d.ts.map +1 -1
  587. package/out/zero-cache/src/types/ws.js +1 -16
  588. package/out/zero-cache/src/types/ws.js.map +1 -1
  589. package/out/zero-cache/src/workers/connect-params.d.ts +18 -1
  590. package/out/zero-cache/src/workers/connect-params.d.ts.map +1 -1
  591. package/out/zero-cache/src/workers/connect-params.js +25 -1
  592. package/out/zero-cache/src/workers/connect-params.js.map +1 -1
  593. package/out/zero-cache/src/workers/connection.d.ts +4 -4
  594. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  595. package/out/zero-cache/src/workers/connection.js +8 -8
  596. package/out/zero-cache/src/workers/connection.js.map +1 -1
  597. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
  598. package/out/zero-cache/src/workers/replicator.js +15 -7
  599. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  600. package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +1 -1
  601. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +21 -16
  602. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  603. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  604. package/out/zero-cache/src/workers/syncer.js +55 -4
  605. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  606. package/out/zero-client/src/client/active-clients-manager.d.ts.map +1 -1
  607. package/out/zero-client/src/client/active-clients-manager.js +4 -1
  608. package/out/zero-client/src/client/active-clients-manager.js.map +1 -1
  609. package/out/zero-client/src/client/connection-manager.d.ts +20 -0
  610. package/out/zero-client/src/client/connection-manager.d.ts.map +1 -1
  611. package/out/zero-client/src/client/connection-manager.js +77 -13
  612. package/out/zero-client/src/client/connection-manager.js.map +1 -1
  613. package/out/zero-client/src/client/connection-status-enum.d.ts +2 -0
  614. package/out/zero-client/src/client/connection-status-enum.d.ts.map +1 -1
  615. package/out/zero-client/src/client/connection-status-enum.js +3 -1
  616. package/out/zero-client/src/client/connection-status-enum.js.map +1 -1
  617. package/out/zero-client/src/client/connection.d.ts +6 -0
  618. package/out/zero-client/src/client/connection.d.ts.map +1 -1
  619. package/out/zero-client/src/client/connection.js +2 -1
  620. package/out/zero-client/src/client/connection.js.map +1 -1
  621. package/out/zero-client/src/client/context.d.ts +23 -13
  622. package/out/zero-client/src/client/context.d.ts.map +1 -1
  623. package/out/zero-client/src/client/context.js +94 -26
  624. package/out/zero-client/src/client/context.js.map +1 -1
  625. package/out/zero-client/src/client/crud-impl.d.ts.map +1 -1
  626. package/out/zero-client/src/client/crud-impl.js +1 -1
  627. package/out/zero-client/src/client/crud-impl.js.map +1 -1
  628. package/out/zero-client/src/client/custom.d.ts +5 -4
  629. package/out/zero-client/src/client/custom.d.ts.map +1 -1
  630. package/out/zero-client/src/client/custom.js +3 -3
  631. package/out/zero-client/src/client/custom.js.map +1 -1
  632. package/out/zero-client/src/client/inspector/lazy-inspector.js +1 -1
  633. package/out/zero-client/src/client/ivm-branch.d.ts.map +1 -1
  634. package/out/zero-client/src/client/ivm-branch.js +20 -3
  635. package/out/zero-client/src/client/ivm-branch.js.map +1 -1
  636. package/out/zero-client/src/client/keys.d.ts.map +1 -1
  637. package/out/zero-client/src/client/keys.js +19 -1
  638. package/out/zero-client/src/client/keys.js.map +1 -1
  639. package/out/zero-client/src/client/make-mutate-property.d.ts +1 -1
  640. package/out/zero-client/src/client/make-mutate-property.d.ts.map +1 -1
  641. package/out/zero-client/src/client/make-mutate-property.js.map +1 -1
  642. package/out/zero-client/src/client/make-replicache-mutators.d.ts.map +1 -1
  643. package/out/zero-client/src/client/make-replicache-mutators.js +1 -1
  644. package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
  645. package/out/zero-client/src/client/mutation-tracker.d.ts +2 -2
  646. package/out/zero-client/src/client/mutation-tracker.d.ts.map +1 -1
  647. package/out/zero-client/src/client/mutation-tracker.js +3 -7
  648. package/out/zero-client/src/client/mutation-tracker.js.map +1 -1
  649. package/out/zero-client/src/client/mutator-proxy.d.ts.map +1 -1
  650. package/out/zero-client/src/client/mutator-proxy.js +9 -4
  651. package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
  652. package/out/zero-client/src/client/options.d.ts +33 -0
  653. package/out/zero-client/src/client/options.d.ts.map +1 -1
  654. package/out/zero-client/src/client/options.js.map +1 -1
  655. package/out/zero-client/src/client/query-manager.d.ts +9 -0
  656. package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
  657. package/out/zero-client/src/client/query-manager.js +47 -14
  658. package/out/zero-client/src/client/query-manager.js.map +1 -1
  659. package/out/zero-client/src/client/reload-error-handler.js +2 -2
  660. package/out/zero-client/src/client/reload-error-handler.js.map +1 -1
  661. package/out/zero-client/src/client/version.js +1 -1
  662. package/out/zero-client/src/client/zero-rep.d.ts +1 -0
  663. package/out/zero-client/src/client/zero-rep.d.ts.map +1 -1
  664. package/out/zero-client/src/client/zero-rep.js +8 -6
  665. package/out/zero-client/src/client/zero-rep.js.map +1 -1
  666. package/out/zero-client/src/client/zero.d.ts +18 -3
  667. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  668. package/out/zero-client/src/client/zero.js +89 -50
  669. package/out/zero-client/src/client/zero.js.map +1 -1
  670. package/out/zero-client/src/mod.d.ts +2 -1
  671. package/out/zero-client/src/mod.d.ts.map +1 -1
  672. package/out/zero-client/src/mod.js +1 -0
  673. package/out/zero-client/src/types/query-result.d.ts +2 -0
  674. package/out/zero-client/src/types/query-result.d.ts.map +1 -1
  675. package/out/zero-events/src/status.d.ts +64 -0
  676. package/out/zero-events/src/status.d.ts.map +1 -1
  677. package/out/zero-protocol/src/analyze-query-result.d.ts +5 -0
  678. package/out/zero-protocol/src/analyze-query-result.d.ts.map +1 -1
  679. package/out/zero-protocol/src/analyze-query-result.js.map +1 -1
  680. package/out/zero-protocol/src/ast.d.ts.map +1 -1
  681. package/out/zero-protocol/src/ast.js +13 -14
  682. package/out/zero-protocol/src/ast.js.map +1 -1
  683. package/out/zero-protocol/src/connect.d.ts +16 -0
  684. package/out/zero-protocol/src/connect.d.ts.map +1 -1
  685. package/out/zero-protocol/src/connect.js +27 -1
  686. package/out/zero-protocol/src/connect.js.map +1 -1
  687. package/out/zero-protocol/src/down.d.ts +31 -31
  688. package/out/zero-protocol/src/feature-flag-enum.d.ts +14 -0
  689. package/out/zero-protocol/src/feature-flag-enum.d.ts.map +1 -0
  690. package/out/zero-protocol/src/feature-flag-enum.js +10 -0
  691. package/out/zero-protocol/src/feature-flag-enum.js.map +1 -0
  692. package/out/zero-protocol/src/feature-flag.d.ts +5 -0
  693. package/out/zero-protocol/src/feature-flag.d.ts.map +1 -0
  694. package/out/zero-protocol/src/inspect-down.d.ts +16 -16
  695. package/out/zero-protocol/src/poke.d.ts +17 -10
  696. package/out/zero-protocol/src/poke.d.ts.map +1 -1
  697. package/out/zero-protocol/src/poke.js +3 -2
  698. package/out/zero-protocol/src/poke.js.map +1 -1
  699. package/out/zero-protocol/src/protocol-version.d.ts +30 -6
  700. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
  701. package/out/zero-protocol/src/protocol-version.js +1 -1
  702. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  703. package/out/zero-protocol/src/query-hash.d.ts.map +1 -1
  704. package/out/zero-protocol/src/query-hash.js +2 -5
  705. package/out/zero-protocol/src/query-hash.js.map +1 -1
  706. package/out/zero-react/src/use-query.d.ts +5 -4
  707. package/out/zero-react/src/use-query.d.ts.map +1 -1
  708. package/out/zero-react/src/use-query.js +74 -7
  709. package/out/zero-react/src/use-query.js.map +1 -1
  710. package/out/zero-react/src/zero.js +1 -0
  711. package/out/zero-server/src/adapters/drizzle.d.ts +2 -1
  712. package/out/zero-server/src/adapters/drizzle.d.ts.map +1 -1
  713. package/out/zero-server/src/adapters/drizzle.js +12 -7
  714. package/out/zero-server/src/adapters/drizzle.js.map +1 -1
  715. package/out/zero-server/src/adapters/kysely.d.ts +2 -1
  716. package/out/zero-server/src/adapters/kysely.d.ts.map +1 -1
  717. package/out/zero-server/src/adapters/kysely.js +8 -2
  718. package/out/zero-server/src/adapters/kysely.js.map +1 -1
  719. package/out/zero-server/src/adapters/pg.d.ts +5 -1
  720. package/out/zero-server/src/adapters/pg.d.ts.map +1 -1
  721. package/out/zero-server/src/adapters/pg.js +28 -7
  722. package/out/zero-server/src/adapters/pg.js.map +1 -1
  723. package/out/zero-server/src/adapters/postgresjs.d.ts +1 -0
  724. package/out/zero-server/src/adapters/postgresjs.d.ts.map +1 -1
  725. package/out/zero-server/src/adapters/postgresjs.js +7 -1
  726. package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
  727. package/out/zero-server/src/adapters/prisma.d.ts +3 -2
  728. package/out/zero-server/src/adapters/prisma.d.ts.map +1 -1
  729. package/out/zero-server/src/adapters/prisma.js +8 -2
  730. package/out/zero-server/src/adapters/prisma.js.map +1 -1
  731. package/out/zero-server/src/closable-db-transaction.d.ts +16 -0
  732. package/out/zero-server/src/closable-db-transaction.d.ts.map +1 -0
  733. package/out/zero-server/src/closable-db-transaction.js +31 -0
  734. package/out/zero-server/src/closable-db-transaction.js.map +1 -0
  735. package/out/zero-server/src/custom.d.ts +10 -4
  736. package/out/zero-server/src/custom.d.ts.map +1 -1
  737. package/out/zero-server/src/custom.js +15 -6
  738. package/out/zero-server/src/custom.js.map +1 -1
  739. package/out/zero-server/src/logging.d.ts +2 -2
  740. package/out/zero-server/src/logging.d.ts.map +1 -1
  741. package/out/zero-server/src/logging.js +2 -2
  742. package/out/zero-server/src/logging.js.map +1 -1
  743. package/out/zero-server/src/mod.d.ts +1 -1
  744. package/out/zero-server/src/mod.d.ts.map +1 -1
  745. package/out/zero-server/src/pg-query-executor.d.ts +2 -2
  746. package/out/zero-server/src/pg-query-executor.d.ts.map +1 -1
  747. package/out/zero-server/src/pg-query-executor.js +2 -2
  748. package/out/zero-server/src/pg-query-executor.js.map +1 -1
  749. package/out/zero-server/src/process-mutations.d.ts +25 -4
  750. package/out/zero-server/src/process-mutations.d.ts.map +1 -1
  751. package/out/zero-server/src/process-mutations.js +103 -52
  752. package/out/zero-server/src/process-mutations.js.map +1 -1
  753. package/out/zero-server/src/push-processor.d.ts +8 -2
  754. package/out/zero-server/src/push-processor.d.ts.map +1 -1
  755. package/out/zero-server/src/push-processor.js +12 -4
  756. package/out/zero-server/src/push-processor.js.map +1 -1
  757. package/out/zero-server/src/schema.d.ts +2 -2
  758. package/out/zero-server/src/schema.d.ts.map +1 -1
  759. package/out/zero-server/src/schema.js +3 -2
  760. package/out/zero-server/src/schema.js.map +1 -1
  761. package/out/zero-server/src/zql-database.d.ts +21 -1
  762. package/out/zero-server/src/zql-database.d.ts.map +1 -1
  763. package/out/zero-server/src/zql-database.js +61 -24
  764. package/out/zero-server/src/zql-database.js.map +1 -1
  765. package/out/zero-solid/src/solid-view.d.ts +17 -0
  766. package/out/zero-solid/src/solid-view.d.ts.map +1 -1
  767. package/out/zero-solid/src/solid-view.js +39 -1
  768. package/out/zero-solid/src/solid-view.js.map +1 -1
  769. package/out/zero-solid/src/use-query.js +1 -2
  770. package/out/zero-solid/src/use-query.js.map +1 -1
  771. package/out/zero-solid/src/zero.js +1 -0
  772. package/out/zql/src/builder/builder.d.ts +25 -0
  773. package/out/zql/src/builder/builder.d.ts.map +1 -1
  774. package/out/zql/src/builder/builder.js +69 -19
  775. package/out/zql/src/builder/builder.js.map +1 -1
  776. package/out/zql/src/builder/correlated-predicate-pushdown.d.ts +43 -0
  777. package/out/zql/src/builder/correlated-predicate-pushdown.d.ts.map +1 -0
  778. package/out/zql/src/builder/correlated-predicate-pushdown.js +161 -0
  779. package/out/zql/src/builder/correlated-predicate-pushdown.js.map +1 -0
  780. package/out/zql/src/builder/debug-delegate.d.ts +6 -1
  781. package/out/zql/src/builder/debug-delegate.d.ts.map +1 -1
  782. package/out/zql/src/builder/debug-delegate.js +14 -2
  783. package/out/zql/src/builder/debug-delegate.js.map +1 -1
  784. package/out/zql/src/ivm/array-view.d.ts +29 -0
  785. package/out/zql/src/ivm/array-view.d.ts.map +1 -1
  786. package/out/zql/src/ivm/array-view.js +74 -16
  787. package/out/zql/src/ivm/array-view.js.map +1 -1
  788. package/out/zql/src/ivm/cap.d.ts +2 -1
  789. package/out/zql/src/ivm/cap.d.ts.map +1 -1
  790. package/out/zql/src/ivm/cap.js +14 -4
  791. package/out/zql/src/ivm/cap.js.map +1 -1
  792. package/out/zql/src/ivm/data.d.ts.map +1 -1
  793. package/out/zql/src/ivm/data.js +8 -3
  794. package/out/zql/src/ivm/data.js.map +1 -1
  795. package/out/zql/src/ivm/deferred-input.d.ts.map +1 -1
  796. package/out/zql/src/ivm/deferred-input.js +3 -2
  797. package/out/zql/src/ivm/deferred-input.js.map +1 -1
  798. package/out/zql/src/ivm/exists.d.ts +3 -1
  799. package/out/zql/src/ivm/exists.d.ts.map +1 -1
  800. package/out/zql/src/ivm/exists.js +4 -1
  801. package/out/zql/src/ivm/exists.js.map +1 -1
  802. package/out/zql/src/ivm/fan-in.d.ts +6 -2
  803. package/out/zql/src/ivm/fan-in.d.ts.map +1 -1
  804. package/out/zql/src/ivm/fan-in.js +13 -5
  805. package/out/zql/src/ivm/fan-in.js.map +1 -1
  806. package/out/zql/src/ivm/fan-out.d.ts +5 -2
  807. package/out/zql/src/ivm/fan-out.d.ts.map +1 -1
  808. package/out/zql/src/ivm/fan-out.js +4 -0
  809. package/out/zql/src/ivm/fan-out.js.map +1 -1
  810. package/out/zql/src/ivm/filter-operators.d.ts +8 -6
  811. package/out/zql/src/ivm/filter-operators.d.ts.map +1 -1
  812. package/out/zql/src/ivm/filter-operators.js +19 -8
  813. package/out/zql/src/ivm/filter-operators.js.map +1 -1
  814. package/out/zql/src/ivm/filter.d.ts +5 -2
  815. package/out/zql/src/ivm/filter.d.ts.map +1 -1
  816. package/out/zql/src/ivm/filter.js +10 -4
  817. package/out/zql/src/ivm/filter.js.map +1 -1
  818. package/out/zql/src/ivm/flipped-join.d.ts +9 -4
  819. package/out/zql/src/ivm/flipped-join.d.ts.map +1 -1
  820. package/out/zql/src/ivm/flipped-join.js +97 -46
  821. package/out/zql/src/ivm/flipped-join.js.map +1 -1
  822. package/out/zql/src/ivm/join-index-tap.d.ts +33 -0
  823. package/out/zql/src/ivm/join-index-tap.d.ts.map +1 -0
  824. package/out/zql/src/ivm/join-index-tap.js +70 -0
  825. package/out/zql/src/ivm/join-index-tap.js.map +1 -0
  826. package/out/zql/src/ivm/join-index.d.ts +35 -0
  827. package/out/zql/src/ivm/join-index.d.ts.map +1 -0
  828. package/out/zql/src/ivm/join-index.js +141 -0
  829. package/out/zql/src/ivm/join-index.js.map +1 -0
  830. package/out/zql/src/ivm/join-utils.d.ts +6 -0
  831. package/out/zql/src/ivm/join-utils.d.ts.map +1 -1
  832. package/out/zql/src/ivm/join-utils.js +22 -1
  833. package/out/zql/src/ivm/join-utils.js.map +1 -1
  834. package/out/zql/src/ivm/join.d.ts +19 -1
  835. package/out/zql/src/ivm/join.d.ts.map +1 -1
  836. package/out/zql/src/ivm/join.js +107 -15
  837. package/out/zql/src/ivm/join.js.map +1 -1
  838. package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts +1 -1
  839. package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts.map +1 -1
  840. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +6 -4
  841. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
  842. package/out/zql/src/ivm/memory-source.d.ts +29 -4
  843. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  844. package/out/zql/src/ivm/memory-source.js +70 -34
  845. package/out/zql/src/ivm/memory-source.js.map +1 -1
  846. package/out/zql/src/ivm/memory-storage.d.ts +1 -0
  847. package/out/zql/src/ivm/memory-storage.d.ts.map +1 -1
  848. package/out/zql/src/ivm/memory-storage.js +1 -0
  849. package/out/zql/src/ivm/memory-storage.js.map +1 -1
  850. package/out/zql/src/ivm/operator.d.ts +45 -10
  851. package/out/zql/src/ivm/operator.d.ts.map +1 -1
  852. package/out/zql/src/ivm/operator.js +9 -4
  853. package/out/zql/src/ivm/operator.js.map +1 -1
  854. package/out/zql/src/ivm/push-accumulated.d.ts +6 -1
  855. package/out/zql/src/ivm/push-accumulated.d.ts.map +1 -1
  856. package/out/zql/src/ivm/push-accumulated.js +47 -2
  857. package/out/zql/src/ivm/push-accumulated.js.map +1 -1
  858. package/out/zql/src/ivm/skip.d.ts +2 -1
  859. package/out/zql/src/ivm/skip.d.ts.map +1 -1
  860. package/out/zql/src/ivm/skip.js +3 -0
  861. package/out/zql/src/ivm/skip.js.map +1 -1
  862. package/out/zql/src/ivm/take-gate.d.ts +57 -0
  863. package/out/zql/src/ivm/take-gate.d.ts.map +1 -0
  864. package/out/zql/src/ivm/take-gate.js +106 -0
  865. package/out/zql/src/ivm/take-gate.js.map +1 -0
  866. package/out/zql/src/ivm/take.d.ts +8 -2
  867. package/out/zql/src/ivm/take.d.ts.map +1 -1
  868. package/out/zql/src/ivm/take.js +139 -103
  869. package/out/zql/src/ivm/take.js.map +1 -1
  870. package/out/zql/src/ivm/union-fan-in.d.ts +3 -0
  871. package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
  872. package/out/zql/src/ivm/union-fan-in.js +63 -10
  873. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  874. package/out/zql/src/ivm/union-fan-out.d.ts +2 -1
  875. package/out/zql/src/ivm/union-fan-out.d.ts.map +1 -1
  876. package/out/zql/src/ivm/union-fan-out.js +5 -0
  877. package/out/zql/src/ivm/union-fan-out.js.map +1 -1
  878. package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
  879. package/out/zql/src/ivm/view-apply-change.js +9 -4
  880. package/out/zql/src/ivm/view-apply-change.js.map +1 -1
  881. package/out/zql/src/ivm/view.d.ts +15 -0
  882. package/out/zql/src/ivm/view.d.ts.map +1 -1
  883. package/out/zql/src/mutate/custom.d.ts +53 -1
  884. package/out/zql/src/mutate/custom.d.ts.map +1 -1
  885. package/out/zql/src/mutate/custom.js.map +1 -1
  886. package/out/zql/src/mutate/mutator-registry.d.ts.map +1 -1
  887. package/out/zql/src/mutate/mutator-registry.js +3 -3
  888. package/out/zql/src/mutate/mutator-registry.js.map +1 -1
  889. package/out/zql/src/mutate/mutator.d.ts +2 -2
  890. package/out/zql/src/mutate/mutator.d.ts.map +1 -1
  891. package/out/zql/src/mutate/mutator.js.map +1 -1
  892. package/out/zql/src/planner/planner-builder.d.ts +23 -3
  893. package/out/zql/src/planner/planner-builder.d.ts.map +1 -1
  894. package/out/zql/src/planner/planner-builder.js +34 -17
  895. package/out/zql/src/planner/planner-builder.js.map +1 -1
  896. package/out/zql/src/planner/planner-connection.d.ts +58 -2
  897. package/out/zql/src/planner/planner-connection.d.ts.map +1 -1
  898. package/out/zql/src/planner/planner-connection.js +103 -11
  899. package/out/zql/src/planner/planner-connection.js.map +1 -1
  900. package/out/zql/src/planner/planner-debug.d.ts.map +1 -1
  901. package/out/zql/src/planner/planner-debug.js +3 -8
  902. package/out/zql/src/planner/planner-debug.js.map +1 -1
  903. package/out/zql/src/planner/planner-graph.d.ts +10 -0
  904. package/out/zql/src/planner/planner-graph.d.ts.map +1 -1
  905. package/out/zql/src/planner/planner-graph.js +14 -0
  906. package/out/zql/src/planner/planner-graph.js.map +1 -1
  907. package/out/zql/src/planner/planner-source.d.ts +2 -2
  908. package/out/zql/src/planner/planner-source.d.ts.map +1 -1
  909. package/out/zql/src/planner/planner-source.js +2 -2
  910. package/out/zql/src/planner/planner-source.js.map +1 -1
  911. package/out/zql/src/planner/planner-warnings.d.ts +83 -0
  912. package/out/zql/src/planner/planner-warnings.d.ts.map +1 -0
  913. package/out/zql/src/planner/planner-warnings.js +78 -0
  914. package/out/zql/src/planner/planner-warnings.js.map +1 -0
  915. package/out/zql/src/query/measure-push-operator.d.ts +9 -2
  916. package/out/zql/src/query/measure-push-operator.d.ts.map +1 -1
  917. package/out/zql/src/query/measure-push-operator.js +52 -5
  918. package/out/zql/src/query/measure-push-operator.js.map +1 -1
  919. package/out/zql/src/query/query-delegate-base.d.ts +4 -2
  920. package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
  921. package/out/zql/src/query/query-delegate-base.js +66 -33
  922. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  923. package/out/zql/src/query/query-delegate.d.ts +33 -6
  924. package/out/zql/src/query/query-delegate.d.ts.map +1 -1
  925. package/out/zql/src/query/query-impl.d.ts +1 -0
  926. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  927. package/out/zql/src/query/query-impl.js +6 -23
  928. package/out/zql/src/query/query-impl.js.map +1 -1
  929. package/out/zql/src/query/query-transitions.d.ts.map +1 -1
  930. package/out/zql/src/query/query-transitions.js +2 -5
  931. package/out/zql/src/query/query-transitions.js.map +1 -1
  932. package/out/zql/src/query/query.d.ts +22 -5
  933. package/out/zql/src/query/query.d.ts.map +1 -1
  934. package/out/zql/src/query/runnable-query-impl.d.ts +1 -0
  935. package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -1
  936. package/out/zql/src/query/runnable-query-impl.js +2 -10
  937. package/out/zql/src/query/runnable-query-impl.js.map +1 -1
  938. package/out/zql/src/query/typed-view.d.ts +1 -1
  939. package/out/zql/src/query/typed-view.d.ts.map +1 -1
  940. package/out/zqlite/src/database-storage.d.ts.map +1 -1
  941. package/out/zqlite/src/database-storage.js +9 -1
  942. package/out/zqlite/src/database-storage.js.map +1 -1
  943. package/out/zqlite/src/db.d.ts +9 -1
  944. package/out/zqlite/src/db.d.ts.map +1 -1
  945. package/out/zqlite/src/db.js +62 -30
  946. package/out/zqlite/src/db.js.map +1 -1
  947. package/out/zqlite/src/index-usage.d.ts +19 -0
  948. package/out/zqlite/src/index-usage.d.ts.map +1 -0
  949. package/out/zqlite/src/index-usage.js +49 -0
  950. package/out/zqlite/src/index-usage.js.map +1 -0
  951. package/out/zqlite/src/pending-delta.d.ts +110 -0
  952. package/out/zqlite/src/pending-delta.d.ts.map +1 -0
  953. package/out/zqlite/src/pending-delta.js +278 -0
  954. package/out/zqlite/src/pending-delta.js.map +1 -0
  955. package/out/zqlite/src/query-builder.d.ts +17 -1
  956. package/out/zqlite/src/query-builder.d.ts.map +1 -1
  957. package/out/zqlite/src/query-builder.js +111 -20
  958. package/out/zqlite/src/query-builder.js.map +1 -1
  959. package/out/zqlite/src/query-delegate.d.ts.map +1 -1
  960. package/out/zqlite/src/query-delegate.js +10 -7
  961. package/out/zqlite/src/query-delegate.js.map +1 -1
  962. package/out/zqlite/src/resolve-scalar-subqueries.d.ts +3 -1
  963. package/out/zqlite/src/resolve-scalar-subqueries.d.ts.map +1 -1
  964. package/out/zqlite/src/resolve-scalar-subqueries.js +1 -0
  965. package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
  966. package/out/zqlite/src/sqlite-cost-model.d.ts.map +1 -1
  967. package/out/zqlite/src/sqlite-cost-model.js +52 -1
  968. package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
  969. package/out/zqlite/src/sqlite-stat-fanout.d.ts.map +1 -1
  970. package/out/zqlite/src/sqlite-stat-fanout.js +5 -31
  971. package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
  972. package/out/zqlite/src/sqlite-stat4-sample.d.ts +37 -0
  973. package/out/zqlite/src/sqlite-stat4-sample.d.ts.map +1 -0
  974. package/out/zqlite/src/sqlite-stat4-sample.js +61 -0
  975. package/out/zqlite/src/sqlite-stat4-sample.js.map +1 -0
  976. package/out/zqlite/src/table-source.d.ts +87 -2
  977. package/out/zqlite/src/table-source.d.ts.map +1 -1
  978. package/out/zqlite/src/table-source.js +276 -42
  979. package/out/zqlite/src/table-source.js.map +1 -1
  980. package/package.json +4 -5
  981. package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts +0 -25
  982. package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts.map +0 -1
  983. package/out/replicache/src/kv/idb-store-with-mem-fallback.js +0 -83
  984. package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +0 -1
  985. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts +0 -29
  986. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts.map +0 -1
  987. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js +0 -154
  988. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js.map +0 -1
@@ -1,4 +1,6 @@
1
1
  import { assert, unreachable } from "../../../../shared/src/asserts.js";
2
+ import { getOrInsertComputed } from "../../../../shared/src/map.js";
3
+ import { newArray } from "../../../../shared/src/arrays.js";
2
4
  import { must } from "../../../../shared/src/must.js";
3
5
  import { h64 } from "../../../../shared/src/hash.js";
4
6
  import { Internal, InvalidConnectionRequest, InvalidConnectionRequestBaseCookie, Rehome } from "../../../../zero-protocol/src/error-kind-enum.js";
@@ -10,23 +12,27 @@ import { manualSpan, startAsyncSpan, startSpan } from "../../../../otel/src/span
10
12
  import { ZERO_VERSION_COLUMN_NAME } from "../replicator/schema/constants.js";
11
13
  import { transformAndHashQuery } from "../../auth/read-authorizer.js";
12
14
  import { randInt } from "../../../../shared/src/rand.js";
13
- import { getOrCreateCounter, getOrCreateLatencyHistogram, getOrCreateNativeHistogram, getOrCreateUpDownCounter } from "../../observability/metrics.js";
15
+ import { LogThrottle } from "../../observability/log-throttle.js";
16
+ import { getOrCreateCounter, getOrCreateLatencyHistogram, getOrCreateNativeHistogram, getOrCreateUpDownCounter, getOrCreateValueHistogram } from "../../observability/metrics.js";
14
17
  import { rowIDString } from "../../types/row-key.js";
15
18
  import "../replicator/schema/replication-state.js";
16
- import { parseSignature } from "./row-set-signature.js";
19
+ import { planWarningMessage } from "./plan-warnings.js";
20
+ import { queryShape } from "./query-shape.js";
17
21
  import { ResetPipelinesSignal } from "./snapshotter.js";
18
- import "./pipeline-driver.js";
19
22
  import { Subscription } from "../../types/subscription.js";
20
23
  import { CustomKeyMap } from "../../../../shared/src/custom-key-map.js";
21
24
  import { ttlClockAsNumber, ttlClockFromNumber } from "./ttl-clock.js";
22
25
  import { EMPTY_CVR_VERSION, cmpVersions, versionFromString, versionString, versionToCookie } from "./schema/types.js";
23
26
  import { ProtocolErrorWithLevel, getLogLevel, wrapWithProtocolError } from "../../types/error-with-level.js";
24
27
  import { isAuthErrorBody } from "../../auth/auth.js";
28
+ import { AdvancementMetrics } from "./advancement-metrics.js";
25
29
  import { ClientHandler, startPoke } from "./client-handler.js";
26
30
  import { tracer } from "./tracer.js";
27
31
  import { CVRStore, ClientNotFoundError } from "./cvr-store.js";
28
- import { CVRConfigDrivenUpdater, CVRQueryDrivenUpdater, nextEvictionTime } from "./cvr.js";
32
+ import { CVRConfigDrivenUpdater, CVRQueryDrivenUpdater, classifyQueriesForHydration, nextEvictionTime } from "./cvr.js";
29
33
  import { E2EServingLagTracker } from "./e2e-serving-lag.js";
34
+ import { HydrationBudget } from "./hydration-budget.js";
35
+ import { HydrationCircuitBreaker } from "./hydration-circuit-breaker.js";
30
36
  import { handleInspect } from "./inspect-handler.js";
31
37
  import { QueryCoveringIndex } from "./query-covering.js";
32
38
  import { resolver } from "@rocicorp/resolver";
@@ -50,6 +56,7 @@ function shutdownBeforeInitializationError() {
50
56
  * use a timer to update the ttlClock every minute.
51
57
  */
52
58
  var TTL_CLOCK_INTERVAL = 6e4;
59
+ var slowHydrationLogThrottle = new LogThrottle({ windowMs: 5 * 6e4 });
53
60
  var ViewSyncerService = class {
54
61
  id;
55
62
  createdAtMs = Date.now();
@@ -61,6 +68,7 @@ var ViewSyncerService = class {
61
68
  #drainCoordinator;
62
69
  #keepaliveMs;
63
70
  #slowHydrateThreshold;
71
+ #hydrationCircuitBreaker;
64
72
  #lastConnectTime = Date.now();
65
73
  /**
66
74
  * The TTL clock is used to determine the time at which queries are considered
@@ -88,6 +96,13 @@ var ViewSyncerService = class {
88
96
  #lock = new Lock();
89
97
  #cvrStore;
90
98
  #stopped = resolver();
99
+ /**
100
+ * Set when {@link #cleanup} begins. Lock tasks that were in flight when the
101
+ * view-syncer was stopped may still complete after the timers have been
102
+ * cleared; this flag prevents them from scheduling new timers, which would
103
+ * otherwise outlive the service (and retain everything it references).
104
+ */
105
+ #shuttingDown = false;
91
106
  #initialized = resolver();
92
107
  #cvr;
93
108
  /**
@@ -102,7 +117,8 @@ var ViewSyncerService = class {
102
117
  * updates are processed via `#syncQueryPipelineSet`.
103
118
  *
104
119
  * Resets to `false` if `#advancePipelines` returns a `ResetPipelinesSignal`
105
- * and pipelines must be reset and rehydrated.
120
+ * and pipelines must be reset and rehydrated, or if a reloaded CVR is ahead
121
+ * of the pipelines (see `#resetPipelinesIfBehindCVR`).
106
122
  */
107
123
  #pipelinesHydrated = false;
108
124
  #servedVersion = null;
@@ -110,6 +126,7 @@ var ViewSyncerService = class {
110
126
  #expiredQueriesTimer = 0;
111
127
  #authMaintenanceTimer = 0;
112
128
  #setTimeout;
129
+ #now;
113
130
  #customQueryTransformer;
114
131
  #queryReplacements = /* @__PURE__ */ new Map();
115
132
  #activeClients = getOrCreateUpDownCounter("sync", "active-clients", "Number of active sync clients");
@@ -127,6 +144,7 @@ var ViewSyncerService = class {
127
144
  description: "Observations of sync.e2e_serving_lag that came out negative and were clamped to zero. Non-zero means the upstream database clock is running ahead of this pod by more than the entire pipeline latency, so sync.e2e_serving_lag is biased low and reads healthier than reality. See replication.upstream_clock_skew for the magnitude.",
128
145
  unit: "{observation}"
129
146
  });
147
+ #advancementMetrics = new AdvancementMetrics();
130
148
  #transactionAdvanceTime = getOrCreateLatencyHistogram("sync", "advance-time", "Time to advance all queries for a given client group after applying a new transaction to the replica.");
131
149
  #queryTransformations = getOrCreateCounter("sync", "query.transformations", "Number of query transformations performed");
132
150
  #queryTransformationTime = getOrCreateLatencyHistogram("sync", "query.transformation-time", "Time to transform custom queries via API server.");
@@ -136,10 +154,64 @@ var ViewSyncerService = class {
136
154
  #pipelineResets = getOrCreateCounter("sync", "pipeline-resets", "Number of pipeline resets");
137
155
  #rowSetSignatureDrifts = getOrCreateCounter("sync", "query.row-set-signature-drifts", "Number of times re-hydration of an unchanged query produced a different row-set signature than what is stored in the CVR (forcing a configVersion bump and full re-execution). Expected to be near-zero in steady state; persistent non-zero values indicate non-deterministic query execution (e.g. Cap operator picking different N-row subsets).");
138
156
  #sameHashRehydrationVersionBumps = getOrCreateCounter("sync", "query.same-hash-rehydrations-forced-bump", "Number of times query-set reconciliation forced a configVersion bump for already-gotten same-transformation-hash query rehydration because trackQueries would not otherwise bump. Expected to be near-zero; non-zero values indicate pipeline/CVR row-set drift reached query-set reconciliation.");
157
+ #hydrationBudgetExhaustions = getOrCreateCounter("sync", "hydration_budget_exhaustions", {
158
+ description: "Number of hydration passes that exhaust their budget.",
159
+ unit: "{pass}"
160
+ });
161
+ #hydrationBudgetEvictions = getOrCreateCounter("sync", "hydration_budget_evictions", {
162
+ description: "Number of inactive queries removed after hydration budget exhaustion.",
163
+ unit: "{query}"
164
+ });
165
+ #hydrationBudgetElapsed = getOrCreateValueHistogram("sync", "hydration_budget_elapsed", {
166
+ description: "Elapsed milliseconds when optional query hydration stopped.",
167
+ unit: "ms",
168
+ bucketBoundaries: [
169
+ 1,
170
+ 2,
171
+ 5,
172
+ 10,
173
+ 20,
174
+ 50,
175
+ 100,
176
+ 200,
177
+ 500,
178
+ 1e3,
179
+ 5e3
180
+ ]
181
+ });
182
+ #hydrationBudgetOvershoot = getOrCreateValueHistogram("sync", "hydration_budget_overshoot", {
183
+ description: "Milliseconds elapsed beyond the configured hydration budget.",
184
+ unit: "ms",
185
+ bucketBoundaries: [
186
+ 0,
187
+ 1,
188
+ 2,
189
+ 5,
190
+ 10,
191
+ 20,
192
+ 50,
193
+ 100,
194
+ 200,
195
+ 500,
196
+ 1e3
197
+ ]
198
+ });
199
+ #queryEvictions = getOrCreateCounter("sync", "query_evictions", {
200
+ description: "Number of queries evicted from the CVR ahead of their removal by the client, grouped by reason. Inactive queries are evicted by ttl and hydration-budget; hydration-timeout and hydration-circuit-breaker evict active queries as well.",
201
+ unit: "{query}"
202
+ });
203
+ #hydrationTimeouts = getOrCreateCounter("sync", "hydration_timeouts", {
204
+ description: "Number of query hydrations aborted for exceeding the query hydration timeout.",
205
+ unit: "{query}"
206
+ });
207
+ #hydrationCircuitBreakerRejections = getOrCreateCounter("sync", "hydration_circuit_breaker_rejections", {
208
+ description: "Number of queries rejected without hydration because their hydration circuit breaker was open.",
209
+ unit: "{query}"
210
+ });
139
211
  #inspectorDelegate;
140
212
  #config;
141
213
  #runPriorityOp;
142
- constructor(config, lc, shard, taskID, clientGroupID, cvrDb, pipelineDriver, versionChanges, drainCoordinator, slowHydrateThreshold, inspectorDelegate, connContextManager, customQueryTransformer, runPriorityOp, keepaliveMs = DEFAULT_KEEPALIVE_MS, setTimeoutFn = setTimeout.bind(globalThis)) {
214
+ constructor(config, lc, shard, taskID, clientGroupID, cvrDb, pipelineDriver, versionChanges, drainCoordinator, slowHydrateThreshold, inspectorDelegate, connContextManager, customQueryTransformer, runPriorityOp, keepaliveMs = DEFAULT_KEEPALIVE_MS, setTimeoutFn = setTimeout.bind(globalThis), now = performance.now.bind(performance)) {
143
215
  this.#config = config;
144
216
  this.id = clientGroupID;
145
217
  this.connContextManager = connContextManager;
@@ -154,6 +226,8 @@ var ViewSyncerService = class {
154
226
  this.#customQueryTransformer = customQueryTransformer;
155
227
  this.#cvrStore = new CVRStore(lc, cvrDb, shard, taskID, clientGroupID, () => this.#stateChanges.cancel());
156
228
  this.#setTimeout = setTimeoutFn;
229
+ this.#now = now;
230
+ this.#hydrationCircuitBreaker = new HydrationCircuitBreaker(config.viewSyncerQueryHydrationTimeoutMs ?? 0, void 0, now);
157
231
  this.#runPriorityOp = runPriorityOp;
158
232
  this.keepalive();
159
233
  }
@@ -180,11 +254,13 @@ var ViewSyncerService = class {
180
254
  this.#stateChanges.cancel();
181
255
  return;
182
256
  }
257
+ let reloaded = false;
183
258
  if (!this.#cvr) {
184
259
  this.#lc.debug?.("loading cvr");
185
260
  this.#cvr = await this.#runPriorityOp(lc, "loading cvr", () => this.#cvrStore.load(lc, this.#lastConnectTime));
186
261
  this.#ttlClock = this.#cvr.ttlClock;
187
262
  this.#ttlClockBase = Date.now();
263
+ reloaded = true;
188
264
  } else {
189
265
  const now = Date.now();
190
266
  this.#cvr = {
@@ -193,6 +269,10 @@ var ViewSyncerService = class {
193
269
  };
194
270
  }
195
271
  try {
272
+ if (reloaded && this.#resetPipelinesIfBehindCVR(lc, this.#cvr)) {
273
+ const connCtx = this.connContextManager.getBackgroundConnectionContext();
274
+ if (connCtx) await this.#maybeHydratePipelines(lc, this.#cvr, connCtx);
275
+ }
196
276
  await fn(lc, this.#cvr);
197
277
  } catch (e) {
198
278
  this.#cvr = void 0;
@@ -202,11 +282,47 @@ var ViewSyncerService = class {
202
282
  }
203
283
  });
204
284
  }
285
+ /**
286
+ * The CVR is reloaded after an error clears the cached copy. By then another
287
+ * view-syncer may have taken over the client group and flushed the CVR at a
288
+ * version ahead of this instance's hydrated pipelines (e.g. its replica was
289
+ * further ahead). The pipelines can no longer be diffed against the CVR, so
290
+ * reset them and let `#maybeHydratePipelines` rehydrate once the replica has
291
+ * caught up to the CVR.
292
+ *
293
+ * A CVR behind the pipelines is expected (advancements that do not change
294
+ * the CVR are not flushed) and is handled by the normal update path.
295
+ *
296
+ * Returns whether the pipelines were reset.
297
+ *
298
+ * Must be called from within the #lock.
299
+ */
300
+ #resetPipelinesIfBehindCVR(lc, cvr) {
301
+ if (!this.#pipelinesHydrated) return false;
302
+ const pipelineVersion = this.#pipelines.currentVersion();
303
+ if (pipelineVersion >= cvr.version.stateVersion) return false;
304
+ lc.info?.(`resetting pipelines: pipelines@${pipelineVersion} are behind reloaded cvr@${versionString(cvr.version)}`);
305
+ this.#pipelineResets.add(1, { reason: "behind-cvr" });
306
+ this.#pipelinesHydrated = false;
307
+ this.connContextManager.setSharedRetransformReady(false);
308
+ this.#pipelines.reset(must(cvr.clientSchema, "cvr.clientSchema missing after initialization"));
309
+ return true;
310
+ }
205
311
  readyState() {
206
- return Promise.race([this.#initialized.promise, this.#drainCoordinator.draining]);
312
+ return new Promise((resolve, reject) => {
313
+ const unsubscribe = this.#drainCoordinator.onDraining(() => resolve("draining"));
314
+ this.#initialized.promise.then((state) => {
315
+ unsubscribe();
316
+ resolve(state);
317
+ }, (err) => {
318
+ unsubscribe();
319
+ reject(err);
320
+ });
321
+ });
207
322
  }
208
323
  async run() {
209
324
  try {
325
+ this.#scheduleShutdown(this.#keepaliveMs);
210
326
  if (await this.readyState() === "draining") {
211
327
  this.#lc.debug?.(`draining view-syncer ${this.id} before running`);
212
328
  this.stop();
@@ -227,17 +343,28 @@ var ViewSyncerService = class {
227
343
  lc.info?.(`resetting CVR: ${message}`);
228
344
  throw new ClientNotFoundError(message);
229
345
  }
346
+ let previousQueries;
230
347
  if (this.#pipelinesHydrated) {
231
348
  const result = await this.#advancePipelines(lc, cvr);
232
349
  if (result === "success") return;
233
- lc.info?.(`resetting pipelines: ${result.message}`);
350
+ lc.info?.(`resetting pipelines: ${result.message}${result.breakdown ? ` (${result.breakdown})` : ""}`);
234
351
  this.#pipelineResets.add(1, { reason: result.reason });
352
+ switch (result.reason) {
353
+ case "advancement-timeout":
354
+ case "scalar-subquery":
355
+ case "truncation":
356
+ case "schema-change":
357
+ if (!Object.values(cvr.queries).some((q) => q.type === "client")) previousQueries = new Map(this.#pipelines.queries());
358
+ break;
359
+ case "permissions-change": break;
360
+ default: unreachable(result.reason);
361
+ }
235
362
  this.#pipelines.reset(clientSchema);
236
363
  this.#pipelinesHydrated = false;
237
364
  this.connContextManager.setSharedRetransformReady(false);
238
365
  }
239
366
  const backgroundConnCtx = this.connContextManager.getBackgroundConnectionContext();
240
- if (backgroundConnCtx) await this.#maybeHydratePipelines(lc, cvr, backgroundConnCtx);
367
+ if (backgroundConnCtx) await this.#maybeHydratePipelines(lc, cvr, backgroundConnCtx, previousQueries);
241
368
  else lc.info?.("No validated background connection; deferring pipeline init");
242
369
  });
243
370
  }
@@ -275,17 +402,31 @@ var ViewSyncerService = class {
275
402
  * - Syncs missing, errored, or drifted queries via `#syncQueryPipelineSet`.
276
403
  * - Sets `#pipelinesHydrated = true` and enables shared retransformations.
277
404
  */
278
- async #maybeHydratePipelines(lc, cvr, connCtx) {
405
+ async #maybeHydratePipelines(lc, cvr, connCtx, previousQueries) {
279
406
  if (!this.#pipelines.initialized()) return;
280
- const version = this.#pipelines.advanceWithoutDiff();
407
+ let version;
408
+ try {
409
+ version = this.#pipelines.advanceWithoutDiff();
410
+ } catch (e) {
411
+ if (!(e instanceof ResetPipelinesSignal)) throw e;
412
+ lc.info?.(`resetting pipelines: ${e.message}${e.breakdown ? ` (${e.breakdown})` : ""}`);
413
+ this.#pipelineResets.add(1, { reason: e.reason });
414
+ this.#pipelines.reset(must(cvr.clientSchema, "cvr.clientSchema missing after initialization"));
415
+ version = this.#pipelines.currentVersion();
416
+ }
281
417
  const cvrVer = versionString(cvr.version);
282
418
  if (version < cvr.version.stateVersion) {
283
419
  lc.debug?.(`replica@${version} is behind cvr@${cvrVer}`);
284
420
  return;
285
421
  }
286
422
  lc.info?.(`init pipelines@${version} (cvr@${cvrVer})`);
287
- const driftedQueryIDs = await this.#hydrateUnchangedQueries(lc, cvr, connCtx);
288
- await this.#syncQueryPipelineSet(lc, cvr, "missing", connCtx, driftedQueryIDs);
423
+ const hydrationBudget = new HydrationBudget(this.#config.viewSyncerHydrationBudgetMs ?? 0, this.#now);
424
+ const hydrationPassStats = {
425
+ activeHydratedQueries: 0,
426
+ inactiveHydratedQueries: 0
427
+ };
428
+ const driftedQueryIDs = await this.#hydrateUnchangedQueries(lc, cvr, connCtx, hydrationPassStats, hydrationBudget, previousQueries);
429
+ await this.#syncQueryPipelineSet(lc, cvr, "missing", connCtx, driftedQueryIDs, hydrationBudget, hydrationPassStats, previousQueries);
289
430
  this.#pipelinesHydrated = true;
290
431
  this.connContextManager.setSharedRetransformReady(true);
291
432
  }
@@ -379,7 +520,14 @@ var ViewSyncerService = class {
379
520
  return true;
380
521
  }
381
522
  #shutdownTimer = null;
523
+ #stopShutdownTimer() {
524
+ if (this.#shutdownTimer !== null) {
525
+ clearTimeout(this.#shutdownTimer);
526
+ this.#shutdownTimer = null;
527
+ }
528
+ }
382
529
  #scheduleShutdown(delayMs = 0) {
530
+ if (this.#shuttingDown) return;
383
531
  this.#shutdownTimer ??= this.#setTimeout(() => {
384
532
  this.#shutdownTimer = null;
385
533
  this.#runInLockWithCVR(() => {}).catch((e) => this.#stateChanges.fail(e));
@@ -426,6 +574,7 @@ var ViewSyncerService = class {
426
574
  */
427
575
  #scheduleAuthMaintenance(lc) {
428
576
  this.#stopAuthMaintenanceTimer();
577
+ if (this.#shuttingDown) return;
429
578
  const plan = this.connContextManager.planMaintenance();
430
579
  if (plan.earliestDeadlineAt === void 0) {
431
580
  lc.debug?.("No auth maintenance wakeup scheduled");
@@ -531,17 +680,41 @@ var ViewSyncerService = class {
531
680
  this.#ttlClockBase = now;
532
681
  return ttlClock;
533
682
  }
534
- #flushUpdater(lc, updater) {
683
+ /**
684
+ * @param patchesPoked Whether patches computed against the updater's CVR
685
+ * have already been poked to clients. If so, the CVR is checked to be
686
+ * current even when the flush has nothing to write: another
687
+ * view-syncer may have already committed identical rows at a newer
688
+ * version, which would otherwise leave this one poking from a stale
689
+ * CVR whose version it cannot advance.
690
+ */
691
+ #flushUpdater(lc, updater, patchesPoked = false) {
535
692
  return startAsyncSpan(tracer, "vs.#flushUpdater", () => this.#runPriorityOp(lc, "flushing cvr", async () => {
536
693
  const now = Date.now();
537
694
  const ttlClock = this.#getTTLClock(now);
538
- const { cvr, flushed } = await updater.flush(lc, this.#lastConnectTime, now, ttlClock);
695
+ const { cvr, flushed } = await updater.flush(lc, this.#lastConnectTime, now, ttlClock, patchesPoked);
539
696
  if (flushed) this.#startTTLClockInterval(lc);
540
697
  return cvr;
541
698
  }));
542
699
  }
700
+ /**
701
+ * Flushes an updater whose changes have already been poked. If the flush
702
+ * fails (e.g. the CVR was concurrently modified), the poke is cancelled
703
+ * before the error propagates. The error may only fail the client that
704
+ * initiated the operation, and any other client left mid-poke would fail
705
+ * its next pokeStart.
706
+ */
707
+ async #flushPoked(lc, updater, pokers) {
708
+ try {
709
+ return await this.#flushUpdater(lc, updater, pokers.patchesSent);
710
+ } catch (e) {
711
+ await pokers.cancel();
712
+ throw e;
713
+ }
714
+ }
543
715
  #startTTLClockInterval(lc) {
544
716
  this.#stopTTLClockInterval();
717
+ if (this.#shuttingDown) return;
545
718
  this.#ttlClockInterval = this.#setTimeout(() => {
546
719
  this.#updateTTLClockInCVRWithoutLock(lc);
547
720
  this.#startTTLClockInterval(lc);
@@ -570,7 +743,7 @@ var ViewSyncerService = class {
570
743
  if (cmpVersions(cvr.version, this.#cvr.version) < 0) {
571
744
  const newCVR = this.#cvr;
572
745
  await startAsyncSpan(tracer, "vs.#updateCVRConfig.pokeClients", async () => {
573
- const pokers = startPoke(this.#getClients(cvr.version), newCVR.version);
746
+ const pokers = startPoke(lc, this.#getClients(cvr.version), newCVR.version);
574
747
  for (const patch of patches) await pokers.addPatch(patch);
575
748
  await pokers.end(newCVR.version);
576
749
  });
@@ -672,6 +845,7 @@ var ViewSyncerService = class {
672
845
  #scheduleExpireEviction(lc, cvr) {
673
846
  const { ttlClock } = cvr;
674
847
  this.#stopExpireTimer();
848
+ if (this.#shuttingDown) return;
675
849
  const next = nextEvictionTime(cvr);
676
850
  if (next === void 0) {
677
851
  lc.debug?.("no inactive queries with ttl");
@@ -699,7 +873,7 @@ var ViewSyncerService = class {
699
873
  *
700
874
  * This must be called from within the #lock.
701
875
  */
702
- async #hydrateUnchangedQueries(lc, cvr, connCtx) {
876
+ async #hydrateUnchangedQueries(lc, cvr, connCtx, hydrationPassStats, hydrationBudget, previousQueries) {
703
877
  assert(this.#pipelines.initialized(), "pipelines must be initialized");
704
878
  const dbVersion = this.#pipelines.currentVersion();
705
879
  const cvrVersion = cvr.version;
@@ -708,25 +882,27 @@ var ViewSyncerService = class {
708
882
  return /* @__PURE__ */ new Set();
709
883
  }
710
884
  const gotQueries = Object.entries(cvr.queries).filter(([_, state]) => state.transformationHash !== void 0);
885
+ const { required: requiredGotQueries } = classifyQueriesForHydration(gotQueries.map(([, query]) => query));
711
886
  const customQueries = /* @__PURE__ */ new Map();
712
887
  const otherQueries = [];
713
- let inactivatedCount = 0;
714
- for (const [, query] of gotQueries) {
715
- if (query.type !== "internal" && Object.values(query.clientState).every(({ inactivatedAt }) => inactivatedAt !== void 0)) {
716
- inactivatedCount++;
717
- continue;
718
- }
719
- if (query.type === "custom") customQueries.set(query.id, query);
720
- else otherQueries.push(query);
721
- }
888
+ const inactivatedCount = gotQueries.length - requiredGotQueries.length;
722
889
  const transformedQueries = [];
890
+ for (const query of requiredGotQueries) if (query.type === "custom") {
891
+ const previous = previousQueries?.get(query.id);
892
+ if (previous && previous.transformationHash === query.transformationHash) transformedQueries.push({
893
+ id: query.id,
894
+ transformationHash: previous.transformationHash,
895
+ transformedAst: previous.originalAst ?? previous.transformedAst
896
+ });
897
+ else customQueries.set(query.id, query);
898
+ } else otherQueries.push(query);
723
899
  let customErrorCount = 0;
724
900
  let customHashMismatchCount = 0;
725
901
  let otherHashMismatchCount = 0;
726
902
  if (customQueries.size > 0 && !this.#customQueryTransformer) lc.warn?.("Custom/named queries were requested but no `ZERO_QUERY_URL` is configured for Zero Cache.");
727
903
  const customQueryTransformer = this.#customQueryTransformer;
728
904
  if (customQueryTransformer && customQueries.size > 0) {
729
- const transformedCustomQueries = await this.#runPriorityOp(lc, "#hydrateUnchangedQueries transforming custom queries", () => customQueryTransformer.transform(connCtx, customQueries.values()));
905
+ const transformedCustomQueries = await hydrationBudget.excluding(() => this.#runPriorityOp(lc, "#hydrateUnchangedQueries transforming custom queries", () => customQueryTransformer.transform(connCtx, customQueries.values())));
730
906
  if (transformedCustomQueries.kind === "success" && !transformedCustomQueries.cached) this.connContextManager.validateConnection(connCtx, connCtx.revision, transformedCustomQueries.validation);
731
907
  if (Array.isArray(transformedCustomQueries.result)) for (const q of transformedCustomQueries.result) if ("error" in q) customErrorCount++;
732
908
  else if (q.transformationHash !== customQueries.get(q.id)?.transformationHash) customHashMismatchCount++;
@@ -746,6 +922,10 @@ var ViewSyncerService = class {
746
922
  for (const { id: queryID, transformationHash, transformedAst } of transformedQueries) {
747
923
  const query = cvr.queries[queryID];
748
924
  const queryName = query.type === "custom" ? query.name : void 0;
925
+ if (query.type !== "internal" && this.#hydrationCircuitBreaker.isOpen(transformationHash)) {
926
+ lc.info?.(`skipping hydration of ${queryID}: hydration circuit breaker open`);
927
+ continue;
928
+ }
749
929
  const covered = queryCoveringIndex ? this.#findQueryCoverageShadowHit(queryCoveringIndex, queryID, transformationHash, transformedAst, queryName) : void 0;
750
930
  totalHydratedQueries++;
751
931
  if (covered) {
@@ -754,24 +934,46 @@ var ViewSyncerService = class {
754
934
  }
755
935
  const timer = new TimeSliceTimer(lc);
756
936
  let count = 0;
937
+ let timedOut = false;
757
938
  await startAsyncSpan(tracer, "vs.#hydrateUnchangedQueries.addQuery", async (span) => {
758
939
  span.setAttribute("queryHash", queryID);
759
940
  span.setAttribute("transformationHash", transformationHash);
760
941
  span.setAttribute("table", transformedAst.table);
761
942
  if (queryName !== void 0) span.setAttribute("queryName", queryName);
762
- for (const change of this.#pipelines.addQuery(transformationHash, queryID, transformedAst, await timer.start(), queryName, "unchanged-query-rehydrate")) if (change === "yield") await timer.yieldProcess("yield in hydrateUnchangedQueries");
763
- else count++;
943
+ for (const change of this.#pipelines.addQuery(transformationHash, queryID, transformedAst, await timer.start(), queryName, "unchanged-query-rehydrate")) if (change === "yield") {
944
+ if (query.type !== "internal" && this.#hydrationCircuitBreaker.exceeded(timer.totalElapsed())) {
945
+ timedOut = true;
946
+ await timer.yieldProcess("yield in hydrateUnchangedQueries");
947
+ break;
948
+ }
949
+ await timer.yieldProcess("yield in hydrateUnchangedQueries");
950
+ } else count++;
764
951
  });
765
952
  const elapsed = timer.totalElapsed();
953
+ if (timedOut) {
954
+ this.#recordHydrationTimeout(lc, {
955
+ id: queryID,
956
+ ast: transformedAst,
957
+ transformationHash,
958
+ name: queryName
959
+ }, elapsed, count);
960
+ continue;
961
+ }
962
+ hydrationPassStats.activeHydratedQueries++;
766
963
  this.#hydrations.add(1);
767
964
  this.#hydrationTime.recordMs(elapsed);
768
- this.#addQueryMaterializationServerMetric(transformationHash, elapsed);
769
- this.#inspectorDelegate.addQuery(transformationHash, transformedAst);
965
+ this.#addQueryMaterializationServerMetric(queryID, elapsed);
966
+ this.#inspectorDelegate.addQuery(queryID, transformedAst);
770
967
  lc.debug?.(`hydrated ${count} rows for ${queryID} (${elapsed} ms)`);
968
+ if (elapsed > this.#slowHydrateThreshold) this.#logSlowHydration(lc, {
969
+ id: queryID,
970
+ ast: transformedAst,
971
+ transformationHash,
972
+ name: queryName
973
+ }, elapsed);
771
974
  let drifted = false;
772
- const storedSigHex = cvr.queries[queryID]?.rowSetSignature;
773
- if (storedSigHex !== void 0 && storedSigHex !== null) {
774
- const priorSig = parseSignature(storedSigHex);
975
+ const priorSig = this.#cvrStore.rowSetSignature(queryID);
976
+ if (priorSig !== void 0) {
775
977
  const candidateSig = this.#pipelines.rowSetSignature(queryID) ?? 0n;
776
978
  if (priorSig !== candidateSig) {
777
979
  lc.warn?.(`rowSetSignature drift for query ${queryID}: prior=${priorSig.toString(16)} new=${candidateSig.toString(16)} (${count} rows). Removing from pipelines for full re-execution.`);
@@ -827,11 +1029,7 @@ var ViewSyncerService = class {
827
1029
  return;
828
1030
  }
829
1031
  const appErrorGroups = /* @__PURE__ */ new Map();
830
- for (const err of errorOrErrors) for (const clientId of getAffectedClientIDs([err.id])) {
831
- const group = appErrorGroups.get(clientId) ?? [];
832
- group.push(err);
833
- appErrorGroups.set(clientId, group);
834
- }
1032
+ for (const err of errorOrErrors) for (const clientId of getAffectedClientIDs([err.id])) getOrInsertComputed(appErrorGroups, clientId, newArray).push(err);
835
1033
  for (const [clientId, errors] of appErrorGroups) this.#clients.get(clientId)?.sendQueryTransformApplicationErrors(errors);
836
1034
  }
837
1035
  #addQueryMaterializationServerMetric(queryID, elapsed) {
@@ -867,7 +1065,10 @@ var ViewSyncerService = class {
867
1065
  *
868
1066
  * This must be called from within the #lock.
869
1067
  */
870
- #syncQueryPipelineSet(lc, cvr, customQueryTransformMode, connCtx, driftedQueryIDs = /* @__PURE__ */ new Set()) {
1068
+ #syncQueryPipelineSet(lc, cvr, customQueryTransformMode, connCtx, driftedQueryIDs = /* @__PURE__ */ new Set(), hydrationBudget = new HydrationBudget(this.#config.viewSyncerHydrationBudgetMs ?? 0, this.#now), hydrationPassStats = {
1069
+ activeHydratedQueries: 0,
1070
+ inactiveHydratedQueries: 0
1071
+ }, previousQueries) {
871
1072
  return startAsyncSpan(tracer, "vs.#syncQueryPipelineSet", async (span) => {
872
1073
  const start = performance.now();
873
1074
  span.setAttribute("clientGroupID", this.id);
@@ -876,34 +1077,42 @@ var ViewSyncerService = class {
876
1077
  const now = Date.now();
877
1078
  const ttlClock = this.#getTTLClock(now);
878
1079
  const cvrQueryEntires = Object.entries(cvr.queries);
879
- const customQueries = /* @__PURE__ */ new Map();
880
- const otherQueries = [];
881
1080
  const transformedQueries = [];
882
- for (const [id, query] of cvrQueryEntires) if (query.type === "custom") {
883
- assert(id === query.id, "custom query id mismatch");
884
- customQueries.set(id, query);
885
- } else otherQueries.push({
886
- id,
887
- query
888
- });
889
- for (const { id, query: origQuery } of otherQueries) {
890
- assert(id === origQuery.id, "query id mismatch");
891
- const transformed = transformAndHashQuery(lc, origQuery.id, origQuery.ast, must(this.#pipelines.currentPermissions()).permissions ?? { tables: {} }, connCtx.auth?.type === "jwt" ? connCtx.auth : void 0, origQuery.type === "internal");
892
- transformedQueries.push({
893
- id,
894
- origQuery,
895
- transformed
896
- });
897
- }
898
- if (customQueries.size > 0 && !this.#customQueryTransformer) lc.warn?.("Custom/named queries were requested but no `ZERO_QUERY_URL` is configured for Zero Cache.");
899
- let erroredQueryIDs;
900
- const customQueriesToTransform = customQueryTransformMode === "all" ? [...customQueries.values()] : customQueryTransformMode && [...customQueries.values()].filter((q) => !this.#pipelines.queries().has(q.id));
1081
+ const naturallyExpiredQueryIDs = new Set(cvrQueryEntires.map(([, query]) => query).filter((query) => expired(ttlClock, query)).map((query) => query.id));
1082
+ if (naturallyExpiredQueryIDs.size > 0) this.#queryEvictions.add(naturallyExpiredQueryIDs.size, { reason: "ttl" });
1083
+ const hydrationCandidates = cvrQueryEntires.map(([, query]) => query).filter((query) => !naturallyExpiredQueryIDs.has(query.id));
1084
+ const { required, optional } = classifyQueriesForHydration(hydrationCandidates);
1085
+ const requiredQueryIDs = new Set(required.map((query) => query.id));
1086
+ const optionalToHydrate = hydrationBudget.limitMs === 0 ? optional : optional.filter((query) => query.patchVersion !== void 0);
1087
+ if (!this.#customQueryTransformer && hydrationCandidates.some((query) => query.type === "custom")) lc.warn?.("Custom/named queries were requested but no `ZERO_QUERY_URL` is configured for Zero Cache.");
901
1088
  const customQueryTransformer = this.#customQueryTransformer;
902
- if (customQueryTransformer && customQueriesToTransform.length > 0) {
1089
+ const erroredQueryIDs = [];
1090
+ let transformedCustomQueryCount = 0;
1091
+ const transformOtherQueries = (queries) => {
1092
+ for (const origQuery of queries) {
1093
+ if (origQuery.type === "custom") continue;
1094
+ const transformed = transformAndHashQuery(lc, origQuery.id, origQuery.ast, must(this.#pipelines.currentPermissions()).permissions ?? { tables: {} }, connCtx.auth?.type === "jwt" ? connCtx.auth : void 0, origQuery.type === "internal");
1095
+ transformedQueries.push({
1096
+ id: origQuery.id,
1097
+ origQuery,
1098
+ transformed
1099
+ });
1100
+ }
1101
+ };
1102
+ const shouldTransformCustomQuery = (query) => {
1103
+ if (customQueryTransformMode === "all") return true;
1104
+ if (this.#pipelines.queries().has(query.id)) return false;
1105
+ const previous = previousQueries?.get(query.id);
1106
+ if (previous && previous.transformationHash === query.transformationHash) return false;
1107
+ return true;
1108
+ };
1109
+ const transformCustomQueries = async (queries) => {
1110
+ if (!customQueryTransformer || queries.length === 0) return;
1111
+ transformedCustomQueryCount += queries.length;
903
1112
  const transformStart = performance.now();
904
1113
  let transformedCustomQueries;
905
1114
  try {
906
- transformedCustomQueries = await this.#runPriorityOp(lc, "#syncQueryPipelineSet transforming custom queries", () => customQueryTransformer.transform(connCtx, customQueriesToTransform));
1115
+ transformedCustomQueries = await hydrationBudget.excluding(() => this.#runPriorityOp(lc, "#syncQueryPipelineSet transforming custom queries", () => customQueryTransformer.transform(connCtx, queries)));
907
1116
  if (transformedCustomQueries.kind === "failed") throw new ProtocolErrorWithLevel(transformedCustomQueries.result, "warn");
908
1117
  else {
909
1118
  if (!transformedCustomQueries.cached) this.connContextManager.validateConnection(connCtx, connCtx.revision, transformedCustomQueries.validation);
@@ -917,8 +1126,9 @@ var ViewSyncerService = class {
917
1126
  this.#queryTransformationTime.recordMs(transformDuration);
918
1127
  }
919
1128
  const successfullyTransformedCustomQueries = /* @__PURE__ */ new Map();
920
- erroredQueryIDs = this.#processTransformedCustomQueries(lc, transformedCustomQueries.result, (q) => {
921
- const origQuery = customQueries.get(q.id);
1129
+ const customQueryMap = new Map(queries.map((query) => [query.id, query]));
1130
+ erroredQueryIDs.push(...this.#processTransformedCustomQueries(lc, transformedCustomQueries.result, (q) => {
1131
+ const origQuery = customQueryMap.get(q.id);
922
1132
  if (origQuery) {
923
1133
  successfullyTransformedCustomQueries.set(q.id, q);
924
1134
  transformedQueries.push({
@@ -927,7 +1137,7 @@ var ViewSyncerService = class {
927
1137
  transformed: q
928
1138
  });
929
1139
  }
930
- }, customQueries);
1140
+ }, customQueryMap));
931
1141
  for (const [queryID, newTransform] of successfullyTransformedCustomQueries) {
932
1142
  const existingTransformHash = cvr.queries[queryID]?.transformationHash;
933
1143
  if (existingTransformHash) {
@@ -940,21 +1150,55 @@ var ViewSyncerService = class {
940
1150
  } else this.#queryTransformationNoOps.add(1);
941
1151
  }
942
1152
  }
1153
+ };
1154
+ const queriesToTransform = [...required, ...optionalToHydrate];
1155
+ transformOtherQueries(queriesToTransform);
1156
+ if (customQueryTransformMode === "missing" && previousQueries) {
1157
+ for (const query of queriesToTransform) if (query.type === "custom" && !this.#pipelines.queries().has(query.id)) {
1158
+ const previous = previousQueries.get(query.id);
1159
+ if (previous && previous.transformationHash === query.transformationHash) {
1160
+ this.#queryTransformationNoOps.add(1);
1161
+ transformedQueries.push({
1162
+ id: query.id,
1163
+ origQuery: query,
1164
+ transformed: {
1165
+ id: query.id,
1166
+ transformationHash: previous.transformationHash,
1167
+ transformedAst: previous.originalAst ?? previous.transformedAst
1168
+ }
1169
+ });
1170
+ }
1171
+ }
943
1172
  }
944
- const removeQueriesQueryIds = new Set([...Object.values(cvr.queries).filter((q) => expired(ttlClock, q)).map((q) => q.id), ...erroredQueryIDs || []]);
1173
+ await transformCustomQueries(queriesToTransform.filter((query) => query.type === "custom" && shouldTransformCustomQuery(query)));
1174
+ const circuitBrokenQueries = transformedQueries.filter(({ id, origQuery, transformed }) => origQuery.type !== "internal" && this.#pipelines.queries().get(id)?.transformationHash !== transformed.transformationHash && this.#hydrationCircuitBreaker.isOpen(transformed.transformationHash)).map(({ id, origQuery, transformed }) => ({
1175
+ id,
1176
+ transformationHash: transformed.transformationHash,
1177
+ name: origQuery.type === "custom" ? origQuery.name : void 0
1178
+ }));
1179
+ if (circuitBrokenQueries.length > 0) this.#rejectCircuitBrokenQueries(lc, cvr, circuitBrokenQueries);
1180
+ const removeQueriesQueryIds = new Set([
1181
+ ...naturallyExpiredQueryIDs,
1182
+ ...erroredQueryIDs,
1183
+ ...circuitBrokenQueries.map(({ id }) => id)
1184
+ ]);
945
1185
  const addQueries = transformedQueries.map(({ id, origQuery, transformed }) => ({
946
1186
  id,
947
1187
  ast: transformed.transformedAst,
948
1188
  transformationHash: transformed.transformationHash,
949
1189
  name: origQuery.type === "custom" ? origQuery.name : void 0
950
1190
  })).filter((q) => !removeQueriesQueryIds.has(q.id) && this.#pipelines.queries().get(q.id)?.transformationHash !== q.transformationHash);
951
- lc.info?.(`syncQueryPipelineSet: ${cvrQueryEntires.length} CVR queries, ${customQueriesToTransform.length} custom re-transformed, ${erroredQueryIDs?.length ?? 0} errored, ${removeQueriesQueryIds.size} to remove, ${addQueries.length} to add`);
1191
+ const hydrationOrder = new Map([...required, ...optional].map((query, index) => [query.id, index]));
1192
+ addQueries.sort((a, b) => must(hydrationOrder.get(a.id)) - must(hydrationOrder.get(b.id)));
1193
+ const requiredAddQueries = addQueries.filter((query) => requiredQueryIDs.has(query.id));
1194
+ const optionalAddQueries = addQueries.filter((query) => !requiredQueryIDs.has(query.id));
1195
+ lc.info?.(`syncQueryPipelineSet: ${cvrQueryEntires.length} CVR queries, ${transformedCustomQueryCount} custom re-transformed, ${erroredQueryIDs.length} errored, ${circuitBrokenQueries.length} circuit-broken, ${removeQueriesQueryIds.size} to remove, ${addQueries.length} to add`);
952
1196
  for (const q of addQueries) {
953
1197
  const orig = cvr.queries[q.id];
954
1198
  lc.debug?.("ViewSyncer adding query", q.ast, "transformed from", orig.type === "custom" ? orig.name : orig.ast);
955
1199
  }
956
1200
  if (addQueries.length > 0 || removeQueriesQueryIds.size > 0) {
957
- await this.#addAndRemoveQueries(lc, cvr, addQueries, Array.from(removeQueriesQueryIds, (id) => ({ id })), driftedQueryIDs);
1201
+ await this.#addAndRemoveQueries(lc, cvr, requiredAddQueries, optionalAddQueries, Array.from(removeQueriesQueryIds, (id) => ({ id })), hydrationBudget, hydrationPassStats, driftedQueryIDs);
958
1202
  if (addQueries.length > 0) this.#viewSyncerHydration.recordMs(performance.now() - start);
959
1203
  } else await this.#catchupClients(lc, cvr);
960
1204
  });
@@ -987,14 +1231,134 @@ var ViewSyncerService = class {
987
1231
  record.count++;
988
1232
  if (record.count >= THRASH_THRESHOLD) this.#lc.warn?.(`Query thrashing detected for query ${queryID}. ${record.count} replacements in 60s. This may indicate clients with different auth contexts connecting to the same client group.`);
989
1233
  }
990
- #addAndRemoveQueries(lc, cvr, addQueries, removeQueries, driftedQueryIDs = /* @__PURE__ */ new Set()) {
1234
+ /**
1235
+ * Records that hydrating `query` was aborted for exceeding the query
1236
+ * hydration timeout, and opens its circuit breaker.
1237
+ */
1238
+ #recordHydrationTimeout(lc, query, elapsedMs, rowCount) {
1239
+ this.#hydrationCircuitBreaker.trip(query.transformationHash);
1240
+ this.#hydrationTimeouts.add(1);
1241
+ if (!lc.warn) return;
1242
+ const shape = queryShape(query.ast);
1243
+ lc.warn("Query hydration aborted for exceeding the hydration timeout", {
1244
+ clientGroupID: this.id,
1245
+ queryHash: query.id,
1246
+ transformationHash: query.transformationHash,
1247
+ ...query.name !== void 0 && { queryName: query.name },
1248
+ queryShape: shape.hash,
1249
+ hydrationTimeoutMs: this.#hydrationCircuitBreaker.timeoutMs,
1250
+ hydrationElapsedMs: elapsedMs,
1251
+ ...rowCount !== void 0 && { hydrationRowCount: rowCount },
1252
+ circuitBreakerOpenMs: this.#hydrationCircuitBreaker.openMs,
1253
+ zql: shape.zql
1254
+ });
1255
+ }
1256
+ /**
1257
+ * Logs a hydration that exceeded the slow hydration threshold.
1258
+ *
1259
+ * The query is logged as its {@link queryShape}, with literal values
1260
+ * redacted, and each shape is logged at most once per
1261
+ * {@link SLOW_HYDRATION_LOG_WINDOW_MS}. The next log of a shape reports how
1262
+ * many slow hydrations of it were suppressed in the meantime.
1263
+ */
1264
+ #logSlowHydration(lc, query, elapsedMs) {
1265
+ if (!lc.warn) return;
1266
+ const stats = this.#pipelines.hydrationStats(query.id);
1267
+ const shape = stats?.shape ?? queryShape(query.ast);
1268
+ const suppressed = slowHydrationLogThrottle.admit(`${query.name ?? ""}:${shape.hash}`);
1269
+ if (suppressed === void 0) return;
1270
+ lc.warn("Slow query materialization", {
1271
+ zeroEvent: "query-slow-hydration",
1272
+ clientGroupID: this.id,
1273
+ queryHash: query.id,
1274
+ transformationHash: query.transformationHash,
1275
+ ...query.name !== void 0 && { queryName: query.name },
1276
+ queryShape: shape.hash,
1277
+ hydrationTimeMs: elapsedMs,
1278
+ ...stats && {
1279
+ hydrationRowCount: stats.rowCount,
1280
+ hydrationRowsRead: stats.rowsRead
1281
+ },
1282
+ ...stats !== void 0 && stats.planWarnings.length > 0 && { planWarnings: stats.planWarnings.map(planWarningMessage) },
1283
+ ...suppressed > 0 && { suppressedSinceLastLog: suppressed },
1284
+ zql: shape.zql
1285
+ });
1286
+ }
1287
+ /** Records that `query` was rejected without hydration by its open breaker. */
1288
+ #recordCircuitBreakerRejection(lc, query) {
1289
+ this.#hydrationCircuitBreakerRejections.add(1);
1290
+ lc.warn?.("Query rejected by its open hydration circuit breaker", {
1291
+ clientGroupID: this.id,
1292
+ queryHash: query.id,
1293
+ transformationHash: query.transformationHash,
1294
+ ...query.name !== void 0 && { queryName: query.name },
1295
+ hydrationTimeoutMs: this.#hydrationCircuitBreaker.timeoutMs,
1296
+ circuitBreakerOpenMs: this.#hydrationCircuitBreaker.openMs
1297
+ });
1298
+ }
1299
+ /**
1300
+ * Handles queries whose hydration circuit breaker is open: they are counted,
1301
+ * logged, and errored to the affected clients. The caller removes them from
1302
+ * the CVR.
1303
+ */
1304
+ #rejectCircuitBrokenQueries(lc, cvr, queries) {
1305
+ for (const query of queries) this.#recordCircuitBreakerRejection(lc, query);
1306
+ this.#queryEvictions.add(queries.length, { reason: "hydration-circuit-breaker" });
1307
+ this.#sendHydrationTimeoutErrors(cvr, queries);
1308
+ }
1309
+ /**
1310
+ * Sends a per-query error to every client that desires one of `queries`.
1311
+ * The error goes out as a `transformError` application error, which every
1312
+ * client understands as "this query errored" without affecting the
1313
+ * connection or the client's other queries.
1314
+ */
1315
+ #sendHydrationTimeoutErrors(cvr, queries) {
1316
+ const timeoutMs = this.#hydrationCircuitBreaker.timeoutMs;
1317
+ const errorsByClient = /* @__PURE__ */ new Map();
1318
+ for (const { id, name } of queries) {
1319
+ const query = cvr.queries[id];
1320
+ if (query === void 0 || query.type === "internal") continue;
1321
+ const error = {
1322
+ error: "app",
1323
+ id,
1324
+ name: name ?? (query.type === "custom" ? query.name : "legacy"),
1325
+ message: `Query hydration exceeded the ${timeoutMs}ms limit (ZERO_VIEW_SYNCER_QUERY_HYDRATION_TIMEOUT_MS) and was aborted`,
1326
+ details: {
1327
+ kind: "HydrationTimeout",
1328
+ timeoutMs
1329
+ }
1330
+ };
1331
+ for (const clientID of Object.keys(query.clientState)) getOrInsertComputed(errorsByClient, clientID, newArray).push(error);
1332
+ }
1333
+ for (const [clientID, errors] of errorsByClient) this.#clients.get(clientID)?.sendQueryTransformApplicationErrors(errors);
1334
+ }
1335
+ #recordHydrationBudgetExhaustion(lc, hydrationBudget, activeHydratedQueries, inactiveHydratedQueries, inactiveEvictedQueryIDs) {
1336
+ const elapsedMs = hydrationBudget.exhaustedAtMs;
1337
+ if (elapsedMs === void 0) return;
1338
+ this.#hydrationBudgetExhaustions.add(1);
1339
+ this.#hydrationBudgetEvictions.add(inactiveEvictedQueryIDs.length);
1340
+ this.#hydrationBudgetElapsed.record(elapsedMs);
1341
+ this.#hydrationBudgetOvershoot.record(Math.max(0, elapsedMs - hydrationBudget.limitMs));
1342
+ if (inactiveEvictedQueryIDs.length > 0) this.#queryEvictions.add(inactiveEvictedQueryIDs.length, { reason: "hydration-budget" });
1343
+ lc.info?.("view-syncer hydration budget exhausted", {
1344
+ clientGroupID: this.id,
1345
+ hydrationBudgetMs: hydrationBudget.limitMs,
1346
+ hydrationElapsedMs: elapsedMs,
1347
+ activeHydratedQueries,
1348
+ inactiveHydratedQueries,
1349
+ inactiveEvictedQueries: inactiveEvictedQueryIDs.length,
1350
+ firstEvictedQueryHash: inactiveEvictedQueryIDs[0] ?? null
1351
+ });
1352
+ }
1353
+ #addAndRemoveQueries(lc, cvr, requiredQueries, optionalQueries, removeQueries, hydrationBudget, hydrationPassStats, driftedQueryIDs = /* @__PURE__ */ new Set()) {
991
1354
  return startAsyncSpan(tracer, "vs.#addAndRemoveQueries", async () => {
1355
+ const addQueries = [...requiredQueries, ...optionalQueries];
992
1356
  assert(addQueries.length > 0 || removeQueries.length > 0, "Must have queries to add or remove");
993
1357
  const start = performance.now();
994
1358
  const stateVersion = this.#pipelines.currentVersion();
995
1359
  lc = lc.withContext("stateVersion", stateVersion);
996
1360
  lc.info?.(`hydrating ${addQueries.length} queries`);
997
- const updater = new CVRQueryDrivenUpdater(this.#cvrStore, cvr, stateVersion, this.#pipelines.replicaVersion, (queryID) => this.#pipelines.rowSetSignature(queryID));
1361
+ const updater = new CVRQueryDrivenUpdater(this.#cvrStore, cvr, stateVersion, this.#pipelines.replicaVersion, this.#pipelines);
998
1362
  const sameHashRehydratedQueryIDs = addQueries.filter((q) => cvr.queries[q.id]?.transformationHash === q.transformationHash).map((q) => q.id);
999
1363
  const trackQueriesWillBumpVersion = stateVersion > cvr.version.stateVersion || removeQueries.length > 0 || addQueries.some((q) => cvr.queries[q.id]?.transformationHash !== q.transformationHash);
1000
1364
  if (sameHashRehydratedQueryIDs.length > 0 && !trackQueriesWillBumpVersion) {
@@ -1005,7 +1369,9 @@ var ViewSyncerService = class {
1005
1369
  updater.ensureNewVersion();
1006
1370
  }
1007
1371
  const { queryPatches, newVersion } = updater.trackQueries(lc, addQueries, removeQueries);
1008
- const pokers = startPoke(this.#getClients(), newVersion);
1372
+ if (hydrationBudget.limitMs !== 0 && optionalQueries.length > 0) assert(cmpVersions(cvr.version, newVersion) < 0, "Optional hydration requires a final poke version before row processing so a removal is actually poked");
1373
+ const clients = this.#getClients();
1374
+ const pokers = startPoke(lc, clients, newVersion);
1009
1375
  for (const patch of queryPatches) await pokers.addPatch(patch);
1010
1376
  for (const q of removeQueries) {
1011
1377
  this.#pipelines.removeQuery(q.id);
@@ -1021,22 +1387,54 @@ var ViewSyncerService = class {
1021
1387
  let totalHydratedQueries = 0;
1022
1388
  let coveredHydratedQueries = 0;
1023
1389
  let firstCoveredQuery;
1390
+ const hydratedQueryIDs = [];
1391
+ const budgetEvictedQueryIDs = [];
1392
+ const timedOutQueries = [];
1393
+ const rejectedQueries = [];
1394
+ const circuitBreaker = this.#hydrationCircuitBreaker;
1024
1395
  const self = this;
1025
1396
  await yieldProcess(lc);
1026
- function* generateRowChanges(slowHydrateThreshold) {
1027
- for (const q of addQueries) {
1397
+ function* hydrateQueries(queries, optional, slowHydrateThreshold) {
1398
+ for (let i = 0; i < queries.length; i++) {
1399
+ if (optional && hydrationBudget.exhausted()) {
1400
+ budgetEvictedQueryIDs.push(...queries.slice(i).map((query) => query.id));
1401
+ return;
1402
+ }
1403
+ const q = must(queries[i]);
1028
1404
  let queryLC = lc.withContext("hash", q.id).withContext("queryHash", q.id).withContext("transformationHash", q.transformationHash);
1029
1405
  if (q.name !== void 0) queryLC = queryLC.withContext("queryName", q.name);
1030
1406
  queryLC.debug?.(`adding pipeline for query`, q.ast);
1407
+ const breakable = cvr.queries[q.id]?.type !== "internal";
1408
+ if (breakable && circuitBreaker.isOpen(q.transformationHash)) {
1409
+ rejectedQueries.push(q);
1410
+ self.#recordCircuitBreakerRejection(queryLC, q);
1411
+ continue;
1412
+ }
1031
1413
  const covered = queryCoveringIndex ? self.#findQueryCoverageShadowHit(queryCoveringIndex, q.id, q.transformationHash, q.ast, q.name) : void 0;
1032
1414
  totalHydratedQueries++;
1033
1415
  if (covered) {
1034
1416
  coveredHydratedQueries++;
1035
1417
  firstCoveredQuery ??= covered;
1036
1418
  }
1037
- yield* pipelines.addQuery(q.transformationHash, q.id, q.ast, timer.startWithoutYielding(), q.name, "query-set-sync");
1419
+ let timedOut = false;
1420
+ for (const change of pipelines.addQuery(q.transformationHash, q.id, q.ast, timer.startWithoutYielding(), q.name, "query-set-sync")) {
1421
+ if (change === "yield" && breakable && circuitBreaker.exceeded(timer.totalElapsed())) {
1422
+ timedOut = true;
1423
+ yield change;
1424
+ break;
1425
+ }
1426
+ yield change;
1427
+ }
1038
1428
  const elapsed = timer.stop();
1039
1429
  totalProcessTime += elapsed;
1430
+ if (timedOut) {
1431
+ timedOutQueries.push(q);
1432
+ self.#recordHydrationTimeout(queryLC, q, elapsed);
1433
+ continue;
1434
+ }
1435
+ hydratedQueryIDs.push(q.id);
1436
+ if (optional) hydrationPassStats.inactiveHydratedQueries++;
1437
+ else hydrationPassStats.activeHydratedQueries++;
1040
1438
  self.#addQueryMaterializationServerMetric(q.id, elapsed);
1041
1439
  self.#inspectorDelegate.addQuery(q.id, q.ast);
1042
1440
  queryCoveringIndex?.add(q.id, {
@@ -1044,24 +1442,49 @@ var ViewSyncerService = class {
1044
1442
  transformationHash: q.transformationHash,
1045
1443
  ...q.name !== void 0 && { queryName: q.name }
1046
1444
  });
1047
- if (elapsed > slowHydrateThreshold) queryLC.warn?.("Slow query materialization", elapsed, q.ast);
1445
+ if (elapsed > slowHydrateThreshold) self.#logSlowHydration(queryLC, q, elapsed);
1048
1446
  manualSpan(tracer, "vs.addAndConsumeQuery", elapsed, {
1049
1447
  hash: q.id,
1050
1448
  transformationHash: q.transformationHash,
1051
1449
  ...q.name !== void 0 && { name: q.name }
1052
1450
  });
1451
+ hydrations.add(1);
1452
+ hydrationTime.recordMs(elapsed);
1453
+ }
1454
+ }
1455
+ function* generateRowChanges(slowHydrateThreshold) {
1456
+ yield* hydrateQueries(requiredQueries, false, slowHydrateThreshold);
1457
+ yield* hydrateQueries(optionalQueries, true, slowHydrateThreshold);
1458
+ }
1459
+ await this.#processChanges(lc, timer, generateRowChanges(this.#slowHydrateThreshold), (rows) => updater.received(lc, rows), pokers);
1460
+ const abortedQueries = [...timedOutQueries, ...rejectedQueries];
1461
+ if (abortedQueries.length > 0) {
1462
+ const abortedQueryIDs = abortedQueries.map(({ id }) => id);
1463
+ for (const patch of await updater.abortExecutedQueries(lc, abortedQueryIDs)) await pokers.addPatch(patch);
1464
+ for (const queryID of abortedQueryIDs) {
1465
+ this.#pipelines.removeQuery(queryID);
1466
+ this.#inspectorDelegate.removeQuery(queryID);
1467
+ this.#queryReplacements.delete(queryID);
1053
1468
  }
1054
- hydrations.add(1);
1055
- hydrationTime.recordMs(totalProcessTime);
1469
+ if (timedOutQueries.length > 0) this.#queryEvictions.add(timedOutQueries.length, { reason: "hydration-timeout" });
1470
+ if (rejectedQueries.length > 0) this.#queryEvictions.add(rejectedQueries.length, { reason: "hydration-circuit-breaker" });
1471
+ this.#sendHydrationTimeoutErrors(cvr, abortedQueries);
1056
1472
  }
1057
- await this.#processChanges(lc, timer, generateRowChanges(this.#slowHydrateThreshold), updater, pokers);
1473
+ for (const patch of updater.removeTrackedQueries(budgetEvictedQueryIDs)) await pokers.addPatch(patch);
1474
+ for (const queryID of budgetEvictedQueryIDs) {
1475
+ this.#pipelines.removeQuery(queryID);
1476
+ this.#inspectorDelegate.removeQuery(queryID);
1477
+ this.#queryReplacements.delete(queryID);
1478
+ }
1479
+ this.#recordHydrationBudgetExhaustion(lc, hydrationBudget, hydrationPassStats.activeHydratedQueries, hydrationPassStats.inactiveHydratedQueries, budgetEvictedQueryIDs);
1058
1480
  this.#logQueryCoverageShadowSummary(lc, "add", totalHydratedQueries, coveredHydratedQueries, firstCoveredQuery);
1059
1481
  await startAsyncSpan(tracer, "vs.#syncQueryPipelineSet.deleteUnreferencedRows", async () => {
1060
1482
  for (const patch of await updater.deleteUnreferencedRows(lc)) await pokers.addPatch(patch);
1061
1483
  });
1062
- this.#cvr = await this.#flushUpdater(lc, updater);
1484
+ this.#cvr = await this.#flushPoked(lc, updater, pokers);
1485
+ if (budgetEvictedQueryIDs.length > 0) this.#scheduleExpireEviction(lc, this.#cvr);
1063
1486
  const finalVersion = this.#cvr.version;
1064
- await this.#catchupClients(lc, cvr, finalVersion, addQueries.map((q) => q.id), pokers);
1487
+ await this.#catchupClients(lc, cvr, finalVersion, hydratedQueryIDs, pokers);
1065
1488
  await startAsyncSpan(tracer, "vs.#syncQueryPipelineSet.pokeEnd", () => pokers.end(finalVersion));
1066
1489
  this.#markVersionServed(stateVersion);
1067
1490
  const wallTime = performance.now() - start;
@@ -1090,7 +1513,7 @@ var ViewSyncerService = class {
1090
1513
  return startAsyncSpan(tracer, "vs.#catchupClients", async (span) => {
1091
1514
  current ??= cvr.version;
1092
1515
  const clients = this.#getClients();
1093
- const pokers = usePokers ?? startPoke(clients, cvr.version);
1516
+ const pokers = usePokers ?? startPoke(lc, clients, cvr.version);
1094
1517
  span.setAttribute("numClients", clients.length);
1095
1518
  const catchupFrom = clients.map((c) => c.version()).reduce((a, b) => cmpVersions(a, b) < 0 ? a : b, cvr.version);
1096
1519
  const rowPatches = this.#cvrStore.catchupRowPatches(lc, catchupFrom, cvr, current, excludeQueryHashes);
@@ -1137,7 +1560,7 @@ var ViewSyncerService = class {
1137
1560
  }
1138
1561
  });
1139
1562
  }
1140
- #processChanges(lc, timer, changes, updater, pokers) {
1563
+ #processChanges(lc, timer, changes, onBatch, pokers) {
1141
1564
  return startAsyncSpan(tracer, "vs.#processChanges", async () => {
1142
1565
  const start = performance.now();
1143
1566
  const rows = new CustomKeyMap(rowIDString);
@@ -1146,7 +1569,7 @@ var ViewSyncerService = class {
1146
1569
  const wallElapsed = performance.now() - start;
1147
1570
  total += rows.size;
1148
1571
  lc.debug?.(`processing ${rows.size} (of ${total}) rows (${wallElapsed} ms)`);
1149
- const patches = await updater.received(lc, rows);
1572
+ const patches = await onBatch(rows);
1150
1573
  await startAsyncSpan(tracer, "processBatch.flushToClient", async (span) => {
1151
1574
  span.setAttribute("patches", patches.length);
1152
1575
  for (const patch of patches) await pokers.addPatch(patch);
@@ -1212,29 +1635,60 @@ var ViewSyncerService = class {
1212
1635
  assert(this.#pipelines.initialized(), "pipelines must be initialized (advancePipelines");
1213
1636
  const start = performance.now();
1214
1637
  const timer = new TimeSliceTimer(lc);
1215
- const { version, numChanges, changes } = this.#pipelines.advance(timer);
1216
- lc = lc.withContext("newVersion", version);
1217
- const updater = new CVRQueryDrivenUpdater(this.#cvrStore, cvr, version, this.#pipelines.replicaVersion, (queryID) => this.#pipelines.rowSetSignature(queryID));
1218
- const pokers = startPoke(this.#getClients(cvr.version), updater.updatedVersion());
1219
- lc.debug?.(`applying ${numChanges} to advance to ${version}`);
1638
+ let outcome = { outcome: "error" };
1639
+ let setupTimeMs;
1220
1640
  try {
1221
- await this.#processChanges(lc, await timer.start(), changes, updater, pokers);
1222
- } catch (e) {
1223
- if (e instanceof ResetPipelinesSignal) {
1224
- await pokers.cancel();
1225
- return e;
1641
+ let pokers;
1642
+ let updater;
1643
+ let version;
1644
+ let numChanges = 0;
1645
+ try {
1646
+ const advancement = this.#pipelines.advance(timer);
1647
+ version = advancement.version;
1648
+ numChanges = advancement.numChanges;
1649
+ lc = lc.withContext("newVersion", version);
1650
+ const targetVersion = cmpVersions(cvr.version, { stateVersion: version }) < 0 ? { stateVersion: version } : cvr.version;
1651
+ pokers = startPoke(lc, this.#getClients(cvr.version), targetVersion);
1652
+ lc.debug?.(`applying ${numChanges} to advance to ${version}`);
1653
+ setupTimeMs = performance.now() - start;
1654
+ await this.#processChanges(lc, await timer.start(), advancement.changes, (rows) => {
1655
+ updater ??= new CVRQueryDrivenUpdater(this.#cvrStore, cvr, version, this.#pipelines.replicaVersion, this.#pipelines);
1656
+ return updater.received(lc, rows);
1657
+ }, pokers);
1658
+ } catch (e) {
1659
+ setupTimeMs ??= performance.now() - start;
1660
+ if (e instanceof ResetPipelinesSignal) {
1661
+ await pokers?.cancel();
1662
+ this.#cvrStore.discardPending();
1663
+ outcome = {
1664
+ outcome: "reset",
1665
+ reason: e.reason
1666
+ };
1667
+ return e;
1668
+ }
1669
+ throw e;
1226
1670
  }
1227
- throw e;
1671
+ assert(pokers && version !== void 0, "advancement state missing");
1672
+ if (updater) this.#cvr = await this.#flushPoked(lc, updater, pokers);
1673
+ const finalVersion = (this.#cvr ?? cvr).version;
1674
+ await startAsyncSpan(tracer, "vs.#advancePipelines.pokeEnd", () => pokers.end(finalVersion));
1675
+ this.#markVersionServed(version);
1676
+ const wallTime = performance.now() - start;
1677
+ const totalProcessTime = timer.totalElapsed();
1678
+ lc.debug?.(`finished processing advancement of ${numChanges} changes ((process: ${totalProcessTime} ms, wall: ${wallTime} ms))`);
1679
+ this.#transactionAdvanceTime.recordMs(totalProcessTime);
1680
+ outcome = { outcome: "success" };
1681
+ return "success";
1682
+ } finally {
1683
+ const setupMs = must(setupTimeMs);
1684
+ const processingTimeMs = setupMs + timer.totalElapsed();
1685
+ const wallTimeMs = performance.now() - start;
1686
+ this.#advancementMetrics.record({
1687
+ processingTimeMs,
1688
+ setupTimeMs: setupMs,
1689
+ wallTimeMs
1690
+ }, outcome);
1228
1691
  }
1229
- this.#cvr = await this.#flushUpdater(lc, updater);
1230
- const finalVersion = this.#cvr.version;
1231
- await startAsyncSpan(tracer, "vs.#advancePipelines.pokeEnd", () => pokers.end(finalVersion));
1232
- this.#markVersionServed(version);
1233
- const wallTime = performance.now() - start;
1234
- const totalProcessTime = timer.totalElapsed();
1235
- lc.debug?.(`finished processing advancement of ${numChanges} changes ((process: ${totalProcessTime} ms, wall: ${wallTime} ms))`);
1236
- this.#transactionAdvanceTime.recordMs(totalProcessTime);
1237
- return "success";
1238
1692
  });
1239
1693
  }
1240
1694
  async inspect(selector, msg) {
@@ -1246,7 +1700,7 @@ var ViewSyncerService = class {
1246
1700
  clientID,
1247
1701
  wsID: client.wsID
1248
1702
  });
1249
- return handleInspect(lc, body, cvr, client, this.#inspectorDelegate, this.id, this.#cvrStore, this.#config, connCtx);
1703
+ return handleInspect(lc, body, cvr, client, this.#inspectorDelegate, this.id, this, this.#cvrStore, this.#config, connCtx);
1250
1704
  };
1251
1705
  async #runBackgroundRetransform(lc) {
1252
1706
  const attemptRetransform = async (connCtx) => {
@@ -1333,15 +1787,18 @@ var ViewSyncerService = class {
1333
1787
  return this.#stopped.promise;
1334
1788
  }
1335
1789
  async #cleanup(err) {
1790
+ this.#shuttingDown = true;
1336
1791
  this.connContextManager.setSharedRetransformReady(false);
1337
1792
  this.#stopTTLClockInterval();
1338
1793
  this.#stopExpireTimer();
1339
1794
  this.#stopAuthMaintenanceTimer();
1795
+ this.#stopShutdownTimer();
1340
1796
  this.#customQueryTransformer?.destroy();
1341
1797
  for (const client of this.#clients.values()) if (err) client.fail(err);
1342
1798
  else client.close(`closed clientGroupID=${this.id}`);
1343
1799
  await this.#lock.withLock(() => {});
1344
1800
  this.#pipelines.destroy();
1801
+ this.#inspectorDelegate.clearAuthenticated(this.id, this);
1345
1802
  }
1346
1803
  /**
1347
1804
  * Test helper: Manually mark initialization as complete.
@@ -1377,8 +1834,10 @@ function isTransformFailedError(error) {
1377
1834
  return error.errorBody.kind === "TransformFailed" && !isAuthErrorBody(error.errorBody);
1378
1835
  }
1379
1836
  /**
1380
- * A query must be expired for all clients in order to be considered
1381
- * expired.
1837
+ * Whether a query's TTL has elapsed. A query must be expired for all clients
1838
+ * in order to be considered expired.
1839
+ *
1840
+ * Exported for testing.
1382
1841
  */
1383
1842
  function expired(ttlClock, q) {
1384
1843
  if (q.type === "internal") return false;