@rocicorp/zero 0.26.1 → 0.26.2-canary.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1086) hide show
  1. package/out/_virtual/_@oxc-project_runtime@0.115.0/helpers/usingCtx.js +57 -0
  2. package/out/_virtual/_rolldown/runtime.js +27 -0
  3. package/out/analyze-query/src/bin-analyze.js +195 -283
  4. package/out/analyze-query/src/bin-analyze.js.map +1 -1
  5. package/out/analyze-query/src/bin-transform.js +35 -40
  6. package/out/analyze-query/src/bin-transform.js.map +1 -1
  7. package/out/analyze-query/src/explain-queries.js +11 -13
  8. package/out/analyze-query/src/explain-queries.js.map +1 -1
  9. package/out/analyze-query/src/run-ast.js +68 -103
  10. package/out/analyze-query/src/run-ast.js.map +1 -1
  11. package/out/ast-to-zql/src/ast-to-zql.js +105 -153
  12. package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
  13. package/out/ast-to-zql/src/bin.js +57 -62
  14. package/out/ast-to-zql/src/bin.js.map +1 -1
  15. package/out/ast-to-zql/src/format.js +14 -13
  16. package/out/ast-to-zql/src/format.js.map +1 -1
  17. package/out/datadog/src/datadog-log-sink.js +148 -213
  18. package/out/datadog/src/datadog-log-sink.js.map +1 -1
  19. package/out/otel/src/enabled.js +9 -11
  20. package/out/otel/src/enabled.js.map +1 -1
  21. package/out/otel/src/log-options.js +25 -35
  22. package/out/otel/src/log-options.js.map +1 -1
  23. package/out/otel/src/maybe-time.js +13 -14
  24. package/out/otel/src/maybe-time.js.map +1 -1
  25. package/out/otel/src/span.js +23 -26
  26. package/out/otel/src/span.js.map +1 -1
  27. package/out/otel/src/test-log-config.js +11 -10
  28. package/out/otel/src/test-log-config.js.map +1 -1
  29. package/out/otel/src/version.js +6 -5
  30. package/out/otel/src/version.js.map +1 -1
  31. package/out/replicache/src/async-iterable-to-array.js +8 -9
  32. package/out/replicache/src/async-iterable-to-array.js.map +1 -1
  33. package/out/replicache/src/bg-interval.js +28 -35
  34. package/out/replicache/src/bg-interval.js.map +1 -1
  35. package/out/replicache/src/btree/diff.js +6 -5
  36. package/out/replicache/src/btree/diff.js.map +1 -1
  37. package/out/replicache/src/btree/node.js +281 -372
  38. package/out/replicache/src/btree/node.js.map +1 -1
  39. package/out/replicache/src/btree/read.js +155 -256
  40. package/out/replicache/src/btree/read.js.map +1 -1
  41. package/out/replicache/src/btree/splice.js +60 -80
  42. package/out/replicache/src/btree/splice.js.map +1 -1
  43. package/out/replicache/src/btree/write.js +134 -158
  44. package/out/replicache/src/btree/write.js.map +1 -1
  45. package/out/replicache/src/call-default-fetch.js +28 -32
  46. package/out/replicache/src/call-default-fetch.js.map +1 -1
  47. package/out/replicache/src/config.js +2 -0
  48. package/out/replicache/src/connection-loop-delegates.js +31 -33
  49. package/out/replicache/src/connection-loop-delegates.js.map +1 -1
  50. package/out/replicache/src/connection-loop.js +174 -240
  51. package/out/replicache/src/connection-loop.js.map +1 -1
  52. package/out/replicache/src/cookies.js +22 -32
  53. package/out/replicache/src/cookies.js.map +1 -1
  54. package/out/replicache/src/dag/chunk.js +44 -50
  55. package/out/replicache/src/dag/chunk.js.map +1 -1
  56. package/out/replicache/src/dag/gc.js +94 -114
  57. package/out/replicache/src/dag/gc.js.map +1 -1
  58. package/out/replicache/src/dag/key.js +9 -11
  59. package/out/replicache/src/dag/key.js.map +1 -1
  60. package/out/replicache/src/dag/lazy-store.js +458 -510
  61. package/out/replicache/src/dag/lazy-store.js.map +1 -1
  62. package/out/replicache/src/dag/store-impl.js +147 -178
  63. package/out/replicache/src/dag/store-impl.js.map +1 -1
  64. package/out/replicache/src/dag/store.js +19 -22
  65. package/out/replicache/src/dag/store.js.map +1 -1
  66. package/out/replicache/src/dag/visitor.js +23 -21
  67. package/out/replicache/src/dag/visitor.js.map +1 -1
  68. package/out/replicache/src/db/commit.js +209 -283
  69. package/out/replicache/src/db/commit.js.map +1 -1
  70. package/out/replicache/src/db/index.js +79 -122
  71. package/out/replicache/src/db/index.js.map +1 -1
  72. package/out/replicache/src/db/read.js +44 -60
  73. package/out/replicache/src/db/read.js.map +1 -1
  74. package/out/replicache/src/db/rebase.js +22 -77
  75. package/out/replicache/src/db/rebase.js.map +1 -1
  76. package/out/replicache/src/db/write.js +162 -296
  77. package/out/replicache/src/db/write.js.map +1 -1
  78. package/out/replicache/src/deleted-clients.js +59 -87
  79. package/out/replicache/src/deleted-clients.js.map +1 -1
  80. package/out/replicache/src/error-responses.js +18 -26
  81. package/out/replicache/src/error-responses.js.map +1 -1
  82. package/out/replicache/src/expo-sqlite.js +2 -0
  83. package/out/replicache/src/frozen-json.js +74 -108
  84. package/out/replicache/src/frozen-json.js.map +1 -1
  85. package/out/replicache/src/get-default-puller.js +34 -46
  86. package/out/replicache/src/get-default-puller.js.map +1 -1
  87. package/out/replicache/src/get-default-pusher.js +25 -33
  88. package/out/replicache/src/get-default-pusher.js.map +1 -1
  89. package/out/replicache/src/get-kv-store-provider.js +18 -20
  90. package/out/replicache/src/get-kv-store-provider.js.map +1 -1
  91. package/out/replicache/src/hash.js +29 -29
  92. package/out/replicache/src/hash.js.map +1 -1
  93. package/out/replicache/src/http-request-info.js +9 -8
  94. package/out/replicache/src/http-request-info.js.map +1 -1
  95. package/out/replicache/src/impl.js +2 -0
  96. package/out/replicache/src/index-defs.js +17 -28
  97. package/out/replicache/src/index-defs.js.map +1 -1
  98. package/out/replicache/src/kv/expo-sqlite/store.js +52 -50
  99. package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
  100. package/out/replicache/src/kv/idb-store-with-mem-fallback.js +71 -68
  101. package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +1 -1
  102. package/out/replicache/src/kv/idb-store.js +144 -168
  103. package/out/replicache/src/kv/idb-store.js.map +1 -1
  104. package/out/replicache/src/kv/mem-store.js +57 -45
  105. package/out/replicache/src/kv/mem-store.js.map +1 -1
  106. package/out/replicache/src/kv/op-sqlite/store.js +56 -62
  107. package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
  108. package/out/replicache/src/kv/op-sqlite/types.d.ts.map +1 -1
  109. package/out/replicache/src/kv/op-sqlite/types.js +7 -6
  110. package/out/replicache/src/kv/op-sqlite/types.js.map +1 -1
  111. package/out/replicache/src/kv/read-impl.js +26 -25
  112. package/out/replicache/src/kv/read-impl.js.map +1 -1
  113. package/out/replicache/src/kv/sqlite-store.js +194 -207
  114. package/out/replicache/src/kv/sqlite-store.js.map +1 -1
  115. package/out/replicache/src/kv/throw-if-closed.js +12 -19
  116. package/out/replicache/src/kv/throw-if-closed.js.map +1 -1
  117. package/out/replicache/src/kv/write-impl-base.js +44 -56
  118. package/out/replicache/src/kv/write-impl-base.js.map +1 -1
  119. package/out/replicache/src/kv/write-impl.js +22 -26
  120. package/out/replicache/src/kv/write-impl.js.map +1 -1
  121. package/out/replicache/src/lazy.js +10 -11
  122. package/out/replicache/src/lazy.js.map +1 -1
  123. package/out/replicache/src/log-options.js +14 -7
  124. package/out/replicache/src/log-options.js.map +1 -1
  125. package/out/replicache/src/make-idb-name.js +14 -9
  126. package/out/replicache/src/make-idb-name.js.map +1 -1
  127. package/out/replicache/src/mutation-recovery.js +12 -0
  128. package/out/replicache/src/mutation-recovery.js.map +1 -0
  129. package/out/replicache/src/new-client-channel.js +34 -42
  130. package/out/replicache/src/new-client-channel.js.map +1 -1
  131. package/out/replicache/src/on-persist-channel.js +26 -29
  132. package/out/replicache/src/on-persist-channel.js.map +1 -1
  133. package/out/replicache/src/op-sqlite.js +2 -0
  134. package/out/replicache/src/patch-operation.js +27 -36
  135. package/out/replicache/src/patch-operation.js.map +1 -1
  136. package/out/replicache/src/pending-mutations.js +14 -12
  137. package/out/replicache/src/pending-mutations.js.map +1 -1
  138. package/out/replicache/src/persist/client-gc.js +36 -51
  139. package/out/replicache/src/persist/client-gc.js.map +1 -1
  140. package/out/replicache/src/persist/client-group-gc.js +29 -36
  141. package/out/replicache/src/persist/client-group-gc.js.map +1 -1
  142. package/out/replicache/src/persist/client-groups.js +80 -154
  143. package/out/replicache/src/persist/client-groups.js.map +1 -1
  144. package/out/replicache/src/persist/clients.js +212 -307
  145. package/out/replicache/src/persist/clients.js.map +1 -1
  146. package/out/replicache/src/persist/collect-idb-databases.js +109 -171
  147. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
  148. package/out/replicache/src/persist/gather-mem-only-visitor.js +23 -24
  149. package/out/replicache/src/persist/gather-mem-only-visitor.js.map +1 -1
  150. package/out/replicache/src/persist/gather-not-cached-visitor.js +35 -33
  151. package/out/replicache/src/persist/gather-not-cached-visitor.js.map +1 -1
  152. package/out/replicache/src/persist/heartbeat.js +31 -41
  153. package/out/replicache/src/persist/heartbeat.js.map +1 -1
  154. package/out/replicache/src/persist/idb-databases-store-db-name.js +9 -12
  155. package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -1
  156. package/out/replicache/src/persist/idb-databases-store.js +78 -97
  157. package/out/replicache/src/persist/idb-databases-store.js.map +1 -1
  158. package/out/replicache/src/persist/make-client-id.js +13 -9
  159. package/out/replicache/src/persist/make-client-id.js.map +1 -1
  160. package/out/replicache/src/persist/persist.js +113 -174
  161. package/out/replicache/src/persist/persist.js.map +1 -1
  162. package/out/replicache/src/persist/refresh.js +94 -183
  163. package/out/replicache/src/persist/refresh.js.map +1 -1
  164. package/out/replicache/src/process-scheduler.js +122 -143
  165. package/out/replicache/src/process-scheduler.js.map +1 -1
  166. package/out/replicache/src/pusher.js +21 -26
  167. package/out/replicache/src/pusher.js.map +1 -1
  168. package/out/replicache/src/replicache-impl.js +844 -1184
  169. package/out/replicache/src/replicache-impl.js.map +1 -1
  170. package/out/replicache/src/report-error.js +9 -6
  171. package/out/replicache/src/report-error.js.map +1 -1
  172. package/out/replicache/src/request-idle.js +13 -11
  173. package/out/replicache/src/request-idle.js.map +1 -1
  174. package/out/replicache/src/scan-iterator.d.ts.map +1 -1
  175. package/out/replicache/src/scan-iterator.js +108 -135
  176. package/out/replicache/src/scan-iterator.js.map +1 -1
  177. package/out/replicache/src/scan-options.js +33 -39
  178. package/out/replicache/src/scan-options.js.map +1 -1
  179. package/out/replicache/src/set-interval-with-signal.js +11 -10
  180. package/out/replicache/src/set-interval-with-signal.js.map +1 -1
  181. package/out/replicache/src/sqlite.js +2 -0
  182. package/out/replicache/src/subscriptions.js +222 -338
  183. package/out/replicache/src/subscriptions.js.map +1 -1
  184. package/out/replicache/src/sync/diff.js +52 -65
  185. package/out/replicache/src/sync/diff.js.map +1 -1
  186. package/out/replicache/src/sync/ids.js +8 -9
  187. package/out/replicache/src/sync/ids.js.map +1 -1
  188. package/out/replicache/src/sync/patch.js +34 -45
  189. package/out/replicache/src/sync/patch.js.map +1 -1
  190. package/out/replicache/src/sync/pull-error.js +15 -15
  191. package/out/replicache/src/sync/pull-error.js.map +1 -1
  192. package/out/replicache/src/sync/pull.js +145 -283
  193. package/out/replicache/src/sync/pull.js.map +1 -1
  194. package/out/replicache/src/sync/push.js +64 -79
  195. package/out/replicache/src/sync/push.js.map +1 -1
  196. package/out/replicache/src/sync/request-id.js +23 -15
  197. package/out/replicache/src/sync/request-id.js.map +1 -1
  198. package/out/replicache/src/sync/sync-head-name.js +6 -5
  199. package/out/replicache/src/sync/sync-head-name.js.map +1 -1
  200. package/out/replicache/src/to-error.js +7 -8
  201. package/out/replicache/src/to-error.js.map +1 -1
  202. package/out/replicache/src/transaction-closed-error.js +15 -15
  203. package/out/replicache/src/transaction-closed-error.js.map +1 -1
  204. package/out/replicache/src/transactions.js +120 -140
  205. package/out/replicache/src/transactions.js.map +1 -1
  206. package/out/replicache/src/version.js +9 -5
  207. package/out/replicache/src/version.js.map +1 -1
  208. package/out/replicache/src/with-transactions.js +23 -20
  209. package/out/replicache/src/with-transactions.js.map +1 -1
  210. package/out/shared/src/abort-error.js +7 -6
  211. package/out/shared/src/abort-error.js.map +1 -1
  212. package/out/shared/src/arrays.js +35 -42
  213. package/out/shared/src/arrays.js.map +1 -1
  214. package/out/shared/src/asserts.js +21 -45
  215. package/out/shared/src/asserts.js.map +1 -1
  216. package/out/shared/src/bigint-json.js +42 -38
  217. package/out/shared/src/bigint-json.js.map +1 -1
  218. package/out/shared/src/binary-search.js +27 -18
  219. package/out/shared/src/binary-search.js.map +1 -1
  220. package/out/shared/src/broadcast-channel.js +20 -23
  221. package/out/shared/src/broadcast-channel.js.map +1 -1
  222. package/out/shared/src/browser-env.js +11 -17
  223. package/out/shared/src/browser-env.js.map +1 -1
  224. package/out/shared/src/btree-set.js +419 -481
  225. package/out/shared/src/btree-set.js.map +1 -1
  226. package/out/shared/src/cache.js +43 -36
  227. package/out/shared/src/cache.js.map +1 -1
  228. package/out/shared/src/centroid.js +24 -26
  229. package/out/shared/src/centroid.js.map +1 -1
  230. package/out/shared/src/config.js +6 -6
  231. package/out/shared/src/config.js.map +1 -1
  232. package/out/shared/src/custom-key-map.js +54 -58
  233. package/out/shared/src/custom-key-map.js.map +1 -1
  234. package/out/shared/src/custom-key-set.js +53 -51
  235. package/out/shared/src/custom-key-set.js.map +1 -1
  236. package/out/shared/src/deep-clone.js +30 -41
  237. package/out/shared/src/deep-clone.js.map +1 -1
  238. package/out/shared/src/deep-merge.js +25 -24
  239. package/out/shared/src/deep-merge.js.map +1 -1
  240. package/out/shared/src/document-visible.js +63 -70
  241. package/out/shared/src/document-visible.js.map +1 -1
  242. package/out/shared/src/dotenv.js +7 -3
  243. package/out/shared/src/dotenv.js.map +1 -1
  244. package/out/shared/src/error.js +43 -64
  245. package/out/shared/src/error.js.map +1 -1
  246. package/out/shared/src/has-own.js +6 -5
  247. package/out/shared/src/has-own.js.map +1 -1
  248. package/out/shared/src/hash.js +15 -14
  249. package/out/shared/src/hash.js.map +1 -1
  250. package/out/shared/src/iterables.js +34 -47
  251. package/out/shared/src/iterables.js.map +1 -1
  252. package/out/shared/src/json-schema.js +25 -30
  253. package/out/shared/src/json-schema.js.map +1 -1
  254. package/out/shared/src/json.js +90 -129
  255. package/out/shared/src/json.js.map +1 -1
  256. package/out/shared/src/logging-test-utils.js +9 -11
  257. package/out/shared/src/logging-test-utils.js.map +1 -1
  258. package/out/shared/src/logging.js +75 -95
  259. package/out/shared/src/logging.js.map +1 -1
  260. package/out/shared/src/must.js +7 -8
  261. package/out/shared/src/must.js.map +1 -1
  262. package/out/shared/src/navigator.js +6 -5
  263. package/out/shared/src/navigator.js.map +1 -1
  264. package/out/shared/src/object-traversal.js +23 -23
  265. package/out/shared/src/object-traversal.js.map +1 -1
  266. package/out/shared/src/objects.js +15 -18
  267. package/out/shared/src/objects.js.map +1 -1
  268. package/out/shared/src/options.js +225 -302
  269. package/out/shared/src/options.js.map +1 -1
  270. package/out/shared/src/parse-big-int.js +12 -11
  271. package/out/shared/src/parse-big-int.js.map +1 -1
  272. package/out/shared/src/promise-race.js +21 -17
  273. package/out/shared/src/promise-race.js.map +1 -1
  274. package/out/shared/src/queue.js +124 -124
  275. package/out/shared/src/queue.js.map +1 -1
  276. package/out/shared/src/rand.js +13 -7
  277. package/out/shared/src/rand.js.map +1 -1
  278. package/out/shared/src/random-uint64.js +8 -7
  279. package/out/shared/src/random-uint64.js.map +1 -1
  280. package/out/shared/src/random-values.js +8 -11
  281. package/out/shared/src/random-values.js.map +1 -1
  282. package/out/shared/src/record-proxy.js +68 -57
  283. package/out/shared/src/record-proxy.js.map +1 -1
  284. package/out/shared/src/resolved-promises.js +9 -11
  285. package/out/shared/src/resolved-promises.js.map +1 -1
  286. package/out/shared/src/sentinels.js +9 -12
  287. package/out/shared/src/sentinels.js.map +1 -1
  288. package/out/shared/src/set-utils.js +41 -63
  289. package/out/shared/src/set-utils.js.map +1 -1
  290. package/out/shared/src/size-of-value.js +55 -51
  291. package/out/shared/src/size-of-value.js.map +1 -1
  292. package/out/shared/src/sleep.js +50 -45
  293. package/out/shared/src/sleep.js.map +1 -1
  294. package/out/shared/src/string-compare.js +8 -11
  295. package/out/shared/src/string-compare.js.map +1 -1
  296. package/out/shared/src/subscribable.js +34 -33
  297. package/out/shared/src/subscribable.js.map +1 -1
  298. package/out/shared/src/tdigest-schema.js +11 -7
  299. package/out/shared/src/tdigest-schema.js.map +1 -1
  300. package/out/shared/src/tdigest.js +197 -270
  301. package/out/shared/src/tdigest.js.map +1 -1
  302. package/out/shared/src/valita.js +145 -174
  303. package/out/shared/src/valita.js.map +1 -1
  304. package/out/z2s/src/compiler.d.ts.map +1 -1
  305. package/out/z2s/src/compiler.js +238 -468
  306. package/out/z2s/src/compiler.js.map +1 -1
  307. package/out/z2s/src/sql.d.ts +0 -1
  308. package/out/z2s/src/sql.d.ts.map +1 -1
  309. package/out/z2s/src/sql.js +149 -194
  310. package/out/z2s/src/sql.js.map +1 -1
  311. package/out/zero/package.js +194 -0
  312. package/out/zero/package.js.map +1 -0
  313. package/out/zero/src/adapters/drizzle.js +1 -6
  314. package/out/zero/src/adapters/pg.js +1 -6
  315. package/out/zero/src/adapters/postgresjs.js +1 -6
  316. package/out/zero/src/adapters/prisma.js +1 -5
  317. package/out/zero/src/analyze-query.js +1 -1
  318. package/out/zero/src/ast-to-zql.js +1 -1
  319. package/out/zero/src/bindings.js +6 -21
  320. package/out/zero/src/build-schema.js +5 -1
  321. package/out/zero/src/build-schema.js.map +1 -1
  322. package/out/zero/src/change-protocol/v0.js +3 -5
  323. package/out/zero/src/cli.js +2 -2
  324. package/out/zero/src/deploy-permissions.js +1 -1
  325. package/out/zero/src/expo-sqlite.js +2 -4
  326. package/out/zero/src/op-sqlite.js +2 -4
  327. package/out/zero/src/pg.js +2 -20
  328. package/out/zero/src/react-native.js +16 -12
  329. package/out/zero/src/react-native.js.map +1 -1
  330. package/out/zero/src/react.js +3 -12
  331. package/out/zero/src/server/runner/main.js +2 -0
  332. package/out/zero/src/server.js +2 -17
  333. package/out/zero/src/solid.js +3 -12
  334. package/out/zero/src/sqlite.js +2 -6
  335. package/out/zero/src/transform-query.js +1 -1
  336. package/out/zero/src/zero-cache-dev.js +124 -151
  337. package/out/zero/src/zero-cache-dev.js.map +1 -1
  338. package/out/zero/src/zero-out.js +9 -6
  339. package/out/zero/src/zero-out.js.map +1 -1
  340. package/out/zero/src/zero.js +6 -55
  341. package/out/zero/src/zqlite.js +2 -7
  342. package/out/zero-cache/src/auth/auth.js +138 -172
  343. package/out/zero-cache/src/auth/auth.js.map +1 -1
  344. package/out/zero-cache/src/auth/jwt.js +25 -33
  345. package/out/zero-cache/src/auth/jwt.js.map +1 -1
  346. package/out/zero-cache/src/auth/load-permissions.js +54 -62
  347. package/out/zero-cache/src/auth/load-permissions.js.map +1 -1
  348. package/out/zero-cache/src/auth/read-authorizer.js +70 -80
  349. package/out/zero-cache/src/auth/read-authorizer.js.map +1 -1
  350. package/out/zero-cache/src/auth/write-authorizer.js +284 -432
  351. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  352. package/out/zero-cache/src/config/network.js +31 -45
  353. package/out/zero-cache/src/config/network.js.map +1 -1
  354. package/out/zero-cache/src/config/normalize.js +81 -83
  355. package/out/zero-cache/src/config/normalize.js.map +1 -1
  356. package/out/zero-cache/src/config/server-context.js +32 -29
  357. package/out/zero-cache/src/config/server-context.js.map +1 -1
  358. package/out/zero-cache/src/config/zero-config.js +753 -833
  359. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  360. package/out/zero-cache/src/custom/fetch.js +183 -230
  361. package/out/zero-cache/src/custom/fetch.js.map +1 -1
  362. package/out/zero-cache/src/custom-queries/transform-query.js +93 -99
  363. package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -1
  364. package/out/zero-cache/src/db/create.js +27 -29
  365. package/out/zero-cache/src/db/create.js.map +1 -1
  366. package/out/zero-cache/src/db/delete-lite-db.js +11 -7
  367. package/out/zero-cache/src/db/delete-lite-db.js.map +1 -1
  368. package/out/zero-cache/src/db/lite-tables.js +118 -158
  369. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  370. package/out/zero-cache/src/db/migration-lite.js +110 -178
  371. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  372. package/out/zero-cache/src/db/migration.js +82 -151
  373. package/out/zero-cache/src/db/migration.js.map +1 -1
  374. package/out/zero-cache/src/db/mode-enum.js +8 -9
  375. package/out/zero-cache/src/db/mode-enum.js.map +1 -1
  376. package/out/zero-cache/src/db/pg-copy.js +56 -54
  377. package/out/zero-cache/src/db/pg-copy.js.map +1 -1
  378. package/out/zero-cache/src/db/pg-to-lite.js +74 -110
  379. package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
  380. package/out/zero-cache/src/db/pg-type-parser.js +19 -36
  381. package/out/zero-cache/src/db/pg-type-parser.js.map +1 -1
  382. package/out/zero-cache/src/db/run-transaction.js +19 -20
  383. package/out/zero-cache/src/db/run-transaction.js.map +1 -1
  384. package/out/zero-cache/src/db/specs.js +42 -78
  385. package/out/zero-cache/src/db/specs.js.map +1 -1
  386. package/out/zero-cache/src/db/statements.js +52 -59
  387. package/out/zero-cache/src/db/statements.js.map +1 -1
  388. package/out/zero-cache/src/db/transaction-pool.js +376 -400
  389. package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
  390. package/out/zero-cache/src/db/warmup.js +13 -24
  391. package/out/zero-cache/src/db/warmup.js.map +1 -1
  392. package/out/zero-cache/src/observability/events.js +89 -99
  393. package/out/zero-cache/src/observability/events.js.map +1 -1
  394. package/out/zero-cache/src/observability/metrics.js +30 -54
  395. package/out/zero-cache/src/observability/metrics.js.map +1 -1
  396. package/out/zero-cache/src/scripts/decommission.js +42 -47
  397. package/out/zero-cache/src/scripts/decommission.js.map +1 -1
  398. package/out/zero-cache/src/scripts/deploy-permissions.js +106 -144
  399. package/out/zero-cache/src/scripts/deploy-permissions.js.map +1 -1
  400. package/out/zero-cache/src/scripts/permissions.js +86 -107
  401. package/out/zero-cache/src/scripts/permissions.js.map +1 -1
  402. package/out/zero-cache/src/server/anonymous-otel-start.js +306 -440
  403. package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
  404. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  405. package/out/zero-cache/src/server/change-streamer.js +57 -130
  406. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  407. package/out/zero-cache/src/server/inspector-delegate.js +89 -100
  408. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
  409. package/out/zero-cache/src/server/logging.js +18 -26
  410. package/out/zero-cache/src/server/logging.js.map +1 -1
  411. package/out/zero-cache/src/server/main.js +85 -142
  412. package/out/zero-cache/src/server/main.js.map +1 -1
  413. package/out/zero-cache/src/server/mutator.js +16 -13
  414. package/out/zero-cache/src/server/mutator.js.map +1 -1
  415. package/out/zero-cache/src/server/otel-diag-logger.js +42 -49
  416. package/out/zero-cache/src/server/otel-diag-logger.js.map +1 -1
  417. package/out/zero-cache/src/server/otel-log-sink.js +34 -44
  418. package/out/zero-cache/src/server/otel-log-sink.js.map +1 -1
  419. package/out/zero-cache/src/server/otel-start.js +43 -51
  420. package/out/zero-cache/src/server/otel-start.js.map +1 -1
  421. package/out/zero-cache/src/server/priority-op.js +27 -25
  422. package/out/zero-cache/src/server/priority-op.js.map +1 -1
  423. package/out/zero-cache/src/server/reaper.js +32 -43
  424. package/out/zero-cache/src/server/reaper.js.map +1 -1
  425. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  426. package/out/zero-cache/src/server/replicator.js +41 -57
  427. package/out/zero-cache/src/server/replicator.js.map +1 -1
  428. package/out/zero-cache/src/server/runner/main.js +7 -8
  429. package/out/zero-cache/src/server/runner/main.js.map +1 -1
  430. package/out/zero-cache/src/server/runner/run-worker.js +56 -52
  431. package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
  432. package/out/zero-cache/src/server/runner/runtime.js +26 -32
  433. package/out/zero-cache/src/server/runner/runtime.js.map +1 -1
  434. package/out/zero-cache/src/server/runner/zero-dispatcher.js +22 -27
  435. package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
  436. package/out/zero-cache/src/server/syncer.js +79 -148
  437. package/out/zero-cache/src/server/syncer.js.map +1 -1
  438. package/out/zero-cache/src/server/worker-dispatcher.js +84 -113
  439. package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -1
  440. package/out/zero-cache/src/server/worker-urls.d.ts +2 -1
  441. package/out/zero-cache/src/server/worker-urls.d.ts.map +1 -1
  442. package/out/zero-cache/src/server/worker-urls.js +14 -18
  443. package/out/zero-cache/src/server/worker-urls.js.map +1 -1
  444. package/out/zero-cache/src/server/write-worker.js +2 -0
  445. package/out/zero-cache/src/services/analyze.js +61 -130
  446. package/out/zero-cache/src/services/analyze.js.map +1 -1
  447. package/out/zero-cache/src/services/change-source/common/backfill-manager.js +420 -419
  448. package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
  449. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js +111 -114
  450. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -1
  451. package/out/zero-cache/src/services/change-source/common/replica-schema.js +80 -148
  452. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  453. package/out/zero-cache/src/services/change-source/custom/change-source.js +154 -216
  454. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  455. package/out/zero-cache/src/services/change-source/pg/backfill-metadata.js +11 -14
  456. package/out/zero-cache/src/services/change-source/pg/backfill-metadata.js.map +1 -1
  457. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +168 -212
  458. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
  459. package/out/zero-cache/src/services/change-source/pg/change-source.js +672 -892
  460. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  461. package/out/zero-cache/src/services/change-source/pg/decommission.js +19 -23
  462. package/out/zero-cache/src/services/change-source/pg/decommission.js.map +1 -1
  463. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +258 -411
  464. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  465. package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js +59 -65
  466. package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js.map +1 -1
  467. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js +218 -247
  468. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js.map +1 -1
  469. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +100 -142
  470. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  471. package/out/zero-cache/src/services/change-source/pg/lsn.js +17 -19
  472. package/out/zero-cache/src/services/change-source/pg/lsn.js.map +1 -1
  473. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +88 -98
  474. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
  475. package/out/zero-cache/src/services/change-source/pg/schema/init.js +96 -177
  476. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  477. package/out/zero-cache/src/services/change-source/pg/schema/published.js +69 -107
  478. package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
  479. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +151 -212
  480. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  481. package/out/zero-cache/src/services/change-source/pg/schema/validation.js +22 -53
  482. package/out/zero-cache/src/services/change-source/pg/schema/validation.js.map +1 -1
  483. package/out/zero-cache/src/services/change-source/protocol/current/control.js +24 -12
  484. package/out/zero-cache/src/services/change-source/protocol/current/control.js.map +1 -1
  485. package/out/zero-cache/src/services/change-source/protocol/current/data.js +180 -290
  486. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  487. package/out/zero-cache/src/services/change-source/protocol/current/downstream.js +21 -33
  488. package/out/zero-cache/src/services/change-source/protocol/current/downstream.js.map +1 -1
  489. package/out/zero-cache/src/services/change-source/protocol/current/json.js +7 -18
  490. package/out/zero-cache/src/services/change-source/protocol/current/json.js.map +1 -1
  491. package/out/zero-cache/src/services/change-source/protocol/current/path.js +24 -5
  492. package/out/zero-cache/src/services/change-source/protocol/current/path.js.map +1 -1
  493. package/out/zero-cache/src/services/change-source/protocol/current/status.js +25 -19
  494. package/out/zero-cache/src/services/change-source/protocol/current/status.js.map +1 -1
  495. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js +24 -16
  496. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -1
  497. package/out/zero-cache/src/services/change-source/protocol/current.js +51 -46
  498. package/out/zero-cache/src/services/change-source/protocol/current.js.map +1 -1
  499. package/out/zero-cache/src/services/change-source/protocol/mod.js +2 -0
  500. package/out/zero-cache/src/services/change-streamer/backup-monitor.js +165 -171
  501. package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
  502. package/out/zero-cache/src/services/change-streamer/broadcast.js +163 -169
  503. package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
  504. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +154 -221
  505. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  506. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  507. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +340 -299
  508. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  509. package/out/zero-cache/src/services/change-streamer/change-streamer.js +17 -24
  510. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  511. package/out/zero-cache/src/services/change-streamer/forwarder.js +84 -103
  512. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
  513. package/out/zero-cache/src/services/change-streamer/replica-monitor.js +49 -43
  514. package/out/zero-cache/src/services/change-streamer/replica-monitor.js.map +1 -1
  515. package/out/zero-cache/src/services/change-streamer/schema/init.js +61 -89
  516. package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
  517. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +20 -1
  518. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
  519. package/out/zero-cache/src/services/change-streamer/schema/tables.js +131 -109
  520. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  521. package/out/zero-cache/src/services/change-streamer/snapshot.js +26 -28
  522. package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -1
  523. package/out/zero-cache/src/services/change-streamer/storer.js +434 -513
  524. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  525. package/out/zero-cache/src/services/change-streamer/subscriber.js +142 -155
  526. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  527. package/out/zero-cache/src/services/heapz.js +18 -20
  528. package/out/zero-cache/src/services/heapz.js.map +1 -1
  529. package/out/zero-cache/src/services/http-service.js +59 -57
  530. package/out/zero-cache/src/services/http-service.js.map +1 -1
  531. package/out/zero-cache/src/services/life-cycle.js +182 -214
  532. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  533. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js +102 -81
  534. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js.map +1 -1
  535. package/out/zero-cache/src/services/litestream/commands.js +144 -205
  536. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  537. package/out/zero-cache/src/services/mutagen/error.js +10 -14
  538. package/out/zero-cache/src/services/mutagen/error.js.map +1 -1
  539. package/out/zero-cache/src/services/mutagen/mutagen.js +166 -264
  540. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  541. package/out/zero-cache/src/services/mutagen/pusher.js +372 -487
  542. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  543. package/out/zero-cache/src/services/replicator/change-processor.js +483 -592
  544. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  545. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +4 -2
  546. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  547. package/out/zero-cache/src/services/replicator/incremental-sync.js +118 -143
  548. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  549. package/out/zero-cache/src/services/replicator/notifier.js +52 -28
  550. package/out/zero-cache/src/services/replicator/notifier.js.map +1 -1
  551. package/out/zero-cache/src/services/replicator/replication-status.js +105 -128
  552. package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
  553. package/out/zero-cache/src/services/replicator/replicator.d.ts +2 -1
  554. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
  555. package/out/zero-cache/src/services/replicator/replicator.js +32 -34
  556. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  557. package/out/zero-cache/src/services/replicator/schema/change-log.js +101 -133
  558. package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -1
  559. package/out/zero-cache/src/services/replicator/schema/column-metadata.js +145 -174
  560. package/out/zero-cache/src/services/replicator/schema/column-metadata.js.map +1 -1
  561. package/out/zero-cache/src/services/replicator/schema/constants.js +11 -5
  562. package/out/zero-cache/src/services/replicator/schema/constants.js.map +1 -1
  563. package/out/zero-cache/src/services/replicator/schema/replication-state.js +56 -107
  564. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
  565. package/out/zero-cache/src/services/replicator/schema/table-metadata.js +81 -66
  566. package/out/zero-cache/src/services/replicator/schema/table-metadata.js.map +1 -1
  567. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts +69 -0
  568. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts.map +1 -0
  569. package/out/zero-cache/src/services/replicator/write-worker-client.js +96 -0
  570. package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -0
  571. package/out/zero-cache/src/services/replicator/write-worker.js +68 -0
  572. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -0
  573. package/out/zero-cache/src/services/run-ast.js +79 -120
  574. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  575. package/out/zero-cache/src/services/runner.js +39 -41
  576. package/out/zero-cache/src/services/runner.js.map +1 -1
  577. package/out/zero-cache/src/services/running-state.js +129 -134
  578. package/out/zero-cache/src/services/running-state.js.map +1 -1
  579. package/out/zero-cache/src/services/statz.js +139 -200
  580. package/out/zero-cache/src/services/statz.js.map +1 -1
  581. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js +46 -49
  582. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js.map +1 -1
  583. package/out/zero-cache/src/services/view-syncer/client-handler.js +257 -299
  584. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  585. package/out/zero-cache/src/services/view-syncer/client-schema.js +52 -82
  586. package/out/zero-cache/src/services/view-syncer/client-schema.js.map +1 -1
  587. package/out/zero-cache/src/services/view-syncer/cvr-purger.js +85 -107
  588. package/out/zero-cache/src/services/view-syncer/cvr-purger.js.map +1 -1
  589. package/out/zero-cache/src/services/view-syncer/cvr-store.js +604 -757
  590. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  591. package/out/zero-cache/src/services/view-syncer/cvr.js +631 -739
  592. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  593. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +60 -40
  594. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
  595. package/out/zero-cache/src/services/view-syncer/inspect-handler.js +95 -178
  596. package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
  597. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  598. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +571 -722
  599. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  600. package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts.map +1 -1
  601. package/out/zero-cache/src/services/view-syncer/row-record-cache.js +246 -257
  602. package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
  603. package/out/zero-cache/src/services/view-syncer/schema/cvr.js +59 -45
  604. package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
  605. package/out/zero-cache/src/services/view-syncer/schema/init.js +121 -189
  606. package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -1
  607. package/out/zero-cache/src/services/view-syncer/schema/types.js +138 -263
  608. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  609. package/out/zero-cache/src/services/view-syncer/snapshotter.js +322 -335
  610. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  611. package/out/zero-cache/src/services/view-syncer/tracer.js +7 -6
  612. package/out/zero-cache/src/services/view-syncer/tracer.js.map +1 -1
  613. package/out/zero-cache/src/services/view-syncer/ttl-clock.js +9 -11
  614. package/out/zero-cache/src/services/view-syncer/ttl-clock.js.map +1 -1
  615. package/out/zero-cache/src/services/view-syncer/view-syncer.js +1067 -1603
  616. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  617. package/out/zero-cache/src/types/error-with-level.js +19 -25
  618. package/out/zero-cache/src/types/error-with-level.js.map +1 -1
  619. package/out/zero-cache/src/types/http.js +17 -26
  620. package/out/zero-cache/src/types/http.js.map +1 -1
  621. package/out/zero-cache/src/types/lexi-version.js +28 -42
  622. package/out/zero-cache/src/types/lexi-version.js.map +1 -1
  623. package/out/zero-cache/src/types/lite.js +101 -121
  624. package/out/zero-cache/src/types/lite.js.map +1 -1
  625. package/out/zero-cache/src/types/names.js +6 -5
  626. package/out/zero-cache/src/types/names.js.map +1 -1
  627. package/out/zero-cache/src/types/pg-data-type.d.ts +1 -0
  628. package/out/zero-cache/src/types/pg-data-type.d.ts.map +1 -1
  629. package/out/zero-cache/src/types/pg-data-type.js +58 -73
  630. package/out/zero-cache/src/types/pg-data-type.js.map +1 -1
  631. package/out/zero-cache/src/types/pg-types.js +12 -19
  632. package/out/zero-cache/src/types/pg-types.js.map +1 -1
  633. package/out/zero-cache/src/types/pg.js +144 -218
  634. package/out/zero-cache/src/types/pg.js.map +1 -1
  635. package/out/zero-cache/src/types/processes.js +95 -90
  636. package/out/zero-cache/src/types/processes.js.map +1 -1
  637. package/out/zero-cache/src/types/profiler.js +32 -27
  638. package/out/zero-cache/src/types/profiler.js.map +1 -1
  639. package/out/zero-cache/src/types/row-key.js +42 -30
  640. package/out/zero-cache/src/types/row-key.js.map +1 -1
  641. package/out/zero-cache/src/types/shards.js +36 -45
  642. package/out/zero-cache/src/types/shards.js.map +1 -1
  643. package/out/zero-cache/src/types/sql.js +20 -9
  644. package/out/zero-cache/src/types/sql.js.map +1 -1
  645. package/out/zero-cache/src/types/state-version.js +17 -23
  646. package/out/zero-cache/src/types/state-version.js.map +1 -1
  647. package/out/zero-cache/src/types/streams.js +234 -270
  648. package/out/zero-cache/src/types/streams.js.map +1 -1
  649. package/out/zero-cache/src/types/strings.js +10 -13
  650. package/out/zero-cache/src/types/strings.js.map +1 -1
  651. package/out/zero-cache/src/types/subscription.js +266 -226
  652. package/out/zero-cache/src/types/subscription.js.map +1 -1
  653. package/out/zero-cache/src/types/url-params.js +30 -39
  654. package/out/zero-cache/src/types/url-params.js.map +1 -1
  655. package/out/zero-cache/src/types/websocket-handoff.js +62 -75
  656. package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
  657. package/out/zero-cache/src/types/ws.js +43 -53
  658. package/out/zero-cache/src/types/ws.js.map +1 -1
  659. package/out/zero-cache/src/workers/connect-params.js +42 -43
  660. package/out/zero-cache/src/workers/connect-params.js.map +1 -1
  661. package/out/zero-cache/src/workers/connection.js +213 -282
  662. package/out/zero-cache/src/workers/connection.js.map +1 -1
  663. package/out/zero-cache/src/workers/mutator.js +22 -21
  664. package/out/zero-cache/src/workers/mutator.js.map +1 -1
  665. package/out/zero-cache/src/workers/replicator.d.ts +7 -0
  666. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
  667. package/out/zero-cache/src/workers/replicator.js +92 -97
  668. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  669. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +121 -203
  670. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  671. package/out/zero-cache/src/workers/syncer.js +147 -201
  672. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  673. package/out/zero-client/src/client/active-clients-manager.js +178 -187
  674. package/out/zero-client/src/client/active-clients-manager.js.map +1 -1
  675. package/out/zero-client/src/client/bindings.js +11 -0
  676. package/out/zero-client/src/client/client-error-kind-enum.js +18 -29
  677. package/out/zero-client/src/client/client-error-kind-enum.js.map +1 -1
  678. package/out/zero-client/src/client/connection-manager.js +291 -346
  679. package/out/zero-client/src/client/connection-manager.js.map +1 -1
  680. package/out/zero-client/src/client/connection-status-enum.js +20 -15
  681. package/out/zero-client/src/client/connection-status-enum.js.map +1 -1
  682. package/out/zero-client/src/client/connection.js +92 -110
  683. package/out/zero-client/src/client/connection.js.map +1 -1
  684. package/out/zero-client/src/client/context.js +84 -100
  685. package/out/zero-client/src/client/context.js.map +1 -1
  686. package/out/zero-client/src/client/crud-impl.js +56 -88
  687. package/out/zero-client/src/client/crud-impl.js.map +1 -1
  688. package/out/zero-client/src/client/crud.js +127 -129
  689. package/out/zero-client/src/client/crud.js.map +1 -1
  690. package/out/zero-client/src/client/custom.d.ts.map +1 -1
  691. package/out/zero-client/src/client/custom.js +50 -74
  692. package/out/zero-client/src/client/custom.js.map +1 -1
  693. package/out/zero-client/src/client/delete-clients-manager.js +72 -93
  694. package/out/zero-client/src/client/delete-clients-manager.js.map +1 -1
  695. package/out/zero-client/src/client/enable-analytics.js +8 -16
  696. package/out/zero-client/src/client/enable-analytics.js.map +1 -1
  697. package/out/zero-client/src/client/error.js +118 -133
  698. package/out/zero-client/src/client/error.js.map +1 -1
  699. package/out/zero-client/src/client/http-string.js +7 -7
  700. package/out/zero-client/src/client/http-string.js.map +1 -1
  701. package/out/zero-client/src/client/inspector/client-group.js +21 -26
  702. package/out/zero-client/src/client/inspector/client-group.js.map +1 -1
  703. package/out/zero-client/src/client/inspector/client.js +23 -26
  704. package/out/zero-client/src/client/inspector/client.js.map +1 -1
  705. package/out/zero-client/src/client/inspector/html-dialog-prompt.js +72 -73
  706. package/out/zero-client/src/client/inspector/html-dialog-prompt.js.map +1 -1
  707. package/out/zero-client/src/client/inspector/inspector.js +46 -51
  708. package/out/zero-client/src/client/inspector/inspector.js.map +1 -1
  709. package/out/zero-client/src/client/inspector/lazy-inspector.js +132 -192
  710. package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -1
  711. package/out/zero-client/src/client/inspector/query.js +72 -77
  712. package/out/zero-client/src/client/inspector/query.js.map +1 -1
  713. package/out/zero-client/src/client/ivm-branch.js +118 -145
  714. package/out/zero-client/src/client/ivm-branch.js.map +1 -1
  715. package/out/zero-client/src/client/keys.js +15 -31
  716. package/out/zero-client/src/client/keys.js.map +1 -1
  717. package/out/zero-client/src/client/log-options.js +43 -57
  718. package/out/zero-client/src/client/log-options.js.map +1 -1
  719. package/out/zero-client/src/client/make-mutate-property.js +46 -29
  720. package/out/zero-client/src/client/make-mutate-property.js.map +1 -1
  721. package/out/zero-client/src/client/make-replicache-mutators.js +80 -96
  722. package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
  723. package/out/zero-client/src/client/metric-name-enum.js +11 -15
  724. package/out/zero-client/src/client/metric-name-enum.js.map +1 -1
  725. package/out/zero-client/src/client/metrics.js +210 -237
  726. package/out/zero-client/src/client/metrics.js.map +1 -1
  727. package/out/zero-client/src/client/mutation-tracker.js +264 -354
  728. package/out/zero-client/src/client/mutation-tracker.js.map +1 -1
  729. package/out/zero-client/src/client/mutator-proxy.js +122 -151
  730. package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
  731. package/out/zero-client/src/client/options.js +7 -10
  732. package/out/zero-client/src/client/options.js.map +1 -1
  733. package/out/zero-client/src/client/query-manager.js +305 -373
  734. package/out/zero-client/src/client/query-manager.js.map +1 -1
  735. package/out/zero-client/src/client/reload-error-handler.js +80 -101
  736. package/out/zero-client/src/client/reload-error-handler.js.map +1 -1
  737. package/out/zero-client/src/client/server-option.js +30 -59
  738. package/out/zero-client/src/client/server-option.js.map +1 -1
  739. package/out/zero-client/src/client/update-needed-reason-type-enum.js +27 -9
  740. package/out/zero-client/src/client/update-needed-reason-type-enum.js.map +1 -1
  741. package/out/zero-client/src/client/version.js +9 -5
  742. package/out/zero-client/src/client/version.js.map +1 -1
  743. package/out/zero-client/src/client/zero-poke-handler.d.ts +1 -1
  744. package/out/zero-client/src/client/zero-poke-handler.d.ts.map +1 -1
  745. package/out/zero-client/src/client/zero-poke-handler.js +205 -293
  746. package/out/zero-client/src/client/zero-poke-handler.js.map +1 -1
  747. package/out/zero-client/src/client/zero-rep.js +61 -68
  748. package/out/zero-client/src/client/zero-rep.js.map +1 -1
  749. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  750. package/out/zero-client/src/client/zero.js +1367 -1834
  751. package/out/zero-client/src/client/zero.js.map +1 -1
  752. package/out/zero-client/src/mod.js +21 -0
  753. package/out/zero-client/src/util/nanoid.js +13 -18
  754. package/out/zero-client/src/util/nanoid.js.map +1 -1
  755. package/out/zero-client/src/util/socket.js +6 -5
  756. package/out/zero-client/src/util/socket.js.map +1 -1
  757. package/out/zero-pg/src/mod.js +10 -0
  758. package/out/zero-protocol/src/analyze-query-result.js +108 -148
  759. package/out/zero-protocol/src/analyze-query-result.js.map +1 -1
  760. package/out/zero-protocol/src/application-error.js +36 -34
  761. package/out/zero-protocol/src/application-error.js.map +1 -1
  762. package/out/zero-protocol/src/ast.js +236 -309
  763. package/out/zero-protocol/src/ast.js.map +1 -1
  764. package/out/zero-protocol/src/change-desired-queries.js +8 -13
  765. package/out/zero-protocol/src/change-desired-queries.js.map +1 -1
  766. package/out/zero-protocol/src/client-schema.js +21 -42
  767. package/out/zero-protocol/src/client-schema.js.map +1 -1
  768. package/out/zero-protocol/src/close-connection.js +20 -12
  769. package/out/zero-protocol/src/close-connection.js.map +1 -1
  770. package/out/zero-protocol/src/connect.js +37 -52
  771. package/out/zero-protocol/src/connect.js.map +1 -1
  772. package/out/zero-protocol/src/custom-queries.js +34 -65
  773. package/out/zero-protocol/src/custom-queries.js.map +1 -1
  774. package/out/zero-protocol/src/data.js +6 -9
  775. package/out/zero-protocol/src/data.js.map +1 -1
  776. package/out/zero-protocol/src/delete-clients.js +11 -17
  777. package/out/zero-protocol/src/delete-clients.js.map +1 -1
  778. package/out/zero-protocol/src/down.js +11 -23
  779. package/out/zero-protocol/src/down.js.map +1 -1
  780. package/out/zero-protocol/src/error-kind-enum.js +24 -41
  781. package/out/zero-protocol/src/error-kind-enum.js.map +1 -1
  782. package/out/zero-protocol/src/error-origin-enum.js +8 -9
  783. package/out/zero-protocol/src/error-origin-enum.js.map +1 -1
  784. package/out/zero-protocol/src/error-reason-enum.js +12 -17
  785. package/out/zero-protocol/src/error-reason-enum.js.map +1 -1
  786. package/out/zero-protocol/src/error.js +76 -152
  787. package/out/zero-protocol/src/error.js.map +1 -1
  788. package/out/zero-protocol/src/inspect-down.js +51 -74
  789. package/out/zero-protocol/src/inspect-down.js.map +1 -1
  790. package/out/zero-protocol/src/inspect-up.js +28 -46
  791. package/out/zero-protocol/src/inspect-up.js.map +1 -1
  792. package/out/zero-protocol/src/mutation-id.js +9 -9
  793. package/out/zero-protocol/src/mutation-id.js.map +1 -1
  794. package/out/zero-protocol/src/mutation-type-enum.js +7 -7
  795. package/out/zero-protocol/src/mutation-type-enum.js.map +1 -1
  796. package/out/zero-protocol/src/mutations-patch.js +21 -16
  797. package/out/zero-protocol/src/mutations-patch.js.map +1 -1
  798. package/out/zero-protocol/src/ping.js +8 -9
  799. package/out/zero-protocol/src/ping.js.map +1 -1
  800. package/out/zero-protocol/src/poke.js +53 -59
  801. package/out/zero-protocol/src/poke.js.map +1 -1
  802. package/out/zero-protocol/src/pong.js +8 -9
  803. package/out/zero-protocol/src/pong.js.map +1 -1
  804. package/out/zero-protocol/src/primary-key.js +9 -19
  805. package/out/zero-protocol/src/primary-key.js.map +1 -1
  806. package/out/zero-protocol/src/protocol-version.js +5 -11
  807. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  808. package/out/zero-protocol/src/pull.js +16 -28
  809. package/out/zero-protocol/src/pull.js.map +1 -1
  810. package/out/zero-protocol/src/push.js +162 -209
  811. package/out/zero-protocol/src/push.js.map +1 -1
  812. package/out/zero-protocol/src/queries-patch.js +22 -30
  813. package/out/zero-protocol/src/queries-patch.js.map +1 -1
  814. package/out/zero-protocol/src/query-hash.js +14 -17
  815. package/out/zero-protocol/src/query-hash.js.map +1 -1
  816. package/out/zero-protocol/src/row-patch.js +23 -30
  817. package/out/zero-protocol/src/row-patch.js.map +1 -1
  818. package/out/zero-protocol/src/up.js +11 -22
  819. package/out/zero-protocol/src/up.js.map +1 -1
  820. package/out/zero-protocol/src/update-auth.js +8 -13
  821. package/out/zero-protocol/src/update-auth.js.map +1 -1
  822. package/out/zero-protocol/src/version.js +8 -9
  823. package/out/zero-protocol/src/version.js.map +1 -1
  824. package/out/zero-react/src/bindings.js +12 -0
  825. package/out/zero-react/src/mod.js +5 -0
  826. package/out/zero-react/src/use-connection-state.js +14 -11
  827. package/out/zero-react/src/use-connection-state.js.map +1 -1
  828. package/out/zero-react/src/use-query.js +283 -281
  829. package/out/zero-react/src/use-query.js.map +1 -1
  830. package/out/zero-react/src/use-zero-online.js +17 -11
  831. package/out/zero-react/src/use-zero-online.js.map +1 -1
  832. package/out/zero-react/src/zero-provider.js +53 -69
  833. package/out/zero-react/src/zero-provider.js.map +1 -1
  834. package/out/zero-react/src/zero.js +22 -0
  835. package/out/zero-schema/src/builder/relationship-builder.js +25 -21
  836. package/out/zero-schema/src/builder/relationship-builder.js.map +1 -1
  837. package/out/zero-schema/src/builder/schema-builder.js +51 -79
  838. package/out/zero-schema/src/builder/schema-builder.js.map +1 -1
  839. package/out/zero-schema/src/builder/table-builder.js +99 -116
  840. package/out/zero-schema/src/builder/table-builder.js.map +1 -1
  841. package/out/zero-schema/src/compiled-permissions.js +21 -25
  842. package/out/zero-schema/src/compiled-permissions.js.map +1 -1
  843. package/out/zero-schema/src/name-mapper.js +31 -47
  844. package/out/zero-schema/src/name-mapper.js.map +1 -1
  845. package/out/zero-schema/src/permissions.js +94 -181
  846. package/out/zero-schema/src/permissions.js.map +1 -1
  847. package/out/zero-schema/src/schema-config.js +26 -32
  848. package/out/zero-schema/src/schema-config.js.map +1 -1
  849. package/out/zero-server/src/adapters/drizzle.d.ts.map +1 -1
  850. package/out/zero-server/src/adapters/drizzle.js +79 -76
  851. package/out/zero-server/src/adapters/drizzle.js.map +1 -1
  852. package/out/zero-server/src/adapters/pg.d.ts.map +1 -1
  853. package/out/zero-server/src/adapters/pg.js +79 -55
  854. package/out/zero-server/src/adapters/pg.js.map +1 -1
  855. package/out/zero-server/src/adapters/postgresjs.d.ts.map +1 -1
  856. package/out/zero-server/src/adapters/postgresjs.js +66 -40
  857. package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
  858. package/out/zero-server/src/adapters/prisma.d.ts.map +1 -1
  859. package/out/zero-server/src/adapters/prisma.js +75 -55
  860. package/out/zero-server/src/adapters/prisma.js.map +1 -1
  861. package/out/zero-server/src/custom.d.ts.map +1 -1
  862. package/out/zero-server/src/custom.js +188 -265
  863. package/out/zero-server/src/custom.js.map +1 -1
  864. package/out/zero-server/src/logging.js +6 -5
  865. package/out/zero-server/src/logging.js.map +1 -1
  866. package/out/zero-server/src/mod.js +8 -0
  867. package/out/zero-server/src/pg-query-executor.js +14 -17
  868. package/out/zero-server/src/pg-query-executor.js.map +1 -1
  869. package/out/zero-server/src/process-mutations.js +293 -365
  870. package/out/zero-server/src/process-mutations.js.map +1 -1
  871. package/out/zero-server/src/push-processor.js +33 -49
  872. package/out/zero-server/src/push-processor.js.map +1 -1
  873. package/out/zero-server/src/queries/process-queries.js +106 -96
  874. package/out/zero-server/src/queries/process-queries.js.map +1 -1
  875. package/out/zero-server/src/schema.js +98 -144
  876. package/out/zero-server/src/schema.js.map +1 -1
  877. package/out/zero-server/src/zql-database.d.ts.map +1 -1
  878. package/out/zero-server/src/zql-database.js +54 -69
  879. package/out/zero-server/src/zql-database.js.map +1 -1
  880. package/out/zero-solid/src/bindings.js +12 -0
  881. package/out/zero-solid/src/mod.js +5 -0
  882. package/out/zero-solid/src/solid-view.js +135 -227
  883. package/out/zero-solid/src/solid-view.js.map +1 -1
  884. package/out/zero-solid/src/use-connection-state.js +18 -14
  885. package/out/zero-solid/src/use-connection-state.js.map +1 -1
  886. package/out/zero-solid/src/use-query.js +55 -100
  887. package/out/zero-solid/src/use-query.js.map +1 -1
  888. package/out/zero-solid/src/use-zero-online.js +18 -12
  889. package/out/zero-solid/src/use-zero-online.js.map +1 -1
  890. package/out/zero-solid/src/use-zero.js +65 -77
  891. package/out/zero-solid/src/use-zero.js.map +1 -1
  892. package/out/zero-solid/src/zero.js +22 -0
  893. package/out/zero-types/src/format.js +8 -7
  894. package/out/zero-types/src/format.js.map +1 -1
  895. package/out/zero-types/src/name-mapper.js +34 -47
  896. package/out/zero-types/src/name-mapper.js.map +1 -1
  897. package/out/zql/src/builder/builder.d.ts.map +1 -1
  898. package/out/zql/src/builder/builder.js +315 -476
  899. package/out/zql/src/builder/builder.js.map +1 -1
  900. package/out/zql/src/builder/debug-delegate.js +69 -74
  901. package/out/zql/src/builder/debug-delegate.js.map +1 -1
  902. package/out/zql/src/builder/filter.js +116 -140
  903. package/out/zql/src/builder/filter.js.map +1 -1
  904. package/out/zql/src/builder/like.js +41 -46
  905. package/out/zql/src/builder/like.js.map +1 -1
  906. package/out/zql/src/error.js +10 -9
  907. package/out/zql/src/error.js.map +1 -1
  908. package/out/zql/src/ivm/array-view.js +89 -91
  909. package/out/zql/src/ivm/array-view.js.map +1 -1
  910. package/out/zql/src/ivm/constraint.js +65 -74
  911. package/out/zql/src/ivm/constraint.js.map +1 -1
  912. package/out/zql/src/ivm/data.js +61 -48
  913. package/out/zql/src/ivm/data.js.map +1 -1
  914. package/out/zql/src/ivm/exists.js +164 -213
  915. package/out/zql/src/ivm/exists.js.map +1 -1
  916. package/out/zql/src/ivm/fan-in.js +62 -59
  917. package/out/zql/src/ivm/fan-in.js.map +1 -1
  918. package/out/zql/src/ivm/fan-out.js +52 -61
  919. package/out/zql/src/ivm/fan-out.js.map +1 -1
  920. package/out/zql/src/ivm/filter-operators.js +91 -96
  921. package/out/zql/src/ivm/filter-operators.js.map +1 -1
  922. package/out/zql/src/ivm/filter-push.js +22 -26
  923. package/out/zql/src/ivm/filter-push.js.map +1 -1
  924. package/out/zql/src/ivm/filter.js +41 -35
  925. package/out/zql/src/ivm/filter.js.map +1 -1
  926. package/out/zql/src/ivm/flipped-join.js +282 -391
  927. package/out/zql/src/ivm/flipped-join.js.map +1 -1
  928. package/out/zql/src/ivm/join-utils.js +85 -115
  929. package/out/zql/src/ivm/join-utils.js.map +1 -1
  930. package/out/zql/src/ivm/join.js +162 -231
  931. package/out/zql/src/ivm/join.js.map +1 -1
  932. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +21 -25
  933. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
  934. package/out/zql/src/ivm/memory-source.js +364 -503
  935. package/out/zql/src/ivm/memory-source.js.map +1 -1
  936. package/out/zql/src/ivm/memory-storage.js +33 -34
  937. package/out/zql/src/ivm/memory-storage.js.map +1 -1
  938. package/out/zql/src/ivm/operator.js +13 -15
  939. package/out/zql/src/ivm/operator.js.map +1 -1
  940. package/out/zql/src/ivm/push-accumulated.js +267 -270
  941. package/out/zql/src/ivm/push-accumulated.js.map +1 -1
  942. package/out/zql/src/ivm/skip.js +91 -104
  943. package/out/zql/src/ivm/skip.js.map +1 -1
  944. package/out/zql/src/ivm/stream.js +10 -10
  945. package/out/zql/src/ivm/stream.js.map +1 -1
  946. package/out/zql/src/ivm/take.js +422 -569
  947. package/out/zql/src/ivm/take.js.map +1 -1
  948. package/out/zql/src/ivm/union-fan-in.js +157 -231
  949. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  950. package/out/zql/src/ivm/union-fan-out.js +38 -43
  951. package/out/zql/src/ivm/union-fan-out.js.map +1 -1
  952. package/out/zql/src/ivm/view-apply-change.js +166 -255
  953. package/out/zql/src/ivm/view-apply-change.js.map +1 -1
  954. package/out/zql/src/mutate/crud.js +35 -34
  955. package/out/zql/src/mutate/crud.js.map +1 -1
  956. package/out/zql/src/mutate/custom.d.ts.map +1 -1
  957. package/out/zql/src/mutate/custom.js +7 -11
  958. package/out/zql/src/mutate/custom.js.map +1 -1
  959. package/out/zql/src/mutate/mutator-registry.js +67 -71
  960. package/out/zql/src/mutate/mutator-registry.js.map +1 -1
  961. package/out/zql/src/mutate/mutator.js +26 -25
  962. package/out/zql/src/mutate/mutator.js.map +1 -1
  963. package/out/zql/src/planner/planner-builder.js +134 -239
  964. package/out/zql/src/planner/planner-builder.js.map +1 -1
  965. package/out/zql/src/planner/planner-connection.js +222 -212
  966. package/out/zql/src/planner/planner-connection.js.map +1 -1
  967. package/out/zql/src/planner/planner-constraint.js +15 -7
  968. package/out/zql/src/planner/planner-constraint.js.map +1 -1
  969. package/out/zql/src/planner/planner-debug.js +199 -224
  970. package/out/zql/src/planner/planner-debug.js.map +1 -1
  971. package/out/zql/src/planner/planner-fan-in.js +146 -162
  972. package/out/zql/src/planner/planner-fan-in.js.map +1 -1
  973. package/out/zql/src/planner/planner-fan-out.js +62 -74
  974. package/out/zql/src/planner/planner-fan-out.js.map +1 -1
  975. package/out/zql/src/planner/planner-graph.js +302 -334
  976. package/out/zql/src/planner/planner-graph.js.map +1 -1
  977. package/out/zql/src/planner/planner-join.js +255 -240
  978. package/out/zql/src/planner/planner-join.js.map +1 -1
  979. package/out/zql/src/planner/planner-node.js +10 -6
  980. package/out/zql/src/planner/planner-node.js.map +1 -1
  981. package/out/zql/src/planner/planner-source.js +15 -22
  982. package/out/zql/src/planner/planner-source.js.map +1 -1
  983. package/out/zql/src/planner/planner-terminus.js +28 -28
  984. package/out/zql/src/planner/planner-terminus.js.map +1 -1
  985. package/out/zql/src/query/complete-ordering.js +37 -61
  986. package/out/zql/src/query/complete-ordering.js.map +1 -1
  987. package/out/zql/src/query/create-builder.js +14 -22
  988. package/out/zql/src/query/create-builder.js.map +1 -1
  989. package/out/zql/src/query/error.js +10 -12
  990. package/out/zql/src/query/error.js.map +1 -1
  991. package/out/zql/src/query/escape-like.js +6 -5
  992. package/out/zql/src/query/escape-like.js.map +1 -1
  993. package/out/zql/src/query/expression.js +138 -157
  994. package/out/zql/src/query/expression.js.map +1 -1
  995. package/out/zql/src/query/measure-push-operator.js +35 -38
  996. package/out/zql/src/query/measure-push-operator.js.map +1 -1
  997. package/out/zql/src/query/metrics-delegate.js +7 -7
  998. package/out/zql/src/query/metrics-delegate.js.map +1 -1
  999. package/out/zql/src/query/named.js +52 -51
  1000. package/out/zql/src/query/named.js.map +1 -1
  1001. package/out/zql/src/query/query-delegate-base.js +190 -238
  1002. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  1003. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  1004. package/out/zql/src/query/query-impl.js +271 -405
  1005. package/out/zql/src/query/query-impl.js.map +1 -1
  1006. package/out/zql/src/query/query-internals.js +16 -8
  1007. package/out/zql/src/query/query-internals.js.map +1 -1
  1008. package/out/zql/src/query/query-registry.js +83 -98
  1009. package/out/zql/src/query/query-registry.js.map +1 -1
  1010. package/out/zql/src/query/query.d.ts.map +1 -1
  1011. package/out/zql/src/query/query.js +2 -0
  1012. package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -1
  1013. package/out/zql/src/query/runnable-query-impl.js +30 -55
  1014. package/out/zql/src/query/runnable-query-impl.js.map +1 -1
  1015. package/out/zql/src/query/static-query.js +7 -14
  1016. package/out/zql/src/query/static-query.js.map +1 -1
  1017. package/out/zql/src/query/ttl.js +45 -67
  1018. package/out/zql/src/query/ttl.js.map +1 -1
  1019. package/out/zql/src/query/validate-input.js +23 -20
  1020. package/out/zql/src/query/validate-input.js.map +1 -1
  1021. package/out/zqlite/src/database-storage.js +99 -103
  1022. package/out/zqlite/src/database-storage.js.map +1 -1
  1023. package/out/zqlite/src/db.js +206 -249
  1024. package/out/zqlite/src/db.js.map +1 -1
  1025. package/out/zqlite/src/explain-queries.js +11 -13
  1026. package/out/zqlite/src/explain-queries.js.map +1 -1
  1027. package/out/zqlite/src/internal/sql-inline.js +54 -37
  1028. package/out/zqlite/src/internal/sql-inline.js.map +1 -1
  1029. package/out/zqlite/src/internal/sql.js +17 -15
  1030. package/out/zqlite/src/internal/sql.js.map +1 -1
  1031. package/out/zqlite/src/internal/statement-cache.js +117 -92
  1032. package/out/zqlite/src/internal/statement-cache.js.map +1 -1
  1033. package/out/zqlite/src/mod.js +5 -0
  1034. package/out/zqlite/src/query-builder.js +81 -172
  1035. package/out/zqlite/src/query-builder.js.map +1 -1
  1036. package/out/zqlite/src/query-delegate.js +45 -55
  1037. package/out/zqlite/src/query-delegate.js.map +1 -1
  1038. package/out/zqlite/src/resolve-scalar-subqueries.js +134 -124
  1039. package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
  1040. package/out/zqlite/src/sqlite-cost-model.js +92 -97
  1041. package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
  1042. package/out/zqlite/src/sqlite-stat-fanout.js +304 -286
  1043. package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
  1044. package/out/zqlite/src/table-source.js +281 -455
  1045. package/out/zqlite/src/table-source.js.map +1 -1
  1046. package/package.json +8 -7
  1047. package/out/replicache/src/db/index-operation-enum.js +0 -7
  1048. package/out/replicache/src/db/index-operation-enum.js.map +0 -1
  1049. package/out/replicache/src/db/meta-type-enum.js +0 -7
  1050. package/out/replicache/src/db/meta-type-enum.js.map +0 -1
  1051. package/out/replicache/src/format-version-enum.js +0 -11
  1052. package/out/replicache/src/format-version-enum.js.map +0 -1
  1053. package/out/replicache/src/http-status-unauthorized.js +0 -5
  1054. package/out/replicache/src/http-status-unauthorized.js.map +0 -1
  1055. package/out/replicache/src/invoke-kind-enum.js +0 -7
  1056. package/out/replicache/src/invoke-kind-enum.js.map +0 -1
  1057. package/out/replicache/src/sync/handle-pull-response-result-type-enum.js +0 -9
  1058. package/out/replicache/src/sync/handle-pull-response-result-type-enum.js.map +0 -1
  1059. package/out/zero/package.json.js +0 -9
  1060. package/out/zero/package.json.js.map +0 -1
  1061. package/out/zero/src/adapters/drizzle.js.map +0 -1
  1062. package/out/zero/src/adapters/pg.js.map +0 -1
  1063. package/out/zero/src/adapters/postgresjs.js.map +0 -1
  1064. package/out/zero/src/adapters/prisma.js.map +0 -1
  1065. package/out/zero/src/analyze-query.js.map +0 -1
  1066. package/out/zero/src/ast-to-zql.js.map +0 -1
  1067. package/out/zero/src/bindings.js.map +0 -1
  1068. package/out/zero/src/change-protocol/v0.js.map +0 -1
  1069. package/out/zero/src/cli.js.map +0 -1
  1070. package/out/zero/src/deploy-permissions.js.map +0 -1
  1071. package/out/zero/src/expo-sqlite.js.map +0 -1
  1072. package/out/zero/src/op-sqlite.js.map +0 -1
  1073. package/out/zero/src/pg.js.map +0 -1
  1074. package/out/zero/src/react.js.map +0 -1
  1075. package/out/zero/src/server.js.map +0 -1
  1076. package/out/zero/src/solid.js.map +0 -1
  1077. package/out/zero/src/sqlite.js.map +0 -1
  1078. package/out/zero/src/transform-query.js.map +0 -1
  1079. package/out/zero/src/zero.js.map +0 -1
  1080. package/out/zero/src/zqlite.js.map +0 -1
  1081. package/out/zero-cache/src/db/postgres-replica-identity-enum.js +0 -11
  1082. package/out/zero-cache/src/db/postgres-replica-identity-enum.js.map +0 -1
  1083. package/out/zero-cache/src/db/postgres-type-class-enum.js +0 -17
  1084. package/out/zero-cache/src/db/postgres-type-class-enum.js.map +0 -1
  1085. package/out/zero-cache/src/services/change-streamer/error-type-enum.js +0 -9
  1086. package/out/zero-cache/src/services/change-streamer/error-type-enum.js.map +0 -1
