@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
@@ -30,6 +30,7 @@ import "@rocicorp/zero-sqlite3";
30
30
  import "../../../../zqlite/src/internal/sql.js";
31
31
  import "@databases/escape-identifier";
32
32
  import "../../../../shared/src/btree-set.js";
33
+ import "../../../../shared/src/iterables.js";
33
34
  import "../../../../shared/src/valita.js";
34
35
  import "../../../../zero-schema/src/compiled-permissions.js";
35
36
  import "../../../../zero-protocol/src/primary-key.js";
@@ -58,6 +59,7 @@ class ViewSyncerService {
58
59
  #slowHydrateThreshold;
59
60
  #queryConfig;
60
61
  userQueryURL;
62
+ userQueryHeaders;
61
63
  // The ViewSyncerService is only started in response to a connection,
62
64
  // so #lastConnectTime is always initialized to now(). This is necessary
63
65
  // to handle race conditions in which, e.g. the replica is ready and the
@@ -102,6 +104,7 @@ class ViewSyncerService {
102
104
  // auth and cookie headers directly
103
105
  #authData;
104
106
  #httpCookie;
107
+ #origin;
105
108
  #expiredQueriesTimer = 0;
106
109
  #setTimeout;
107
110
  #customQueryTransformer;
@@ -154,7 +157,8 @@ class ViewSyncerService {
154
157
  );
155
158
  #inspectorDelegate;
156
159
  #config;
157
- constructor(config, lc, shard, taskID, clientGroupID, cvrDb, upstreamDb, pipelineDriver, versionChanges, drainCoordinator, slowHydrateThreshold, inspectorDelegate, customQueryTransformer, keepaliveMs = DEFAULT_KEEPALIVE_MS, setTimeoutFn = setTimeout.bind(globalThis)) {
160
+ #runPriorityOp;
161
+ constructor(config, lc, shard, taskID, clientGroupID, cvrDb, pipelineDriver, versionChanges, drainCoordinator, slowHydrateThreshold, inspectorDelegate, customQueryTransformer, runPriorityOp, keepaliveMs = DEFAULT_KEEPALIVE_MS, setTimeoutFn = setTimeout.bind(globalThis)) {
158
162
  const queryConfig = config.query?.url ? config.query : config.getQueries;
159
163
  this.#config = config;
160
164
  this.id = clientGroupID;
@@ -171,7 +175,6 @@ class ViewSyncerService {
171
175
  this.#cvrStore = new CVRStore(
172
176
  lc,
173
177
  cvrDb,
174
- upstreamDb,
175
178
  shard,
176
179
  taskID,
177
180
  clientGroupID,
@@ -180,13 +183,17 @@ class ViewSyncerService {
180
183
  () => this.#stateChanges.cancel()
181
184
  );
182
185
  this.#setTimeout = setTimeoutFn;
186
+ this.#runPriorityOp = runPriorityOp;
183
187
  this.keepalive();
184
188
  }
185
189
  #getHeaderOptions(forwardCookie) {
186
190
  return {
187
191
  apiKey: this.#queryConfig.apiKey,
192
+ customHeaders: this.userQueryHeaders,
193
+ allowedClientHeaders: this.#queryConfig.allowedClientHeaders,
188
194
  token: this.#authData?.raw,
189
- cookie: forwardCookie ? this.#httpCookie : void 0
195
+ cookie: forwardCookie ? this.#httpCookie : void 0,
196
+ origin: this.#origin
190
197
  };
191
198
  }
192
199
  #runInLockWithCVR(fn) {
@@ -210,8 +217,12 @@ class ViewSyncerService {
210
217
  return;
211
218
  }
212
219
  if (!this.#cvr) {
213
- this.#lc.debug?.("loading CVR");
214
- this.#cvr = await this.#cvrStore.load(lc, this.#lastConnectTime);
220
+ this.#lc.debug?.("loading cvr");
221
+ this.#cvr = await this.#runPriorityOp(
222
+ lc,
223
+ "loading cvr",
224
+ () => this.#cvrStore.load(lc, this.#lastConnectTime)
225
+ );
215
226
  this.#ttlClock = this.#cvr.ttlClock;
216
227
  this.#ttlClockBase = Date.now();
217
228
  } else {
@@ -267,6 +278,7 @@ class ViewSyncerService {
267
278
  }
268
279
  lc.info?.(`resetting pipelines: ${result.message}`);
269
280
  this.#pipelines.reset(clientSchema);
281
+ this.#pipelinesSynced = false;
270
282
  }
271
283
  const version2 = this.#pipelines.advanceWithoutDiff();
272
284
  const cvrVer = versionString(cvr.version);
@@ -276,7 +288,7 @@ class ViewSyncerService {
276
288
  }
277
289
  lc.info?.(`init pipelines@${version2} (cvr@${cvrVer})`);
278
290
  await this.#hydrateUnchangedQueries(lc, cvr);
279
- await this.#syncQueryPipelineSet(lc, cvr);
291
+ await this.#syncQueryPipelineSet(lc, cvr, "missing");
280
292
  this.#pipelinesSynced = true;
281
293
  });
