@rocicorp/zero 0.26.1 → 0.26.2-canary.1

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 (1086) hide show
  1. package/out/_virtual/_@oxc-project_runtime@0.115.0/helpers/usingCtx.js +57 -0
  2. package/out/_virtual/_rolldown/runtime.js +27 -0
  3. package/out/analyze-query/src/bin-analyze.js +195 -283
  4. package/out/analyze-query/src/bin-analyze.js.map +1 -1
  5. package/out/analyze-query/src/bin-transform.js +35 -40
  6. package/out/analyze-query/src/bin-transform.js.map +1 -1
  7. package/out/analyze-query/src/explain-queries.js +11 -13
  8. package/out/analyze-query/src/explain-queries.js.map +1 -1
  9. package/out/analyze-query/src/run-ast.js +68 -103
  10. package/out/analyze-query/src/run-ast.js.map +1 -1
  11. package/out/ast-to-zql/src/ast-to-zql.js +105 -153
  12. package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
  13. package/out/ast-to-zql/src/bin.js +57 -62
  14. package/out/ast-to-zql/src/bin.js.map +1 -1
  15. package/out/ast-to-zql/src/format.js +14 -13
  16. package/out/ast-to-zql/src/format.js.map +1 -1
  17. package/out/datadog/src/datadog-log-sink.js +148 -213
  18. package/out/datadog/src/datadog-log-sink.js.map +1 -1
  19. package/out/otel/src/enabled.js +9 -11
  20. package/out/otel/src/enabled.js.map +1 -1
  21. package/out/otel/src/log-options.js +25 -35
  22. package/out/otel/src/log-options.js.map +1 -1
  23. package/out/otel/src/maybe-time.js +13 -14
  24. package/out/otel/src/maybe-time.js.map +1 -1
  25. package/out/otel/src/span.js +23 -26
  26. package/out/otel/src/span.js.map +1 -1
  27. package/out/otel/src/test-log-config.js +11 -10
  28. package/out/otel/src/test-log-config.js.map +1 -1
  29. package/out/otel/src/version.js +6 -5
  30. package/out/otel/src/version.js.map +1 -1
  31. package/out/replicache/src/async-iterable-to-array.js +8 -9
  32. package/out/replicache/src/async-iterable-to-array.js.map +1 -1
  33. package/out/replicache/src/bg-interval.js +28 -35
  34. package/out/replicache/src/bg-interval.js.map +1 -1
  35. package/out/replicache/src/btree/diff.js +6 -5
  36. package/out/replicache/src/btree/diff.js.map +1 -1
  37. package/out/replicache/src/btree/node.js +281 -372
  38. package/out/replicache/src/btree/node.js.map +1 -1
  39. package/out/replicache/src/btree/read.js +155 -256
  40. package/out/replicache/src/btree/read.js.map +1 -1
  41. package/out/replicache/src/btree/splice.js +60 -80
  42. package/out/replicache/src/btree/splice.js.map +1 -1
  43. package/out/replicache/src/btree/write.js +134 -158
  44. package/out/replicache/src/btree/write.js.map +1 -1
  45. package/out/replicache/src/call-default-fetch.js +28 -32
  46. package/out/replicache/src/call-default-fetch.js.map +1 -1
  47. package/out/replicache/src/config.js +2 -0
  48. package/out/replicache/src/connection-loop-delegates.js +31 -33
  49. package/out/replicache/src/connection-loop-delegates.js.map +1 -1
  50. package/out/replicache/src/connection-loop.js +174 -240
  51. package/out/replicache/src/connection-loop.js.map +1 -1
  52. package/out/replicache/src/cookies.js +22 -32
  53. package/out/replicache/src/cookies.js.map +1 -1
  54. package/out/replicache/src/dag/chunk.js +44 -50
  55. package/out/replicache/src/dag/chunk.js.map +1 -1
  56. package/out/replicache/src/dag/gc.js +94 -114
  57. package/out/replicache/src/dag/gc.js.map +1 -1
  58. package/out/replicache/src/dag/key.js +9 -11
  59. package/out/replicache/src/dag/key.js.map +1 -1
  60. package/out/replicache/src/dag/lazy-store.js +458 -510
  61. package/out/replicache/src/dag/lazy-store.js.map +1 -1
  62. package/out/replicache/src/dag/store-impl.js +147 -178
  63. package/out/replicache/src/dag/store-impl.js.map +1 -1
  64. package/out/replicache/src/dag/store.js +19 -22
  65. package/out/replicache/src/dag/store.js.map +1 -1
  66. package/out/replicache/src/dag/visitor.js +23 -21
  67. package/out/replicache/src/dag/visitor.js.map +1 -1
  68. package/out/replicache/src/db/commit.js +209 -283
  69. package/out/replicache/src/db/commit.js.map +1 -1
  70. package/out/replicache/src/db/index.js +79 -122
  71. package/out/replicache/src/db/index.js.map +1 -1
  72. package/out/replicache/src/db/read.js +44 -60
  73. package/out/replicache/src/db/read.js.map +1 -1
  74. package/out/replicache/src/db/rebase.js +22 -77
  75. package/out/replicache/src/db/rebase.js.map +1 -1
  76. package/out/replicache/src/db/write.js +162 -296
  77. package/out/replicache/src/db/write.js.map +1 -1
  78. package/out/replicache/src/deleted-clients.js +59 -87
  79. package/out/replicache/src/deleted-clients.js.map +1 -1
  80. package/out/replicache/src/error-responses.js +18 -26
  81. package/out/replicache/src/error-responses.js.map +1 -1
  82. package/out/replicache/src/expo-sqlite.js +2 -0
  83. package/out/replicache/src/frozen-json.js +74 -108
  84. package/out/replicache/src/frozen-json.js.map +1 -1
  85. package/out/replicache/src/get-default-puller.js +34 -46
  86. package/out/replicache/src/get-default-puller.js.map +1 -1
  87. package/out/replicache/src/get-default-pusher.js +25 -33
  88. package/out/replicache/src/get-default-pusher.js.map +1 -1
  89. package/out/replicache/src/get-kv-store-provider.js +18 -20
  90. package/out/replicache/src/get-kv-store-provider.js.map +1 -1
  91. package/out/replicache/src/hash.js +29 -29
  92. package/out/replicache/src/hash.js.map +1 -1
  93. package/out/replicache/src/http-request-info.js +9 -8
  94. package/out/replicache/src/http-request-info.js.map +1 -1
  95. package/out/replicache/src/impl.js +2 -0
  96. package/out/replicache/src/index-defs.js +17 -28
  97. package/out/replicache/src/index-defs.js.map +1 -1
  98. package/out/replicache/src/kv/expo-sqlite/store.js +52 -50
  99. package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
  100. package/out/replicache/src/kv/idb-store-with-mem-fallback.js +71 -68
  101. package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +1 -1
  102. package/out/replicache/src/kv/idb-store.js +144 -168
  103. package/out/replicache/src/kv/idb-store.js.map +1 -1
  104. package/out/replicache/src/kv/mem-store.js +57 -45
  105. package/out/replicache/src/kv/mem-store.js.map +1 -1
  106. package/out/replicache/src/kv/op-sqlite/store.js +56 -62
  107. package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
  108. package/out/replicache/src/kv/op-sqlite/types.d.ts.map +1 -1
  109. package/out/replicache/src/kv/op-sqlite/types.js +7 -6
  110. package/out/replicache/src/kv/op-sqlite/types.js.map +1 -1
  111. package/out/replicache/src/kv/read-impl.js +26 -25
  112. package/out/replicache/src/kv/read-impl.js.map +1 -1
  113. package/out/replicache/src/kv/sqlite-store.js +194 -207
  114. package/out/replicache/src/kv/sqlite-store.js.map +1 -1
  115. package/out/replicache/src/kv/throw-if-closed.js +12 -19
  116. package/out/replicache/src/kv/throw-if-closed.js.map +1 -1
  117. package/out/replicache/src/kv/write-impl-base.js +44 -56
  118. package/out/replicache/src/kv/write-impl-base.js.map +1 -1
  119. package/out/replicache/src/kv/write-impl.js +22 -26
  120. package/out/replicache/src/kv/write-impl.js.map +1 -1
  121. package/out/replicache/src/lazy.js +10 -11
  122. package/out/replicache/src/lazy.js.map +1 -1
  123. package/out/replicache/src/log-options.js +14 -7
  124. package/out/replicache/src/log-options.js.map +1 -1
  125. package/out/replicache/src/make-idb-name.js +14 -9
  126. package/out/replicache/src/make-idb-name.js.map +1 -1
  127. package/out/replicache/src/mutation-recovery.js +12 -0
  128. package/out/replicache/src/mutation-recovery.js.map +1 -0
  129. package/out/replicache/src/new-client-channel.js +34 -42
  130. package/out/replicache/src/new-client-channel.js.map +1 -1
  131. package/out/replicache/src/on-persist-channel.js +26 -29
  132. package/out/replicache/src/on-persist-channel.js.map +1 -1
  133. package/out/replicache/src/op-sqlite.js +2 -0
  134. package/out/replicache/src/patch-operation.js +27 -36
  135. package/out/replicache/src/patch-operation.js.map +1 -1
  136. package/out/replicache/src/pending-mutations.js +14 -12
  137. package/out/replicache/src/pending-mutations.js.map +1 -1
  138. package/out/replicache/src/persist/client-gc.js +36 -51
  139. package/out/replicache/src/persist/client-gc.js.map +1 -1
  140. package/out/replicache/src/persist/client-group-gc.js +29 -36
  141. package/out/replicache/src/persist/client-group-gc.js.map +1 -1
  142. package/out/replicache/src/persist/client-groups.js +80 -154
  143. package/out/replicache/src/persist/client-groups.js.map +1 -1
  144. package/out/replicache/src/persist/clients.js +212 -307
  145. package/out/replicache/src/persist/clients.js.map +1 -1
  146. package/out/replicache/src/persist/collect-idb-databases.js +109 -171
  147. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
  148. package/out/replicache/src/persist/gather-mem-only-visitor.js +23 -24
  149. package/out/replicache/src/persist/gather-mem-only-visitor.js.map +1 -1
  150. package/out/replicache/src/persist/gather-not-cached-visitor.js +35 -33
  151. package/out/replicache/src/persist/gather-not-cached-visitor.js.map +1 -1
  152. package/out/replicache/src/persist/heartbeat.js +31 -41
  153. package/out/replicache/src/persist/heartbeat.js.map +1 -1
  154. package/out/replicache/src/persist/idb-databases-store-db-name.js +9 -12
  155. package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -1
  156. package/out/replicache/src/persist/idb-databases-store.js +78 -97
  157. package/out/replicache/src/persist/idb-databases-store.js.map +1 -1
  158. package/out/replicache/src/persist/make-client-id.js +13 -9
  159. package/out/replicache/src/persist/make-client-id.js.map +1 -1
  160. package/out/replicache/src/persist/persist.js +113 -174
  161. package/out/replicache/src/persist/persist.js.map +1 -1
  162. package/out/replicache/src/persist/refresh.js +94 -183
  163. package/out/replicache/src/persist/refresh.js.map +1 -1
  164. package/out/replicache/src/process-scheduler.js +122 -143
  165. package/out/replicache/src/process-scheduler.js.map +1 -1
  166. package/out/replicache/src/pusher.js +21 -26
  167. package/out/replicache/src/pusher.js.map +1 -1
  168. package/out/replicache/src/replicache-impl.js +844 -1184
  169. package/out/replicache/src/replicache-impl.js.map +1 -1
  170. package/out/replicache/src/report-error.js +9 -6
  171. package/out/replicache/src/report-error.js.map +1 -1
  172. package/out/replicache/src/request-idle.js +13 -11
  173. package/out/replicache/src/request-idle.js.map +1 -1
  174. package/out/replicache/src/scan-iterator.d.ts.map +1 -1
  175. package/out/replicache/src/scan-iterator.js +108 -135
  176. package/out/replicache/src/scan-iterator.js.map +1 -1
  177. package/out/replicache/src/scan-options.js +33 -39
  178. package/out/replicache/src/scan-options.js.map +1 -1
  179. package/out/replicache/src/set-interval-with-signal.js +11 -10
  180. package/out/replicache/src/set-interval-with-signal.js.map +1 -1
  181. package/out/replicache/src/sqlite.js +2 -0
  182. package/out/replicache/src/subscriptions.js +222 -338
  183. package/out/replicache/src/subscriptions.js.map +1 -1
  184. package/out/replicache/src/sync/diff.js +52 -65
  185. package/out/replicache/src/sync/diff.js.map +1 -1
  186. package/out/replicache/src/sync/ids.js +8 -9
  187. package/out/replicache/src/sync/ids.js.map +1 -1
  188. package/out/replicache/src/sync/patch.js +34 -45
  189. package/out/replicache/src/sync/patch.js.map +1 -1
  190. package/out/replicache/src/sync/pull-error.js +15 -15
  191. package/out/replicache/src/sync/pull-error.js.map +1 -1
  192. package/out/replicache/src/sync/pull.js +145 -283
  193. package/out/replicache/src/sync/pull.js.map +1 -1
  194. package/out/replicache/src/sync/push.js +64 -79
  195. package/out/replicache/src/sync/push.js.map +1 -1
  196. package/out/replicache/src/sync/request-id.js +23 -15
  197. package/out/replicache/src/sync/request-id.js.map +1 -1
  198. package/out/replicache/src/sync/sync-head-name.js +6 -5
  199. package/out/replicache/src/sync/sync-head-name.js.map +1 -1
  200. package/out/replicache/src/to-error.js +7 -8
  201. package/out/replicache/src/to-error.js.map +1 -1
  202. package/out/replicache/src/transaction-closed-error.js +15 -15
  203. package/out/replicache/src/transaction-closed-error.js.map +1 -1
  204. package/out/replicache/src/transactions.js +120 -140
  205. package/out/replicache/src/transactions.js.map +1 -1
  206. package/out/replicache/src/version.js +9 -5
  207. package/out/replicache/src/version.js.map +1 -1
  208. package/out/replicache/src/with-transactions.js +23 -20
  209. package/out/replicache/src/with-transactions.js.map +1 -1
  210. package/out/shared/src/abort-error.js +7 -6
  211. package/out/shared/src/abort-error.js.map +1 -1
  212. package/out/shared/src/arrays.js +35 -42
  213. package/out/shared/src/arrays.js.map +1 -1
  214. package/out/shared/src/asserts.js +21 -45
  215. package/out/shared/src/asserts.js.map +1 -1
  216. package/out/shared/src/bigint-json.js +42 -38
  217. package/out/shared/src/bigint-json.js.map +1 -1
  218. package/out/shared/src/binary-search.js +27 -18
  219. package/out/shared/src/binary-search.js.map +1 -1
  220. package/out/shared/src/broadcast-channel.js +20 -23
  221. package/out/shared/src/broadcast-channel.js.map +1 -1
  222. package/out/shared/src/browser-env.js +11 -17
  223. package/out/shared/src/browser-env.js.map +1 -1
  224. package/out/shared/src/btree-set.js +419 -481
  225. package/out/shared/src/btree-set.js.map +1 -1
  226. package/out/shared/src/cache.js +43 -36
  227. package/out/shared/src/cache.js.map +1 -1
  228. package/out/shared/src/centroid.js +24 -26
  229. package/out/shared/src/centroid.js.map +1 -1
  230. package/out/shared/src/config.js +6 -6
  231. package/out/shared/src/config.js.map +1 -1
  232. package/out/shared/src/custom-key-map.js +54 -58
  233. package/out/shared/src/custom-key-map.js.map +1 -1
  234. package/out/shared/src/custom-key-set.js +53 -51
  235. package/out/shared/src/custom-key-set.js.map +1 -1
  236. package/out/shared/src/deep-clone.js +30 -41
  237. package/out/shared/src/deep-clone.js.map +1 -1
  238. package/out/shared/src/deep-merge.js +25 -24
  239. package/out/shared/src/deep-merge.js.map +1 -1
  240. package/out/shared/src/document-visible.js +63 -70
  241. package/out/shared/src/document-visible.js.map +1 -1
  242. package/out/shared/src/dotenv.js +7 -3
  243. package/out/shared/src/dotenv.js.map +1 -1
  244. package/out/shared/src/error.js +43 -64
  245. package/out/shared/src/error.js.map +1 -1
  246. package/out/shared/src/has-own.js +6 -5
  247. package/out/shared/src/has-own.js.map +1 -1
  248. package/out/shared/src/hash.js +15 -14
  249. package/out/shared/src/hash.js.map +1 -1
  250. package/out/shared/src/iterables.js +34 -47
  251. package/out/shared/src/iterables.js.map +1 -1
  252. package/out/shared/src/json-schema.js +25 -30
  253. package/out/shared/src/json-schema.js.map +1 -1
  254. package/out/shared/src/json.js +90 -129
  255. package/out/shared/src/json.js.map +1 -1
  256. package/out/shared/src/logging-test-utils.js +9 -11
  257. package/out/shared/src/logging-test-utils.js.map +1 -1
  258. package/out/shared/src/logging.js +75 -95
  259. package/out/shared/src/logging.js.map +1 -1
  260. package/out/shared/src/must.js +7 -8
  261. package/out/shared/src/must.js.map +1 -1
  262. package/out/shared/src/navigator.js +6 -5
  263. package/out/shared/src/navigator.js.map +1 -1
  264. package/out/shared/src/object-traversal.js +23 -23
  265. package/out/shared/src/object-traversal.js.map +1 -1
  266. package/out/shared/src/objects.js +15 -18
  267. package/out/shared/src/objects.js.map +1 -1
  268. package/out/shared/src/options.js +225 -302
  269. package/out/shared/src/options.js.map +1 -1
  270. package/out/shared/src/parse-big-int.js +12 -11
  271. package/out/shared/src/parse-big-int.js.map +1 -1
  272. package/out/shared/src/promise-race.js +21 -17
  273. package/out/shared/src/promise-race.js.map +1 -1
  274. package/out/shared/src/queue.js +124 -124
  275. package/out/shared/src/queue.js.map +1 -1
  276. package/out/shared/src/rand.js +13 -7
  277. package/out/shared/src/rand.js.map +1 -1
  278. package/out/shared/src/random-uint64.js +8 -7
  279. package/out/shared/src/random-uint64.js.map +1 -1
  280. package/out/shared/src/random-values.js +8 -11
  281. package/out/shared/src/random-values.js.map +1 -1
  282. package/out/shared/src/record-proxy.js +68 -57
  283. package/out/shared/src/record-proxy.js.map +1 -1
  284. package/out/shared/src/resolved-promises.js +9 -11
  285. package/out/shared/src/resolved-promises.js.map +1 -1
  286. package/out/shared/src/sentinels.js +9 -12
  287. package/out/shared/src/sentinels.js.map +1 -1
  288. package/out/shared/src/set-utils.js +41 -63
  289. package/out/shared/src/set-utils.js.map +1 -1
  290. package/out/shared/src/size-of-value.js +55 -51
  291. package/out/shared/src/size-of-value.js.map +1 -1
  292. package/out/shared/src/sleep.js +50 -45
  293. package/out/shared/src/sleep.js.map +1 -1
  294. package/out/shared/src/string-compare.js +8 -11
  295. package/out/shared/src/string-compare.js.map +1 -1
  296. package/out/shared/src/subscribable.js +34 -33
  297. package/out/shared/src/subscribable.js.map +1 -1
  298. package/out/shared/src/tdigest-schema.js +11 -7
  299. package/out/shared/src/tdigest-schema.js.map +1 -1
  300. package/out/shared/src/tdigest.js +197 -270
  301. package/out/shared/src/tdigest.js.map +1 -1
  302. package/out/shared/src/valita.js +145 -174
  303. package/out/shared/src/valita.js.map +1 -1
  304. package/out/z2s/src/compiler.d.ts.map +1 -1
  305. package/out/z2s/src/compiler.js +238 -468
  306. package/out/z2s/src/compiler.js.map +1 -1
  307. package/out/z2s/src/sql.d.ts +0 -1
  308. package/out/z2s/src/sql.d.ts.map +1 -1
  309. package/out/z2s/src/sql.js +149 -194
  310. package/out/z2s/src/sql.js.map +1 -1
  311. package/out/zero/package.js +193 -0
  312. package/out/zero/package.js.map +1 -0
  313. package/out/zero/src/adapters/drizzle.js +1 -6
  314. package/out/zero/src/adapters/pg.js +1 -6
  315. package/out/zero/src/adapters/postgresjs.js +1 -6
  316. package/out/zero/src/adapters/prisma.js +1 -5
  317. package/out/zero/src/analyze-query.js +1 -1
  318. package/out/zero/src/ast-to-zql.js +1 -1
  319. package/out/zero/src/bindings.js +6 -21
  320. package/out/zero/src/build-schema.js +5 -1
  321. package/out/zero/src/build-schema.js.map +1 -1
  322. package/out/zero/src/change-protocol/v0.js +3 -5
  323. package/out/zero/src/cli.js +2 -2
  324. package/out/zero/src/deploy-permissions.js +1 -1
  325. package/out/zero/src/expo-sqlite.js +2 -4
  326. package/out/zero/src/op-sqlite.js +2 -4
  327. package/out/zero/src/pg.js +2 -20
  328. package/out/zero/src/react-native.js +16 -12
  329. package/out/zero/src/react-native.js.map +1 -1
  330. package/out/zero/src/react.js +3 -12
  331. package/out/zero/src/server/runner/main.js +2 -0
  332. package/out/zero/src/server.js +2 -17
  333. package/out/zero/src/solid.js +3 -12
  334. package/out/zero/src/sqlite.js +2 -6
  335. package/out/zero/src/transform-query.js +1 -1
  336. package/out/zero/src/zero-cache-dev.js +124 -151
  337. package/out/zero/src/zero-cache-dev.js.map +1 -1
  338. package/out/zero/src/zero-out.js +9 -6
  339. package/out/zero/src/zero-out.js.map +1 -1
  340. package/out/zero/src/zero.js +6 -55
  341. package/out/zero/src/zqlite.js +2 -7
  342. package/out/zero-cache/src/auth/auth.js +138 -172
  343. package/out/zero-cache/src/auth/auth.js.map +1 -1
  344. package/out/zero-cache/src/auth/jwt.js +25 -33
  345. package/out/zero-cache/src/auth/jwt.js.map +1 -1
  346. package/out/zero-cache/src/auth/load-permissions.js +54 -62
  347. package/out/zero-cache/src/auth/load-permissions.js.map +1 -1
  348. package/out/zero-cache/src/auth/read-authorizer.js +70 -80
  349. package/out/zero-cache/src/auth/read-authorizer.js.map +1 -1
  350. package/out/zero-cache/src/auth/write-authorizer.js +284 -432
  351. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  352. package/out/zero-cache/src/config/network.js +31 -45
  353. package/out/zero-cache/src/config/network.js.map +1 -1
  354. package/out/zero-cache/src/config/normalize.js +81 -83
  355. package/out/zero-cache/src/config/normalize.js.map +1 -1
  356. package/out/zero-cache/src/config/server-context.js +32 -29
  357. package/out/zero-cache/src/config/server-context.js.map +1 -1
  358. package/out/zero-cache/src/config/zero-config.js +753 -833
  359. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  360. package/out/zero-cache/src/custom/fetch.js +183 -230
  361. package/out/zero-cache/src/custom/fetch.js.map +1 -1
  362. package/out/zero-cache/src/custom-queries/transform-query.js +93 -99
  363. package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -1
  364. package/out/zero-cache/src/db/create.js +27 -29
  365. package/out/zero-cache/src/db/create.js.map +1 -1
  366. package/out/zero-cache/src/db/delete-lite-db.js +11 -7
  367. package/out/zero-cache/src/db/delete-lite-db.js.map +1 -1
  368. package/out/zero-cache/src/db/lite-tables.js +118 -158
  369. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  370. package/out/zero-cache/src/db/migration-lite.js +110 -178
  371. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  372. package/out/zero-cache/src/db/migration.js +82 -151
  373. package/out/zero-cache/src/db/migration.js.map +1 -1
  374. package/out/zero-cache/src/db/mode-enum.js +8 -9
  375. package/out/zero-cache/src/db/mode-enum.js.map +1 -1
  376. package/out/zero-cache/src/db/pg-copy.js +56 -54
  377. package/out/zero-cache/src/db/pg-copy.js.map +1 -1
  378. package/out/zero-cache/src/db/pg-to-lite.js +74 -110
  379. package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
  380. package/out/zero-cache/src/db/pg-type-parser.js +19 -36
  381. package/out/zero-cache/src/db/pg-type-parser.js.map +1 -1
  382. package/out/zero-cache/src/db/run-transaction.js +19 -20
  383. package/out/zero-cache/src/db/run-transaction.js.map +1 -1
  384. package/out/zero-cache/src/db/specs.js +42 -78
  385. package/out/zero-cache/src/db/specs.js.map +1 -1
  386. package/out/zero-cache/src/db/statements.js +52 -59
  387. package/out/zero-cache/src/db/statements.js.map +1 -1
  388. package/out/zero-cache/src/db/transaction-pool.js +376 -400
  389. package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
  390. package/out/zero-cache/src/db/warmup.js +13 -24
  391. package/out/zero-cache/src/db/warmup.js.map +1 -1
  392. package/out/zero-cache/src/observability/events.js +89 -99
  393. package/out/zero-cache/src/observability/events.js.map +1 -1
  394. package/out/zero-cache/src/observability/metrics.js +30 -54
  395. package/out/zero-cache/src/observability/metrics.js.map +1 -1
  396. package/out/zero-cache/src/scripts/decommission.js +42 -47
  397. package/out/zero-cache/src/scripts/decommission.js.map +1 -1
  398. package/out/zero-cache/src/scripts/deploy-permissions.js +106 -144
  399. package/out/zero-cache/src/scripts/deploy-permissions.js.map +1 -1
  400. package/out/zero-cache/src/scripts/permissions.js +86 -107
  401. package/out/zero-cache/src/scripts/permissions.js.map +1 -1
  402. package/out/zero-cache/src/server/anonymous-otel-start.js +306 -440
  403. package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
  404. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  405. package/out/zero-cache/src/server/change-streamer.js +57 -130
  406. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  407. package/out/zero-cache/src/server/inspector-delegate.js +89 -100
  408. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
  409. package/out/zero-cache/src/server/logging.js +18 -26
  410. package/out/zero-cache/src/server/logging.js.map +1 -1
  411. package/out/zero-cache/src/server/main.js +85 -142
  412. package/out/zero-cache/src/server/main.js.map +1 -1
  413. package/out/zero-cache/src/server/mutator.js +16 -13
  414. package/out/zero-cache/src/server/mutator.js.map +1 -1
  415. package/out/zero-cache/src/server/otel-diag-logger.js +42 -49
  416. package/out/zero-cache/src/server/otel-diag-logger.js.map +1 -1
  417. package/out/zero-cache/src/server/otel-log-sink.js +34 -44
  418. package/out/zero-cache/src/server/otel-log-sink.js.map +1 -1
  419. package/out/zero-cache/src/server/otel-start.js +43 -51
  420. package/out/zero-cache/src/server/otel-start.js.map +1 -1
  421. package/out/zero-cache/src/server/priority-op.js +27 -25
  422. package/out/zero-cache/src/server/priority-op.js.map +1 -1
  423. package/out/zero-cache/src/server/reaper.js +32 -43
  424. package/out/zero-cache/src/server/reaper.js.map +1 -1
  425. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  426. package/out/zero-cache/src/server/replicator.js +41 -57
  427. package/out/zero-cache/src/server/replicator.js.map +1 -1
  428. package/out/zero-cache/src/server/runner/main.js +7 -8
  429. package/out/zero-cache/src/server/runner/main.js.map +1 -1
  430. package/out/zero-cache/src/server/runner/run-worker.js +56 -52
  431. package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
  432. package/out/zero-cache/src/server/runner/runtime.js +26 -32
  433. package/out/zero-cache/src/server/runner/runtime.js.map +1 -1
  434. package/out/zero-cache/src/server/runner/zero-dispatcher.js +22 -27
  435. package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
  436. package/out/zero-cache/src/server/syncer.js +79 -148
  437. package/out/zero-cache/src/server/syncer.js.map +1 -1
  438. package/out/zero-cache/src/server/worker-dispatcher.js +84 -113
  439. package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -1
  440. package/out/zero-cache/src/server/worker-urls.d.ts +2 -1
  441. package/out/zero-cache/src/server/worker-urls.d.ts.map +1 -1
  442. package/out/zero-cache/src/server/worker-urls.js +14 -18
  443. package/out/zero-cache/src/server/worker-urls.js.map +1 -1
  444. package/out/zero-cache/src/server/write-worker.js +2 -0
  445. package/out/zero-cache/src/services/analyze.js +61 -130
  446. package/out/zero-cache/src/services/analyze.js.map +1 -1
  447. package/out/zero-cache/src/services/change-source/common/backfill-manager.js +420 -419
  448. package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
  449. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js +111 -114
  450. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -1
  451. package/out/zero-cache/src/services/change-source/common/replica-schema.js +80 -148
  452. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  453. package/out/zero-cache/src/services/change-source/custom/change-source.js +154 -216
  454. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  455. package/out/zero-cache/src/services/change-source/pg/backfill-metadata.js +11 -14
  456. package/out/zero-cache/src/services/change-source/pg/backfill-metadata.js.map +1 -1
  457. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +168 -212
  458. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
  459. package/out/zero-cache/src/services/change-source/pg/change-source.js +672 -892
  460. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  461. package/out/zero-cache/src/services/change-source/pg/decommission.js +19 -23
  462. package/out/zero-cache/src/services/change-source/pg/decommission.js.map +1 -1
  463. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +258 -411
  464. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  465. package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js +59 -65
  466. package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js.map +1 -1
  467. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js +218 -247
  468. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js.map +1 -1
  469. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +100 -142
  470. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  471. package/out/zero-cache/src/services/change-source/pg/lsn.js +17 -19
  472. package/out/zero-cache/src/services/change-source/pg/lsn.js.map +1 -1
  473. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +88 -98
  474. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
  475. package/out/zero-cache/src/services/change-source/pg/schema/init.js +96 -177
  476. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  477. package/out/zero-cache/src/services/change-source/pg/schema/published.js +69 -107
  478. package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
  479. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +151 -212
  480. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  481. package/out/zero-cache/src/services/change-source/pg/schema/validation.js +22 -53
  482. package/out/zero-cache/src/services/change-source/pg/schema/validation.js.map +1 -1
  483. package/out/zero-cache/src/services/change-source/protocol/current/control.js +24 -12
  484. package/out/zero-cache/src/services/change-source/protocol/current/control.js.map +1 -1
  485. package/out/zero-cache/src/services/change-source/protocol/current/data.js +180 -290
  486. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  487. package/out/zero-cache/src/services/change-source/protocol/current/downstream.js +21 -33
  488. package/out/zero-cache/src/services/change-source/protocol/current/downstream.js.map +1 -1
  489. package/out/zero-cache/src/services/change-source/protocol/current/json.js +7 -18
  490. package/out/zero-cache/src/services/change-source/protocol/current/json.js.map +1 -1
  491. package/out/zero-cache/src/services/change-source/protocol/current/path.js +24 -5
  492. package/out/zero-cache/src/services/change-source/protocol/current/path.js.map +1 -1
  493. package/out/zero-cache/src/services/change-source/protocol/current/status.js +25 -19
  494. package/out/zero-cache/src/services/change-source/protocol/current/status.js.map +1 -1
  495. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js +24 -16
  496. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -1
  497. package/out/zero-cache/src/services/change-source/protocol/current.js +51 -46
  498. package/out/zero-cache/src/services/change-source/protocol/current.js.map +1 -1
  499. package/out/zero-cache/src/services/change-source/protocol/mod.js +2 -0
  500. package/out/zero-cache/src/services/change-streamer/backup-monitor.js +165 -171
  501. package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
  502. package/out/zero-cache/src/services/change-streamer/broadcast.js +163 -169
  503. package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
  504. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +154 -221
  505. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  506. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  507. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +340 -299
  508. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  509. package/out/zero-cache/src/services/change-streamer/change-streamer.js +17 -24
  510. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  511. package/out/zero-cache/src/services/change-streamer/forwarder.js +84 -103
  512. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
  513. package/out/zero-cache/src/services/change-streamer/replica-monitor.js +49 -43
  514. package/out/zero-cache/src/services/change-streamer/replica-monitor.js.map +1 -1
  515. package/out/zero-cache/src/services/change-streamer/schema/init.js +61 -89
  516. package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
  517. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +20 -1
  518. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
  519. package/out/zero-cache/src/services/change-streamer/schema/tables.js +131 -109
  520. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  521. package/out/zero-cache/src/services/change-streamer/snapshot.js +26 -28
  522. package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -1
  523. package/out/zero-cache/src/services/change-streamer/storer.js +434 -513
  524. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  525. package/out/zero-cache/src/services/change-streamer/subscriber.js +142 -155
  526. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  527. package/out/zero-cache/src/services/heapz.js +18 -20
  528. package/out/zero-cache/src/services/heapz.js.map +1 -1
  529. package/out/zero-cache/src/services/http-service.js +59 -57
  530. package/out/zero-cache/src/services/http-service.js.map +1 -1
  531. package/out/zero-cache/src/services/life-cycle.js +182 -214
  532. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  533. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js +102 -81
  534. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js.map +1 -1
  535. package/out/zero-cache/src/services/litestream/commands.js +144 -205
  536. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  537. package/out/zero-cache/src/services/mutagen/error.js +10 -14
  538. package/out/zero-cache/src/services/mutagen/error.js.map +1 -1
  539. package/out/zero-cache/src/services/mutagen/mutagen.js +166 -264
  540. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  541. package/out/zero-cache/src/services/mutagen/pusher.js +372 -487
  542. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  543. package/out/zero-cache/src/services/replicator/change-processor.js +483 -592
  544. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  545. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +4 -2
  546. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  547. package/out/zero-cache/src/services/replicator/incremental-sync.js +118 -143
  548. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  549. package/out/zero-cache/src/services/replicator/notifier.js +52 -28
  550. package/out/zero-cache/src/services/replicator/notifier.js.map +1 -1
  551. package/out/zero-cache/src/services/replicator/replication-status.js +105 -128
  552. package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
  553. package/out/zero-cache/src/services/replicator/replicator.d.ts +2 -1
  554. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
  555. package/out/zero-cache/src/services/replicator/replicator.js +32 -34
  556. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  557. package/out/zero-cache/src/services/replicator/schema/change-log.js +101 -133
  558. package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -1
  559. package/out/zero-cache/src/services/replicator/schema/column-metadata.js +145 -174
  560. package/out/zero-cache/src/services/replicator/schema/column-metadata.js.map +1 -1
  561. package/out/zero-cache/src/services/replicator/schema/constants.js +11 -5
  562. package/out/zero-cache/src/services/replicator/schema/constants.js.map +1 -1
  563. package/out/zero-cache/src/services/replicator/schema/replication-state.js +56 -107
  564. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
  565. package/out/zero-cache/src/services/replicator/schema/table-metadata.js +81 -66
  566. package/out/zero-cache/src/services/replicator/schema/table-metadata.js.map +1 -1
  567. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts +69 -0
  568. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts.map +1 -0
  569. package/out/zero-cache/src/services/replicator/write-worker-client.js +96 -0
  570. package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -0
  571. package/out/zero-cache/src/services/replicator/write-worker.js +68 -0
  572. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -0
  573. package/out/zero-cache/src/services/run-ast.js +79 -120
  574. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  575. package/out/zero-cache/src/services/runner.js +39 -41
  576. package/out/zero-cache/src/services/runner.js.map +1 -1
  577. package/out/zero-cache/src/services/running-state.js +129 -134
  578. package/out/zero-cache/src/services/running-state.js.map +1 -1
  579. package/out/zero-cache/src/services/statz.js +139 -200
  580. package/out/zero-cache/src/services/statz.js.map +1 -1
  581. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js +46 -49
  582. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js.map +1 -1
  583. package/out/zero-cache/src/services/view-syncer/client-handler.js +257 -299
  584. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  585. package/out/zero-cache/src/services/view-syncer/client-schema.js +52 -82
  586. package/out/zero-cache/src/services/view-syncer/client-schema.js.map +1 -1
  587. package/out/zero-cache/src/services/view-syncer/cvr-purger.js +85 -107
  588. package/out/zero-cache/src/services/view-syncer/cvr-purger.js.map +1 -1
  589. package/out/zero-cache/src/services/view-syncer/cvr-store.js +604 -757
  590. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  591. package/out/zero-cache/src/services/view-syncer/cvr.js +631 -739
  592. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  593. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +60 -40
  594. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
  595. package/out/zero-cache/src/services/view-syncer/inspect-handler.js +95 -178
  596. package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
  597. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  598. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +572 -722
  599. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  600. package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts.map +1 -1
  601. package/out/zero-cache/src/services/view-syncer/row-record-cache.js +246 -257
  602. package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
  603. package/out/zero-cache/src/services/view-syncer/schema/cvr.js +59 -45
  604. package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
  605. package/out/zero-cache/src/services/view-syncer/schema/init.js +121 -189
  606. package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -1
  607. package/out/zero-cache/src/services/view-syncer/schema/types.js +138 -263
  608. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  609. package/out/zero-cache/src/services/view-syncer/snapshotter.js +322 -335
  610. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  611. package/out/zero-cache/src/services/view-syncer/tracer.js +7 -6
  612. package/out/zero-cache/src/services/view-syncer/tracer.js.map +1 -1
  613. package/out/zero-cache/src/services/view-syncer/ttl-clock.js +9 -11
  614. package/out/zero-cache/src/services/view-syncer/ttl-clock.js.map +1 -1
  615. package/out/zero-cache/src/services/view-syncer/view-syncer.js +1067 -1603
  616. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  617. package/out/zero-cache/src/types/error-with-level.js +19 -25
  618. package/out/zero-cache/src/types/error-with-level.js.map +1 -1
  619. package/out/zero-cache/src/types/http.js +17 -26
  620. package/out/zero-cache/src/types/http.js.map +1 -1
  621. package/out/zero-cache/src/types/lexi-version.js +28 -42
  622. package/out/zero-cache/src/types/lexi-version.js.map +1 -1
  623. package/out/zero-cache/src/types/lite.js +101 -121
  624. package/out/zero-cache/src/types/lite.js.map +1 -1
  625. package/out/zero-cache/src/types/names.js +6 -5
  626. package/out/zero-cache/src/types/names.js.map +1 -1
  627. package/out/zero-cache/src/types/pg-data-type.d.ts +1 -0
  628. package/out/zero-cache/src/types/pg-data-type.d.ts.map +1 -1
  629. package/out/zero-cache/src/types/pg-data-type.js +58 -73
  630. package/out/zero-cache/src/types/pg-data-type.js.map +1 -1
  631. package/out/zero-cache/src/types/pg-types.js +12 -19
  632. package/out/zero-cache/src/types/pg-types.js.map +1 -1
  633. package/out/zero-cache/src/types/pg.js +144 -218
  634. package/out/zero-cache/src/types/pg.js.map +1 -1
  635. package/out/zero-cache/src/types/processes.js +95 -90
  636. package/out/zero-cache/src/types/processes.js.map +1 -1
  637. package/out/zero-cache/src/types/profiler.js +32 -27
  638. package/out/zero-cache/src/types/profiler.js.map +1 -1
  639. package/out/zero-cache/src/types/row-key.js +42 -30
  640. package/out/zero-cache/src/types/row-key.js.map +1 -1
  641. package/out/zero-cache/src/types/shards.js +36 -45
  642. package/out/zero-cache/src/types/shards.js.map +1 -1
  643. package/out/zero-cache/src/types/sql.js +20 -9
  644. package/out/zero-cache/src/types/sql.js.map +1 -1
  645. package/out/zero-cache/src/types/state-version.js +17 -23
  646. package/out/zero-cache/src/types/state-version.js.map +1 -1
  647. package/out/zero-cache/src/types/streams.js +234 -270
  648. package/out/zero-cache/src/types/streams.js.map +1 -1
  649. package/out/zero-cache/src/types/strings.js +10 -13
  650. package/out/zero-cache/src/types/strings.js.map +1 -1
  651. package/out/zero-cache/src/types/subscription.js +266 -226
  652. package/out/zero-cache/src/types/subscription.js.map +1 -1
  653. package/out/zero-cache/src/types/url-params.js +30 -39
  654. package/out/zero-cache/src/types/url-params.js.map +1 -1
  655. package/out/zero-cache/src/types/websocket-handoff.js +62 -75
  656. package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
  657. package/out/zero-cache/src/types/ws.js +43 -53
  658. package/out/zero-cache/src/types/ws.js.map +1 -1
  659. package/out/zero-cache/src/workers/connect-params.js +42 -43
  660. package/out/zero-cache/src/workers/connect-params.js.map +1 -1
  661. package/out/zero-cache/src/workers/connection.js +213 -282
  662. package/out/zero-cache/src/workers/connection.js.map +1 -1
  663. package/out/zero-cache/src/workers/mutator.js +22 -21
  664. package/out/zero-cache/src/workers/mutator.js.map +1 -1
  665. package/out/zero-cache/src/workers/replicator.d.ts +7 -0
  666. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
  667. package/out/zero-cache/src/workers/replicator.js +92 -97
  668. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  669. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +121 -203
  670. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  671. package/out/zero-cache/src/workers/syncer.js +147 -201
  672. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  673. package/out/zero-client/src/client/active-clients-manager.js +178 -187
  674. package/out/zero-client/src/client/active-clients-manager.js.map +1 -1
  675. package/out/zero-client/src/client/bindings.js +11 -0
  676. package/out/zero-client/src/client/client-error-kind-enum.js +18 -29
  677. package/out/zero-client/src/client/client-error-kind-enum.js.map +1 -1
  678. package/out/zero-client/src/client/connection-manager.js +291 -346
  679. package/out/zero-client/src/client/connection-manager.js.map +1 -1
  680. package/out/zero-client/src/client/connection-status-enum.js +20 -15
  681. package/out/zero-client/src/client/connection-status-enum.js.map +1 -1
  682. package/out/zero-client/src/client/connection.js +92 -110
  683. package/out/zero-client/src/client/connection.js.map +1 -1
  684. package/out/zero-client/src/client/context.js +84 -100
  685. package/out/zero-client/src/client/context.js.map +1 -1
  686. package/out/zero-client/src/client/crud-impl.js +56 -88
  687. package/out/zero-client/src/client/crud-impl.js.map +1 -1
  688. package/out/zero-client/src/client/crud.js +127 -129
  689. package/out/zero-client/src/client/crud.js.map +1 -1
  690. package/out/zero-client/src/client/custom.d.ts.map +1 -1
  691. package/out/zero-client/src/client/custom.js +50 -74
  692. package/out/zero-client/src/client/custom.js.map +1 -1
  693. package/out/zero-client/src/client/delete-clients-manager.js +72 -93
  694. package/out/zero-client/src/client/delete-clients-manager.js.map +1 -1
  695. package/out/zero-client/src/client/enable-analytics.js +8 -16
  696. package/out/zero-client/src/client/enable-analytics.js.map +1 -1
  697. package/out/zero-client/src/client/error.js +118 -133
  698. package/out/zero-client/src/client/error.js.map +1 -1
  699. package/out/zero-client/src/client/http-string.js +7 -7
  700. package/out/zero-client/src/client/http-string.js.map +1 -1
  701. package/out/zero-client/src/client/inspector/client-group.js +21 -26
  702. package/out/zero-client/src/client/inspector/client-group.js.map +1 -1
  703. package/out/zero-client/src/client/inspector/client.js +23 -26
  704. package/out/zero-client/src/client/inspector/client.js.map +1 -1
  705. package/out/zero-client/src/client/inspector/html-dialog-prompt.js +72 -73
  706. package/out/zero-client/src/client/inspector/html-dialog-prompt.js.map +1 -1
  707. package/out/zero-client/src/client/inspector/inspector.js +46 -51
  708. package/out/zero-client/src/client/inspector/inspector.js.map +1 -1
  709. package/out/zero-client/src/client/inspector/lazy-inspector.js +132 -192
  710. package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -1
  711. package/out/zero-client/src/client/inspector/query.js +72 -77
  712. package/out/zero-client/src/client/inspector/query.js.map +1 -1
  713. package/out/zero-client/src/client/ivm-branch.js +118 -145
  714. package/out/zero-client/src/client/ivm-branch.js.map +1 -1
  715. package/out/zero-client/src/client/keys.js +15 -31
  716. package/out/zero-client/src/client/keys.js.map +1 -1
  717. package/out/zero-client/src/client/log-options.js +43 -57
  718. package/out/zero-client/src/client/log-options.js.map +1 -1
  719. package/out/zero-client/src/client/make-mutate-property.js +46 -29
  720. package/out/zero-client/src/client/make-mutate-property.js.map +1 -1
  721. package/out/zero-client/src/client/make-replicache-mutators.js +80 -96
  722. package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
  723. package/out/zero-client/src/client/metric-name-enum.js +11 -15
  724. package/out/zero-client/src/client/metric-name-enum.js.map +1 -1
  725. package/out/zero-client/src/client/metrics.js +210 -237
  726. package/out/zero-client/src/client/metrics.js.map +1 -1
  727. package/out/zero-client/src/client/mutation-tracker.js +264 -354
  728. package/out/zero-client/src/client/mutation-tracker.js.map +1 -1
  729. package/out/zero-client/src/client/mutator-proxy.js +122 -151
  730. package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
  731. package/out/zero-client/src/client/options.js +7 -10
  732. package/out/zero-client/src/client/options.js.map +1 -1
  733. package/out/zero-client/src/client/query-manager.js +305 -373
  734. package/out/zero-client/src/client/query-manager.js.map +1 -1
  735. package/out/zero-client/src/client/reload-error-handler.js +80 -101
  736. package/out/zero-client/src/client/reload-error-handler.js.map +1 -1
  737. package/out/zero-client/src/client/server-option.js +30 -59
  738. package/out/zero-client/src/client/server-option.js.map +1 -1
  739. package/out/zero-client/src/client/update-needed-reason-type-enum.js +27 -9
  740. package/out/zero-client/src/client/update-needed-reason-type-enum.js.map +1 -1
  741. package/out/zero-client/src/client/version.js +9 -5
  742. package/out/zero-client/src/client/version.js.map +1 -1
  743. package/out/zero-client/src/client/zero-poke-handler.d.ts +1 -1
  744. package/out/zero-client/src/client/zero-poke-handler.d.ts.map +1 -1
  745. package/out/zero-client/src/client/zero-poke-handler.js +205 -293
  746. package/out/zero-client/src/client/zero-poke-handler.js.map +1 -1
  747. package/out/zero-client/src/client/zero-rep.js +61 -68
  748. package/out/zero-client/src/client/zero-rep.js.map +1 -1
  749. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  750. package/out/zero-client/src/client/zero.js +1367 -1834
  751. package/out/zero-client/src/client/zero.js.map +1 -1
  752. package/out/zero-client/src/mod.js +21 -0
  753. package/out/zero-client/src/util/nanoid.js +13 -18
  754. package/out/zero-client/src/util/nanoid.js.map +1 -1
  755. package/out/zero-client/src/util/socket.js +6 -5
  756. package/out/zero-client/src/util/socket.js.map +1 -1
  757. package/out/zero-pg/src/mod.js +10 -0
  758. package/out/zero-protocol/src/analyze-query-result.js +108 -148
  759. package/out/zero-protocol/src/analyze-query-result.js.map +1 -1
  760. package/out/zero-protocol/src/application-error.js +36 -34
  761. package/out/zero-protocol/src/application-error.js.map +1 -1
  762. package/out/zero-protocol/src/ast.js +236 -309
  763. package/out/zero-protocol/src/ast.js.map +1 -1
  764. package/out/zero-protocol/src/change-desired-queries.js +8 -13
  765. package/out/zero-protocol/src/change-desired-queries.js.map +1 -1
  766. package/out/zero-protocol/src/client-schema.js +21 -42
  767. package/out/zero-protocol/src/client-schema.js.map +1 -1
  768. package/out/zero-protocol/src/close-connection.js +20 -12
  769. package/out/zero-protocol/src/close-connection.js.map +1 -1
  770. package/out/zero-protocol/src/connect.js +37 -52
  771. package/out/zero-protocol/src/connect.js.map +1 -1
  772. package/out/zero-protocol/src/custom-queries.js +34 -65
  773. package/out/zero-protocol/src/custom-queries.js.map +1 -1
  774. package/out/zero-protocol/src/data.js +6 -9
  775. package/out/zero-protocol/src/data.js.map +1 -1
  776. package/out/zero-protocol/src/delete-clients.js +11 -17
  777. package/out/zero-protocol/src/delete-clients.js.map +1 -1
  778. package/out/zero-protocol/src/down.js +11 -23
  779. package/out/zero-protocol/src/down.js.map +1 -1
  780. package/out/zero-protocol/src/error-kind-enum.js +24 -41
  781. package/out/zero-protocol/src/error-kind-enum.js.map +1 -1
  782. package/out/zero-protocol/src/error-origin-enum.js +8 -9
  783. package/out/zero-protocol/src/error-origin-enum.js.map +1 -1
  784. package/out/zero-protocol/src/error-reason-enum.js +12 -17
  785. package/out/zero-protocol/src/error-reason-enum.js.map +1 -1
  786. package/out/zero-protocol/src/error.js +76 -152
  787. package/out/zero-protocol/src/error.js.map +1 -1
  788. package/out/zero-protocol/src/inspect-down.js +51 -74
  789. package/out/zero-protocol/src/inspect-down.js.map +1 -1
  790. package/out/zero-protocol/src/inspect-up.js +28 -46
  791. package/out/zero-protocol/src/inspect-up.js.map +1 -1
  792. package/out/zero-protocol/src/mutation-id.js +9 -9
  793. package/out/zero-protocol/src/mutation-id.js.map +1 -1
  794. package/out/zero-protocol/src/mutation-type-enum.js +7 -7
  795. package/out/zero-protocol/src/mutation-type-enum.js.map +1 -1
  796. package/out/zero-protocol/src/mutations-patch.js +21 -16
  797. package/out/zero-protocol/src/mutations-patch.js.map +1 -1
  798. package/out/zero-protocol/src/ping.js +8 -9
  799. package/out/zero-protocol/src/ping.js.map +1 -1
  800. package/out/zero-protocol/src/poke.js +53 -59
  801. package/out/zero-protocol/src/poke.js.map +1 -1
  802. package/out/zero-protocol/src/pong.js +8 -9
  803. package/out/zero-protocol/src/pong.js.map +1 -1
  804. package/out/zero-protocol/src/primary-key.js +9 -19
  805. package/out/zero-protocol/src/primary-key.js.map +1 -1
  806. package/out/zero-protocol/src/protocol-version.js +5 -11
  807. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  808. package/out/zero-protocol/src/pull.js +16 -28
  809. package/out/zero-protocol/src/pull.js.map +1 -1
  810. package/out/zero-protocol/src/push.js +162 -209
  811. package/out/zero-protocol/src/push.js.map +1 -1
  812. package/out/zero-protocol/src/queries-patch.js +22 -30
  813. package/out/zero-protocol/src/queries-patch.js.map +1 -1
  814. package/out/zero-protocol/src/query-hash.js +14 -17
  815. package/out/zero-protocol/src/query-hash.js.map +1 -1
  816. package/out/zero-protocol/src/row-patch.js +23 -30
  817. package/out/zero-protocol/src/row-patch.js.map +1 -1
  818. package/out/zero-protocol/src/up.js +11 -22
  819. package/out/zero-protocol/src/up.js.map +1 -1
  820. package/out/zero-protocol/src/update-auth.js +8 -13
  821. package/out/zero-protocol/src/update-auth.js.map +1 -1
  822. package/out/zero-protocol/src/version.js +8 -9
  823. package/out/zero-protocol/src/version.js.map +1 -1
  824. package/out/zero-react/src/bindings.js +12 -0
  825. package/out/zero-react/src/mod.js +5 -0
  826. package/out/zero-react/src/use-connection-state.js +14 -11
  827. package/out/zero-react/src/use-connection-state.js.map +1 -1
  828. package/out/zero-react/src/use-query.js +283 -281
  829. package/out/zero-react/src/use-query.js.map +1 -1
  830. package/out/zero-react/src/use-zero-online.js +17 -11
  831. package/out/zero-react/src/use-zero-online.js.map +1 -1
  832. package/out/zero-react/src/zero-provider.js +53 -69
  833. package/out/zero-react/src/zero-provider.js.map +1 -1
  834. package/out/zero-react/src/zero.js +22 -0
  835. package/out/zero-schema/src/builder/relationship-builder.js +25 -21
  836. package/out/zero-schema/src/builder/relationship-builder.js.map +1 -1
  837. package/out/zero-schema/src/builder/schema-builder.js +51 -79
  838. package/out/zero-schema/src/builder/schema-builder.js.map +1 -1
  839. package/out/zero-schema/src/builder/table-builder.js +99 -116
  840. package/out/zero-schema/src/builder/table-builder.js.map +1 -1
  841. package/out/zero-schema/src/compiled-permissions.js +21 -25
  842. package/out/zero-schema/src/compiled-permissions.js.map +1 -1
  843. package/out/zero-schema/src/name-mapper.js +31 -47
  844. package/out/zero-schema/src/name-mapper.js.map +1 -1
  845. package/out/zero-schema/src/permissions.js +94 -181
  846. package/out/zero-schema/src/permissions.js.map +1 -1
  847. package/out/zero-schema/src/schema-config.js +26 -32
  848. package/out/zero-schema/src/schema-config.js.map +1 -1
  849. package/out/zero-server/src/adapters/drizzle.d.ts.map +1 -1
  850. package/out/zero-server/src/adapters/drizzle.js +79 -76
  851. package/out/zero-server/src/adapters/drizzle.js.map +1 -1
  852. package/out/zero-server/src/adapters/pg.d.ts.map +1 -1
  853. package/out/zero-server/src/adapters/pg.js +79 -55
  854. package/out/zero-server/src/adapters/pg.js.map +1 -1
  855. package/out/zero-server/src/adapters/postgresjs.d.ts.map +1 -1
  856. package/out/zero-server/src/adapters/postgresjs.js +66 -40
  857. package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
  858. package/out/zero-server/src/adapters/prisma.d.ts.map +1 -1
  859. package/out/zero-server/src/adapters/prisma.js +75 -55
  860. package/out/zero-server/src/adapters/prisma.js.map +1 -1
  861. package/out/zero-server/src/custom.d.ts.map +1 -1
  862. package/out/zero-server/src/custom.js +188 -265
  863. package/out/zero-server/src/custom.js.map +1 -1
  864. package/out/zero-server/src/logging.js +6 -5
  865. package/out/zero-server/src/logging.js.map +1 -1
  866. package/out/zero-server/src/mod.js +8 -0
  867. package/out/zero-server/src/pg-query-executor.js +14 -17
  868. package/out/zero-server/src/pg-query-executor.js.map +1 -1
  869. package/out/zero-server/src/process-mutations.js +293 -365
  870. package/out/zero-server/src/process-mutations.js.map +1 -1
  871. package/out/zero-server/src/push-processor.js +33 -49
  872. package/out/zero-server/src/push-processor.js.map +1 -1
  873. package/out/zero-server/src/queries/process-queries.js +106 -96
  874. package/out/zero-server/src/queries/process-queries.js.map +1 -1
  875. package/out/zero-server/src/schema.js +98 -144
  876. package/out/zero-server/src/schema.js.map +1 -1
  877. package/out/zero-server/src/zql-database.d.ts.map +1 -1
  878. package/out/zero-server/src/zql-database.js +54 -69
  879. package/out/zero-server/src/zql-database.js.map +1 -1
  880. package/out/zero-solid/src/bindings.js +12 -0
  881. package/out/zero-solid/src/mod.js +5 -0
  882. package/out/zero-solid/src/solid-view.js +135 -227
  883. package/out/zero-solid/src/solid-view.js.map +1 -1
  884. package/out/zero-solid/src/use-connection-state.js +18 -14
  885. package/out/zero-solid/src/use-connection-state.js.map +1 -1
  886. package/out/zero-solid/src/use-query.js +55 -100
  887. package/out/zero-solid/src/use-query.js.map +1 -1
  888. package/out/zero-solid/src/use-zero-online.js +18 -12
  889. package/out/zero-solid/src/use-zero-online.js.map +1 -1
  890. package/out/zero-solid/src/use-zero.js +65 -77
  891. package/out/zero-solid/src/use-zero.js.map +1 -1
  892. package/out/zero-solid/src/zero.js +22 -0
  893. package/out/zero-types/src/format.js +8 -7
  894. package/out/zero-types/src/format.js.map +1 -1
  895. package/out/zero-types/src/name-mapper.js +34 -47
  896. package/out/zero-types/src/name-mapper.js.map +1 -1
  897. package/out/zql/src/builder/builder.d.ts.map +1 -1
  898. package/out/zql/src/builder/builder.js +315 -476
  899. package/out/zql/src/builder/builder.js.map +1 -1
  900. package/out/zql/src/builder/debug-delegate.js +69 -74
  901. package/out/zql/src/builder/debug-delegate.js.map +1 -1
  902. package/out/zql/src/builder/filter.js +116 -140
  903. package/out/zql/src/builder/filter.js.map +1 -1
  904. package/out/zql/src/builder/like.js +41 -46
  905. package/out/zql/src/builder/like.js.map +1 -1
  906. package/out/zql/src/error.js +10 -9
  907. package/out/zql/src/error.js.map +1 -1
  908. package/out/zql/src/ivm/array-view.js +89 -91
  909. package/out/zql/src/ivm/array-view.js.map +1 -1
  910. package/out/zql/src/ivm/constraint.js +65 -74
  911. package/out/zql/src/ivm/constraint.js.map +1 -1
  912. package/out/zql/src/ivm/data.js +61 -48
  913. package/out/zql/src/ivm/data.js.map +1 -1
  914. package/out/zql/src/ivm/exists.js +164 -213
  915. package/out/zql/src/ivm/exists.js.map +1 -1
  916. package/out/zql/src/ivm/fan-in.js +62 -59
  917. package/out/zql/src/ivm/fan-in.js.map +1 -1
  918. package/out/zql/src/ivm/fan-out.js +52 -61
  919. package/out/zql/src/ivm/fan-out.js.map +1 -1
  920. package/out/zql/src/ivm/filter-operators.js +91 -96
  921. package/out/zql/src/ivm/filter-operators.js.map +1 -1
  922. package/out/zql/src/ivm/filter-push.js +22 -26
  923. package/out/zql/src/ivm/filter-push.js.map +1 -1
  924. package/out/zql/src/ivm/filter.js +41 -35
  925. package/out/zql/src/ivm/filter.js.map +1 -1
  926. package/out/zql/src/ivm/flipped-join.js +282 -391
  927. package/out/zql/src/ivm/flipped-join.js.map +1 -1
  928. package/out/zql/src/ivm/join-utils.js +85 -115
  929. package/out/zql/src/ivm/join-utils.js.map +1 -1
  930. package/out/zql/src/ivm/join.js +162 -231
  931. package/out/zql/src/ivm/join.js.map +1 -1
  932. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +21 -25
  933. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
  934. package/out/zql/src/ivm/memory-source.js +364 -503
  935. package/out/zql/src/ivm/memory-source.js.map +1 -1
  936. package/out/zql/src/ivm/memory-storage.js +33 -34
  937. package/out/zql/src/ivm/memory-storage.js.map +1 -1
  938. package/out/zql/src/ivm/operator.js +13 -15
  939. package/out/zql/src/ivm/operator.js.map +1 -1
  940. package/out/zql/src/ivm/push-accumulated.js +267 -270
  941. package/out/zql/src/ivm/push-accumulated.js.map +1 -1
  942. package/out/zql/src/ivm/skip.js +91 -104
  943. package/out/zql/src/ivm/skip.js.map +1 -1
  944. package/out/zql/src/ivm/stream.js +10 -10
  945. package/out/zql/src/ivm/stream.js.map +1 -1
  946. package/out/zql/src/ivm/take.js +422 -569
  947. package/out/zql/src/ivm/take.js.map +1 -1
  948. package/out/zql/src/ivm/union-fan-in.js +157 -231
  949. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  950. package/out/zql/src/ivm/union-fan-out.js +38 -43
  951. package/out/zql/src/ivm/union-fan-out.js.map +1 -1
  952. package/out/zql/src/ivm/view-apply-change.js +166 -255
  953. package/out/zql/src/ivm/view-apply-change.js.map +1 -1
  954. package/out/zql/src/mutate/crud.js +35 -34
  955. package/out/zql/src/mutate/crud.js.map +1 -1
  956. package/out/zql/src/mutate/custom.d.ts.map +1 -1
  957. package/out/zql/src/mutate/custom.js +7 -11
  958. package/out/zql/src/mutate/custom.js.map +1 -1
  959. package/out/zql/src/mutate/mutator-registry.js +67 -71
  960. package/out/zql/src/mutate/mutator-registry.js.map +1 -1
  961. package/out/zql/src/mutate/mutator.js +26 -25
  962. package/out/zql/src/mutate/mutator.js.map +1 -1
  963. package/out/zql/src/planner/planner-builder.js +134 -239
  964. package/out/zql/src/planner/planner-builder.js.map +1 -1
  965. package/out/zql/src/planner/planner-connection.js +222 -212
  966. package/out/zql/src/planner/planner-connection.js.map +1 -1
  967. package/out/zql/src/planner/planner-constraint.js +15 -7
  968. package/out/zql/src/planner/planner-constraint.js.map +1 -1
  969. package/out/zql/src/planner/planner-debug.js +199 -224
  970. package/out/zql/src/planner/planner-debug.js.map +1 -1
  971. package/out/zql/src/planner/planner-fan-in.js +146 -162
  972. package/out/zql/src/planner/planner-fan-in.js.map +1 -1
  973. package/out/zql/src/planner/planner-fan-out.js +62 -74
  974. package/out/zql/src/planner/planner-fan-out.js.map +1 -1
  975. package/out/zql/src/planner/planner-graph.js +302 -334
  976. package/out/zql/src/planner/planner-graph.js.map +1 -1
  977. package/out/zql/src/planner/planner-join.js +255 -240
  978. package/out/zql/src/planner/planner-join.js.map +1 -1
  979. package/out/zql/src/planner/planner-node.js +10 -6
  980. package/out/zql/src/planner/planner-node.js.map +1 -1
  981. package/out/zql/src/planner/planner-source.js +15 -22
  982. package/out/zql/src/planner/planner-source.js.map +1 -1
  983. package/out/zql/src/planner/planner-terminus.js +28 -28
  984. package/out/zql/src/planner/planner-terminus.js.map +1 -1
  985. package/out/zql/src/query/complete-ordering.js +37 -61
  986. package/out/zql/src/query/complete-ordering.js.map +1 -1
  987. package/out/zql/src/query/create-builder.js +14 -22
  988. package/out/zql/src/query/create-builder.js.map +1 -1
  989. package/out/zql/src/query/error.js +10 -12
  990. package/out/zql/src/query/error.js.map +1 -1
  991. package/out/zql/src/query/escape-like.js +6 -5
  992. package/out/zql/src/query/escape-like.js.map +1 -1
  993. package/out/zql/src/query/expression.js +138 -157
  994. package/out/zql/src/query/expression.js.map +1 -1
  995. package/out/zql/src/query/measure-push-operator.js +35 -38
  996. package/out/zql/src/query/measure-push-operator.js.map +1 -1
  997. package/out/zql/src/query/metrics-delegate.js +7 -7
  998. package/out/zql/src/query/metrics-delegate.js.map +1 -1
  999. package/out/zql/src/query/named.js +52 -51
  1000. package/out/zql/src/query/named.js.map +1 -1
  1001. package/out/zql/src/query/query-delegate-base.js +190 -238
  1002. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  1003. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  1004. package/out/zql/src/query/query-impl.js +271 -405
  1005. package/out/zql/src/query/query-impl.js.map +1 -1
  1006. package/out/zql/src/query/query-internals.js +16 -8
  1007. package/out/zql/src/query/query-internals.js.map +1 -1
  1008. package/out/zql/src/query/query-registry.js +83 -98
  1009. package/out/zql/src/query/query-registry.js.map +1 -1
  1010. package/out/zql/src/query/query.d.ts.map +1 -1
  1011. package/out/zql/src/query/query.js +2 -0
  1012. package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -1
  1013. package/out/zql/src/query/runnable-query-impl.js +30 -55
  1014. package/out/zql/src/query/runnable-query-impl.js.map +1 -1
  1015. package/out/zql/src/query/static-query.js +7 -14
  1016. package/out/zql/src/query/static-query.js.map +1 -1
  1017. package/out/zql/src/query/ttl.js +45 -67
  1018. package/out/zql/src/query/ttl.js.map +1 -1
  1019. package/out/zql/src/query/validate-input.js +23 -20
  1020. package/out/zql/src/query/validate-input.js.map +1 -1
  1021. package/out/zqlite/src/database-storage.js +99 -103
  1022. package/out/zqlite/src/database-storage.js.map +1 -1
  1023. package/out/zqlite/src/db.js +206 -249
  1024. package/out/zqlite/src/db.js.map +1 -1
  1025. package/out/zqlite/src/explain-queries.js +11 -13
  1026. package/out/zqlite/src/explain-queries.js.map +1 -1
  1027. package/out/zqlite/src/internal/sql-inline.js +54 -37
  1028. package/out/zqlite/src/internal/sql-inline.js.map +1 -1
  1029. package/out/zqlite/src/internal/sql.js +17 -15
  1030. package/out/zqlite/src/internal/sql.js.map +1 -1
  1031. package/out/zqlite/src/internal/statement-cache.js +117 -92
  1032. package/out/zqlite/src/internal/statement-cache.js.map +1 -1
  1033. package/out/zqlite/src/mod.js +5 -0
  1034. package/out/zqlite/src/query-builder.js +81 -172
  1035. package/out/zqlite/src/query-builder.js.map +1 -1
  1036. package/out/zqlite/src/query-delegate.js +45 -55
  1037. package/out/zqlite/src/query-delegate.js.map +1 -1
  1038. package/out/zqlite/src/resolve-scalar-subqueries.js +134 -124
  1039. package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
  1040. package/out/zqlite/src/sqlite-cost-model.js +92 -97
  1041. package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
  1042. package/out/zqlite/src/sqlite-stat-fanout.js +304 -286
  1043. package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
  1044. package/out/zqlite/src/table-source.js +281 -455
  1045. package/out/zqlite/src/table-source.js.map +1 -1
  1046. package/package.json +7 -7
  1047. package/out/replicache/src/db/index-operation-enum.js +0 -7
  1048. package/out/replicache/src/db/index-operation-enum.js.map +0 -1
  1049. package/out/replicache/src/db/meta-type-enum.js +0 -7
  1050. package/out/replicache/src/db/meta-type-enum.js.map +0 -1
  1051. package/out/replicache/src/format-version-enum.js +0 -11
  1052. package/out/replicache/src/format-version-enum.js.map +0 -1
  1053. package/out/replicache/src/http-status-unauthorized.js +0 -5
  1054. package/out/replicache/src/http-status-unauthorized.js.map +0 -1
  1055. package/out/replicache/src/invoke-kind-enum.js +0 -7
  1056. package/out/replicache/src/invoke-kind-enum.js.map +0 -1
  1057. package/out/replicache/src/sync/handle-pull-response-result-type-enum.js +0 -9
  1058. package/out/replicache/src/sync/handle-pull-response-result-type-enum.js.map +0 -1
  1059. package/out/zero/package.json.js +0 -9
  1060. package/out/zero/package.json.js.map +0 -1
  1061. package/out/zero/src/adapters/drizzle.js.map +0 -1
  1062. package/out/zero/src/adapters/pg.js.map +0 -1
  1063. package/out/zero/src/adapters/postgresjs.js.map +0 -1
  1064. package/out/zero/src/adapters/prisma.js.map +0 -1
  1065. package/out/zero/src/analyze-query.js.map +0 -1
  1066. package/out/zero/src/ast-to-zql.js.map +0 -1
  1067. package/out/zero/src/bindings.js.map +0 -1
  1068. package/out/zero/src/change-protocol/v0.js.map +0 -1
  1069. package/out/zero/src/cli.js.map +0 -1
  1070. package/out/zero/src/deploy-permissions.js.map +0 -1
  1071. package/out/zero/src/expo-sqlite.js.map +0 -1
  1072. package/out/zero/src/op-sqlite.js.map +0 -1
  1073. package/out/zero/src/pg.js.map +0 -1
  1074. package/out/zero/src/react.js.map +0 -1
  1075. package/out/zero/src/server.js.map +0 -1
  1076. package/out/zero/src/solid.js.map +0 -1
  1077. package/out/zero/src/sqlite.js.map +0 -1
  1078. package/out/zero/src/transform-query.js.map +0 -1
  1079. package/out/zero/src/zero.js.map +0 -1
  1080. package/out/zero/src/zqlite.js.map +0 -1
  1081. package/out/zero-cache/src/db/postgres-replica-identity-enum.js +0 -11
  1082. package/out/zero-cache/src/db/postgres-replica-identity-enum.js.map +0 -1
  1083. package/out/zero-cache/src/db/postgres-type-class-enum.js +0 -17
  1084. package/out/zero-cache/src/db/postgres-type-class-enum.js.map +0 -1
  1085. package/out/zero-cache/src/services/change-streamer/error-type-enum.js +0 -9
  1086. package/out/zero-cache/src/services/change-streamer/error-type-enum.js.map +0 -1
