@rocicorp/zero 1.10.0-canary.0 → 1.10.0-canary.2

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 (408) hide show
  1. package/out/replicache/src/db/commit.js +1 -4
  2. package/out/replicache/src/db/commit.js.map +1 -1
  3. package/out/replicache/src/db/read.d.ts +1 -0
  4. package/out/replicache/src/db/read.d.ts.map +1 -1
  5. package/out/replicache/src/db/read.js +1 -4
  6. package/out/replicache/src/db/read.js.map +1 -1
  7. package/out/replicache/src/db/write.d.ts +2 -1
  8. package/out/replicache/src/db/write.d.ts.map +1 -1
  9. package/out/replicache/src/db/write.js +4 -51
  10. package/out/replicache/src/db/write.js.map +1 -1
  11. package/out/replicache/src/persist/clients.d.ts +1 -0
  12. package/out/replicache/src/persist/clients.d.ts.map +1 -1
  13. package/out/replicache/src/persist/clients.js +4 -31
  14. package/out/replicache/src/persist/clients.js.map +1 -1
  15. package/out/replicache/src/process-env.d.ts +28 -0
  16. package/out/replicache/src/process-env.d.ts.map +1 -0
  17. package/out/replicache/src/replicache-impl.d.ts.map +1 -1
  18. package/out/replicache/src/replicache-impl.js.map +1 -1
  19. package/out/replicache/src/scan-iterator.js +2 -14
  20. package/out/replicache/src/scan-iterator.js.map +1 -1
  21. package/out/replicache/src/subscriptions.d.ts +1 -0
  22. package/out/replicache/src/subscriptions.d.ts.map +1 -1
  23. package/out/replicache/src/subscriptions.js +2 -10
  24. package/out/replicache/src/subscriptions.js.map +1 -1
  25. package/out/replicache/src/transactions.d.ts +1 -0
  26. package/out/replicache/src/transactions.d.ts.map +1 -1
  27. package/out/replicache/src/transactions.js +2 -4
  28. package/out/replicache/src/transactions.js.map +1 -1
  29. package/out/z2s/src/compiler.d.ts.map +1 -1
  30. package/out/z2s/src/compiler.js +1 -22
  31. package/out/z2s/src/compiler.js.map +1 -1
  32. package/out/zero/package.js +3 -3
  33. package/out/zero/package.js.map +1 -1
  34. package/out/zero-cache/src/config/normalize.d.ts +1 -0
  35. package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
  36. package/out/zero-cache/src/config/normalize.js +10 -1
  37. package/out/zero-cache/src/config/normalize.js.map +1 -1
  38. package/out/zero-cache/src/config/zero-config.d.ts +52 -1
  39. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  40. package/out/zero-cache/src/config/zero-config.js +171 -22
  41. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  42. package/out/zero-cache/src/custom/fetch.js +1 -1
  43. package/out/zero-cache/src/custom/fetch.js.map +1 -1
  44. package/out/zero-cache/src/db/delete-lite-db.js +2 -1
  45. package/out/zero-cache/src/db/delete-lite-db.js.map +1 -1
  46. package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
  47. package/out/zero-cache/src/db/migration-lite.js +5 -2
  48. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  49. package/out/zero-cache/src/db/migration.d.ts.map +1 -1
  50. package/out/zero-cache/src/db/migration.js +4 -2
  51. package/out/zero-cache/src/db/migration.js.map +1 -1
  52. package/out/zero-cache/src/db/sqlite-corruption.d.ts +3 -2
  53. package/out/zero-cache/src/db/sqlite-corruption.d.ts.map +1 -1
  54. package/out/zero-cache/src/db/sqlite-corruption.js +13 -8
  55. package/out/zero-cache/src/db/sqlite-corruption.js.map +1 -1
  56. package/out/zero-cache/src/observability/metrics.d.ts +6 -1
  57. package/out/zero-cache/src/observability/metrics.d.ts.map +1 -1
  58. package/out/zero-cache/src/observability/metrics.js +20 -2
  59. package/out/zero-cache/src/observability/metrics.js.map +1 -1
  60. package/out/zero-cache/src/server/backup-watermark-poller.js +31 -0
  61. package/out/zero-cache/src/server/backup-watermark-poller.js.map +1 -0
  62. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  63. package/out/zero-cache/src/server/change-streamer.js +91 -31
  64. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  65. package/out/zero-cache/src/server/main.d.ts.map +1 -1
  66. package/out/zero-cache/src/server/main.js +6 -16
  67. package/out/zero-cache/src/server/main.js.map +1 -1
  68. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  69. package/out/zero-cache/src/server/replicator.js +48 -5
  70. package/out/zero-cache/src/server/replicator.js.map +1 -1
  71. package/out/zero-cache/src/server/runner/run-worker.js +2 -1
  72. package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
  73. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  74. package/out/zero-cache/src/server/syncer.js +1 -1
  75. package/out/zero-cache/src/server/syncer.js.map +1 -1
  76. package/out/zero-cache/src/server/worker-urls.d.ts +1 -1
  77. package/out/zero-cache/src/server/worker-urls.js +2 -2
  78. package/out/zero-cache/src/server/worker-urls.js.map +1 -1
  79. package/out/zero-cache/src/services/change-source/change-source.d.ts +4 -2
  80. package/out/zero-cache/src/services/change-source/change-source.d.ts.map +1 -1
  81. package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts +35 -0
  82. package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts.map +1 -0
  83. package/out/zero-cache/src/services/change-source/common/replica-restore.js +34 -0
  84. package/out/zero-cache/src/services/change-source/common/replica-restore.js.map +1 -0
  85. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts +2 -0
  86. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
  87. package/out/zero-cache/src/services/change-source/common/replica-schema.js +73 -1
  88. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  89. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts +2 -6
  90. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
  91. package/out/zero-cache/src/services/change-source/custom/change-source.js +14 -5
  92. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  93. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +4 -7
  94. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
  95. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +7 -7
  96. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  97. package/out/zero-cache/src/services/change-source/pg/change-source.js +82 -25
  98. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  99. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +9 -1
  100. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  101. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +12 -4
  102. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  103. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts +45 -2
  104. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts.map +1 -1
  105. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +59 -8
  106. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  107. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts +4 -2
  108. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts.map +1 -1
  109. package/out/zero-cache/src/services/change-source/pg/replication-slots.js +7 -4
  110. package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
  111. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts +0 -5
  112. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
  113. package/out/zero-cache/src/services/change-source/pg/schema/init.js +29 -41
  114. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  115. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +35 -16
  116. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
  117. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +77 -7
  118. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  119. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +2 -1
  120. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
  121. package/out/zero-cache/src/services/change-source/protocol/current/data.js +5 -13
  122. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  123. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +6 -3
  124. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
  125. package/out/zero-cache/src/services/change-source/protocol/current/schema-change-tags.d.ts +6 -0
  126. package/out/zero-cache/src/services/change-source/protocol/current/schema-change-tags.d.ts.map +1 -0
  127. package/out/zero-cache/src/services/change-source/protocol/current/schema-change-tags.js +21 -0
  128. package/out/zero-cache/src/services/change-source/protocol/current/schema-change-tags.js.map +1 -0
  129. package/out/zero-cache/src/services/change-source/protocol/current/status.d.ts +1 -0
  130. package/out/zero-cache/src/services/change-source/protocol/current/status.d.ts.map +1 -1
  131. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts +1 -0
  132. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts.map +1 -1
  133. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts +5 -6
  134. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts.map +1 -1
  135. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js +32 -9
  136. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js.map +1 -1
  137. package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts +15 -5
  138. package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts.map +1 -1
  139. package/out/zero-cache/src/services/change-streamer/backup-monitor.js +66 -0
  140. package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -0
  141. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts +68 -78
  142. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts.map +1 -1
  143. package/out/zero-cache/src/services/change-streamer/broadcast.js +84 -92
  144. package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
  145. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts +19 -0
  146. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts.map +1 -0
  147. package/out/zero-cache/src/services/change-streamer/change-log-codec.js +50 -0
  148. package/out/zero-cache/src/services/change-streamer/change-log-codec.js.map +1 -0
  149. package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts +141 -0
  150. package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts.map +1 -0
  151. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js +270 -0
  152. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js.map +1 -0
  153. package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.d.ts +19 -0
  154. package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.d.ts.map +1 -0
  155. package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.js +39 -0
  156. package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.js.map +1 -0
  157. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +3 -4
  158. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  159. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +12 -17
  160. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  161. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +69 -24
  162. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  163. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +333 -66
  164. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  165. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +56 -13
  166. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
  167. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  168. package/out/zero-cache/src/services/change-streamer/error-type-enum.d.ts +8 -0
  169. package/out/zero-cache/src/services/change-streamer/error-type-enum.d.ts.map +1 -1
  170. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts +14 -3
  171. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -1
  172. package/out/zero-cache/src/services/change-streamer/forwarder.js +41 -11
  173. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
  174. package/out/zero-cache/src/services/change-streamer/{litestream3-backup-monitor.d.ts → litestream3-prometheus-poller.d.ts} +19 -45
  175. package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.d.ts.map +1 -0
  176. package/out/zero-cache/src/services/change-streamer/{litestream3-backup-monitor.js → litestream3-prometheus-poller.js} +57 -171
  177. package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.js.map +1 -0
  178. package/out/zero-cache/src/services/change-streamer/replica-poller.d.ts +15 -0
  179. package/out/zero-cache/src/services/change-streamer/replica-poller.d.ts.map +1 -0
  180. package/out/zero-cache/src/services/change-streamer/replica-poller.js +55 -0
  181. package/out/zero-cache/src/services/change-streamer/replica-poller.js.map +1 -0
  182. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +5 -1
  183. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
  184. package/out/zero-cache/src/services/change-streamer/schema/tables.js +2 -1
  185. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  186. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts +14 -0
  187. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts.map +1 -0
  188. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js +86 -0
  189. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js.map +1 -0
  190. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts +4 -1
  191. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts.map +1 -1
  192. package/out/zero-cache/src/services/change-streamer/snapshot.js +39 -14
  193. package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -1
  194. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.d.ts +75 -0
  195. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.d.ts.map +1 -0
  196. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js +261 -0
  197. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js.map +1 -0
  198. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.d.ts +121 -0
  199. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.d.ts.map +1 -0
  200. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.js +391 -0
  201. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.js.map +1 -0
  202. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.d.ts +62 -0
  203. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.d.ts.map +1 -0
  204. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js +159 -0
  205. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js.map +1 -0
  206. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts +109 -0
  207. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts.map +1 -0
  208. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js +258 -0
  209. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js.map +1 -0
  210. package/out/zero-cache/src/services/change-streamer/storer.d.ts +28 -12
  211. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  212. package/out/zero-cache/src/services/change-streamer/storer.js +116 -121
  213. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  214. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +61 -10
  215. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
  216. package/out/zero-cache/src/services/change-streamer/subscriber.js +101 -8
  217. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  218. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts +34 -0
  219. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts.map +1 -0
  220. package/out/zero-cache/src/services/change-streamer/upstream-acker.js +86 -0
  221. package/out/zero-cache/src/services/change-streamer/upstream-acker.js.map +1 -0
  222. package/out/zero-cache/src/services/life-cycle.d.ts +1 -1
  223. package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
  224. package/out/zero-cache/src/services/life-cycle.js +4 -3
  225. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  226. package/out/zero-cache/src/services/litestream/commands.d.ts +12 -11
  227. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  228. package/out/zero-cache/src/services/litestream/commands.js +107 -148
  229. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  230. package/out/zero-cache/src/services/litestream/config-v5.yml +42 -0
  231. package/out/zero-cache/src/services/litestream/config.yml +3 -2
  232. package/out/zero-cache/src/services/litestream/metrics.d.ts +4 -4
  233. package/out/zero-cache/src/services/litestream/metrics.d.ts.map +1 -1
  234. package/out/zero-cache/src/services/litestream/metrics.js +7 -10
  235. package/out/zero-cache/src/services/litestream/metrics.js.map +1 -1
  236. package/out/zero-cache/src/services/litestream/vfs-watermark-poller.d.ts +57 -0
  237. package/out/zero-cache/src/services/litestream/vfs-watermark-poller.d.ts.map +1 -0
  238. package/out/zero-cache/src/services/litestream/vfs-watermark-poller.js +137 -0
  239. package/out/zero-cache/src/services/litestream/vfs-watermark-poller.js.map +1 -0
  240. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  241. package/out/zero-cache/src/services/mutagen/mutagen.js +4 -1
  242. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  243. package/out/zero-cache/src/services/replicator/change-log-cookies.d.ts +169 -0
  244. package/out/zero-cache/src/services/replicator/change-log-cookies.d.ts.map +1 -0
  245. package/out/zero-cache/src/services/replicator/change-log-cookies.js +434 -0
  246. package/out/zero-cache/src/services/replicator/change-log-cookies.js.map +1 -0
  247. package/out/zero-cache/src/services/replicator/change-log-db.d.ts +358 -0
  248. package/out/zero-cache/src/services/replicator/change-log-db.d.ts.map +1 -0
  249. package/out/zero-cache/src/services/replicator/change-log-db.js +477 -0
  250. package/out/zero-cache/src/services/replicator/change-log-db.js.map +1 -0
  251. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts +55 -0
  252. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts.map +1 -0
  253. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js +150 -0
  254. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js.map +1 -0
  255. package/out/zero-cache/src/services/replicator/change-processor.d.ts +6 -0
  256. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
  257. package/out/zero-cache/src/services/replicator/change-processor.js +70 -25
  258. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  259. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +1 -1
  260. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  261. package/out/zero-cache/src/services/replicator/incremental-sync.js +19 -6
  262. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  263. package/out/zero-cache/src/services/replicator/notifier.d.ts +0 -22
  264. package/out/zero-cache/src/services/replicator/notifier.d.ts.map +1 -1
  265. package/out/zero-cache/src/services/replicator/notifier.js +7 -1
  266. package/out/zero-cache/src/services/replicator/notifier.js.map +1 -1
  267. package/out/zero-cache/src/services/replicator/replicator.d.ts +17 -2
  268. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
  269. package/out/zero-cache/src/services/replicator/replicator.js +9 -3
  270. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  271. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts +27 -0
  272. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts.map +1 -1
  273. package/out/zero-cache/src/services/replicator/reporter/recorder.js +32 -0
  274. package/out/zero-cache/src/services/replicator/reporter/recorder.js.map +1 -1
  275. package/out/zero-cache/src/services/replicator/reporter/report-schema.d.ts +1 -1
  276. package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts +119 -0
  277. package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts.map +1 -0
  278. package/out/zero-cache/src/services/replicator/schema/backfilling.js +214 -0
  279. package/out/zero-cache/src/services/replicator/schema/backfilling.js.map +1 -0
  280. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts +3 -3
  281. package/out/zero-cache/src/services/replicator/schema/column-metadata.js +1 -1
  282. package/out/zero-cache/src/services/replicator/schema/column-metadata.js.map +1 -1
  283. package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts +1 -1
  284. package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts.map +1 -1
  285. package/out/zero-cache/src/services/replicator/schema/replication-state.js +9 -5
  286. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
  287. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts +131 -0
  288. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts.map +1 -0
  289. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js +413 -0
  290. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js.map +1 -0
  291. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.d.ts +120 -0
  292. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.d.ts.map +1 -0
  293. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.js +283 -0
  294. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.js.map +1 -0
  295. package/out/zero-cache/src/services/replicator/write-worker.js +23 -12
  296. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
  297. package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
  298. package/out/zero-cache/src/services/run-ast.js +2 -1
  299. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  300. package/out/zero-cache/src/services/running-state.d.ts +1 -1
  301. package/out/zero-cache/src/services/running-state.d.ts.map +1 -1
  302. package/out/zero-cache/src/services/running-state.js +1 -0
  303. package/out/zero-cache/src/services/running-state.js.map +1 -1
  304. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.d.ts +53 -0
  305. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.d.ts.map +1 -0
  306. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.js +68 -0
  307. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.js.map +1 -0
  308. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  309. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +18 -3
  310. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  311. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  312. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  313. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +11 -1
  314. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  315. package/out/zero-cache/src/services/view-syncer/view-syncer.js +64 -6
  316. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  317. package/out/zero-cache/src/types/processes.d.ts +1 -2
  318. package/out/zero-cache/src/types/processes.d.ts.map +1 -1
  319. package/out/zero-cache/src/types/processes.js +1 -25
  320. package/out/zero-cache/src/types/processes.js.map +1 -1
  321. package/out/zero-cache/src/types/streams.d.ts +21 -0
  322. package/out/zero-cache/src/types/streams.d.ts.map +1 -1
  323. package/out/zero-cache/src/types/streams.js +25 -4
  324. package/out/zero-cache/src/types/streams.js.map +1 -1
  325. package/out/zero-cache/src/types/subscription.d.ts +11 -0
  326. package/out/zero-cache/src/types/subscription.d.ts.map +1 -1
  327. package/out/zero-cache/src/types/subscription.js +27 -0
  328. package/out/zero-cache/src/types/subscription.js.map +1 -1
  329. package/out/zero-cache/src/workers/connection.d.ts +1 -0
  330. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  331. package/out/zero-cache/src/workers/connection.js +24 -2
  332. package/out/zero-cache/src/workers/connection.js.map +1 -1
  333. package/out/zero-cache/src/workers/replicator.d.ts +25 -0
  334. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
  335. package/out/zero-cache/src/workers/replicator.js +33 -1
  336. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  337. package/out/zero-cache/src/workers/syncer.d.ts +12 -0
  338. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  339. package/out/zero-cache/src/workers/syncer.js +75 -0
  340. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  341. package/out/zero-client/src/client/version.js +1 -1
  342. package/out/zero-client/src/client/zero.d.ts +6 -7
  343. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  344. package/out/zero-client/src/client/zero.js +156 -101
  345. package/out/zero-client/src/client/zero.js.map +1 -1
  346. package/out/zero-schema/src/builder/table-builder.d.ts +23 -0
  347. package/out/zero-schema/src/builder/table-builder.d.ts.map +1 -1
  348. package/out/zero-schema/src/builder/table-builder.js +18 -0
  349. package/out/zero-schema/src/builder/table-builder.js.map +1 -1
  350. package/out/zero-server/src/custom.js +10 -3
  351. package/out/zero-server/src/custom.js.map +1 -1
  352. package/out/zero-server/src/schema.d.ts +8 -0
  353. package/out/zero-server/src/schema.d.ts.map +1 -1
  354. package/out/zero-server/src/schema.js +63 -24
  355. package/out/zero-server/src/schema.js.map +1 -1
  356. package/out/zero-types/src/schema.d.ts +11 -0
  357. package/out/zero-types/src/schema.d.ts.map +1 -1
  358. package/out/zql/src/mutate/crud.d.ts +10 -8
  359. package/out/zql/src/mutate/crud.d.ts.map +1 -1
  360. package/out/zql/src/mutate/crud.js.map +1 -1
  361. package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
  362. package/out/zql/src/query/query-delegate-base.js +5 -1
  363. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  364. package/out/zql/src/query/query-impl.d.ts +2 -2
  365. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  366. package/out/zql/src/query/query-impl.js.map +1 -1
  367. package/out/zql/src/query/query.d.ts +83 -14
  368. package/out/zql/src/query/query.d.ts.map +1 -1
  369. package/out/zql/src/query/static-query.d.ts +1 -1
  370. package/out/zql/src/query/static-query.d.ts.map +1 -1
  371. package/out/zqlite/src/db.js +2 -2
  372. package/out/zqlite/src/resolve-scalar-subqueries.d.ts +15 -0
  373. package/out/zqlite/src/resolve-scalar-subqueries.d.ts.map +1 -1
  374. package/out/zqlite/src/resolve-scalar-subqueries.js +33 -14
  375. package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
  376. package/out/zqlite/src/sqlite-cost-model.js +5 -5
  377. package/out/zqlite/src/table-source.js +3 -3
  378. package/package.json +3 -3
  379. package/out/replicache/src/db/index.js +0 -91
  380. package/out/replicache/src/db/index.js.map +0 -1
  381. package/out/replicache/src/lazy.d.ts +0 -2
  382. package/out/replicache/src/lazy.d.ts.map +0 -1
  383. package/out/replicache/src/lazy.js +0 -12
  384. package/out/replicache/src/lazy.js.map +0 -1
  385. package/out/zero-cache/src/server/backup-watermark-reader.js +0 -35
  386. package/out/zero-cache/src/server/backup-watermark-reader.js.map +0 -1
  387. package/out/zero-cache/src/services/change-streamer/litestream3-backup-monitor.d.ts.map +0 -1
  388. package/out/zero-cache/src/services/change-streamer/litestream3-backup-monitor.js.map +0 -1
  389. package/out/zero-cache/src/services/change-streamer/replica-monitor.d.ts +0 -16
  390. package/out/zero-cache/src/services/change-streamer/replica-monitor.d.ts.map +0 -1
  391. package/out/zero-cache/src/services/change-streamer/replica-monitor.js +0 -54
  392. package/out/zero-cache/src/services/change-streamer/replica-monitor.js.map +0 -1
  393. package/out/zero-cache/src/services/change-streamer/vfs-backup-monitor.d.ts +0 -25
  394. package/out/zero-cache/src/services/change-streamer/vfs-backup-monitor.d.ts.map +0 -1
  395. package/out/zero-cache/src/services/change-streamer/vfs-backup-monitor.js +0 -159
  396. package/out/zero-cache/src/services/change-streamer/vfs-backup-monitor.js.map +0 -1
  397. package/out/zero-cache/src/services/litestream/vfs-watermark-reader.d.ts +0 -44
  398. package/out/zero-cache/src/services/litestream/vfs-watermark-reader.d.ts.map +0 -1
  399. package/out/zero-cache/src/services/litestream/vfs-watermark-reader.js +0 -65
  400. package/out/zero-cache/src/services/litestream/vfs-watermark-reader.js.map +0 -1
  401. package/out/zero-cache/src/services/litestream/vfs-watermark-worker-source.d.ts +0 -11
  402. package/out/zero-cache/src/services/litestream/vfs-watermark-worker-source.d.ts.map +0 -1
  403. package/out/zero-cache/src/services/litestream/vfs-watermark-worker-source.js +0 -74
  404. package/out/zero-cache/src/services/litestream/vfs-watermark-worker-source.js.map +0 -1
  405. package/out/zero-cache/src/services/litestream/vfs-watermark-worker.d.ts +0 -42
  406. package/out/zero-cache/src/services/litestream/vfs-watermark-worker.d.ts.map +0 -1
  407. package/out/zero-cache/src/services/litestream/vfs-watermark-worker.js +0 -117
  408. 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';