282
294
  }
@@ -301,8 +313,9 @@ class ViewSyncerService {
301
313
  if (hasExpiredQueries(cvr)) {
302
314
  lc = lc.withContext("method", "#removeExpiredQueries");
303
315
  lc.debug?.("Queries have expired");
304
- await this.#syncQueryPipelineSet(lc, cvr);
305
- this.#pipelinesSynced = true;
316
+ if (this.#pipelinesSynced) {
317
+ await this.#syncQueryPipelineSet(lc, cvr, "missing");
318
+ }
306
319
  }
307
320
  this.#scheduleExpireEviction(lc, cvr);
308
321
  };
@@ -378,19 +391,19 @@ class ViewSyncerService {
378
391
  profileID,
379
392
  wsID,
380
393
  baseCookie,
381
- schemaVersion,
382
394
  tokenData,
383
395
  httpCookie,
396
+ origin,
384
397
  protocolVersion
385
398
  } = ctx;
386
399
  this.#authData = pickToken(this.#lc, this.#authData, tokenData);
387
- this.#lc.debug?.(
388
- `Picked auth token: ${JSON.stringify(this.#authData?.decoded)}`
389
- );
400
+ this.#lc.debug?.(`Picked auth token for clientGroupID`);
390
401
  this.#httpCookie = httpCookie;
391
- const [, { userQueryURL }] = initConnectionMessage;
402
+ this.#origin = origin;
403
+ const [, { userQueryURL, userQueryHeaders }] = initConnectionMessage;
392
404
  if (this.userQueryURL === void 0) {
393
405
  this.userQueryURL = userQueryURL;
406
+ this.userQueryHeaders = userQueryHeaders;
394
407
  } else {
395
408
  if (this.userQueryURL !== userQueryURL) {
396
409
  this.#lc.warn?.(
@@ -427,7 +440,6 @@ class ViewSyncerService {
427
440
  wsID,
428
441
  this.#shard,
429
442
  baseCookie,
430
- schemaVersion,
431
443
  downstream
432
444
  );
433
445
  this.#clients.get(clientID)?.close(`replaced by wsID: ${wsID}`);
@@ -448,6 +460,8 @@ class ViewSyncerService {
448
460
  clientID2,
449
461
  msg,
450
462
  cvr,
463
+ "all",
464
+ // re transform all on new connections
451
465
  // Until the profileID is required in the URL, default it to
452
466
  // `cg${clientGroupID}`, as is done in the schema migration.
453
467
  // As clients update to the zero version with the profileID logic,
@@ -462,13 +476,17 @@ class ViewSyncerService {
462
476
  });
463
477
  }
464
478
  async changeDesiredQueries(ctx, msg) {
465
- await this.#runInLockForClient(ctx, msg, this.#handleConfigUpdate);
479
+ await this.#runInLockForClient(
480
+ ctx,
481
+ msg,
482
+ (lc, clientID, msg2, cvr) => this.#handleConfigUpdate(lc, clientID, msg2, cvr, "missing")
483
+ );
466
484
  }
467
485
  async deleteClients(ctx, msg) {
468
- await this.#runInLockForClient(
486
+ return await this.#runInLockForClient(
469
487
  ctx,
470
488
  [msg[0], { deleted: msg[1] }],
471
- this.#handleConfigUpdate
489
+ (lc, clientID, msg2, cvr) => this.#handleConfigUpdate(lc, clientID, msg2, cvr, "missing")
472
490
  );
473
491
  }
474
492
  #getTTLClock(now) {
@@ -485,19 +503,21 @@ class ViewSyncerService {
485
503
  this.#ttlClockBase = now;
486
504
  return ttlClock;
487
505
  }
488
- async #flushUpdater(lc, updater) {
489
- const now = Date.now();
490
- const ttlClock = this.#getTTLClock(now);
491
- const { cvr, flushed } = await updater.flush(
492
- lc,
493
- this.#lastConnectTime,
494
- now,
495
- ttlClock
496
- );
497
- if (flushed) {
498
- this.#startTTLClockInterval(lc);
499
- }
500
- return cvr;
506
+ #flushUpdater(lc, updater) {
507
+ return this.#runPriorityOp(lc, "flushing cvr", async () => {
508
+ const now = Date.now();
509
+ const ttlClock = this.#getTTLClock(now);
510
+ const { cvr, flushed } = await updater.flush(
511
+ lc,
512
+ this.#lastConnectTime,
513
+ now,
514
+ ttlClock
515
+ );
516
+ if (flushed) {
517
+ this.#startTTLClockInterval(lc);
518
+ }
519
+ return cvr;
520
+ });
501
521
  }
502
522
  #startTTLClockInterval(lc) {
503
523
  this.#stopTTLClockInterval();