@@ -1,166 +1,146 @@
1
- import { trace } from "@opentelemetry/api";
2
- import { startAsyncSpan } from "../../../../otel/src/span.js";
3
- import { version } from "../../../../otel/src/version.js";
4
1
  import { assert } from "../../../../shared/src/asserts.js";
5
- import { CustomKeyMap } from "../../../../shared/src/custom-key-map.js";
6
- import { CustomKeySet } from "../../../../shared/src/custom-key-set.js";
7
2
  import { deepEqual } from "../../../../shared/src/json.js";
8
3
  import { sleep } from "../../../../shared/src/sleep.js";
9
4
  import { parse } from "../../../../shared/src/valita.js";
10
5
  import { astSchema } from "../../../../zero-protocol/src/ast.js";
11
- import { clientSchemaSchema } from "../../../../zero-protocol/src/client-schema.js";
12
- import { ClientNotFound, Rehome, SchemaVersionNotSupported, Internal } from "../../../../zero-protocol/src/error-kind-enum.js";
6
+ import { ClientNotFound, Internal, Rehome, SchemaVersionNotSupported } from "../../../../zero-protocol/src/error-kind-enum.js";
13
7
  import { ZeroCache } from "../../../../zero-protocol/src/error-origin-enum.js";
14
- import { clampTTL, DEFAULT_TTL_MS } from "../../../../zql/src/query/ttl.js";
8
+ import { clientSchemaSchema } from "../../../../zero-protocol/src/client-schema.js";
9
+ import { DEFAULT_TTL_MS, clampTTL } from "../../../../zql/src/query/ttl.js";
10
+ import { startAsyncSpan } from "../../../../otel/src/span.js";
11
+ import { version } from "../../../../otel/src/version.js";
12
+ import { cvrSchema } from "../../types/shards.js";
13
+ import { rowIDString } from "../../types/row-key.js";
15
14
  import { READONLY, READ_COMMITTED } from "../../db/mode-enum.js";