@@ -12,6 +13,7 @@ export type TuningOptions = {
12
13
  backPressureLimitHeapProportion: number;
13
14
  statementTimeoutMs: number;
14
15
  changeLogBatchSize: number;
16
+ drainTimeoutMs?: number | undefined;
15
17
  };
16
18
  /**
17
19
  * Handles the storage of changes and the catchup of subscribers
@@ -46,11 +48,29 @@ export type TuningOptions = {
46
48
  export declare class Storer implements Service {
47
49
  #private;
48
50
  readonly id = "storer";
49
- 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, }: 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);
50
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
+ */
51
70
  getStartStreamInitializationParameters(): Promise<{
52
71
  lastWatermark: string;
53
72
  backfillRequests: BackfillRequest[];
73
+ cookies: CookieSet;
54
74
  }>;
55
75
  getMinWatermarkForCatchup(): Promise<string | null>;
56
76
  purgeRecordsBefore(watermark: string): Promise<number>;
@@ -59,7 +79,6 @@ export declare class Storer implements Service {
59
79
  */
60
80
  store(watermark: string, data: ChangeStreamData): string;
61
81
  abort(): void;
62
- status(s: DownstreamStatusMessage): void;
63
82
  catchup(subscriber: Subscriber, mode: ReplicatorMode): void;
64
83
  readyForMore(): Promise<void> | undefined;
65
84
  /**
@@ -72,16 +91,13 @@ export declare class Storer implements Service {
72
91
  * This is only used in tests.
73
92
  */
74
93
  allProcessed(): Promise<void>;
94
+ /**
95
+ * Stops the storer and waits up to a drain timeout for entries to drain,
96
+ * throwing an exception if it doesn't drain in time, in order to abort
97
+ * the server when PG (or the connection to it) appears to be wedged.
98
+ */
75
99
  stop(): Promise<void>;
76
100
  }