@@ -511,14 +531,22 @@ class ViewSyncerService {
511
531
  this.#ttlClockInterval = 0;
512
532
  }
513
533
  #updateTTLClockInCVRWithoutLock(lc) {
514
- lc.debug?.("Syncing ttlClock");
515
- const now = Date.now();
516
- const ttlClock = this.#getTTLClock(now);
517
- this.#cvrStore.updateTTLClock(ttlClock, now).catch((e) => {
518
- lc.error?.("failed to update TTL clock", e);
534
+ const rid = randomID();
535
+ lc.debug?.("Syncing ttlClock", rid);
536
+ const start = Date.now();
537
+ const ttlClock = this.#getTTLClock(start);
538
+ this.#cvrStore.updateTTLClock(ttlClock, start).then(() => {
539
+ lc.debug?.("Synced ttlClock", rid, `in ${Date.now() - start} ms`);
540
+ }).catch((e) => {
541
+ lc.error?.(
542
+ "failed to update TTL clock",
543
+ rid,
544
+ `after ${Date.now() - start} ms`,
545
+ e
546
+ );
519
547
  });
520
548
  }
521
- async #updateCVRConfig(lc, cvr, clientID, fn) {
549
+ async #updateCVRConfig(lc, cvr, clientID, customQueryTransformMode, fn) {
522
550
  const updater = new CVRConfigDrivenUpdater(
523
551
  this.#cvrStore,
524
552
  cvr,
@@ -536,7 +564,7 @@ class ViewSyncerService {
536
564
  await pokers.end(newCVR.version);
537
565
  }
538
566
  if (this.#pipelinesSynced) {
539
- await this.#syncQueryPipelineSet(lc, this.#cvr);
567
+ await this.#syncQueryPipelineSet(lc, this.#cvr, customQueryTransformMode);
540
568
  }
541
569
  return this.#cvr;
542
570
  }
@@ -556,8 +584,9 @@ class ViewSyncerService {
556
584
  `vs.#runInLockForClient(${cmd})`,
557
585
  async () => {
558
586
  let client;
587
+ let result;
559
588
  try {
560
- await this.#runInLockWithCVR((lc, cvr) => {
589
+ await this.#runInLockWithCVR(async (lc, cvr) => {
561
590
  lc = lc.withContext("clientID", clientID).withContext("wsID", wsID).withContext("cmd", cmd);
562
591
  lc.debug?.("acquired lock for cvr");
563
592
  client = this.#clients.get(clientID);
@@ -575,7 +604,7 @@ class ViewSyncerService {
575
604
  lc.warn?.(`Processing ${cmd} before initConnection was received`);
576
605
  }
577
606
  lc.debug?.(cmd, body);
578
- return fn(lc, clientID, body, cvr);
607
+ result = await fn(lc, clientID, body, cvr);
579
608
  });
580
609
  } catch (e) {
581
610
  const lc = this.#lc.withContext("clientID", clientID).withContext("wsID", wsID).withContext("cmd", cmd);
@@ -586,6 +615,7 @@ class ViewSyncerService {
586
615
  throw e;
587
616
  }
588
617
  }
618
+ return result;
589
619
  }
590
620
  );
591
621
  }
