@rocicorp/zero 1.9.1-canary.1 → 1.10.0-canary.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (344) hide show
  1. package/out/analyze-query/src/analyze-cli.js +2 -2
  2. package/out/analyze-query/src/analyze-cli.js.map +1 -1
  3. package/out/replicache/src/db/commit.js +1 -4
  4. package/out/replicache/src/db/commit.js.map +1 -1
  5. package/out/replicache/src/db/read.d.ts +1 -0
  6. package/out/replicache/src/db/read.d.ts.map +1 -1
  7. package/out/replicache/src/db/read.js +1 -4
  8. package/out/replicache/src/db/read.js.map +1 -1
  9. package/out/replicache/src/db/write.d.ts +2 -1
  10. package/out/replicache/src/db/write.d.ts.map +1 -1
  11. package/out/replicache/src/db/write.js +4 -51
  12. package/out/replicache/src/db/write.js.map +1 -1
  13. package/out/replicache/src/persist/clients.d.ts +1 -0
  14. package/out/replicache/src/persist/clients.d.ts.map +1 -1
  15. package/out/replicache/src/persist/clients.js +4 -31
  16. package/out/replicache/src/persist/clients.js.map +1 -1
  17. package/out/replicache/src/process-env.d.ts +28 -0
  18. package/out/replicache/src/process-env.d.ts.map +1 -0
  19. package/out/replicache/src/replicache-impl.d.ts.map +1 -1
  20. package/out/replicache/src/replicache-impl.js.map +1 -1
  21. package/out/replicache/src/scan-iterator.js +2 -14
  22. package/out/replicache/src/scan-iterator.js.map +1 -1
  23. package/out/replicache/src/subscriptions.d.ts +1 -0
  24. package/out/replicache/src/subscriptions.d.ts.map +1 -1
  25. package/out/replicache/src/subscriptions.js +2 -10
  26. package/out/replicache/src/subscriptions.js.map +1 -1
  27. package/out/replicache/src/transactions.d.ts +1 -0
  28. package/out/replicache/src/transactions.d.ts.map +1 -1
  29. package/out/replicache/src/transactions.js +2 -4
  30. package/out/replicache/src/transactions.js.map +1 -1
  31. package/out/zero/package.js +2 -2
  32. package/out/zero/package.js.map +1 -1
  33. package/out/zero-cache/src/config/normalize.d.ts +1 -0
  34. package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
  35. package/out/zero-cache/src/config/normalize.js +10 -1
  36. package/out/zero-cache/src/config/normalize.js.map +1 -1
  37. package/out/zero-cache/src/config/zero-config.d.ts +43 -1
  38. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  39. package/out/zero-cache/src/config/zero-config.js +139 -20
  40. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  41. package/out/zero-cache/src/db/migration.js +1 -1
  42. package/out/zero-cache/src/observability/metrics.d.ts +5 -0
  43. package/out/zero-cache/src/observability/metrics.d.ts.map +1 -1
  44. package/out/zero-cache/src/observability/metrics.js +15 -1
  45. package/out/zero-cache/src/observability/metrics.js.map +1 -1
  46. package/out/zero-cache/src/server/backup-watermark-poller.js +31 -0
  47. package/out/zero-cache/src/server/backup-watermark-poller.js.map +1 -0
  48. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  49. package/out/zero-cache/src/server/change-streamer.js +90 -30
  50. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  51. package/out/zero-cache/src/server/main.d.ts.map +1 -1
  52. package/out/zero-cache/src/server/main.js +5 -15
  53. package/out/zero-cache/src/server/main.js.map +1 -1
  54. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  55. package/out/zero-cache/src/server/replicator.js +46 -3
  56. package/out/zero-cache/src/server/replicator.js.map +1 -1
  57. package/out/zero-cache/src/server/runner/run-worker.js +2 -1
  58. package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
  59. package/out/zero-cache/src/server/worker-urls.d.ts +1 -1
  60. package/out/zero-cache/src/server/worker-urls.js +2 -2
  61. package/out/zero-cache/src/server/worker-urls.js.map +1 -1
  62. package/out/zero-cache/src/services/change-source/change-source.d.ts +4 -2
  63. package/out/zero-cache/src/services/change-source/change-source.d.ts.map +1 -1
  64. package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts +35 -0
  65. package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts.map +1 -0
  66. package/out/zero-cache/src/services/change-source/common/replica-restore.js +34 -0
  67. package/out/zero-cache/src/services/change-source/common/replica-restore.js.map +1 -0
  68. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts +2 -0
  69. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
  70. package/out/zero-cache/src/services/change-source/common/replica-schema.js +73 -1
  71. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  72. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts +2 -6
  73. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
  74. package/out/zero-cache/src/services/change-source/custom/change-source.js +16 -7
  75. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  76. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +4 -7
  77. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
  78. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +7 -7
  79. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  80. package/out/zero-cache/src/services/change-source/pg/change-source.js +75 -23
  81. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  82. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +9 -1
  83. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  84. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +34 -4
  85. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  86. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +1 -1
  87. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts +4 -2
  88. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts.map +1 -1
  89. package/out/zero-cache/src/services/change-source/pg/replication-slots.js +7 -4
  90. package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
  91. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts +0 -5
  92. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
  93. package/out/zero-cache/src/services/change-source/pg/schema/init.js +29 -41
  94. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  95. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +35 -16
  96. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
  97. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +77 -7
  98. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  99. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +1 -1
  100. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
  101. package/out/zero-cache/src/services/change-source/protocol/current/data.js +1 -12
  102. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  103. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +3 -3
  104. package/out/zero-cache/src/services/change-source/protocol/current/schema-change-tags.d.ts +6 -0
  105. package/out/zero-cache/src/services/change-source/protocol/current/schema-change-tags.d.ts.map +1 -0
  106. package/out/zero-cache/src/services/change-source/protocol/current/schema-change-tags.js +21 -0
  107. package/out/zero-cache/src/services/change-source/protocol/current/schema-change-tags.js.map +1 -0
  108. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts +5 -6
  109. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts.map +1 -1
  110. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js +32 -9
  111. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js.map +1 -1
  112. package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts +15 -5
  113. package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts.map +1 -1
  114. package/out/zero-cache/src/services/change-streamer/backup-monitor.js +66 -0
  115. package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -0
  116. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts +68 -78
  117. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts.map +1 -1
  118. package/out/zero-cache/src/services/change-streamer/broadcast.js +84 -92
  119. package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
  120. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts +19 -0
  121. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts.map +1 -0
  122. package/out/zero-cache/src/services/change-streamer/change-log-codec.js +50 -0
  123. package/out/zero-cache/src/services/change-streamer/change-log-codec.js.map +1 -0
  124. package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts +141 -0
  125. package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts.map +1 -0
  126. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js +270 -0
  127. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js.map +1 -0
  128. package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.d.ts +19 -0
  129. package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.d.ts.map +1 -0
  130. package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.js +39 -0
  131. package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.js.map +1 -0
  132. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +3 -4
  133. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  134. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +15 -20
  135. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  136. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +69 -24
  137. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  138. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +330 -63
  139. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  140. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +55 -13
  141. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +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/error-type-enum.d.ts +8 -0
  144. package/out/zero-cache/src/services/change-streamer/error-type-enum.d.ts.map +1 -1
  145. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts +14 -3
  146. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -1
  147. package/out/zero-cache/src/services/change-streamer/forwarder.js +41 -11
  148. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
  149. package/out/zero-cache/src/services/change-streamer/{litestream3-backup-monitor.d.ts → litestream3-prometheus-poller.d.ts} +19 -45
  150. package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.d.ts.map +1 -0
  151. package/out/zero-cache/src/services/change-streamer/{litestream3-backup-monitor.js → litestream3-prometheus-poller.js} +57 -171
  152. package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.js.map +1 -0
  153. package/out/zero-cache/src/services/change-streamer/replica-poller.d.ts +15 -0
  154. package/out/zero-cache/src/services/change-streamer/replica-poller.d.ts.map +1 -0
  155. package/out/zero-cache/src/services/change-streamer/replica-poller.js +55 -0
  156. package/out/zero-cache/src/services/change-streamer/replica-poller.js.map +1 -0
  157. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +5 -1
  158. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
  159. package/out/zero-cache/src/services/change-streamer/schema/tables.js +2 -1
  160. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  161. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts +14 -0
  162. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts.map +1 -0
  163. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js +86 -0
  164. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js.map +1 -0
  165. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts +4 -1
  166. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts.map +1 -1
  167. package/out/zero-cache/src/services/change-streamer/snapshot.js +39 -14
  168. package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -1
  169. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.d.ts +75 -0
  170. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.d.ts.map +1 -0
  171. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js +261 -0
  172. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js.map +1 -0
  173. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.d.ts +121 -0
  174. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.d.ts.map +1 -0
  175. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.js +391 -0
  176. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.js.map +1 -0
  177. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.d.ts +62 -0
  178. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.d.ts.map +1 -0
  179. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js +159 -0
  180. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js.map +1 -0
  181. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts +109 -0
  182. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts.map +1 -0
  183. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js +258 -0
  184. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js.map +1 -0
  185. package/out/zero-cache/src/services/change-streamer/storer.d.ts +22 -12
  186. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  187. package/out/zero-cache/src/services/change-streamer/storer.js +93 -117
  188. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  189. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +61 -10
  190. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
  191. package/out/zero-cache/src/services/change-streamer/subscriber.js +101 -8
  192. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  193. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts +34 -0
  194. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts.map +1 -0
  195. package/out/zero-cache/src/services/change-streamer/upstream-acker.js +86 -0
  196. package/out/zero-cache/src/services/change-streamer/upstream-acker.js.map +1 -0
  197. package/out/zero-cache/src/services/life-cycle.d.ts +1 -1
  198. package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
  199. package/out/zero-cache/src/services/life-cycle.js +3 -2
  200. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  201. package/out/zero-cache/src/services/litestream/commands.d.ts +12 -11
  202. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  203. package/out/zero-cache/src/services/litestream/commands.js +50 -140
  204. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  205. package/out/zero-cache/src/services/litestream/config-v5.yml +42 -0
  206. package/out/zero-cache/src/services/litestream/metrics.d.ts +4 -4
  207. package/out/zero-cache/src/services/litestream/metrics.d.ts.map +1 -1
  208. package/out/zero-cache/src/services/litestream/metrics.js +7 -10
  209. package/out/zero-cache/src/services/litestream/metrics.js.map +1 -1
  210. package/out/zero-cache/src/services/litestream/vfs-watermark-poller.d.ts +57 -0
  211. package/out/zero-cache/src/services/litestream/vfs-watermark-poller.d.ts.map +1 -0
  212. package/out/zero-cache/src/services/litestream/vfs-watermark-poller.js +137 -0
  213. package/out/zero-cache/src/services/litestream/vfs-watermark-poller.js.map +1 -0
  214. package/out/zero-cache/src/services/replicator/change-log-cookies.d.ts +169 -0
  215. package/out/zero-cache/src/services/replicator/change-log-cookies.d.ts.map +1 -0
  216. package/out/zero-cache/src/services/replicator/change-log-cookies.js +434 -0
  217. package/out/zero-cache/src/services/replicator/change-log-cookies.js.map +1 -0
  218. package/out/zero-cache/src/services/replicator/change-log-db.d.ts +358 -0
  219. package/out/zero-cache/src/services/replicator/change-log-db.d.ts.map +1 -0
  220. package/out/zero-cache/src/services/replicator/change-log-db.js +477 -0
  221. package/out/zero-cache/src/services/replicator/change-log-db.js.map +1 -0
  222. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts +55 -0
  223. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts.map +1 -0
  224. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js +150 -0
  225. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js.map +1 -0
  226. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
  227. package/out/zero-cache/src/services/replicator/change-processor.js +44 -17
  228. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  229. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +1 -1
  230. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  231. package/out/zero-cache/src/services/replicator/incremental-sync.js +11 -4
  232. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  233. package/out/zero-cache/src/services/replicator/replicator.d.ts +1 -1
  234. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
  235. package/out/zero-cache/src/services/replicator/replicator.js +2 -2
  236. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  237. package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts +119 -0
  238. package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts.map +1 -0
  239. package/out/zero-cache/src/services/replicator/schema/backfilling.js +214 -0
  240. package/out/zero-cache/src/services/replicator/schema/backfilling.js.map +1 -0
  241. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts +3 -3
  242. package/out/zero-cache/src/services/replicator/schema/column-metadata.js +1 -1
  243. package/out/zero-cache/src/services/replicator/schema/column-metadata.js.map +1 -1
  244. package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts +1 -1
  245. package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts.map +1 -1
  246. package/out/zero-cache/src/services/replicator/schema/replication-state.js +9 -5
  247. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
  248. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts +131 -0
  249. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts.map +1 -0
  250. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js +413 -0
  251. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js.map +1 -0
  252. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.d.ts +120 -0
  253. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.d.ts.map +1 -0
  254. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.js +283 -0
  255. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.js.map +1 -0
  256. package/out/zero-cache/src/services/replicator/write-worker.js +9 -6
  257. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
  258. package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
  259. package/out/zero-cache/src/services/run-ast.js +2 -1
  260. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  261. package/out/zero-cache/src/services/running-state.d.ts +1 -1
  262. package/out/zero-cache/src/services/running-state.d.ts.map +1 -1
  263. package/out/zero-cache/src/services/running-state.js +1 -0
  264. package/out/zero-cache/src/services/running-state.js.map +1 -1
  265. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.d.ts +9 -0
  266. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.d.ts.map +1 -1
  267. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.js +9 -0
  268. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.js.map +1 -1
  269. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  270. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +18 -3
  271. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  272. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +11 -1
  273. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  274. package/out/zero-cache/src/services/view-syncer/view-syncer.js +48 -7
  275. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  276. package/out/zero-cache/src/types/processes.d.ts +1 -2
  277. package/out/zero-cache/src/types/processes.d.ts.map +1 -1
  278. package/out/zero-cache/src/types/processes.js +1 -25
  279. package/out/zero-cache/src/types/processes.js.map +1 -1
  280. package/out/zero-cache/src/types/streams.d.ts +10 -0
  281. package/out/zero-cache/src/types/streams.d.ts.map +1 -1
  282. package/out/zero-cache/src/types/streams.js +25 -4
  283. package/out/zero-cache/src/types/streams.js.map +1 -1
  284. package/out/zero-cache/src/workers/connection.d.ts +1 -0
  285. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  286. package/out/zero-cache/src/workers/connection.js +25 -3
  287. package/out/zero-cache/src/workers/connection.js.map +1 -1
  288. package/out/zero-cache/src/workers/replicator.d.ts +25 -0
  289. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
  290. package/out/zero-cache/src/workers/replicator.js +33 -1
  291. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  292. package/out/zero-cache/src/workers/syncer.d.ts +12 -0
  293. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  294. package/out/zero-cache/src/workers/syncer.js +75 -0
  295. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  296. package/out/zero-client/src/client/version.js +1 -1
  297. package/out/zero-schema/src/builder/table-builder.d.ts +23 -0
  298. package/out/zero-schema/src/builder/table-builder.d.ts.map +1 -1
  299. package/out/zero-schema/src/builder/table-builder.js +18 -0
  300. package/out/zero-schema/src/builder/table-builder.js.map +1 -1
  301. package/out/zero-types/src/schema.d.ts +11 -0
  302. package/out/zero-types/src/schema.d.ts.map +1 -1
  303. package/out/zql/src/query/query-impl.d.ts +2 -2
  304. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  305. package/out/zql/src/query/query-impl.js.map +1 -1
  306. package/out/zql/src/query/query.d.ts +83 -14
  307. package/out/zql/src/query/query.d.ts.map +1 -1
  308. package/out/zql/src/query/static-query.d.ts +1 -1
  309. package/out/zql/src/query/static-query.d.ts.map +1 -1
  310. package/out/zqlite/src/resolve-scalar-subqueries.d.ts +15 -0
  311. package/out/zqlite/src/resolve-scalar-subqueries.d.ts.map +1 -1
  312. package/out/zqlite/src/resolve-scalar-subqueries.js +20 -13
  313. package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
  314. package/package.json +2 -2
  315. package/out/replicache/src/db/index.js +0 -91
  316. package/out/replicache/src/db/index.js.map +0 -1
  317. package/out/replicache/src/lazy.d.ts +0 -2
  318. package/out/replicache/src/lazy.d.ts.map +0 -1
  319. package/out/replicache/src/lazy.js +0 -12
  320. package/out/replicache/src/lazy.js.map +0 -1
  321. package/out/zero-cache/src/server/backup-watermark-reader.js +0 -35
  322. package/out/zero-cache/src/server/backup-watermark-reader.js.map +0 -1
  323. package/out/zero-cache/src/services/change-streamer/litestream3-backup-monitor.d.ts.map +0 -1
  324. package/out/zero-cache/src/services/change-streamer/litestream3-backup-monitor.js.map +0 -1
  325. package/out/zero-cache/src/services/change-streamer/replica-monitor.d.ts +0 -16
  326. package/out/zero-cache/src/services/change-streamer/replica-monitor.d.ts.map +0 -1
  327. package/out/zero-cache/src/services/change-streamer/replica-monitor.js +0 -54
  328. package/out/zero-cache/src/services/change-streamer/replica-monitor.js.map +0 -1
  329. package/out/zero-cache/src/services/change-streamer/vfs-backup-monitor.d.ts +0 -25
  330. package/out/zero-cache/src/services/change-streamer/vfs-backup-monitor.d.ts.map +0 -1
  331. package/out/zero-cache/src/services/change-streamer/vfs-backup-monitor.js +0 -159
  332. package/out/zero-cache/src/services/change-streamer/vfs-backup-monitor.js.map +0 -1
  333. package/out/zero-cache/src/services/litestream/vfs-watermark-reader.d.ts +0 -44
  334. package/out/zero-cache/src/services/litestream/vfs-watermark-reader.d.ts.map +0 -1
  335. package/out/zero-cache/src/services/litestream/vfs-watermark-reader.js +0 -65
  336. package/out/zero-cache/src/services/litestream/vfs-watermark-reader.js.map +0 -1
  337. package/out/zero-cache/src/services/litestream/vfs-watermark-worker-source.d.ts +0 -11
  338. package/out/zero-cache/src/services/litestream/vfs-watermark-worker-source.d.ts.map +0 -1
  339. package/out/zero-cache/src/services/litestream/vfs-watermark-worker-source.js +0 -74
  340. package/out/zero-cache/src/services/litestream/vfs-watermark-worker-source.js.map +0 -1
  341. package/out/zero-cache/src/services/litestream/vfs-watermark-worker.d.ts +0 -42
  342. package/out/zero-cache/src/services/litestream/vfs-watermark-worker.d.ts.map +0 -1
  343. package/out/zero-cache/src/services/litestream/vfs-watermark-worker.js +0 -117
  344. package/out/zero-cache/src/services/litestream/vfs-watermark-worker.js.map +0 -1