@@ -1,745 +1,595 @@
1
- import { unreachable, assert } from "../../../../shared/src/asserts.js";
1
+ import { assert, unreachable } from "../../../../shared/src/asserts.js";
2
2
  import { deepEqual } from "../../../../shared/src/json.js";
3
3
  import { must } from "../../../../shared/src/must.js";
4
- import { buildPipeline } from "../../../../zql/src/builder/builder.js";
5
- import { Debug, runtimeDebugFlags } from "../../../../zql/src/builder/debug-delegate.js";
6
4
  import { skipYields } from "../../../../zql/src/ivm/operator.js";
7
5
  import { MeasurePushOperator } from "../../../../zql/src/query/measure-push-operator.js";
8
- import { resolveSimpleScalarSubqueries } from "../../../../zqlite/src/resolve-scalar-subqueries.js";
9
- import { createSQLiteCostModel } from "../../../../zqlite/src/sqlite-cost-model.js";
6
+ import { buildPipeline } from "../../../../zql/src/builder/builder.js";
10
7
  import { TableSource } from "../../../../zqlite/src/table-source.js";
11
- import { reloadPermissionsIfChanged } from "../../auth/load-permissions.js";
12
- import { computeZqlSpecs, mustGetTableSpec } from "../../db/lite-tables.js";
13
- import { getOrCreateHistogram, getOrCreateCounter } from "../../observability/metrics.js";
14
- import "js-xxhash";
15
- import "../../../../shared/src/bigint-json.js";
8
+ import { Debug, runtimeDebugFlags } from "../../../../zql/src/builder/debug-delegate.js";
16
9
  import { upstreamSchema } from "../../types/shards.js";