@@ -601,68 +631,74 @@ class ViewSyncerService {
601
631
  deleted,
602
632
  desiredQueriesPatch,
603
633
  activeClients
604
- }, cvr, profileID) => startAsyncSpan(tracer, "vs.#patchQueries", async () => {
634
+ }, cvr, customQueryTransformMode, profileID) => startAsyncSpan(tracer, "vs.#patchQueries", async () => {
605
635
  const deletedClientIDs = [];
606
636
  const deletedClientGroupIDs = [];
607
- cvr = await this.#updateCVRConfig(lc, cvr, clientID, (updater) => {
608
- const { ttlClock } = cvr;
609
- const patches = [];
610
- if (clientSchema) {
611
- updater.setClientSchema(lc, clientSchema);
612
- }
613
- if (profileID) {
614
- updater.setProfileID(lc, profileID);
615
- }
616
- lc.debug?.(`applying ${desiredQueriesPatch?.length} query patches`);
617
- if (desiredQueriesPatch?.length) {
618
- for (const patch of desiredQueriesPatch) {
619
- switch (patch.op) {
620
- case "put":
621
- patches.push(...updater.putDesiredQueries(clientID, [patch]));
622
- break;
623
- case "del":
624
- patches.push(
625
- ...updater.markDesiredQueriesAsInactive(
626
- clientID,
627
- [patch.hash],
628
- ttlClock
629
- )
630
- );
631
- break;
632
- case "clear":
633
- patches.push(...updater.clearDesiredQueries(clientID));
634
- break;
637
+ cvr = await this.#updateCVRConfig(
638
+ lc,
639
+ cvr,
640
+ clientID,
641
+ customQueryTransformMode,
642
+ (updater) => {
643
+ const { ttlClock } = cvr;
644
+ const patches = [];
645
+ if (clientSchema) {
646
+ updater.setClientSchema(lc, clientSchema);
647
+ }
648
+ if (profileID) {
649
+ updater.setProfileID(lc, profileID);
650
+ }
651
+ lc.debug?.(`applying ${desiredQueriesPatch?.length} query patches`);
652
+ if (desiredQueriesPatch?.length) {
653
+ for (const patch of desiredQueriesPatch) {
654
+ switch (patch.op) {
655
+ case "put":
656
+ patches.push(...updater.putDesiredQueries(clientID, [patch]));
657
+ break;
658
+ case "del":
659
+ patches.push(
660
+ ...updater.markDesiredQueriesAsInactive(
661
+ clientID,
662
+ [patch.hash],
663
+ ttlClock
664
+ )
665
+ );
666
+ break;
667
+ case "clear":
668
+ patches.push(...updater.clearDesiredQueries(clientID));
669
+ break;
670
+ }
635
671
  }
636
672
  }
637
- }
638
- const clientIDsToDelete = /* @__PURE__ */ new Set();
639
- if (activeClients) {
640
- const allClientIDs = Object.keys(cvr.clients);
641
- const activeClientsSet = new Set(activeClients);
642
- for (const id of allClientIDs) {
643
- if (!activeClientsSet.has(id)) {
644
- clientIDsToDelete.add(id);
673
+ const clientIDsToDelete = /* @__PURE__ */ new Set();
674
+ if (activeClients) {
675
+ const allClientIDs = Object.keys(cvr.clients);
676
+ const activeClientsSet = new Set(activeClients);
677
+ for (const id of allClientIDs) {
678
+ if (!activeClientsSet.has(id)) {
679
+ clientIDsToDelete.add(id);
680
+ }
645
681
  }
646
682
  }
647
- }
648
- if (deleted?.clientIDs?.length) {
649
- for (const cid of deleted.clientIDs) {
650
- assert(cid !== clientID, "cannot delete self");
651
- clientIDsToDelete.add(cid);
683
+ if (deleted?.clientIDs?.length) {
684
+ for (const cid of deleted.clientIDs) {
685
+ assert(cid !== clientID, "cannot delete self");
686
+ clientIDsToDelete.add(cid);
687
+ }
652
688
  }
689
+ for (const cid of clientIDsToDelete) {
690
+ const patchesDueToClient = updater.deleteClient(cid, ttlClock);
691
+ patches.push(...patchesDueToClient);
692
+ deletedClientIDs.push(cid);
693
+ }
694
+ if (deleted?.clientGroupIDs?.length) {
695
+ lc.debug?.(
696
+ `ignoring ${deleted.clientGroupIDs.length} deprecated client group deletes`
697
+ );
698
+ }
699
+ return patches;
653
700
  }
654
- for (const cid of clientIDsToDelete) {
655
- const patchesDueToClient = updater.deleteClient(cid, ttlClock);
656
- patches.push(...patchesDueToClient);
657
- deletedClientIDs.push(cid);
658
- }
659
- if (deleted?.clientGroupIDs?.length) {
660
- lc.debug?.(
661
- `ignoring ${deleted.clientGroupIDs.length} deprecated client group deletes`
662
- );
663
- }
664
- return patches;
665
- });
701
+ );
666
702
  if (deletedClientIDs.length && deleted?.clientIDs?.length || deletedClientGroupIDs.length) {
667
703
  const clients = this.#getClients();
668
704
  await Promise.allSettled(
@@ -676,6 +712,7 @@ class ViewSyncerService {
676
712
  );
677
713
  }
678
714
  this.#scheduleExpireEviction(lc, cvr);
715
+ return deletedClientIDs;
679
716
  });
680
717
  #scheduleExpireEviction(lc, cvr) {
681
718
  const { ttlClock } = cvr;
@@ -754,18 +791,24 @@ class ViewSyncerService {
754
791
  "Custom/named queries were requested but no `ZERO_QUERY_URL` is configured for Zero Cache."
755
792
  );
756
793
  }
757
- if (this.#customQueryTransformer && customQueries.size > 0) {
758
- const transformedCustomQueries = await this.#customQueryTransformer.transform(
759
- this.#getHeaderOptions(this.#queryConfig.forwardCookies),
760
- customQueries.values(),
761
- this.userQueryURL
762
- );
763
- this.#processTransformedCustomQueries(
794
+ const customQueryTransformer = this.#customQueryTransformer;
795
+ if (customQueryTransformer && customQueries.size > 0) {
796
+ const transformedCustomQueries = await this.#runPriorityOp(
764
797
  lc,
765
- transformedCustomQueries,
766
- (q) => transformedQueries.push(q),
767
- customQueries
798
+ "#hydrateUnchangedQueries transforming custom queries",
799
+ () => customQueryTransformer.transform(
800
+ this.#getHeaderOptions(this.#queryConfig.forwardCookies),
801
+ customQueries.values(),
802
+ this.userQueryURL
803
+ )
768
804
  );
805
+ if (Array.isArray(transformedCustomQueries)) {
806
+ for (const q of transformedCustomQueries) {
807
+ if (!("error" in q) && q.transformationHash === customQueries.get(q.id)?.transformationHash) {
808
+ transformedQueries.push(q);
809
+ }
810
+ }
811
+ }
769
812
  }
770
813
  for (const q of otherQueries) {
771
814
  const transformed = transformAndHashQuery(
@@ -787,7 +830,7 @@ class ViewSyncerService {
787
830
  transformationHash,
788
831
  transformedAst
789
832
  } of transformedQueries) {
790
- const timer = new TimeSliceTimer();
833
+ const timer = new TimeSliceTimer(lc);
791
834
  let count = 0;
792
835
  await startAsyncSpan(
793
836
  tracer,
@@ -869,11 +912,11 @@ class ViewSyncerService {
869
912
  this.#clients.get(clientId)?.sendQueryTransformApplicationErrors(errors);
870
913
  }
871
914
  }
872
- #addQueryMaterializationServerMetric(transformationHash, elapsed) {
915
+ #addQueryMaterializationServerMetric(queryID, elapsed) {
873
916
  this.#inspectorDelegate.addMetric(
874
917
  "query-materialization-server",
875
918
  elapsed,
876
- transformationHash
919
+ queryID
877
920
  );
878
921
  }
879
922
  /**
@@ -884,14 +927,12 @@ class ViewSyncerService {
884
927
  *
885
928
  * This must be called from within the #lock.
886
929
  */
887
- #syncQueryPipelineSet(lc, cvr) {
930
+ #syncQueryPipelineSet(lc, cvr, customQueryTransformMode) {
888
931
  return startAsyncSpan(tracer, "vs.#syncQueryPipelineSet", async () => {
889
932
  assert(
890
933
  this.#pipelines.initialized(),
891
934
  "pipelines must be initialized (syncQueryPipelineSet)"
892
935
  );
893
- const [hydratedQueries, byOriginalHash] = this.#pipelines.addedQueries();
894
- const hashToIDs = /* @__PURE__ */ new Map();
895
936
  if (this.#ttlClock === void 0) {
896
937
  this.#ttlClock = cvr.ttlClock;
897
938
  }
@@ -933,14 +974,22 @@ class ViewSyncerService {
933
974
  );
934
975
  }
935
976
  let erroredQueryIDs;
936
- if (this.#customQueryTransformer && customQueries.size > 0) {
977
+ const customQueriesToTransform = customQueryTransformMode === "all" ? [...customQueries.values()] : customQueryTransformMode && [...customQueries.values()].filter(
978
+ (q) => !this.#pipelines.queries().has(q.id)
979
+ );
980
+ const customQueryTransformer = this.#customQueryTransformer;
981
+ if (customQueryTransformer && customQueriesToTransform.length > 0) {
937
982
  const transformStart = performance.now();
938
983
  let transformedCustomQueries;
939
984
  try {
940
- transformedCustomQueries = await this.#customQueryTransformer.transform(
941
- this.#getHeaderOptions(true),
942
- customQueries.values(),
943
- this.userQueryURL
985
+ transformedCustomQueries = await this.#runPriorityOp(
986
+ lc,
987
+ "#syncQueryPipelineSet transforming custom queries",
988
+ () => customQueryTransformer.transform(
989
+ this.#getHeaderOptions(true),
990
+ customQueriesToTransform,
991
+ this.userQueryURL
992
+ )
944
993
  );
945
994
  this.#queryTransformations.add(1, { result: "success" });
946
995
  } catch (e) {
@@ -956,24 +1005,30 @@ class ViewSyncerService {
956
1005
  getLogLevel(transformedCustomQueries.kind)
957
1006
  );
958
1007
  }
959
- const successfullyTransformed = /* @__PURE__ */ new Map();
1008
+ const successfullyTransformedCustomQueries = /* @__PURE__ */ new Map();
960
1009
  erroredQueryIDs = this.#processTransformedCustomQueries(
961
1010
  lc,
962
1011
  transformedCustomQueries,
963
1012
  (q) => {
964
- successfullyTransformed.set(q.id, q);
965
- transformedQueries.push({
966
- id: q.id,
967
- origQuery: must(customQueries.get(q.id)),
968
- transformed: q
969
- });
1013
+ const origQuery = customQueries.get(q.id);
1014
+ if (origQuery) {
1015
+ successfullyTransformedCustomQueries.set(q.id, q);
1016
+ transformedQueries.push({
1017
+ id: q.id,
1018
+ origQuery,
1019
+ transformed: q
1020
+ });
1021
+ }
970
1022
  },
971
1023
  customQueries
972
1024
  );
973
- for (const [queryID, newTransform] of successfullyTransformed) {
974
- const existingTransforms = byOriginalHash.get(queryID);
975
- if (existingTransforms && existingTransforms.length > 0) {
976
- const oldHash = existingTransforms[0].transformationHash;
1025
+ for (const [
1026
+ queryID,
1027
+ newTransform
1028
+ ] of successfullyTransformedCustomQueries) {
1029
+ const existingTransformHash = cvr.queries[queryID]?.transformationHash;
1030
+ if (existingTransformHash) {
1031
+ const oldHash = existingTransformHash;
977
1032
  const newHash = newTransform.transformationHash;
978
1033
  if (oldHash !== newHash) {
979
1034
  lc.info?.(
@@ -987,31 +1042,15 @@ class ViewSyncerService {
987
1042
  }
988
1043
  }
989
1044
  }
990
- const serverQueries = transformedQueries.map(
991
- ({ id, origQuery, transformed }) => {
992
- const ids = hashToIDs.get(transformed.transformationHash);
993
- if (ids) {
994
- ids.push(id);
995
- } else {
996
- hashToIDs.set(transformed.transformationHash, [id]);
997
- }
998
- return {
999
- id,
1000
- ast: transformed.transformedAst,
1001
- transformationHash: transformed.transformationHash,
1002
- remove: expired(ttlClock, origQuery)
1003
- };
1004
- }
1005
- );
1006
- const addQueries = serverQueries.filter(
1007
- (q) => !q.remove && !hydratedQueries.has(q.transformationHash)
1045
+ const removeQueriesQueryIds = new Set(
1046
+ Object.values(cvr.queries).filter((q) => expired(ttlClock, q)).map((q) => q.id).concat(erroredQueryIDs || [])
1008
1047
  );
1009
- const removeQueries = serverQueries.filter((q) => q.remove);
1010
- const desiredQueries = new Set(
1011
- serverQueries.filter((q) => !q.remove).map((q) => q.transformationHash)
1012
- );
1013
- const unhydrateQueries = [...hydratedQueries].filter(
1014
- (transformationHash) => !desiredQueries.has(transformationHash)
1048
+ const addQueries = transformedQueries.map(({ id, transformed }) => ({
1049
+ id,
1050
+ ast: transformed.transformedAst,
1051
+ transformationHash: transformed.transformationHash
1052
+ })).filter(
1053
+ (q) => !removeQueriesQueryIds.has(q.id) && this.#pipelines.queries().get(q.id)?.transformationHash !== q.transformationHash
1015
1054
  );
1016
1055
  for (const q of addQueries) {
1017
1056
  const orig = cvr.queries[q.id];
@@ -1022,33 +1061,12 @@ class ViewSyncerService {
1022
1061
  orig.type === "custom" ? orig.name : orig.ast
1023
1062
  );
1024
1063
  }
1025
- if (erroredQueryIDs) {
1026
- const successfulHashes = new Set(
1027
- transformedQueries.map(
1028
- ({ transformed }) => transformed.transformationHash
1029
- )
1030
- );
1031
- for (const queryID of erroredQueryIDs) {
1032
- let lastKnownHash;
1033
- const cvrQuery = cvr.queries[queryID];
1034
- if (cvrQuery?.transformationHash) {
1035
- lastKnownHash = cvrQuery.transformationHash;
1036
- }
1037
- const transformationHash = lastKnownHash && successfulHashes.has(lastKnownHash) ? void 0 : lastKnownHash;
1038
- removeQueries.push({
1039
- id: queryID,
1040
- transformationHash
1041
- });
1042
- }
1043
- }
1044
- if (addQueries.length > 0 || removeQueries.length > 0 || unhydrateQueries.length > 0) {
1064
+ if (addQueries.length > 0 || removeQueriesQueryIds.size > 0) {
1045
1065
  await this.#addAndRemoveQueries(
1046
1066
  lc,
1047
1067
  cvr,
1048
1068
  addQueries,
1049
- removeQueries,
1050
- unhydrateQueries,
1051
- hashToIDs
1069
+ [...removeQueriesQueryIds].map((id) => ({ id }))
1052
1070
  );
1053
1071
  } else {
1054
1072
  await this.#catchupClients(lc, cvr);
@@ -1082,10 +1100,10 @@ class ViewSyncerService {
1082
1100
  }
1083
1101
  }
1084
1102
  // This must be called from within the #lock.
1085
- #addAndRemoveQueries(lc, cvr, addQueries, removeQueries, unhydrateQueries, hashToIDs) {
1103
+ #addAndRemoveQueries(lc, cvr, addQueries, removeQueries) {
1086
1104
  return startAsyncSpan(tracer, "vs.#addAndRemoveQueries", async () => {
1087
1105
  assert(
1088
- addQueries.length > 0 || removeQueries.length > 0 || unhydrateQueries.length > 0,
1106
+ addQueries.length > 0 || removeQueries.length > 0,
1089
1107
  "Must have queries to add or remove"
1090
1108
  );
1091
1109
  const start = performance.now();
@@ -1104,38 +1122,22 @@ class ViewSyncerService {
1104
1122
  removeQueries
1105
1123
  );
1106
1124
  const clients = this.#getClients();
1107
- const pokers = startPoke(
1108
- clients,
1109
- newVersion,
1110
- this.#pipelines.currentSchemaVersions()
1111
- );
1125
+ const pokers = startPoke(clients, newVersion);
1112
1126
  for (const patch of queryPatches) {
1113
1127
  await pokers.addPatch(patch);
1114
1128
  }
1115
1129
  for (const q of removeQueries) {
1116
- if (q.transformationHash) {
1117
- this.#pipelines.removeQuery(q.transformationHash);
1118
- }
1130
+ this.#pipelines.removeQuery(q.id);
1119
1131
  this.#inspectorDelegate.removeQuery(q.id);
1120
1132
  this.#queryReplacements.delete(q.id);
1121
1133
  }
1122
- for (const hash of unhydrateQueries) {
1123
- this.#pipelines.removeQuery(hash);
1124
- const ids = hashToIDs.get(hash);
1125
- if (ids) {
1126
- for (const id of ids) {
1127
- this.#inspectorDelegate.removeQuery(id);
1128
- this.#queryReplacements.delete(id);
1129
- }
1130
- }
1131
- }
1132
1134
  let totalProcessTime = 0;
1133
- const timer = new TimeSliceTimer();
1135
+ const timer = new TimeSliceTimer(lc);
1134
1136
  const pipelines = this.#pipelines;
1135
1137
  const hydrations = this.#hydrations;
1136
1138
  const hydrationTime = this.#hydrationTime;
1137
1139
  const self = this;
1138
- await yieldProcess();
1140
+ await yieldProcess(lc);
1139
1141
  function* generateRowChanges(slowHydrateThreshold) {
1140
1142
  for (const q of addQueries) {
1141
1143
  lc = lc.withContext("hash", q.id).withContext("transformationHash", q.transformationHash);
@@ -1148,10 +1150,7 @@ class ViewSyncerService {
1148
1150
  );
1149
1151
  const elapsed = timer.stop();
1150
1152
  totalProcessTime += elapsed;
1151
- self.#addQueryMaterializationServerMetric(
1152
- q.transformationHash,
1153
- elapsed
1154
- );
1153
+ self.#addQueryMaterializationServerMetric(q.id, elapsed);
1155
1154
  if (elapsed > slowHydrateThreshold) {
1156
1155
  lc.warn?.("Slow query materialization", elapsed, q.ast);
1157
1156
  }
@@ -1168,8 +1167,7 @@ class ViewSyncerService {
1168
1167
  timer,
1169
1168
  generateRowChanges(this.#slowHydrateThreshold),
1170
1169
  updater,
1171
- pokers,
1172
- hashToIDs
1170
+ pokers
1173
1171
  );
1174
1172
  for (const patch of await updater.deleteUnreferencedRows(lc)) {
1175
1173
  await pokers.addPatch(patch);
@@ -1213,11 +1211,7 @@ class ViewSyncerService {
1213
1211
  return startAsyncSpan(tracer, "vs.#catchupClients", async (span) => {
1214
1212
  current ??= cvr.version;
1215
1213
  const clients = this.#getClients();
1216
- const pokers = usePokers ?? startPoke(
1217
- clients,
1218
- cvr.version,
1219
- this.#pipelines.currentSchemaVersions()
1220
- );
1214
+ const pokers = usePokers ?? startPoke(clients, cvr.version);
1221
1215
  span.setAttribute("numClients", clients.length);
1222
1216
  const catchupFrom = clients.map((c) => c.version()).reduce((a, b) => cmpVersions(a, b) < 0 ? a : b, cvr.version);
1223
1217
  const rowPatches = this.#cvrStore.catchupRowPatches(
@@ -1233,6 +1227,8 @@ class ViewSyncerService {
1233
1227
  cvr,
1234
1228
  current
1235
1229
  );
1230
+ configPatches.catch(() => {
1231
+ });
1236
1232
  let rowPatchCount = 0;
1237
1233
  for await (const rows of rowPatches) {
1238
1234
  for (const row of rows) {
@@ -1268,7 +1264,7 @@ class ViewSyncerService {
1268
1264
  }
1269
1265
  });
1270
1266
  }
1271
- #processChanges(lc, timer, changes, updater, pokers, hashToIDs) {
1267
+ #processChanges(lc, timer, changes, updater, pokers) {
1272
1268
  return startAsyncSpan(tracer, "vs.#processChanges", async () => {
1273
1269
  const start = performance.now();
1274
1270
  const rows = new CustomKeyMap(rowIDString);
@@ -1291,24 +1287,14 @@ class ViewSyncerService {
1291
1287
  await timer.yieldProcess("yield in processChanges");
1292
1288
  continue;
1293
1289
  }
1294
- const {
1295
- type,
1296
- queryHash: transformationHash,
1297
- table,
1298
- rowKey,
1299
- row
1300
- } = change;
1301
- const queryIDs = must(
1302
- hashToIDs.get(transformationHash),
1303
- "could not find the original hash for the transformation hash"
1304
- );
1290
+ const { type, queryID, table, rowKey, row } = change;
1305
1291
  const rowID = { schema: "", table, rowKey };
1306
1292
  let parsedRow = rows.get(rowID);
1307
1293
  if (!parsedRow) {
1308
1294
  parsedRow = { refCounts: {} };
1309
1295
  rows.set(rowID, parsedRow);
1310
1296
  }
1311
- queryIDs.forEach((hash) => parsedRow.refCounts[hash] ??= 0);
1297
+ parsedRow.refCounts[queryID] ??= 0;
1312
1298
  const updateVersion = (row2) => {
1313
1299
  const { version: version2, contents } = contentsAndVersion(row2);
1314
1300
  parsedRow.version = version2;
@@ -1317,13 +1303,13 @@ class ViewSyncerService {
1317
1303
  switch (type) {
1318
1304
  case "add":
1319
1305
  updateVersion(row);
1320
- queryIDs.forEach((hash) => parsedRow.refCounts[hash]++);
1306
+ parsedRow.refCounts[queryID]++;
1321
1307
  break;
1322
1308
  case "edit":
1323
1309
  updateVersion(row);
1324
1310
  break;
1325
1311
  case "remove":
1326
- queryIDs.forEach((hash) => parsedRow.refCounts[hash]--);
1312
+ parsedRow.refCounts[queryID]--;
1327
1313
  break;
1328
1314
  default:
1329
1315
  unreachable(type);
@@ -1354,7 +1340,7 @@ class ViewSyncerService {
1354
1340
  "pipelines must be initialized (advancePipelines"
1355
1341
  );
1356
1342
  const start = performance.now();
1357
- const timer = new TimeSliceTimer();
1343
+ const timer = new TimeSliceTimer(lc);
1358
1344
  const { version: version2, numChanges, changes } = this.#pipelines.advance(timer);
1359
1345
  lc = lc.withContext("newVersion", version2);
1360
1346
  const updater = new CVRQueryDrivenUpdater(
@@ -1365,19 +1351,16 @@ class ViewSyncerService {
1365
1351
  );
1366
1352
  const pokers = startPoke(
1367
1353
  this.#getClients(cvr.version),
1368
- updater.updatedVersion(),
1369
- this.#pipelines.currentSchemaVersions()
1354
+ updater.updatedVersion()
1370
1355
  );
1371
1356
  lc.debug?.(`applying ${numChanges} to advance to ${version2}`);
1372
- const hashToIDs = createHashToIDs(cvr);
1373
1357
  try {
1374
1358
  await this.#processChanges(
1375
1359
  lc,
1376
1360
  await timer.start(),
1377
1361
  changes,
1378
1362
  updater,
1379
- pokers,
1380
- hashToIDs
1363
+ pokers
1381
1364
  );
1382
1365
  } catch (e) {
1383
1366
  if (e instanceof ResetPipelinesSignal) {
@@ -1444,22 +1427,8 @@ class ViewSyncerService {
1444
1427
  }
1445
1428
  }
1446
1429
  const CURSOR_PAGE_SIZE = 1e4;
1447
- function createHashToIDs(cvr) {
1448
- const hashToIDs = /* @__PURE__ */ new Map();
1449
- for (const { id, transformationHash } of Object.values(cvr.queries)) {
1450
- if (!transformationHash) {
1451
- continue;
1452
- }
1453
- if (hashToIDs.has(transformationHash)) {
1454
- must(hashToIDs.get(transformationHash)).push(id);
1455
- } else {
1456
- hashToIDs.set(transformationHash, [id]);
1457
- }
1458
- }
1459
- return hashToIDs;
1460
- }
1461
1430
  const timeSliceQueue = new Lock();
1462
- function yieldProcess() {
1431
+ function yieldProcess(_lc) {
1463
1432
  return timeSliceQueue.withLock(() => new Promise(setImmediate));
1464
1433
  }
1465
1434
  function contentsAndVersion(row) {
@@ -1547,8 +1516,12 @@ function hasExpiredQueries(cvr) {
1547
1516
  class TimeSliceTimer {
1548
1517
  #total = 0;
1549
1518
  #start = 0;
1519
+ #lc;
1520
+ constructor(lc) {
1521
+ this.#lc = lc;
1522
+ }
1550
1523
  async start() {
1551
- await yieldProcess();
1524
+ await yieldProcess(this.#lc);
1552
1525
  return this.startWithoutYielding();
1553
1526
  }
1554
1527
  startWithoutYielding() {
@@ -1558,7 +1531,7 @@ class TimeSliceTimer {
1558
1531
  }
1559
1532
  async yieldProcess(_msgForTesting) {
1560
1533
  this.#stopLap();
1561
- await yieldProcess();
1534
+ await yieldProcess(this.#lc);
1562
1535
  this.#startLap();
1563
1536
  }
1564
1537
  #startLap() {