16
15
  import { runTx } from "../../db/run-transaction.js";
16
+ import { CustomKeyMap } from "../../../../shared/src/custom-key-map.js";
17
17
  import { TransactionPool } from "../../db/transaction-pool.js";
18
18
  import { recordRowsSynced } from "../../server/anonymous-otel-start.js";
19
+ import { ttlClockAsNumber, ttlClockFromNumber } from "./ttl-clock.js";
20
+ import { EMPTY_CVR_VERSION, cmpVersions, queryRecordToQueryRow, versionFromString, versionString } from "./schema/types.js";
21
+ import "./schema/cvr.js";
19
22
  import { ProtocolErrorWithLevel } from "../../types/error-with-level.js";
20
- import { rowIDString } from "../../types/row-key.js";
21
- import { cvrSchema } from "../../types/shards.js";
23
+ import { CustomKeySet } from "../../../../shared/src/custom-key-set.js";
22
24
  import { RowRecordCache } from "./row-record-cache.js";
23
- import "pg-format";
24
- import "../../../../shared/src/bigint-json.js";
25
- import { EMPTY_CVR_VERSION, versionFromString, versionString, queryRecordToQueryRow, cmpVersions } from "./schema/types.js";
26
- import { ttlClockFromNumber, ttlClockAsNumber } from "./ttl-clock.js";
27
- let flushCounter = 0;
25
+ import { trace } from "@opentelemetry/api";
26
+ //#region ../zero-cache/src/services/view-syncer/cvr-store.ts
27
+ var flushCounter = 0;
28
+ /**
29
+ * Convert TTL/timestamp values for both old (seconds-based) and new (ms-based) columns.
30
+ * Old columns: inactivatedAt (TIMESTAMPTZ), ttl (INTERVAL) - need conversion ms->seconds
31
+ * New columns: inactivatedAtMs (DOUBLE PRECISION), ttlMs (DOUBLE PRECISION) - store ms directly
32
+ */
28
33
  function convertTTLValues(inactivatedAt, ttl) {
29
- return {
30
- ttlInterval: ttl < 0 ? null : ttl / 1e3,
31
- // INTERVAL needs seconds
32
- ttlMs: ttl < 0 ? null : ttl,
33
- // New column stores ms directly
34
- inactivatedAtTimestamp: inactivatedAt === void 0 ? null : ttlClockFromNumber(ttlClockAsNumber(inactivatedAt) / 1e3),
35
- inactivatedAtMs: inactivatedAt ?? null
36
- };
34
+ return {
35
+ ttlInterval: ttl < 0 ? null : ttl / 1e3,
36
+ ttlMs: ttl < 0 ? null : ttl,
37
+ inactivatedAtTimestamp: inactivatedAt === void 0 ? null : ttlClockFromNumber(ttlClockAsNumber(inactivatedAt) / 1e3),
38
+ inactivatedAtMs: inactivatedAt ?? null
39
+ };
37
40
  }