@@ -2,9 +2,10 @@ import type { LogContext } from '@rocicorp/logger';
2
2
  import { TransactionPool } from '../../db/transaction-pool.ts';
3
3
  import { type PostgresDB } from '../../types/pg.ts';
4
4
  import { type ShardID } from '../../types/shards.ts';
5
- import { type BackfillRequest, type Change } from '../change-source/protocol/current.ts';
5
+ import { type BackfillRequest } from '../change-source/protocol/current.ts';
6
6
  import { type ChangeStreamData, type Commit } from '../change-source/protocol/current/downstream.ts';
7
- import type { DownstreamStatusMessage, UpstreamStatusMessage } from '../change-source/protocol/current/status.ts';
7
+ import type { UpstreamStatusMessage } from '../change-source/protocol/current/status.ts';
8
+ import { type CookieSet } from '../replicator/change-log-cookies.ts';
8
9
  import type { ReplicatorMode } from '../replicator/replicator.ts';
9
10
  import type { Service } from '../service.ts';
10
11
  import type { Subscriber } from './subscriber.ts';
@@ -47,11 +48,29 @@ export type TuningOptions = {
47
48
  export declare class Storer implements Service {
48
49
  #private;
49
50
  readonly id = "storer";
50
- constructor(lc: LogContext, shard: ShardID, taskID: string, discoveryAddress: string, discoveryProtocol: string, db: PostgresDB, replicaVersion: string, onConsumed: (c: Commit | UpstreamStatusMessage) => void, onFatal: (err: Error) => void, { backPressureLimitHeapProportion, statementTimeoutMs, changeLogBatchSize, drainTimeoutMs, }: TuningOptions);
51
+ constructor(lc: LogContext, shard: ShardID, taskID: string, discoveryAddress: string, discoveryProtocol: string, db: PostgresDB, replicaVersion: string, onCommitted: (c: Commit | UpstreamStatusMessage) => void, onFatal: (err: Error) => void, { backPressureLimitHeapProportion, statementTimeoutMs, changeLogBatchSize, drainTimeoutMs, }: TuningOptions);
51
52
  assumeOwnership(purgeLock?: PurgeLock | null): Promise<void>;
53
+ /**
54
+ * The whole of what a stream connection starts from: where to resume, what to
55
+ * ask the change source to backfill, and the raw cookie set those requests
56
+ * were derived from.
57
+ *
58
+ * All four statements run in one REPEATABLE READ transaction, so they see one
59
+ * snapshot. That is invariant 15 — the resume watermark and the cookies must
60
+ * come from the same store, read at the same position — and it is why the
61
+ * cookies are read here rather than by a second call: a cookie set paired
62
+ * with a watermark it was not folded to loses every backfill that completed
63
+ * in the interval, and those rows are not replayable from the slot.
64
+ *
65
+ * `cookies` is not `backfillRequests` in another shape. The request list is
66
+ * driven off `backfilling`, so it drops the metadata of every table with no
67
+ * in-flight backfill — correct for starting a stream, lossy as the cookie
68
+ * snapshot that the SQLite change log continues folding onto.
69
+ */
52
70
  getStartStreamInitializationParameters(): Promise<{
53
71
  lastWatermark: string;
54
72
  backfillRequests: BackfillRequest[];
73
+ cookies: CookieSet;
55
74
  }>;
56
75
  getMinWatermarkForCatchup(): Promise<string | null>;
57
76
  purgeRecordsBefore(watermark: string): Promise<number>;
@@ -60,7 +79,6 @@ export declare class Storer implements Service {
60
79
  */
61
80
  store(watermark: string, data: ChangeStreamData): string;
62
81
  abort(): void;
63
- status(s: DownstreamStatusMessage): void;
64
82
  catchup(subscriber: Subscriber, mode: ReplicatorMode): void;
65
83
  readyForMore(): Promise<void> | undefined;
66
84
  /**
@@ -80,14 +98,6 @@ export declare class Storer implements Service {
80
98
  */
81
99
  stop(): Promise<void>;
82
100
  }
83
- /**
84
- * Extracts the stringified change message from the stringified
85
- * stream message (e.g. the second tuple element). This optimization
86
- * facilitates stringifying (and sharing the result of) the stream
87
- * message exactly once, but storing only the change message substring
88
- * in the changeLog for backwards compatibility.
89
- */
90
- export declare function extractChangeSubstring(streamMessageJSON: string, tag: Change['tag'] | undefined): string;
91
101
  export declare class PurgeLock {
92
102
  #private;
93
103
  readonly replicaVersion: string;
@@ -1 +1 @@
1
- {"version":3,"file":"storer.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/storer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAWjD,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAC,KAAK,UAAU,EAA2B,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAY,KAAK,OAAO,EAAC,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAKL,KAAK,eAAe,EACpB,KAAK,MAAM,EAKZ,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,MAAM,EACZ,MAAM,iDAAiD,CAAC;AACzD,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAS3C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAuChD,MAAM,MAAM,aAAa,GAAG;IAC1B,+BAA+B,EAAE,MAAM,CAAC;IACxC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,CAAC;AAaF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,MAAO,YAAW,OAAO;;IACpC,QAAQ,CAAC,EAAE,YAAY;gBAoBrB,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM,EACzB,EAAE,EAAE,UAAU,EACd,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,qBAAqB,KAAK,IAAI,EACvD,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,EAC7B,EACE,+BAA+B,EAC/B,kBAAkB,EAClB,kBAAkB,EAClB,cAAuB,GACxB,EAAE,aAAa;IAiCZ,eAAe,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI;IA2B5C,sCAAsC,IAAI,OAAO,CAAC;QACtD,aAAa,EAAE,MAAM,CAAC;QACtB,gBAAgB,EAAE,eAAe,EAAE,CAAC;KACrC,CAAC;IAkCI,yBAAyB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOzD,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyCtD;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB;IAkB/C,KAAK;IAIL,MAAM,CAAC,CAAC,EAAE,uBAAuB;IAIjC,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc;IAOpD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS;IA6FzC;;;OAGG;IACG,GAAG;IA2eT;;;OAGG;IACG,YAAY;IAQlB;;;;OAIG;IACG,IAAI;CAaX;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,iBAAiB,EAAE,MAAM,EACzB,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,UAmB/B;AA+BD,qBAAa,SAAS;;IAGpB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAG5B,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,eAAe,EACnB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM;IAUb,OAAO;CAWd;AAED,qBAAa,WAAW;;gBAKV,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU;IAWpD,OAAO;CA4Bd"}
1
+ {"version":3,"file":"storer.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/storer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAUjD,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAC,KAAK,UAAU,EAA2B,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAY,KAAK,OAAO,EAAC,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAKL,KAAK,eAAe,EAMrB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,MAAM,EACZ,MAAM,iDAAiD,CAAC;AACzD,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,6CAA6C,CAAC;AACvF,OAAO,EAIL,KAAK,SAAS,EAEf,MAAM,qCAAqC,CAAC;AAC7C,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAc3C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAsChD,MAAM,MAAM,aAAa,GAAG;IAC1B,+BAA+B,EAAE,MAAM,CAAC;IACxC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,CAAC;AAaF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,MAAO,YAAW,OAAO;;IACpC,QAAQ,CAAC,EAAE,YAAY;gBAoBrB,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM,EACzB,EAAE,EAAE,UAAU,EACd,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,qBAAqB,KAAK,IAAI,EACxD,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,EAC7B,EACE,+BAA+B,EAC/B,kBAAkB,EAClB,kBAAkB,EAClB,cAAuB,GACxB,EAAE,aAAa;IAiCZ,eAAe,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI;IA2BlD;;;;;;;;;;;;;;;;OAgBG;IACG,sCAAsC,IAAI,OAAO,CAAC;QACtD,aAAa,EAAE,MAAM,CAAC;QACtB,gBAAgB,EAAE,eAAe,EAAE,CAAC;QACpC,OAAO,EAAE,SAAS,CAAC;KACpB,CAAC;IAoDI,yBAAyB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOzD,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyCtD;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB;IAkB/C,KAAK;IAIL,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc;IAOpD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS;IA6FzC;;;OAGG;IACG,GAAG;IAmdT;;;OAGG;IACG,YAAY;IAQlB;;;;OAIG;IACG,IAAI;CAcX;AAED,qBAAa,SAAS;;IAGpB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAG5B,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,eAAe,EACnB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM;IAUb,OAAO;CAWd;AAED,qBAAa,WAAW;;gBAKV,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU;IAWpD,OAAO;CA4Bd"}
@@ -1,20 +1,21 @@
1
- import { assert } from "../../../../shared/src/asserts.js";
1
+ import { assert, unreachable } from "../../../../shared/src/asserts.js";
2
2
  import { promiseVoid } from "../../../../shared/src/resolved-promises.js";
3
3
  import { AbortError } from "../../../../shared/src/abort-error.js";
4
4
  import { parse, valita_exports } from "../../../../shared/src/valita.js";
5
- import { BigIntJSON } from "../../../../shared/src/bigint-json.js";
6
5
  import { cdcSchema } from "../../types/shards.js";
7
6
  import { isDataChange, isSchemaChange } from "../change-source/protocol/current/data.js";
8
7
  import "../change-source/protocol/current/downstream.js";
9
8
  import { backfillRequestSchema } from "../change-source/protocol/current/upstream.js";
10
9
  import "../change-source/protocol/current.js";
10
+ import { cookieOps } from "../replicator/change-log-cookies.js";
11
11
  import "../../types/pg.js";
12
12
  import { READONLY, READ_COMMITTED } from "../../db/mode-enum.js";
13
13
  import { runTx } from "../../db/run-transaction.js";
14
- import { AutoResetSignal, markResetRequired } from "./schema/tables.js";
15
14
  import { Queue } from "../../../../shared/src/queue.js";
15
+ import { AutoResetSignal, markResetRequired } from "./schema/tables.js";
16
16
  import { TransactionPool } from "../../db/transaction-pool.js";
17
17
  import { orTimeout } from "../../types/timeout.js";
18
+ import { extractChangeSubstring, reconstructWatermarkedChange, serializeChangeStreamData } from "./change-log-codec.js";
18
19
  import { resolver } from "@rocicorp/resolver";
19
20
  import "postgres";
20
21
  import { getHeapStatistics } from "node:v8";
@@ -59,7 +60,7 @@ var Storer = class {
59
60
  #discoveryProtocol;
60
61
  #db;
61
62
  #replicaVersion;
62
- #onConsumed;
63
+ #onCommitted;
63
64
  #onFatal;
64
65
  #queue = new Queue();
65
66
  #backPressureThresholdBytes;
@@ -68,7 +69,7 @@ var Storer = class {
68
69
  #drainTimeoutMs;
69
70
  #approximateQueuedBytes = 0;
70
71
  #running = false;
71
- constructor(lc, shard, taskID, discoveryAddress, discoveryProtocol, db, replicaVersion, onConsumed, onFatal, { backPressureLimitHeapProportion, statementTimeoutMs, changeLogBatchSize, drainTimeoutMs = 3e4 }) {
72
+ constructor(lc, shard, taskID, discoveryAddress, discoveryProtocol, db, replicaVersion, onCommitted, onFatal, { backPressureLimitHeapProportion, statementTimeoutMs, changeLogBatchSize, drainTimeoutMs = 3e4 }) {
72
73
  this.#lc = lc.withContext("component", "change-log");
73
74
  this.#shard = shard;
74
75
  this.#taskID = taskID;
@@ -76,7 +77,7 @@ var Storer = class {
76
77
  this.#discoveryProtocol = discoveryProtocol;
77
78
  this.#db = db;
78
79
  this.#replicaVersion = replicaVersion;
79
- this.#onConsumed = onConsumed;
80
+ this.#onCommitted = onCommitted;
80
81
  this.#onFatal = onFatal;
81
82
  this.#statementTimeoutMs = statementTimeoutMs;
82
83
  this.#changeLogBatchSize = Math.max(1, changeLogBatchSize);
@@ -104,25 +105,55 @@ var Storer = class {
104
105
  this.#lc.info?.(`assumed ownership at ${addressWithProtocol} (${elapsed} ms)`);
105
106
  if (purgeLock) purgeLock.release();
106
107
  }
108
+ /**
109
+ * The whole of what a stream connection starts from: where to resume, what to
110
+ * ask the change source to backfill, and the raw cookie set those requests
111
+ * were derived from.
112
+ *
113
+ * All four statements run in one REPEATABLE READ transaction, so they see one
114
+ * snapshot. That is invariant 15 — the resume watermark and the cookies must
115
+ * come from the same store, read at the same position — and it is why the
116
+ * cookies are read here rather than by a second call: a cookie set paired
117
+ * with a watermark it was not folded to loses every backfill that completed
118
+ * in the interval, and those rows are not replayable from the slot.
119
+ *
120
+ * `cookies` is not `backfillRequests` in another shape. The request list is
121
+ * driven off `backfilling`, so it drops the metadata of every table with no
122
+ * in-flight backfill — correct for starting a stream, lossy as the cookie
123
+ * snapshot that the SQLite change log continues folding onto.
124
+ */
107
125
  async getStartStreamInitializationParameters() {
108
- const [[{ lastWatermark }], result] = await runTx(this.#db, (sql) => [sql`
109
- SELECT "lastWatermark" FROM ${this.#cdc("replicationState")}`, sql`
110
- SELECT
126
+ const [[{ lastWatermark }], result, tableMetadata, backfilling] = await runTx(this.#db, (sql) => [
127
+ sql`
128
+ SELECT "lastWatermark" FROM ${this.#cdc("replicationState")}`,
129
+ sql`
130
+ SELECT
111
131
  json_build_object(
112
132
  'schema', b."schema",
113
133
  'name', b."table",
114
134
  'metadata', t."metadata"
115
135
  ) as "table",
116
- json_object_agg(b."column", b."backfill")
136
+ json_object_agg(b."column", b."backfill")
117
137
  as "columns"
118
138
  FROM ${this.#cdc("backfilling")} as b
119
139
  LEFT JOIN ${this.#cdc("tableMetadata")} as t
120
140
  ON (b."schema" = t."schema" AND b."table" = t."table")
121
141
  GROUP BY b."schema", b."table", t."metadata"
122
- `], { mode: READONLY });
142
+ `,
143
+ sql`
144
+ SELECT "schema", "table", "metadata" FROM ${this.#cdc("tableMetadata")}
145
+ ORDER BY "schema" COLLATE "C", "table" COLLATE "C"`,
146
+ sql`
147
+ SELECT "schema", "table", "column", "backfill" FROM ${this.#cdc("backfilling")}
148
+ ORDER BY "schema" COLLATE "C", "table" COLLATE "C", "column" COLLATE "C"`
149
+ ], { mode: READONLY });
123
150
  return {
124
151
  lastWatermark,
125
- backfillRequests: parse(result, backfillRequestsSchema)
152
+ backfillRequests: parse(result, backfillRequestsSchema),
153
+ cookies: {
154
+ tableMetadata: [...tableMetadata],
155
+ backfilling: [...backfilling]
156
+ }
126
157
  };
127
158
  }
128
159
  async getMinWatermarkForCatchup() {
@@ -162,7 +193,7 @@ var Storer = class {
162
193
  * @returns The JSON stringified stream message to be sent downstream.
163
194
  */
164
195
  store(watermark, data) {
165
- const json = BigIntJSON.stringify(data);
196
+ const json = serializeChangeStreamData(data);
166
197
  this.#approximateQueuedBytes += json.length;
167
198
  const change = data[1];
168
199
  this.#queue.enqueue([
@@ -176,9 +207,6 @@ var Storer = class {
176
207
  abort() {
177
208
  this.#queue.enqueue(["abort"]);
178
209
  }
179
- status(s) {
180
- this.#queue.enqueue(s);
181
- }
182
210
  catchup(subscriber, mode) {
183
211
  this.#queue.enqueue(["subscriber", {
184
212
  subscriber,
@@ -301,9 +329,6 @@ var Storer = class {
301
329
  else await this.#startCatchup([subscriber]);
302
330
  continue;
303
331
  }
304
- case "status":
305
- this.#onConsumed(msg);
306
- continue;
307
332
  case "abort":
308
333
  if (tx) {
309
334
  tx.pool.abort();
@@ -370,7 +395,7 @@ var Storer = class {
370
395
  tx.pool.setDone();
371
396
  }
372
397
  await tx.pool.done();
373
- if (tx.ack) this.#onConsumed([
398
+ if (tx.ack) this.#onCommitted([
374
399
  "commit",
375
400
  change,
376
401
  { watermark }
@@ -391,7 +416,8 @@ var Storer = class {
391
416
  }
392
417
  async #startCatchup(subs) {
393
418
  if (subs.length === 0) return;
394
- const reader = new TransactionPool(this.#lc.withContext("pool", "catchup"), { mode: READONLY });
419
+ const lc = this.#lc.withContext("pool", "catchup");
420
+ const reader = new TransactionPool(lc, { mode: READONLY });
395
421
  reader.run(this.#db);
396
422
  let lastWatermark;
397
423
  try {
@@ -402,11 +428,13 @@ var Storer = class {
402
428
  subs.map(({ subscriber }) => subscriber.fail(e));
403
429
  throw e;
404
430
  }
405
- Promise.all(subs.map((sub) => this.#catchup(sub, lastWatermark, reader))).finally(() => reader.setDone());
431
+ Promise.all(subs.map((sub) => this.#catchup(lc.withContext("subscriber", sub.subscriber.id), sub, lastWatermark, reader))).finally(() => reader.setDone());
406
432
  }
407
- async #catchup({ subscriber: sub, mode }, lastWatermark, reader) {
433
+ async #catchup(lc, { subscriber: sub, mode }, lastWatermark, reader) {
408
434
  try {
435
+ lc.info?.(`starting catchup`);
409
436
  await reader.processReadTask(async (tx) => {
437
+ lc.info?.(`catching up`);
410
438
  const start = Date.now();
411
439
  let watermarkFound = sub.watermark === this.#replicaVersion;
412
440
  let count = 0;
@@ -419,26 +447,26 @@ var Storer = class {
419
447
  const start = performance.now();
420
448
  await lastBatchConsumed;
421
449
  const elapsed = performance.now() - start;
422
- if (lastBatchConsumed) this.#lc[elapsed > 100 ? "info" : "debug"]?.(`waited ${elapsed.toFixed(3)} ms for ${sub.id} to consume last batch of catchup entries`);
450
+ if (lastBatchConsumed) lc[elapsed > 100 ? "info" : "debug"]?.(`waited ${elapsed.toFixed(3)} ms for ${sub.id} to consume last batch of catchup entries`);
423
451
  for (const entry of entries) if (entry.watermark === sub.watermark) watermarkFound = true;
424
452
  else if (watermarkFound) {
425
- lastBatchConsumed = sub.catchup(toDownstream(entry));
453
+ lastBatchConsumed = sub.catchup(reconstructWatermarkedChange(entry));
426
454
  count++;
427
455
  } else if (mode === "backup") throw new AutoResetSignal(`backup replica at watermark ${sub.watermark} is behind change db: ${entry.watermark})`);
428
456
  else {
429
- this.#lc.warn?.(`rejecting subscriber at watermark ${sub.watermark} (earliest watermark: ${entry.watermark})`);
457
+ lc.warn?.(`rejecting subscriber at watermark ${sub.watermark} (earliest watermark: ${entry.watermark})`);
430
458
  sub.close(2, `earliest supported watermark is ${entry.watermark} (requested ${sub.watermark})`);
431
459
  return;
432
460
  }
433
461
  }
434
462
  if (watermarkFound) {
435
463
  await lastBatchConsumed;
436
- this.#lc.info?.(`caught up ${sub.id} with ${count} changes (${Date.now() - start} ms)`);
437
- } else this.#lc.warn?.(`subscriber ${sub.id} at watermark ${sub.watermark} is ahead of the latest durable watermark ${lastWatermark}; waiting for the change DB to catch up`);
464
+ lc.info?.(`caught up ${sub.id} with ${count} changes (${Date.now() - start} ms)`);
465
+ } else lc.warn?.(`subscriber ${sub.id} at watermark ${sub.watermark} is ahead of the latest durable watermark ${lastWatermark}; waiting for the change DB to catch up`);
438
466
  sub.setCaughtUp();
439
467
  });
440
468
  } catch (err) {
441
- this.#lc.error?.(`error while catching up subscriber ${sub.id}`, err);
469
+ lc.error?.(`error while catching up subscriber ${sub.id}`, err);
442
470
  if (err instanceof AutoResetSignal) {
443
471
  await markResetRequired(this.#db, this.#shard);
444
472
  this.#onFatal(err);
@@ -449,67 +477,54 @@ var Storer = class {
449
477
  /**
450
478
  * Returns the db statements necessary to track backfill and table metadata
451
479
  * presented in the `change`, if any.
480
+ *
481
+ * This is the Postgres interpreter of {@link cookieOps}, which is also
482
+ * interpreted against the SQLite change log by `ChangeLogCookieWriter`. The
483
+ * two stores have to agree on every transition forever, and the failure mode
484
+ * if they drift is a backfill that is silently never re-requested — so the
485
+ * decision of what a schema change *means* lives in one place and only its
486
+ * transport lives here.
452
487
  */
453
488
  #trackBackfillMetadata(sql, change) {
454
- const stmts = [];
455
- switch (change.tag) {
456
- case "update-table-metadata": {
457
- const { table, new: metadata } = change;
458
- stmts.push(this.#upsertTableMetadataStmt(sql, table, metadata));
459
- break;
460
- }
461
- case "create-table": {
462
- const { spec, metadata, backfill } = change;
463
- if (metadata) stmts.push(this.#upsertTableMetadataStmt(sql, spec, metadata));
464
- if (backfill) Object.entries(backfill).forEach(([col, backfill]) => {
465
- stmts.push(this.#upsertColumnBackfillStmt(sql, spec, col, backfill));
466
- });
467
- break;
468
- }
489
+ return cookieOps(change).flatMap((op) => this.#cookieStmts(sql, op));
490
+ }
491
+ #cookieStmts(sql, op) {
492
+ switch (op.op) {
493
+ case "upsert-metadata": return [this.#upsertTableMetadataStmt(sql, op.table, op.metadata)];
494
+ case "upsert-backfill": return [this.#upsertColumnBackfillStmt(sql, op.table, op.column, op.backfill)];
469
495
  case "rename-table": {
470
- const { old } = change;
496
+ const { old } = op;
471
497
  const row = {
472
- schema: change.new.schema,
473
- table: change.new.name
498
+ schema: op.new.schema,
499
+ table: op.new.name
474
500
  };
475
- stmts.push(sql`UPDATE ${this.#cdc("tableMetadata")} SET ${sql(row)}
501
+ return [sql`UPDATE ${this.#cdc("tableMetadata")} SET ${sql(row)}
476
502
  WHERE "schema" = ${old.schema} AND "table" = ${old.name}`, sql`UPDATE ${this.#cdc("backfilling")} SET ${sql(row)}
477
- WHERE "schema" = ${old.schema} AND "table" = ${old.name}`);
478
- break;
503
+ WHERE "schema" = ${old.schema} AND "table" = ${old.name}`];
479
504
  }
480
505
  case "drop-table": {
481
- const { id: { schema, name } } = change;
482
- stmts.push(sql`DELETE FROM ${this.#cdc("tableMetadata")}
506
+ const { schema, name } = op.table;
507
+ return [sql`DELETE FROM ${this.#cdc("tableMetadata")}
483
508
  WHERE "schema" = ${schema} AND "table" = ${name}`, sql`DELETE FROM ${this.#cdc("backfilling")}
484
- WHERE "schema" = ${schema} AND "table" = ${name}`);
485
- break;
486
- }
487
- case "add-column": {
488
- const { table, tableMetadata, column, backfill } = change;
489
- if (tableMetadata) stmts.push(this.#upsertTableMetadataStmt(sql, table, tableMetadata));
490
- if (backfill) stmts.push(this.#upsertColumnBackfillStmt(sql, table, column.name, backfill));
491
- break;
509
+ WHERE "schema" = ${schema} AND "table" = ${name}`];
492
510
  }
493
- case "update-column": {
494
- const { table: { schema, name: table }, old: { name: oldName }, new: { name: newName } } = change;
495
- if (oldName !== newName) stmts.push(sql`UPDATE ${this.#cdc("backfilling")} SET "column" = ${newName}
496
- WHERE "schema" = ${schema} AND "table" = ${table} AND "column" = ${oldName}`);
497
- break;
511
+ case "rename-column": {
512
+ const { schema, name: table } = op.table;
513
+ return [sql`UPDATE ${this.#cdc("backfilling")} SET "column" = ${op.new}
514
+ WHERE "schema" = ${schema} AND "table" = ${table} AND "column" = ${op.old}`];
498
515
  }
499
516
  case "drop-column": {
500
- const { table: { schema, name }, column } = change;
501
- stmts.push(sql`DELETE FROM ${this.#cdc("backfilling")}
502
- WHERE "schema" = ${schema} AND "table" = ${name} AND "column" = ${column}`);
503
- break;
517
+ const { schema, name } = op.table;
518
+ return [sql`DELETE FROM ${this.#cdc("backfilling")}
519
+ WHERE "schema" = ${schema} AND "table" = ${name} AND "column" = ${op.column}`];
504
520
  }
505
- case "backfill-completed": {
506
- const { relation: { schema, name: table, rowKey }, columns } = change;
507
- const cols = [...rowKey.columns, ...columns];
508
- stmts.push(sql`DELETE FROM ${this.#cdc("backfilling")}
509
- WHERE "schema" = ${schema} AND "table" = ${table} AND "column" IN ${sql(cols)}`);
521
+ case "complete-backfill": {
522
+ const { schema, name: table } = op.table;
523
+ return [sql`DELETE FROM ${this.#cdc("backfilling")}
524
+ WHERE "schema" = ${schema} AND "table" = ${table} AND "column" IN ${sql([...op.columns])}`];
510
525
  }
526
+ default: unreachable(op);
511
527
  }
512
- return stmts;
513
528
  }
514
529
  #upsertTableMetadataStmt(sql, { schema, name: table }, metadata) {
515
530
  const row = {
@@ -519,7 +534,7 @@ var Storer = class {
519
534
  };
520
535
  return sql`
521
536
  INSERT INTO ${this.#cdc("tableMetadata")} ${sql(row)}
522
- ON CONFLICT ("schema", "table")
537
+ ON CONFLICT ("schema", "table")
523
538
  DO UPDATE SET ${sql(row)};
524
539
  `;
525
540
  }
@@ -532,7 +547,7 @@ var Storer = class {
532
547
  };
533
548
  return sql`
534
549
  INSERT INTO ${this.#cdc("backfilling")} ${sql(row)}
535
- ON CONFLICT ("schema", "table", "column")
550
+ ON CONFLICT ("schema", "table", "column")
536
551
  DO UPDATE SET ${sql(row)};
537
552
  `;
538
553
  }
@@ -555,51 +570,12 @@ var Storer = class {
555
570
  async stop() {
556
571
  if (this.#running) {
557
572
  this.#lc.info?.(`draining ${this.#queue.size()} changeLog entries`);
573
+ this.abort();
558
574
  this.#queue.enqueue("stop");
559
575
  }
560
576
  if (await orTimeout(this.#stopped, this.#drainTimeoutMs) === "timed-out") throw new AbortError(`changeLog did not drain within ${this.#drainTimeoutMs}ms`);
561
577
  }
562
578
  };
563
- /**
564
- * Extracts the stringified change message from the stringified
565
- * stream message (e.g. the second tuple element). This optimization
566
- * facilitates stringifying (and sharing the result of) the stream
567
- * message exactly once, but storing only the change message substring
568
- * in the changeLog for backwards compatibility.
569
- */
570
- function extractChangeSubstring(streamMessageJSON, tag) {
571
- switch (tag) {
572
- case "begin":
573
- case "commit": return streamMessageJSON.substring(streamMessageJSON.indexOf(",") + 1, streamMessageJSON.lastIndexOf(","));
574
- default: return streamMessageJSON.substring(streamMessageJSON.indexOf(",") + 1, streamMessageJSON.lastIndexOf("]"));
575
- }
576
- }
577
- function toDownstream(entry) {
578
- const { watermark, change } = entry;
579
- const tag = entry.tag;
580
- switch (tag) {
581
- case "begin": return [
582
- watermark,
583
- tag,
584
- `["begin",${change},{"commitWatermark":"${watermark}"}]`
585
- ];
586
- case "commit": return [
587
- watermark,
588
- tag,
589
- `["commit",${change},{"watermark":"${watermark}"}]`
590
- ];
591
- case "rollback": return [
592
- watermark,
593
- tag,
594
- `["rollback",${change}]`
595
- ];
596
- default: return [
597
- watermark,
598
- tag,
599
- `["data",${change}]`
600
- ];
601
- }
602
- }
603
579
  var PurgeLock = class {
604
580
  #lc;
605
581
  #tx;