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