38
- const tracer = trace.getTracer("cvr-store", version);
41
+ var tracer = trace.getTracer("cvr-store", version);
39
42
  function asQuery(row) {
40
- const maybeVersion = (s) => s === null ? void 0 : versionFromString(s);
41
- if (row.clientAST === null) {
42
- assert(
43
- row.queryName !== null && row.queryArgs !== null,
44
- "queryName and queryArgs must be set for custom queries"
45
- );
46
- return {
47
- type: "custom",
48
- id: row.queryHash,
49
- name: row.queryName,
50
- args: row.queryArgs,
51
- patchVersion: maybeVersion(row.patchVersion),
52
- clientState: {},
53
- transformationHash: row.transformationHash ?? void 0,
54
- transformationVersion: maybeVersion(row.transformationVersion)
55
- };
56
- }
57
- const ast = astSchema.parse(row.clientAST);
58
- return row.internal ? {
59
- type: "internal",
60
- id: row.queryHash,
61
- ast,
62
- transformationHash: row.transformationHash ?? void 0,
63
- transformationVersion: maybeVersion(row.transformationVersion)
64
- } : {
65
- type: "client",
66
- id: row.queryHash,
67
- ast,
68
- patchVersion: maybeVersion(row.patchVersion),
69
- clientState: {},
70
- transformationHash: row.transformationHash ?? void 0,
71
- transformationVersion: maybeVersion(row.transformationVersion)
72
- };
43
+ const maybeVersion = (s) => s === null ? void 0 : versionFromString(s);
44
+ if (row.clientAST === null) {
45
+ assert(row.queryName !== null && row.queryArgs !== null, "queryName and queryArgs must be set for custom queries");
46
+ return {
47
+ type: "custom",
48
+ id: row.queryHash,
49
+ name: row.queryName,
50
+ args: row.queryArgs,
51
+ patchVersion: maybeVersion(row.patchVersion),
52
+ clientState: {},
53
+ transformationHash: row.transformationHash ?? void 0,
54
+ transformationVersion: maybeVersion(row.transformationVersion)
55
+ };
56
+ }
57
+ const ast = astSchema.parse(row.clientAST);
58
+ return row.internal ? {
59
+ type: "internal",
60
+ id: row.queryHash,
61
+ ast,
62
+ transformationHash: row.transformationHash ?? void 0,
63
+ transformationVersion: maybeVersion(row.transformationVersion)
64
+ } : {
65
+ type: "client",
66
+ id: row.queryHash,
67
+ ast,
68
+ patchVersion: maybeVersion(row.patchVersion),
69
+ clientState: {},
70
+ transformationHash: row.transformationHash ?? void 0,
71
+ transformationVersion: maybeVersion(row.transformationVersion)
72
+ };
73
73
  }