77
- /**
78
- * Extracts the stringified change message from the stringified
79
- * stream message (e.g. the second tuple element). This optimization
80
- * facilitates stringifying (and sharing the result of) the stream
81
- * message exactly once, but storing only the change message substring
82
- * in the changeLog for backwards compatibility.
83
- */
84
- export declare function extractChangeSubstring(streamMessageJSON: string, tag: Change['tag'] | undefined): string;
85
101
  export declare class PurgeLock {
86
102
  #private;
87
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;AAC9D,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;CAC5B,CAAC;AAaF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,MAAO,YAAW,OAAO;;IACpC,QAAQ,CAAC,EAAE,YAAY;gBAmBrB,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,GACnB,EAAE,aAAa;IAgCZ,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;IAMpD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS;IAyEzC;;;OAGG;IACG,GAAG;IA0eT;;;OAGG;IACG,YAAY;IAQlB,IAAI;CAOL;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,19 +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
+ import { orTimeout } from "../../types/timeout.js";
18
+ import { extractChangeSubstring, reconstructWatermarkedChange, serializeChangeStreamData } from "./change-log-codec.js";
17
19
  import { resolver } from "@rocicorp/resolver";
18
20
  import "postgres";
19
21
  import { getHeapStatistics } from "node:v8";
@@ -58,15 +60,16 @@ var Storer = class {
58
60
  #discoveryProtocol;
59
61
  #db;
60
62
  #replicaVersion;
61
- #onConsumed;
63
+ #onCommitted;
62
64
  #onFatal;
63
65
  #queue = new Queue();
64
66
  #backPressureThresholdBytes;
65
67
  #statementTimeoutMs;
66
68
  #changeLogBatchSize;
69
+ #drainTimeoutMs;
67
70
  #approximateQueuedBytes = 0;
68
71
  #running = false;
69
- constructor(lc, shard, taskID, discoveryAddress, discoveryProtocol, db, replicaVersion, onConsumed, onFatal, { backPressureLimitHeapProportion, statementTimeoutMs, changeLogBatchSize }) {
72
+ constructor(lc, shard, taskID, discoveryAddress, discoveryProtocol, db, replicaVersion, onCommitted, onFatal, { backPressureLimitHeapProportion, statementTimeoutMs, changeLogBatchSize, drainTimeoutMs = 3e4 }) {
70
73
  this.#lc = lc.withContext("component", "change-log");
71
74
  this.#shard = shard;
72
75
  this.#taskID = taskID;
@@ -74,10 +77,11 @@ var Storer = class {
74
77
  this.#discoveryProtocol = discoveryProtocol;
75
78
  this.#db = db;
76
79
  this.#replicaVersion = replicaVersion;
77
- this.#onConsumed = onConsumed;
80
+ this.#onCommitted = onCommitted;
78
81
  this.#onFatal = onFatal;
79
82
  this.#statementTimeoutMs = statementTimeoutMs;
80
83
  this.#changeLogBatchSize = Math.max(1, changeLogBatchSize);
84
+ this.#drainTimeoutMs = drainTimeoutMs;
81
85
  const heapStats = getHeapStatistics();
82
86
  this.#backPressureThresholdBytes = (heapStats.heap_size_limit - heapStats.used_heap_size) * backPressureLimitHeapProportion;
83
87
  this.#lc.info?.(`Using up to ${(this.#backPressureThresholdBytes / 1024 ** 2).toFixed(2)} MB of --max-old-space-size (~${(heapStats.heap_size_limit / 1024 ** 2).toFixed(2)} MB) to absorb upstream spikes`, { heapStats });
@@ -101,25 +105,55 @@ var Storer = class {
101
105
  this.#lc.info?.(`assumed ownership at ${addressWithProtocol} (${elapsed} ms)`);
102
106
  if (purgeLock) purgeLock.release();
103
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
+ */
104
125
  async getStartStreamInitializationParameters() {
105
- const [[{ lastWatermark }], result] = await runTx(this.#db, (sql) => [sql`
106
- SELECT "lastWatermark" FROM ${this.#cdc("replicationState")}`, sql`
107
- 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
108
131
  json_build_object(
109
132
  'schema', b."schema",
110
133
  'name', b."table",
111
134
  'metadata', t."metadata"
112
135
  ) as "table",
113
- json_object_agg(b."column", b."backfill")
136
+ json_object_agg(b."column", b."backfill")
114
137
  as "columns"
115
138
  FROM ${this.#cdc("backfilling")} as b
116
139
  LEFT JOIN ${this.#cdc("tableMetadata")} as t
117
140
  ON (b."schema" = t."schema" AND b."table" = t."table")
118
141
  GROUP BY b."schema", b."table", t."metadata"
119
- `], { 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 });
120
150
  return {
121
151
  lastWatermark,
122
- backfillRequests: parse(result, backfillRequestsSchema)
152
+ backfillRequests: parse(result, backfillRequestsSchema),
153
+ cookies: {
154
+ tableMetadata: [...tableMetadata],
155
+ backfilling: [...backfilling]
156
+ }
123
157
  };
124
158
  }
125
159
  async getMinWatermarkForCatchup() {
@@ -159,7 +193,7 @@ var Storer = class {
159
193
  * @returns The JSON stringified stream message to be sent downstream.
160
194
  */
161
195
  store(watermark, data) {
162
- const json = BigIntJSON.stringify(data);
196
+ const json = serializeChangeStreamData(data);
163
197
  this.#approximateQueuedBytes += json.length;
164
198
  const change = data[1];
165
199
  this.#queue.enqueue([
@@ -173,9 +207,6 @@ var Storer = class {
173
207
  abort() {
174
208
  this.#queue.enqueue(["abort"]);
175
209
  }
176
- status(s) {
177
- this.#queue.enqueue(s);
178
- }
179
210
  catchup(subscriber, mode) {
180
211
  this.#queue.enqueue(["subscriber", {
181
212
  subscriber,
@@ -183,20 +214,30 @@ var Storer = class {
183
214
  }]);
184
215
  }
185
216
  #readyForMore = null;
217
+ #backpressureTimeout;
186
218
  readyForMore() {
187
219
  if (!this.#running) return;
188
220
  if (this.#readyForMore === null && this.#approximateQueuedBytes > this.#backPressureThresholdBytes) {
189
221
  this.#lc.warn?.(`applying back pressure with ${this.#queue.size()} queued changes (~${(this.#approximateQueuedBytes / 1024 ** 2).toFixed(2)} MB)\n\nTo inspect changeLog backlog in your change DB:\n SELECT\n (change->'relation'->>'schema') || '.' || (change->'relation'->>'name') AS table_name,\n change->>'tag' AS operation,\n COUNT(*) AS count\n FROM "<app_id>/cdc"."changeLog"\n GROUP BY 1, 2\n ORDER BY 3 DESC\n LIMIT 20;`);
190
222
  this.#readyForMore = resolver();
223
+ this.#resetBackpressureTimeout(true);
191
224
  }
192
225
  return this.#readyForMore?.promise;
193
226
  }
227
+ #resetBackpressureTimeout(reschedule) {
228
+ clearTimeout(this.#backpressureTimeout);
229
+ this.#backpressureTimeout = reschedule ? setTimeout(() => {
230
+ this.#readyForMore?.reject(new AbortError(`No statement processed within the last ${this.#statementTimeoutMs}ms. Considering the change-log to be wedged.`));
231
+ this.#readyForMore = null;
232
+ }, this.#statementTimeoutMs) : void 0;
233
+ }
194
234
  #maybeReleaseBackPressure() {
195
- if (this.#readyForMore !== null && this.#approximateQueuedBytes < this.#backPressureThresholdBytes * .8) {
235
+ if (this.#readyForMore !== null) if (this.#approximateQueuedBytes < this.#backPressureThresholdBytes * .8) {
196
236
  this.#lc.info?.(`releasing back pressure with ${this.#queue.size()} queued changes (~${(this.#approximateQueuedBytes / 1024 ** 2).toFixed(2)} MB)`);
197
237
  this.#readyForMore.resolve();
198
238
  this.#readyForMore = null;
199
- }
239
+ this.#resetBackpressureTimeout(false);
240
+ } else this.#resetBackpressureTimeout(true);
200
241
  }
201
242
  /**
202
243
  * Flushes any buffered {@link PendingTransaction.batch} rows to the changeLog.
@@ -246,6 +287,7 @@ var Storer = class {
246
287
  this.#readyForMore.resolve();
247
288
  this.#readyForMore = null;
248
289
  }
290
+ this.#resetBackpressureTimeout(false);
249
291
  this.#cancelQueueEntries(this.#queue.drain().filter((entry) => entry !== void 0), err);
250
292
  this.#running = false;
251
293
  signalStopped();
@@ -287,9 +329,6 @@ var Storer = class {
287
329
  else await this.#startCatchup([subscriber]);
288
330
  continue;
289
331
  }
290
- case "status":
291
- this.#onConsumed(msg);
292
- continue;
293
332
  case "abort":
294
333
  if (tx) {
295
334
  tx.pool.abort();
@@ -356,7 +395,7 @@ var Storer = class {
356
395
  tx.pool.setDone();
357
396
  }
358
397
  await tx.pool.done();
359
- if (tx.ack) this.#onConsumed([
398
+ if (tx.ack) this.#onCommitted([
360
399
  "commit",
361
400
  change,
362
401
  { watermark }
@@ -377,7 +416,8 @@ var Storer = class {
377
416
  }
378
417
  async #startCatchup(subs) {
379
418
  if (subs.length === 0) return;
380
- 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 });
381
421
  reader.run(this.#db);
382
422
  let lastWatermark;
383
423
  try {
@@ -388,11 +428,13 @@ var Storer = class {
388
428
  subs.map(({ subscriber }) => subscriber.fail(e));
389
429
  throw e;
390
430
  }
391
- 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());
392
432
  }
393
- async #catchup({ subscriber: sub, mode }, lastWatermark, reader) {
433
+ async #catchup(lc, { subscriber: sub, mode }, lastWatermark, reader) {
394
434
  try {
435
+ lc.info?.(`starting catchup`);
395
436
  await reader.processReadTask(async (tx) => {
437
+ lc.info?.(`catching up`);
396
438
  const start = Date.now();
397
439
  let watermarkFound = sub.watermark === this.#replicaVersion;
398
440
  let count = 0;
@@ -405,26 +447,26 @@ var Storer = class {
405
447
  const start = performance.now();
406
448
  await lastBatchConsumed;
407
449
  const elapsed = performance.now() - start;
408
- 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`);
409
451
  for (const entry of entries) if (entry.watermark === sub.watermark) watermarkFound = true;
410
452
  else if (watermarkFound) {
411
- lastBatchConsumed = sub.catchup(toDownstream(entry));
453
+ lastBatchConsumed = sub.catchup(reconstructWatermarkedChange(entry));
412
454
  count++;
413
455
  } else if (mode === "backup") throw new AutoResetSignal(`backup replica at watermark ${sub.watermark} is behind change db: ${entry.watermark})`);
414
456
  else {
415
- 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})`);
416
458
  sub.close(2, `earliest supported watermark is ${entry.watermark} (requested ${sub.watermark})`);
417
459
  return;
418
460
  }
419
461
  }
420
462
  if (watermarkFound) {
421
463
  await lastBatchConsumed;
422
- this.#lc.info?.(`caught up ${sub.id} with ${count} changes (${Date.now() - start} ms)`);
423
- } 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`);
424
466
  sub.setCaughtUp();
425
467
  });
426
468
  } catch (err) {
427
- this.#lc.error?.(`error while catching up subscriber ${sub.id}`, err);
469
+ lc.error?.(`error while catching up subscriber ${sub.id}`, err);
428
470
  if (err instanceof AutoResetSignal) {
429
471
  await markResetRequired(this.#db, this.#shard);
430
472
  this.#onFatal(err);
@@ -435,67 +477,54 @@ var Storer = class {
435
477
  /**
436
478
  * Returns the db statements necessary to track backfill and table metadata
437
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.
438
487
  */
439
488
  #trackBackfillMetadata(sql, change) {
440
- const stmts = [];
441
- switch (change.tag) {
442
- case "update-table-metadata": {
443
- const { table, new: metadata } = change;
444
- stmts.push(this.#upsertTableMetadataStmt(sql, table, metadata));
445
- break;
446
- }
447
- case "create-table": {
448
- const { spec, metadata, backfill } = change;
449
- if (metadata) stmts.push(this.#upsertTableMetadataStmt(sql, spec, metadata));
450
- if (backfill) Object.entries(backfill).forEach(([col, backfill]) => {
451
- stmts.push(this.#upsertColumnBackfillStmt(sql, spec, col, backfill));
452
- });
453
- break;
454
- }
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)];
455
495
  case "rename-table": {
456
- const { old } = change;
496
+ const { old } = op;
457
497
  const row = {
458
- schema: change.new.schema,
459
- table: change.new.name
498
+ schema: op.new.schema,
499
+ table: op.new.name
460
500
  };
461
- stmts.push(sql`UPDATE ${this.#cdc("tableMetadata")} SET ${sql(row)}
501
+ return [sql`UPDATE ${this.#cdc("tableMetadata")} SET ${sql(row)}
462
502
  WHERE "schema" = ${old.schema} AND "table" = ${old.name}`, sql`UPDATE ${this.#cdc("backfilling")} SET ${sql(row)}
463
- WHERE "schema" = ${old.schema} AND "table" = ${old.name}`);
464
- break;
503
+ WHERE "schema" = ${old.schema} AND "table" = ${old.name}`];
465
504
  }
466
505
  case "drop-table": {
467
- const { id: { schema, name } } = change;
468
- stmts.push(sql`DELETE FROM ${this.#cdc("tableMetadata")}
506
+ const { schema, name } = op.table;
507
+ return [sql`DELETE FROM ${this.#cdc("tableMetadata")}
469
508
  WHERE "schema" = ${schema} AND "table" = ${name}`, sql`DELETE FROM ${this.#cdc("backfilling")}
470
- WHERE "schema" = ${schema} AND "table" = ${name}`);
471
- break;
509
+ WHERE "schema" = ${schema} AND "table" = ${name}`];
472
510
  }
473
- case "add-column": {
474
- const { table, tableMetadata, column, backfill } = change;
475
- if (tableMetadata) stmts.push(this.#upsertTableMetadataStmt(sql, table, tableMetadata));
476
- if (backfill) stmts.push(this.#upsertColumnBackfillStmt(sql, table, column.name, backfill));
477
- break;
478
- }
479
- case "update-column": {
480
- const { table: { schema, name: table }, old: { name: oldName }, new: { name: newName } } = change;
481
- if (oldName !== newName) stmts.push(sql`UPDATE ${this.#cdc("backfilling")} SET "column" = ${newName}
482
- WHERE "schema" = ${schema} AND "table" = ${table} AND "column" = ${oldName}`);
483
- 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}`];
484
515
  }
485
516
  case "drop-column": {
486
- const { table: { schema, name }, column } = change;
487
- stmts.push(sql`DELETE FROM ${this.#cdc("backfilling")}
488
- WHERE "schema" = ${schema} AND "table" = ${name} AND "column" = ${column}`);
489
- 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}`];
490
520
  }
491
- case "backfill-completed": {
492
- const { relation: { schema, name: table, rowKey }, columns } = change;
493
- const cols = [...rowKey.columns, ...columns];
494
- stmts.push(sql`DELETE FROM ${this.#cdc("backfilling")}
495
- 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])}`];
496
525
  }
526
+ default: unreachable(op);
497
527
  }
498
- return stmts;
499
528
  }
500
529
  #upsertTableMetadataStmt(sql, { schema, name: table }, metadata) {
501
530
  const row = {
@@ -505,7 +534,7 @@ var Storer = class {
505
534
  };
506
535
  return sql`
507
536
  INSERT INTO ${this.#cdc("tableMetadata")} ${sql(row)}
508
- ON CONFLICT ("schema", "table")
537
+ ON CONFLICT ("schema", "table")
509
538
  DO UPDATE SET ${sql(row)};
510
539
  `;
511
540
  }
@@ -518,7 +547,7 @@ var Storer = class {
518
547
  };
519
548
  return sql`
520
549
  INSERT INTO ${this.#cdc("backfilling")} ${sql(row)}
521
- ON CONFLICT ("schema", "table", "column")
550
+ ON CONFLICT ("schema", "table", "column")
522
551
  DO UPDATE SET ${sql(row)};
523
552
  `;
524
553
  }
@@ -533,54 +562,20 @@ var Storer = class {
533
562
  await promise;
534
563
  }
535
564
  }
536
- stop() {
565
+ /**
566
+ * Stops the storer and waits up to a drain timeout for entries to drain,
567
+ * throwing an exception if it doesn't drain in time, in order to abort
568
+ * the server when PG (or the connection to it) appears to be wedged.
569
+ */
570
+ async stop() {
537
571
  if (this.#running) {
538
572
  this.#lc.info?.(`draining ${this.#queue.size()} changeLog entries`);
573
+ this.abort();
539
574
  this.#queue.enqueue("stop");
540
575
  }
541
- return this.#stopped;
576
+ if (await orTimeout(this.#stopped, this.#drainTimeoutMs) === "timed-out") throw new AbortError(`changeLog did not drain within ${this.#drainTimeoutMs}ms`);
542
577
  }
543
578
  };
544
- /**
545
- * Extracts the stringified change message from the stringified
546
- * stream message (e.g. the second tuple element). This optimization
547
- * facilitates stringifying (and sharing the result of) the stream
548
- * message exactly once, but storing only the change message substring
549
- * in the changeLog for backwards compatibility.
550
- */
551
- function extractChangeSubstring(streamMessageJSON, tag) {
552
- switch (tag) {
553
- case "begin":
554
- case "commit": return streamMessageJSON.substring(streamMessageJSON.indexOf(",") + 1, streamMessageJSON.lastIndexOf(","));
555
- default: return streamMessageJSON.substring(streamMessageJSON.indexOf(",") + 1, streamMessageJSON.lastIndexOf("]"));
556
- }
557
- }
558
- function toDownstream(entry) {
559
- const { watermark, change } = entry;
560
- const tag = entry.tag;
561
- switch (tag) {
562
- case "begin": return [
563
- watermark,
564
- tag,
565
- `["begin",${change},{"commitWatermark":"${watermark}"}]`
566
- ];
567
- case "commit": return [
568
- watermark,
569
- tag,
570
- `["commit",${change},{"watermark":"${watermark}"}]`
571
- ];
572
- case "rollback": return [
573
- watermark,
574
- tag,
575
- `["rollback",${change}]`
576
- ];
577
- default: return [
578
- watermark,
579
- tag,
580
- `["data",${change}]`
581
- ];
582
- }
583
- }
584
579
  var PurgeLock = class {
585
580
  #lc;
586
581
  #tx;