@rocicorp/zero 0.5.2024110200 → 0.6.2024111700

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 (333) hide show
  1. package/out/{internal.js → advanced.js} +2 -2
  2. package/out/{chunk-YCMA66NH.js → chunk-5UY46OAF.js} +5 -2
  3. package/out/{chunk-YCMA66NH.js.map → chunk-5UY46OAF.js.map} +2 -2
  4. package/out/{chunk-INJ4WJHS.js → chunk-PIFWXXO2.js} +1209 -586
  5. package/out/chunk-PIFWXXO2.js.map +7 -0
  6. package/out/react.js.map +2 -2
  7. package/out/shared/src/browser-env.d.ts +17 -0
  8. package/out/shared/src/browser-env.d.ts.map +1 -1
  9. package/out/shared/src/expand.d.ts +7 -0
  10. package/out/shared/src/expand.d.ts.map +1 -0
  11. package/out/solid.js +5 -5
  12. package/out/solid.js.map +2 -2
  13. package/out/zero-cache/src/auth/load-authorization.d.ts +3 -0
  14. package/out/zero-cache/src/auth/load-authorization.d.ts.map +1 -0
  15. package/out/zero-cache/src/auth/load-authorization.js +21 -0
  16. package/out/zero-cache/src/auth/load-authorization.js.map +1 -0
  17. package/out/zero-cache/src/config/config.d.ts +112 -0
  18. package/out/zero-cache/src/config/config.d.ts.map +1 -0
  19. package/out/zero-cache/src/config/config.js +246 -0
  20. package/out/zero-cache/src/config/config.js.map +1 -0
  21. package/out/zero-cache/src/config/zero-config.d.ts +145 -964
  22. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  23. package/out/zero-cache/src/config/zero-config.js +242 -115
  24. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  25. package/out/zero-cache/src/db/delete-lite-db.d.ts +2 -0
  26. package/out/zero-cache/src/db/delete-lite-db.d.ts.map +1 -0
  27. package/out/zero-cache/src/db/delete-lite-db.js +7 -0
  28. package/out/zero-cache/src/db/delete-lite-db.js.map +1 -0
  29. package/out/zero-cache/src/db/migration.d.ts +1 -0
  30. package/out/zero-cache/src/db/migration.d.ts.map +1 -1
  31. package/out/zero-cache/src/db/migration.js +17 -7
  32. package/out/zero-cache/src/db/migration.js.map +1 -1
  33. package/out/zero-cache/src/db/pg-to-lite.d.ts +1 -1
  34. package/out/zero-cache/src/db/pg-to-lite.d.ts.map +1 -1
  35. package/out/zero-cache/src/db/pg-to-lite.js +7 -3
  36. package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
  37. package/out/zero-cache/src/db/short-lived-client.d.ts +16 -0
  38. package/out/zero-cache/src/db/short-lived-client.d.ts.map +1 -0
  39. package/out/zero-cache/src/db/short-lived-client.js +50 -0
  40. package/out/zero-cache/src/db/short-lived-client.js.map +1 -0
  41. package/out/zero-cache/src/db/specs.d.ts +12 -3
  42. package/out/zero-cache/src/db/specs.d.ts.map +1 -1
  43. package/out/zero-cache/src/db/specs.js +6 -1
  44. package/out/zero-cache/src/db/specs.js.map +1 -1
  45. package/out/zero-cache/src/db/transaction-pool.d.ts +8 -2
  46. package/out/zero-cache/src/db/transaction-pool.d.ts.map +1 -1
  47. package/out/zero-cache/src/db/transaction-pool.js +43 -9
  48. package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
  49. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  50. package/out/zero-cache/src/server/change-streamer.js +34 -9
  51. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  52. package/out/zero-cache/src/server/life-cycle.d.ts +1 -1
  53. package/out/zero-cache/src/server/life-cycle.d.ts.map +1 -1
  54. package/out/zero-cache/src/server/life-cycle.js +2 -3
  55. package/out/zero-cache/src/server/life-cycle.js.map +1 -1
  56. package/out/zero-cache/src/server/logging.d.ts.map +1 -1
  57. package/out/zero-cache/src/server/logging.js +2 -15
  58. package/out/zero-cache/src/server/logging.js.map +1 -1
  59. package/out/zero-cache/src/server/main.js +28 -10
  60. package/out/zero-cache/src/server/main.js.map +1 -1
  61. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  62. package/out/zero-cache/src/server/replicator.js +6 -5
  63. package/out/zero-cache/src/server/replicator.js.map +1 -1
  64. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  65. package/out/zero-cache/src/server/syncer.js +16 -12
  66. package/out/zero-cache/src/server/syncer.js.map +1 -1
  67. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +2 -3
  68. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  69. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +2 -3
  70. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  71. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +153 -2
  72. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  73. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +136 -19
  74. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  75. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +17 -9
  76. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
  77. package/out/zero-cache/src/services/change-streamer/change-streamer.js +4 -2
  78. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  79. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts +1 -0
  80. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -1
  81. package/out/zero-cache/src/services/change-streamer/forwarder.js +9 -2
  82. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
  83. package/out/zero-cache/src/services/change-streamer/pg/change-source.d.ts +10 -0
  84. package/out/zero-cache/src/services/change-streamer/pg/change-source.d.ts.map +1 -1
  85. package/out/zero-cache/src/services/change-streamer/pg/change-source.js +171 -24
  86. package/out/zero-cache/src/services/change-streamer/pg/change-source.js.map +1 -1
  87. package/out/zero-cache/src/services/change-streamer/pg/initial-sync.d.ts.map +1 -1
  88. package/out/zero-cache/src/services/change-streamer/pg/initial-sync.js +33 -19
  89. package/out/zero-cache/src/services/change-streamer/pg/initial-sync.js.map +1 -1
  90. package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.d.ts +62 -39
  91. package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.d.ts.map +1 -1
  92. package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.js +8 -40
  93. package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.js.map +1 -1
  94. package/out/zero-cache/src/services/change-streamer/pg/schema/init.d.ts +8 -0
  95. package/out/zero-cache/src/services/change-streamer/pg/schema/init.d.ts.map +1 -1
  96. package/out/zero-cache/src/services/change-streamer/pg/schema/init.js +41 -8
  97. package/out/zero-cache/src/services/change-streamer/pg/schema/init.js.map +1 -1
  98. package/out/zero-cache/src/services/change-streamer/pg/schema/published.d.ts +83 -13
  99. package/out/zero-cache/src/services/change-streamer/pg/schema/published.d.ts.map +1 -1
  100. package/out/zero-cache/src/services/change-streamer/pg/schema/published.js +15 -5
  101. package/out/zero-cache/src/services/change-streamer/pg/schema/published.js.map +1 -1
  102. package/out/zero-cache/src/services/change-streamer/pg/schema/shard.d.ts +39 -3
  103. package/out/zero-cache/src/services/change-streamer/pg/schema/shard.d.ts.map +1 -1
  104. package/out/zero-cache/src/services/change-streamer/pg/schema/shard.js +67 -36
  105. package/out/zero-cache/src/services/change-streamer/pg/schema/shard.js.map +1 -1
  106. package/out/zero-cache/src/services/change-streamer/pg/schema/validation.d.ts +8 -0
  107. package/out/zero-cache/src/services/change-streamer/pg/schema/validation.d.ts.map +1 -0
  108. package/out/zero-cache/src/services/change-streamer/pg/schema/validation.js +33 -0
  109. package/out/zero-cache/src/services/change-streamer/pg/schema/validation.js.map +1 -0
  110. package/out/zero-cache/src/services/change-streamer/schema/change.d.ts +5 -1
  111. package/out/zero-cache/src/services/change-streamer/schema/change.d.ts.map +1 -1
  112. package/out/zero-cache/src/services/change-streamer/schema/change.js +3 -0
  113. package/out/zero-cache/src/services/change-streamer/schema/change.js.map +1 -1
  114. package/out/zero-cache/src/services/change-streamer/schema/init.d.ts.map +1 -1
  115. package/out/zero-cache/src/services/change-streamer/schema/init.js +4 -6
  116. package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
  117. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +6 -1
  118. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
  119. package/out/zero-cache/src/services/change-streamer/schema/tables.js +19 -4
  120. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  121. package/out/zero-cache/src/services/change-streamer/storer.d.ts +29 -2
  122. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  123. package/out/zero-cache/src/services/change-streamer/storer.js +90 -8
  124. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  125. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +1 -0
  126. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
  127. package/out/zero-cache/src/services/change-streamer/subscriber.js +18 -3
  128. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  129. package/out/zero-cache/src/services/dispatcher/dispatcher.d.ts +5 -3
  130. package/out/zero-cache/src/services/dispatcher/dispatcher.d.ts.map +1 -1
  131. package/out/zero-cache/src/services/dispatcher/dispatcher.js +20 -5
  132. package/out/zero-cache/src/services/dispatcher/dispatcher.js.map +1 -1
  133. package/out/zero-cache/src/services/mutagen/mutagen.d.ts +6 -5
  134. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  135. package/out/zero-cache/src/services/mutagen/mutagen.js +26 -20
  136. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  137. package/out/zero-cache/src/services/mutagen/write-authorizer.d.ts +7 -6
  138. package/out/zero-cache/src/services/mutagen/write-authorizer.d.ts.map +1 -1
  139. package/out/zero-cache/src/services/mutagen/write-authorizer.js +10 -18
  140. package/out/zero-cache/src/services/mutagen/write-authorizer.js.map +1 -1
  141. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +1 -1
  142. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  143. package/out/zero-cache/src/services/replicator/incremental-sync.js +8 -8
  144. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  145. package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts.map +1 -1
  146. package/out/zero-cache/src/services/replicator/schema/replication-state.js +1 -10
  147. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
  148. package/out/zero-cache/src/services/running-state.d.ts +6 -1
  149. package/out/zero-cache/src/services/running-state.d.ts.map +1 -1
  150. package/out/zero-cache/src/services/running-state.js +23 -5
  151. package/out/zero-cache/src/services/running-state.js.map +1 -1
  152. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +49 -29
  153. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +1 -1
  154. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  155. package/out/zero-cache/src/services/view-syncer/view-syncer.js +2 -1
  156. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  157. package/out/zero-cache/src/types/lexi-version.d.ts +3 -2
  158. package/out/zero-cache/src/types/lexi-version.d.ts.map +1 -1
  159. package/out/zero-cache/src/types/lexi-version.js +8 -6
  160. package/out/zero-cache/src/types/lexi-version.js.map +1 -1
  161. package/out/zero-cache/src/types/processes.d.ts.map +1 -1
  162. package/out/zero-cache/src/types/processes.js +1 -0
  163. package/out/zero-cache/src/types/processes.js.map +1 -1
  164. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
  165. package/out/zero-cache/src/workers/replicator.js +2 -4
  166. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  167. package/out/zero-cache/src/workers/syncer.js +1 -1
  168. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  169. package/out/zero-client/src/client/crud.d.ts +56 -25
  170. package/out/zero-client/src/client/crud.d.ts.map +1 -1
  171. package/out/zero-client/src/client/http-string.d.ts +1 -0
  172. package/out/zero-client/src/client/http-string.d.ts.map +1 -1
  173. package/out/zero-client/src/client/log-options.d.ts +2 -1
  174. package/out/zero-client/src/client/log-options.d.ts.map +1 -1
  175. package/out/zero-client/src/client/options.d.ts +8 -8
  176. package/out/zero-client/src/client/options.d.ts.map +1 -1
  177. package/out/zero-client/src/client/protocol-version.d.ts +2 -0
  178. package/out/zero-client/src/client/protocol-version.d.ts.map +1 -0
  179. package/out/zero-client/src/client/server-option.d.ts.map +1 -1
  180. package/out/zero-client/src/client/zero-poke-handler.d.ts +1 -1
  181. package/out/zero-client/src/client/zero-poke-handler.d.ts.map +1 -1
  182. package/out/zero-client/src/client/zero.d.ts +26 -14
  183. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  184. package/out/zero-client/src/mod.d.ts +4 -2
  185. package/out/zero-client/src/mod.d.ts.map +1 -1
  186. package/out/zero-protocol/src/ast.d.ts +37 -21
  187. package/out/zero-protocol/src/ast.d.ts.map +1 -1
  188. package/out/zero-protocol/src/ast.js +21 -6
  189. package/out/zero-protocol/src/ast.js.map +1 -1
  190. package/out/zero-protocol/src/change-desired-queries.d.ts +16 -8
  191. package/out/zero-protocol/src/change-desired-queries.d.ts.map +1 -1
  192. package/out/zero-protocol/src/connect.d.ts +16 -8
  193. package/out/zero-protocol/src/connect.d.ts.map +1 -1
  194. package/out/zero-protocol/src/down.d.ts +16 -8
  195. package/out/zero-protocol/src/down.d.ts.map +1 -1
  196. package/out/zero-protocol/src/poke.d.ts +32 -16
  197. package/out/zero-protocol/src/poke.d.ts.map +1 -1
  198. package/out/zero-protocol/src/push.d.ts +18 -18
  199. package/out/zero-protocol/src/push.d.ts.map +1 -1
  200. package/out/zero-protocol/src/push.js +5 -5
  201. package/out/zero-protocol/src/push.js.map +1 -1
  202. package/out/zero-protocol/src/queries-patch.d.ts +24 -12
  203. package/out/zero-protocol/src/queries-patch.d.ts.map +1 -1
  204. package/out/zero-protocol/src/up.d.ts +18 -10
  205. package/out/zero-protocol/src/up.d.ts.map +1 -1
  206. package/out/zero-react/src/use-zero.d.ts.map +1 -1
  207. package/out/zero-schema/src/authorization.d.ts +25 -0
  208. package/out/zero-schema/src/authorization.d.ts.map +1 -0
  209. package/out/zero-schema/src/compiled-authorization.d.ts +379 -0
  210. package/out/zero-schema/src/compiled-authorization.d.ts.map +1 -0
  211. package/out/zero-schema/src/compiled-authorization.js +15 -0
  212. package/out/zero-schema/src/compiled-authorization.js.map +1 -0
  213. package/out/zero-schema/src/mod.d.ts +1 -0
  214. package/out/zero-schema/src/mod.d.ts.map +1 -1
  215. package/out/{zero-client/src/client → zero-schema/src}/normalized-schema.d.ts +2 -2
  216. package/out/zero-schema/src/normalized-schema.d.ts.map +1 -0
  217. package/out/zero-schema/src/table-schema.d.ts +15 -7
  218. package/out/zero-schema/src/table-schema.d.ts.map +1 -1
  219. package/out/zero-schema/src/table-schema.js.map +1 -1
  220. package/out/zero.js +10 -14
  221. package/out/zql/src/builder/builder.d.ts +1 -1
  222. package/out/zql/src/builder/builder.d.ts.map +1 -1
  223. package/out/zql/src/builder/builder.js +136 -30
  224. package/out/zql/src/builder/builder.js.map +1 -1
  225. package/out/zql/src/builder/filter.d.ts +2 -1
  226. package/out/zql/src/builder/filter.d.ts.map +1 -1
  227. package/out/zql/src/builder/filter.js +18 -0
  228. package/out/zql/src/builder/filter.js.map +1 -1
  229. package/out/zql/src/builder/like.d.ts +2 -2
  230. package/out/zql/src/builder/like.d.ts.map +1 -1
  231. package/out/zql/src/ivm/change.d.ts +1 -0
  232. package/out/zql/src/ivm/change.d.ts.map +1 -1
  233. package/out/zql/src/ivm/change.js +4 -1
  234. package/out/zql/src/ivm/change.js.map +1 -1
  235. package/out/zql/src/ivm/exists.d.ts +18 -0
  236. package/out/zql/src/ivm/exists.d.ts.map +1 -0
  237. package/out/zql/src/ivm/exists.js +186 -0
  238. package/out/zql/src/ivm/exists.js.map +1 -0
  239. package/out/zql/src/ivm/fan-in.d.ts +1 -1
  240. package/out/zql/src/ivm/fan-in.d.ts.map +1 -1
  241. package/out/zql/src/ivm/fan-in.js +3 -3
  242. package/out/zql/src/ivm/fan-in.js.map +1 -1
  243. package/out/zql/src/ivm/fan-out.d.ts.map +1 -1
  244. package/out/zql/src/ivm/fan-out.js +4 -7
  245. package/out/zql/src/ivm/fan-out.js.map +1 -1
  246. package/out/zql/src/ivm/filter.js +1 -1
  247. package/out/zql/src/ivm/filter.js.map +1 -1
  248. package/out/zql/src/ivm/memory-source.d.ts +10 -6
  249. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  250. package/out/zql/src/ivm/memory-source.js +60 -75
  251. package/out/zql/src/ivm/memory-source.js.map +1 -1
  252. package/out/zql/src/ivm/skip.js +1 -1
  253. package/out/zql/src/ivm/skip.js.map +1 -1
  254. package/out/zql/src/ivm/take.d.ts +1 -1
  255. package/out/zql/src/ivm/take.d.ts.map +1 -1
  256. package/out/zql/src/ivm/take.js +11 -7
  257. package/out/zql/src/ivm/take.js.map +1 -1
  258. package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
  259. package/out/zql/src/query/auth-query.d.ts +7 -3
  260. package/out/zql/src/query/auth-query.d.ts.map +1 -1
  261. package/out/zql/src/query/dnf.d.ts +10 -0
  262. package/out/zql/src/query/dnf.d.ts.map +1 -0
  263. package/out/zql/src/query/expression.d.ts +40 -23
  264. package/out/zql/src/query/expression.d.ts.map +1 -1
  265. package/out/zql/src/query/query-impl.d.ts +7 -6
  266. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  267. package/out/zql/src/query/query.d.ts +17 -46
  268. package/out/zql/src/query/query.d.ts.map +1 -1
  269. package/out/zqlite/src/db.d.ts.map +1 -1
  270. package/out/zqlite/src/db.js +19 -6
  271. package/out/zqlite/src/db.js.map +1 -1
  272. package/out/zqlite/src/table-source.d.ts +12 -3
  273. package/out/zqlite/src/table-source.d.ts.map +1 -1
  274. package/out/zqlite/src/table-source.js +81 -2
  275. package/out/zqlite/src/table-source.js.map +1 -1
  276. package/package.json +7 -11
  277. package/out/chunk-INJ4WJHS.js.map +0 -7
  278. package/out/datadog/src/datadog-log-sink.js +0 -231
  279. package/out/datadog/src/datadog-log-sink.js.map +0 -1
  280. package/out/datadog/src/mod.js +0 -2
  281. package/out/datadog/src/mod.js.map +0 -1
  282. package/out/shared/src/immutable.js +0 -2
  283. package/out/shared/src/immutable.js.map +0 -1
  284. package/out/shared/src/sorted-entries.js +0 -6
  285. package/out/shared/src/sorted-entries.js.map +0 -1
  286. package/out/shared/src/writable.js +0 -2
  287. package/out/shared/src/writable.js.map +0 -1
  288. package/out/zero/src/config.d.ts +0 -2
  289. package/out/zero/src/config.d.ts.map +0 -1
  290. package/out/zero/src/config.js +0 -2
  291. package/out/zero/src/config.js.map +0 -1
  292. package/out/zero-cache/src/config/config-query.d.ts +0 -19
  293. package/out/zero-cache/src/config/config-query.d.ts.map +0 -1
  294. package/out/zero-cache/src/config/config-query.js +0 -22
  295. package/out/zero-cache/src/config/config-query.js.map +0 -1
  296. package/out/zero-cache/src/config/define-config.d.ts +0 -43
  297. package/out/zero-cache/src/config/define-config.d.ts.map +0 -1
  298. package/out/zero-cache/src/config/define-config.js +0 -121
  299. package/out/zero-cache/src/config/define-config.js.map +0 -1
  300. package/out/zero-cache/src/config/refs.d.ts +0 -3
  301. package/out/zero-cache/src/config/refs.d.ts.map +0 -1
  302. package/out/zero-cache/src/config/refs.js +0 -14
  303. package/out/zero-cache/src/config/refs.js.map +0 -1
  304. package/out/zero-client/src/client/normalized-schema.d.ts.map +0 -1
  305. package/out/zero-client/src/client/normalized-schema.js +0 -31
  306. package/out/zero-client/src/client/normalized-schema.js.map +0 -1
  307. package/out/zero-protocol/src/ast-hash.js +0 -14
  308. package/out/zero-protocol/src/ast-hash.js.map +0 -1
  309. package/out/zero-schema/src/mod.js +0 -4
  310. package/out/zero-schema/src/mod.js.map +0 -1
  311. package/out/zero-schema/src/normalize-table-schema.js +0 -116
  312. package/out/zero-schema/src/normalize-table-schema.js.map +0 -1
  313. package/out/zero-schema/src/schema.js +0 -4
  314. package/out/zero-schema/src/schema.js.map +0 -1
  315. package/out/zql/src/ivm/array-view.js +0 -70
  316. package/out/zql/src/ivm/array-view.js.map +0 -1
  317. package/out/zql/src/ivm/view-apply-change.js +0 -156
  318. package/out/zql/src/ivm/view-apply-change.js.map +0 -1
  319. package/out/zql/src/ivm/view.js +0 -2
  320. package/out/zql/src/ivm/view.js.map +0 -1
  321. package/out/zql/src/query/auth-query.js +0 -26
  322. package/out/zql/src/query/auth-query.js.map +0 -1
  323. package/out/zql/src/query/expression.js +0 -121
  324. package/out/zql/src/query/expression.js.map +0 -1
  325. package/out/zql/src/query/query-impl.js +0 -291
  326. package/out/zql/src/query/query-impl.js.map +0 -1
  327. package/out/zql/src/query/query-internal.js +0 -2
  328. package/out/zql/src/query/query-internal.js.map +0 -1
  329. package/out/zql/src/query/query.js +0 -3
  330. package/out/zql/src/query/query.js.map +0 -1
  331. package/out/zql/src/query/typed-view.js +0 -2
  332. package/out/zql/src/query/typed-view.js.map +0 -1
  333. /package/out/{internal.js.map → advanced.js.map} +0 -0
