@rocicorp/zero 0.26.0-canary.0 → 0.26.0-canary.3

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 (391) hide show
  1. package/README.md +1 -1
  2. package/out/replicache/src/persist/collect-idb-databases.d.ts +4 -4
  3. package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
  4. package/out/replicache/src/persist/collect-idb-databases.js +22 -19
  5. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
  6. package/out/replicache/src/persist/refresh.d.ts.map +1 -1
  7. package/out/replicache/src/persist/refresh.js +0 -8
  8. package/out/replicache/src/persist/refresh.js.map +1 -1
  9. package/out/replicache/src/process-scheduler.d.ts +23 -0
  10. package/out/replicache/src/process-scheduler.d.ts.map +1 -1
  11. package/out/replicache/src/process-scheduler.js +50 -1
  12. package/out/replicache/src/process-scheduler.js.map +1 -1
  13. package/out/replicache/src/replicache-impl.d.ts +8 -0
  14. package/out/replicache/src/replicache-impl.d.ts.map +1 -1
  15. package/out/replicache/src/replicache-impl.js +11 -2
  16. package/out/replicache/src/replicache-impl.js.map +1 -1
  17. package/out/shared/src/custom-key-map.d.ts +4 -4
  18. package/out/shared/src/custom-key-map.d.ts.map +1 -1
  19. package/out/shared/src/custom-key-map.js.map +1 -1
  20. package/out/shared/src/falsy.d.ts +3 -0
  21. package/out/shared/src/falsy.d.ts.map +1 -0
  22. package/out/shared/src/iterables.d.ts +6 -8
  23. package/out/shared/src/iterables.d.ts.map +1 -1
  24. package/out/shared/src/iterables.js +13 -7
  25. package/out/shared/src/iterables.js.map +1 -1
  26. package/out/shared/src/options.d.ts +1 -0
  27. package/out/shared/src/options.d.ts.map +1 -1
  28. package/out/shared/src/options.js +5 -1
  29. package/out/shared/src/options.js.map +1 -1
  30. package/out/zero/package.json.js +1 -1
  31. package/out/zero/src/adapters/drizzle.js +1 -2
  32. package/out/zero/src/adapters/prisma.d.ts +2 -0
  33. package/out/zero/src/adapters/prisma.d.ts.map +1 -0
  34. package/out/zero/src/adapters/prisma.js +6 -0
  35. package/out/zero/src/adapters/prisma.js.map +1 -0
  36. package/out/zero/src/pg.js +4 -7
  37. package/out/zero/src/react.js +3 -1
  38. package/out/zero/src/react.js.map +1 -1
  39. package/out/zero/src/server.js +5 -8
  40. package/out/zero/src/zero-cache-dev.js +7 -3
  41. package/out/zero/src/zero-cache-dev.js.map +1 -1
  42. package/out/zero-cache/src/auth/load-permissions.d.ts +3 -2
  43. package/out/zero-cache/src/auth/load-permissions.d.ts.map +1 -1
  44. package/out/zero-cache/src/auth/load-permissions.js +14 -8
  45. package/out/zero-cache/src/auth/load-permissions.js.map +1 -1
  46. package/out/zero-cache/src/auth/write-authorizer.d.ts +6 -0
  47. package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
  48. package/out/zero-cache/src/auth/write-authorizer.js +16 -3
  49. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  50. package/out/zero-cache/src/config/zero-config.d.ts +54 -9
  51. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  52. package/out/zero-cache/src/config/zero-config.js +80 -20
  53. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  54. package/out/zero-cache/src/custom/fetch.d.ts +3 -0
  55. package/out/zero-cache/src/custom/fetch.d.ts.map +1 -1
  56. package/out/zero-cache/src/custom/fetch.js +26 -0
  57. package/out/zero-cache/src/custom/fetch.js.map +1 -1
  58. package/out/zero-cache/src/db/lite-tables.js +1 -1
  59. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  60. package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
  61. package/out/zero-cache/src/db/migration-lite.js +9 -3
  62. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  63. package/out/zero-cache/src/db/migration.d.ts.map +1 -1
  64. package/out/zero-cache/src/db/migration.js +9 -3
  65. package/out/zero-cache/src/db/migration.js.map +1 -1
  66. package/out/zero-cache/src/db/specs.d.ts +4 -3
  67. package/out/zero-cache/src/db/specs.d.ts.map +1 -1
  68. package/out/zero-cache/src/db/specs.js +4 -1
  69. package/out/zero-cache/src/db/specs.js.map +1 -1
  70. package/out/zero-cache/src/db/transaction-pool.d.ts.map +1 -1
  71. package/out/zero-cache/src/db/transaction-pool.js +9 -3
  72. package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
  73. package/out/zero-cache/src/observability/events.d.ts.map +1 -1
  74. package/out/zero-cache/src/observability/events.js +15 -5
  75. package/out/zero-cache/src/observability/events.js.map +1 -1
  76. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  77. package/out/zero-cache/src/server/change-streamer.js +10 -2
  78. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  79. package/out/zero-cache/src/server/inspector-delegate.d.ts +1 -1
  80. package/out/zero-cache/src/server/inspector-delegate.d.ts.map +1 -1
  81. package/out/zero-cache/src/server/inspector-delegate.js +11 -30
  82. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
  83. package/out/zero-cache/src/server/main.js +1 -1
  84. package/out/zero-cache/src/server/main.js.map +1 -1
  85. package/out/zero-cache/src/server/priority-op.d.ts +8 -0
  86. package/out/zero-cache/src/server/priority-op.d.ts.map +1 -0
  87. package/out/zero-cache/src/server/priority-op.js +29 -0
  88. package/out/zero-cache/src/server/priority-op.js.map +1 -0
  89. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  90. package/out/zero-cache/src/server/syncer.js +10 -10
  91. package/out/zero-cache/src/server/syncer.js.map +1 -1
  92. package/out/zero-cache/src/services/analyze.js +1 -1
  93. package/out/zero-cache/src/services/analyze.js.map +1 -1
  94. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
  95. package/out/zero-cache/src/services/change-source/custom/change-source.js +4 -7
  96. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  97. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  98. package/out/zero-cache/src/services/change-source/pg/change-source.js +68 -13
  99. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  100. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  101. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +7 -2
  102. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  103. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts.map +1 -1
  104. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +7 -4
  105. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  106. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +125 -180
  107. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
  108. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +1 -10
  109. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
  110. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
  111. package/out/zero-cache/src/services/change-source/pg/schema/init.js +26 -12
  112. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  113. package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts +36 -90
  114. package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts.map +1 -1
  115. package/out/zero-cache/src/services/change-source/pg/schema/published.js +51 -14
  116. package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
  117. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +31 -36
  118. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
  119. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +25 -17
  120. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  121. package/out/zero-cache/src/services/change-source/pg/schema/validation.d.ts +2 -2
  122. package/out/zero-cache/src/services/change-source/pg/schema/validation.d.ts.map +1 -1
  123. package/out/zero-cache/src/services/change-source/pg/schema/validation.js +2 -4
  124. package/out/zero-cache/src/services/change-source/pg/schema/validation.js.map +1 -1
  125. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +158 -53
  126. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
  127. package/out/zero-cache/src/services/change-source/protocol/current/data.js +55 -10
  128. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  129. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +210 -72
  130. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
  131. package/out/zero-cache/src/services/change-source/protocol/current.js +4 -2
  132. package/out/zero-cache/src/services/change-source/replica-schema.d.ts.map +1 -1
  133. package/out/zero-cache/src/services/change-source/replica-schema.js +20 -4
  134. package/out/zero-cache/src/services/change-source/replica-schema.js.map +1 -1
  135. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +1 -1
  136. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  137. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +6 -4
  138. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  139. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +71 -25
  140. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
  141. package/out/zero-cache/src/services/change-streamer/change-streamer.js +1 -1
  142. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  143. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +1 -0
  144. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
  145. package/out/zero-cache/src/services/change-streamer/schema/tables.js +6 -5
  146. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  147. package/out/zero-cache/src/services/change-streamer/storer.d.ts +1 -1
  148. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  149. package/out/zero-cache/src/services/change-streamer/storer.js +17 -6
  150. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  151. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +2 -0
  152. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
  153. package/out/zero-cache/src/services/change-streamer/subscriber.js +14 -1
  154. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  155. package/out/zero-cache/src/services/heapz.d.ts.map +1 -1
  156. package/out/zero-cache/src/services/heapz.js +1 -0
  157. package/out/zero-cache/src/services/heapz.js.map +1 -1
  158. package/out/zero-cache/src/services/life-cycle.d.ts +1 -1
  159. package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
  160. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  161. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  162. package/out/zero-cache/src/services/litestream/commands.js +3 -1
  163. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  164. package/out/zero-cache/src/services/litestream/config.yml +1 -0
  165. package/out/zero-cache/src/services/mutagen/error.d.ts.map +1 -1
  166. package/out/zero-cache/src/services/mutagen/error.js +4 -1
  167. package/out/zero-cache/src/services/mutagen/error.js.map +1 -1
  168. package/out/zero-cache/src/services/mutagen/mutagen.d.ts +4 -4
  169. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  170. package/out/zero-cache/src/services/mutagen/mutagen.js +10 -24
  171. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  172. package/out/zero-cache/src/services/mutagen/pusher.d.ts +8 -6
  173. package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
  174. package/out/zero-cache/src/services/mutagen/pusher.js +130 -19
  175. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  176. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
  177. package/out/zero-cache/src/services/replicator/change-processor.js +24 -31
  178. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  179. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts +4 -4
  180. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts.map +1 -1
  181. package/out/zero-cache/src/services/replicator/schema/change-log.js +38 -36
  182. package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -1
  183. package/out/zero-cache/src/services/{change-source → replicator/schema}/column-metadata.d.ts +3 -3
  184. package/out/zero-cache/src/services/replicator/schema/column-metadata.d.ts.map +1 -0
  185. package/out/zero-cache/src/services/{change-source → replicator/schema}/column-metadata.js +3 -3
  186. package/out/zero-cache/src/services/replicator/schema/column-metadata.js.map +1 -0
  187. package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts.map +1 -1
  188. package/out/zero-cache/src/services/replicator/schema/replication-state.js +3 -1
  189. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
  190. package/out/zero-cache/src/services/run-ast.js +1 -1
  191. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  192. package/out/zero-cache/src/services/statz.d.ts.map +1 -1
  193. package/out/zero-cache/src/services/statz.js +1 -0
  194. package/out/zero-cache/src/services/statz.js.map +1 -1
  195. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +5 -6
  196. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
  197. package/out/zero-cache/src/services/view-syncer/client-handler.js +5 -23
  198. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  199. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +1 -1
  200. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  201. package/out/zero-cache/src/services/view-syncer/cvr-store.js +65 -44
  202. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  203. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +0 -1
  204. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  205. package/out/zero-cache/src/services/view-syncer/cvr.js +23 -6
  206. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  207. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +14 -22
  208. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  209. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +46 -67
  210. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  211. package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts +1 -1
  212. package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts.map +1 -1
  213. package/out/zero-cache/src/services/view-syncer/row-record-cache.js +22 -11
  214. package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
  215. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +0 -2
  216. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  217. package/out/zero-cache/src/services/view-syncer/snapshotter.js +3 -11
  218. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  219. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +6 -4
  220. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  221. package/out/zero-cache/src/services/view-syncer/view-syncer.js +216 -243
  222. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  223. package/out/zero-cache/src/types/lexi-version.d.ts.map +1 -1
  224. package/out/zero-cache/src/types/lexi-version.js +4 -1
  225. package/out/zero-cache/src/types/lexi-version.js.map +1 -1
  226. package/out/zero-cache/src/types/lite.d.ts.map +1 -1
  227. package/out/zero-cache/src/types/lite.js +8 -2
  228. package/out/zero-cache/src/types/lite.js.map +1 -1
  229. package/out/zero-cache/src/types/shards.js +1 -1
  230. package/out/zero-cache/src/types/shards.js.map +1 -1
  231. package/out/zero-cache/src/types/sql.d.ts +5 -0
  232. package/out/zero-cache/src/types/sql.d.ts.map +1 -1
  233. package/out/zero-cache/src/types/sql.js +5 -1
  234. package/out/zero-cache/src/types/sql.js.map +1 -1
  235. package/out/zero-cache/src/types/subscription.js +1 -1
  236. package/out/zero-cache/src/types/subscription.js.map +1 -1
  237. package/out/zero-cache/src/workers/connect-params.d.ts +1 -1
  238. package/out/zero-cache/src/workers/connect-params.d.ts.map +1 -1
  239. package/out/zero-cache/src/workers/connect-params.js +2 -3
  240. package/out/zero-cache/src/workers/connect-params.js.map +1 -1
  241. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
  242. package/out/zero-cache/src/workers/replicator.js +2 -5
  243. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  244. package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +1 -1
  245. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +15 -10
  246. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  247. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  248. package/out/zero-cache/src/workers/syncer.js +17 -10
  249. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  250. package/out/zero-client/src/client/connection-manager.d.ts +8 -0
  251. package/out/zero-client/src/client/connection-manager.d.ts.map +1 -1
  252. package/out/zero-client/src/client/connection-manager.js +33 -0
  253. package/out/zero-client/src/client/connection-manager.js.map +1 -1
  254. package/out/zero-client/src/client/connection.d.ts.map +1 -1
  255. package/out/zero-client/src/client/connection.js +6 -3
  256. package/out/zero-client/src/client/connection.js.map +1 -1
  257. package/out/zero-client/src/client/context.js +1 -0
  258. package/out/zero-client/src/client/context.js.map +1 -1
  259. package/out/zero-client/src/client/error.js +1 -1
  260. package/out/zero-client/src/client/error.js.map +1 -1
  261. package/out/zero-client/src/client/mutator-proxy.d.ts.map +1 -1
  262. package/out/zero-client/src/client/mutator-proxy.js +15 -1
  263. package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
  264. package/out/zero-client/src/client/options.d.ts +11 -1
  265. package/out/zero-client/src/client/options.d.ts.map +1 -1
  266. package/out/zero-client/src/client/options.js.map +1 -1
  267. package/out/zero-client/src/client/query-manager.d.ts +4 -0
  268. package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
  269. package/out/zero-client/src/client/query-manager.js +7 -0
  270. package/out/zero-client/src/client/query-manager.js.map +1 -1
  271. package/out/zero-client/src/client/version.js +1 -1
  272. package/out/zero-client/src/client/zero.d.ts +5 -5
  273. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  274. package/out/zero-client/src/client/zero.js +53 -8
  275. package/out/zero-client/src/client/zero.js.map +1 -1
  276. package/out/zero-client/src/mod.d.ts +1 -0
  277. package/out/zero-client/src/mod.d.ts.map +1 -1
  278. package/out/zero-protocol/src/connect.d.ts +4 -0
  279. package/out/zero-protocol/src/connect.d.ts.map +1 -1
  280. package/out/zero-protocol/src/connect.js +3 -1
  281. package/out/zero-protocol/src/connect.js.map +1 -1
  282. package/out/zero-protocol/src/protocol-version.d.ts +1 -1
  283. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
  284. package/out/zero-protocol/src/protocol-version.js +1 -1
  285. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  286. package/out/zero-protocol/src/push.d.ts +16 -0
  287. package/out/zero-protocol/src/push.d.ts.map +1 -1
  288. package/out/zero-protocol/src/push.js +25 -1
  289. package/out/zero-protocol/src/push.js.map +1 -1
  290. package/out/zero-protocol/src/up.d.ts +2 -0
  291. package/out/zero-protocol/src/up.d.ts.map +1 -1
  292. package/out/zero-react/src/mod.d.ts +3 -1
  293. package/out/zero-react/src/mod.d.ts.map +1 -1
  294. package/out/zero-react/src/paging-reducer.d.ts +61 -0
  295. package/out/zero-react/src/paging-reducer.d.ts.map +1 -0
  296. package/out/zero-react/src/paging-reducer.js +77 -0
  297. package/out/zero-react/src/paging-reducer.js.map +1 -0
  298. package/out/zero-react/src/use-query.d.ts +11 -1
  299. package/out/zero-react/src/use-query.d.ts.map +1 -1
  300. package/out/zero-react/src/use-query.js +13 -11
  301. package/out/zero-react/src/use-query.js.map +1 -1
  302. package/out/zero-react/src/use-rows.d.ts +39 -0
  303. package/out/zero-react/src/use-rows.d.ts.map +1 -0
  304. package/out/zero-react/src/use-rows.js +130 -0
  305. package/out/zero-react/src/use-rows.js.map +1 -0
  306. package/out/zero-react/src/use-zero-virtualizer.d.ts +122 -0
  307. package/out/zero-react/src/use-zero-virtualizer.d.ts.map +1 -0
  308. package/out/zero-react/src/use-zero-virtualizer.js +342 -0
  309. package/out/zero-react/src/use-zero-virtualizer.js.map +1 -0
  310. package/out/zero-react/src/zero-provider.js +1 -1
  311. package/out/zero-react/src/zero-provider.js.map +1 -1
  312. package/out/zero-server/src/adapters/drizzle.d.ts +18 -18
  313. package/out/zero-server/src/adapters/drizzle.d.ts.map +1 -1
  314. package/out/zero-server/src/adapters/drizzle.js +8 -22
  315. package/out/zero-server/src/adapters/drizzle.js.map +1 -1
  316. package/out/zero-server/src/adapters/pg.d.ts +19 -13
  317. package/out/zero-server/src/adapters/pg.d.ts.map +1 -1
  318. package/out/zero-server/src/adapters/pg.js.map +1 -1
  319. package/out/zero-server/src/adapters/postgresjs.d.ts +19 -13
  320. package/out/zero-server/src/adapters/postgresjs.d.ts.map +1 -1
  321. package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
  322. package/out/zero-server/src/adapters/prisma.d.ts +66 -0
  323. package/out/zero-server/src/adapters/prisma.d.ts.map +1 -0
  324. package/out/zero-server/src/adapters/prisma.js +63 -0
  325. package/out/zero-server/src/adapters/prisma.js.map +1 -0
  326. package/out/zero-server/src/custom.js +1 -15
  327. package/out/zero-server/src/custom.js.map +1 -1
  328. package/out/zero-server/src/mod.d.ts +9 -8
  329. package/out/zero-server/src/mod.d.ts.map +1 -1
  330. package/out/zero-server/src/process-mutations.d.ts +2 -1
  331. package/out/zero-server/src/process-mutations.d.ts.map +1 -1
  332. package/out/zero-server/src/process-mutations.js +39 -4
  333. package/out/zero-server/src/process-mutations.js.map +1 -1
  334. package/out/zero-server/src/push-processor.js +1 -1
  335. package/out/zero-server/src/push-processor.js.map +1 -1
  336. package/out/zero-server/src/schema.d.ts.map +1 -1
  337. package/out/zero-server/src/schema.js +4 -1
  338. package/out/zero-server/src/schema.js.map +1 -1
  339. package/out/zero-server/src/zql-database.d.ts.map +1 -1
  340. package/out/zero-server/src/zql-database.js +18 -0
  341. package/out/zero-server/src/zql-database.js.map +1 -1
  342. package/out/zero-solid/src/mod.d.ts +1 -1
  343. package/out/zero-solid/src/mod.d.ts.map +1 -1
  344. package/out/zero-solid/src/solid-view.js +1 -0
  345. package/out/zero-solid/src/solid-view.js.map +1 -1
  346. package/out/zero-solid/src/use-query.d.ts +10 -1
  347. package/out/zero-solid/src/use-query.d.ts.map +1 -1
  348. package/out/zero-solid/src/use-query.js +22 -5
  349. package/out/zero-solid/src/use-query.js.map +1 -1
  350. package/out/zero-solid/src/use-zero.js +1 -1
  351. package/out/zero-solid/src/use-zero.js.map +1 -1
  352. package/out/zql/src/ivm/constraint.d.ts.map +1 -1
  353. package/out/zql/src/ivm/constraint.js +4 -1
  354. package/out/zql/src/ivm/constraint.js.map +1 -1
  355. package/out/zql/src/ivm/exists.d.ts.map +1 -1
  356. package/out/zql/src/ivm/exists.js +4 -1
  357. package/out/zql/src/ivm/exists.js.map +1 -1
  358. package/out/zql/src/ivm/join-utils.d.ts.map +1 -1
  359. package/out/zql/src/ivm/join-utils.js +8 -2
  360. package/out/zql/src/ivm/join-utils.js.map +1 -1
  361. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  362. package/out/zql/src/ivm/memory-source.js +12 -3
  363. package/out/zql/src/ivm/memory-source.js.map +1 -1
  364. package/out/zql/src/ivm/push-accumulated.d.ts.map +1 -1
  365. package/out/zql/src/ivm/push-accumulated.js +25 -2
  366. package/out/zql/src/ivm/push-accumulated.js.map +1 -1
  367. package/out/zql/src/ivm/stream.d.ts.map +1 -1
  368. package/out/zql/src/ivm/stream.js +1 -1
  369. package/out/zql/src/ivm/stream.js.map +1 -1
  370. package/out/zql/src/ivm/take.d.ts.map +1 -1
  371. package/out/zql/src/ivm/take.js +24 -6
  372. package/out/zql/src/ivm/take.js.map +1 -1
  373. package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
  374. package/out/zql/src/ivm/union-fan-in.js +12 -3
  375. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  376. package/out/zql/src/mutate/mutator.js +4 -4
  377. package/out/zql/src/mutate/mutator.js.map +1 -1
  378. package/out/zql/src/query/create-builder.js +3 -5
  379. package/out/zql/src/query/create-builder.js.map +1 -1
  380. package/out/zql/src/query/query-registry.js +4 -4
  381. package/out/zql/src/query/query-registry.js.map +1 -1
  382. package/out/zqlite/src/table-source.d.ts.map +1 -1
  383. package/out/zqlite/src/table-source.js +1 -2
  384. package/out/zqlite/src/table-source.js.map +1 -1
  385. package/package.json +8 -4
  386. package/out/zero-cache/src/services/change-source/column-metadata.d.ts.map +0 -1
  387. package/out/zero-cache/src/services/change-source/column-metadata.js.map +0 -1
  388. package/out/zero-cache/src/types/schema-versions.d.ts +0 -12
  389. package/out/zero-cache/src/types/schema-versions.d.ts.map +0 -1
  390. package/out/zero-cache/src/types/schema-versions.js +0 -28
  391. package/out/zero-cache/src/types/schema-versions.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client-handler.js","sources":["../../../../../../zero-cache/src/services/view-syncer/client-handler.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport {assert, unreachable} from '../../../../shared/src/asserts.ts';\nimport type {JSONObject} from '../../../../shared/src/bigint-json.ts';\nimport {\n assertJSONValue,\n type JSONObject as SafeJSONObject,\n} from '../../../../shared/src/json.ts';\nimport {promiseVoid} from '../../../../shared/src/resolved-promises.ts';\nimport * as v from '../../../../shared/src/valita.ts';\nimport type {Writable} from '../../../../shared/src/writable.ts';\nimport {rowSchema} from '../../../../zero-protocol/src/data.ts';\nimport type {DeleteClientsBody} from '../../../../zero-protocol/src/delete-clients.ts';\nimport type {Downstream} from '../../../../zero-protocol/src/down.ts';\nimport type {InspectDownBody} from '../../../../zero-protocol/src/inspect-down.ts';\nimport type {\n PokePartBody,\n PokeStartBody,\n} from '../../../../zero-protocol/src/poke.ts';\nimport {primaryKeyValueRecordSchema} from '../../../../zero-protocol/src/primary-key.ts';\nimport {mutationResultSchema} from '../../../../zero-protocol/src/push.ts';\nimport type {RowPatchOp} from '../../../../zero-protocol/src/row-patch.ts';\nimport {\n getOrCreateCounter,\n getOrCreateHistogram,\n} from '../../observability/metrics.ts';\nimport {\n getLogLevel,\n wrapWithProtocolError,\n} from '../../types/error-with-level.ts';\nimport {\n getProtocolErrorIfSchemaVersionNotSupported,\n type SchemaVersions,\n} from '../../types/schema-versions.ts';\nimport {upstreamSchema, type ShardID} from '../../types/shards.ts';\nimport type {Subscription} from '../../types/subscription.ts';\nimport {\n cmpVersions,\n cookieToVersion,\n versionToCookie,\n versionToNullableCookie,\n type CVRVersion,\n type DelQueryPatch,\n type NullableCVRVersion,\n type PutQueryPatch,\n type RowID,\n} from './schema/types.ts';\nimport type {ErroredQuery} from '../../../../zero-protocol/src/custom-queries.ts';\nimport {\n ProtocolError,\n type TransformFailedBody,\n} from '../../../../zero-protocol/src/error.ts';\n\nexport type PutRowPatch = {\n type: 'row';\n op: 'put';\n id: RowID;\n contents: JSONObject;\n};\n\nexport type DeleteRowPatch = {\n type: 'row';\n op: 'del';\n id: RowID;\n};\n\nexport type RowPatch = PutRowPatch | DeleteRowPatch;\nexport type ConfigPatch = DelQueryPatch | PutQueryPatch;\n\nexport type Patch = ConfigPatch | RowPatch;\n\nexport type PatchToVersion = {\n patch: Patch;\n toVersion: CVRVersion;\n};\n\nexport interface PokeHandler {\n addPatch(patch: PatchToVersion): Promise<void>;\n cancel(): Promise<void>;\n end(finalVersion: CVRVersion): Promise<void>;\n}\n\nconst NOOP: PokeHandler = {\n addPatch: () => promiseVoid,\n cancel: () => promiseVoid,\n end: () => promiseVoid,\n};\n\n/** Wraps PokeHandlers for multiple clients in a single PokeHandler. */\nexport function startPoke(\n clients: ClientHandler[],\n tentativeVersion: CVRVersion,\n schemaVersions?: SchemaVersions, // absent for config-only pokes\n): PokeHandler {\n const pokers = clients.map(c =>\n c.startPoke(tentativeVersion, schemaVersions),\n );\n\n // Promise.allSettled() ensures that a failed (e.g. disconnected) client\n // does not prevent other clients from receiving the pokes. However, the\n // rate (per client group) will be limited by the slowest connection.\n return {\n addPatch: async patch => {\n await Promise.allSettled(pokers.map(poker => poker.addPatch(patch)));\n },\n cancel: async () => {\n await Promise.allSettled(pokers.map(poker => poker.cancel()));\n },\n end: async finalVersion => {\n await Promise.allSettled(pokers.map(poker => poker.end(finalVersion)));\n },\n };\n}\n\n// Semi-arbitrary threshold at which poke body parts are flushed.\n// When row size is being computed, that should be used as a threshold instead.\nconst PART_COUNT_FLUSH_THRESHOLD = 100;\n\n/**\n * Handles a single `ViewSyncer` connection.\n */\nexport class ClientHandler {\n readonly #clientGroupID: string;\n readonly clientID: string;\n readonly wsID: string;\n readonly #zeroClientsTable: string;\n readonly #zeroMutationsTable: string;\n readonly #lc: LogContext;\n readonly #downstream: Subscription<Downstream>;\n #baseVersion: NullableCVRVersion;\n readonly #schemaVersion: number | null;\n\n readonly #pokeTime = getOrCreateHistogram('sync', 'poke.time', {\n description:\n 'Time elapsed for each poke transaction. Canceled / noop pokes are excluded.',\n unit: 's',\n });\n\n readonly #pokeTransactions = getOrCreateCounter(\n 'sync',\n 'poke.transactions',\n 'Count of poke transactions.',\n );\n\n readonly #pokedRows = getOrCreateCounter(\n 'sync',\n 'poke.rows',\n 'Count of poked rows.',\n );\n\n constructor(\n lc: LogContext,\n clientGroupID: string,\n clientID: string,\n wsID: string,\n shard: ShardID,\n baseCookie: string | null,\n schemaVersion: number | null,\n downstream: Subscription<Downstream>,\n ) {\n lc.debug?.('new client handler');\n this.#clientGroupID = clientGroupID;\n this.clientID = clientID;\n this.wsID = wsID;\n this.#zeroClientsTable = `${upstreamSchema(shard)}.clients`;\n this.#zeroMutationsTable = `${upstreamSchema(shard)}.mutations`;\n this.#lc = lc;\n this.#downstream = downstream;\n this.#baseVersion = cookieToVersion(baseCookie);\n this.#schemaVersion = schemaVersion;\n }\n\n version(): NullableCVRVersion {\n return this.#baseVersion;\n }\n\n async #push(msg: Downstream): Promise<void> {\n const {result} = this.#downstream.push(msg);\n await result;\n }\n\n fail(e: unknown) {\n this.#lc[getLogLevel(e)]?.(\n `view-syncer closing connection with error: ${String(e)}`,\n e,\n );\n this.#downstream.fail(wrapWithProtocolError(e));\n }\n\n close(reason: string) {\n this.#lc.debug?.(`view-syncer closing connection: ${reason}`);\n this.#downstream.cancel();\n }\n\n startPoke(\n tentativeVersion: CVRVersion,\n schemaVersions?: SchemaVersions, // absent for config-only pokes\n ): PokeHandler {\n const pokeID = versionToCookie(tentativeVersion);\n const lc = this.#lc.withContext('pokeID', pokeID);\n\n if (schemaVersions && this.#schemaVersion) {\n const schemaVersionError = getProtocolErrorIfSchemaVersionNotSupported(\n this.#schemaVersion,\n schemaVersions,\n );\n\n if (schemaVersionError) {\n this.fail(schemaVersionError);\n return NOOP;\n }\n }\n\n if (cmpVersions(this.#baseVersion, tentativeVersion) >= 0) {\n lc.info?.(`already caught up, not sending poke.`);\n return NOOP;\n }\n\n const baseCookie = versionToNullableCookie(this.#baseVersion);\n const cookie = versionToCookie(tentativeVersion);\n lc.info?.(`starting poke from ${baseCookie} to ${cookie}`);\n\n const start = performance.now();\n\n const pokeStart: PokeStartBody = {pokeID, baseCookie};\n if (schemaVersions) {\n pokeStart.schemaVersions = schemaVersions;\n }\n\n let pokeStarted = false;\n let body: PokePartBody | undefined;\n let partCount = 0;\n const ensureBody = async () => {\n if (!pokeStarted) {\n await this.#push(['pokeStart', pokeStart]);\n pokeStarted = true;\n }\n return (body ??= {pokeID});\n };\n const flushBody = async () => {\n if (body) {\n await this.#push(['pokePart', body]);\n body = undefined;\n partCount = 0;\n }\n };\n\n const addPatch = async (patchToVersion: PatchToVersion) => {\n const {patch, toVersion} = patchToVersion;\n if (cmpVersions(toVersion, this.#baseVersion) <= 0) {\n return;\n }\n const body = await ensureBody();\n\n const {type, op} = patch;\n switch (type) {\n case 'query': {\n const patches = patch.clientID\n ? ((body.desiredQueriesPatches ??= {})[patch.clientID] ??= [])\n : (body.gotQueriesPatch ??= []);\n if (op === 'put') {\n patches.push({op, hash: patch.id});\n } else {\n patches.push({op, hash: patch.id});\n }\n break;\n }\n case 'row':\n if (patch.id.table === this.#zeroClientsTable) {\n this.#updateLMIDs((body.lastMutationIDChanges ??= {}), patch);\n } else if (patch.id.table === this.#zeroMutationsTable) {\n const patches = (body.mutationsPatch ??= []);\n if (op === 'put') {\n const row = v.parse(\n ensureSafeJSON(patch.contents),\n mutationRowSchema,\n 'passthrough',\n );\n patches.push({\n op: 'put',\n mutation: {\n id: {\n clientID: row.clientID,\n id: row.mutationID,\n },\n result: row.result,\n },\n });\n } else {\n const {clientID, mutationID} = patch.id.rowKey;\n assert(\n typeof clientID === 'string',\n 'client id must be a string',\n );\n const id = Number(mutationID);\n assert(\n !Number.isNaN(id) && Number.isFinite(id) && id >= 0,\n 'mutation id must be a finite number',\n );\n patches.push({\n op: 'del',\n id: {\n clientID,\n id,\n },\n });\n }\n } else {\n (body.rowsPatch ??= []).push(makeRowPatch(patch));\n }\n break;\n default:\n unreachable(patch);\n }\n\n if (++partCount >= PART_COUNT_FLUSH_THRESHOLD) {\n await flushBody();\n }\n };\n\n return {\n addPatch: async (patchToVersion: PatchToVersion) => {\n try {\n await addPatch(patchToVersion);\n if (patchToVersion.patch.type === 'row') {\n this.#pokedRows.add(1);\n }\n } catch (e) {\n this.#downstream.fail(wrapWithProtocolError(e));\n }\n },\n\n cancel: async () => {\n if (pokeStarted) {\n await this.#push(['pokeEnd', {pokeID, cookie: '', cancel: true}]);\n }\n },\n\n end: async (finalVersion: CVRVersion) => {\n const cookie = versionToCookie(finalVersion);\n if (!pokeStarted) {\n if (cmpVersions(this.#baseVersion, finalVersion) === 0) {\n return; // Nothing changed and nothing was sent.\n }\n await this.#push(['pokeStart', pokeStart]);\n } else if (cmpVersions(this.#baseVersion, finalVersion) >= 0) {\n // Sanity check: If the poke was started, the finalVersion\n // must be > #baseVersion.\n throw new Error(\n `Patches were sent but finalVersion ${finalVersion} is ` +\n `not greater than baseVersion ${this.#baseVersion}`,\n );\n }\n await flushBody();\n await this.#push(['pokeEnd', {pokeID, cookie}]);\n this.#baseVersion = finalVersion;\n\n const elapsed = performance.now() - start;\n this.#pokeTransactions.add(1);\n this.#pokeTime.record(elapsed / 1000);\n },\n };\n }\n\n async sendDeleteClients(\n lc: LogContext,\n deletedClientIDs: string[],\n deletedClientGroupIDs: string[],\n ) {\n const deleteClientsBody: Writable<DeleteClientsBody> = {};\n if (deletedClientIDs.length > 0) {\n deleteClientsBody.clientIDs = deletedClientIDs;\n }\n if (deletedClientGroupIDs.length > 0) {\n deleteClientsBody.clientGroupIDs = deletedClientGroupIDs;\n }\n lc.debug?.('sending deleteClients', deleteClientsBody);\n await this.#push(['deleteClients', deleteClientsBody]);\n }\n\n sendQueryTransformApplicationErrors(errors: ErroredQuery[]) {\n void this.#push(['transformError', errors]);\n }\n\n sendQueryTransformFailedError(error: TransformFailedBody) {\n this.fail(new ProtocolError(error));\n }\n\n sendInspectResponse(lc: LogContext, response: InspectDownBody): void {\n lc.debug?.('sending inspect response', response);\n this.#downstream.push(['inspect', response]);\n }\n\n #updateLMIDs(lmids: Record<string, number>, patch: RowPatch) {\n if (patch.op === 'put') {\n const row = ensureSafeJSON(patch.contents);\n const {clientGroupID, clientID, lastMutationID} = v.parse(\n row,\n lmidRowSchema,\n 'passthrough',\n );\n if (clientGroupID !== this.#clientGroupID) {\n this.#lc.error?.(\n `Received clients row for wrong clientGroupID. Ignoring.`,\n clientGroupID,\n );\n } else {\n lmids[clientID] = lastMutationID;\n }\n } else {\n // The 'constrain' and 'del' ops for clients can be ignored.\n patch.op satisfies 'constrain' | 'del';\n }\n }\n}\n\n// Note: The {APP_ID}_{SHARD_ID}.clients table is set up in replicator/initial-sync.ts.\nconst lmidRowSchema = v.object({\n clientGroupID: v.string(),\n clientID: v.string(),\n lastMutationID: v.number(), // Actually returned as a bigint, but converted by ensureSafeJSON().\n});\n\nconst mutationRowSchema = v.object({\n clientGroupID: v.string(),\n clientID: v.string(),\n mutationID: v.number(),\n result: mutationResultSchema,\n});\n\nfunction makeRowPatch(patch: RowPatch): RowPatchOp {\n const {\n op,\n id: {table: tableName, rowKey: id},\n } = patch;\n\n switch (op) {\n case 'put':\n return {\n op: 'put',\n tableName,\n value: v.parse(ensureSafeJSON(patch.contents), rowSchema),\n };\n\n case 'del':\n return {\n op,\n tableName,\n id: v.parse(id, primaryKeyValueRecordSchema),\n };\n\n default:\n unreachable(op);\n }\n}\n\n/**\n * Column values of type INT8 are returned as the `bigint` from the\n * Postgres library. These are converted to `number` if they are within\n * the safe Number range, allowing the protocol to support numbers larger\n * than 32-bits. Values outside of the safe number range (e.g. > 2^53) will\n * result in an Error.\n */\nexport function ensureSafeJSON(row: JSONObject): SafeJSONObject {\n const modified = Object.entries(row)\n .filter(([k, v]) => {\n if (typeof v === 'bigint') {\n if (v >= Number.MIN_SAFE_INTEGER && v <= Number.MAX_SAFE_INTEGER) {\n return true; // send this entry onto the next map() step.\n }\n throw new Error(`Value of \"${k}\" exceeds safe Number range (${v})`);\n } else if (typeof v === 'object') {\n assertJSONValue(v);\n }\n return false;\n })\n .map(([k, v]) => [k, Number(v)]);\n\n return modified.length\n ? {...row, ...Object.fromEntries(modified)}\n : (row as SafeJSONObject);\n}\n"],"names":["body","v.parse","cookie","v.object","v.string","v.number","v"],"mappings":"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"}
1
+ {"version":3,"file":"client-handler.js","sources":["../../../../../../zero-cache/src/services/view-syncer/client-handler.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport {assert, unreachable} from '../../../../shared/src/asserts.ts';\nimport type {JSONObject} from '../../../../shared/src/bigint-json.ts';\nimport {\n assertJSONValue,\n type JSONObject as SafeJSONObject,\n} from '../../../../shared/src/json.ts';\nimport {promiseVoid} from '../../../../shared/src/resolved-promises.ts';\nimport * as v from '../../../../shared/src/valita.ts';\nimport type {Writable} from '../../../../shared/src/writable.ts';\nimport type {ErroredQuery} from '../../../../zero-protocol/src/custom-queries.ts';\nimport {rowSchema} from '../../../../zero-protocol/src/data.ts';\nimport type {DeleteClientsBody} from '../../../../zero-protocol/src/delete-clients.ts';\nimport type {Downstream} from '../../../../zero-protocol/src/down.ts';\nimport {\n ProtocolError,\n type TransformFailedBody,\n} from '../../../../zero-protocol/src/error.ts';\nimport type {InspectDownBody} from '../../../../zero-protocol/src/inspect-down.ts';\nimport type {\n PokePartBody,\n PokeStartBody,\n} from '../../../../zero-protocol/src/poke.ts';\nimport {primaryKeyValueRecordSchema} from '../../../../zero-protocol/src/primary-key.ts';\nimport {mutationResultSchema} from '../../../../zero-protocol/src/push.ts';\nimport type {RowPatchOp} from '../../../../zero-protocol/src/row-patch.ts';\nimport {\n getOrCreateCounter,\n getOrCreateHistogram,\n} from '../../observability/metrics.ts';\nimport {\n getLogLevel,\n wrapWithProtocolError,\n} from '../../types/error-with-level.ts';\nimport {upstreamSchema, type ShardID} from '../../types/shards.ts';\nimport type {Subscription} from '../../types/subscription.ts';\nimport {\n cmpVersions,\n cookieToVersion,\n versionToCookie,\n versionToNullableCookie,\n type CVRVersion,\n type DelQueryPatch,\n type NullableCVRVersion,\n type PutQueryPatch,\n type RowID,\n} from './schema/types.ts';\n\nexport type PutRowPatch = {\n type: 'row';\n op: 'put';\n id: RowID;\n contents: JSONObject;\n};\n\nexport type DeleteRowPatch = {\n type: 'row';\n op: 'del';\n id: RowID;\n};\n\nexport type RowPatch = PutRowPatch | DeleteRowPatch;\nexport type ConfigPatch = DelQueryPatch | PutQueryPatch;\n\nexport type Patch = ConfigPatch | RowPatch;\n\nexport type PatchToVersion = {\n patch: Patch;\n toVersion: CVRVersion;\n};\n\nexport interface PokeHandler {\n addPatch(patch: PatchToVersion): Promise<void>;\n cancel(): Promise<void>;\n end(finalVersion: CVRVersion): Promise<void>;\n}\n\nconst NOOP: PokeHandler = {\n addPatch: () => promiseVoid,\n cancel: () => promiseVoid,\n end: () => promiseVoid,\n};\n\n/** Wraps PokeHandlers for multiple clients in a single PokeHandler. */\nexport function startPoke(\n clients: ClientHandler[],\n tentativeVersion: CVRVersion,\n): PokeHandler {\n const pokers = clients.map(c => c.startPoke(tentativeVersion));\n\n // Promise.allSettled() ensures that a failed (e.g. disconnected) client\n // does not prevent other clients from receiving the pokes. However, the\n // rate (per client group) will be limited by the slowest connection.\n return {\n addPatch: async patch => {\n await Promise.allSettled(pokers.map(poker => poker.addPatch(patch)));\n },\n cancel: async () => {\n await Promise.allSettled(pokers.map(poker => poker.cancel()));\n },\n end: async finalVersion => {\n await Promise.allSettled(pokers.map(poker => poker.end(finalVersion)));\n },\n };\n}\n\n// Semi-arbitrary threshold at which poke body parts are flushed.\n// When row size is being computed, that should be used as a threshold instead.\nconst PART_COUNT_FLUSH_THRESHOLD = 100;\n\n/**\n * Handles a single `ViewSyncer` connection.\n */\nexport class ClientHandler {\n readonly #clientGroupID: string;\n readonly clientID: string;\n readonly wsID: string;\n readonly #zeroClientsTable: string;\n readonly #zeroMutationsTable: string;\n readonly #lc: LogContext;\n readonly #downstream: Subscription<Downstream>;\n #baseVersion: NullableCVRVersion;\n\n readonly #pokeTime = getOrCreateHistogram('sync', 'poke.time', {\n description:\n 'Time elapsed for each poke transaction. Canceled / noop pokes are excluded.',\n unit: 's',\n });\n\n readonly #pokeTransactions = getOrCreateCounter(\n 'sync',\n 'poke.transactions',\n 'Count of poke transactions.',\n );\n\n readonly #pokedRows = getOrCreateCounter(\n 'sync',\n 'poke.rows',\n 'Count of poked rows.',\n );\n\n constructor(\n lc: LogContext,\n clientGroupID: string,\n clientID: string,\n wsID: string,\n shard: ShardID,\n baseCookie: string | null,\n downstream: Subscription<Downstream>,\n ) {\n lc.debug?.('new client handler');\n this.#clientGroupID = clientGroupID;\n this.clientID = clientID;\n this.wsID = wsID;\n this.#zeroClientsTable = `${upstreamSchema(shard)}.clients`;\n this.#zeroMutationsTable = `${upstreamSchema(shard)}.mutations`;\n this.#lc = lc;\n this.#downstream = downstream;\n this.#baseVersion = cookieToVersion(baseCookie);\n }\n\n version(): NullableCVRVersion {\n return this.#baseVersion;\n }\n\n async #push(msg: Downstream): Promise<void> {\n const {result} = this.#downstream.push(msg);\n await result;\n }\n\n fail(e: unknown) {\n this.#lc[getLogLevel(e)]?.(\n `view-syncer closing connection with error: ${String(e)}`,\n e,\n );\n this.#downstream.fail(wrapWithProtocolError(e));\n }\n\n close(reason: string) {\n this.#lc.debug?.(`view-syncer closing connection: ${reason}`);\n this.#downstream.cancel();\n }\n\n startPoke(tentativeVersion: CVRVersion): PokeHandler {\n const pokeID = versionToCookie(tentativeVersion);\n const lc = this.#lc.withContext('pokeID', pokeID);\n\n if (cmpVersions(this.#baseVersion, tentativeVersion) >= 0) {\n lc.info?.(`already caught up, not sending poke.`);\n return NOOP;\n }\n\n const baseCookie = versionToNullableCookie(this.#baseVersion);\n const cookie = versionToCookie(tentativeVersion);\n lc.info?.(`starting poke from ${baseCookie} to ${cookie}`);\n\n const start = performance.now();\n\n const pokeStart: PokeStartBody = {pokeID, baseCookie};\n\n let pokeStarted = false;\n let body: PokePartBody | undefined;\n let partCount = 0;\n const ensureBody = async () => {\n if (!pokeStarted) {\n await this.#push(['pokeStart', pokeStart]);\n pokeStarted = true;\n }\n return (body ??= {pokeID});\n };\n const flushBody = async () => {\n if (body) {\n await this.#push(['pokePart', body]);\n body = undefined;\n partCount = 0;\n }\n };\n\n const addPatch = async (patchToVersion: PatchToVersion) => {\n const {patch, toVersion} = patchToVersion;\n if (cmpVersions(toVersion, this.#baseVersion) <= 0) {\n return;\n }\n const body = await ensureBody();\n\n const {type, op} = patch;\n switch (type) {\n case 'query': {\n const patches = patch.clientID\n ? ((body.desiredQueriesPatches ??= {})[patch.clientID] ??= [])\n : (body.gotQueriesPatch ??= []);\n if (op === 'put') {\n patches.push({op, hash: patch.id});\n } else {\n patches.push({op, hash: patch.id});\n }\n break;\n }\n case 'row':\n if (patch.id.table === this.#zeroClientsTable) {\n this.#updateLMIDs((body.lastMutationIDChanges ??= {}), patch);\n } else if (patch.id.table === this.#zeroMutationsTable) {\n const patches = (body.mutationsPatch ??= []);\n if (op === 'put') {\n const row = v.parse(\n ensureSafeJSON(patch.contents),\n mutationRowSchema,\n 'passthrough',\n );\n patches.push({\n op: 'put',\n mutation: {\n id: {\n clientID: row.clientID,\n id: row.mutationID,\n },\n result: row.result,\n },\n });\n } else {\n const {clientID, mutationID} = patch.id.rowKey;\n assert(\n typeof clientID === 'string',\n 'client id must be a string',\n );\n const id = Number(mutationID);\n assert(\n !Number.isNaN(id) && Number.isFinite(id) && id >= 0,\n 'mutation id must be a finite number',\n );\n patches.push({\n op: 'del',\n id: {\n clientID,\n id,\n },\n });\n }\n } else {\n (body.rowsPatch ??= []).push(makeRowPatch(patch));\n }\n break;\n default:\n unreachable(patch);\n }\n\n if (++partCount >= PART_COUNT_FLUSH_THRESHOLD) {\n await flushBody();\n }\n };\n\n return {\n addPatch: async (patchToVersion: PatchToVersion) => {\n try {\n await addPatch(patchToVersion);\n if (patchToVersion.patch.type === 'row') {\n this.#pokedRows.add(1);\n }\n } catch (e) {\n this.#downstream.fail(wrapWithProtocolError(e));\n }\n },\n\n cancel: async () => {\n if (pokeStarted) {\n await this.#push(['pokeEnd', {pokeID, cookie: '', cancel: true}]);\n }\n },\n\n end: async (finalVersion: CVRVersion) => {\n const cookie = versionToCookie(finalVersion);\n if (!pokeStarted) {\n if (cmpVersions(this.#baseVersion, finalVersion) === 0) {\n return; // Nothing changed and nothing was sent.\n }\n await this.#push(['pokeStart', pokeStart]);\n } else if (cmpVersions(this.#baseVersion, finalVersion) >= 0) {\n // Sanity check: If the poke was started, the finalVersion\n // must be > #baseVersion.\n throw new Error(\n `Patches were sent but finalVersion ${finalVersion} is ` +\n `not greater than baseVersion ${this.#baseVersion}`,\n );\n }\n await flushBody();\n await this.#push(['pokeEnd', {pokeID, cookie}]);\n this.#baseVersion = finalVersion;\n\n const elapsed = performance.now() - start;\n this.#pokeTransactions.add(1);\n this.#pokeTime.record(elapsed / 1000);\n },\n };\n }\n\n async sendDeleteClients(\n lc: LogContext,\n deletedClientIDs: string[],\n deletedClientGroupIDs: string[],\n ) {\n const deleteClientsBody: Writable<DeleteClientsBody> = {};\n if (deletedClientIDs.length > 0) {\n deleteClientsBody.clientIDs = deletedClientIDs;\n }\n if (deletedClientGroupIDs.length > 0) {\n deleteClientsBody.clientGroupIDs = deletedClientGroupIDs;\n }\n lc.debug?.('sending deleteClients', deleteClientsBody);\n await this.#push(['deleteClients', deleteClientsBody]);\n }\n\n sendQueryTransformApplicationErrors(errors: ErroredQuery[]) {\n void this.#push(['transformError', errors]);\n }\n\n sendQueryTransformFailedError(error: TransformFailedBody) {\n this.fail(new ProtocolError(error));\n }\n\n sendInspectResponse(lc: LogContext, response: InspectDownBody): void {\n lc.debug?.('sending inspect response', response);\n this.#downstream.push(['inspect', response]);\n }\n\n #updateLMIDs(lmids: Record<string, number>, patch: RowPatch) {\n if (patch.op === 'put') {\n const row = ensureSafeJSON(patch.contents);\n const {clientGroupID, clientID, lastMutationID} = v.parse(\n row,\n lmidRowSchema,\n 'passthrough',\n );\n if (clientGroupID !== this.#clientGroupID) {\n this.#lc.error?.(\n `Received clients row for wrong clientGroupID. Ignoring.`,\n clientGroupID,\n );\n } else {\n lmids[clientID] = lastMutationID;\n }\n } else {\n // The 'constrain' and 'del' ops for clients can be ignored.\n patch.op satisfies 'constrain' | 'del';\n }\n }\n}\n\n// Note: The {APP_ID}_{SHARD_ID}.clients table is set up in replicator/initial-sync.ts.\nconst lmidRowSchema = v.object({\n clientGroupID: v.string(),\n clientID: v.string(),\n lastMutationID: v.number(), // Actually returned as a bigint, but converted by ensureSafeJSON().\n});\n\nconst mutationRowSchema = v.object({\n clientGroupID: v.string(),\n clientID: v.string(),\n mutationID: v.number(),\n result: mutationResultSchema,\n});\n\nfunction makeRowPatch(patch: RowPatch): RowPatchOp {\n const {\n op,\n id: {table: tableName, rowKey: id},\n } = patch;\n\n switch (op) {\n case 'put':\n return {\n op: 'put',\n tableName,\n value: v.parse(ensureSafeJSON(patch.contents), rowSchema),\n };\n\n case 'del':\n return {\n op,\n tableName,\n id: v.parse(id, primaryKeyValueRecordSchema),\n };\n\n default:\n unreachable(op);\n }\n}\n\n/**\n * Column values of type INT8 are returned as the `bigint` from the\n * Postgres library. These are converted to `number` if they are within\n * the safe Number range, allowing the protocol to support numbers larger\n * than 32-bits. Values outside of the safe number range (e.g. > 2^53) will\n * result in an Error.\n */\nexport function ensureSafeJSON(row: JSONObject): SafeJSONObject {\n const modified = Object.entries(row)\n .filter(([k, v]) => {\n if (typeof v === 'bigint') {\n if (v >= Number.MIN_SAFE_INTEGER && v <= Number.MAX_SAFE_INTEGER) {\n return true; // send this entry onto the next map() step.\n }\n throw new Error(`Value of \"${k}\" exceeds safe Number range (${v})`);\n } else if (typeof v === 'object') {\n assertJSONValue(v);\n }\n return false;\n })\n .map(([k, v]) => [k, Number(v)]);\n\n return modified.length\n ? {...row, ...Object.fromEntries(modified)}\n : (row as SafeJSONObject);\n}\n"],"names":["body","v.parse","cookie","v.object","v.string","v.number","v"],"mappings":"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"}
@@ -19,7 +19,7 @@ export type CVRFlushStats = {
19
19
  };
20
20
  export declare class CVRStore {
21
21
  #private;
22
- constructor(lc: LogContext, cvrDb: PostgresDB, upstreamDb: PostgresDB | undefined, shard: ShardID, taskID: string, cvrID: string, failService: (e: unknown) => void, loadAttemptIntervalMs?: number, maxLoadAttempts?: number, deferredRowFlushThreshold?: number, // somewhat arbitrary
22
+ constructor(lc: LogContext, cvrDb: PostgresDB, shard: ShardID, taskID: string, cvrID: string, failService: (e: unknown) => void, loadAttemptIntervalMs?: number, maxLoadAttempts?: number, deferredRowFlushThreshold?: number, // somewhat arbitrary
23
23
  setTimeoutFn?: typeof setTimeout);
24
24
  load(lc: LogContext, lastConnectTime: number): Promise<CVR>;
25
25
  getRowRecords(): Promise<ReadonlyMap<RowID, RowRecord>>;
@@ -1 +1 @@
1
- {"version":3,"file":"cvr-store.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/view-syncer/cvr-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cvr-store.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/view-syncer/cvr-store.ts"],"names":[],"mappings":"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"}
@@ -17,12 +17,13 @@ import { TransactionPool } from "../../db/transaction-pool.js";
17
17
  import { recordRowsSynced } from "../../server/anonymous-otel-start.js";
18
18
  import { ProtocolErrorWithLevel } from "../../types/error-with-level.js";
19
19
  import { rowIDString } from "../../types/row-key.js";
20
- import { cvrSchema, upstreamSchema } from "../../types/shards.js";
20
+ import { cvrSchema } from "../../types/shards.js";
21
21
  import { RowRecordCache } from "./row-record-cache.js";
22
22
  import "pg-format";
23
23
  import "../../../../shared/src/bigint-json.js";
24
24
  import { EMPTY_CVR_VERSION, versionFromString, versionString, queryRecordToQueryRow, cmpVersions } from "./schema/types.js";
25
25
  import { ttlClockFromNumber, ttlClockAsNumber } from "./ttl-clock.js";
26
+ let flushCounter = 0;
26
27
  const tracer = trace.getTracer("cvr-store", version);
27
28
  function asQuery(row) {
28
29
  const maybeVersion = (s) => s === null ? void 0 : versionFromString(s);
@@ -67,9 +68,7 @@ class CVRStore {
67
68
  #id;
68
69
  #failService;
69
70
  #db;
70
- #upstreamDb;
71
71
  #writes = /* @__PURE__ */ new Set();
72
- #upstreamWrites = [];
73
72
  #pendingRowRecordUpdates = new CustomKeyMap(
74
73
  rowIDString
75
74
  );
@@ -77,12 +76,10 @@ class CVRStore {
77
76
  #rowCache;
78
77
  #loadAttemptIntervalMs;
79
78
  #maxLoadAttempts;
80
- #upstreamSchemaName;
81
79
  #rowCount = 0;
82
- constructor(lc, cvrDb, upstreamDb, shard, taskID, cvrID, failService, loadAttemptIntervalMs = LOAD_ATTEMPT_INTERVAL_MS, maxLoadAttempts = MAX_LOAD_ATTEMPTS, deferredRowFlushThreshold = 100, setTimeoutFn = setTimeout) {
80
+ constructor(lc, cvrDb, shard, taskID, cvrID, failService, loadAttemptIntervalMs = LOAD_ATTEMPT_INTERVAL_MS, maxLoadAttempts = MAX_LOAD_ATTEMPTS, deferredRowFlushThreshold = 100, setTimeoutFn = setTimeout) {
83
81
  this.#failService = failService;
84
82
  this.#db = cvrDb;
85
- this.#upstreamDb = upstreamDb;
86
83
  this.#schema = cvrSchema(shard);
87
84
  this.#taskID = taskID;
88
85
  this.#id = cvrID;
@@ -97,7 +94,6 @@ class CVRStore {
97
94
  );
98
95
  this.#loadAttemptIntervalMs = loadAttemptIntervalMs;
99
96
  this.#maxLoadAttempts = maxLoadAttempts;
100
- this.#upstreamSchemaName = upstreamSchema(shard);
101
97
  }
102
98
  #cvr(table) {
103
99
  return this.#db(`${this.#schema}.${table}`);
@@ -117,7 +113,7 @@ class CVRStore {
117
113
  }
118
114
  return result;
119
115
  }
120
- assert(err);
116
+ assert(err, "Expected error to be set after retry loop exhausted");
121
117
  throw new ClientNotFoundError(
122
118
  `max attempts exceeded waiting for CVR@${err.cvrVersion} to catch up from ${err.rowsVersion}`
123
119
  );
@@ -138,28 +134,30 @@ class CVRStore {
138
134
  clientSchema: null,
139
135
  profileID: null
140
136
  };
141
- const [instance, clientsRows, queryRows, desiresRows] = await this.#db.begin(READONLY, (tx) => [
142
- tx`SELECT cvr."version",
137
+ const [instance, clientsRows, queryRows, desiresRows] = await this.#db.begin(READONLY, (tx) => {
138
+ lc.debug?.(`CVR tx started after ${Date.now() - start} ms`);
139
+ return [
140
+ tx`SELECT cvr."version",
143
141
  "lastActive",
144
142
  "ttlClock",
145
- "replicaVersion",
146
- "owner",
143
+ "replicaVersion",
144
+ "owner",
147
145
  "grantedAt",
148
- "clientSchema",
146
+ "clientSchema",
149
147
  "profileID",
150
148
  "deleted",
151
149
  rows."version" as "rowsVersion"
152
150
  FROM ${this.#cvr("instances")} AS cvr
153
- LEFT JOIN ${this.#cvr("rowsVersion")} AS rows
151
+ LEFT JOIN ${this.#cvr("rowsVersion")} AS rows
154
152
  ON cvr."clientGroupID" = rows."clientGroupID"
155
153
  WHERE cvr."clientGroupID" = ${id}`,
156
- tx`SELECT "clientID" FROM ${this.#cvr(
157
- "clients"
158
- )}
154
+ tx`SELECT "clientID" FROM ${this.#cvr(
155
+ "clients"
156
+ )}
159
157
  WHERE "clientGroupID" = ${id}`,
160
- tx`SELECT * FROM ${this.#cvr("queries")}
158
+ tx`SELECT * FROM ${this.#cvr("queries")}
161
159
  WHERE "clientGroupID" = ${id} AND deleted IS DISTINCT FROM true`,
162
- tx`SELECT
160
+ tx`SELECT
163
161
  "clientGroupID",
164
162
  "clientID",
165
163
  "queryHash",
@@ -169,7 +167,11 @@ class CVRStore {
169
167
  "inactivatedAtMs" AS "inactivatedAt"
170
168
  FROM ${this.#cvr("desires")}
171
169
  WHERE "clientGroupID" = ${id}`
172
- ]);
170
+ ];
171
+ });
172
+ lc.debug?.(
173
+ `CVR tx completed after ${Date.now() - start} ms (${clientsRows.length} clients, ${queryRows.length} queries, ${desiresRows.length} desires)`
174
+ );
173
175
  if (instance.length === 0) {
174
176
  this.putInstance({
175
177
  version: cvr.version,
@@ -181,7 +183,10 @@ class CVRStore {
181
183
  profileID: null
182
184
  });
183
185
  } else {
184
- assert(instance.length === 1);
186
+ assert(
187
+ instance.length === 1,
188
+ () => `Expected exactly one CVR instance, got ${instance.length}`
189
+ );
185
190
  const {
186
191
  version: version2,
187
192
  lastActive,
@@ -239,12 +244,14 @@ class CVRStore {
239
244
  }
240
245
  for (const row of desiresRows) {
241
246
  const client = cvr.clients[row.clientID];
242
- if (client) {
243
- if (!row.deleted && row.inactivatedAt === null) {
247
+ if (!row.deleted && row.inactivatedAt === null) {
248
+ if (client) {
244
249
  client.desiredQueryIDs.push(row.queryHash);
250
+ } else {
251
+ lc.debug?.(
252
+ `Not adding to desiredQueryIDs for client ${row.clientID} because it has been deleted.`
253
+ );
245
254
  }
246
- } else {
247
- lc.debug?.(`Client ${row.clientID} not found`);
248
255
  }
249
256
  const query = cvr.queries[row.queryHash];
250
257
  if (query && query.type !== "internal" && (!row.deleted || row.inactivatedAt !== null)) {
@@ -311,7 +318,10 @@ class CVRStore {
311
318
  if (result.length === 0) {
312
319
  return void 0;
313
320
  }
314
- assert(result.length === 1);
321
+ assert(
322
+ result.length === 1,
323
+ () => `Expected exactly one rowsVersion result, got ${result.length}`
324
+ );
315
325
  return result[0][0];
316
326
  }
317
327
  putInstance({
@@ -420,15 +430,10 @@ class CVRStore {
420
430
  deleteClient(clientID) {
421
431
  this.#writes.add({
422
432
  stats: { clients: 1 },
423
- write: (sql) => sql`DELETE FROM ${this.#cvr("clients")}
424
- WHERE "clientGroupID" = ${this.#id}
433
+ write: (sql) => sql`DELETE FROM ${this.#cvr("clients")}
434
+ WHERE "clientGroupID" = ${this.#id}
425
435
  AND "clientID" = ${clientID}`
426
436
  });
427
- this.#upstreamWrites.push(
428
- (sql) => sql`DELETE FROM ${sql(this.#upstreamSchemaName)}."mutations"
429
- WHERE "clientGroupID" = ${this.#id}
430
- AND "clientID" = ${clientID}`
431
- );
432
437
  }
433
438
  putDesiredQuery(newVersion, query, client, deleted, inactivatedAt, ttl) {
434
439
  const change = {
@@ -505,7 +510,7 @@ class CVRStore {
505
510
  const { queryHash: id } = row;
506
511
  const patch = row.deleted ? { type: "query", op: "del", id } : { type: "query", op: "put", id };
507
512
  const v2 = row.patchVersion;
508
- assert(v2);
513
+ assert(v2, "patchVersion must be set for query patches");
509
514
  patches.push({ patch, toVersion: versionFromString(v2) });
510
515
  }
511
516
  for (const row of allDesires) {
@@ -521,7 +526,9 @@ class CVRStore {
521
526
  reader.setDone();
522
527
  }
523
528
  }
524
- async #checkVersionAndOwnership(tx, expectedCurrentVersion, lastConnectTime) {
529
+ async #checkVersionAndOwnership(lc, tx, expectedCurrentVersion, lastConnectTime) {
530
+ const start = Date.now();
531
+ lc.debug?.("checking cvr version and ownership");
525
532
  const expected = versionString(expectedCurrentVersion);
526
533
  const result = await tx`SELECT "version", "owner", "grantedAt" FROM ${this.#cvr("instances")}
527
534
  WHERE "clientGroupID" = ${this.#id}
@@ -531,6 +538,9 @@ class CVRStore {
531
538
  owner: null,
532
539
  grantedAt: null
533
540
  };
541
+ lc.debug?.(
542
+ "checked cvr version and ownership in " + (Date.now() - start) + " ms"
543
+ );
534
544
  if (owner !== this.#taskID && (grantedAt ?? 0) > lastConnectTime) {
535
545
  throw new OwnershipError(owner, grantedAt, lastConnectTime);
536
546
  }
@@ -538,7 +548,7 @@ class CVRStore {
538
548
  throw new ConcurrentModificationException(expected, version2);
539
549
  }
540
550
  }
541
- async #flush(expectedCurrentVersion, cvr, lastConnectTime) {
551
+ async #flush(lc, expectedCurrentVersion, cvr, lastConnectTime) {
542
552
  const stats = {
543
553
  instances: 0,
544
554
  queries: 0,
@@ -572,7 +582,10 @@ class CVRStore {
572
582
  return null;
573
583
  }
574
584
  this.putInstance(cvr);
585
+ const start = Date.now();
586
+ lc.debug?.("flush tx beginning");
575
587
  const rowsFlushed = await this.#db.begin(READ_COMMITTED, async (tx) => {
588
+ lc.debug?.(`flush tx begun after ${Date.now() - start} ms`);
576
589
  const pipelined = [
577
590
  // #checkVersionAndOwnership() executes a `SELECT ... FOR UPDATE`
578
591
  // query to acquire a row-level lock so that version-updating
@@ -582,29 +595,41 @@ class CVRStore {
582
595
  // to this lock and can thus commit / be-committed independently of
583
596
  // cvr.instances.
584
597
  this.#checkVersionAndOwnership(
598
+ lc,
585
599
  tx,
586
600
  expectedCurrentVersion,
587
601
  lastConnectTime
588
602
  )
589
603
  ];
604
+ let i = 0;
590
605
  for (const write of this.#writes) {
591
606
  stats.instances += write.stats.instances ?? 0;
592
607
  stats.queries += write.stats.queries ?? 0;
593
608
  stats.desires += write.stats.desires ?? 0;
594
609
  stats.clients += write.stats.clients ?? 0;
595
610
  stats.rows += write.stats.rows ?? 0;
596
- pipelined.push(write.write(tx, lastConnectTime).execute());
611
+ const writeIndex = i++;
612
+ const writeStart = Date.now();
613
+ pipelined.push(
614
+ write.write(tx, lastConnectTime).execute().then(() => {
615
+ lc.debug?.(
616
+ `write ${writeIndex}/${this.#writes.size} completed in ${Date.now() - writeStart} ms`
617
+ );
618
+ })
619
+ );
597
620
  stats.statements++;
598
621
  }
599
622
  const rowUpdates = this.#rowCache.executeRowUpdates(
600
623
  tx,
601
624
  cvr.version,
602
625
  this.#pendingRowRecordUpdates,
603
- "allow-defer"
626
+ "allow-defer",
627
+ lc
604
628
  );
605
629
  pipelined.push(...rowUpdates);
606
630
  stats.statements += rowUpdates.length;
607
631
  await Promise.all(pipelined);
632
+ lc.debug?.(`flush tx returning after ${Date.now() - start} ms`);
608
633
  if (rowUpdates.length === 0) {
609
634
  stats.rowsDeferred = this.#pendingRowRecordUpdates.size;
610
635
  return false;
@@ -618,11 +643,6 @@ class CVRStore {
618
643
  rowsFlushed
619
644
  );
620
645
  recordRowsSynced(this.#rowCount);
621
- if (this.#upstreamDb) {
622
- await this.#upstreamDb.begin(READ_COMMITTED, async (tx) => {
623
- await Promise.all(this.#upstreamWrites.map((write) => write(tx)));
624
- });
625
- }
626
646
  return stats;
627
647
  }
628
648
  get rowCount() {
@@ -630,8 +650,10 @@ class CVRStore {
630
650
  }
631
651
  async flush(lc, expectedCurrentVersion, cvr, lastConnectTime) {
632
652
  const start = performance.now();
653
+ lc = lc.withContext("cvrFlushID", flushCounter++);
633
654
  try {
634
655
  const stats = await this.#flush(
656
+ lc,
635
657
  expectedCurrentVersion,
636
658
  cvr,
637
659
  lastConnectTime
@@ -649,7 +671,6 @@ class CVRStore {
649
671
  throw e;
650
672
  } finally {
651
673
  this.#writes.clear();
652
- this.#upstreamWrites.length = 0;
653
674
  this.#pendingRowRecordUpdates.clear();
654
675
  this.#forceUpdates.clear();
655
676
  }