74
- const LOAD_ATTEMPT_INTERVAL_MS = 500;
75
- const MAX_LOAD_ATTEMPTS = 10;
76
- class CVRStore {
77
- #schema;
78
- #taskID;
79
- #id;
80
- #failService;
81
- #db;
82
- #writes = /* @__PURE__ */ new Set();
83
- // Stored separately so repeated putInstance() calls (e.g. setClientSchema,
84
- // setProfileID, and the final call in #flush) replace each other rather than
85
- // accumulating as independent statements in #writes.
86
- #pendingInstanceWrite = void 0;
87
- #pendingRowRecordUpdates = new CustomKeyMap(
88
- rowIDString
89
- );
90
- #forceUpdates = new CustomKeySet(rowIDString);
91
- #rowCache;
92
- #loadAttemptIntervalMs;
93
- #maxLoadAttempts;
94
- #rowCount = 0;
95
- #pendingQueryUpdates = /* @__PURE__ */ new Map();
96
- #pendingDesireUpdates = /* @__PURE__ */ new Map();
97
- #pendingQueryPartialUpdates = /* @__PURE__ */ new Map();
98
- constructor(lc, cvrDb, shard, taskID, cvrID, failService, loadAttemptIntervalMs = LOAD_ATTEMPT_INTERVAL_MS, maxLoadAttempts = MAX_LOAD_ATTEMPTS, deferredRowFlushThreshold = 100, setTimeoutFn = setTimeout) {
99
- this.#failService = failService;
100
- this.#db = cvrDb;
101
- this.#schema = cvrSchema(shard);
102
- this.#taskID = taskID;
103
- this.#id = cvrID;
104
- this.#rowCache = new RowRecordCache(
105
- lc,
106
- cvrDb,
107
- shard,
108
- cvrID,
109
- failService,
110
- deferredRowFlushThreshold,
111
- setTimeoutFn
112
- );
113
- this.#loadAttemptIntervalMs = loadAttemptIntervalMs;
114
- this.#maxLoadAttempts = maxLoadAttempts;
115
- }
116
- #cvr(table) {
117
- return this.#db(`${this.#schema}.${table}`);
118
- }
119
- #updateQueryFields(queryHash, fields) {
120
- this.#pendingQueryPartialUpdates.set(queryHash, fields);
121
- }
122
- load(lc, lastConnectTime) {
123
- return startAsyncSpan(tracer, "cvr.load", async () => {
124
- let err;
125
- for (let i = 0; i < this.#maxLoadAttempts; i++) {
126
- if (i > 0) {
127
- await sleep(this.#loadAttemptIntervalMs);
128
- }
129
- const result = await this.#load(lc, lastConnectTime);
130
- if (result instanceof RowsVersionBehindError) {
131
- lc.info?.(`attempt ${i + 1}: ${String(result)}`);
132
- err = result;
133
- continue;
134
- }
135
- return result;
136
- }
137
- assert(err, "Expected error to be set after retry loop exhausted");
138
- throw new ClientNotFoundError(
139
- `max attempts exceeded waiting for CVR@${err.cvrVersion} to catch up from ${err.rowsVersion}`
140
- );
141
- });
142
- }
143
- async #load(lc, lastConnectTime) {
144
- const start = Date.now();
145
- const id = this.#id;
146
- const cvr = {
147
- id,
148
- version: EMPTY_CVR_VERSION,
149
- lastActive: 0,
150
- ttlClock: ttlClockFromNumber(0),
151
- // TTL clock starts at 0, not Date.now()
152
- replicaVersion: null,
153
- clients: {},
154
- queries: {},
155
- clientSchema: null,
156
- profileID: null
157
- };
158
- const [instance, clientsRows, queryRows, desiresRows] = await runTx(
159
- this.#db,
160
- (tx) => {
161
- lc.debug?.(`CVR tx started after ${Date.now() - start} ms`);
162
- return [
163
- tx`SELECT cvr."version",
74
+ var LOAD_ATTEMPT_INTERVAL_MS = 500;
75
+ var MAX_LOAD_ATTEMPTS = 10;
76
+ var CVRStore = class {
77
+ #schema;
78
+ #taskID;
79
+ #id;
80
+ #failService;
81
+ #db;
82
+ #writes = /* @__PURE__ */ new Set();
83
+ #pendingInstanceWrite = void 0;
84
+ #pendingRowRecordUpdates = new CustomKeyMap(rowIDString);
85
+ #forceUpdates = new CustomKeySet(rowIDString);
86
+ #rowCache;
87
+ #loadAttemptIntervalMs;
88
+ #maxLoadAttempts;
89
+ #rowCount = 0;
90
+ #pendingQueryUpdates = /* @__PURE__ */ new Map();
91
+ #pendingDesireUpdates = /* @__PURE__ */ new Map();
92
+ #pendingQueryPartialUpdates = /* @__PURE__ */ new Map();
93
+ constructor(lc, cvrDb, shard, taskID, cvrID, failService, loadAttemptIntervalMs = LOAD_ATTEMPT_INTERVAL_MS, maxLoadAttempts = MAX_LOAD_ATTEMPTS, deferredRowFlushThreshold = 100, setTimeoutFn = setTimeout) {
94
+ this.#failService = failService;
95
+ this.#db = cvrDb;
96
+ this.#schema = cvrSchema(shard);
97
+ this.#taskID = taskID;
98
+ this.#id = cvrID;
99
+ this.#rowCache = new RowRecordCache(lc, cvrDb, shard, cvrID, failService, deferredRowFlushThreshold, setTimeoutFn);
100
+ this.#loadAttemptIntervalMs = loadAttemptIntervalMs;
101
+ this.#maxLoadAttempts = maxLoadAttempts;
102
+ }
103
+ #cvr(table) {
104
+ return this.#db(`${this.#schema}.${table}`);
105
+ }
106
+ #updateQueryFields(queryHash, fields) {
107
+ this.#pendingQueryPartialUpdates.set(queryHash, fields);
108
+ }
109
+ load(lc, lastConnectTime) {
110
+ return startAsyncSpan(tracer, "cvr.load", async () => {
111
+ let err;
112
+ for (let i = 0; i < this.#maxLoadAttempts; i++) {
113
+ if (i > 0) await sleep(this.#loadAttemptIntervalMs);
114
+ const result = await this.#load(lc, lastConnectTime);
115
+ if (result instanceof RowsVersionBehindError) {
116
+ lc.info?.(`attempt ${i + 1}: ${String(result)}`);
117
+ err = result;
118
+ continue;
119
+ }
120
+ return result;
121
+ }
122
+ assert(err, "Expected error to be set after retry loop exhausted");
123
+ throw new ClientNotFoundError(`max attempts exceeded waiting for CVR@${err.cvrVersion} to catch up from ${err.rowsVersion}`);
124
+ });
125
+ }
126
+ async #load(lc, lastConnectTime) {
127
+ const start = Date.now();
128
+ const id = this.#id;
129
+ const cvr = {
130
+ id,
131
+ version: EMPTY_CVR_VERSION,
132
+ lastActive: 0,
133
+ ttlClock: ttlClockFromNumber(0),
134
+ replicaVersion: null,
135
+ clients: {},
136
+ queries: {},
137
+ clientSchema: null,
138
+ profileID: null
139
+ };
140
+ const [instance, clientsRows, queryRows, desiresRows] = await runTx(this.#db, (tx) => {
141
+ lc.debug?.(`CVR tx started after ${Date.now() - start} ms`);
142
+ return [
143
+ tx`SELECT cvr."version",
164
144
  "lastActive",
165
145
  "ttlClock",
166
146
  "replicaVersion",
@@ -174,13 +154,11 @@ class CVRStore {
174
154
  LEFT JOIN ${this.#cvr("rowsVersion")} AS rows
175
155
  ON cvr."clientGroupID" = rows."clientGroupID"
176
156
  WHERE cvr."clientGroupID" = ${id}`,
177
- tx`SELECT "clientID" FROM ${this.#cvr(
178
- "clients"
179
- )}
157
+ tx`SELECT "clientID" FROM ${this.#cvr("clients")}
180
158
  WHERE "clientGroupID" = ${id}`,
181
- tx`SELECT * FROM ${this.#cvr("queries")}
159
+ tx`SELECT * FROM ${this.#cvr("queries")}
182
160
  WHERE "clientGroupID" = ${id} AND deleted IS DISTINCT FROM true`,
183
- tx`SELECT
161
+ tx`SELECT
184
162
  "clientGroupID",
185
163
  "clientID",
186
164
  "queryHash",
@@ -190,50 +168,23 @@ class CVRStore {
190
168
  "inactivatedAtMs" AS "inactivatedAt"
191
169
  FROM ${this.#cvr("desires")}
192
170
  WHERE "clientGroupID" = ${id}`
193
- ];
194
- },
195
- { mode: READONLY }
196
- );
197
- lc.debug?.(
198
- `CVR tx completed after ${Date.now() - start} ms (${clientsRows.length} clients, ${queryRows.length} queries, ${desiresRows.length} desires)`
199
- );
200
- if (instance.length === 0) {
201
- this.putInstance({
202
- version: cvr.version,
203
- lastActive: 0,
204
- ttlClock: ttlClockFromNumber(0),
205
- // TTL clock starts at 0 for new instances
206
- replicaVersion: null,
207
- clientSchema: null,
208
- profileID: null
209
- });
210
- } else {
211
- assert(
212
- instance.length === 1,
213
- () => `Expected exactly one CVR instance, got ${instance.length}`
214
- );
215
- const {
216
- version: version2,
217
- lastActive,
218
- ttlClock,
219
- replicaVersion,
220
- owner,
221
- grantedAt,
222
- rowsVersion,
223
- clientSchema,
224
- profileID,
225
- deleted
226
- } = instance[0];
227
- if (deleted) {
228
- throw new ClientNotFoundError(
229
- "Client has been purged due to inactivity"
230
- );
231
- }
232
- if (owner !== this.#taskID) {
233
- if ((grantedAt ?? 0) > lastConnectTime) {
234
- throw new OwnershipError(owner, grantedAt, lastConnectTime);
235
- } else {
236
- void this.#db`
171
+ ];
172
+ }, { mode: READONLY });
173
+ lc.debug?.(`CVR tx completed after ${Date.now() - start} ms (${clientsRows.length} clients, ${queryRows.length} queries, ${desiresRows.length} desires)`);
174
+ if (instance.length === 0) this.putInstance({
175
+ version: cvr.version,
176
+ lastActive: 0,
177
+ ttlClock: ttlClockFromNumber(0),
178
+ replicaVersion: null,
179
+ clientSchema: null,
180
+ profileID: null
181
+ });
182
+ else {
183
+ assert(instance.length === 1, () => `Expected exactly one CVR instance, got ${instance.length}`);
184
+ const { version, lastActive, ttlClock, replicaVersion, owner, grantedAt, rowsVersion, clientSchema, profileID, deleted } = instance[0];
185
+ if (deleted) throw new ClientNotFoundError("Client has been purged due to inactivity");
186
+ if (owner !== this.#taskID) if ((grantedAt ?? 0) > lastConnectTime) throw new OwnershipError(owner, grantedAt, lastConnectTime);
187
+ else this.#db`
237
188
  UPDATE ${this.#cvr("instances")}
238
189
  SET "owner" = ${this.#taskID},
239
190
  "grantedAt" = ${lastConnectTime}
@@ -241,272 +192,244 @@ class CVRStore {
241
192
  ("grantedAt" IS NULL OR
242
193
  "grantedAt" <= to_timestamp(${lastConnectTime / 1e3}))
243
194
  `.execute().catch(this.#failService);
244
- }
245
- }
246
- if (version2 !== (rowsVersion ?? EMPTY_CVR_VERSION.stateVersion)) {
247
- return new RowsVersionBehindError(version2, rowsVersion);
248
- }
249
- cvr.version = versionFromString(version2);
250
- cvr.lastActive = lastActive;
251
- cvr.ttlClock = ttlClock;
252
- cvr.replicaVersion = replicaVersion;
253
- cvr.profileID = profileID;
254
- try {
255
- cvr.clientSchema = clientSchema === null ? null : parse(clientSchema, clientSchemaSchema);
256
- } catch (e) {
257
- throw new InvalidClientSchemaError(e);
258
- }
259
- }
260
- for (const row of clientsRows) {
261
- cvr.clients[row.clientID] = {
262
- id: row.clientID,
263
- desiredQueryIDs: []
264
- };
265
- }
266
- for (const row of queryRows) {
267
- const query = asQuery(row);
268
- cvr.queries[row.queryHash] = query;
269
- }
270
- for (const row of desiresRows) {
271
- const client = cvr.clients[row.clientID];
272
- if (!row.deleted && row.inactivatedAt === null) {
273
- if (client) {
274
- client.desiredQueryIDs.push(row.queryHash);
275
- } else {
276
- lc.debug?.(
277
- `Not adding to desiredQueryIDs for client ${row.clientID} because it has been deleted.`
278
- );
279
- }
280
- }
281
- const query = cvr.queries[row.queryHash];
282
- if (query && query.type !== "internal" && (!row.deleted || row.inactivatedAt !== null)) {
283
- query.clientState[row.clientID] = {
284
- inactivatedAt: row.inactivatedAt ?? void 0,
285
- ttl: clampTTL(row.ttl ?? DEFAULT_TTL_MS),
286
- version: versionFromString(row.patchVersion)
287
- };
288
- }
289
- }
290
- lc.debug?.(
291
- `loaded cvr@${versionString(cvr.version)} (${Date.now() - start} ms)`
292
- );
293
- return cvr;
294
- }
295
- getRowRecords() {
296
- return this.#rowCache.getRowRecords();
297
- }
298
- putRowRecord(row) {
299
- this.#pendingRowRecordUpdates.set(row.id, row);
300
- }
301
- /**
302
- * Note: Removing a row from the CVR should be represented by a
303
- * {@link putRowRecord()} with `refCounts: null` in order to properly
304
- * produce the appropriate delete patch when catching up old clients.
305
- *
306
- * This `delRowRecord()` method, on the other hand, is only used for
307
- * "canceling" the put of a row that was not in the CVR in the first place.
308
- */
309
- delRowRecord(id) {
310
- this.#pendingRowRecordUpdates.set(id, null);
311
- }
312
- /**
313
- * Overrides the default logic that removes no-op writes and forces
314
- * the updates for the given row `ids`. This has no effect if there
315
- * are no corresponding puts or dels for the associated row records.
316
- */
317
- forceUpdates(...ids) {
318
- for (const id of ids) {
319
- this.#forceUpdates.add(id);
320
- }
321
- }
322
- /**
323
- * Updates the `ttlClock` of the CVR instance. The ttlClock starts at 0 when
324
- * the CVR instance is first created and increments based on elapsed time
325
- * since the base time established by the ViewSyncerService.
326
- */
327
- async updateTTLClock(ttlClock, lastActive) {
328
- await this.#db`UPDATE ${this.#cvr("instances")}
195
+ if (version !== (rowsVersion ?? EMPTY_CVR_VERSION.stateVersion)) return new RowsVersionBehindError(version, rowsVersion);
196
+ cvr.version = versionFromString(version);
197
+ cvr.lastActive = lastActive;
198
+ cvr.ttlClock = ttlClock;
199
+ cvr.replicaVersion = replicaVersion;
200
+ cvr.profileID = profileID;
201
+ try {
202
+ cvr.clientSchema = clientSchema === null ? null : parse(clientSchema, clientSchemaSchema);
203
+ } catch (e) {
204
+ throw new InvalidClientSchemaError(e);
205
+ }
206
+ }
207
+ for (const row of clientsRows) cvr.clients[row.clientID] = {
208
+ id: row.clientID,
209
+ desiredQueryIDs: []
210
+ };
211
+ for (const row of queryRows) {
212
+ const query = asQuery(row);
213
+ cvr.queries[row.queryHash] = query;
214
+ }
215
+ for (const row of desiresRows) {
216
+ const client = cvr.clients[row.clientID];
217
+ if (!row.deleted && row.inactivatedAt === null) if (client) client.desiredQueryIDs.push(row.queryHash);
218
+ else lc.debug?.(`Not adding to desiredQueryIDs for client ${row.clientID} because it has been deleted.`);
219
+ const query = cvr.queries[row.queryHash];
220
+ if (query && query.type !== "internal" && (!row.deleted || row.inactivatedAt !== null)) query.clientState[row.clientID] = {
221
+ inactivatedAt: row.inactivatedAt ?? void 0,
222
+ ttl: clampTTL(row.ttl ?? 3e5),
223
+ version: versionFromString(row.patchVersion)
224
+ };
225
+ }
226
+ lc.info?.(`loaded cvr@${versionString(cvr.version)} (${Date.now() - start} ms)`);
227
+ return cvr;
228
+ }
229
+ getRowRecords() {
230
+ return this.#rowCache.getRowRecords();
231
+ }
232
+ putRowRecord(row) {
233
+ this.#pendingRowRecordUpdates.set(row.id, row);
234
+ }
235
+ /**
236
+ * Note: Removing a row from the CVR should be represented by a
237
+ * {@link putRowRecord()} with `refCounts: null` in order to properly
238
+ * produce the appropriate delete patch when catching up old clients.
239
+ *
240
+ * This `delRowRecord()` method, on the other hand, is only used for
241
+ * "canceling" the put of a row that was not in the CVR in the first place.
242
+ */
243
+ delRowRecord(id) {
244
+ this.#pendingRowRecordUpdates.set(id, null);
245
+ }
246
+ /**
247
+ * Overrides the default logic that removes no-op writes and forces
248
+ * the updates for the given row `ids`. This has no effect if there
249
+ * are no corresponding puts or dels for the associated row records.
250
+ */
251
+ forceUpdates(...ids) {
252
+ for (const id of ids) this.#forceUpdates.add(id);
253
+ }
254
+ /**
255
+ * Updates the `ttlClock` of the CVR instance. The ttlClock starts at 0 when
256
+ * the CVR instance is first created and increments based on elapsed time
257
+ * since the base time established by the ViewSyncerService.
258
+ */
259
+ async updateTTLClock(ttlClock, lastActive) {
260
+ await this.#db`UPDATE ${this.#cvr("instances")}
329
261
  SET "lastActive" = ${lastActive},
330
262
  "ttlClock" = ${ttlClock}
331
263
  WHERE "clientGroupID" = ${this.#id}`.execute();
332
- }
333
- /**
334
- * @returns This returns the current `ttlClock` of the CVR instance. The ttlClock
335
- * represents elapsed time since the instance was created (starting from 0).
336
- * If the CVR has never been initialized for this client group, it returns
337
- * `undefined`.
338
- */
339
- async getTTLClock() {
340
- const result = await this.#db`
264
+ }
265
+ /**
266
+ * @returns This returns the current `ttlClock` of the CVR instance. The ttlClock
267
+ * represents elapsed time since the instance was created (starting from 0).
268
+ * If the CVR has never been initialized for this client group, it returns
269
+ * `undefined`.
270
+ */
271
+ async getTTLClock() {
272
+ const result = await this.#db`
341
273
  SELECT "ttlClock" FROM ${this.#cvr("instances")}
342
274
  WHERE "clientGroupID" = ${this.#id}`.values();
343
- if (result.length === 0) {
344
- return void 0;
345
- }
346
- assert(
347
- result.length === 1,
348
- () => `Expected exactly one rowsVersion result, got ${result.length}`
349
- );
350
- return result[0][0];
351
- }
352
- putInstance({
353
- version: version2,
354
- replicaVersion,
355
- lastActive,
356
- clientSchema,
357
- profileID,
358
- ttlClock
359
- }) {
360
- this.#pendingInstanceWrite = (tx, lastConnectTime) => {
361
- const change = {
362
- clientGroupID: this.#id,
363
- version: versionString(version2),
364
- lastActive,
365
- ttlClock,
366
- replicaVersion,
367
- owner: this.#taskID,
368
- grantedAt: lastConnectTime,
369
- clientSchema,
370
- profileID
371
- };
372
- return tx`
275
+ if (result.length === 0) return;
276
+ assert(result.length === 1, () => `Expected exactly one rowsVersion result, got ${result.length}`);
277
+ return result[0][0];
278
+ }
279
+ putInstance({ version, replicaVersion, lastActive, clientSchema, profileID, ttlClock }) {
280
+ this.#pendingInstanceWrite = (tx, lastConnectTime) => {
281
+ const change = {
282
+ clientGroupID: this.#id,
283
+ version: versionString(version),
284
+ lastActive,
285
+ ttlClock,
286
+ replicaVersion,
287
+ owner: this.#taskID,
288
+ grantedAt: lastConnectTime,
289
+ clientSchema,
290
+ profileID
291
+ };
292
+ return tx`
373
293
  INSERT INTO ${this.#cvr("instances")} ${tx(change)}
374
294
  ON CONFLICT ("clientGroupID") DO UPDATE SET ${tx(change)}`;
375
- };
376
- }
377
- markQueryAsDeleted(version2, queryPatch) {
378
- this.#updateQueryFields(queryPatch.id, {
379
- patchVersion: versionString(version2),
380
- deleted: true,
381
- transformationHash: null,
382
- transformationVersion: null
383
- });
384
- }
385
- putQuery(query) {
386
- const change = queryRecordToQueryRow(this.#id, query);
387
- const c = {
388
- ...change,
389
- // Pre-stringify queryArgs to handle postgres.js boolean array bug
390
- queryArgs: change.queryArgs !== null ? JSON.stringify(change.queryArgs) : null,
391
- transformationHash: change.transformationHash ?? null,
392
- transformationVersion: change.transformationVersion ?? null,
393
- deleted: change.deleted ?? false
394
- };
395
- this.#pendingQueryUpdates.set(query.id, c);
396
- }
397
- updateQuery(query) {
398
- const maybeVersionString = (v2) => v2 ? versionString(v2) : null;
399
- this.#updateQueryFields(query.id, {
400
- patchVersion: query.type === "internal" ? null : maybeVersionString(query.patchVersion),
401
- transformationHash: query.transformationHash ?? null,
402
- transformationVersion: maybeVersionString(query.transformationVersion),
403
- deleted: false
404
- });
405
- }
406
- insertClient(client) {
407
- const change = {
408
- clientGroupID: this.#id,
409
- clientID: client.id
410
- };
411
- this.#writes.add({
412
- stats: { clients: 1 },
413
- write: (tx) => tx`INSERT INTO ${this.#cvr("clients")} ${tx(change)}`
414
- });
415
- }
416
- deleteClient(clientID) {
417
- this.#writes.add({
418
- stats: { clients: 1 },
419
- write: (sql) => sql`DELETE FROM ${this.#cvr("clients")}
295
+ };
296
+ }
297
+ markQueryAsDeleted(version, queryPatch) {
298
+ this.#updateQueryFields(queryPatch.id, {
299
+ patchVersion: versionString(version),
300
+ deleted: true,
301
+ transformationHash: null,
302
+ transformationVersion: null
303
+ });
304
+ }
305
+ putQuery(query) {
306
+ const change = queryRecordToQueryRow(this.#id, query);
307
+ const c = {
308
+ ...change,
309
+ queryArgs: change.queryArgs !== null ? JSON.stringify(change.queryArgs) : null,
310
+ transformationHash: change.transformationHash ?? null,
311
+ transformationVersion: change.transformationVersion ?? null,
312
+ deleted: change.deleted ?? false
313
+ };
314
+ this.#pendingQueryUpdates.set(query.id, c);
315
+ }
316
+ updateQuery(query) {
317
+ const maybeVersionString = (v) => v ? versionString(v) : null;
318
+ this.#updateQueryFields(query.id, {
319
+ patchVersion: query.type === "internal" ? null : maybeVersionString(query.patchVersion),
320
+ transformationHash: query.transformationHash ?? null,
321
+ transformationVersion: maybeVersionString(query.transformationVersion),
322
+ deleted: false
323
+ });
324
+ }
325
+ insertClient(client) {
326
+ const change = {
327
+ clientGroupID: this.#id,
328
+ clientID: client.id
329
+ };
330
+ this.#writes.add({
331
+ stats: { clients: 1 },
332
+ write: (tx) => tx`INSERT INTO ${this.#cvr("clients")} ${tx(change)}`
333
+ });
334
+ }
335
+ deleteClient(clientID) {
336
+ this.#writes.add({
337
+ stats: { clients: 1 },
338
+ write: (sql) => sql`DELETE FROM ${this.#cvr("clients")}
420
339
  WHERE "clientGroupID" = ${this.#id}
421
340
  AND "clientID" = ${clientID}`
422
- });
423
- }
424
- putDesiredQuery(newVersion, query, client, deleted, inactivatedAt, ttl) {
425
- const { ttlMs, inactivatedAtMs } = convertTTLValues(inactivatedAt, ttl);
426
- const change = {
427
- clientGroupID: this.#id,
428
- clientID: client.id,
429
- deleted,
430
- inactivatedAt: inactivatedAtMs,
431
- patchVersion: versionString(newVersion),
432
- queryHash: query.id,
433
- ttl: ttlMs
434
- };
435
- const key = `${client.id}:${query.id}`;
436
- this.#pendingDesireUpdates.set(key, change);
437
- }
438
- catchupRowPatches(lc, afterVersion, upToCVR, current, excludeQueryHashes = []) {
439
- return this.#rowCache.catchupRowPatches(
440
- lc,
441
- afterVersion,
442
- upToCVR,
443
- current,
444
- excludeQueryHashes
445
- );
446
- }
447
- async catchupConfigPatches(lc, afterVersion, upToCVR, current) {
448
- if (cmpVersions(afterVersion, upToCVR.version) >= 0) {
449
- return [];
450
- }
451
- const startMs = Date.now();
452
- const start = afterVersion ? versionString(afterVersion) : "";
453
- const end = versionString(upToCVR.version);
454
- lc.debug?.(`scanning config patches for clients from ${start}`);
455
- const reader = new TransactionPool(lc, READONLY).run(this.#db);
456
- try {
457
- await reader.processReadTask(
458
- (tx) => checkVersion(tx, this.#schema, this.#id, current)
459
- );
460
- const [allDesires, queryRows] = await reader.processReadTask(
461
- (tx) => Promise.all([
462
- tx`
341
+ });
342
+ }
343
+ putDesiredQuery(newVersion, query, client, deleted, inactivatedAt, ttl) {
344
+ const { ttlMs, inactivatedAtMs } = convertTTLValues(inactivatedAt, ttl);
345
+ const change = {
346
+ clientGroupID: this.#id,
347
+ clientID: client.id,
348
+ deleted,
349
+ inactivatedAt: inactivatedAtMs,
350
+ patchVersion: versionString(newVersion),
351
+ queryHash: query.id,
352
+ ttl: ttlMs
353
+ };
354
+ const key = `${client.id}:${query.id}`;
355
+ this.#pendingDesireUpdates.set(key, change);
356
+ }
357
+ catchupRowPatches(lc, afterVersion, upToCVR, current, excludeQueryHashes = []) {
358
+ return this.#rowCache.catchupRowPatches(lc, afterVersion, upToCVR, current, excludeQueryHashes);
359
+ }
360
+ async catchupConfigPatches(lc, afterVersion, upToCVR, current) {
361
+ if (cmpVersions(afterVersion, upToCVR.version) >= 0) return [];
362
+ const startMs = Date.now();
363
+ const start = afterVersion ? versionString(afterVersion) : "";
364
+ const end = versionString(upToCVR.version);
365
+ lc.debug?.(`scanning config patches for clients from ${start}`);
366
+ const reader = new TransactionPool(lc, READONLY).run(this.#db);
367
+ try {
368
+ await reader.processReadTask((tx) => checkVersion(tx, this.#schema, this.#id, current));
369
+ const [allDesires, queryRows] = await reader.processReadTask((tx) => Promise.all([tx`
463
370
  SELECT * FROM ${this.#cvr("desires")}
464
371
  WHERE "clientGroupID" = ${this.#id}
465
372
  AND "patchVersion" > ${start}
466
- AND "patchVersion" <= ${end}`,
467
- tx`
373
+ AND "patchVersion" <= ${end}`, tx`
468
374
  SELECT deleted, "queryHash", "patchVersion" FROM ${this.#cvr("queries")}
469
375
  WHERE "clientGroupID" = ${this.#id}
470
376
  AND "patchVersion" > ${start}
471
- AND "patchVersion" <= ${end}`
472
- ])
473
- );
474
- const patches = [];
475
- for (const row of queryRows) {
476
- const { queryHash: id } = row;
477
- const patch = row.deleted ? { type: "query", op: "del", id } : { type: "query", op: "put", id };
478
- const v2 = row.patchVersion;
479
- assert(v2, "patchVersion must be set for query patches");
480
- patches.push({ patch, toVersion: versionFromString(v2) });
481
- }
482
- for (const row of allDesires) {
483
- const { clientID, queryHash: id } = row;
484
- const patch = row.deleted ? { type: "query", op: "del", id, clientID } : { type: "query", op: "put", id, clientID };
485
- patches.push({ patch, toVersion: versionFromString(row.patchVersion) });
486
- }
487
- lc.debug?.(
488
- `${patches.length} config patches (${Date.now() - startMs} ms)`
489
- );
490
- return patches;
491
- } finally {
492
- reader.setDone();
493
- }
494
- }
495
- #flushQueries(tx, lc) {
496
- const partialOnly = /* @__PURE__ */ new Map();
497
- for (const [queryHash, partial] of this.#pendingQueryPartialUpdates) {
498
- const existing = this.#pendingQueryUpdates.get(queryHash);
499
- if (existing) {
500
- Object.assign(existing, partial);
501
- } else {
502
- partialOnly.set(queryHash, partial);
503
- }
504
- }
505
- const queries = [];
506
- if (this.#pendingQueryUpdates.size > 0) {
507
- const rows = [...this.#pendingQueryUpdates.values()];
508
- lc.debug?.(`Batch flushing ${rows.length} full query updates`);
509
- queries.push(tx`
377
+ AND "patchVersion" <= ${end}`]));
378
+ const patches = [];
379
+ for (const row of queryRows) {
380
+ const { queryHash: id } = row;
381
+ const patch = row.deleted ? {
382
+ type: "query",
383
+ op: "del",
384
+ id
385
+ } : {
386
+ type: "query",
387
+ op: "put",
388
+ id
389
+ };
390
+ const v = row.patchVersion;
391
+ assert(v, "patchVersion must be set for query patches");
392
+ patches.push({
393
+ patch,
394
+ toVersion: versionFromString(v)
395
+ });
396
+ }
397
+ for (const row of allDesires) {
398
+ const { clientID, queryHash: id } = row;
399
+ const patch = row.deleted ? {
400
+ type: "query",
401
+ op: "del",
402
+ id,
403
+ clientID
404
+ } : {
405
+ type: "query",
406
+ op: "put",
407
+ id,
408
+ clientID
409
+ };
410
+ patches.push({
411
+ patch,
412
+ toVersion: versionFromString(row.patchVersion)
413
+ });
414
+ }
415
+ lc.debug?.(`${patches.length} config patches (${Date.now() - startMs} ms)`);
416
+ return patches;
417
+ } finally {
418
+ reader.setDone();
419
+ }
420
+ }
421
+ #flushQueries(tx, lc) {
422
+ const partialOnly = /* @__PURE__ */ new Map();
423
+ for (const [queryHash, partial] of this.#pendingQueryPartialUpdates) {
424
+ const existing = this.#pendingQueryUpdates.get(queryHash);
425
+ if (existing) Object.assign(existing, partial);
426
+ else partialOnly.set(queryHash, partial);
427
+ }
428
+ const queries = [];
429
+ if (this.#pendingQueryUpdates.size > 0) {
430
+ const rows = [...this.#pendingQueryUpdates.values()];
431
+ lc.debug?.(`Batch flushing ${rows.length} full query updates`);
432
+ queries.push(tx`
510
433
  INSERT INTO ${this.#cvr("queries")} (
511
434
  "clientGroupID",
512
435
  "queryHash",
@@ -558,25 +481,22 @@ class CVRStore {
558
481
  "internal" = excluded."internal",
559
482
  "deleted" = excluded."deleted"
560
483
  `);
561
- }
562
- if (partialOnly.size > 0) {
563
- lc.debug?.(`Batch flushing ${partialOnly.size} partial query updates`);
564
- const rows = Array.from(
565
- partialOnly.entries(),
566
- ([queryHash, partial]) => ({
567
- clientGroupID: this.#id,
568
- queryHash,
569
- patchVersionSet: partial.patchVersion !== void 0,
570
- patchVersion: partial.patchVersion ?? null,
571
- deletedSet: partial.deleted !== void 0,
572
- deleted: partial.deleted ?? null,
573
- transformationHashSet: partial.transformationHash !== void 0,
574
- transformationHash: partial.transformationHash ?? null,
575
- transformationVersionSet: partial.transformationVersion !== void 0,
576
- transformationVersion: partial.transformationVersion ?? null
577
- })
578
- );
579
- queries.push(tx`
484
+ }
485
+ if (partialOnly.size > 0) {
486
+ lc.debug?.(`Batch flushing ${partialOnly.size} partial query updates`);
487
+ const rows = Array.from(partialOnly.entries(), ([queryHash, partial]) => ({
488
+ clientGroupID: this.#id,
489
+ queryHash,
490
+ patchVersionSet: partial.patchVersion !== void 0,
491
+ patchVersion: partial.patchVersion ?? null,
492
+ deletedSet: partial.deleted !== void 0,
493
+ deleted: partial.deleted ?? null,
494
+ transformationHashSet: partial.transformationHash !== void 0,
495
+ transformationHash: partial.transformationHash ?? null,
496
+ transformationVersionSet: partial.transformationVersion !== void 0,
497
+ transformationVersion: partial.transformationVersion ?? null
498
+ }));
499
+ queries.push(tx`
580
500
  UPDATE ${this.#cvr("queries")} AS q
581
501
  SET
582
502
  "patchVersion" = CASE
@@ -610,29 +530,27 @@ class CVRStore {
610
530
  WHERE q."clientGroupID" = u."clientGroupID"
611
531
  AND q."queryHash" = u."queryHash"
612
532
  `);
613
- }
614
- return queries;
615
- }
616
- #flushDesires(tx, lc) {
617
- if (this.#pendingDesireUpdates.size === 0) {
618
- return null;
619
- }
620
- const rows = Array.from(this.#pendingDesireUpdates.values(), (row) => {
621
- const { ttlInterval, ttlMs, inactivatedAtTimestamp, inactivatedAtMs } = convertTTLValues(row.inactivatedAt ?? void 0, row.ttl ?? -1);
622
- return {
623
- clientGroupID: row.clientGroupID,
624
- clientID: row.clientID,
625
- queryHash: row.queryHash,
626
- patchVersion: row.patchVersion,
627
- deleted: row.deleted,
628
- ttl: ttlInterval,
629
- ttlMs,
630
- inactivatedAt: inactivatedAtTimestamp,
631
- inactivatedAtMs
632
- };
633
- });
634
- lc.debug?.(`Batch flushing ${rows.length} desire updates`);
635
- return tx`
533
+ }
534
+ return queries;
535
+ }
536
+ #flushDesires(tx, lc) {
537
+ if (this.#pendingDesireUpdates.size === 0) return null;
538
+ const rows = Array.from(this.#pendingDesireUpdates.values(), (row) => {
539
+ const { ttlInterval, ttlMs, inactivatedAtTimestamp, inactivatedAtMs } = convertTTLValues(row.inactivatedAt ?? void 0, row.ttl ?? -1);
540
+ return {
541
+ clientGroupID: row.clientGroupID,
542
+ clientID: row.clientID,
543
+ queryHash: row.queryHash,
544
+ patchVersion: row.patchVersion,
545
+ deleted: row.deleted,
546
+ ttl: ttlInterval,
547
+ ttlMs,
548
+ inactivatedAt: inactivatedAtTimestamp,
549
+ inactivatedAtMs
550
+ };
551
+ });
552
+ lc.debug?.(`Batch flushing ${rows.length} desire updates`);
553
+ return tx`
636
554
  INSERT INTO ${this.#cvr("desires")} (
637
555
  "clientGroupID",
638
556
  "clientID",
@@ -678,191 +596,137 @@ class CVRStore {
678
596
  "inactivatedAt" = excluded."inactivatedAt",
679
597
  "inactivatedAtMs" = excluded."inactivatedAtMs"
680
598
  `;
681
- }
682
- async #checkVersionAndOwnership(lc, tx, expectedCurrentVersion, lastConnectTime) {
683
- const start = Date.now();
684
- lc.debug?.("checking cvr version and ownership");
685
- const result = await tx`SELECT "version", "owner", "grantedAt" FROM ${this.#cvr("instances")}
599
+ }
600
+ async #checkVersionAndOwnership(lc, tx, expectedCurrentVersion, lastConnectTime) {
601
+ const start = Date.now();
602
+ lc.debug?.("checking cvr version and ownership");
603
+ const result = await tx`SELECT "version", "owner", "grantedAt" FROM ${this.#cvr("instances")}
686
604
  WHERE "clientGroupID" = ${this.#id}
687
605
  FOR UPDATE`;
688
- const expected = versionString(expectedCurrentVersion);
689
- const { version: version2, owner, grantedAt } = result.length > 0 ? result[0] : {
690
- version: EMPTY_CVR_VERSION.stateVersion,
691
- owner: null,
692
- grantedAt: null
693
- };
694
- lc.debug?.(
695
- "checked cvr version and ownership in " + (Date.now() - start) + " ms"
696
- );
697
- if (owner !== this.#taskID && (grantedAt ?? 0) > lastConnectTime) {
698
- throw new OwnershipError(owner, grantedAt, lastConnectTime);
699
- }
700
- if (version2 !== expected) {
701
- throw new ConcurrentModificationException(expected, version2);
702
- }
703
- }
704
- async #flush(lc, expectedCurrentVersion, cvr, lastConnectTime) {
705
- const stats = {
706
- instances: 0,
707
- queries: 0,
708
- desires: 0,
709
- clients: 0,
710
- rows: 0,
711
- rowsDeferred: 0,
712
- statements: 0
713
- };
714
- if (this.#pendingRowRecordUpdates.size) {
715
- const existingRowRecords = await this.getRowRecords();
716
- this.#rowCount = existingRowRecords.size;
717
- for (const [id, row] of this.#pendingRowRecordUpdates.entries()) {
718
- if (this.#forceUpdates.has(id)) {
719
- continue;
720
- }
721
- const existing = existingRowRecords.get(id);
722
- if (
723
- // Don't delete or add an unreferenced row if it's not in the CVR.
724
- existing === void 0 && !row?.refCounts || // Don't write a row record that exactly matches what's in the CVR.
725
- deepEqual(
726
- row ?? void 0,
727
- existing
728
- )
729
- ) {
730
- this.#pendingRowRecordUpdates.delete(id);
731
- }
732
- }
733
- }
734
- if (this.#pendingRowRecordUpdates.size === 0 && this.#writes.size === 0 && this.#pendingInstanceWrite === void 0 && this.#pendingQueryUpdates.size === 0 && this.#pendingQueryPartialUpdates.size === 0 && this.#pendingDesireUpdates.size === 0) {
735
- return null;
736
- }
737
- this.putInstance(cvr);
738
- const start = Date.now();
739
- lc.debug?.("flush tx beginning");
740
- const results = await runTx(
741
- this.#db,
742
- async (tx) => {
743
- lc.debug?.(`flush tx begun after ${Date.now() - start} ms`);
744
- await this.#checkVersionAndOwnership(
745
- lc,
746
- tx,
747
- expectedCurrentVersion,
748
- lastConnectTime
749
- );
750
- const writeQueries = [];
751
- if (this.#pendingInstanceWrite) {
752
- writeQueries.push(this.#pendingInstanceWrite(tx, lastConnectTime));
753
- stats.instances++;
754
- stats.statements++;
755
- }
756
- for (const write of this.#writes) {
757
- stats.clients += write.stats.clients ?? 0;
758
- stats.rows += write.stats.rows ?? 0;
759
- writeQueries.push(write.write(tx, lastConnectTime));
760
- stats.statements++;
761
- }
762
- const hasQueryUpdates = this.#pendingQueryUpdates.size > 0 || this.#pendingQueryPartialUpdates.size > 0;
763
- const desireFlush = this.#flushDesires(tx, lc);
764
- let queryFlushes = [];
765
- if (hasQueryUpdates) {
766
- queryFlushes = this.#flushQueries(tx, lc);
767
- const partialOnlyCount = Array.from(
768
- this.#pendingQueryPartialUpdates.keys()
769
- ).filter((key) => !this.#pendingQueryUpdates.has(key)).length;
770
- stats.queries = this.#pendingQueryUpdates.size + partialOnlyCount;
771
- stats.statements += (this.#pendingQueryUpdates.size > 0 ? 1 : 0) + (partialOnlyCount > 0 ? 1 : 0);
772
- if (desireFlush) {
773
- stats.desires = this.#pendingDesireUpdates.size;
774
- stats.statements++;
775
- }
776
- } else if (desireFlush) {
777
- stats.desires = this.#pendingDesireUpdates.size;
778
- stats.statements++;
779
- }
780
- const rowUpdates = this.#rowCache.executeRowUpdates(
781
- tx,
782
- cvr.version,
783
- this.#pendingRowRecordUpdates,
784
- "allow-defer",
785
- lc
786
- );
787
- stats.statements += rowUpdates.length;
788
- const pipelined = [
789
- ...writeQueries,
790
- ...queryFlushes,
791
- ...desireFlush ? [desireFlush] : [],
792
- ...rowUpdates
793
- ];
794
- lc.debug?.(`returning ${pipelined.length} queries for pipelining`);
795
- return Promise.all(pipelined);
796
- },
797
- { mode: READ_COMMITTED }
798
- );
799
- lc.debug?.(`flush tx completed after ${Date.now() - start} ms`);
800
- const baseQueries = (this.#pendingInstanceWrite ? 1 : 0) + this.#writes.size + (this.#pendingQueryUpdates.size > 0 ? 1 : 0) + (Array.from(this.#pendingQueryPartialUpdates.keys()).filter(
801
- (key) => !this.#pendingQueryUpdates.has(key)
802
- ).length > 0 ? 1 : 0) + (this.#pendingDesireUpdates.size > 0 ? 1 : 0);
803
- const rowUpdateCount = results.length - baseQueries;
804
- const rowsFlushed = rowUpdateCount > 0;
805
- if (!rowsFlushed) {
806
- stats.rowsDeferred = this.#pendingRowRecordUpdates.size;
807
- } else {
808
- stats.rows += this.#pendingRowRecordUpdates.size;
809
- }
810
- this.#rowCount = await this.#rowCache.apply(
811
- this.#pendingRowRecordUpdates,
812
- cvr.version,
813
- rowsFlushed
814
- );
815
- recordRowsSynced(this.#rowCount);
816
- return stats;
817
- }
818
- get rowCount() {
819
- return this.#rowCount;
820
- }
821
- async flush(lc, expectedCurrentVersion, cvr, lastConnectTime) {
822
- const start = performance.now();
823
- lc = lc.withContext("cvrFlushID", flushCounter++);
824
- try {
825
- const stats = await this.#flush(
826
- lc,
827
- expectedCurrentVersion,
828
- cvr,
829
- lastConnectTime
830
- );
831
- if (stats) {
832
- const elapsed = performance.now() - start;
833
- lc.debug?.(
834
- `flushed cvr@${versionString(cvr.version)} ${JSON.stringify(stats)} in (${elapsed} ms)`
835
- );
836
- this.#rowCache.recordSyncFlushStats(stats, elapsed);
837
- }
838
- return stats;
839
- } catch (e) {
840
- this.#rowCache.clear();
841
- throw e;
842
- } finally {
843
- this.#writes.clear();
844
- this.#pendingInstanceWrite = void 0;
845
- this.#pendingRowRecordUpdates.clear();
846
- this.#forceUpdates.clear();
847
- this.#pendingQueryUpdates.clear();
848
- this.#pendingDesireUpdates.clear();
849
- this.#pendingQueryPartialUpdates.clear();
850
- }
851
- }
852
- hasPendingUpdates() {
853
- return this.#rowCache.hasPendingUpdates();
854
- }
855
- /** Resolves when all pending updates are flushed. */
856
- flushed(lc) {
857
- return this.#rowCache.flushed(lc);
858
- }
859
- async inspectQueries(lc, ttlClock, clientID) {
860
- const db = this.#db;
861
- const clientGroupID = this.#id;
862
- const reader = new TransactionPool(lc, READONLY).run(db);
863
- try {
864
- return await reader.processReadTask(
865
- (tx) => tx`
606
+ const expected = versionString(expectedCurrentVersion);
607
+ const { version, owner, grantedAt } = result.length > 0 ? result[0] : {
608
+ version: EMPTY_CVR_VERSION.stateVersion,
609
+ owner: null,
610
+ grantedAt: null
611
+ };
612
+ lc.debug?.("checked cvr version and ownership in " + (Date.now() - start) + " ms");
613
+ if (owner !== this.#taskID && (grantedAt ?? 0) > lastConnectTime) throw new OwnershipError(owner, grantedAt, lastConnectTime);
614
+ if (version !== expected) throw new ConcurrentModificationException(expected, version);
615
+ }
616
+ async #flush(lc, expectedCurrentVersion, cvr, lastConnectTime) {
617
+ const stats = {
618
+ instances: 0,
619
+ queries: 0,
620
+ desires: 0,
621
+ clients: 0,
622
+ rows: 0,
623
+ rowsDeferred: 0,
624
+ statements: 0
625
+ };
626
+ if (this.#pendingRowRecordUpdates.size) {
627
+ const existingRowRecords = await this.getRowRecords();
628
+ this.#rowCount = existingRowRecords.size;
629
+ for (const [id, row] of this.#pendingRowRecordUpdates.entries()) {
630
+ if (this.#forceUpdates.has(id)) continue;
631
+ const existing = existingRowRecords.get(id);
632
+ if (existing === void 0 && !row?.refCounts || deepEqual(row ?? void 0, existing)) this.#pendingRowRecordUpdates.delete(id);
633
+ }
634
+ }
635
+ if (this.#pendingRowRecordUpdates.size === 0 && this.#writes.size === 0 && this.#pendingInstanceWrite === void 0 && this.#pendingQueryUpdates.size === 0 && this.#pendingQueryPartialUpdates.size === 0 && this.#pendingDesireUpdates.size === 0) return null;
636
+ this.putInstance(cvr);
637
+ const start = Date.now();
638
+ lc.debug?.("flush tx beginning");
639
+ const results = await runTx(this.#db, async (tx) => {
640
+ lc.debug?.(`flush tx begun after ${Date.now() - start} ms`);
641
+ await this.#checkVersionAndOwnership(lc, tx, expectedCurrentVersion, lastConnectTime);
642
+ const writeQueries = [];
643
+ if (this.#pendingInstanceWrite) {
644
+ writeQueries.push(this.#pendingInstanceWrite(tx, lastConnectTime));
645
+ stats.instances++;
646
+ stats.statements++;
647
+ }
648
+ for (const write of this.#writes) {
649
+ stats.clients += write.stats.clients ?? 0;
650
+ stats.rows += write.stats.rows ?? 0;
651
+ writeQueries.push(write.write(tx, lastConnectTime));
652
+ stats.statements++;
653
+ }
654
+ const hasQueryUpdates = this.#pendingQueryUpdates.size > 0 || this.#pendingQueryPartialUpdates.size > 0;
655
+ const desireFlush = this.#flushDesires(tx, lc);
656
+ let queryFlushes = [];
657
+ if (hasQueryUpdates) {
658
+ queryFlushes = this.#flushQueries(tx, lc);
659
+ const partialOnlyCount = Array.from(this.#pendingQueryPartialUpdates.keys()).filter((key) => !this.#pendingQueryUpdates.has(key)).length;
660
+ stats.queries = this.#pendingQueryUpdates.size + partialOnlyCount;
661
+ stats.statements += (this.#pendingQueryUpdates.size > 0 ? 1 : 0) + (partialOnlyCount > 0 ? 1 : 0);
662
+ if (desireFlush) {
663
+ stats.desires = this.#pendingDesireUpdates.size;
664
+ stats.statements++;
665
+ }
666
+ } else if (desireFlush) {
667
+ stats.desires = this.#pendingDesireUpdates.size;
668
+ stats.statements++;
669
+ }
670
+ const rowUpdates = this.#rowCache.executeRowUpdates(tx, cvr.version, this.#pendingRowRecordUpdates, "allow-defer", lc);
671
+ stats.statements += rowUpdates.length;
672
+ const pipelined = [
673
+ ...writeQueries,
674
+ ...queryFlushes,
675
+ ...desireFlush ? [desireFlush] : [],
676
+ ...rowUpdates
677
+ ];
678
+ lc.debug?.(`returning ${pipelined.length} queries for pipelining`);
679
+ return Promise.all(pipelined);
680
+ }, { mode: READ_COMMITTED });
681
+ lc.debug?.(`flush tx completed after ${Date.now() - start} ms`);
682
+ const baseQueries = (this.#pendingInstanceWrite ? 1 : 0) + this.#writes.size + (this.#pendingQueryUpdates.size > 0 ? 1 : 0) + (Array.from(this.#pendingQueryPartialUpdates.keys()).filter((key) => !this.#pendingQueryUpdates.has(key)).length > 0 ? 1 : 0) + (this.#pendingDesireUpdates.size > 0 ? 1 : 0);
683
+ const rowsFlushed = results.length - baseQueries > 0;
684
+ if (!rowsFlushed) stats.rowsDeferred = this.#pendingRowRecordUpdates.size;
685
+ else stats.rows += this.#pendingRowRecordUpdates.size;
686
+ this.#rowCount = await this.#rowCache.apply(this.#pendingRowRecordUpdates, cvr.version, rowsFlushed);
687
+ recordRowsSynced(this.#rowCount);
688
+ return stats;
689
+ }
690
+ get rowCount() {
691
+ return this.#rowCount;
692
+ }
693
+ async flush(lc, expectedCurrentVersion, cvr, lastConnectTime) {
694
+ const start = performance.now();
695
+ lc = lc.withContext("cvrFlushID", flushCounter++);
696
+ try {
697
+ const stats = await this.#flush(lc, expectedCurrentVersion, cvr, lastConnectTime);
698
+ if (stats) {
699
+ const elapsed = performance.now() - start;
700
+ lc.info?.(`flushed cvr@${versionString(cvr.version)} ${JSON.stringify(stats)} in (${elapsed} ms)`);
701
+ this.#rowCache.recordSyncFlushStats(stats, elapsed);
702
+ }
703
+ return stats;
704
+ } catch (e) {
705
+ this.#rowCache.clear();
706
+ throw e;
707
+ } finally {
708
+ this.#writes.clear();
709
+ this.#pendingInstanceWrite = void 0;
710
+ this.#pendingRowRecordUpdates.clear();
711
+ this.#forceUpdates.clear();
712
+ this.#pendingQueryUpdates.clear();
713
+ this.#pendingDesireUpdates.clear();
714
+ this.#pendingQueryPartialUpdates.clear();
715
+ }
716
+ }
717
+ hasPendingUpdates() {
718
+ return this.#rowCache.hasPendingUpdates();
719
+ }
720
+ /** Resolves when all pending updates are flushed. */
721
+ flushed(lc) {
722
+ return this.#rowCache.flushed(lc);
723
+ }
724
+ async inspectQueries(lc, ttlClock, clientID) {
725
+ const db = this.#db;
726
+ const clientGroupID = this.#id;
727
+ const reader = new TransactionPool(lc, READONLY).run(db);
728
+ try {
729
+ return await reader.processReadTask((tx) => tx`
866
730
  SELECT DISTINCT ON (d."clientID", d."queryHash")
867
731
  d."clientID",
868
732
  d."queryHash" AS "queryID",
@@ -887,93 +751,76 @@ class CVRStore {
887
751
  AND d."ttlMs" IS NOT NULL
888
752
  AND (d."inactivatedAtMs" + d."ttlMs") <= ${ttlClockAsNumber(ttlClock)}
889
753
  )
890
- ORDER BY d."clientID", d."queryHash"`
891
- );
892
- } finally {
893
- reader.setDone();
894
- }
895
- }
896
- }
754
+ ORDER BY d."clientID", d."queryHash"`);
755
+ } finally {
756
+ reader.setDone();
757
+ }
758
+ }
759
+ };
760
+ /**
761
+ * This is similar to {@link CVRStore.#checkVersionAndOwnership} except
762
+ * that it only checks the version and is suitable for snapshot reads
763
+ * (i.e. by doing a plain `SELECT` rather than a `SELECT ... FOR UPDATE`).
764
+ */
897
765
  async function checkVersion(tx, schema, clientGroupID, expectedCurrentVersion) {
898
- const expected = versionString(expectedCurrentVersion);
899
- const result = await tx`
766
+ const expected = versionString(expectedCurrentVersion);
767
+ const result = await tx`
900
768
  SELECT version FROM ${tx(schema)}.instances
901
769
  WHERE "clientGroupID" = ${clientGroupID}`;
902
- const { version: version2 } = result.length > 0 ? result[0] : { version: EMPTY_CVR_VERSION.stateVersion };
903
- if (version2 !== expected) {
904
- throw new ConcurrentModificationException(expected, version2);
905
- }
906
- }
907
- class ClientNotFoundError extends ProtocolErrorWithLevel {
908
- constructor(message) {
909
- super(
910
- {
911
- kind: ClientNotFound,
912
- message,
913
- origin: ZeroCache
914
- },
915
- "warn"
916
- );
917
- }
918
- }
919
- class ConcurrentModificationException extends ProtocolErrorWithLevel {
920
- name = "ConcurrentModificationException";
921
- constructor(expectedVersion, actualVersion) {
922
- super(
923
- {
924
- kind: Internal,
925
- message: `CVR has been concurrently modified. Expected ${expectedVersion}, got ${actualVersion}`,
926
- origin: ZeroCache
927
- },
928
- "warn"
929
- );
930
- }
931
- }
932
- class OwnershipError extends ProtocolErrorWithLevel {
933
- name = "OwnershipError";
934
- constructor(owner, grantedAt, lastConnectTime) {
935
- super(
936
- {
937
- kind: Rehome,
938
- message: `CVR ownership was transferred to ${owner} at ${new Date(grantedAt ?? 0).toISOString()} (last connect time: ${new Date(lastConnectTime).toISOString()})`,
939
- maxBackoffMs: 0,
940
- origin: ZeroCache
941
- },
942
- "info"
943
- );
944
- }
770
+ const { version } = result.length > 0 ? result[0] : { version: EMPTY_CVR_VERSION.stateVersion };
771
+ if (version !== expected) throw new ConcurrentModificationException(expected, version);
945
772
  }
946
- class InvalidClientSchemaError extends ProtocolErrorWithLevel {
947
- name = "InvalidClientSchemaError";
948
- constructor(cause) {
949
- super(
950
- {
951
- kind: SchemaVersionNotSupported,
952
- message: `Could not parse clientSchema stored in CVR: ${String(cause)}`,
953
- origin: ZeroCache
954
- },
955
- "warn",
956
- { cause }
957
- );
958
- }
959
- }
960
- class RowsVersionBehindError extends Error {
961
- name = "RowsVersionBehindError";
962
- cvrVersion;
963
- rowsVersion;
964
- constructor(cvrVersion, rowsVersion) {
965
- super(`rowsVersion (${rowsVersion}) is behind CVR ${cvrVersion}`);
966
- this.cvrVersion = cvrVersion;
967
- this.rowsVersion = rowsVersion;
968
- }
969
- }
970
- export {
971
- CVRStore,
972
- ClientNotFoundError,
973
- ConcurrentModificationException,
974
- InvalidClientSchemaError,
975
- OwnershipError,
976
- RowsVersionBehindError,
977
- checkVersion
773
+ var ClientNotFoundError = class extends ProtocolErrorWithLevel {
774
+ constructor(message) {
775
+ super({
776
+ kind: ClientNotFound,
777
+ message,
778
+ origin: ZeroCache
779
+ }, "warn");
780
+ }
781
+ };
782
+ var ConcurrentModificationException = class extends ProtocolErrorWithLevel {
783
+ name = "ConcurrentModificationException";
784
+ constructor(expectedVersion, actualVersion) {
785
+ super({
786
+ kind: Internal,
787
+ message: `CVR has been concurrently modified. Expected ${expectedVersion}, got ${actualVersion}`,
788
+ origin: ZeroCache
789
+ }, "warn");
790
+ }
791
+ };
792
+ var OwnershipError = class extends ProtocolErrorWithLevel {
793
+ name = "OwnershipError";
794
+ constructor(owner, grantedAt, lastConnectTime) {
795
+ super({
796
+ kind: Rehome,
797
+ message: `CVR ownership was transferred to ${owner} at ${new Date(grantedAt ?? 0).toISOString()} (last connect time: ${new Date(lastConnectTime).toISOString()})`,
798
+ maxBackoffMs: 0,
799
+ origin: ZeroCache
800
+ }, "info");
801
+ }
802
+ };
803
+ var InvalidClientSchemaError = class extends ProtocolErrorWithLevel {
804
+ name = "InvalidClientSchemaError";
805
+ constructor(cause) {
806
+ super({
807
+ kind: SchemaVersionNotSupported,
808
+ message: `Could not parse clientSchema stored in CVR: ${String(cause)}`,
809
+ origin: ZeroCache
810
+ }, "warn", { cause });
811
+ }
812
+ };
813
+ var RowsVersionBehindError = class extends Error {
814
+ name = "RowsVersionBehindError";
815
+ cvrVersion;
816
+ rowsVersion;
817
+ constructor(cvrVersion, rowsVersion) {
818
+ super(`rowsVersion (${rowsVersion}) is behind CVR ${cvrVersion}`);
819
+ this.cvrVersion = cvrVersion;
820
+ this.rowsVersion = rowsVersion;
821
+ }
978
822
  };
979
- //# sourceMappingURL=cvr-store.js.map
823
+ //#endregion
824
+ export { CVRStore, ClientNotFoundError, checkVersion };
825
+
826
+ //# sourceMappingURL=cvr-store.js.map