@@ -1,5 +1,6 @@
1
1
  import { LogContext } from '@rocicorp/logger';
2
2
  import postgres from 'postgres';
3
+ import { AbortError } from '../../../../../shared/src/abort-error.js';
3
4
  import type { PostgresDB } from '../../../types/pg.js';
4
5
  import type { Change } from './change.js';
5
6
  export declare const PG_SCHEMA = "cdc";
@@ -18,5 +19,9 @@ export type ReplicationConfig = {
18
19
  publications: string[];
19
20
  };
20
21
  export declare function setupCDCTables(lc: LogContext, db: postgres.TransactionSql): Promise<void>;
21
- export declare function ensureReplicationConfig(lc: LogContext, db: PostgresDB, config: ReplicationConfig): Promise<void>;
22
+ export declare function markResetRequired(db: PostgresDB): Promise<void>;
23
+ export declare function ensureReplicationConfig(lc: LogContext, db: PostgresDB, config: ReplicationConfig, autoReset: boolean): Promise<void>;
24
+ export declare class AutoResetSignal extends AbortError {
25
+ readonly name = "AutoResetSignal";
26
+ }
22
27
  //# sourceMappingURL=tables.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../../../../../../zero-cache/src/services/change-streamer/schema/tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AAExC,eAAO,MAAM,SAAS,QAAQ,CAAC;AAI/B,MAAM,MAAM,cAAc,GAAG;IAG3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAYF;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAaF,wBAAsB,cAAc,CAClC,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,QAAQ,CAAC,cAAc,iBAI5B;AAED,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,iBAAiB,iBAkC1B"}