10
+ import "../../types/row-key.js";
11
+ import { ZERO_VERSION_COLUMN_NAME } from "../replicator/schema/constants.js";
17
12
  import { getSubscriptionState } from "../replicator/schema/replication-state.js";
13
+ import { computeZqlSpecs, mustGetTableSpec } from "../../db/lite-tables.js";
14
+ import { resolveSimpleScalarSubqueries } from "../../../../zqlite/src/resolve-scalar-subqueries.js";
15
+ import { createSQLiteCostModel } from "../../../../zqlite/src/sqlite-cost-model.js";
16
+ import { reloadPermissionsIfChanged } from "../../auth/load-permissions.js";
17
+ import { getOrCreateCounter, getOrCreateHistogram } from "../../observability/metrics.js";
18
18
  import { checkClientSchema } from "./client-schema.js";
19
19
  import { ResetPipelinesSignal } from "./snapshotter.js";
20
- import { ZERO_VERSION_COLUMN_NAME } from "../replicator/schema/constants.js";
21
- const MIN_ADVANCEMENT_TIME_LIMIT_MS = 50;
22
- class PipelineDriver {
23
- #tables = /* @__PURE__ */ new Map();
24
- // Query id to pipeline
25
- #pipelines = /* @__PURE__ */ new Map();
26
- #lc;
27
- #snapshotter;
28
- #storage;
29
- #shardID;
30
- #logConfig;
31
- #config;
32
- #tableSpecs = /* @__PURE__ */ new Map();
33
- #allTableNames = /* @__PURE__ */ new Set();
34
- #costModels;
35
- #yieldThresholdMs;
36
- #streamer = null;
37
- #hydrateContext = null;
38
- #advanceContext = null;
39
- #replicaVersion = null;
40
- #primaryKeys = null;
41
- #permissions = null;
42
- #advanceTime = getOrCreateHistogram("sync", "ivm.advance-time", {
43
- description: "Time to advance all queries for a given client group for in response to a single change.",
44
- unit: "s"
45
- });
46
- #conflictRowsDeleted = getOrCreateCounter(
47
- "sync",
48
- "ivm.conflict-rows-deleted",
49
- "Number of rows deleted because they conflicted with added row"
50
- );
51
- #inspectorDelegate;
52
- constructor(lc, logConfig, snapshotter, shardID, storage, clientGroupID, inspectorDelegate, yieldThresholdMs, enablePlanner, config) {
53
- this.#lc = lc.withContext("clientGroupID", clientGroupID);
54
- this.#snapshotter = snapshotter;
55
- this.#storage = storage;
56
- this.#shardID = shardID;
57
- this.#logConfig = logConfig;
58
- this.#config = config;
59
- this.#inspectorDelegate = inspectorDelegate;
60
- this.#costModels = enablePlanner ? /* @__PURE__ */ new WeakMap() : void 0;
61
- this.#yieldThresholdMs = yieldThresholdMs;
62
- }
63
- /**
64
- * Initializes the PipelineDriver to the current head of the database.
65
- * Queries can then be added (i.e. hydrated) with {@link addQuery()}.
66
- *
67
- * Must only be called once.
68
- */
69
- init(clientSchema) {
70
- assert(!this.#snapshotter.initialized(), "Already initialized");
71
- this.#snapshotter.init();
72
- this.#initAndResetCommon(clientSchema);
73
- }
74
- /**
75
- * @returns Whether the PipelineDriver has been initialized.
76
- */
77
- initialized() {
78
- return this.#snapshotter.initialized();
79
- }
80
- /**
81
- * Clears the current pipelines and TableSources, returning the PipelineDriver
82
- * to its initial state. This should be called in response to a schema change,
83
- * as TableSources need to be recomputed.
84
- */
85
- reset(clientSchema) {
86
- for (const pipeline of this.#pipelines.values()) {
87
- pipeline.input.destroy();
88
- for (const companion of pipeline.companions) {
89
- companion.input.destroy();
90
- }
91
- }
92
- this.#pipelines.clear();
93
- this.#tables.clear();
94
- this.#allTableNames.clear();
95
- this.#initAndResetCommon(clientSchema);
96
- }
97
- #initAndResetCommon(clientSchema) {
98
- const { db } = this.#snapshotter.current();
99
- const fullTables = /* @__PURE__ */ new Map();
100
- computeZqlSpecs(
101
- this.#lc,
102
- db.db,
103
- { includeBackfillingColumns: false },
104
- this.#tableSpecs,
105
- fullTables
106
- );
107
- checkClientSchema(
108
- this.#shardID,
109
- clientSchema,
110
- this.#tableSpecs,
111
- fullTables
112
- );
113
- this.#allTableNames.clear();
114
- for (const table of fullTables.keys()) {
115
- this.#allTableNames.add(table);
116
- }
117
- const primaryKeys = this.#primaryKeys ?? /* @__PURE__ */ new Map();
118
- this.#primaryKeys = primaryKeys;
119
- primaryKeys.clear();
120
- for (const [table, spec] of this.#tableSpecs.entries()) {
121
- if (table.startsWith(upstreamSchema(this.#shardID))) {
122
- primaryKeys.set(table, spec.tableSpec.primaryKey);
123
- }
124
- }
125
- buildPrimaryKeys(clientSchema, primaryKeys);
126
- const { replicaVersion } = getSubscriptionState(db);
127
- this.#replicaVersion = replicaVersion;
128
- }
129
- /** @returns The replica version. The PipelineDriver must have been initialized. */
130
- get replicaVersion() {
131
- return must(this.#replicaVersion, "Not yet initialized");
132
- }
133
- /**
134
- * Returns the current version of the database. This will reflect the
135
- * latest version change when calling {@link advance()} once the
136
- * iteration has begun.
137
- */
138
- currentVersion() {
139
- assert(this.initialized(), "Not yet initialized");
140
- return this.#snapshotter.current().version;
141
- }
142
- /**
143
- * Returns the current upstream {app}.permissions, or `null` if none are defined.
144
- */
145
- currentPermissions() {
146
- assert(this.initialized(), "Not yet initialized");
147
- const res = reloadPermissionsIfChanged(
148
- this.#lc,
149
- this.#snapshotter.current().db,
150
- this.#shardID.appID,
151
- this.#permissions,
152
- this.#config
153
- );
154
- if (res.changed) {
155
- this.#permissions = res.permissions;
156
- this.#lc.debug?.(
157
- "Reloaded permissions",
158
- JSON.stringify(this.#permissions)
159
- );
160
- }
161
- return this.#permissions;
162
- }
163
- advanceWithoutDiff() {
164
- const { db, version } = this.#snapshotter.advanceWithoutDiff().curr;
165
- for (const table of this.#tables.values()) {
166
- table.setDB(db.db);
167
- }
168
- return version;
169
- }
170
- #ensureCostModelExistsIfEnabled(db) {
171
- let existing = this.#costModels?.get(db);
172
- if (existing) {
173
- return existing;
174
- }
175
- if (this.#costModels) {
176
- const costModel = createSQLiteCostModel(db, this.#tableSpecs);
177
- this.#costModels.set(db, costModel);
178
- return costModel;
179
- }
180
- return void 0;
181
- }
182
- /**
183
- * Clears storage used for the pipelines. Call this when the
184
- * PipelineDriver will no longer be used.
185
- */
186
- destroy() {
187
- this.#storage.destroy();
188
- this.#snapshotter.destroy();
189
- }
190
- /** @return Map from query ID to PipelineInfo for all added queries. */
191
- queries() {
192
- return this.#pipelines;
193
- }
194
- totalHydrationTimeMs() {
195
- let total = 0;
196
- for (const pipeline of this.#pipelines.values()) {
197
- total += pipeline.hydrationTimeMs;
198
- }
199
- return total;
200
- }
201
- #resolveScalarSubqueries(ast) {
202
- const companionRows = [];
203
- const companionInputs = [];
204
- const executor = (subqueryAST, childField) => {
205
- const input = buildPipeline(
206
- subqueryAST,
207
- {
208
- getSource: (name) => this.#getSource(name),
209
- createStorage: () => this.#createStorage(),
210
- decorateSourceInput: (input2) => input2,
211
- decorateInput: (input2) => input2,
212
- addEdge() {
213
- },
214
- decorateFilterInput: (input2) => input2
215
- },
216
- "scalar-subquery"
217
- );
218
- let node;
219
- for (const n of skipYields(input.fetch({}))) {
220
- node ??= n;
221
- }
222
- if (!node) {
223
- companionInputs.push(input);
224
- return void 0;
225
- }
226
- companionRows.push({ table: subqueryAST.table, row: node.row });
227
- companionInputs.push(input);
228
- return node.row[childField] ?? null;
229
- };
230
- const { ast: resolved, companions } = resolveSimpleScalarSubqueries(
231
- ast,
232
- this.#tableSpecs,
233
- executor
234
- );
235
- return { ast: resolved, companionRows, companions, companionInputs };
236
- }
237
- /**
238
- * Adds a pipeline for the query. The method will hydrate the query using the
239
- * driver's current snapshot of the database and return a stream of results.
240
- * Henceforth, updates to the query will be returned when the driver is
241
- * {@link advance}d. The query and its pipeline can be removed with
242
- * {@link removeQuery()}.
243
- *
244
- * If a query with the same queryID is already added, the existing pipeline
245
- * will be removed and destroyed before adding the new pipeline.
246
- *
247
- * @param timer The caller-controlled {@link Timer} used to determine the
248
- * final hydration time. (The caller may pause and resume the timer
249
- * when yielding the thread for time-slicing).
250
- * @return The rows from the initial hydration of the query.
251
- */
252
- *addQuery(transformationHash, queryID, query, timer) {
253
- assert(
254
- this.initialized(),
255
- "Pipeline driver must be initialized before adding queries"
256
- );
257
- this.removeQuery(queryID);
258
- const debugDelegate = runtimeDebugFlags.trackRowsVended ? new Debug() : void 0;
259
- const costModel = this.#ensureCostModelExistsIfEnabled(
260
- this.#snapshotter.current().db.db
261
- );
262
- assert(
263
- this.#advanceContext === null,
264
- "Cannot hydrate while advance is in progress"
265
- );
266
- this.#hydrateContext = {
267
- timer
268
- };
269
- try {
270
- const {
271
- ast: resolvedQuery,
272
- companionRows,
273
- companions: companionMeta,
274
- companionInputs
275
- } = this.#resolveScalarSubqueries(query);
276
- const input = buildPipeline(
277
- resolvedQuery,
278
- {
279
- debug: debugDelegate,
280
- enableNotExists: true,
281
- // Server-side can handle NOT EXISTS
282
- getSource: (name) => this.#getSource(name),
283
- createStorage: () => this.#createStorage(),
284
- decorateSourceInput: (input2, _queryID) => new MeasurePushOperator(
285
- input2,
286
- queryID,
287
- this.#inspectorDelegate,
288
- "query-update-server"
289
- ),
290
- decorateInput: (input2) => input2,
291
- addEdge() {
292
- },
293
- decorateFilterInput: (input2) => input2
294
- },
295
- queryID,
296
- costModel
297
- );
298
- const schema = input.getSchema();
299
- input.setOutput({
300
- push: (change) => {
301
- const streamer = this.#streamer;
302
- assert(streamer, "must #startAccumulating() before pushing changes");
303
- streamer.accumulate(queryID, schema, [change]);
304
- return [];
305
- }
306
- });
307
- yield* hydrateInternal(
308
- input,
309
- queryID,
310
- must(this.#primaryKeys),
311
- this.#tableSpecs
312
- );
313
- for (const { table, row } of companionRows) {
314
- const primaryKey = mustGetPrimaryKey(this.#primaryKeys, table);
315
- yield {
316
- type: "add",
317
- queryID,
318
- table,
319
- rowKey: getRowKey(primaryKey, row),
320
- row
321
- };
322
- }
323
- const hydrationTimeMs = timer.totalElapsed();
324
- if (runtimeDebugFlags.trackRowCountsVended) {
325
- if (hydrationTimeMs > this.#logConfig.slowHydrateThreshold) {
326
- let totalRowsConsidered = 0;
327
- const lc = this.#lc.withContext("queryID", queryID).withContext("hydrationTimeMs", hydrationTimeMs);
328
- for (const tableName of this.#tables.keys()) {
329
- const entries = Object.entries(
330
- debugDelegate?.getVendedRowCounts()[tableName] ?? {}
331
- );
332
- totalRowsConsidered += entries.reduce(
333
- (acc, entry) => acc + entry[1],
334
- 0
335
- );
336
- lc.info?.(tableName + " VENDED: ", entries);
337
- }
338
- lc.info?.(`Total rows considered: ${totalRowsConsidered}`);
339
- }
340
- }
341
- debugDelegate?.reset();
342
- const liveCompanions = [];
343
- for (let i = 0; i < companionMeta.length; i++) {
344
- const meta = companionMeta[i];
345
- const companionInput = companionInputs[i];
346
- const companionSchema = companionInput.getSchema();
347
- const { childField, resolvedValue } = meta;
348
- companionInput.setOutput({
349
- push: (change) => {
350
- let newValue;
351
- switch (change.type) {
352
- case "add":
353
- case "edit":
354
- newValue = change.node.row[childField] ?? null;
355
- break;
356
- case "remove":
357
- newValue = void 0;
358
- break;
359
- case "child":
360
- return [];
361
- }
362
- if (!scalarValuesEqual(newValue, resolvedValue)) {
363
- throw new ResetPipelinesSignal(
364
- `Scalar subquery value changed for ${meta.ast.table}: ${String(resolvedValue)} -> ${String(newValue)}`
365
- );
366
- }
367
- const streamer = this.#streamer;
368
- assert(
369
- streamer,
370
- "must #startAccumulating() before pushing changes"
371
- );
372
- streamer.accumulate(queryID, companionSchema, [change]);
373
- return [];
374
- }
375
- });
376
- liveCompanions.push({ input: companionInput, childField, resolvedValue });
377
- }
378
- this.#pipelines.set(queryID, {
379
- input,
380
- hydrationTimeMs,
381
- transformedAst: resolvedQuery,
382
- transformationHash,
383
- companions: liveCompanions
384
- });
385
- } finally {
386
- this.#hydrateContext = null;
387
- }
388
- }
389
- /**
390
- * Removes the pipeline for the query. This is a no-op if the query
391
- * was not added.
392
- */
393
- removeQuery(queryID) {
394
- const pipeline = this.#pipelines.get(queryID);
395
- if (pipeline) {
396
- this.#pipelines.delete(queryID);
397
- pipeline.input.destroy();
398
- for (const companion of pipeline.companions) {
399
- companion.input.destroy();
400
- }
401
- }
402
- }
403
- /**
404
- * Returns the value of the row with the given primary key `pk`,
405
- * or `undefined` if there is no such row. The pipeline must have been
406
- * initialized.
407
- */
408
- getRow(table, pk) {
409
- assert(this.initialized(), "Not yet initialized");
410
- const source = must(this.#tables.get(table));
411
- return source.getRow(pk);
412
- }
413
- /**
414
- * Advances to the new head of the database.
415
- *
416
- * @param timer The caller-controlled {@link Timer} that will be used to
417
- * measure the progress of the advancement and abort with a
418
- * {@link ResetPipelinesSignal} if it is estimated to take longer
419
- * than a hydration.
420
- * @return The resulting row changes for all added queries. Note that the
421
- * `changes` must be iterated over in their entirety in order to
422
- * advance the database snapshot.
423
- */
424
- advance(timer) {
425
- assert(
426
- this.initialized(),
427
- "Pipeline driver must be initialized before advancing"
428
- );
429
- const diff = this.#snapshotter.advance(
430
- this.#tableSpecs,
431
- this.#allTableNames
432
- );
433
- const { prev, curr, changes } = diff;
434
- this.#lc.debug?.(
435
- `advance ${prev.version} => ${curr.version}: ${changes} changes`
436
- );
437
- return {
438
- version: curr.version,
439
- numChanges: changes,
440
- changes: this.#advance(diff, timer, changes)
441
- };
442
- }
443
- *#advance(diff, timer, numChanges) {
444
- assert(
445
- this.#hydrateContext === null,
446
- "Cannot advance while hydration is in progress"
447
- );
448
- this.#advanceContext = {
449
- timer,
450
- totalHydrationTimeMs: this.totalHydrationTimeMs(),
451
- numChanges,
452
- pos: 0
453
- };
454
- try {
455
- for (const { table, prevValues, nextValue } of diff) {
456
- if (this.#shouldAdvanceYieldMaybeAbortAdvance()) {
457
- yield "yield";
458
- }
459
- const start = timer.totalElapsed();
460
- let type;
461
- try {
462
- const tableSource = this.#tables.get(table);
463
- if (!tableSource) {
464
- continue;
465
- }
466
- const primaryKey = mustGetPrimaryKey(this.#primaryKeys, table);
467
- let editOldRow = void 0;
468
- for (const prevValue of prevValues) {
469
- if (nextValue && deepEqual(
470
- getRowKey(primaryKey, prevValue),
471
- getRowKey(primaryKey, nextValue)
472
- )) {
473
- editOldRow = prevValue;
474
- } else {
475
- if (nextValue) {
476
- this.#conflictRowsDeleted.add(1);
477
- }
478
- yield* this.#push(tableSource, {
479
- type: "remove",
480
- row: prevValue
481
- });
482
- }
483
- }
484
- if (nextValue) {
485
- if (editOldRow) {
486
- yield* this.#push(tableSource, {
487
- type: "edit",
488
- row: nextValue,
489
- oldRow: editOldRow
490
- });
491
- } else {
492
- yield* this.#push(tableSource, {
493
- type: "add",
494
- row: nextValue
495
- });
496
- }
497
- }
498
- } finally {
499
- this.#advanceContext.pos++;
500
- }
501
- const elapsed = timer.totalElapsed() - start;
502
- this.#advanceTime.record(elapsed / 1e3, {
503
- table,
504
- type
505
- });
506
- }
507
- const { curr } = diff;
508
- for (const table of this.#tables.values()) {
509
- table.setDB(curr.db.db);
510
- }
511
- this.#ensureCostModelExistsIfEnabled(curr.db.db);
512
- this.#lc.debug?.(`Advanced to ${curr.version}`);
513
- } finally {
514
- this.#advanceContext = null;
515
- }
516
- }
517
- /** Implements `BuilderDelegate.getSource()` */
518
- #getSource(tableName) {
519
- let source = this.#tables.get(tableName);
520
- if (source) {
521
- return source;
522
- }
523
- const tableSpec = mustGetTableSpec(this.#tableSpecs, tableName);
524
- const primaryKey = mustGetPrimaryKey(this.#primaryKeys, tableName);
525
- const { db } = this.#snapshotter.current();
526
- source = new TableSource(
527
- this.#lc,
528
- this.#logConfig,
529
- db.db,
530
- tableName,
531
- tableSpec.zqlSpec,
532
- primaryKey,
533
- () => this.#shouldYield()
534
- );
535
- this.#tables.set(tableName, source);
536
- this.#lc.debug?.(`created TableSource for ${tableName}`);
537
- return source;
538
- }
539
- #shouldYield() {
540
- if (this.#hydrateContext) {
541
- return this.#hydrateContext.timer.elapsedLap() > this.#yieldThresholdMs();
542
- }
543
- if (this.#advanceContext) {
544
- return this.#shouldAdvanceYieldMaybeAbortAdvance();
545
- }
546
- throw new Error("shouldYield called outside of hydration or advancement");
547
- }
548
- /**
549
- * Cancel the advancement processing, by throwing a ResetPipelinesSignal, if
550
- * it has taken longer than half the total hydration time to make it through
551
- * half of the advancement, or if processing time exceeds total hydration
552
- * time. This serves as both a circuit breaker for very large transactions,
553
- * as well as a bound on the amount of time the previous connection locks
554
- * the inactive WAL file (as the lock prevents WAL2 from switching to the
555
- * free WAL when the current one is over the size limit, which can make
556
- * the WAL grow continuously and compound slowness).
557
- * This is checked:
558
- * 1. before starting to process each change in an advancement is processed
559
- * 2. whenever a row is fetched from a TableSource during push processing
560
- */
561
- #shouldAdvanceYieldMaybeAbortAdvance() {
562
- const {
563
- pos,
564
- numChanges,
565
- timer: advanceTimer,
566
- totalHydrationTimeMs
567
- } = must(this.#advanceContext);
568
- const elapsed = advanceTimer.totalElapsed();
569
- if (elapsed > MIN_ADVANCEMENT_TIME_LIMIT_MS && (elapsed > totalHydrationTimeMs || elapsed > totalHydrationTimeMs / 2 && pos <= numChanges / 2)) {
570
- throw new ResetPipelinesSignal(
571
- `Advancement exceeded timeout at ${pos} of ${numChanges} changes after ${elapsed} ms. Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`
572
- );
573
- }
574
- return advanceTimer.elapsedLap() > this.#yieldThresholdMs();
575
- }
576
- /** Implements `BuilderDelegate.createStorage()` */
577
- #createStorage() {
578
- return this.#storage.createStorage();
579
- }
580
- *#push(source, change) {
581
- this.#startAccumulating();
582
- try {
583
- for (const val of source.genPush(change)) {
584
- if (val === "yield") {
585
- yield "yield";
586
- }
587
- for (const changeOrYield of this.#stopAccumulating().stream()) {
588
- yield changeOrYield;
589
- }
590
- this.#startAccumulating();
591
- }
592
- } finally {
593
- if (this.#streamer !== null) {
594
- this.#stopAccumulating();
595
- }
596
- }
597
- }
598
- #startAccumulating() {
599
- assert(this.#streamer === null, "Streamer already started");
600
- this.#streamer = new Streamer(must(this.#primaryKeys), this.#tableSpecs);
601
- }
602
- #stopAccumulating() {
603
- const streamer = this.#streamer;
604
- assert(streamer, "Streamer not started");
605
- this.#streamer = null;
606
- return streamer;
607
- }
608
- }
609
- class Streamer {
610
- #primaryKeys;
611
- #tableSpecs;
612
- constructor(primaryKeys, tableSpecs) {
613
- this.#primaryKeys = primaryKeys;
614
- this.#tableSpecs = tableSpecs;
615
- }
616
- #changes = [];
617
- accumulate(queryID, schema, changes) {
618
- this.#changes.push([queryID, schema, changes]);
619
- return this;
620
- }
621
- *stream() {
622
- for (const [queryID, schema, changes] of this.#changes) {
623
- yield* this.#streamChanges(queryID, schema, changes);
624
- }
625
- }
626
- *#streamChanges(queryID, schema, changes) {
627
- if (schema.system === "permissions") {
628
- return;
629
- }
630
- for (const change of changes) {
631
- if (change === "yield") {
632
- yield change;
633
- continue;
634
- }
635
- const { type } = change;
636
- switch (type) {
637
- case "add":
638
- case "remove": {
639
- yield* this.#streamNodes(queryID, schema, type, () => [change.node]);
640
- break;
641
- }
642
- case "child": {
643
- const { child } = change;
644
- const childSchema = must(
645
- schema.relationships[child.relationshipName]
646
- );
647
- yield* this.#streamChanges(queryID, childSchema, [child.change]);
648
- break;
649
- }
650
- case "edit":
651
- yield* this.#streamNodes(queryID, schema, type, () => [
652
- { row: change.node.row, relationships: {} }
653
- ]);
654
- break;
655
- default:
656
- unreachable();
657
- }
658
- }
659
- }
660
- *#streamNodes(queryID, schema, op, nodes) {
661
- const { tableName: table, system } = schema;
662
- const primaryKey = must(this.#primaryKeys.get(table));
663
- const spec = must(this.#tableSpecs.get(table)).tableSpec;
664
- if (system === "permissions") {
665
- return;
666
- }
667
- for (const node of nodes()) {
668
- if (node === "yield") {
669
- yield node;
670
- continue;
671
- }
672
- const { relationships } = node;
673
- let { row } = node;
674
- const rowKey = getRowKey(primaryKey, row);
675
- if (op !== "remove") {
676
- const rowVersion = row[ZERO_VERSION_COLUMN_NAME];
677
- if (typeof rowVersion === "string" && rowVersion < (spec.minRowVersion ?? "00")) {
678
- row = { ...row, [ZERO_VERSION_COLUMN_NAME]: spec.minRowVersion };
679
- }
680
- }
681
- yield {
682
- type: op,
683
- queryID,
684
- table,
685
- rowKey,
686
- row: op === "remove" ? void 0 : row
687
- };
688
- for (const [relationship, children] of Object.entries(relationships)) {
689
- const childSchema = must(schema.relationships[relationship]);
690
- yield* this.#streamNodes(queryID, childSchema, op, children);
691
- }
692
- }
693
- }
694
- }
20
+ //#region ../zero-cache/src/services/view-syncer/pipeline-driver.ts
21
+ /**
22
+ * No matter how fast hydration is, advancement is given at least this long to
23
+ * complete before doing a pipeline reset.
24
+ */
25
+ var MIN_ADVANCEMENT_TIME_LIMIT_MS = 50;
26
+ /**
27
+ * Manages the state of IVM pipelines for a given ViewSyncer (i.e. client group).
28
+ */
29
+ var PipelineDriver = class {
30
+ #tables = /* @__PURE__ */ new Map();
31
+ #pipelines = /* @__PURE__ */ new Map();
32
+ #lc;
33
+ #snapshotter;
34
+ #storage;
35
+ #shardID;
36
+ #logConfig;
37
+ #config;
38
+ #tableSpecs = /* @__PURE__ */ new Map();
39
+ #allTableNames = /* @__PURE__ */ new Set();
40
+ #costModels;
41
+ #yieldThresholdMs;
42
+ #streamer = null;
43
+ #hydrateContext = null;
44
+ #advanceContext = null;
45
+ #replicaVersion = null;
46
+ #primaryKeys = null;
47
+ #permissions = null;
48
+ #advanceTime = getOrCreateHistogram("sync", "ivm.advance-time", {
49
+ description: "Time to advance all queries for a given client group for in response to a single change.",
50
+ unit: "s"
51
+ });
52
+ #conflictRowsDeleted = getOrCreateCounter("sync", "ivm.conflict-rows-deleted", "Number of rows deleted because they conflicted with added row");
53
+ #inspectorDelegate;
54
+ constructor(lc, logConfig, snapshotter, shardID, storage, clientGroupID, inspectorDelegate, yieldThresholdMs, enablePlanner, config) {
55
+ this.#lc = lc.withContext("clientGroupID", clientGroupID);
56
+ this.#snapshotter = snapshotter;
57
+ this.#storage = storage;
58
+ this.#shardID = shardID;
59
+ this.#logConfig = logConfig;
60
+ this.#config = config;
61
+ this.#inspectorDelegate = inspectorDelegate;
62
+ this.#costModels = enablePlanner ? /* @__PURE__ */ new WeakMap() : void 0;
63
+ this.#yieldThresholdMs = yieldThresholdMs;
64
+ }
65
+ /**
66
+ * Initializes the PipelineDriver to the current head of the database.
67
+ * Queries can then be added (i.e. hydrated) with {@link addQuery()}.
68
+ *
69
+ * Must only be called once.
70
+ */
71
+ init(clientSchema) {
72
+ assert(!this.#snapshotter.initialized(), "Already initialized");
73
+ this.#snapshotter.init();
74
+ this.#initAndResetCommon(clientSchema);
75
+ }
76
+ /**
77
+ * @returns Whether the PipelineDriver has been initialized.
78
+ */
79
+ initialized() {
80
+ return this.#snapshotter.initialized();
81
+ }
82
+ /**
83
+ * Clears the current pipelines and TableSources, returning the PipelineDriver
84
+ * to its initial state. This should be called in response to a schema change,
85
+ * as TableSources need to be recomputed.
86
+ */
87
+ reset(clientSchema) {
88
+ for (const pipeline of this.#pipelines.values()) {
89
+ pipeline.input.destroy();
90
+ for (const companion of pipeline.companions) companion.input.destroy();
91
+ }
92
+ this.#pipelines.clear();
93
+ this.#tables.clear();
94
+ this.#allTableNames.clear();
95
+ this.#initAndResetCommon(clientSchema);
96
+ }
97
+ #initAndResetCommon(clientSchema) {
98
+ const { db } = this.#snapshotter.current();
99
+ const fullTables = /* @__PURE__ */ new Map();
100
+ computeZqlSpecs(this.#lc, db.db, { includeBackfillingColumns: false }, this.#tableSpecs, fullTables);
101
+ checkClientSchema(this.#shardID, clientSchema, this.#tableSpecs, fullTables);
102
+ this.#allTableNames.clear();
103
+ for (const table of fullTables.keys()) this.#allTableNames.add(table);
104
+ const primaryKeys = this.#primaryKeys ?? /* @__PURE__ */ new Map();
105
+ this.#primaryKeys = primaryKeys;
106
+ primaryKeys.clear();
107
+ for (const [table, spec] of this.#tableSpecs.entries()) if (table.startsWith(upstreamSchema(this.#shardID))) primaryKeys.set(table, spec.tableSpec.primaryKey);
108
+ buildPrimaryKeys(clientSchema, primaryKeys);
109
+ const { replicaVersion } = getSubscriptionState(db);
110
+ this.#replicaVersion = replicaVersion;
111
+ }
112
+ /** @returns The replica version. The PipelineDriver must have been initialized. */
113
+ get replicaVersion() {
114
+ return must(this.#replicaVersion, "Not yet initialized");
115
+ }
116
+ /**
117
+ * Returns the current version of the database. This will reflect the
118
+ * latest version change when calling {@link advance()} once the
119
+ * iteration has begun.
120
+ */
121
+ currentVersion() {
122
+ assert(this.initialized(), "Not yet initialized");
123
+ return this.#snapshotter.current().version;
124
+ }
125
+ /**
126
+ * Returns the current upstream {app}.permissions, or `null` if none are defined.
127
+ */
128
+ currentPermissions() {
129
+ assert(this.initialized(), "Not yet initialized");
130
+ const res = reloadPermissionsIfChanged(this.#lc, this.#snapshotter.current().db, this.#shardID.appID, this.#permissions, this.#config);
131
+ if (res.changed) {
132
+ this.#permissions = res.permissions;
133
+ this.#lc.debug?.("Reloaded permissions", JSON.stringify(this.#permissions));
134
+ }
135
+ return this.#permissions;
136
+ }
137
+ advanceWithoutDiff() {
138
+ const { db, version } = this.#snapshotter.advanceWithoutDiff().curr;
139
+ for (const table of this.#tables.values()) table.setDB(db.db);
140
+ return version;
141
+ }
142
+ #ensureCostModelExistsIfEnabled(db) {
143
+ let existing = this.#costModels?.get(db);
144
+ if (existing) return existing;
145
+ if (this.#costModels) {
146
+ const costModel = createSQLiteCostModel(db, this.#tableSpecs);
147
+ this.#costModels.set(db, costModel);
148
+ return costModel;
149
+ }
150
+ }
151
+ /**
152
+ * Clears storage used for the pipelines. Call this when the
153
+ * PipelineDriver will no longer be used.
154
+ */
155
+ destroy() {
156
+ this.#storage.destroy();
157
+ this.#snapshotter.destroy();
158
+ }
159
+ /** @return Map from query ID to PipelineInfo for all added queries. */
160
+ queries() {
161
+ return this.#pipelines;
162
+ }
163
+ totalHydrationTimeMs() {
164
+ let total = 0;
165
+ for (const pipeline of this.#pipelines.values()) total += pipeline.hydrationTimeMs;
166
+ return total;
167
+ }
168
+ #resolveScalarSubqueries(ast) {
169
+ const companionRows = [];
170
+ const companionInputs = [];
171
+ const executor = (subqueryAST, childField) => {
172
+ const input = buildPipeline(subqueryAST, {
173
+ getSource: (name) => this.#getSource(name),
174
+ createStorage: () => this.#createStorage(),
175
+ decorateSourceInput: (input) => input,
176
+ decorateInput: (input) => input,
177
+ addEdge() {},
178
+ decorateFilterInput: (input) => input
179
+ }, "scalar-subquery");
180
+ let node;
181
+ for (const n of skipYields(input.fetch({}))) node ??= n;
182
+ if (!node) {
183
+ companionInputs.push(input);
184
+ return;
185
+ }
186
+ companionRows.push({
187
+ table: subqueryAST.table,
188
+ row: node.row
189
+ });
190
+ companionInputs.push(input);
191
+ return node.row[childField] ?? null;
192
+ };
193
+ const { ast: resolved, companions } = resolveSimpleScalarSubqueries(ast, this.#tableSpecs, executor);
194
+ return {
195
+ ast: resolved,
196
+ companionRows,
197
+ companions,
198
+ companionInputs
199
+ };
200
+ }
201
+ /**
202
+ * Adds a pipeline for the query. The method will hydrate the query using the
203
+ * driver's current snapshot of the database and return a stream of results.
204
+ * Henceforth, updates to the query will be returned when the driver is
205
+ * {@link advance}d. The query and its pipeline can be removed with
206
+ * {@link removeQuery()}.
207
+ *
208
+ * If a query with the same queryID is already added, the existing pipeline
209
+ * will be removed and destroyed before adding the new pipeline.
210
+ *
211
+ * @param timer The caller-controlled {@link Timer} used to determine the
212
+ * final hydration time. (The caller may pause and resume the timer
213
+ * when yielding the thread for time-slicing).
214
+ * @return The rows from the initial hydration of the query.
215
+ */
216
+ *addQuery(transformationHash, queryID, query, timer) {
217
+ assert(this.initialized(), "Pipeline driver must be initialized before adding queries");
218
+ this.removeQuery(queryID);
219
+ const debugDelegate = runtimeDebugFlags.trackRowsVended ? new Debug() : void 0;
220
+ const costModel = this.#ensureCostModelExistsIfEnabled(this.#snapshotter.current().db.db);
221
+ assert(this.#advanceContext === null, "Cannot hydrate while advance is in progress");
222
+ this.#hydrateContext = { timer };
223
+ try {
224
+ const { ast: resolvedQuery, companionRows, companions: companionMeta, companionInputs } = this.#resolveScalarSubqueries(query);
225
+ const input = buildPipeline(resolvedQuery, {
226
+ debug: debugDelegate,
227
+ enableNotExists: true,
228
+ getSource: (name) => this.#getSource(name),
229
+ createStorage: () => this.#createStorage(),
230
+ decorateSourceInput: (input, _queryID) => new MeasurePushOperator(input, queryID, this.#inspectorDelegate, "query-update-server"),
231
+ decorateInput: (input) => input,
232
+ addEdge() {},
233
+ decorateFilterInput: (input) => input
234
+ }, queryID, costModel);
235
+ const schema = input.getSchema();
236
+ input.setOutput({ push: (change) => {
237
+ const streamer = this.#streamer;
238
+ assert(streamer, "must #startAccumulating() before pushing changes");
239
+ streamer.accumulate(queryID, schema, [change]);
240
+ return [];
241
+ } });
242
+ yield* hydrateInternal(input, queryID, must(this.#primaryKeys), this.#tableSpecs);
243
+ for (const { table, row } of companionRows) yield {
244
+ type: "add",
245
+ queryID,
246
+ table,
247
+ rowKey: getRowKey(mustGetPrimaryKey(this.#primaryKeys, table), row),
248
+ row
249
+ };
250
+ const hydrationTimeMs = timer.totalElapsed();
251
+ if (runtimeDebugFlags.trackRowCountsVended) {
252
+ if (hydrationTimeMs > this.#logConfig.slowHydrateThreshold) {
253
+ let totalRowsConsidered = 0;
254
+ const lc = this.#lc.withContext("queryID", queryID).withContext("hydrationTimeMs", hydrationTimeMs);
255
+ for (const tableName of this.#tables.keys()) {
256
+ const entries = Object.entries(debugDelegate?.getVendedRowCounts()[tableName] ?? {});
257
+ totalRowsConsidered += entries.reduce((acc, entry) => acc + entry[1], 0);
258
+ lc.info?.(tableName + " VENDED: ", entries);
259
+ }
260
+ lc.info?.(`Total rows considered: ${totalRowsConsidered}`);
261
+ }
262
+ }
263
+ debugDelegate?.reset();
264
+ const liveCompanions = [];
265
+ for (let i = 0; i < companionMeta.length; i++) {
266
+ const meta = companionMeta[i];
267
+ const companionInput = companionInputs[i];
268
+ const companionSchema = companionInput.getSchema();
269
+ const { childField, resolvedValue } = meta;
270
+ companionInput.setOutput({ push: (change) => {
271
+ let newValue;
272
+ switch (change.type) {
273
+ case "add":
274
+ case "edit":
275
+ newValue = change.node.row[childField] ?? null;
276
+ break;
277
+ case "remove":
278
+ newValue = void 0;
279
+ break;
280
+ case "child": return [];
281
+ }
282
+ if (!scalarValuesEqual(newValue, resolvedValue)) throw new ResetPipelinesSignal(`Scalar subquery value changed for ${meta.ast.table}: ${String(resolvedValue)} -> ${String(newValue)}`);
283
+ const streamer = this.#streamer;
284
+ assert(streamer, "must #startAccumulating() before pushing changes");
285
+ streamer.accumulate(queryID, companionSchema, [change]);
286
+ return [];
287
+ } });
288
+ liveCompanions.push({
289
+ input: companionInput,
290
+ childField,
291
+ resolvedValue
292
+ });
293
+ }
294
+ this.#pipelines.set(queryID, {
295
+ input,
296
+ hydrationTimeMs,
297
+ transformedAst: resolvedQuery,
298
+ transformationHash,
299
+ companions: liveCompanions
300
+ });
301
+ } finally {
302
+ this.#hydrateContext = null;
303
+ }
304
+ }
305
+ /**
306
+ * Removes the pipeline for the query. This is a no-op if the query
307
+ * was not added.
308
+ */
309
+ removeQuery(queryID) {
310
+ const pipeline = this.#pipelines.get(queryID);
311
+ if (pipeline) {
312
+ this.#pipelines.delete(queryID);
313
+ pipeline.input.destroy();
314
+ for (const companion of pipeline.companions) companion.input.destroy();
315
+ }
316
+ }
317
+ /**
318
+ * Returns the value of the row with the given primary key `pk`,
319
+ * or `undefined` if there is no such row. The pipeline must have been
320
+ * initialized.
321
+ */
322
+ getRow(table, pk) {
323
+ assert(this.initialized(), "Not yet initialized");
324
+ return must(this.#tables.get(table)).getRow(pk);
325
+ }
326
+ /**
327
+ * Advances to the new head of the database.
328
+ *
329
+ * @param timer The caller-controlled {@link Timer} that will be used to
330
+ * measure the progress of the advancement and abort with a
331
+ * {@link ResetPipelinesSignal} if it is estimated to take longer
332
+ * than a hydration.
333
+ * @return The resulting row changes for all added queries. Note that the
334
+ * `changes` must be iterated over in their entirety in order to
335
+ * advance the database snapshot.
336
+ */
337
+ advance(timer) {
338
+ assert(this.initialized(), "Pipeline driver must be initialized before advancing");
339
+ const diff = this.#snapshotter.advance(this.#tableSpecs, this.#allTableNames);
340
+ const { prev, curr, changes } = diff;
341
+ this.#lc.debug?.(`advance ${prev.version} => ${curr.version}: ${changes} changes`);
342
+ return {
343
+ version: curr.version,
344
+ numChanges: changes,
345
+ changes: this.#advance(diff, timer, changes)
346
+ };
347
+ }
348
+ *#advance(diff, timer, numChanges) {
349
+ assert(this.#hydrateContext === null, "Cannot advance while hydration is in progress");
350
+ const totalHydrationTimeMs = this.totalHydrationTimeMs();
351
+ this.#advanceContext = {
352
+ timer,
353
+ totalHydrationTimeMs,
354
+ numChanges,
355
+ pos: 0
356
+ };
357
+ this.#lc.info?.(`starting pipeline advancement of ${numChanges} changes with an advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`);
358
+ try {
359
+ for (const { table, prevValues, nextValue } of diff) {
360
+ if (this.#shouldAdvanceYieldMaybeAbortAdvance()) yield "yield";
361
+ const start = timer.totalElapsed();
362
+ let type;
363
+ try {
364
+ const tableSource = this.#tables.get(table);
365
+ if (!tableSource) continue;
366
+ const primaryKey = mustGetPrimaryKey(this.#primaryKeys, table);
367
+ let editOldRow = void 0;
368
+ for (const prevValue of prevValues) if (nextValue && deepEqual(getRowKey(primaryKey, prevValue), getRowKey(primaryKey, nextValue))) editOldRow = prevValue;
369
+ else {
370
+ if (nextValue) this.#conflictRowsDeleted.add(1);
371
+ yield* this.#push(tableSource, {
372
+ type: "remove",
373
+ row: prevValue
374
+ });
375
+ }
376
+ if (nextValue) if (editOldRow) yield* this.#push(tableSource, {
377
+ type: "edit",
378
+ row: nextValue,
379
+ oldRow: editOldRow
380
+ });
381
+ else yield* this.#push(tableSource, {
382
+ type: "add",
383
+ row: nextValue
384
+ });
385
+ } finally {
386
+ this.#advanceContext.pos++;
387
+ }
388
+ const elapsed = timer.totalElapsed() - start;
389
+ this.#advanceTime.record(elapsed / 1e3, {
390
+ table,
391
+ type
392
+ });
393
+ }
394
+ const { curr } = diff;
395
+ for (const table of this.#tables.values()) table.setDB(curr.db.db);
396
+ this.#ensureCostModelExistsIfEnabled(curr.db.db);
397
+ this.#lc.debug?.(`Advanced to ${curr.version}`);
398
+ } finally {
399
+ this.#advanceContext = null;
400
+ }
401
+ }
402
+ /** Implements `BuilderDelegate.getSource()` */
403
+ #getSource(tableName) {
404
+ let source = this.#tables.get(tableName);
405
+ if (source) return source;
406
+ const tableSpec = mustGetTableSpec(this.#tableSpecs, tableName);
407
+ const primaryKey = mustGetPrimaryKey(this.#primaryKeys, tableName);
408
+ const { db } = this.#snapshotter.current();
409
+ source = new TableSource(this.#lc, this.#logConfig, db.db, tableName, tableSpec.zqlSpec, primaryKey, () => this.#shouldYield());
410
+ this.#tables.set(tableName, source);
411
+ this.#lc.debug?.(`created TableSource for ${tableName}`);
412
+ return source;
413
+ }
414
+ #shouldYield() {
415
+ if (this.#hydrateContext) return this.#hydrateContext.timer.elapsedLap() > this.#yieldThresholdMs();
416
+ if (this.#advanceContext) return this.#shouldAdvanceYieldMaybeAbortAdvance();
417
+ throw new Error("shouldYield called outside of hydration or advancement");
418
+ }
419
+ /**
420
+ * Cancel the advancement processing, by throwing a ResetPipelinesSignal, if
421
+ * it has taken longer than half the total hydration time to make it through
422
+ * half of the advancement, or if processing time exceeds total hydration
423
+ * time. This serves as both a circuit breaker for very large transactions,
424
+ * as well as a bound on the amount of time the previous connection locks
425
+ * the inactive WAL file (as the lock prevents WAL2 from switching to the
426
+ * free WAL when the current one is over the size limit, which can make
427
+ * the WAL grow continuously and compound slowness).
428
+ * This is checked:
429
+ * 1. before starting to process each change in an advancement is processed
430
+ * 2. whenever a row is fetched from a TableSource during push processing
431
+ */
432
+ #shouldAdvanceYieldMaybeAbortAdvance() {
433
+ const { pos, numChanges, timer: advanceTimer, totalHydrationTimeMs } = must(this.#advanceContext);
434
+ const elapsed = advanceTimer.totalElapsed();
435
+ if (elapsed > MIN_ADVANCEMENT_TIME_LIMIT_MS && (elapsed > totalHydrationTimeMs || elapsed > totalHydrationTimeMs / 2 && pos <= numChanges / 2)) throw new ResetPipelinesSignal(`Advancement exceeded timeout at ${pos} of ${numChanges} changes after ${elapsed} ms. Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`);
436
+ return advanceTimer.elapsedLap() > this.#yieldThresholdMs();
437
+ }
438
+ /** Implements `BuilderDelegate.createStorage()` */
439
+ #createStorage() {
440
+ return this.#storage.createStorage();
441
+ }
442
+ *#push(source, change) {
443
+ this.#startAccumulating();
444
+ try {
445
+ for (const val of source.genPush(change)) {
446
+ if (val === "yield") yield "yield";
447
+ for (const changeOrYield of this.#stopAccumulating().stream()) yield changeOrYield;
448
+ this.#startAccumulating();
449
+ }
450
+ } finally {
451
+ if (this.#streamer !== null) this.#stopAccumulating();
452
+ }
453
+ }
454
+ #startAccumulating() {
455
+ assert(this.#streamer === null, "Streamer already started");
456
+ this.#streamer = new Streamer(must(this.#primaryKeys), this.#tableSpecs);
457
+ }
458
+ #stopAccumulating() {
459
+ const streamer = this.#streamer;
460
+ assert(streamer, "Streamer not started");
461
+ this.#streamer = null;
462
+ return streamer;
463
+ }
464
+ };
465
+ var Streamer = class {
466
+ #primaryKeys;
467
+ #tableSpecs;
468
+ constructor(primaryKeys, tableSpecs) {
469
+ this.#primaryKeys = primaryKeys;
470
+ this.#tableSpecs = tableSpecs;
471
+ }
472
+ #changes = [];
473
+ accumulate(queryID, schema, changes) {
474
+ this.#changes.push([
475
+ queryID,
476
+ schema,
477
+ changes
478
+ ]);
479
+ return this;
480
+ }
481
+ *stream() {
482
+ for (const [queryID, schema, changes] of this.#changes) yield* this.#streamChanges(queryID, schema, changes);
483
+ }
484
+ *#streamChanges(queryID, schema, changes) {
485
+ if (schema.system === "permissions") return;
486
+ for (const change of changes) {
487
+ if (change === "yield") {
488
+ yield change;
489
+ continue;
490
+ }
491
+ const { type } = change;
492
+ switch (type) {
493
+ case "add":
494
+ case "remove":
495
+ yield* this.#streamNodes(queryID, schema, type, () => [change.node]);
496
+ break;
497
+ case "child": {
498
+ const { child } = change;
499
+ const childSchema = must(schema.relationships[child.relationshipName]);
500
+ yield* this.#streamChanges(queryID, childSchema, [child.change]);
501
+ break;
502
+ }
503
+ case "edit":
504
+ yield* this.#streamNodes(queryID, schema, type, () => [{
505
+ row: change.node.row,
506
+ relationships: {}
507
+ }]);
508
+ break;
509
+ default: unreachable(type);
510
+ }
511
+ }
512
+ }
513
+ *#streamNodes(queryID, schema, op, nodes) {
514
+ const { tableName: table, system } = schema;
515
+ const primaryKey = must(this.#primaryKeys.get(table));
516
+ const spec = must(this.#tableSpecs.get(table)).tableSpec;
517
+ if (system === "permissions") return;
518
+ for (const node of nodes()) {
519
+ if (node === "yield") {
520
+ yield node;
521
+ continue;
522
+ }
523
+ const { relationships } = node;
524
+ let { row } = node;
525
+ const rowKey = getRowKey(primaryKey, row);
526
+ if (op !== "remove") {
527
+ const rowVersion = row[ZERO_VERSION_COLUMN_NAME];
528
+ if (typeof rowVersion === "string" && rowVersion < (spec.minRowVersion ?? "00")) row = {
529
+ ...row,
530
+ [ZERO_VERSION_COLUMN_NAME]: spec.minRowVersion
531
+ };
532
+ }
533
+ yield {
534
+ type: op,
535
+ queryID,
536
+ table,
537
+ rowKey,
538
+ row: op === "remove" ? void 0 : row
539
+ };
540
+ for (const [relationship, children] of Object.entries(relationships)) {
541
+ const childSchema = must(schema.relationships[relationship]);
542
+ yield* this.#streamNodes(queryID, childSchema, op, children);
543
+ }
544
+ }
545
+ }
546
+ };
695
547
  function* toAdds(nodes) {
696
- for (const node of nodes) {
697
- if (node === "yield") {
698
- yield node;
699
- continue;
700
- }
701
- yield { type: "add", node };
702
- }
548
+ for (const node of nodes) {
549
+ if (node === "yield") {
550
+ yield node;
551
+ continue;
552
+ }
553
+ yield {
554
+ type: "add",
555
+ node
556
+ };
557
+ }
703
558
  }
704
559
  function getRowKey(cols, row) {
705
- return Object.fromEntries(cols.map((col) => [col, must(row[col])]));
560
+ return Object.fromEntries(cols.map((col) => [col, must(row[col])]));
706
561
  }
562
+ /**
563
+ * Core hydration logic used by {@link PipelineDriver#addQuery}, extracted to a
564
+ * function for reuse by bin-analyze so that bin-analyze's hydration logic
565
+ * is as close as possible to zero-cache's real hydration logic.
566
+ */
707
567
  function* hydrate(input, hash, clientSchema, tableSpecs) {
708
- const res = input.fetch({});
709
- const streamer = new Streamer(
710
- buildPrimaryKeys(clientSchema),
711
- tableSpecs
712
- ).accumulate(hash, input.getSchema(), toAdds(res));
713
- yield* streamer.stream();
568
+ const res = input.fetch({});
569
+ yield* new Streamer(buildPrimaryKeys(clientSchema), tableSpecs).accumulate(hash, input.getSchema(), toAdds(res)).stream();
714
570
  }
715
571
  function* hydrateInternal(input, hash, primaryKeys, tableSpecs) {
716
- const res = input.fetch({});
717
- const streamer = new Streamer(primaryKeys, tableSpecs).accumulate(
718
- hash,
719
- input.getSchema(),
720
- toAdds(res)
721
- );
722
- yield* streamer.stream();
572
+ const res = input.fetch({});
573
+ yield* new Streamer(primaryKeys, tableSpecs).accumulate(hash, input.getSchema(), toAdds(res)).stream();
723
574
  }
724
575
  function buildPrimaryKeys(clientSchema, primaryKeys = /* @__PURE__ */ new Map()) {
725
- for (const [tableName, { primaryKey }] of Object.entries(clientSchema.tables)) {
726
- primaryKeys.set(tableName, primaryKey);
727
- }
728
- return primaryKeys;
576
+ for (const [tableName, { primaryKey }] of Object.entries(clientSchema.tables)) primaryKeys.set(tableName, primaryKey);
577
+ return primaryKeys;
729
578
  }
730
579
  function mustGetPrimaryKey(primaryKeys, table) {
731
- const pKeys = must(primaryKeys, "primaryKey map must be non-null");
732
- return must(
733
- pKeys.get(table),
734
- `table '${table}' is not one of: ${[...pKeys.keys()].sort()}. Check the spelling and ensure that the table has a primary key.`
735
- );
580
+ const pKeys = must(primaryKeys, "primaryKey map must be non-null");
581
+ return must(pKeys.get(table), `table '${table}' is not one of: ${[...pKeys.keys()].sort()}. Check the spelling and ensure that the table has a primary key.`);
736
582
  }
583
+ /**
584
+ * Compares two scalar subquery resolved values for equality.
585
+ * Unlike `valuesEqual` in data.ts (which treats null != null for join
586
+ * semantics), this uses identity semantics: undefined === undefined
587
+ * (no row matched), null === null (row matched but field was NULL).
588
+ */
737
589
  function scalarValuesEqual(a, b) {
738
- return a === b;
590
+ return a === b;
739
591
  }
740
- export {
741
- PipelineDriver,
742
- hydrate,
743
- hydrateInternal
744
- };
745
- //# sourceMappingURL=pipeline-driver.js.map
592
+ //#endregion
593
+ export { PipelineDriver, hydrate };
594
+
595
+ //# sourceMappingURL=pipeline-driver.js.map