1
+ {"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../../../../../../zero-cache/src/services/change-streamer/schema/tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAC,UAAU,EAAC,MAAM,0CAA0C,CAAC;AAEpE,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AAExC,eAAO,MAAM,SAAS,QAAQ,CAAC;AAI/B,MAAM,MAAM,cAAc,GAAG;IAG3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAYF;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAcF,wBAAsB,cAAc,CAClC,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,QAAQ,CAAC,cAAc,iBAI5B;AAED,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,UAAU,iBAErD;AAED,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,OAAO,iBA4CnB;AAED,qBAAa,eAAgB,SAAQ,UAAU;IAC7C,QAAQ,CAAC,IAAI,qBAAqB;CACnC"}
@@ -1,5 +1,6 @@
1
1
  import { LogContext } from '@rocicorp/logger';
2
2
  import postgres from 'postgres';
3
+ import { AbortError } from '../../../../../shared/src/abort-error.js';
3
4
  import { equals } from '../../../../../shared/src/set-utils.js';
4
5
  export const PG_SCHEMA = 'cdc';
5
6
  const CREATE_CDC_SCHEMA = `CREATE SCHEMA IF NOT EXISTS cdc;`;
@@ -16,6 +17,7 @@ const CREATE_REPLICATION_CONFIG_TABLE = `
16
17
  CREATE TABLE cdc."replicationConfig" (
17
18
  "replicaVersion" TEXT NOT NULL,
18
19
  "publications" TEXT[] NOT NULL,
20
+ "resetRequired" BOOL,
19
21
  "lock" INTEGER PRIMARY KEY DEFAULT 1 CHECK (lock=1)
20
22
  );
21
23
  `;
@@ -24,26 +26,39 @@ export async function setupCDCTables(lc, db) {
24
26
  lc.info?.(`Setting up CDC tables`);
25
27
  await db.unsafe(CREATE_CDC_TABLES);
26
28
  }
27
- export async function ensureReplicationConfig(lc, db, config) {
29
+ export async function markResetRequired(db) {
30
+ await db `UPDATE cdc."replicationConfig" SET "resetRequired" = true`;
31
+ }
32
+ export async function ensureReplicationConfig(lc, db, config, autoReset) {
28
33
  // Restrict the fields of the supplied `config`.
29
34
  const { publications, replicaVersion } = config;
30
35
  const replicaConfig = { publications, replicaVersion };
31
36
  await db.begin(async (tx) => {
32
- const results = await tx `SELECT "replicaVersion", "publications" FROM cdc."replicationConfig"`;
37
+ const results = await tx `SELECT "replicaVersion", "publications", "resetRequired" FROM cdc."replicationConfig"`;
33
38
  if (results.length === 0) {
34
39
  return tx `INSERT INTO cdc."replicationConfig" ${tx(replicaConfig)}`;
35
40
  }
36
- const { replicaVersion, publications } = results[0];
41
+ const { replicaVersion, publications, resetRequired } = results[0];
37
42
  if (replicaVersion !== replicaConfig.replicaVersion ||
38
43
  !equals(new Set(publications), new Set(replicaConfig.publications))) {
39
44
  lc.info?.(`Data in cdc tables @${replicaVersion} is incompatible ` +
40
45
  `with replica @${replicaConfig.replicaVersion}. Clearing tables.`);
41
46
  return [
42
47
  tx `TRUNCATE TABLE cdc."changeLog"`,
43
- tx `UPDATE cdc."replicationConfig" SET ${tx(replicaConfig)}`,
48
+ tx `TRUNCATE TABLE cdc."replicationConfig"`,
49
+ tx `INSERT INTO cdc."replicationConfig" ${tx(replicaConfig)}`,
44
50
  ].map(stmt => stmt.execute());
45
51
  }
52
+ if (resetRequired) {
53
+ if (autoReset) {
54
+ throw new AutoResetSignal();
55
+ }
56
+ lc.warn?.('reset required but auto-reset is disabled');
57
+ }
46
58
  return [];
47
59
  });
48
60
  }
61
+ export class AutoResetSignal extends AbortError {
62
+ name = 'AutoResetSignal';
63
+ }
49
64
  //# sourceMappingURL=tables.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tables.js","sourceRoot":"","sources":["../../../../../../../zero-cache/src/services/change-streamer/schema/tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAC,MAAM,EAAC,MAAM,wCAAwC,CAAC;AAI9D,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC;AAE/B,MAAM,iBAAiB,GAAG,kCAAkC,CAAC;AAS7D,MAAM,uBAAuB,GAAG;;;;;;;;CAQ/B,CAAC;AAaF,MAAM,+BAA+B,GAAG;;;;;;CAMvC,CAAC;AAEF,MAAM,iBAAiB,GACrB,iBAAiB,GAAG,uBAAuB,GAAG,+BAA+B,CAAC;AAEhF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAAc,EACd,EAA2B;IAE3B,EAAE,CAAC,IAAI,EAAE,CAAC,uBAAuB,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,EAAc,EACd,EAAc,EACd,MAAyB;IAEzB,gDAAgD;IAChD,MAAM,EAAC,YAAY,EAAE,cAAc,EAAC,GAAG,MAAM,CAAC;IAC9C,MAAM,aAAa,GAAG,EAAC,YAAY,EAAE,cAAc,EAAC,CAAC;IAErD,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,EAAC,EAAE,EAAC,EAAE;QACxB,MAAM,OAAO,GAAG,MAAM,EAAE,CAKvB,sEAAsE,CAAC;QAExE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,CAAA,uCAAuC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;QACtE,CAAC;QAED,MAAM,EAAC,cAAc,EAAE,YAAY,EAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAClD,IACE,cAAc,KAAK,aAAa,CAAC,cAAc;YAC/C,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,EAAE,IAAI,GAAG,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,EACnE,CAAC;YACD,EAAE,CAAC,IAAI,EAAE,CACP,uBAAuB,cAAc,mBAAmB;gBACtD,iBAAiB,aAAa,CAAC,cAAc,oBAAoB,CACpE,CAAC;YACF,OAAO;gBACL,EAAE,CAAA,gCAAgC;gBAClC,EAAE,CAAA,sCAAsC,EAAE,CAAC,aAAa,CAAC,EAAE;aAC5D,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"tables.js","sourceRoot":"","sources":["../../../../../../../zero-cache/src/services/change-streamer/schema/tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAC,UAAU,EAAC,MAAM,0CAA0C,CAAC;AACpE,OAAO,EAAC,MAAM,EAAC,MAAM,wCAAwC,CAAC;AAI9D,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC;AAE/B,MAAM,iBAAiB,GAAG,kCAAkC,CAAC;AAS7D,MAAM,uBAAuB,GAAG;;;;;;;;CAQ/B,CAAC;AAaF,MAAM,+BAA+B,GAAG;;;;;;;CAOvC,CAAC;AAEF,MAAM,iBAAiB,GACrB,iBAAiB,GAAG,uBAAuB,GAAG,+BAA+B,CAAC;AAEhF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAAc,EACd,EAA2B;IAE3B,EAAE,CAAC,IAAI,EAAE,CAAC,uBAAuB,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAc;IACpD,MAAM,EAAE,CAAA,2DAA2D,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,EAAc,EACd,EAAc,EACd,MAAyB,EACzB,SAAkB;IAElB,gDAAgD;IAChD,MAAM,EAAC,YAAY,EAAE,cAAc,EAAC,GAAG,MAAM,CAAC;IAC9C,MAAM,aAAa,GAAG,EAAC,YAAY,EAAE,cAAc,EAAC,CAAC;IAErD,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,EAAC,EAAE,EAAC,EAAE;QACxB,MAAM,OAAO,GAAG,MAAM,EAAE,CAMvB,uFAAuF,CAAC;QAEzF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,CAAA,uCAAuC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;QACtE,CAAC;QAED,MAAM,EAAC,cAAc,EAAE,YAAY,EAAE,aAAa,EAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACjE,IACE,cAAc,KAAK,aAAa,CAAC,cAAc;YAC/C,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,EAAE,IAAI,GAAG,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,EACnE,CAAC;YACD,EAAE,CAAC,IAAI,EAAE,CACP,uBAAuB,cAAc,mBAAmB;gBACtD,iBAAiB,aAAa,CAAC,cAAc,oBAAoB,CACpE,CAAC;YACF,OAAO;gBACL,EAAE,CAAA,gCAAgC;gBAClC,EAAE,CAAA,wCAAwC;gBAC1C,EAAE,CAAA,uCAAuC,EAAE,CAAC,aAAa,CAAC,EAAE;aAC7D,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,IAAI,eAAe,EAAE,CAAC;YAC9B,CAAC;YACD,EAAE,CAAC,IAAI,EAAE,CAAC,2CAA2C,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,OAAO,eAAgB,SAAQ,UAAU;IACpC,IAAI,GAAG,iBAAiB,CAAC;CACnC"}
@@ -2,18 +2,45 @@ import { LogContext } from '@rocicorp/logger';
2
2
  import type { PostgresDB } from '../../types/pg.js';
3
3
  import type { Service } from '../service.js';
4
4
  import type { WatermarkedChange } from './change-streamer-service.js';
5
- import type { Commit } from './change-streamer.js';
5
+ import { type Commit } from './change-streamer.js';
6
6
  import { Subscriber } from './subscriber.js';
7
7
  /**
8
8
  * Handles the storage of changes and the catchup of subscribers
9
9
  * that are behind.
10
+ *
11
+ * In the context of catchup and cleanup, it is the responsibility of the
12
+ * Storer to decide whether a client can be caught up, or whether the
13
+ * changes needed to catch a client up have been purged.
14
+ *
15
+ * **Maintained invariant**: The Change DB is only empty for a
16
+ * completely new replica (i.e. initial-sync with no changes from the
17
+ * replication stream).
18
+ * * In this case, all new subscribers are expected start from the
19
+ * `replicaVersion`, which is the version at which initial sync
20
+ * was performed, and any attempts to catchup from a different
21
+ * point fail.
22
+ *
23
+ * Conversely, if non-initial changes have flowed through the system
24
+ * (i.e. via the replication stream), the ChangeDB must *not* be empty,
25
+ * and the earliest change in the `changeLog` represents the earliest
26
+ * "commit" from (after) which a subscriber can be caught up.
27
+ * * Any attempts to catchup from an earlier point must fail with
28
+ * a `WatermarkTooOld` error.
29
+ * * Failure to do so could result in streaming changes to the
30
+ * subscriber such that there is a gap in its replication history.
31
+ *
32
+ * Note: Subscribers (i.e. `incremental-syncer`) consider an "error" signal
33
+ * an unrecoverable error and shut down in response. This allows the
34
+ * production system to replace it with a new task and fresh copy of the
35
+ * replica backup.
10
36
  */
11
37
  export declare class Storer implements Service {
12
38
  #private;
13
39
  readonly id = "storer";
14
40
  readonly stopped: import("@rocicorp/resolver").Resolver<false, unknown>;
15
- constructor(lc: LogContext, db: PostgresDB, onCommit: (c: Commit) => void);
41
+ constructor(lc: LogContext, db: PostgresDB, replicaVersion: string, onCommit: (c: Commit) => void);
16
42
  getLastStoredWatermark(): Promise<string | null>;
43
+ purgeRecordsBefore(watermark: string): Promise<number>;
17
44
  store(entry: WatermarkedChange): void;
18
45
  catchup(sub: Subscriber): void;
19
46
  run(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"storer.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/storer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAO5C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAc,MAAM,EAAC,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAU3C;;;GAGG;AACH,qBAAa,MAAO,YAAW,OAAO;;IACpC,QAAQ,CAAC,EAAE,YAAY;IAKvB,QAAQ,CAAC,OAAO,wDAAqB;gBAEzB,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI;IAMnE,sBAAsB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOtD,KAAK,CAAC,KAAK,EAAE,iBAAiB;IAI9B,OAAO,CAAC,GAAG,EAAE,UAAU;IAIjB,GAAG;IAsIT,IAAI;CAIL"}
1
+ {"version":3,"file":"storer.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/storer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAO5C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAA8B,KAAK,MAAM,EAAC,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAU3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,MAAO,YAAW,OAAO;;IACpC,QAAQ,CAAC,EAAE,YAAY;IAMvB,QAAQ,CAAC,OAAO,wDAAqB;gBAGnC,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI;IAQzB,sBAAsB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOhD,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0B5D,KAAK,CAAC,KAAK,EAAE,iBAAiB;IAI9B,OAAO,CAAC,GAAG,EAAE,UAAU;IAIjB,GAAG;IAyKT,IAAI;CAIL"}
@@ -4,27 +4,78 @@ import { assert } from '../../../../shared/src/asserts.js';
4
4
  import { Queue } from '../../../../shared/src/queue.js';
5
5
  import { promiseVoid } from '../../../../shared/src/resolved-promises.js';
6
6
  import { Mode, TransactionPool } from '../../db/transaction-pool.js';
7
+ import { ErrorType } from './change-streamer.js';
7
8
  import { Subscriber } from './subscriber.js';
8
9
  /**
9
10
  * Handles the storage of changes and the catchup of subscribers
10
11
  * that are behind.
12
+ *
13
+ * In the context of catchup and cleanup, it is the responsibility of the
14
+ * Storer to decide whether a client can be caught up, or whether the
15
+ * changes needed to catch a client up have been purged.
16
+ *
17
+ * **Maintained invariant**: The Change DB is only empty for a
18
+ * completely new replica (i.e. initial-sync with no changes from the
19
+ * replication stream).
20
+ * * In this case, all new subscribers are expected start from the
21
+ * `replicaVersion`, which is the version at which initial sync
22
+ * was performed, and any attempts to catchup from a different
23
+ * point fail.
24
+ *
25
+ * Conversely, if non-initial changes have flowed through the system
26
+ * (i.e. via the replication stream), the ChangeDB must *not* be empty,
27
+ * and the earliest change in the `changeLog` represents the earliest
28
+ * "commit" from (after) which a subscriber can be caught up.
29
+ * * Any attempts to catchup from an earlier point must fail with
30
+ * a `WatermarkTooOld` error.
31
+ * * Failure to do so could result in streaming changes to the
32
+ * subscriber such that there is a gap in its replication history.
33
+ *
34
+ * Note: Subscribers (i.e. `incremental-syncer`) consider an "error" signal
35
+ * an unrecoverable error and shut down in response. This allows the
36
+ * production system to replace it with a new task and fresh copy of the
37
+ * replica backup.
11
38
  */
12
39
  export class Storer {
13
40
  id = 'storer';
14
41
  #lc;
15
42
  #db;
43
+ #replicaVersion;
16
44
  #onCommit;
17
45
  #queue = new Queue();
18
46
  stopped = resolver();
19
- constructor(lc, db, onCommit) {
47
+ constructor(lc, db, replicaVersion, onCommit) {
20
48
  this.#lc = lc;
21
49
  this.#db = db;
50
+ this.#replicaVersion = replicaVersion;
22
51
  this.#onCommit = onCommit;
23
52
  }
24
53
  async getLastStoredWatermark() {
25
54
  const result = await this.#db `SELECT MAX(watermark) as max FROM cdc."changeLog"`;
26
55
  return result[0].max;
27
56
  }
57
+ async purgeRecordsBefore(watermark) {
58
+ // This is a sanity check to guarantee the invariant of the "changeLog"
59
+ // that it always contains at least one entry (from which catchup can proceed),
60
+ // unless no replication changes have flowed through the system
61
+ // (i.e. watermark === replicaVersion).
62
+ const exists = await this.#db `
63
+ SELECT watermark FROM cdc."changeLog" WHERE watermark = ${watermark}`;
64
+ // Watermark boundaries should always be "commit" entries, which are the sole
65
+ // entry with that watermark (i.e. exists.length === 1). It follows that
66
+ // catchup, which proceeds from the next entry, always starts with a
67
+ // "begin" entry.
68
+ if (exists.length !== 1 && watermark !== this.#replicaVersion) {
69
+ this.#lc.warn?.(`rejecting attempted to purge up to watermark ${watermark} with ${exists.length} entries`);
70
+ return 0;
71
+ }
72
+ const result = await this.#db `
73
+ WITH purged AS (
74
+ DELETE FROM cdc."changeLog" WHERE watermark < ${watermark}
75
+ RETURNING watermark, pos
76
+ ) SELECT COUNT(*) as deleted FROM purged;`;
77
+ return Number(result[0].deleted);
78
+ }
28
79
  store(entry) {
29
80
  void this.#queue.enqueue(['change', entry]);
30
81
  }
@@ -100,6 +151,14 @@ export class Storer {
100
151
  // concurrently catchup any queued subscribers.
101
152
  this.#processCatchup(catchupQueue.splice(0));
102
153
  }
154
+ else if (tag === 'rollback') {
155
+ // Aborted transactions are not stored in the changeLog. Abort the current tx
156
+ // and process catchup of subscribers that were waiting for it to end.
157
+ tx.pool.abort();
158
+ await tx.pool.done();
159
+ tx = null;
160
+ this.#processCatchup(catchupQueue.splice(0));
161
+ }
103
162
  }
104
163
  this.#lc.info?.('storer stopped');
105
164
  }
@@ -117,20 +176,41 @@ export class Storer {
117
176
  try {
118
177
  await reader.processReadTask(async (tx) => {
119
178
  const start = Date.now();
179
+ // When starting from initial-sync, there won't be a change with a watermark
180
+ // equal to the replica version. This is the empty changeLog scenario.
181
+ let watermarkFound = sub.watermark === this.#replicaVersion;
120
182
  let count = 0;
121
183
  for await (const entries of tx `
122
184
  SELECT watermark, change FROM cdc."changeLog"
123
- WHERE watermark > ${sub.watermark}
185
+ WHERE watermark >= ${sub.watermark}
124
186
  ORDER BY watermark, pos`.cursor(10000)) {
125
187
  for (const entry of entries) {
126
- sub.catchup(toDownstream(entry));
127
- count++;
188
+ if (entry.watermark === sub.watermark) {
189
+ // This should be the first entry.
190
+ // Catchup starts from *after* the watermark.
191
+ watermarkFound = true;
192
+ }
193
+ else if (watermarkFound) {
194
+ sub.catchup(toDownstream(entry));
195
+ count++;
196
+ }
197
+ else {
198
+ this.#lc.warn?.(`rejecting subscriber at watermark ${sub.watermark}`);
199
+ sub.close(ErrorType.WatermarkTooOld, `earliest supported watermark is ${entry.watermark} (requested ${sub.watermark})`);
200
+ return;
201
+ }
128
202
  }
129
203
  }
130
- // Flushes the backlog of messages buffered during catchup and
131
- // allows the subscription to forward subsequent messages immediately.
132
- sub.setCaughtUp();
133
- this.#lc.info?.(`caught up ${sub.id} with ${count} changes (${Date.now() - start} ms)`);
204
+ if (watermarkFound) {
205
+ // Flushes the backlog of messages buffered during catchup and
206
+ // allows the subscription to forward subsequent messages immediately.
207
+ sub.setCaughtUp();
208
+ this.#lc.info?.(`caught up ${sub.id} with ${count} changes (${Date.now() - start} ms)`);
209
+ }
210
+ else {
211
+ this.#lc.warn?.(`rejecting subscriber at watermark ${sub.watermark}`);
212
+ sub.close(ErrorType.WatermarkNotFound, `cannot catch up from requested watermark ${sub.watermark}`);
213
+ }
134
214
  });
135
215
  }
136
216
  catch (err) {
@@ -150,6 +230,8 @@ function toDownstream(entry) {
150
230
  return [watermark, ['begin', change]];
151
231
  case 'commit':
152
232
  return [watermark, ['commit', change, { watermark }]];
233
+ case 'rollback':
234
+ return [watermark, ['rollback', change]];
153
235
  default:
154
236
  return [watermark, ['data', change]];
155
237
  }
@@ -1 +1 @@
1
- {"version":3,"file":"storer.js","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/storer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storer.js","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/storer.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ export declare class Subscriber {
13
13
  readonly id: string;
14
14
  constructor(id: string, watermark: string, downstream: Subscription<Downstream>);
15
15
  get watermark(): string;
16
+ get acked(): string;
16
17
  send(change: WatermarkedChange): void;
17
18
  /** catchup() is called on ChangeEntries loaded from the store. */
18
19
  catchup(change: WatermarkedChange): void;
@@ -1 +1 @@
1
- {"version":3,"file":"subscriber.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/subscriber.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAC,KAAK,UAAU,EAAE,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAEhE;;;;;;GAMG;AACH,qBAAa,UAAU;;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;gBAMlB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC;IAQtC,IAAI,SAAS,WAEZ;IAED,IAAI,CAAC,MAAM,EAAE,iBAAiB;IAW9B,kEAAkE;IAClE,OAAO,CAAC,MAAM,EAAE,iBAAiB;IAIjC;;;OAGG;IACH,WAAW;IAkBX,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO;IAIlB,KAAK,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM;CAM1C"}
1
+ {"version":3,"file":"subscriber.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/subscriber.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAC,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAC,KAAK,UAAU,EAAE,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAEhE;;;;;;GAMG;AACH,qBAAa,UAAU;;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;gBAOlB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC;IAStC,IAAI,SAAS,WAEZ;IAED,IAAI,KAAK,WAER;IAED,IAAI,CAAC,MAAM,EAAE,iBAAiB;IAW9B,kEAAkE;IAClE,OAAO,CAAC,MAAM,EAAE,iBAAiB;IAIjC;;;OAGG;IACH,WAAW;IAuBX,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO;IAIlB,KAAK,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM;CAS1C"}
@@ -1,4 +1,5 @@
1
1
  import { assert } from '../../../../shared/src/asserts.js';
2
+ import { max } from '../../types/lexi-version.js';
2
3
  import { Subscription } from '../../types/subscription.js';
3
4
  import { ErrorType } from './change-streamer.js';
4
5
  /**
@@ -12,16 +13,21 @@ export class Subscriber {
12
13
  id;
13
14
  #downstream;
14
15
  #watermark;
16
+ #acked;
15
17
  #backlog;
16
18
  constructor(id, watermark, downstream) {
17
19
  this.id = id;
18
20
  this.#downstream = downstream;
19
21
  this.#watermark = watermark;
22
+ this.#acked = watermark;
20
23
  this.#backlog = [];
21
24
  }
22
25
  get watermark() {
23
26
  return this.#watermark;
24
27
  }
28
+ get acked() {
29
+ return this.#acked;
30
+ }
25
31
  send(change) {
26
32
  const [watermark] = change;
27
33
  if (watermark > this.#watermark) {
@@ -51,9 +57,14 @@ export class Subscriber {
51
57
  #send(change) {
52
58
  const [watermark, downstream] = change;
53
59
  if (watermark > this.watermark) {
54
- this.#downstream.push(downstream);
60
+ const { result } = this.#downstream.push(downstream);
55
61
  if (downstream[0] === 'commit') {
56
62
  this.#watermark = watermark;
63
+ void result.then(val => {
64
+ if (val === 'consumed') {
65
+ this.#acked = max(this.#acked, watermark);
66
+ }
67
+ });
57
68
  }
58
69
  }
59
70
  }
@@ -62,9 +73,13 @@ export class Subscriber {
62
73
  }
63
74
  close(error, message) {
64
75
  if (error) {
65
- this.#downstream.push(['error', { type: error, message }]);
76
+ const { result } = this.#downstream.push(['error', { type: error, message }]);
77
+ // Wait for the ACK of the error message before closing the connection.
78
+ void result.then(() => this.#downstream.cancel());
79
+ }
80
+ else {
81
+ this.#downstream.cancel();
66
82
  }
67
- this.#downstream.cancel();
68
83
  }
69
84
  }
70
85
  //# sourceMappingURL=subscriber.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subscriber.js","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/subscriber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,mCAAmC,CAAC;AACzD,OAAO,EAAC,YAAY,EAAC,MAAM,6BAA6B,CAAC;AAEzD,OAAO,EAAkB,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,OAAO,UAAU;IACZ,EAAE,CAAS;IACX,WAAW,CAA2B;IAC/C,UAAU,CAAS;IACnB,QAAQ,CAA6B;IAErC,YACE,EAAU,EACV,SAAiB,EACjB,UAAoC;QAEpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,MAAyB;QAC5B,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;QAC3B,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,OAAO,CAAC,MAAyB;QAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAyB;QAC7B,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,MAAM,CAAC;QACvC,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAClC,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAa;QAChB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,KAAiB,EAAE,OAAgB;QACvC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;CACF"}
1
+ {"version":3,"file":"subscriber.js","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/subscriber.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,16 @@
1
1
  import { LogContext } from '@rocicorp/logger';
2
2
  import type { Worker } from '../../types/processes.js';
3
3
  import { HttpService, type Options } from '../http-service.js';
4
- export declare const CONNECT_URL_PATTERN = "/api/sync/:version/connect";
5
4
  export type Workers = {
6
5
  syncers: Worker[];
7
6
  };
8
- export declare const DEFAULT_PORT = 4848;
9
7
  export declare class Dispatcher extends HttpService {
10
8
  #private;
11
9
  readonly id = "dispatcher";
12
- constructor(lc: LogContext, workersByHostname: (hostname: string) => Workers, opts?: Options);
10
+ constructor(lc: LogContext, workersByHostname: (hostname: string) => Workers, opts: Options);
13
11
  }
12
+ export declare function parseSyncPath(url: URL): {
13
+ base?: string;
14
+ version: string;
15
+ } | undefined;
14
16
  //# sourceMappingURL=dispatcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/dispatcher/dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAG5C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAC,WAAW,EAAE,KAAK,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAI7D,eAAO,MAAM,mBAAmB,+BAA+B,CAAC;AAEhE,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,YAAY,OAAO,CAAC;AAEjC,qBAAa,UAAW,SAAQ,WAAW;;IACzC,QAAQ,CAAC,EAAE,gBAAgB;gBAIzB,EAAE,EAAE,UAAU,EACd,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,EAChD,IAAI,GAAE,OAA8B;CA8BvC"}
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/dispatcher/dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAI5C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAC,WAAW,EAAE,KAAK,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAU7D,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,qBAAa,UAAW,SAAQ,WAAW;;IACzC,QAAQ,CAAC,EAAE,gBAAgB;gBAIzB,EAAE,EAAE,UAAU,EACd,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,EAChD,IAAI,EAAE,OAAO;CAmChB;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,GAAG,GACP;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,GAAG,SAAS,CAG9C"}
@@ -1,15 +1,18 @@
1
1
  import { LogContext } from '@rocicorp/logger';
2
2
  import { IncomingMessage } from 'http';
3
+ import UrlPattern from 'url-pattern';
3
4
  import { h32 } from '../../../../shared/src/xxhash.js';
4
5
  import { HttpService } from '../http-service.js';
5
6
  import { getConnectParams } from './connect-params.js';
6
7
  import { installWebSocketHandoff } from './websocket-handoff.js';
7
- export const CONNECT_URL_PATTERN = '/api/sync/:version/connect';
8
- export const DEFAULT_PORT = 4848;
8
+ // The server allows the client to use any /:base/ path to facilitate
9
+ // servicing requests on the same domain as the application.
10
+ const CONNECT_URL_PATTERN = new UrlPattern('(/:base)/sync/:version/connect');
11
+ const SUPPORTED_VERSION = 'v1';
9
12
  export class Dispatcher extends HttpService {
10
13
  id = 'dispatcher';
11
14
  #workersByHostname;
12
- constructor(lc, workersByHostname, opts = { port: DEFAULT_PORT }) {
15
+ constructor(lc, workersByHostname, opts) {
13
16
  super('dispatcher', lc, opts, fastify => {
14
17
  fastify.get('/', (_req, res) => res.send('OK'));
15
18
  installWebSocketHandoff(fastify.server, req => this.#handoff(req));
@@ -17,8 +20,16 @@ export class Dispatcher extends HttpService {
17
20
  this.#workersByHostname = workersByHostname;
18
21
  }
19
22
  #handoff(req) {
20
- const { headers, url } = req;
21
- const { params, error } = getConnectParams(new URL(url ?? '', 'http://unused/'), headers);
23
+ const { headers, url: u } = req;
24
+ const url = new URL(u ?? '', 'http://unused/');
25
+ const syncPath = parseSyncPath(url);
26
+ if (!syncPath) {
27
+ throw new Error(`Invalid sync URL: ${u}`);
28
+ }
29
+ if (syncPath.version !== SUPPORTED_VERSION) {
30
+ throw new Error(`Unsupported sync version: ${u}`);
31
+ }
32
+ const { params, error } = getConnectParams(url, headers);
22
33
  if (error !== null) {
23
34
  throw new Error(error);
24
35
  }
@@ -33,4 +44,8 @@ export class Dispatcher extends HttpService {
33
44
  return { payload: params, receiver: syncers[syncer] };
34
45
  }
35
46
  }
47
+ export function parseSyncPath(url) {
48
+ // The match() returns both null and undefined.
49
+ return CONNECT_URL_PATTERN.match(url.pathname) || undefined;
50
+ }
36
51
  //# sourceMappingURL=dispatcher.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/dispatcher/dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAC,eAAe,EAAC,MAAM,MAAM,CAAC;AACrC,OAAO,EAAC,GAAG,EAAC,MAAM,kCAAkC,CAAC;AAErD,OAAO,EAAC,WAAW,EAAe,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAC,uBAAuB,EAAC,MAAM,wBAAwB,CAAC;AAE/D,MAAM,CAAC,MAAM,mBAAmB,GAAG,4BAA4B,CAAC;AAMhE,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AAEjC,MAAM,OAAO,UAAW,SAAQ,WAAW;IAChC,EAAE,GAAG,YAAY,CAAC;IAClB,kBAAkB,CAAgC;IAE3D,YACE,EAAc,EACd,iBAAgD,EAChD,OAAgB,EAAC,IAAI,EAAE,YAAY,EAAC;QAEpC,KAAK,CAAC,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE;YACtC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAChD,uBAAuB,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,kBAAkB,GAAG,iBAAiB,CAAC;IAC9C,CAAC;IAED,QAAQ,CAAC,GAAoB;QAC3B,MAAM,EAAC,OAAO,EAAE,GAAG,EAAC,GAAG,GAAG,CAAC;QAC3B,MAAM,EAAC,MAAM,EAAE,KAAK,EAAC,GAAG,gBAAgB,CACtC,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,gBAAgB,CAAC,EACpC,OAAO,CACR,CAAC;QACF,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,EAAC,IAAI,EAAC,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,EAAC,aAAa,EAAC,GAAG,MAAM,CAAC;QAC/B,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QAEnD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,cAAc,aAAa,cAAc,MAAM,EAAE,CAAC,CAAC;QACpE,OAAO,EAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,EAAC,CAAC;IACtD,CAAC;CACF"}
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/dispatcher/dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAC,eAAe,EAAC,MAAM,MAAM,CAAC;AACrC,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,EAAC,GAAG,EAAC,MAAM,kCAAkC,CAAC;AAErD,OAAO,EAAC,WAAW,EAAe,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAC,uBAAuB,EAAC,MAAM,wBAAwB,CAAC;AAE/D,qEAAqE;AACrE,4DAA4D;AAC5D,MAAM,mBAAmB,GAAG,IAAI,UAAU,CAAC,gCAAgC,CAAC,CAAC;AAE7E,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAM/B,MAAM,OAAO,UAAW,SAAQ,WAAW;IAChC,EAAE,GAAG,YAAY,CAAC;IAClB,kBAAkB,CAAgC;IAE3D,YACE,EAAc,EACd,iBAAgD,EAChD,IAAa;QAEb,KAAK,CAAC,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE;YACtC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAChD,uBAAuB,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,kBAAkB,GAAG,iBAAiB,CAAC;IAC9C,CAAC;IAED,QAAQ,CAAC,GAAoB;QAC3B,MAAM,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAC,GAAG,GAAG,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,QAAQ,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,EAAC,MAAM,EAAE,KAAK,EAAC,GAAG,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,EAAC,IAAI,EAAC,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,EAAC,aAAa,EAAC,GAAG,MAAM,CAAC;QAC/B,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QAEnD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,cAAc,aAAa,cAAc,MAAM,EAAE,CAAC,CAAC;QACpE,OAAO,EAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,EAAC,CAAC;IACtD,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAC3B,GAAQ;IAER,+CAA+C;IAC/C,OAAO,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC;AAC9D,CAAC"}
@@ -2,7 +2,8 @@ import type { LogContext } from '@rocicorp/logger';
2
2
  import type { JWTPayload } from 'jose';
3
3
  import postgres from 'postgres';
4
4
  import { ErrorKind } from '../../../../zero-protocol/src/mod.js';
5
- import { type CreateOp, type Mutation, type SetOp } from '../../../../zero-protocol/src/push.js';
5
+ import { type InsertOp, type Mutation, type UpsertOp } from '../../../../zero-protocol/src/push.js';
6
+ import type { AuthorizationConfig } from '../../../../zero-schema/src/compiled-authorization.js';
6
7
  import { type ZeroConfig } from '../../config/zero-config.js';
7
8
  import type { PostgresDB } from '../../types/pg.js';
8
9
  import type { Service } from '../service.js';
@@ -17,12 +18,12 @@ export interface Mutagen {
17
18
  export declare class MutagenService implements Mutagen, Service {
18
19
  #private;
19
20
  readonly id: string;
20
- constructor(lc: LogContext, shardID: string, clientGroupID: string, upstream: PostgresDB, config: ZeroConfig);
21
+ constructor(lc: LogContext, shardID: string, clientGroupID: string, upstream: PostgresDB, config: ZeroConfig, authorizationConfig: AuthorizationConfig);
21
22
  processMutation(mutation: Mutation, authData: JWTPayload, schemaVersion: number): Promise<MutationError | undefined>;
22
23
  run(): Promise<void>;
23
24
  stop(): Promise<void>;
24
25
  }
25
- export declare function processMutation(lc: LogContext | undefined, authData: JWTPayload, db: PostgresDB, shardID: string, clientGroupID: string, mutation: Mutation, writeAuthorizer: WriteAuthorizer, schemaVersion: number, onTxStart?: () => void): Promise<MutationError | undefined>;
26
- export declare function getCreateSQL(tx: postgres.TransactionSql, create: CreateOp): postgres.PendingQuery<postgres.Row[]>;
27
- export declare function getSetSQL(tx: postgres.TransactionSql, set: SetOp): postgres.PendingQuery<postgres.Row[]>;
26
+ export declare function processMutation(lc: LogContext | undefined, authData: JWTPayload, db: PostgresDB, shardID: string, clientGroupID: string, mutation: Mutation, writeAuthorizer: WriteAuthorizer, schemaVersion: number, onTxStart?: () => void | Promise<void>): Promise<MutationError | undefined>;
27
+ export declare function getInsertSQL(tx: postgres.TransactionSql, create: InsertOp): postgres.PendingQuery<postgres.Row[]>;
28
+ export declare function getUpsertSQL(tx: postgres.TransactionSql, set: UpsertOp): postgres.PendingQuery<postgres.Row[]>;
28
29
  //# sourceMappingURL=mutagen.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mutagen.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/mutagen/mutagen.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,MAAM,CAAC;AACrC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAGhC,OAAO,EAAC,SAAS,EAAC,MAAM,sCAAsC,CAAC;AAK/D,OAAO,EAGL,KAAK,QAAQ,EAEb,KAAK,QAAQ,EACb,KAAK,KAAK,EAEX,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAC,KAAK,UAAU,EAAC,MAAM,6BAA6B,CAAC;AAG5D,OAAO,KAAK,EAAC,UAAU,EAAsB,MAAM,mBAAmB,CAAC;AAIvE,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAsB,KAAK,eAAe,EAAC,MAAM,uBAAuB,CAAC;AAIhF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,mBAAmB;IAC9D,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,eAAe,CACb,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,UAAU,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;CACvC;AAED,qBAAa,cAAe,YAAW,OAAO,EAAE,OAAO;;IACrD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;gBAUlB,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,UAAU;IA2BpB,eAAe,CACb,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,UAAU,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAmBrC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAItB;AAID,wBAAsB,eAAe,CACnC,EAAE,EAAE,UAAU,GAAG,SAAS,EAC1B,QAAQ,EAAE,UAAU,EACpB,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,QAAQ,EAClB,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,IAAI,GACrB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAoGpC;AAwED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,cAAc,EAC3B,MAAM,EAAE,QAAQ,GACf,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAEvC;AAED,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,cAAc,EAC3B,GAAG,EAAE,KAAK,GACT,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAOvC"}
1
+ {"version":3,"file":"mutagen.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/mutagen/mutagen.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,MAAM,CAAC;AACrC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAGhC,OAAO,EAAC,SAAS,EAAC,MAAM,sCAAsC,CAAC;AAK/D,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,QAAQ,EAEb,KAAK,QAAQ,EACd,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,uDAAuD,CAAC;AAE/F,OAAO,EAAC,KAAK,UAAU,EAAC,MAAM,6BAA6B,CAAC;AAG5D,OAAO,KAAK,EAAC,UAAU,EAAsB,MAAM,mBAAmB,CAAC;AAIvE,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAsB,KAAK,eAAe,EAAC,MAAM,uBAAuB,CAAC;AAIhF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,mBAAmB;IAC9D,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,eAAe,CACb,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,UAAU,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;CACvC;AAED,qBAAa,cAAe,YAAW,OAAO,EAAE,OAAO;;IACrD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;gBAUlB,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,UAAU,EAClB,mBAAmB,EAAE,mBAAmB;IA4B1C,eAAe,CACb,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,UAAU,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAmBrC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAItB;AAID,wBAAsB,eAAe,CACnC,EAAE,EAAE,UAAU,GAAG,SAAS,EAC1B,QAAQ,EAAE,UAAU,EACpB,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,QAAQ,EAClB,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACrC,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAyGpC;AAwED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,cAAc,EAC3B,MAAM,EAAE,QAAQ,GACf,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAEvC;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,cAAc,EAC3B,GAAG,EAAE,QAAQ,GACZ,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAOvC"}