@rocicorp/zero 0.26.1-canary.9 → 0.26.2-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 (1113) hide show
  1. package/out/_virtual/_@oxc-project_runtime@0.115.0/helpers/usingCtx.js +57 -0
  2. package/out/_virtual/_rolldown/runtime.js +27 -0
  3. package/out/analyze-query/src/bin-analyze.js +195 -280
  4. package/out/analyze-query/src/bin-analyze.js.map +1 -1
  5. package/out/analyze-query/src/bin-transform.js +35 -40
  6. package/out/analyze-query/src/bin-transform.js.map +1 -1
  7. package/out/analyze-query/src/explain-queries.js +11 -13
  8. package/out/analyze-query/src/explain-queries.js.map +1 -1
  9. package/out/analyze-query/src/run-ast.d.ts.map +1 -1
  10. package/out/analyze-query/src/run-ast.js +68 -94
  11. package/out/analyze-query/src/run-ast.js.map +1 -1
  12. package/out/ast-to-zql/src/ast-to-zql.js +105 -153
  13. package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
  14. package/out/ast-to-zql/src/bin.js +57 -62
  15. package/out/ast-to-zql/src/bin.js.map +1 -1
  16. package/out/ast-to-zql/src/format.js +14 -13
  17. package/out/ast-to-zql/src/format.js.map +1 -1
  18. package/out/datadog/src/datadog-log-sink.js +148 -213
  19. package/out/datadog/src/datadog-log-sink.js.map +1 -1
  20. package/out/otel/src/enabled.js +9 -11
  21. package/out/otel/src/enabled.js.map +1 -1
  22. package/out/otel/src/log-options.js +25 -35
  23. package/out/otel/src/log-options.js.map +1 -1
  24. package/out/otel/src/maybe-time.js +13 -14
  25. package/out/otel/src/maybe-time.js.map +1 -1
  26. package/out/otel/src/span.js +23 -26
  27. package/out/otel/src/span.js.map +1 -1
  28. package/out/otel/src/test-log-config.js +11 -10
  29. package/out/otel/src/test-log-config.js.map +1 -1
  30. package/out/otel/src/version.js +6 -5
  31. package/out/otel/src/version.js.map +1 -1
  32. package/out/replicache/src/async-iterable-to-array.js +8 -9
  33. package/out/replicache/src/async-iterable-to-array.js.map +1 -1
  34. package/out/replicache/src/bg-interval.js +28 -35
  35. package/out/replicache/src/bg-interval.js.map +1 -1
  36. package/out/replicache/src/btree/diff.js +6 -5
  37. package/out/replicache/src/btree/diff.js.map +1 -1
  38. package/out/replicache/src/btree/node.js +281 -372
  39. package/out/replicache/src/btree/node.js.map +1 -1
  40. package/out/replicache/src/btree/read.js +155 -256
  41. package/out/replicache/src/btree/read.js.map +1 -1
  42. package/out/replicache/src/btree/splice.js +60 -80
  43. package/out/replicache/src/btree/splice.js.map +1 -1
  44. package/out/replicache/src/btree/write.js +134 -158
  45. package/out/replicache/src/btree/write.js.map +1 -1
  46. package/out/replicache/src/call-default-fetch.js +28 -32
  47. package/out/replicache/src/call-default-fetch.js.map +1 -1
  48. package/out/replicache/src/config.js +2 -0
  49. package/out/replicache/src/connection-loop-delegates.js +31 -33
  50. package/out/replicache/src/connection-loop-delegates.js.map +1 -1
  51. package/out/replicache/src/connection-loop.js +174 -240
  52. package/out/replicache/src/connection-loop.js.map +1 -1
  53. package/out/replicache/src/cookies.js +22 -32
  54. package/out/replicache/src/cookies.js.map +1 -1
  55. package/out/replicache/src/dag/chunk.js +44 -50
  56. package/out/replicache/src/dag/chunk.js.map +1 -1
  57. package/out/replicache/src/dag/gc.js +94 -114
  58. package/out/replicache/src/dag/gc.js.map +1 -1
  59. package/out/replicache/src/dag/key.js +9 -11
  60. package/out/replicache/src/dag/key.js.map +1 -1
  61. package/out/replicache/src/dag/lazy-store.js +458 -510
  62. package/out/replicache/src/dag/lazy-store.js.map +1 -1
  63. package/out/replicache/src/dag/store-impl.js +147 -178
  64. package/out/replicache/src/dag/store-impl.js.map +1 -1
  65. package/out/replicache/src/dag/store.js +19 -22
  66. package/out/replicache/src/dag/store.js.map +1 -1
  67. package/out/replicache/src/dag/visitor.js +23 -21
  68. package/out/replicache/src/dag/visitor.js.map +1 -1
  69. package/out/replicache/src/db/commit.js +209 -283
  70. package/out/replicache/src/db/commit.js.map +1 -1
  71. package/out/replicache/src/db/index.js +79 -122
  72. package/out/replicache/src/db/index.js.map +1 -1
  73. package/out/replicache/src/db/read.js +44 -60
  74. package/out/replicache/src/db/read.js.map +1 -1
  75. package/out/replicache/src/db/rebase.js +22 -77
  76. package/out/replicache/src/db/rebase.js.map +1 -1
  77. package/out/replicache/src/db/write.js +162 -296
  78. package/out/replicache/src/db/write.js.map +1 -1
  79. package/out/replicache/src/deleted-clients.js +59 -87
  80. package/out/replicache/src/deleted-clients.js.map +1 -1
  81. package/out/replicache/src/error-responses.js +18 -26
  82. package/out/replicache/src/error-responses.js.map +1 -1
  83. package/out/replicache/src/expo-sqlite.js +2 -0
  84. package/out/replicache/src/frozen-json.js +74 -108
  85. package/out/replicache/src/frozen-json.js.map +1 -1
  86. package/out/replicache/src/get-default-puller.js +34 -46
  87. package/out/replicache/src/get-default-puller.js.map +1 -1
  88. package/out/replicache/src/get-default-pusher.js +25 -33
  89. package/out/replicache/src/get-default-pusher.js.map +1 -1
  90. package/out/replicache/src/get-kv-store-provider.js +18 -20
  91. package/out/replicache/src/get-kv-store-provider.js.map +1 -1
  92. package/out/replicache/src/hash.js +29 -29
  93. package/out/replicache/src/hash.js.map +1 -1
  94. package/out/replicache/src/http-request-info.js +9 -8
  95. package/out/replicache/src/http-request-info.js.map +1 -1
  96. package/out/replicache/src/impl.js +2 -0
  97. package/out/replicache/src/index-defs.js +17 -28
  98. package/out/replicache/src/index-defs.js.map +1 -1
  99. package/out/replicache/src/kv/expo-sqlite/store.js +52 -50
  100. package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
  101. package/out/replicache/src/kv/idb-store-with-mem-fallback.js +71 -68
  102. package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +1 -1
  103. package/out/replicache/src/kv/idb-store.js +144 -168
  104. package/out/replicache/src/kv/idb-store.js.map +1 -1
  105. package/out/replicache/src/kv/mem-store.js +57 -45
  106. package/out/replicache/src/kv/mem-store.js.map +1 -1
  107. package/out/replicache/src/kv/op-sqlite/store.js +56 -62
  108. package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
  109. package/out/replicache/src/kv/op-sqlite/types.d.ts.map +1 -1
  110. package/out/replicache/src/kv/op-sqlite/types.js +7 -6
  111. package/out/replicache/src/kv/op-sqlite/types.js.map +1 -1
  112. package/out/replicache/src/kv/read-impl.js +26 -25
  113. package/out/replicache/src/kv/read-impl.js.map +1 -1
  114. package/out/replicache/src/kv/sqlite-store.js +194 -207
  115. package/out/replicache/src/kv/sqlite-store.js.map +1 -1
  116. package/out/replicache/src/kv/throw-if-closed.js +12 -19
  117. package/out/replicache/src/kv/throw-if-closed.js.map +1 -1
  118. package/out/replicache/src/kv/write-impl-base.js +44 -56
  119. package/out/replicache/src/kv/write-impl-base.js.map +1 -1
  120. package/out/replicache/src/kv/write-impl.js +22 -26
  121. package/out/replicache/src/kv/write-impl.js.map +1 -1
  122. package/out/replicache/src/lazy.js +10 -11
  123. package/out/replicache/src/lazy.js.map +1 -1
  124. package/out/replicache/src/log-options.js +14 -7
  125. package/out/replicache/src/log-options.js.map +1 -1
  126. package/out/replicache/src/make-idb-name.js +14 -9
  127. package/out/replicache/src/make-idb-name.js.map +1 -1
  128. package/out/replicache/src/mutation-recovery.js +12 -0
  129. package/out/replicache/src/mutation-recovery.js.map +1 -0
  130. package/out/replicache/src/new-client-channel.js +34 -42
  131. package/out/replicache/src/new-client-channel.js.map +1 -1
  132. package/out/replicache/src/on-persist-channel.js +26 -29
  133. package/out/replicache/src/on-persist-channel.js.map +1 -1
  134. package/out/replicache/src/op-sqlite.js +2 -0
  135. package/out/replicache/src/patch-operation.js +27 -36
  136. package/out/replicache/src/patch-operation.js.map +1 -1
  137. package/out/replicache/src/pending-mutations.js +14 -12
  138. package/out/replicache/src/pending-mutations.js.map +1 -1
  139. package/out/replicache/src/persist/client-gc.js +36 -51
  140. package/out/replicache/src/persist/client-gc.js.map +1 -1
  141. package/out/replicache/src/persist/client-group-gc.js +29 -36
  142. package/out/replicache/src/persist/client-group-gc.js.map +1 -1
  143. package/out/replicache/src/persist/client-groups.js +80 -154
  144. package/out/replicache/src/persist/client-groups.js.map +1 -1
  145. package/out/replicache/src/persist/clients.js +212 -307
  146. package/out/replicache/src/persist/clients.js.map +1 -1
  147. package/out/replicache/src/persist/collect-idb-databases.js +109 -171
  148. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
  149. package/out/replicache/src/persist/gather-mem-only-visitor.js +23 -24
  150. package/out/replicache/src/persist/gather-mem-only-visitor.js.map +1 -1
  151. package/out/replicache/src/persist/gather-not-cached-visitor.js +35 -33
  152. package/out/replicache/src/persist/gather-not-cached-visitor.js.map +1 -1
  153. package/out/replicache/src/persist/heartbeat.js +31 -41
  154. package/out/replicache/src/persist/heartbeat.js.map +1 -1
  155. package/out/replicache/src/persist/idb-databases-store-db-name.js +9 -12
  156. package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -1
  157. package/out/replicache/src/persist/idb-databases-store.js +78 -97
  158. package/out/replicache/src/persist/idb-databases-store.js.map +1 -1
  159. package/out/replicache/src/persist/make-client-id.js +13 -9
  160. package/out/replicache/src/persist/make-client-id.js.map +1 -1
  161. package/out/replicache/src/persist/persist.js +113 -174
  162. package/out/replicache/src/persist/persist.js.map +1 -1
  163. package/out/replicache/src/persist/refresh.js +94 -183
  164. package/out/replicache/src/persist/refresh.js.map +1 -1
  165. package/out/replicache/src/process-scheduler.js +122 -143
  166. package/out/replicache/src/process-scheduler.js.map +1 -1
  167. package/out/replicache/src/pusher.js +21 -26
  168. package/out/replicache/src/pusher.js.map +1 -1
  169. package/out/replicache/src/replicache-impl.js +844 -1184
  170. package/out/replicache/src/replicache-impl.js.map +1 -1
  171. package/out/replicache/src/report-error.js +9 -6
  172. package/out/replicache/src/report-error.js.map +1 -1
  173. package/out/replicache/src/request-idle.js +13 -11
  174. package/out/replicache/src/request-idle.js.map +1 -1
  175. package/out/replicache/src/scan-iterator.d.ts.map +1 -1
  176. package/out/replicache/src/scan-iterator.js +108 -135
  177. package/out/replicache/src/scan-iterator.js.map +1 -1
  178. package/out/replicache/src/scan-options.js +33 -39
  179. package/out/replicache/src/scan-options.js.map +1 -1
  180. package/out/replicache/src/set-interval-with-signal.js +11 -10
  181. package/out/replicache/src/set-interval-with-signal.js.map +1 -1
  182. package/out/replicache/src/sqlite.js +2 -0
  183. package/out/replicache/src/subscriptions.js +222 -338
  184. package/out/replicache/src/subscriptions.js.map +1 -1
  185. package/out/replicache/src/sync/diff.js +52 -65
  186. package/out/replicache/src/sync/diff.js.map +1 -1
  187. package/out/replicache/src/sync/ids.js +8 -9
  188. package/out/replicache/src/sync/ids.js.map +1 -1
  189. package/out/replicache/src/sync/patch.js +34 -45
  190. package/out/replicache/src/sync/patch.js.map +1 -1
  191. package/out/replicache/src/sync/pull-error.js +15 -15
  192. package/out/replicache/src/sync/pull-error.js.map +1 -1
  193. package/out/replicache/src/sync/pull.js +145 -283
  194. package/out/replicache/src/sync/pull.js.map +1 -1
  195. package/out/replicache/src/sync/push.js +64 -79
  196. package/out/replicache/src/sync/push.js.map +1 -1
  197. package/out/replicache/src/sync/request-id.js +23 -15
  198. package/out/replicache/src/sync/request-id.js.map +1 -1
  199. package/out/replicache/src/sync/sync-head-name.js +6 -5
  200. package/out/replicache/src/sync/sync-head-name.js.map +1 -1
  201. package/out/replicache/src/to-error.js +7 -8
  202. package/out/replicache/src/to-error.js.map +1 -1
  203. package/out/replicache/src/transaction-closed-error.js +15 -15
  204. package/out/replicache/src/transaction-closed-error.js.map +1 -1
  205. package/out/replicache/src/transactions.js +120 -140
  206. package/out/replicache/src/transactions.js.map +1 -1
  207. package/out/replicache/src/version.js +9 -5
  208. package/out/replicache/src/version.js.map +1 -1
  209. package/out/replicache/src/with-transactions.js +23 -20
  210. package/out/replicache/src/with-transactions.js.map +1 -1
  211. package/out/shared/src/abort-error.js +7 -6
  212. package/out/shared/src/abort-error.js.map +1 -1
  213. package/out/shared/src/arrays.js +35 -42
  214. package/out/shared/src/arrays.js.map +1 -1
  215. package/out/shared/src/asserts.js +21 -45
  216. package/out/shared/src/asserts.js.map +1 -1
  217. package/out/shared/src/bigint-json.js +42 -38
  218. package/out/shared/src/bigint-json.js.map +1 -1
  219. package/out/shared/src/binary-search.js +27 -18
  220. package/out/shared/src/binary-search.js.map +1 -1
  221. package/out/shared/src/broadcast-channel.js +20 -23
  222. package/out/shared/src/broadcast-channel.js.map +1 -1
  223. package/out/shared/src/browser-env.js +11 -17
  224. package/out/shared/src/browser-env.js.map +1 -1
  225. package/out/shared/src/btree-set.js +419 -481
  226. package/out/shared/src/btree-set.js.map +1 -1
  227. package/out/shared/src/cache.js +43 -36
  228. package/out/shared/src/cache.js.map +1 -1
  229. package/out/shared/src/centroid.js +24 -26
  230. package/out/shared/src/centroid.js.map +1 -1
  231. package/out/shared/src/config.js +6 -6
  232. package/out/shared/src/config.js.map +1 -1
  233. package/out/shared/src/custom-key-map.js +54 -58
  234. package/out/shared/src/custom-key-map.js.map +1 -1
  235. package/out/shared/src/custom-key-set.js +53 -51
  236. package/out/shared/src/custom-key-set.js.map +1 -1
  237. package/out/shared/src/deep-clone.js +30 -41
  238. package/out/shared/src/deep-clone.js.map +1 -1
  239. package/out/shared/src/deep-merge.js +25 -24
  240. package/out/shared/src/deep-merge.js.map +1 -1
  241. package/out/shared/src/document-visible.js +63 -70
  242. package/out/shared/src/document-visible.js.map +1 -1
  243. package/out/shared/src/dotenv.js +7 -3
  244. package/out/shared/src/dotenv.js.map +1 -1
  245. package/out/shared/src/error.js +43 -64
  246. package/out/shared/src/error.js.map +1 -1
  247. package/out/shared/src/has-own.js +6 -5
  248. package/out/shared/src/has-own.js.map +1 -1
  249. package/out/shared/src/hash.js +15 -14
  250. package/out/shared/src/hash.js.map +1 -1
  251. package/out/shared/src/iterables.js +34 -47
  252. package/out/shared/src/iterables.js.map +1 -1
  253. package/out/shared/src/json-schema.js +25 -30
  254. package/out/shared/src/json-schema.js.map +1 -1
  255. package/out/shared/src/json.js +90 -129
  256. package/out/shared/src/json.js.map +1 -1
  257. package/out/shared/src/logging-test-utils.js +9 -11
  258. package/out/shared/src/logging-test-utils.js.map +1 -1
  259. package/out/shared/src/logging.js +75 -95
  260. package/out/shared/src/logging.js.map +1 -1
  261. package/out/shared/src/must.js +7 -8
  262. package/out/shared/src/must.js.map +1 -1
  263. package/out/shared/src/navigator.js +6 -5
  264. package/out/shared/src/navigator.js.map +1 -1
  265. package/out/shared/src/object-traversal.js +23 -23
  266. package/out/shared/src/object-traversal.js.map +1 -1
  267. package/out/shared/src/objects.js +15 -18
  268. package/out/shared/src/objects.js.map +1 -1
  269. package/out/shared/src/options.js +225 -302
  270. package/out/shared/src/options.js.map +1 -1
  271. package/out/shared/src/parse-big-int.js +12 -11
  272. package/out/shared/src/parse-big-int.js.map +1 -1
  273. package/out/shared/src/promise-race.js +21 -17
  274. package/out/shared/src/promise-race.js.map +1 -1
  275. package/out/shared/src/queue.js +124 -124
  276. package/out/shared/src/queue.js.map +1 -1
  277. package/out/shared/src/rand.js +13 -7
  278. package/out/shared/src/rand.js.map +1 -1
  279. package/out/shared/src/random-uint64.js +8 -7
  280. package/out/shared/src/random-uint64.js.map +1 -1
  281. package/out/shared/src/random-values.js +8 -11
  282. package/out/shared/src/random-values.js.map +1 -1
  283. package/out/shared/src/record-proxy.js +68 -57
  284. package/out/shared/src/record-proxy.js.map +1 -1
  285. package/out/shared/src/resolved-promises.js +9 -11
  286. package/out/shared/src/resolved-promises.js.map +1 -1
  287. package/out/shared/src/sentinels.js +9 -12
  288. package/out/shared/src/sentinels.js.map +1 -1
  289. package/out/shared/src/set-utils.js +41 -63
  290. package/out/shared/src/set-utils.js.map +1 -1
  291. package/out/shared/src/size-of-value.js +55 -51
  292. package/out/shared/src/size-of-value.js.map +1 -1
  293. package/out/shared/src/sleep.js +50 -45
  294. package/out/shared/src/sleep.js.map +1 -1
  295. package/out/shared/src/string-compare.js +8 -11
  296. package/out/shared/src/string-compare.js.map +1 -1
  297. package/out/shared/src/subscribable.js +34 -33
  298. package/out/shared/src/subscribable.js.map +1 -1
  299. package/out/shared/src/tdigest-schema.js +11 -7
  300. package/out/shared/src/tdigest-schema.js.map +1 -1
  301. package/out/shared/src/tdigest.js +197 -270
  302. package/out/shared/src/tdigest.js.map +1 -1
  303. package/out/shared/src/valita.js +145 -174
  304. package/out/shared/src/valita.js.map +1 -1
  305. package/out/z2s/src/compiler.d.ts.map +1 -1
  306. package/out/z2s/src/compiler.js +238 -468
  307. package/out/z2s/src/compiler.js.map +1 -1
  308. package/out/z2s/src/sql.d.ts +0 -1
  309. package/out/z2s/src/sql.d.ts.map +1 -1
  310. package/out/z2s/src/sql.js +149 -194
  311. package/out/z2s/src/sql.js.map +1 -1
  312. package/out/zero/package.js +193 -0
  313. package/out/zero/package.js.map +1 -0
  314. package/out/zero/src/adapters/drizzle.js +1 -6
  315. package/out/zero/src/adapters/pg.js +1 -6
  316. package/out/zero/src/adapters/postgresjs.js +1 -6
  317. package/out/zero/src/adapters/prisma.js +1 -5
  318. package/out/zero/src/analyze-query.js +1 -1
  319. package/out/zero/src/ast-to-zql.js +1 -1
  320. package/out/zero/src/bindings.js +6 -21
  321. package/out/zero/src/build-schema.js +5 -1
  322. package/out/zero/src/build-schema.js.map +1 -1
  323. package/out/zero/src/change-protocol/v0.js +3 -5
  324. package/out/zero/src/cli.js +2 -2
  325. package/out/zero/src/deploy-permissions.js +1 -1
  326. package/out/zero/src/expo-sqlite.js +2 -4
  327. package/out/zero/src/op-sqlite.js +2 -4
  328. package/out/zero/src/pg.js +2 -20
  329. package/out/zero/src/react-native.js +16 -12
  330. package/out/zero/src/react-native.js.map +1 -1
  331. package/out/zero/src/react.js +3 -12
  332. package/out/zero/src/server/runner/main.js +2 -0
  333. package/out/zero/src/server.js +2 -17
  334. package/out/zero/src/solid.js +3 -12
  335. package/out/zero/src/sqlite.js +2 -6
  336. package/out/zero/src/transform-query.js +1 -1
  337. package/out/zero/src/zero-cache-dev.js +124 -151
  338. package/out/zero/src/zero-cache-dev.js.map +1 -1
  339. package/out/zero/src/zero-out.js +9 -6
  340. package/out/zero/src/zero-out.js.map +1 -1
  341. package/out/zero/src/zero.js +6 -55
  342. package/out/zero/src/zqlite.js +2 -7
  343. package/out/zero-cache/src/auth/auth.js +138 -172
  344. package/out/zero-cache/src/auth/auth.js.map +1 -1
  345. package/out/zero-cache/src/auth/jwt.js +25 -33
  346. package/out/zero-cache/src/auth/jwt.js.map +1 -1
  347. package/out/zero-cache/src/auth/load-permissions.js +54 -62
  348. package/out/zero-cache/src/auth/load-permissions.js.map +1 -1
  349. package/out/zero-cache/src/auth/read-authorizer.js +70 -80
  350. package/out/zero-cache/src/auth/read-authorizer.js.map +1 -1
  351. package/out/zero-cache/src/auth/write-authorizer.js +284 -432
  352. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  353. package/out/zero-cache/src/config/network.js +31 -45
  354. package/out/zero-cache/src/config/network.js.map +1 -1
  355. package/out/zero-cache/src/config/normalize.js +81 -83
  356. package/out/zero-cache/src/config/normalize.js.map +1 -1
  357. package/out/zero-cache/src/config/server-context.js +32 -29
  358. package/out/zero-cache/src/config/server-context.js.map +1 -1
  359. package/out/zero-cache/src/config/zero-config.d.ts +4 -0
  360. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  361. package/out/zero-cache/src/config/zero-config.js +753 -816
  362. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  363. package/out/zero-cache/src/custom/fetch.js +183 -230
  364. package/out/zero-cache/src/custom/fetch.js.map +1 -1
  365. package/out/zero-cache/src/custom-queries/transform-query.js +93 -99
  366. package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -1
  367. package/out/zero-cache/src/db/create.js +27 -29
  368. package/out/zero-cache/src/db/create.js.map +1 -1
  369. package/out/zero-cache/src/db/delete-lite-db.js +11 -7
  370. package/out/zero-cache/src/db/delete-lite-db.js.map +1 -1
  371. package/out/zero-cache/src/db/lite-tables.d.ts +2 -1
  372. package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
  373. package/out/zero-cache/src/db/lite-tables.js +120 -156
  374. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  375. package/out/zero-cache/src/db/migration-lite.js +110 -178
  376. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  377. package/out/zero-cache/src/db/migration.js +82 -151
  378. package/out/zero-cache/src/db/migration.js.map +1 -1
  379. package/out/zero-cache/src/db/mode-enum.js +8 -9
  380. package/out/zero-cache/src/db/mode-enum.js.map +1 -1
  381. package/out/zero-cache/src/db/pg-copy.js +56 -54
  382. package/out/zero-cache/src/db/pg-copy.js.map +1 -1
  383. package/out/zero-cache/src/db/pg-to-lite.js +74 -110
  384. package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
  385. package/out/zero-cache/src/db/pg-type-parser.js +19 -36
  386. package/out/zero-cache/src/db/pg-type-parser.js.map +1 -1
  387. package/out/zero-cache/src/db/run-transaction.js +19 -20
  388. package/out/zero-cache/src/db/run-transaction.js.map +1 -1
  389. package/out/zero-cache/src/db/specs.d.ts +8 -2
  390. package/out/zero-cache/src/db/specs.d.ts.map +1 -1
  391. package/out/zero-cache/src/db/specs.js +42 -78
  392. package/out/zero-cache/src/db/specs.js.map +1 -1
  393. package/out/zero-cache/src/db/statements.js +52 -59
  394. package/out/zero-cache/src/db/statements.js.map +1 -1
  395. package/out/zero-cache/src/db/transaction-pool.js +376 -400
  396. package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
  397. package/out/zero-cache/src/db/warmup.js +13 -24
  398. package/out/zero-cache/src/db/warmup.js.map +1 -1
  399. package/out/zero-cache/src/observability/events.js +89 -99
  400. package/out/zero-cache/src/observability/events.js.map +1 -1
  401. package/out/zero-cache/src/observability/metrics.js +30 -54
  402. package/out/zero-cache/src/observability/metrics.js.map +1 -1
  403. package/out/zero-cache/src/scripts/decommission.js +42 -47
  404. package/out/zero-cache/src/scripts/decommission.js.map +1 -1
  405. package/out/zero-cache/src/scripts/deploy-permissions.js +106 -144
  406. package/out/zero-cache/src/scripts/deploy-permissions.js.map +1 -1
  407. package/out/zero-cache/src/scripts/permissions.js +86 -107
  408. package/out/zero-cache/src/scripts/permissions.js.map +1 -1
  409. package/out/zero-cache/src/server/anonymous-otel-start.js +306 -440
  410. package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
  411. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  412. package/out/zero-cache/src/server/change-streamer.js +57 -128
  413. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  414. package/out/zero-cache/src/server/inspector-delegate.js +89 -100
  415. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
  416. package/out/zero-cache/src/server/logging.js +18 -26
  417. package/out/zero-cache/src/server/logging.js.map +1 -1
  418. package/out/zero-cache/src/server/main.js +85 -142
  419. package/out/zero-cache/src/server/main.js.map +1 -1
  420. package/out/zero-cache/src/server/mutator.js +16 -13
  421. package/out/zero-cache/src/server/mutator.js.map +1 -1
  422. package/out/zero-cache/src/server/otel-diag-logger.js +42 -49
  423. package/out/zero-cache/src/server/otel-diag-logger.js.map +1 -1
  424. package/out/zero-cache/src/server/otel-log-sink.js +34 -44
  425. package/out/zero-cache/src/server/otel-log-sink.js.map +1 -1
  426. package/out/zero-cache/src/server/otel-start.js +43 -51
  427. package/out/zero-cache/src/server/otel-start.js.map +1 -1
  428. package/out/zero-cache/src/server/priority-op.js +27 -25
  429. package/out/zero-cache/src/server/priority-op.js.map +1 -1
  430. package/out/zero-cache/src/server/reaper.js +32 -43
  431. package/out/zero-cache/src/server/reaper.js.map +1 -1
  432. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  433. package/out/zero-cache/src/server/replicator.js +41 -57
  434. package/out/zero-cache/src/server/replicator.js.map +1 -1
  435. package/out/zero-cache/src/server/runner/main.js +7 -8
  436. package/out/zero-cache/src/server/runner/main.js.map +1 -1
  437. package/out/zero-cache/src/server/runner/run-worker.js +56 -52
  438. package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
  439. package/out/zero-cache/src/server/runner/runtime.js +26 -32
  440. package/out/zero-cache/src/server/runner/runtime.js.map +1 -1
  441. package/out/zero-cache/src/server/runner/zero-dispatcher.js +22 -27
  442. package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
  443. package/out/zero-cache/src/server/syncer.js +79 -148
  444. package/out/zero-cache/src/server/syncer.js.map +1 -1
  445. package/out/zero-cache/src/server/worker-dispatcher.js +84 -113
  446. package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -1
  447. package/out/zero-cache/src/server/worker-urls.d.ts +2 -1
  448. package/out/zero-cache/src/server/worker-urls.d.ts.map +1 -1
  449. package/out/zero-cache/src/server/worker-urls.js +14 -18
  450. package/out/zero-cache/src/server/worker-urls.js.map +1 -1
  451. package/out/zero-cache/src/server/write-worker.js +2 -0
  452. package/out/zero-cache/src/services/analyze.js +61 -129
  453. package/out/zero-cache/src/services/analyze.js.map +1 -1
  454. package/out/zero-cache/src/services/change-source/common/backfill-manager.js +420 -419
  455. package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
  456. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js +111 -114
  457. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -1
  458. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts +2 -0
  459. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
  460. package/out/zero-cache/src/services/change-source/common/replica-schema.js +100 -115
  461. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  462. package/out/zero-cache/src/services/change-source/custom/change-source.js +154 -216
  463. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  464. package/out/zero-cache/src/services/change-source/pg/backfill-metadata.js +11 -14
  465. package/out/zero-cache/src/services/change-source/pg/backfill-metadata.js.map +1 -1
  466. package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts.map +1 -1
  467. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +169 -209
  468. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
  469. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  470. package/out/zero-cache/src/services/change-source/pg/change-source.js +676 -835
  471. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  472. package/out/zero-cache/src/services/change-source/pg/decommission.js +19 -23
  473. package/out/zero-cache/src/services/change-source/pg/decommission.js.map +1 -1
  474. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +258 -411
  475. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  476. package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js +59 -65
  477. package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js.map +1 -1
  478. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js +218 -247
  479. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js.map +1 -1
  480. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +100 -142
  481. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  482. package/out/zero-cache/src/services/change-source/pg/lsn.js +17 -19
  483. package/out/zero-cache/src/services/change-source/pg/lsn.js.map +1 -1
  484. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +88 -98
  485. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
  486. package/out/zero-cache/src/services/change-source/pg/schema/init.js +96 -177
  487. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  488. package/out/zero-cache/src/services/change-source/pg/schema/published.js +69 -107
  489. package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
  490. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +151 -212
  491. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  492. package/out/zero-cache/src/services/change-source/pg/schema/validation.js +22 -53
  493. package/out/zero-cache/src/services/change-source/pg/schema/validation.js.map +1 -1
  494. package/out/zero-cache/src/services/change-source/protocol/current/control.js +24 -12
  495. package/out/zero-cache/src/services/change-source/protocol/current/control.js.map +1 -1
  496. package/out/zero-cache/src/services/change-source/protocol/current/data.js +180 -290
  497. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  498. package/out/zero-cache/src/services/change-source/protocol/current/downstream.js +21 -33
  499. package/out/zero-cache/src/services/change-source/protocol/current/downstream.js.map +1 -1
  500. package/out/zero-cache/src/services/change-source/protocol/current/json.js +7 -18
  501. package/out/zero-cache/src/services/change-source/protocol/current/json.js.map +1 -1
  502. package/out/zero-cache/src/services/change-source/protocol/current/path.js +24 -5
  503. package/out/zero-cache/src/services/change-source/protocol/current/path.js.map +1 -1
  504. package/out/zero-cache/src/services/change-source/protocol/current/status.js +25 -19
  505. package/out/zero-cache/src/services/change-source/protocol/current/status.js.map +1 -1
  506. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js +24 -16
  507. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -1
  508. package/out/zero-cache/src/services/change-source/protocol/current.js +51 -46
  509. package/out/zero-cache/src/services/change-source/protocol/current.js.map +1 -1
  510. package/out/zero-cache/src/services/change-source/protocol/mod.js +2 -0
  511. package/out/zero-cache/src/services/change-streamer/backup-monitor.js +165 -171
  512. package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
  513. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts +100 -0
  514. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts.map +1 -0
  515. package/out/zero-cache/src/services/change-streamer/broadcast.js +165 -0
  516. package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -0
  517. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +154 -221
  518. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  519. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +1 -1
  520. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  521. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +341 -293
  522. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  523. package/out/zero-cache/src/services/change-streamer/change-streamer.js +17 -24
  524. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  525. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts +17 -1
  526. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -1
  527. package/out/zero-cache/src/services/change-streamer/forwarder.js +85 -56
  528. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
  529. package/out/zero-cache/src/services/change-streamer/replica-monitor.js +49 -43
  530. package/out/zero-cache/src/services/change-streamer/replica-monitor.js.map +1 -1
  531. package/out/zero-cache/src/services/change-streamer/schema/init.js +61 -89
  532. package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
  533. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +20 -1
  534. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
  535. package/out/zero-cache/src/services/change-streamer/schema/tables.js +131 -109
  536. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  537. package/out/zero-cache/src/services/change-streamer/snapshot.js +26 -28
  538. package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -1
  539. package/out/zero-cache/src/services/change-streamer/storer.js +434 -513
  540. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  541. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +18 -0
  542. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
  543. package/out/zero-cache/src/services/change-streamer/subscriber.js +143 -100
  544. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  545. package/out/zero-cache/src/services/heapz.js +18 -20
  546. package/out/zero-cache/src/services/heapz.js.map +1 -1
  547. package/out/zero-cache/src/services/http-service.js +59 -57
  548. package/out/zero-cache/src/services/http-service.js.map +1 -1
  549. package/out/zero-cache/src/services/life-cycle.js +182 -214
  550. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  551. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js +102 -81
  552. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js.map +1 -1
  553. package/out/zero-cache/src/services/litestream/commands.js +144 -205
  554. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  555. package/out/zero-cache/src/services/mutagen/error.js +10 -14
  556. package/out/zero-cache/src/services/mutagen/error.js.map +1 -1
  557. package/out/zero-cache/src/services/mutagen/mutagen.js +166 -264
  558. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  559. package/out/zero-cache/src/services/mutagen/pusher.js +372 -487
  560. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  561. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
  562. package/out/zero-cache/src/services/replicator/change-processor.js +483 -595
  563. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  564. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +4 -2
  565. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  566. package/out/zero-cache/src/services/replicator/incremental-sync.js +118 -143
  567. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  568. package/out/zero-cache/src/services/replicator/notifier.js +52 -28
  569. package/out/zero-cache/src/services/replicator/notifier.js.map +1 -1
  570. package/out/zero-cache/src/services/replicator/replication-status.js +105 -128
  571. package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
  572. package/out/zero-cache/src/services/replicator/replicator.d.ts +2 -1
  573. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
  574. package/out/zero-cache/src/services/replicator/replicator.js +32 -34
  575. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  576. package/out/zero-cache/src/services/replicator/schema/change-log.js +101 -133
  577. package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -1
  578. package/out/zero-cache/src/services/replicator/schema/column-metadata.js +145 -174
  579. package/out/zero-cache/src/services/replicator/schema/column-metadata.js.map +1 -1
  580. package/out/zero-cache/src/services/replicator/schema/constants.js +11 -5
  581. package/out/zero-cache/src/services/replicator/schema/constants.js.map +1 -1
  582. package/out/zero-cache/src/services/replicator/schema/replication-state.js +56 -107
  583. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
  584. package/out/zero-cache/src/services/replicator/schema/table-metadata.d.ts +28 -7
  585. package/out/zero-cache/src/services/replicator/schema/table-metadata.d.ts.map +1 -1
  586. package/out/zero-cache/src/services/replicator/schema/table-metadata.js +96 -50
  587. package/out/zero-cache/src/services/replicator/schema/table-metadata.js.map +1 -1
  588. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts +69 -0
  589. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts.map +1 -0
  590. package/out/zero-cache/src/services/replicator/write-worker-client.js +96 -0
  591. package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -0
  592. package/out/zero-cache/src/services/replicator/write-worker.js +68 -0
  593. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -0
  594. package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
  595. package/out/zero-cache/src/services/run-ast.js +79 -118
  596. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  597. package/out/zero-cache/src/services/runner.js +39 -41
  598. package/out/zero-cache/src/services/runner.js.map +1 -1
  599. package/out/zero-cache/src/services/running-state.js +129 -134
  600. package/out/zero-cache/src/services/running-state.js.map +1 -1
  601. package/out/zero-cache/src/services/statz.js +139 -200
  602. package/out/zero-cache/src/services/statz.js.map +1 -1
  603. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js +46 -49
  604. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js.map +1 -1
  605. package/out/zero-cache/src/services/view-syncer/client-handler.js +257 -299
  606. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  607. package/out/zero-cache/src/services/view-syncer/client-schema.js +52 -82
  608. package/out/zero-cache/src/services/view-syncer/client-schema.js.map +1 -1
  609. package/out/zero-cache/src/services/view-syncer/cvr-purger.js +85 -107
  610. package/out/zero-cache/src/services/view-syncer/cvr-purger.js.map +1 -1
  611. package/out/zero-cache/src/services/view-syncer/cvr-store.js +604 -757
  612. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  613. package/out/zero-cache/src/services/view-syncer/cvr.js +631 -739
  614. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  615. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +60 -40
  616. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
  617. package/out/zero-cache/src/services/view-syncer/inspect-handler.js +95 -178
  618. package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
  619. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +3 -2
  620. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  621. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +574 -709
  622. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  623. package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts.map +1 -1
  624. package/out/zero-cache/src/services/view-syncer/row-record-cache.js +246 -257
  625. package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
  626. package/out/zero-cache/src/services/view-syncer/schema/cvr.js +59 -45
  627. package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
  628. package/out/zero-cache/src/services/view-syncer/schema/init.js +121 -189
  629. package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -1
  630. package/out/zero-cache/src/services/view-syncer/schema/types.js +138 -263
  631. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  632. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +3 -3
  633. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  634. package/out/zero-cache/src/services/view-syncer/snapshotter.js +322 -331
  635. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  636. package/out/zero-cache/src/services/view-syncer/tracer.js +7 -6
  637. package/out/zero-cache/src/services/view-syncer/tracer.js.map +1 -1
  638. package/out/zero-cache/src/services/view-syncer/ttl-clock.js +9 -11
  639. package/out/zero-cache/src/services/view-syncer/ttl-clock.js.map +1 -1
  640. package/out/zero-cache/src/services/view-syncer/view-syncer.js +1067 -1603
  641. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  642. package/out/zero-cache/src/types/error-with-level.js +19 -25
  643. package/out/zero-cache/src/types/error-with-level.js.map +1 -1
  644. package/out/zero-cache/src/types/http.js +17 -26
  645. package/out/zero-cache/src/types/http.js.map +1 -1
  646. package/out/zero-cache/src/types/lexi-version.js +28 -42
  647. package/out/zero-cache/src/types/lexi-version.js.map +1 -1
  648. package/out/zero-cache/src/types/lite.js +101 -121
  649. package/out/zero-cache/src/types/lite.js.map +1 -1
  650. package/out/zero-cache/src/types/names.js +6 -5
  651. package/out/zero-cache/src/types/names.js.map +1 -1
  652. package/out/zero-cache/src/types/pg-data-type.d.ts +1 -0
  653. package/out/zero-cache/src/types/pg-data-type.d.ts.map +1 -1
  654. package/out/zero-cache/src/types/pg-data-type.js +58 -73
  655. package/out/zero-cache/src/types/pg-data-type.js.map +1 -1
  656. package/out/zero-cache/src/types/pg-types.js +12 -19
  657. package/out/zero-cache/src/types/pg-types.js.map +1 -1
  658. package/out/zero-cache/src/types/pg.js +144 -218
  659. package/out/zero-cache/src/types/pg.js.map +1 -1
  660. package/out/zero-cache/src/types/processes.js +95 -90
  661. package/out/zero-cache/src/types/processes.js.map +1 -1
  662. package/out/zero-cache/src/types/profiler.js +32 -27
  663. package/out/zero-cache/src/types/profiler.js.map +1 -1
  664. package/out/zero-cache/src/types/row-key.js +42 -30
  665. package/out/zero-cache/src/types/row-key.js.map +1 -1
  666. package/out/zero-cache/src/types/shards.js +36 -45
  667. package/out/zero-cache/src/types/shards.js.map +1 -1
  668. package/out/zero-cache/src/types/sql.js +20 -9
  669. package/out/zero-cache/src/types/sql.js.map +1 -1
  670. package/out/zero-cache/src/types/state-version.js +17 -23
  671. package/out/zero-cache/src/types/state-version.js.map +1 -1
  672. package/out/zero-cache/src/types/streams.js +234 -270
  673. package/out/zero-cache/src/types/streams.js.map +1 -1
  674. package/out/zero-cache/src/types/strings.js +10 -13
  675. package/out/zero-cache/src/types/strings.js.map +1 -1
  676. package/out/zero-cache/src/types/subscription.d.ts +3 -1
  677. package/out/zero-cache/src/types/subscription.d.ts.map +1 -1
  678. package/out/zero-cache/src/types/subscription.js +266 -214
  679. package/out/zero-cache/src/types/subscription.js.map +1 -1
  680. package/out/zero-cache/src/types/url-params.js +30 -39
  681. package/out/zero-cache/src/types/url-params.js.map +1 -1
  682. package/out/zero-cache/src/types/websocket-handoff.js +62 -75
  683. package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
  684. package/out/zero-cache/src/types/ws.js +43 -53
  685. package/out/zero-cache/src/types/ws.js.map +1 -1
  686. package/out/zero-cache/src/workers/connect-params.js +42 -43
  687. package/out/zero-cache/src/workers/connect-params.js.map +1 -1
  688. package/out/zero-cache/src/workers/connection.js +213 -282
  689. package/out/zero-cache/src/workers/connection.js.map +1 -1
  690. package/out/zero-cache/src/workers/mutator.js +22 -21
  691. package/out/zero-cache/src/workers/mutator.js.map +1 -1
  692. package/out/zero-cache/src/workers/replicator.d.ts +7 -0
  693. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
  694. package/out/zero-cache/src/workers/replicator.js +92 -97
  695. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  696. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +121 -203
  697. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  698. package/out/zero-cache/src/workers/syncer.js +147 -201
  699. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  700. package/out/zero-client/src/client/active-clients-manager.js +178 -187
  701. package/out/zero-client/src/client/active-clients-manager.js.map +1 -1
  702. package/out/zero-client/src/client/bindings.js +11 -0
  703. package/out/zero-client/src/client/client-error-kind-enum.js +18 -29
  704. package/out/zero-client/src/client/client-error-kind-enum.js.map +1 -1
  705. package/out/zero-client/src/client/connection-manager.js +291 -346
  706. package/out/zero-client/src/client/connection-manager.js.map +1 -1
  707. package/out/zero-client/src/client/connection-status-enum.js +20 -15
  708. package/out/zero-client/src/client/connection-status-enum.js.map +1 -1
  709. package/out/zero-client/src/client/connection.js +92 -110
  710. package/out/zero-client/src/client/connection.js.map +1 -1
  711. package/out/zero-client/src/client/context.js +84 -100
  712. package/out/zero-client/src/client/context.js.map +1 -1
  713. package/out/zero-client/src/client/crud-impl.js +56 -88
  714. package/out/zero-client/src/client/crud-impl.js.map +1 -1
  715. package/out/zero-client/src/client/crud.js +127 -129
  716. package/out/zero-client/src/client/crud.js.map +1 -1
  717. package/out/zero-client/src/client/custom.d.ts.map +1 -1
  718. package/out/zero-client/src/client/custom.js +50 -74
  719. package/out/zero-client/src/client/custom.js.map +1 -1
  720. package/out/zero-client/src/client/delete-clients-manager.js +72 -93
  721. package/out/zero-client/src/client/delete-clients-manager.js.map +1 -1
  722. package/out/zero-client/src/client/enable-analytics.js +8 -16
  723. package/out/zero-client/src/client/enable-analytics.js.map +1 -1
  724. package/out/zero-client/src/client/error.js +118 -133
  725. package/out/zero-client/src/client/error.js.map +1 -1
  726. package/out/zero-client/src/client/http-string.js +7 -7
  727. package/out/zero-client/src/client/http-string.js.map +1 -1
  728. package/out/zero-client/src/client/inspector/client-group.js +21 -26
  729. package/out/zero-client/src/client/inspector/client-group.js.map +1 -1
  730. package/out/zero-client/src/client/inspector/client.js +23 -26
  731. package/out/zero-client/src/client/inspector/client.js.map +1 -1
  732. package/out/zero-client/src/client/inspector/html-dialog-prompt.js +72 -73
  733. package/out/zero-client/src/client/inspector/html-dialog-prompt.js.map +1 -1
  734. package/out/zero-client/src/client/inspector/inspector.js +46 -51
  735. package/out/zero-client/src/client/inspector/inspector.js.map +1 -1
  736. package/out/zero-client/src/client/inspector/lazy-inspector.js +132 -192
  737. package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -1
  738. package/out/zero-client/src/client/inspector/query.js +72 -77
  739. package/out/zero-client/src/client/inspector/query.js.map +1 -1
  740. package/out/zero-client/src/client/ivm-branch.js +118 -145
  741. package/out/zero-client/src/client/ivm-branch.js.map +1 -1
  742. package/out/zero-client/src/client/keys.js +15 -31
  743. package/out/zero-client/src/client/keys.js.map +1 -1
  744. package/out/zero-client/src/client/log-options.js +43 -57
  745. package/out/zero-client/src/client/log-options.js.map +1 -1
  746. package/out/zero-client/src/client/make-mutate-property.js +46 -29
  747. package/out/zero-client/src/client/make-mutate-property.js.map +1 -1
  748. package/out/zero-client/src/client/make-replicache-mutators.js +80 -96
  749. package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
  750. package/out/zero-client/src/client/metric-name-enum.js +11 -15
  751. package/out/zero-client/src/client/metric-name-enum.js.map +1 -1
  752. package/out/zero-client/src/client/metrics.js +210 -237
  753. package/out/zero-client/src/client/metrics.js.map +1 -1
  754. package/out/zero-client/src/client/mutation-tracker.js +264 -354
  755. package/out/zero-client/src/client/mutation-tracker.js.map +1 -1
  756. package/out/zero-client/src/client/mutator-proxy.js +122 -151
  757. package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
  758. package/out/zero-client/src/client/options.js +7 -10
  759. package/out/zero-client/src/client/options.js.map +1 -1
  760. package/out/zero-client/src/client/query-manager.js +305 -373
  761. package/out/zero-client/src/client/query-manager.js.map +1 -1
  762. package/out/zero-client/src/client/reload-error-handler.js +80 -101
  763. package/out/zero-client/src/client/reload-error-handler.js.map +1 -1
  764. package/out/zero-client/src/client/server-option.js +30 -59
  765. package/out/zero-client/src/client/server-option.js.map +1 -1
  766. package/out/zero-client/src/client/update-needed-reason-type-enum.js +27 -9
  767. package/out/zero-client/src/client/update-needed-reason-type-enum.js.map +1 -1
  768. package/out/zero-client/src/client/version.js +9 -5
  769. package/out/zero-client/src/client/version.js.map +1 -1
  770. package/out/zero-client/src/client/zero-poke-handler.d.ts +1 -1
  771. package/out/zero-client/src/client/zero-poke-handler.d.ts.map +1 -1
  772. package/out/zero-client/src/client/zero-poke-handler.js +205 -293
  773. package/out/zero-client/src/client/zero-poke-handler.js.map +1 -1
  774. package/out/zero-client/src/client/zero-rep.js +61 -68
  775. package/out/zero-client/src/client/zero-rep.js.map +1 -1
  776. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  777. package/out/zero-client/src/client/zero.js +1367 -1834
  778. package/out/zero-client/src/client/zero.js.map +1 -1
  779. package/out/zero-client/src/mod.js +21 -0
  780. package/out/zero-client/src/util/nanoid.js +13 -18
  781. package/out/zero-client/src/util/nanoid.js.map +1 -1
  782. package/out/zero-client/src/util/socket.js +6 -5
  783. package/out/zero-client/src/util/socket.js.map +1 -1
  784. package/out/zero-pg/src/mod.js +10 -0
  785. package/out/zero-protocol/src/analyze-query-result.js +108 -148
  786. package/out/zero-protocol/src/analyze-query-result.js.map +1 -1
  787. package/out/zero-protocol/src/application-error.js +36 -34
  788. package/out/zero-protocol/src/application-error.js.map +1 -1
  789. package/out/zero-protocol/src/ast.js +236 -309
  790. package/out/zero-protocol/src/ast.js.map +1 -1
  791. package/out/zero-protocol/src/change-desired-queries.js +8 -13
  792. package/out/zero-protocol/src/change-desired-queries.js.map +1 -1
  793. package/out/zero-protocol/src/client-schema.js +21 -42
  794. package/out/zero-protocol/src/client-schema.js.map +1 -1
  795. package/out/zero-protocol/src/close-connection.js +20 -12
  796. package/out/zero-protocol/src/close-connection.js.map +1 -1
  797. package/out/zero-protocol/src/connect.js +37 -52
  798. package/out/zero-protocol/src/connect.js.map +1 -1
  799. package/out/zero-protocol/src/custom-queries.js +34 -65
  800. package/out/zero-protocol/src/custom-queries.js.map +1 -1
  801. package/out/zero-protocol/src/data.js +6 -9
  802. package/out/zero-protocol/src/data.js.map +1 -1
  803. package/out/zero-protocol/src/delete-clients.js +11 -17
  804. package/out/zero-protocol/src/delete-clients.js.map +1 -1
  805. package/out/zero-protocol/src/down.js +11 -23
  806. package/out/zero-protocol/src/down.js.map +1 -1
  807. package/out/zero-protocol/src/error-kind-enum.js +24 -41
  808. package/out/zero-protocol/src/error-kind-enum.js.map +1 -1
  809. package/out/zero-protocol/src/error-origin-enum.js +8 -9
  810. package/out/zero-protocol/src/error-origin-enum.js.map +1 -1
  811. package/out/zero-protocol/src/error-reason-enum.js +12 -17
  812. package/out/zero-protocol/src/error-reason-enum.js.map +1 -1
  813. package/out/zero-protocol/src/error.js +76 -152
  814. package/out/zero-protocol/src/error.js.map +1 -1
  815. package/out/zero-protocol/src/inspect-down.js +51 -74
  816. package/out/zero-protocol/src/inspect-down.js.map +1 -1
  817. package/out/zero-protocol/src/inspect-up.js +28 -46
  818. package/out/zero-protocol/src/inspect-up.js.map +1 -1
  819. package/out/zero-protocol/src/mutation-id.js +9 -9
  820. package/out/zero-protocol/src/mutation-id.js.map +1 -1
  821. package/out/zero-protocol/src/mutation-type-enum.js +7 -7
  822. package/out/zero-protocol/src/mutation-type-enum.js.map +1 -1
  823. package/out/zero-protocol/src/mutations-patch.js +21 -16
  824. package/out/zero-protocol/src/mutations-patch.js.map +1 -1
  825. package/out/zero-protocol/src/ping.js +8 -9
  826. package/out/zero-protocol/src/ping.js.map +1 -1
  827. package/out/zero-protocol/src/poke.js +53 -59
  828. package/out/zero-protocol/src/poke.js.map +1 -1
  829. package/out/zero-protocol/src/pong.js +8 -9
  830. package/out/zero-protocol/src/pong.js.map +1 -1
  831. package/out/zero-protocol/src/primary-key.js +9 -19
  832. package/out/zero-protocol/src/primary-key.js.map +1 -1
  833. package/out/zero-protocol/src/protocol-version.js +5 -11
  834. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  835. package/out/zero-protocol/src/pull.js +16 -28
  836. package/out/zero-protocol/src/pull.js.map +1 -1
  837. package/out/zero-protocol/src/push.js +162 -209
  838. package/out/zero-protocol/src/push.js.map +1 -1
  839. package/out/zero-protocol/src/queries-patch.js +22 -30
  840. package/out/zero-protocol/src/queries-patch.js.map +1 -1
  841. package/out/zero-protocol/src/query-hash.js +14 -17
  842. package/out/zero-protocol/src/query-hash.js.map +1 -1
  843. package/out/zero-protocol/src/row-patch.js +23 -30
  844. package/out/zero-protocol/src/row-patch.js.map +1 -1
  845. package/out/zero-protocol/src/up.js +11 -22
  846. package/out/zero-protocol/src/up.js.map +1 -1
  847. package/out/zero-protocol/src/update-auth.js +8 -13
  848. package/out/zero-protocol/src/update-auth.js.map +1 -1
  849. package/out/zero-protocol/src/version.js +8 -9
  850. package/out/zero-protocol/src/version.js.map +1 -1
  851. package/out/zero-react/src/bindings.js +12 -0
  852. package/out/zero-react/src/mod.js +5 -0
  853. package/out/zero-react/src/use-connection-state.js +14 -11
  854. package/out/zero-react/src/use-connection-state.js.map +1 -1
  855. package/out/zero-react/src/use-query.js +283 -281
  856. package/out/zero-react/src/use-query.js.map +1 -1
  857. package/out/zero-react/src/use-zero-online.js +17 -11
  858. package/out/zero-react/src/use-zero-online.js.map +1 -1
  859. package/out/zero-react/src/zero-provider.js +53 -69
  860. package/out/zero-react/src/zero-provider.js.map +1 -1
  861. package/out/zero-react/src/zero.js +22 -0
  862. package/out/zero-schema/src/builder/relationship-builder.js +25 -21
  863. package/out/zero-schema/src/builder/relationship-builder.js.map +1 -1
  864. package/out/zero-schema/src/builder/schema-builder.js +51 -79
  865. package/out/zero-schema/src/builder/schema-builder.js.map +1 -1
  866. package/out/zero-schema/src/builder/table-builder.js +99 -116
  867. package/out/zero-schema/src/builder/table-builder.js.map +1 -1
  868. package/out/zero-schema/src/compiled-permissions.js +21 -25
  869. package/out/zero-schema/src/compiled-permissions.js.map +1 -1
  870. package/out/zero-schema/src/name-mapper.js +31 -47
  871. package/out/zero-schema/src/name-mapper.js.map +1 -1
  872. package/out/zero-schema/src/permissions.js +94 -181
  873. package/out/zero-schema/src/permissions.js.map +1 -1
  874. package/out/zero-schema/src/schema-config.js +26 -32
  875. package/out/zero-schema/src/schema-config.js.map +1 -1
  876. package/out/zero-server/src/adapters/drizzle.d.ts.map +1 -1
  877. package/out/zero-server/src/adapters/drizzle.js +79 -76
  878. package/out/zero-server/src/adapters/drizzle.js.map +1 -1
  879. package/out/zero-server/src/adapters/pg.d.ts.map +1 -1
  880. package/out/zero-server/src/adapters/pg.js +79 -55
  881. package/out/zero-server/src/adapters/pg.js.map +1 -1
  882. package/out/zero-server/src/adapters/postgresjs.d.ts.map +1 -1
  883. package/out/zero-server/src/adapters/postgresjs.js +66 -40
  884. package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
  885. package/out/zero-server/src/adapters/prisma.d.ts.map +1 -1
  886. package/out/zero-server/src/adapters/prisma.js +75 -55
  887. package/out/zero-server/src/adapters/prisma.js.map +1 -1
  888. package/out/zero-server/src/custom.d.ts.map +1 -1
  889. package/out/zero-server/src/custom.js +188 -265
  890. package/out/zero-server/src/custom.js.map +1 -1
  891. package/out/zero-server/src/logging.js +6 -5
  892. package/out/zero-server/src/logging.js.map +1 -1
  893. package/out/zero-server/src/mod.js +8 -0
  894. package/out/zero-server/src/pg-query-executor.js +14 -17
  895. package/out/zero-server/src/pg-query-executor.js.map +1 -1
  896. package/out/zero-server/src/process-mutations.js +293 -365
  897. package/out/zero-server/src/process-mutations.js.map +1 -1
  898. package/out/zero-server/src/push-processor.js +33 -49
  899. package/out/zero-server/src/push-processor.js.map +1 -1
  900. package/out/zero-server/src/queries/process-queries.js +106 -96
  901. package/out/zero-server/src/queries/process-queries.js.map +1 -1
  902. package/out/zero-server/src/schema.js +98 -144
  903. package/out/zero-server/src/schema.js.map +1 -1
  904. package/out/zero-server/src/zql-database.d.ts.map +1 -1
  905. package/out/zero-server/src/zql-database.js +54 -69
  906. package/out/zero-server/src/zql-database.js.map +1 -1
  907. package/out/zero-solid/src/bindings.js +12 -0
  908. package/out/zero-solid/src/mod.js +5 -0
  909. package/out/zero-solid/src/solid-view.js +135 -227
  910. package/out/zero-solid/src/solid-view.js.map +1 -1
  911. package/out/zero-solid/src/use-connection-state.js +18 -14
  912. package/out/zero-solid/src/use-connection-state.js.map +1 -1
  913. package/out/zero-solid/src/use-query.js +55 -100
  914. package/out/zero-solid/src/use-query.js.map +1 -1
  915. package/out/zero-solid/src/use-zero-online.js +18 -12
  916. package/out/zero-solid/src/use-zero-online.js.map +1 -1
  917. package/out/zero-solid/src/use-zero.js +65 -77
  918. package/out/zero-solid/src/use-zero.js.map +1 -1
  919. package/out/zero-solid/src/zero.js +22 -0
  920. package/out/zero-types/src/format.js +8 -7
  921. package/out/zero-types/src/format.js.map +1 -1
  922. package/out/zero-types/src/name-mapper.js +34 -47
  923. package/out/zero-types/src/name-mapper.js.map +1 -1
  924. package/out/zql/src/builder/builder.d.ts.map +1 -1
  925. package/out/zql/src/builder/builder.js +315 -476
  926. package/out/zql/src/builder/builder.js.map +1 -1
  927. package/out/zql/src/builder/debug-delegate.js +69 -74
  928. package/out/zql/src/builder/debug-delegate.js.map +1 -1
  929. package/out/zql/src/builder/filter.js +116 -140
  930. package/out/zql/src/builder/filter.js.map +1 -1
  931. package/out/zql/src/builder/like.js +41 -46
  932. package/out/zql/src/builder/like.js.map +1 -1
  933. package/out/zql/src/error.js +10 -9
  934. package/out/zql/src/error.js.map +1 -1
  935. package/out/zql/src/ivm/array-view.js +89 -91
  936. package/out/zql/src/ivm/array-view.js.map +1 -1
  937. package/out/zql/src/ivm/constraint.js +65 -74
  938. package/out/zql/src/ivm/constraint.js.map +1 -1
  939. package/out/zql/src/ivm/data.js +61 -48
  940. package/out/zql/src/ivm/data.js.map +1 -1
  941. package/out/zql/src/ivm/exists.js +164 -213
  942. package/out/zql/src/ivm/exists.js.map +1 -1
  943. package/out/zql/src/ivm/fan-in.js +62 -59
  944. package/out/zql/src/ivm/fan-in.js.map +1 -1
  945. package/out/zql/src/ivm/fan-out.js +52 -61
  946. package/out/zql/src/ivm/fan-out.js.map +1 -1
  947. package/out/zql/src/ivm/filter-operators.js +91 -96
  948. package/out/zql/src/ivm/filter-operators.js.map +1 -1
  949. package/out/zql/src/ivm/filter-push.js +22 -26
  950. package/out/zql/src/ivm/filter-push.js.map +1 -1
  951. package/out/zql/src/ivm/filter.js +41 -35
  952. package/out/zql/src/ivm/filter.js.map +1 -1
  953. package/out/zql/src/ivm/flipped-join.js +282 -391
  954. package/out/zql/src/ivm/flipped-join.js.map +1 -1
  955. package/out/zql/src/ivm/join-utils.js +85 -115
  956. package/out/zql/src/ivm/join-utils.js.map +1 -1
  957. package/out/zql/src/ivm/join.js +162 -231
  958. package/out/zql/src/ivm/join.js.map +1 -1
  959. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +21 -25
  960. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
  961. package/out/zql/src/ivm/memory-source.js +364 -503
  962. package/out/zql/src/ivm/memory-source.js.map +1 -1
  963. package/out/zql/src/ivm/memory-storage.js +33 -34
  964. package/out/zql/src/ivm/memory-storage.js.map +1 -1
  965. package/out/zql/src/ivm/operator.js +13 -15
  966. package/out/zql/src/ivm/operator.js.map +1 -1
  967. package/out/zql/src/ivm/push-accumulated.js +267 -270
  968. package/out/zql/src/ivm/push-accumulated.js.map +1 -1
  969. package/out/zql/src/ivm/skip.js +91 -104
  970. package/out/zql/src/ivm/skip.js.map +1 -1
  971. package/out/zql/src/ivm/stream.js +10 -10
  972. package/out/zql/src/ivm/stream.js.map +1 -1
  973. package/out/zql/src/ivm/take.js +422 -569
  974. package/out/zql/src/ivm/take.js.map +1 -1
  975. package/out/zql/src/ivm/union-fan-in.js +157 -231
  976. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  977. package/out/zql/src/ivm/union-fan-out.js +38 -43
  978. package/out/zql/src/ivm/union-fan-out.js.map +1 -1
  979. package/out/zql/src/ivm/view-apply-change.js +166 -255
  980. package/out/zql/src/ivm/view-apply-change.js.map +1 -1
  981. package/out/zql/src/mutate/crud.js +35 -34
  982. package/out/zql/src/mutate/crud.js.map +1 -1
  983. package/out/zql/src/mutate/custom.d.ts.map +1 -1
  984. package/out/zql/src/mutate/custom.js +7 -11
  985. package/out/zql/src/mutate/custom.js.map +1 -1
  986. package/out/zql/src/mutate/mutator-registry.js +67 -71
  987. package/out/zql/src/mutate/mutator-registry.js.map +1 -1
  988. package/out/zql/src/mutate/mutator.js +26 -25
  989. package/out/zql/src/mutate/mutator.js.map +1 -1
  990. package/out/zql/src/planner/planner-builder.js +134 -239
  991. package/out/zql/src/planner/planner-builder.js.map +1 -1
  992. package/out/zql/src/planner/planner-connection.js +222 -212
  993. package/out/zql/src/planner/planner-connection.js.map +1 -1
  994. package/out/zql/src/planner/planner-constraint.js +15 -7
  995. package/out/zql/src/planner/planner-constraint.js.map +1 -1
  996. package/out/zql/src/planner/planner-debug.js +199 -224
  997. package/out/zql/src/planner/planner-debug.js.map +1 -1
  998. package/out/zql/src/planner/planner-fan-in.js +146 -162
  999. package/out/zql/src/planner/planner-fan-in.js.map +1 -1
  1000. package/out/zql/src/planner/planner-fan-out.js +62 -74
  1001. package/out/zql/src/planner/planner-fan-out.js.map +1 -1
  1002. package/out/zql/src/planner/planner-graph.js +302 -334
  1003. package/out/zql/src/planner/planner-graph.js.map +1 -1
  1004. package/out/zql/src/planner/planner-join.js +255 -240
  1005. package/out/zql/src/planner/planner-join.js.map +1 -1
  1006. package/out/zql/src/planner/planner-node.js +10 -6
  1007. package/out/zql/src/planner/planner-node.js.map +1 -1
  1008. package/out/zql/src/planner/planner-source.js +15 -22
  1009. package/out/zql/src/planner/planner-source.js.map +1 -1
  1010. package/out/zql/src/planner/planner-terminus.js +28 -28
  1011. package/out/zql/src/planner/planner-terminus.js.map +1 -1
  1012. package/out/zql/src/query/complete-ordering.js +37 -61
  1013. package/out/zql/src/query/complete-ordering.js.map +1 -1
  1014. package/out/zql/src/query/create-builder.js +14 -22
  1015. package/out/zql/src/query/create-builder.js.map +1 -1
  1016. package/out/zql/src/query/error.js +10 -12
  1017. package/out/zql/src/query/error.js.map +1 -1
  1018. package/out/zql/src/query/escape-like.js +6 -5
  1019. package/out/zql/src/query/escape-like.js.map +1 -1
  1020. package/out/zql/src/query/expression.js +138 -157
  1021. package/out/zql/src/query/expression.js.map +1 -1
  1022. package/out/zql/src/query/measure-push-operator.js +35 -38
  1023. package/out/zql/src/query/measure-push-operator.js.map +1 -1
  1024. package/out/zql/src/query/metrics-delegate.js +7 -7
  1025. package/out/zql/src/query/metrics-delegate.js.map +1 -1
  1026. package/out/zql/src/query/named.js +52 -51
  1027. package/out/zql/src/query/named.js.map +1 -1
  1028. package/out/zql/src/query/query-delegate-base.js +190 -238
  1029. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  1030. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  1031. package/out/zql/src/query/query-impl.js +271 -405
  1032. package/out/zql/src/query/query-impl.js.map +1 -1
  1033. package/out/zql/src/query/query-internals.js +16 -8
  1034. package/out/zql/src/query/query-internals.js.map +1 -1
  1035. package/out/zql/src/query/query-registry.js +83 -98
  1036. package/out/zql/src/query/query-registry.js.map +1 -1
  1037. package/out/zql/src/query/query.d.ts.map +1 -1
  1038. package/out/zql/src/query/query.js +2 -0
  1039. package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -1
  1040. package/out/zql/src/query/runnable-query-impl.js +30 -55
  1041. package/out/zql/src/query/runnable-query-impl.js.map +1 -1
  1042. package/out/zql/src/query/static-query.js +7 -14
  1043. package/out/zql/src/query/static-query.js.map +1 -1
  1044. package/out/zql/src/query/ttl.js +45 -67
  1045. package/out/zql/src/query/ttl.js.map +1 -1
  1046. package/out/zql/src/query/validate-input.js +23 -20
  1047. package/out/zql/src/query/validate-input.js.map +1 -1
  1048. package/out/zqlite/src/database-storage.js +99 -103
  1049. package/out/zqlite/src/database-storage.js.map +1 -1
  1050. package/out/zqlite/src/db.js +206 -249
  1051. package/out/zqlite/src/db.js.map +1 -1
  1052. package/out/zqlite/src/explain-queries.js +11 -13
  1053. package/out/zqlite/src/explain-queries.js.map +1 -1
  1054. package/out/zqlite/src/internal/sql-inline.js +54 -37
  1055. package/out/zqlite/src/internal/sql-inline.js.map +1 -1
  1056. package/out/zqlite/src/internal/sql.js +17 -15
  1057. package/out/zqlite/src/internal/sql.js.map +1 -1
  1058. package/out/zqlite/src/internal/statement-cache.js +117 -92
  1059. package/out/zqlite/src/internal/statement-cache.js.map +1 -1
  1060. package/out/zqlite/src/mod.js +5 -0
  1061. package/out/zqlite/src/query-builder.js +81 -172
  1062. package/out/zqlite/src/query-builder.js.map +1 -1
  1063. package/out/zqlite/src/query-delegate.js +45 -55
  1064. package/out/zqlite/src/query-delegate.js.map +1 -1
  1065. package/out/zqlite/src/resolve-scalar-subqueries.js +134 -124
  1066. package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
  1067. package/out/zqlite/src/sqlite-cost-model.js +92 -97
  1068. package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
  1069. package/out/zqlite/src/sqlite-stat-fanout.js +304 -286
  1070. package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
  1071. package/out/zqlite/src/table-source.js +281 -455
  1072. package/out/zqlite/src/table-source.js.map +1 -1
  1073. package/package.json +8 -7
  1074. package/out/replicache/src/db/index-operation-enum.js +0 -7
  1075. package/out/replicache/src/db/index-operation-enum.js.map +0 -1
  1076. package/out/replicache/src/db/meta-type-enum.js +0 -7
  1077. package/out/replicache/src/db/meta-type-enum.js.map +0 -1
  1078. package/out/replicache/src/format-version-enum.js +0 -11
  1079. package/out/replicache/src/format-version-enum.js.map +0 -1
  1080. package/out/replicache/src/http-status-unauthorized.js +0 -5
  1081. package/out/replicache/src/http-status-unauthorized.js.map +0 -1
  1082. package/out/replicache/src/invoke-kind-enum.js +0 -7
  1083. package/out/replicache/src/invoke-kind-enum.js.map +0 -1
  1084. package/out/replicache/src/sync/handle-pull-response-result-type-enum.js +0 -9
  1085. package/out/replicache/src/sync/handle-pull-response-result-type-enum.js.map +0 -1
  1086. package/out/zero/package.json.js +0 -9
  1087. package/out/zero/package.json.js.map +0 -1
  1088. package/out/zero/src/adapters/drizzle.js.map +0 -1
  1089. package/out/zero/src/adapters/pg.js.map +0 -1
  1090. package/out/zero/src/adapters/postgresjs.js.map +0 -1
  1091. package/out/zero/src/adapters/prisma.js.map +0 -1
  1092. package/out/zero/src/analyze-query.js.map +0 -1
  1093. package/out/zero/src/ast-to-zql.js.map +0 -1
  1094. package/out/zero/src/bindings.js.map +0 -1
  1095. package/out/zero/src/change-protocol/v0.js.map +0 -1
  1096. package/out/zero/src/cli.js.map +0 -1
  1097. package/out/zero/src/deploy-permissions.js.map +0 -1
  1098. package/out/zero/src/expo-sqlite.js.map +0 -1
  1099. package/out/zero/src/op-sqlite.js.map +0 -1
  1100. package/out/zero/src/pg.js.map +0 -1
  1101. package/out/zero/src/react.js.map +0 -1
  1102. package/out/zero/src/server.js.map +0 -1
  1103. package/out/zero/src/solid.js.map +0 -1
  1104. package/out/zero/src/sqlite.js.map +0 -1
  1105. package/out/zero/src/transform-query.js.map +0 -1
  1106. package/out/zero/src/zero.js.map +0 -1
  1107. package/out/zero/src/zqlite.js.map +0 -1
  1108. package/out/zero-cache/src/db/postgres-replica-identity-enum.js +0 -11
  1109. package/out/zero-cache/src/db/postgres-replica-identity-enum.js.map +0 -1
  1110. package/out/zero-cache/src/db/postgres-type-class-enum.js +0 -17
  1111. package/out/zero-cache/src/db/postgres-type-class-enum.js.map +0 -1
  1112. package/out/zero-cache/src/services/change-streamer/error-type-enum.js +0 -9
  1113. package/out/zero-cache/src/services/change-streamer/error-type-enum.js.map +0 -1
@@ -1,890 +1,731 @@
1
- import { PG_OBJECT_IN_USE, PG_ADMIN_SHUTDOWN } from "@drdgvhbh/postgres-error-codes";
2
- import postgres from "postgres";
3
- import { AbortError } from "../../../../../shared/src/abort-error.js";
4
- import { stringify } from "../../../../../shared/src/bigint-json.js";
5
1
  import { deepEqual } from "../../../../../shared/src/json.js";
6
- import { must } from "../../../../../shared/src/must.js";
7
- import { mapValues } from "../../../../../shared/src/objects.js";
8
2
  import { promiseVoid } from "../../../../../shared/src/resolved-promises.js";
9
- import { symmetricDifferences, intersection, equals } from "../../../../../shared/src/set-utils.js";
3
+ import { AbortError } from "../../../../../shared/src/abort-error.js";
10
4
  import { sleep } from "../../../../../shared/src/sleep.js";
11
5
  import { parse } from "../../../../../shared/src/valita.js";
6
+ import { must } from "../../../../../shared/src/must.js";
7
+ import { mapValues } from "../../../../../shared/src/objects.js";
8
+ import { equals, intersection, symmetricDifferences } from "../../../../../shared/src/set-utils.js";
9
+ import { stringify } from "../../../../../shared/src/bigint-json.js";
12
10
  import { Database } from "../../../../../zqlite/src/db.js";
13
- import { mapPostgresToLiteColumn, UnsupportedColumnDefaultError } from "../../../db/pg-to-lite.js";
14
- import { runTx } from "../../../db/run-transaction.js";
11
+ import { upstreamSchema } from "../../../types/shards.js";
15
12
  import { StatementRunner } from "../../../db/statements.js";
16
13
  import { pgClient } from "../../../types/pg.js";
17
- import { upstreamSchema } from "../../../types/shards.js";
18
14
  import { majorVersionFromString, majorVersionToString } from "../../../types/state-version.js";
19
- import { AutoResetSignal } from "../../change-streamer/schema/tables.js";
15
+ import { fromBigInt, toStateVersionString } from "./lsn.js";
16
+ import { UnsupportedColumnDefaultError, mapPostgresToLiteColumn } from "../../../db/pg-to-lite.js";
20
17
  import { getSubscriptionStateAndContext } from "../../replicator/schema/replication-state.js";
18
+ import { runTx } from "../../../db/run-transaction.js";
19
+ import { getPublicationInfo } from "./schema/published.js";
20
+ import { replicationEventSchema } from "./schema/ddl.js";
21
+ import { validate } from "./schema/validation.js";
22
+ import { dropShard, getInternalShardConfig, getReplicaAtVersion, internalPublicationPrefix, legacyReplicationSlot, replicaIdentitiesForTablesWithoutPrimaryKeys, replicationSlotExpression } from "./schema/shard.js";
23
+ import { AutoResetSignal } from "../../change-streamer/schema/tables.js";
24
+ import { initReplica } from "../common/replica-schema.js";
21
25
  import { BackfillManager } from "../common/backfill-manager.js";
22
26
  import { ChangeStreamMultiplexer } from "../common/change-stream-multiplexer.js";
23
- import { initReplica } from "../common/replica-schema.js";
24
- import { streamBackfill } from "./backfill-stream.js";
27
+ import { updateShardSchema } from "./schema/init.js";
25
28
  import { initialSync } from "./initial-sync.js";
29
+ import { streamBackfill } from "./backfill-stream.js";
26
30
  import { subscribe } from "./logical-replication/stream.js";
27
- import { fromBigInt, toStateVersionString } from "./lsn.js";
28
- import { replicationEventSchema } from "./schema/ddl.js";
29
- import { updateShardSchema } from "./schema/init.js";
30
- import { getPublicationInfo } from "./schema/published.js";
31
- import { getReplicaAtVersion, internalPublicationPrefix, dropShard, getInternalShardConfig, replicationSlotExpression, legacyReplicationSlot, replicaIdentitiesForTablesWithoutPrimaryKeys } from "./schema/shard.js";
32
- import { validate } from "./schema/validation.js";
31
+ import postgres from "postgres";
32
+ import { PG_ADMIN_SHUTDOWN, PG_OBJECT_IN_USE } from "@drdgvhbh/postgres-error-codes";
33
+ //#region ../zero-cache/src/services/change-source/pg/change-source.ts
34
+ /**
35
+ * Initializes a Postgres change source, including the initial sync of the
36
+ * replica, before streaming changes from the corresponding logical replication
37
+ * stream.
38
+ */
33
39
  async function initializePostgresChangeSource(lc, upstreamURI, shard, replicaDbFile, syncOptions, context) {
34
- await initReplica(
35
- lc,
36
- `replica-${shard.appID}-${shard.shardNum}`,
37
- replicaDbFile,
38
- (log, tx) => initialSync(log, shard, tx, upstreamURI, syncOptions, context)
39
- );
40
- const replica = new Database(lc, replicaDbFile);
41
- const subscriptionState = getSubscriptionStateAndContext(
42
- new StatementRunner(replica)
43
- );
44
- replica.close();
45
- const db = pgClient(lc, upstreamURI);
46
- try {
47
- const upstreamReplica = await checkAndUpdateUpstream(
48
- lc,
49
- db,
50
- shard,
51
- subscriptionState
52
- );
53
- const changeSource = new PostgresChangeSource(
54
- lc,
55
- upstreamURI,
56
- shard,
57
- upstreamReplica,
58
- context
59
- );
60
- return { subscriptionState, changeSource };
61
- } finally {
62
- await db.end();
63
- }
40
+ await initReplica(lc, `replica-${shard.appID}-${shard.shardNum}`, replicaDbFile, (log, tx) => initialSync(log, shard, tx, upstreamURI, syncOptions, context));
41
+ const replica = new Database(lc, replicaDbFile);
42
+ const subscriptionState = getSubscriptionStateAndContext(new StatementRunner(replica));
43
+ replica.close();
44
+ const db = pgClient(lc, upstreamURI);
45
+ try {
46
+ return {
47
+ subscriptionState,
48
+ changeSource: new PostgresChangeSource(lc, upstreamURI, shard, await checkAndUpdateUpstream(lc, db, shard, subscriptionState), context)
49
+ };
50
+ } finally {
51
+ await db.end();
52
+ }
64
53
  }
65
- async function checkAndUpdateUpstream(lc, sql, shard, {
66
- replicaVersion,
67
- publications: subscribed,
68
- initialSyncContext
69
- }) {
70
- await updateShardSchema(lc, sql, shard, replicaVersion);
71
- const upstreamReplica = await getReplicaAtVersion(
72
- lc,
73
- sql,
74
- shard,
75
- replicaVersion,
76
- initialSyncContext
77
- );
78
- if (!upstreamReplica) {
79
- throw new AutoResetSignal(
80
- `No replication slot for replica at version ${replicaVersion}`
81
- );
82
- }
83
- const requested = [...shard.publications].sort();
84
- const replicated = upstreamReplica.publications.filter((p) => !p.startsWith(internalPublicationPrefix(shard))).sort();
85
- if (!deepEqual(requested, replicated)) {
86
- lc.warn?.(`Dropping shard to change publications to: [${requested}]`);
87
- await sql.unsafe(dropShard(shard.appID, shard.shardNum));
88
- throw new AutoResetSignal(
89
- `Requested publications [${requested}] do not match configured publications: [${replicated}]`
90
- );
91
- }
92
- if (!deepEqual(upstreamReplica.publications, subscribed)) {
93
- throw new AutoResetSignal(
94
- `Upstream publications [${upstreamReplica.publications}] do not match subscribed publications [${subscribed}]`
95
- );
96
- }
97
- const exists = await sql`
54
+ async function checkAndUpdateUpstream(lc, sql, shard, { replicaVersion, publications: subscribed, initialSyncContext }) {
55
+ await updateShardSchema(lc, sql, shard, replicaVersion);
56
+ const upstreamReplica = await getReplicaAtVersion(lc, sql, shard, replicaVersion, initialSyncContext);
57
+ if (!upstreamReplica) throw new AutoResetSignal(`No replication slot for replica at version ${replicaVersion}`);
58
+ const requested = [...shard.publications].sort();
59
+ const replicated = upstreamReplica.publications.filter((p) => !p.startsWith(internalPublicationPrefix(shard))).sort();
60
+ if (!deepEqual(requested, replicated)) {
61
+ lc.warn?.(`Dropping shard to change publications to: [${requested}]`);
62
+ await sql.unsafe(dropShard(shard.appID, shard.shardNum));
63
+ throw new AutoResetSignal(`Requested publications [${requested}] do not match configured publications: [${replicated}]`);
64
+ }
65
+ if (!deepEqual(upstreamReplica.publications, subscribed)) throw new AutoResetSignal(`Upstream publications [${upstreamReplica.publications}] do not match subscribed publications [${subscribed}]`);
66
+ const exists = await sql`
98
67
  SELECT pubname FROM pg_publication WHERE pubname IN ${sql(subscribed)};
99
68
  `.values();
100
- if (exists.length !== subscribed.length) {
101
- throw new AutoResetSignal(
102
- `Upstream publications [${exists.flat()}] do not contain all subscribed publications [${subscribed}]`
103
- );
104
- }
105
- const { slot } = upstreamReplica;
106
- const result = await sql`
69
+ if (exists.length !== subscribed.length) throw new AutoResetSignal(`Upstream publications [${exists.flat()}] do not contain all subscribed publications [${subscribed}]`);
70
+ const { slot } = upstreamReplica;
71
+ const result = await sql`
107
72
  SELECT restart_lsn as "restartLSN", wal_status as "walStatus" FROM pg_replication_slots
108
73
  WHERE slot_name = ${slot}`;
109
- if (result.length === 0) {
110
- throw new AutoResetSignal(`replication slot ${slot} is missing`);
111
- }
112
- const [{ restartLSN, walStatus }] = result;
113
- if (restartLSN === null || walStatus === "lost") {
114
- throw new AutoResetSignal(
115
- `replication slot ${slot} has been invalidated for exceeding the max_slot_wal_keep_size`
116
- );
117
- }
118
- return upstreamReplica;
74
+ if (result.length === 0) throw new AutoResetSignal(`replication slot ${slot} is missing`);
75
+ const [{ restartLSN, walStatus }] = result;
76
+ if (restartLSN === null || walStatus === "lost") throw new AutoResetSignal(`replication slot ${slot} has been invalidated for exceeding the max_slot_wal_keep_size`);
77
+ return upstreamReplica;
119
78
  }
120
- const MAX_LOW_PRIORITY_DELAY_MS = 1e3;
121
- class PostgresChangeSource {
122
- #lc;
123
- #upstreamUri;
124
- #shard;
125
- #replica;
126
- #context;
127
- constructor(lc, upstreamUri, shard, replica, context) {
128
- this.#lc = lc.withContext("component", "change-source");
129
- this.#upstreamUri = upstreamUri;
130
- this.#shard = shard;
131
- this.#replica = replica;
132
- this.#context = context;
133
- }
134
- async startStream(clientWatermark, backfillRequests = []) {
135
- const db = pgClient(this.#lc, this.#upstreamUri);
136
- const { slot } = this.#replica;
137
- let cleanup = promiseVoid;
138
- try {
139
- ({ cleanup } = await this.#stopExistingReplicationSlotSubscribers(
140
- db,
141
- slot
142
- ));
143
- const config = await getInternalShardConfig(db, this.#shard);
144
- this.#lc.info?.(`starting replication stream@${slot}`);
145
- return await this.#startStream(
146
- db,
147
- slot,
148
- clientWatermark,
149
- config,
150
- backfillRequests
151
- );
152
- } finally {
153
- void cleanup.then(() => db.end());
154
- }
155
- }
156
- async #startStream(db, slot, clientWatermark, shardConfig, backfillRequests) {
157
- const clientStart = majorVersionFromString(clientWatermark) + 1n;
158
- const { messages, acks } = await subscribe(
159
- this.#lc,
160
- db,
161
- slot,
162
- [...shardConfig.publications],
163
- clientStart
164
- );
165
- const acker = new Acker(acks);
166
- const changes = new ChangeStreamMultiplexer(this.#lc, clientWatermark);
167
- const backfillManager = new BackfillManager(
168
- this.#lc,
169
- changes,
170
- (req) => streamBackfill(this.#lc, this.#upstreamUri, this.#replica, req)
171
- );
172
- changes.addProducers(messages, backfillManager).addListeners(backfillManager, acker);
173
- backfillManager.run(clientWatermark, backfillRequests);
174
- const changeMaker = new ChangeMaker(
175
- this.#lc,
176
- this.#shard,
177
- shardConfig,
178
- this.#replica.initialSchema,
179
- this.#upstreamUri
180
- );
181
- void (async () => {
182
- try {
183
- let reservation = null;
184
- let inTransaction = false;
185
- for await (const [lsn, msg] of messages) {
186
- if (msg.tag === "keepalive") {
187
- changes.pushStatus([
188
- "status",
189
- { ack: msg.shouldRespond },
190
- { watermark: majorVersionToString(lsn) }
191
- ]);
192
- if (!inTransaction && reservation?.lastWatermark) {
193
- changes.release(reservation.lastWatermark);
194
- reservation = null;
195
- }
196
- continue;
197
- }
198
- if (!reservation) {
199
- const res = changes.reserve("replication");
200
- typeof res === "string" || await res;
201
- reservation = {};
202
- }
203
- let lastChange;
204
- for (const change of await changeMaker.makeChanges(lsn, msg)) {
205
- await changes.push(change);
206
- lastChange = change;
207
- }
208
- switch (lastChange?.[0]) {
209
- case "begin":
210
- inTransaction = true;
211
- break;
212
- case "commit":
213
- inTransaction = false;
214
- reservation.lastWatermark = lastChange[2].watermark;
215
- if (messages.queued === 0 || changes.waiterDelay() > MAX_LOW_PRIORITY_DELAY_MS) {
216
- changes.release(reservation.lastWatermark);
217
- reservation = null;
218
- }
219
- break;
220
- }
221
- }
222
- } catch (e) {
223
- const err = translateError(e);
224
- if (err instanceof ShutdownSignal) {
225
- await this.#logCurrentReplicaInfo();
226
- }
227
- changes.fail(err);
228
- }
229
- })();
230
- this.#lc.info?.(
231
- `started replication stream@${slot} from ${clientWatermark} (replicaVersion: ${this.#replica.version})`
232
- );
233
- return {
234
- changes: changes.asSource(),
235
- acks: { push: (status) => acker.ack(status[2].watermark) }
236
- };
237
- }
238
- async #logCurrentReplicaInfo() {
239
- const db = pgClient(this.#lc, this.#upstreamUri);
240
- try {
241
- const replica = await getReplicaAtVersion(
242
- this.#lc,
243
- db,
244
- this.#shard,
245
- this.#replica.version
246
- );
247
- if (replica) {
248
- this.#lc.info?.(
249
- `Shutdown signal from replica@${this.#replica.version}: ${stringify(replica.subscriberContext)}`
250
- );
251
- }
252
- } catch (e) {
253
- this.#lc.warn?.(`error logging replica info`, e);
254
- } finally {
255
- await db.end();
256
- }
257
- }
258
- /**
259
- * Stops replication slots associated with this shard, and returns
260
- * a `cleanup` task that drops any slot other than the specified
261
- * `slotToKeep`.
262
- *
263
- * Note that replication slots created after `slotToKeep` (as indicated by
264
- * the timestamp suffix) are preserved, as those are newly syncing replicas
265
- * that will soon take over the slot.
266
- */
267
- async #stopExistingReplicationSlotSubscribers(db, slotToKeep) {
268
- const slotExpression = replicationSlotExpression(this.#shard);
269
- const legacySlotName = legacyReplicationSlot(this.#shard);
270
- const result = await runTx(db, async (sql) => {
271
- const result2 = await sql`
79
+ var MAX_LOW_PRIORITY_DELAY_MS = 1e3;
80
+ /**
81
+ * Postgres implementation of a {@link ChangeSource} backed by a logical
82
+ * replication stream.
83
+ */
84
+ var PostgresChangeSource = class {
85
+ #lc;
86
+ #upstreamUri;
87
+ #shard;
88
+ #replica;
89
+ #context;
90
+ constructor(lc, upstreamUri, shard, replica, context) {
91
+ this.#lc = lc.withContext("component", "change-source");
92
+ this.#upstreamUri = upstreamUri;
93
+ this.#shard = shard;
94
+ this.#replica = replica;
95
+ this.#context = context;
96
+ }
97
+ async startStream(clientWatermark, backfillRequests = []) {
98
+ const db = pgClient(this.#lc, this.#upstreamUri);
99
+ const { slot } = this.#replica;
100
+ let cleanup = promiseVoid;
101
+ try {
102
+ ({cleanup} = await this.#stopExistingReplicationSlotSubscribers(db, slot));
103
+ const config = await getInternalShardConfig(db, this.#shard);
104
+ this.#lc.info?.(`starting replication stream@${slot}`);
105
+ return await this.#startStream(db, slot, clientWatermark, config, backfillRequests);
106
+ } finally {
107
+ cleanup.then(() => db.end());
108
+ }
109
+ }
110
+ async #startStream(db, slot, clientWatermark, shardConfig, backfillRequests) {
111
+ const clientStart = majorVersionFromString(clientWatermark) + 1n;
112
+ const { messages, acks } = await subscribe(this.#lc, db, slot, [...shardConfig.publications], clientStart);
113
+ const acker = new Acker(acks);
114
+ const changes = new ChangeStreamMultiplexer(this.#lc, clientWatermark);
115
+ const backfillManager = new BackfillManager(this.#lc, changes, (req) => streamBackfill(this.#lc, this.#upstreamUri, this.#replica, req));
116
+ changes.addProducers(messages, backfillManager).addListeners(backfillManager, acker);
117
+ backfillManager.run(clientWatermark, backfillRequests);
118
+ const changeMaker = new ChangeMaker(this.#lc, this.#shard, shardConfig, this.#replica.initialSchema, this.#upstreamUri);
119
+ (async () => {
120
+ try {
121
+ let reservation = null;
122
+ let inTransaction = false;
123
+ for await (const [lsn, msg] of messages) {
124
+ if (msg.tag === "keepalive") {
125
+ changes.pushStatus([
126
+ "status",
127
+ { ack: msg.shouldRespond },
128
+ { watermark: majorVersionToString(lsn) }
129
+ ]);
130
+ if (!inTransaction && reservation?.lastWatermark) {
131
+ changes.release(reservation.lastWatermark);
132
+ reservation = null;
133
+ }
134
+ continue;
135
+ }
136
+ if (!reservation) {
137
+ const res = changes.reserve("replication");
138
+ typeof res === "string" || await res;
139
+ reservation = {};
140
+ }
141
+ let lastChange;
142
+ for (const change of await changeMaker.makeChanges(lsn, msg)) {
143
+ await changes.push(change);
144
+ lastChange = change;
145
+ }
146
+ switch (lastChange?.[0]) {
147
+ case "begin":
148
+ inTransaction = true;
149
+ break;
150
+ case "commit":
151
+ inTransaction = false;
152
+ reservation.lastWatermark = lastChange[2].watermark;
153
+ if (messages.queued === 0 || changes.waiterDelay() > MAX_LOW_PRIORITY_DELAY_MS) {
154
+ changes.release(reservation.lastWatermark);
155
+ reservation = null;
156
+ }
157
+ break;
158
+ }
159
+ }
160
+ } catch (e) {
161
+ const err = translateError(e);
162
+ if (err instanceof ShutdownSignal) await this.#logCurrentReplicaInfo();
163
+ changes.fail(err);
164
+ }
165
+ })();
166
+ this.#lc.info?.(`started replication stream@${slot} from ${clientWatermark} (replicaVersion: ${this.#replica.version})`);
167
+ return {
168
+ changes: changes.asSource(),
169
+ acks: { push: (status) => acker.ack(status[2].watermark) }
170
+ };
171
+ }
172
+ async #logCurrentReplicaInfo() {
173
+ const db = pgClient(this.#lc, this.#upstreamUri);
174
+ try {
175
+ const replica = await getReplicaAtVersion(this.#lc, db, this.#shard, this.#replica.version);
176
+ if (replica) this.#lc.info?.(`Shutdown signal from replica@${this.#replica.version}: ${stringify(replica.subscriberContext)}`);
177
+ } catch (e) {
178
+ this.#lc.warn?.(`error logging replica info`, e);
179
+ } finally {
180
+ await db.end();
181
+ }
182
+ }
183
+ /**
184
+ * Stops replication slots associated with this shard, and returns
185
+ * a `cleanup` task that drops any slot other than the specified
186
+ * `slotToKeep`.
187
+ *
188
+ * Note that replication slots created after `slotToKeep` (as indicated by
189
+ * the timestamp suffix) are preserved, as those are newly syncing replicas
190
+ * that will soon take over the slot.
191
+ */
192
+ async #stopExistingReplicationSlotSubscribers(db, slotToKeep) {
193
+ const slotExpression = replicationSlotExpression(this.#shard);
194
+ const legacySlotName = legacyReplicationSlot(this.#shard);
195
+ const result = await runTx(db, async (sql) => {
196
+ const result = await sql`
272
197
  SELECT slot_name as slot, pg_terminate_backend(active_pid) as terminated, active_pid as pid
273
198
  FROM pg_replication_slots
274
199
  WHERE (slot_name LIKE ${slotExpression} OR slot_name = ${legacySlotName})
275
200
  AND slot_name <= ${slotToKeep}`;
276
- this.#lc.info?.(
277
- `terminated replication slots: ${JSON.stringify(result2)}`
278
- );
279
- const replicasTable = `${upstreamSchema(this.#shard)}.replicas`;
280
- const replicasBefore = await sql`
201
+ this.#lc.info?.(`terminated replication slots: ${JSON.stringify(result)}`);
202
+ const replicasTable = `${upstreamSchema(this.#shard)}.replicas`;
203
+ const replicasBefore = await sql`
281
204
  SELECT slot, version, "initialSyncContext", "subscriberContext"
282
205
  FROM ${sql(replicasTable)} ORDER BY slot`;
283
- if (result2.length === 0) {
284
- const shardSlots = await sql`
206
+ if (result.length === 0) {
207
+ const shardSlots = await sql`
285
208
  SELECT slot_name as slot, active, active_pid as pid
286
209
  FROM pg_replication_slots
287
210
  WHERE slot_name LIKE ${slotExpression} OR slot_name = ${legacySlotName}
288
211
  ORDER BY slot_name`;
289
- this.#lc.warn?.(
290
- `slot ${slotToKeep} not found while cleaning subscribers`,
291
- { slots: shardSlots, replicas: replicasBefore }
292
- );
293
- throw new AbortError(
294
- `replication slot ${slotToKeep} is missing. A different replication-manager should now be running on a new replication slot.`
295
- );
296
- }
297
- this.#lc.info?.(
298
- `replicas before cleanup (slotToKeep=${slotToKeep}): ${JSON.stringify(
299
- replicasBefore
300
- )}`
301
- );
302
- await sql`
212
+ this.#lc.warn?.(`slot ${slotToKeep} not found while cleaning subscribers`, {
213
+ slots: shardSlots,
214
+ replicas: replicasBefore
215
+ });
216
+ throw new AbortError(`replication slot ${slotToKeep} is missing. A different replication-manager should now be running on a new replication slot.`);
217
+ }
218
+ this.#lc.info?.(`replicas before cleanup (slotToKeep=${slotToKeep}): ${JSON.stringify(replicasBefore)}`);
219
+ await sql`
303
220
  DELETE FROM ${sql(replicasTable)} WHERE slot < ${slotToKeep}`;
304
- await sql`
221
+ await sql`
305
222
  UPDATE ${sql(replicasTable)}
306
223
  SET "subscriberContext" = ${this.#context}
307
224
  WHERE slot = ${slotToKeep}`;
308
- const replicasAfter = await sql`
225
+ const replicasAfter = await sql`
309
226
  SELECT slot, version FROM ${sql(replicasTable)} ORDER BY slot`;
310
- this.#lc.info?.(
311
- `replicas after cleanup (slotToKeep=${slotToKeep}): ${JSON.stringify(
312
- replicasAfter
313
- )}`
314
- );
315
- return result2;
316
- });
317
- const pids = result.filter(({ pid }) => pid !== null).map(({ pid }) => pid);
318
- if (pids.length) {
319
- this.#lc.info?.(`signaled subscriber ${pids} to shut down`);
320
- }
321
- const otherSlots = result.filter(({ slot }) => slot !== slotToKeep).map(({ slot }) => slot);
322
- return {
323
- cleanup: otherSlots.length ? this.#dropReplicationSlots(db, otherSlots) : promiseVoid
324
- };
325
- }
326
- async #dropReplicationSlots(sql, slots) {
327
- this.#lc.info?.(`dropping other replication slot(s) ${slots}`);
328
- for (let i = 0; i < 5; i++) {
329
- try {
330
- await sql`
227
+ this.#lc.info?.(`replicas after cleanup (slotToKeep=${slotToKeep}): ${JSON.stringify(replicasAfter)}`);
228
+ return result;
229
+ });
230
+ const pids = result.filter(({ pid }) => pid !== null).map(({ pid }) => pid);
231
+ if (pids.length) this.#lc.info?.(`signaled subscriber ${pids} to shut down`);
232
+ const otherSlots = result.filter(({ slot }) => slot !== slotToKeep).map(({ slot }) => slot);
233
+ return { cleanup: otherSlots.length ? this.#dropReplicationSlots(db, otherSlots) : promiseVoid };
234
+ }
235
+ async #dropReplicationSlots(sql, slots) {
236
+ this.#lc.info?.(`dropping other replication slot(s) ${slots}`);
237
+ for (let i = 0; i < 5; i++) try {
238
+ await sql`
331
239
  SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots
332
240
  WHERE slot_name IN ${sql(slots)}
333
241
  `;
334
- this.#lc.info?.(`successfully dropped ${slots}`);
335
- return;
336
- } catch (e) {
337
- if (e instanceof postgres.PostgresError && e.code === PG_OBJECT_IN_USE) {
338
- this.#lc.debug?.(`attempt ${i + 1}: ${String(e)}`, e);
339
- } else {
340
- this.#lc.warn?.(`error dropping ${slots}`, e);
341
- }
342
- await sleep(1e3);
343
- }
344
- }
345
- this.#lc.warn?.(`maximum attempts exceeded dropping ${slots}`);
346
- }
347
- }
348
- class Acker {
349
- #acks;
350
- #waitingForDownstreamAck = null;
351
- constructor(acks) {
352
- this.#acks = acks;
353
- }
354
- onChange(change) {
355
- switch (change[0]) {
356
- case "status":
357
- const { watermark } = change[2];
358
- if (change[1].ack) {
359
- this.#expectDownstreamAck(watermark);
360
- } else {
361
- this.#ackIfDownstreamIsCaughtUp(watermark);
362
- }
363
- break;
364
- case "begin":
365
- if (!change[1].skipAck) {
366
- this.#expectDownstreamAck(change[2].commitWatermark);
367
- }
368
- break;
369
- }
370
- }
371
- #expectDownstreamAck(watermark) {
372
- this.#waitingForDownstreamAck = watermark;
373
- }
374
- ack(watermark) {
375
- if (this.#waitingForDownstreamAck && this.#waitingForDownstreamAck <= watermark) {
376
- this.#waitingForDownstreamAck = null;
377
- }
378
- this.#sendAck(watermark);
379
- }
380
- #ackIfDownstreamIsCaughtUp(watermark) {
381
- if (this.#waitingForDownstreamAck === null) {
382
- this.#sendAck(watermark);
383
- }
384
- }
385
- #sendAck(watermark) {
386
- const lsn = majorVersionFromString(watermark);
387
- this.#acks.push(lsn);
388
- }
389
- }
390
- const SET_REPLICA_IDENTITY_DELAY_MS = 50;
391
- class ChangeMaker {
392
- #lc;
393
- #shardPrefix;
394
- #shardConfig;
395
- #initialSchema;
396
- #upstreamDB;
397
- #replicaIdentityTimer;
398
- #error;
399
- constructor(lc, { appID, shardNum }, shardConfig, initialSchema, upstreamURI) {
400
- this.#lc = lc;
401
- this.#shardPrefix = `${appID}/${shardNum}`;
402
- this.#shardConfig = shardConfig;
403
- this.#initialSchema = initialSchema;
404
- this.#upstreamDB = pgClient(lc, upstreamURI, {
405
- ["idle_timeout"]: 10,
406
- // only used occasionally
407
- connection: { ["application_name"]: "zero-schema-change-detector" }
408
- });
409
- }
410
- async makeChanges(lsn, msg) {
411
- if (this.#error) {
412
- this.#logError(this.#error);
413
- return [];
414
- }
415
- try {
416
- return await this.#makeChanges(msg);
417
- } catch (err) {
418
- this.#error = { lsn, msg, err, lastLogTime: 0 };
419
- this.#logError(this.#error);
420
- const message = `Unable to continue replication from LSN ${fromBigInt(lsn)}`;
421
- const errorDetails = { error: message };
422
- if (err instanceof UnsupportedSchemaChangeError) {
423
- errorDetails.reason = err.description;
424
- errorDetails.context = err.ddlUpdate.context;
425
- } else {
426
- errorDetails.reason = String(err);
427
- }
428
- return [
429
- ["rollback", { tag: "rollback" }],
430
- ["control", { tag: "reset-required", message, errorDetails }]
431
- ];
432
- }
433
- }
434
- #logError(error) {
435
- const { lsn, msg, err, lastLogTime } = error;
436
- const now = Date.now();
437
- if (now - lastLogTime > 6e4) {
438
- this.#lc.error?.(
439
- `Unable to continue replication from LSN ${fromBigInt(lsn)}: ${String(
440
- err
441
- )}`,
442
- err instanceof UnsupportedSchemaChangeError ? err.ddlUpdate.context : (
443
- // 'content' can be a large byte Buffer. Exclude it from logging output.
444
- { ...msg, content: void 0 }
445
- )
446
- );
447
- error.lastLogTime = now;
448
- }
449
- }
450
- // oxlint-disable-next-line require-await
451
- async #makeChanges(msg) {
452
- switch (msg.tag) {
453
- case "begin":
454
- return [
455
- [
456
- "begin",
457
- { ...msg, json: "s" },
458
- { commitWatermark: toStateVersionString(must(msg.commitLsn)) }
459
- ]
460
- ];
461
- case "delete": {
462
- if (!(msg.key ?? msg.old)) {
463
- throw new Error(
464
- `Invalid DELETE msg (missing key): ${stringify(msg)}`
465
- );
466
- }
467
- return [
468
- [
469
- "data",
470
- {
471
- ...msg,
472
- relation: makeRelation(msg.relation),
473
- // https://www.postgresql.org/docs/current/protocol-logicalrep-message-formats.html#PROTOCOL-LOGICALREP-MESSAGE-FORMATS-DELETE
474
- key: must(msg.old ?? msg.key)
475
- }
476
- ]
477
- ];
478
- }
479
- case "update": {
480
- return [
481
- [
482
- "data",
483
- {
484
- ...msg,
485
- relation: makeRelation(msg.relation),
486
- // https://www.postgresql.org/docs/current/protocol-logicalrep-message-formats.html#PROTOCOL-LOGICALREP-MESSAGE-FORMATS-UPDATE
487
- key: msg.old ?? msg.key
488
- }
489
- ]
490
- ];
491
- }
492
- case "insert":
493
- return [["data", { ...msg, relation: makeRelation(msg.relation) }]];
494
- case "truncate":
495
- return [["data", { ...msg, relations: msg.relations.map(makeRelation) }]];
496
- case "message":
497
- if (msg.prefix !== this.#shardPrefix) {
498
- this.#lc.debug?.("ignoring message for different shard", msg.prefix);
499
- return [];
500
- }
501
- return this.#handleCustomMessage(msg);
502
- case "commit":
503
- return [
504
- [
505
- "commit",
506
- msg,
507
- { watermark: toStateVersionString(must(msg.commitLsn)) }
508
- ]
509
- ];
510
- case "relation":
511
- return this.#handleRelation(msg);
512
- case "type":
513
- return [];
514
- // Nothing need be done for custom types.
515
- case "origin":
516
- return [];
517
- default:
518
- throw new Error(`Unexpected message type ${stringify(msg)}`);
519
- }
520
- }
521
- #preSchema;
522
- #handleCustomMessage(msg) {
523
- const event = this.#parseReplicationEvent(msg.content);
524
- clearTimeout(this.#replicaIdentityTimer);
525
- if (event.type === "ddlStart") {
526
- this.#preSchema = event.schema;
527
- return [];
528
- }
529
- const changes = this.#makeSchemaChanges(
530
- must(this.#preSchema, `ddlUpdate received without a ddlStart`),
531
- event
532
- ).map((change) => ["data", change]);
533
- this.#lc.withContext("tag", event.event.tag).withContext("query", event.context.query).info?.(`${changes.length} schema change(s)`, { changes });
534
- const replicaIdentities = replicaIdentitiesForTablesWithoutPrimaryKeys(
535
- event.schema
536
- );
537
- if (replicaIdentities) {
538
- this.#replicaIdentityTimer = setTimeout(async () => {
539
- try {
540
- await replicaIdentities.apply(this.#lc, this.#upstreamDB);
541
- } catch (err) {
542
- this.#lc.warn?.(`error setting replica identities`, err);
543
- }
544
- }, SET_REPLICA_IDENTITY_DELAY_MS);
545
- }
546
- return changes;
547
- }
548
- /**
549
- * A note on operation order:
550
- *
551
- * Postgres will drop related indexes when columns are dropped,
552
- * but SQLite will error instead (https://sqlite.org/forum/forumpost/2e62dba69f?t=c&hist).
553
- * The current workaround is to drop indexes first.
554
- *
555
- * Also note that although it should not be possible to both rename and
556
- * add/drop tables/columns in a single statement, the operations are
557
- * ordered to handle that possibility, by always dropping old entities,
558
- * then modifying kept entities, and then adding new entities.
559
- *
560
- * Thus, the order of replicating DDL updates is:
561
- * - drop indexes
562
- * - drop tables
563
- * - alter tables
564
- * - drop columns
565
- * - alter columns
566
- * - add columns
567
- * - create tables
568
- * - create indexes
569
- *
570
- * In the future the replication logic should be improved to handle this
571
- * behavior in SQLite by dropping dependent indexes manually before dropping
572
- * columns. This, for example, would be needed to properly support changing
573
- * the type of a column that's indexed.
574
- */
575
- #makeSchemaChanges(preSchema, update) {
576
- try {
577
- const [prevTbl, prevIdx] = specsByID(preSchema);
578
- const [nextTbl, nextIdx] = specsByID(update.schema);
579
- const changes = [];
580
- for (const table of nextTbl.values()) {
581
- validate(this.#lc, table);
582
- }
583
- const [droppedIdx, createdIdx] = symmetricDifferences(prevIdx, nextIdx);
584
- for (const id of droppedIdx) {
585
- const { schema, name } = must(prevIdx.get(id));
586
- changes.push({ tag: "drop-index", id: { schema, name } });
587
- }
588
- const [droppedTbl, createdTbl] = symmetricDifferences(prevTbl, nextTbl);
589
- for (const id of droppedTbl) {
590
- const { schema, name } = must(prevTbl.get(id));
591
- changes.push({ tag: "drop-table", id: { schema, name } });
592
- }
593
- const tables = intersection(prevTbl, nextTbl);
594
- for (const id of tables) {
595
- changes.push(
596
- ...this.#getTableChanges(
597
- must(prevTbl.get(id)),
598
- must(nextTbl.get(id)),
599
- update.event.tag
600
- )
601
- );
602
- }
603
- for (const id of createdTbl) {
604
- const spec = must(nextTbl.get(id));
605
- const createTable = {
606
- tag: "create-table",
607
- spec,
608
- metadata: getMetadata(spec)
609
- };
610
- if (!update.event.tag.startsWith("CREATE")) {
611
- createTable.backfill = mapValues(spec.columns, ({ pos: attNum }) => ({
612
- attNum
613
- }));
614
- }
615
- changes.push(createTable);
616
- }
617
- for (const id of createdIdx) {
618
- const spec = must(nextIdx.get(id));
619
- changes.push({ tag: "create-index", spec });
620
- }
621
- return changes;
622
- } catch (e) {
623
- throw new UnsupportedSchemaChangeError(String(e), update, { cause: e });
624
- }
625
- }
626
- #getTableChanges(oldTable, newTable, ddlTag) {
627
- const changes = [];
628
- if (oldTable.schema !== newTable.schema || oldTable.name !== newTable.name) {
629
- changes.push({
630
- tag: "rename-table",
631
- old: { schema: oldTable.schema, name: oldTable.name },
632
- new: { schema: newTable.schema, name: newTable.name }
633
- });
634
- }
635
- const oldMetadata = getMetadata(oldTable);
636
- const newMetadata = getMetadata(newTable);
637
- if (!deepEqual(oldMetadata, newMetadata)) {
638
- changes.push({
639
- tag: "update-table-metadata",
640
- table: { schema: newTable.schema, name: newTable.name },
641
- old: oldMetadata,
642
- new: newMetadata
643
- });
644
- }
645
- const table = { schema: newTable.schema, name: newTable.name };
646
- const oldColumns = columnsByID(oldTable.columns);
647
- const newColumns = columnsByID(newTable.columns);
648
- const [dropped, added] = symmetricDifferences(oldColumns, newColumns);
649
- for (const id of dropped) {
650
- const { name: column } = must(oldColumns.get(id));
651
- changes.push({ tag: "drop-column", table, column });
652
- }
653
- const both = intersection(oldColumns, newColumns);
654
- for (const id of both) {
655
- const { name: oldName, ...oldSpec } = must(oldColumns.get(id));
656
- const { name: newName, ...newSpec } = must(newColumns.get(id));
657
- if (oldName !== newName || oldSpec.dataType !== newSpec.dataType || oldSpec.notNull !== newSpec.notNull) {
658
- changes.push({
659
- tag: "update-column",
660
- table,
661
- old: { name: oldName, spec: oldSpec },
662
- new: { name: newName, spec: newSpec }
663
- });
664
- }
665
- }
666
- const alwaysBackfill = ddlTag === "ALTER PUBLICATION";
667
- for (const id of added) {
668
- const { name, ...spec } = must(newColumns.get(id));
669
- const column = { name, spec };
670
- const addColumn = {
671
- tag: "add-column",
672
- table,
673
- column,
674
- tableMetadata: getMetadata(newTable)
675
- };
676
- if (alwaysBackfill) {
677
- addColumn.column.spec.dflt = null;
678
- addColumn.backfill = { attNum: spec.pos };
679
- } else {
680
- try {
681
- mapPostgresToLiteColumn(table.name, column);
682
- } catch (e) {
683
- if (!(e instanceof UnsupportedColumnDefaultError)) {
684
- throw e;
685
- }
686
- this.#lc.info?.(
687
- `Backfilling column ${table.name}.${name}: ${String(e)}`
688
- );
689
- addColumn.column.spec.dflt = null;
690
- addColumn.backfill = { attNum: spec.pos };
691
- }
692
- }
693
- changes.push(addColumn);
694
- }
695
- return changes;
696
- }
697
- #parseReplicationEvent(content) {
698
- const str = content instanceof Buffer ? content.toString("utf-8") : new TextDecoder().decode(content);
699
- const json = JSON.parse(str);
700
- return parse(json, replicationEventSchema, "passthrough");
701
- }
702
- /**
703
- * If `ddlDetection === true`, relation messages are irrelevant,
704
- * as schema changes are detected by event triggers that
705
- * emit custom messages.
706
- *
707
- * For degraded-mode replication (`ddlDetection === false`):
708
- * 1. query the current published schemas on upstream
709
- * 2. compare that with the InternalShardConfig.initialSchema
710
- * 3. compare that with the incoming MessageRelation
711
- * 4. On any discrepancy, throw an UnsupportedSchemaChangeError
712
- * to halt replication.
713
- *
714
- * Note that schemas queried in step [1] will be *post-transaction*
715
- * schemas, which are not necessarily suitable for actually processing
716
- * the statements in the transaction being replicated. In other words,
717
- * this mechanism cannot be used to reliably *replicate* schema changes.
718
- * However, they serve the purpose determining if schemas have changed.
719
- */
720
- async #handleRelation(rel) {
721
- const { publications, ddlDetection } = this.#shardConfig;
722
- if (ddlDetection) {
723
- return [];
724
- }
725
- const currentSchema = await getPublicationInfo(
726
- this.#upstreamDB,
727
- publications
728
- );
729
- const difference = getSchemaDifference(this.#initialSchema, currentSchema);
730
- if (difference !== null) {
731
- throw new MissingEventTriggerSupport(difference);
732
- }
733
- const orel = this.#initialSchema.tables.find(
734
- (t) => t.oid === rel.relationOid
735
- );
736
- if (!orel) {
737
- throw new MissingEventTriggerSupport(
738
- `relation not in initialSchema: ${stringify(rel)}`
739
- );
740
- }
741
- if (relationDifferent(orel, rel)) {
742
- throw new MissingEventTriggerSupport(
743
- `relation has changed within the transaction: ${stringify(orel)} vs ${stringify(rel)}`
744
- );
745
- }
746
- return [];
747
- }
748
- }
242
+ this.#lc.info?.(`successfully dropped ${slots}`);
243
+ return;
244
+ } catch (e) {
245
+ if (e instanceof postgres.PostgresError && e.code === PG_OBJECT_IN_USE) this.#lc.debug?.(`attempt ${i + 1}: ${String(e)}`, e);
246
+ else this.#lc.warn?.(`error dropping ${slots}`, e);
247
+ await sleep(1e3);
248
+ }
249
+ this.#lc.warn?.(`maximum attempts exceeded dropping ${slots}`);
250
+ }
251
+ };
252
+ var Acker = class {
253
+ #acks;
254
+ #waitingForDownstreamAck = null;
255
+ constructor(acks) {
256
+ this.#acks = acks;
257
+ }
258
+ onChange(change) {
259
+ switch (change[0]) {
260
+ case "status":
261
+ const { watermark } = change[2];
262
+ if (change[1].ack) this.#expectDownstreamAck(watermark);
263
+ else this.#ackIfDownstreamIsCaughtUp(watermark);
264
+ break;
265
+ case "begin":
266
+ if (!change[1].skipAck) this.#expectDownstreamAck(change[2].commitWatermark);
267
+ break;
268
+ }
269
+ }
270
+ #expectDownstreamAck(watermark) {
271
+ this.#waitingForDownstreamAck = watermark;
272
+ }
273
+ ack(watermark) {
274
+ if (this.#waitingForDownstreamAck && this.#waitingForDownstreamAck <= watermark) this.#waitingForDownstreamAck = null;
275
+ this.#sendAck(watermark);
276
+ }
277
+ #ackIfDownstreamIsCaughtUp(watermark) {
278
+ if (this.#waitingForDownstreamAck === null) this.#sendAck(watermark);
279
+ }
280
+ #sendAck(watermark) {
281
+ const lsn = majorVersionFromString(watermark);
282
+ this.#acks.push(lsn);
283
+ }
284
+ };
285
+ var SET_REPLICA_IDENTITY_DELAY_MS = 50;
286
+ var ChangeMaker = class {
287
+ #lc;
288
+ #shardPrefix;
289
+ #shardConfig;
290
+ #initialSchema;
291
+ #upstreamDB;
292
+ #replicaIdentityTimer;
293
+ #error;
294
+ constructor(lc, { appID, shardNum }, shardConfig, initialSchema, upstreamURI) {
295
+ this.#lc = lc;
296
+ this.#shardPrefix = `${appID}/${shardNum}`;
297
+ this.#shardConfig = shardConfig;
298
+ this.#initialSchema = initialSchema;
299
+ this.#upstreamDB = pgClient(lc, upstreamURI, {
300
+ ["idle_timeout"]: 10,
301
+ connection: { ["application_name"]: "zero-schema-change-detector" }
302
+ });
303
+ }
304
+ async makeChanges(lsn, msg) {
305
+ if (this.#error) {
306
+ this.#logError(this.#error);
307
+ return [];
308
+ }
309
+ try {
310
+ return await this.#makeChanges(msg);
311
+ } catch (err) {
312
+ this.#error = {
313
+ lsn,
314
+ msg,
315
+ err,
316
+ lastLogTime: 0
317
+ };
318
+ this.#logError(this.#error);
319
+ const message = `Unable to continue replication from LSN ${fromBigInt(lsn)}`;
320
+ const errorDetails = { error: message };
321
+ if (err instanceof UnsupportedSchemaChangeError) {
322
+ errorDetails.reason = err.description;
323
+ errorDetails.context = err.ddlUpdate.context;
324
+ } else errorDetails.reason = String(err);
325
+ return [["rollback", { tag: "rollback" }], ["control", {
326
+ tag: "reset-required",
327
+ message,
328
+ errorDetails
329
+ }]];
330
+ }
331
+ }
332
+ #logError(error) {
333
+ const { lsn, msg, err, lastLogTime } = error;
334
+ const now = Date.now();
335
+ if (now - lastLogTime > 6e4) {
336
+ this.#lc.error?.(`Unable to continue replication from LSN ${fromBigInt(lsn)}: ${String(err)}`, err instanceof UnsupportedSchemaChangeError ? err.ddlUpdate.context : {
337
+ ...msg,
338
+ content: void 0
339
+ });
340
+ error.lastLogTime = now;
341
+ }
342
+ }
343
+ async #makeChanges(msg) {
344
+ switch (msg.tag) {
345
+ case "begin": return [[
346
+ "begin",
347
+ {
348
+ ...msg,
349
+ json: "s"
350
+ },
351
+ { commitWatermark: toStateVersionString(must(msg.commitLsn)) }
352
+ ]];
353
+ case "delete":
354
+ if (!(msg.key ?? msg.old)) throw new Error(`Invalid DELETE msg (missing key): ${stringify(msg)}`);
355
+ return [["data", {
356
+ ...msg,
357
+ relation: makeRelation(msg.relation),
358
+ key: must(msg.old ?? msg.key)
359
+ }]];
360
+ case "update": return [["data", {
361
+ ...msg,
362
+ relation: makeRelation(msg.relation),
363
+ key: msg.old ?? msg.key
364
+ }]];
365
+ case "insert": return [["data", {
366
+ ...msg,
367
+ relation: makeRelation(msg.relation)
368
+ }]];
369
+ case "truncate": return [["data", {
370
+ ...msg,
371
+ relations: msg.relations.map(makeRelation)
372
+ }]];
373
+ case "message":
374
+ if (msg.prefix !== this.#shardPrefix) {
375
+ this.#lc.debug?.("ignoring message for different shard", msg.prefix);
376
+ return [];
377
+ }
378
+ return this.#handleCustomMessage(msg);
379
+ case "commit": return [[
380
+ "commit",
381
+ msg,
382
+ { watermark: toStateVersionString(must(msg.commitLsn)) }
383
+ ]];
384
+ case "relation": return this.#handleRelation(msg);
385
+ case "type": return [];
386
+ case "origin": return [];
387
+ default: throw new Error(`Unexpected message type ${stringify(msg)}`);
388
+ }
389
+ }
390
+ #preSchema;
391
+ #handleCustomMessage(msg) {
392
+ const event = this.#parseReplicationEvent(msg.content);
393
+ clearTimeout(this.#replicaIdentityTimer);
394
+ if (event.type === "ddlStart") {
395
+ this.#preSchema = event.schema;
396
+ return [];
397
+ }
398
+ const changes = this.#makeSchemaChanges(must(this.#preSchema, `ddlUpdate received without a ddlStart`), event).map((change) => ["data", change]);
399
+ this.#lc.withContext("tag", event.event.tag).withContext("query", event.context.query).info?.(`${changes.length} schema change(s)`, { changes });
400
+ const replicaIdentities = replicaIdentitiesForTablesWithoutPrimaryKeys(event.schema);
401
+ if (replicaIdentities) this.#replicaIdentityTimer = setTimeout(async () => {
402
+ try {
403
+ await replicaIdentities.apply(this.#lc, this.#upstreamDB);
404
+ } catch (err) {
405
+ this.#lc.warn?.(`error setting replica identities`, err);
406
+ }
407
+ }, SET_REPLICA_IDENTITY_DELAY_MS);
408
+ return changes;
409
+ }
410
+ /**
411
+ * A note on operation order:
412
+ *
413
+ * Postgres will drop related indexes when columns are dropped,
414
+ * but SQLite will error instead (https://sqlite.org/forum/forumpost/2e62dba69f?t=c&hist).
415
+ * The current workaround is to drop indexes first.
416
+ *
417
+ * Also note that although it should not be possible to both rename and
418
+ * add/drop tables/columns in a single statement, the operations are
419
+ * ordered to handle that possibility, by always dropping old entities,
420
+ * then modifying kept entities, and then adding new entities.
421
+ *
422
+ * Thus, the order of replicating DDL updates is:
423
+ * - drop indexes
424
+ * - drop tables
425
+ * - alter tables
426
+ * - drop columns
427
+ * - alter columns
428
+ * - add columns
429
+ * - create tables
430
+ * - create indexes
431
+ *
432
+ * In the future the replication logic should be improved to handle this
433
+ * behavior in SQLite by dropping dependent indexes manually before dropping
434
+ * columns. This, for example, would be needed to properly support changing
435
+ * the type of a column that's indexed.
436
+ */
437
+ #makeSchemaChanges(preSchema, update) {
438
+ try {
439
+ const [prevTbl, prevIdx] = specsByID(preSchema);
440
+ const [nextTbl, nextIdx] = specsByID(update.schema);
441
+ const changes = [];
442
+ for (const table of nextTbl.values()) validate(this.#lc, table);
443
+ const [droppedIdx, createdIdx] = symmetricDifferences(prevIdx, nextIdx);
444
+ const keptIdx = intersection(prevIdx, nextIdx);
445
+ for (const id of keptIdx) if (isIndexStructurallyChanged(must(prevIdx.get(id)), must(nextIdx.get(id)), prevTbl, nextTbl)) {
446
+ droppedIdx.add(id);
447
+ createdIdx.add(id);
448
+ }
449
+ for (const id of droppedIdx) {
450
+ const { schema, name } = must(prevIdx.get(id));
451
+ changes.push({
452
+ tag: "drop-index",
453
+ id: {
454
+ schema,
455
+ name
456
+ }
457
+ });
458
+ }
459
+ const [droppedTbl, createdTbl] = symmetricDifferences(prevTbl, nextTbl);
460
+ for (const id of droppedTbl) {
461
+ const { schema, name } = must(prevTbl.get(id));
462
+ changes.push({
463
+ tag: "drop-table",
464
+ id: {
465
+ schema,
466
+ name
467
+ }
468
+ });
469
+ }
470
+ const tables = intersection(prevTbl, nextTbl);
471
+ for (const id of tables) changes.push(...this.#getTableChanges(must(prevTbl.get(id)), must(nextTbl.get(id)), update.event.tag));
472
+ for (const id of createdTbl) {
473
+ const spec = must(nextTbl.get(id));
474
+ const createTable = {
475
+ tag: "create-table",
476
+ spec,
477
+ metadata: getMetadata(spec)
478
+ };
479
+ if (!update.event.tag.startsWith("CREATE")) createTable.backfill = mapValues(spec.columns, ({ pos: attNum }) => ({ attNum }));
480
+ changes.push(createTable);
481
+ }
482
+ for (const id of createdIdx) {
483
+ const spec = must(nextIdx.get(id));
484
+ changes.push({
485
+ tag: "create-index",
486
+ spec
487
+ });
488
+ }
489
+ return changes;
490
+ } catch (e) {
491
+ throw new UnsupportedSchemaChangeError(String(e), update, { cause: e });
492
+ }
493
+ }
494
+ #getTableChanges(oldTable, newTable, ddlTag) {
495
+ const changes = [];
496
+ if (oldTable.schema !== newTable.schema || oldTable.name !== newTable.name) changes.push({
497
+ tag: "rename-table",
498
+ old: {
499
+ schema: oldTable.schema,
500
+ name: oldTable.name
501
+ },
502
+ new: {
503
+ schema: newTable.schema,
504
+ name: newTable.name
505
+ }
506
+ });
507
+ const oldMetadata = getMetadata(oldTable);
508
+ const newMetadata = getMetadata(newTable);
509
+ if (!deepEqual(oldMetadata, newMetadata)) changes.push({
510
+ tag: "update-table-metadata",
511
+ table: {
512
+ schema: newTable.schema,
513
+ name: newTable.name
514
+ },
515
+ old: oldMetadata,
516
+ new: newMetadata
517
+ });
518
+ const table = {
519
+ schema: newTable.schema,
520
+ name: newTable.name
521
+ };
522
+ const oldColumns = columnsByID(oldTable.columns);
523
+ const newColumns = columnsByID(newTable.columns);
524
+ const [dropped, added] = symmetricDifferences(oldColumns, newColumns);
525
+ for (const id of dropped) {
526
+ const { name: column } = must(oldColumns.get(id));
527
+ changes.push({
528
+ tag: "drop-column",
529
+ table,
530
+ column
531
+ });
532
+ }
533
+ const both = intersection(oldColumns, newColumns);
534
+ for (const id of both) {
535
+ const { name: oldName, ...oldSpec } = must(oldColumns.get(id));
536
+ const { name: newName, ...newSpec } = must(newColumns.get(id));
537
+ if (oldName !== newName || oldSpec.dataType !== newSpec.dataType || oldSpec.notNull !== newSpec.notNull) changes.push({
538
+ tag: "update-column",
539
+ table,
540
+ old: {
541
+ name: oldName,
542
+ spec: oldSpec
543
+ },
544
+ new: {
545
+ name: newName,
546
+ spec: newSpec
547
+ }
548
+ });
549
+ }
550
+ const alwaysBackfill = ddlTag === "ALTER PUBLICATION";
551
+ for (const id of added) {
552
+ const { name, ...spec } = must(newColumns.get(id));
553
+ const column = {
554
+ name,
555
+ spec
556
+ };
557
+ const addColumn = {
558
+ tag: "add-column",
559
+ table,
560
+ column,
561
+ tableMetadata: getMetadata(newTable)
562
+ };
563
+ if (alwaysBackfill) {
564
+ addColumn.column.spec.dflt = null;
565
+ addColumn.backfill = { attNum: spec.pos };
566
+ } else try {
567
+ mapPostgresToLiteColumn(table.name, column);
568
+ } catch (e) {
569
+ if (!(e instanceof UnsupportedColumnDefaultError)) throw e;
570
+ this.#lc.info?.(`Backfilling column ${table.name}.${name}: ${String(e)}`);
571
+ addColumn.column.spec.dflt = null;
572
+ addColumn.backfill = { attNum: spec.pos };
573
+ }
574
+ changes.push(addColumn);
575
+ }
576
+ return changes;
577
+ }
578
+ #parseReplicationEvent(content) {
579
+ const str = content instanceof Buffer ? content.toString("utf-8") : new TextDecoder().decode(content);
580
+ return parse(JSON.parse(str), replicationEventSchema, "passthrough");
581
+ }
582
+ /**
583
+ * If `ddlDetection === true`, relation messages are irrelevant,
584
+ * as schema changes are detected by event triggers that
585
+ * emit custom messages.
586
+ *
587
+ * For degraded-mode replication (`ddlDetection === false`):
588
+ * 1. query the current published schemas on upstream
589
+ * 2. compare that with the InternalShardConfig.initialSchema
590
+ * 3. compare that with the incoming MessageRelation
591
+ * 4. On any discrepancy, throw an UnsupportedSchemaChangeError
592
+ * to halt replication.
593
+ *
594
+ * Note that schemas queried in step [1] will be *post-transaction*
595
+ * schemas, which are not necessarily suitable for actually processing
596
+ * the statements in the transaction being replicated. In other words,
597
+ * this mechanism cannot be used to reliably *replicate* schema changes.
598
+ * However, they serve the purpose determining if schemas have changed.
599
+ */
600
+ async #handleRelation(rel) {
601
+ const { publications, ddlDetection } = this.#shardConfig;
602
+ if (ddlDetection) return [];
603
+ const currentSchema = await getPublicationInfo(this.#upstreamDB, publications);
604
+ const difference = getSchemaDifference(this.#initialSchema, currentSchema);
605
+ if (difference !== null) throw new MissingEventTriggerSupport(difference);
606
+ const orel = this.#initialSchema.tables.find((t) => t.oid === rel.relationOid);
607
+ if (!orel) throw new MissingEventTriggerSupport(`relation not in initialSchema: ${stringify(rel)}`);
608
+ if (relationDifferent(orel, rel)) throw new MissingEventTriggerSupport(`relation has changed within the transaction: ${stringify(orel)} vs ${stringify(rel)}`);
609
+ return [];
610
+ }
611
+ };
749
612
  function getSchemaDifference(a, b) {
750
- if (a.tables.length !== b.tables.length) {
751
- return `tables created or dropped`;
752
- }
753
- for (let i = 0; i < a.tables.length; i++) {
754
- const at = a.tables[i];
755
- const bt = b.tables[i];
756
- const difference = getTableDifference(at, bt);
757
- if (difference) {
758
- return difference;
759
- }
760
- }
761
- return null;
613
+ if (a.tables.length !== b.tables.length) return `tables created or dropped`;
614
+ for (let i = 0; i < a.tables.length; i++) {
615
+ const at = a.tables[i];
616
+ const bt = b.tables[i];
617
+ const difference = getTableDifference(at, bt);
618
+ if (difference) return difference;
619
+ }
620
+ return null;
762
621
  }
763
- const byColumnPos = (a, b) => a[1].pos < b[1].pos ? -1 : a[1].pos > b[1].pos ? 1 : 0;
622
+ var byColumnPos = (a, b) => a[1].pos < b[1].pos ? -1 : a[1].pos > b[1].pos ? 1 : 0;
764
623
  function getTableDifference(a, b) {
765
- if (a.oid !== b.oid || a.schema !== b.schema || a.name !== b.name) {
766
- return `Table "${a.name}" differs from table "${b.name}"`;
767
- }
768
- if (!deepEqual(a.primaryKey, b.primaryKey)) {
769
- return `Primary key of table "${a.name}" has changed`;
770
- }
771
- const acols = Object.entries(a.columns).sort(byColumnPos);
772
- const bcols = Object.entries(b.columns).sort(byColumnPos);
773
- if (acols.length !== bcols.length || acols.some(([aname, acol], i) => {
774
- const [bname, bcol] = bcols[i];
775
- return aname !== bname || acol.pos !== bcol.pos || acol.typeOID !== bcol.typeOID || acol.notNull !== bcol.notNull;
776
- })) {
777
- return `Columns of table "${a.name}" have changed`;
778
- }
779
- return null;
624
+ if (a.oid !== b.oid || a.schema !== b.schema || a.name !== b.name) return `Table "${a.name}" differs from table "${b.name}"`;
625
+ if (!deepEqual(a.primaryKey, b.primaryKey)) return `Primary key of table "${a.name}" has changed`;
626
+ const acols = Object.entries(a.columns).sort(byColumnPos);
627
+ const bcols = Object.entries(b.columns).sort(byColumnPos);
628
+ if (acols.length !== bcols.length || acols.some(([aname, acol], i) => {
629
+ const [bname, bcol] = bcols[i];
630
+ return aname !== bname || acol.pos !== bcol.pos || acol.typeOID !== bcol.typeOID || acol.notNull !== bcol.notNull;
631
+ })) return `Columns of table "${a.name}" have changed`;
632
+ return null;
780
633
  }
781
634
  function relationDifferent(a, b) {
782
- if (a.oid !== b.relationOid || a.schema !== b.schema || a.name !== b.name) {
783
- return true;
784
- }
785
- if (
786
- // The MessageRelation's `keyColumns` field contains the columns in column
787
- // declaration order, whereas the PublishedTableSpec's `primaryKey`
788
- // contains the columns in primary key (i.e. index) order. Do an
789
- // order-agnostic compare here since it is not possible to detect
790
- // key-order changes from the MessageRelation message alone.
791
- b.replicaIdentity === "default" && !equals(new Set(a.primaryKey), new Set(b.keyColumns))
792
- ) {
793
- return true;
794
- }
795
- const acols = Object.entries(a.columns).sort(byColumnPos);
796
- const bcols = b.columns;
797
- return acols.length !== bcols.length || acols.some(([aname, acol], i) => {
798
- const bcol = bcols[i];
799
- return aname !== bcol.name || acol.typeOID !== bcol.typeOid;
800
- });
635
+ if (a.oid !== b.relationOid || a.schema !== b.schema || a.name !== b.name) return true;
636
+ if (b.replicaIdentity === "default" && !equals(new Set(a.primaryKey), new Set(b.keyColumns))) return true;
637
+ const acols = Object.entries(a.columns).sort(byColumnPos);
638
+ const bcols = b.columns;
639
+ return acols.length !== bcols.length || acols.some(([aname, acol], i) => {
640
+ const bcol = bcols[i];
641
+ return aname !== bcol.name || acol.typeOID !== bcol.typeOid;
642
+ });
801
643
  }
802
644
  function translateError(e) {
803
- if (!(e instanceof Error)) {
804
- return new Error(String(e));
805
- }
806
- if (e instanceof postgres.PostgresError && e.code === PG_ADMIN_SHUTDOWN) {
807
- return new ShutdownSignal(e);
808
- }
809
- return e;
645
+ if (!(e instanceof Error)) return new Error(String(e));
646
+ if (e instanceof postgres.PostgresError && e.code === PG_ADMIN_SHUTDOWN) return new ShutdownSignal(e);
647
+ return e;
810
648
  }
811
- const idString = (id) => `${id.schema}.${id.name}`;
649
+ var idString = (id) => `${id.schema}.${id.name}`;
812
650
  function specsByID(published) {
813
- return [
814
- // It would have been nice to use a CustomKeyMap here, but we rely on set-utils
815
- // operations which use plain Sets.
816
- new Map(published.tables.map((t) => [t.oid, t])),
817
- new Map(published.indexes.map((i) => [idString(i), i]))
818
- ];
651
+ return [new Map(published.tables.map((t) => [t.oid, t])), new Map(published.indexes.map((i) => [idString(i), i]))];
652
+ }
653
+ /**
654
+ * Determines if an index was structurally changed (e.g. constraint dropped
655
+ * and recreated with different columns) vs cosmetically changed (e.g. the
656
+ * index spec changed because the table or a column was renamed).
657
+ *
658
+ * Compares boolean properties directly and resolves column names to their
659
+ * stable attnums (pg_attribute `attnum`) for the column comparison.
660
+ */
661
+ function isIndexStructurallyChanged(prev, next, prevTables, nextTables) {
662
+ if (prev.unique !== next.unique || prev.isPrimaryKey !== next.isPrimaryKey || prev.isReplicaIdentity !== next.isReplicaIdentity || prev.isImmediate !== next.isImmediate) return true;
663
+ const prevTable = findTableBySchemaAndName(prevTables, prev.schema, prev.tableName);
664
+ const nextTable = findTableBySchemaAndName(nextTables, next.schema, next.tableName);
665
+ if (!prevTable || !nextTable) return true;
666
+ const prevEntries = Object.entries(prev.columns);
667
+ const nextEntries = Object.entries(next.columns);
668
+ if (prevEntries.length !== nextEntries.length) return true;
669
+ const prevByAttnum = new Map(prevEntries.map(([name, dir]) => [prevTable.columns[name]?.pos, dir]));
670
+ const nextByAttnum = new Map(nextEntries.map(([name, dir]) => [nextTable.columns[name]?.pos, dir]));
671
+ if (prevByAttnum.has(void 0) || nextByAttnum.has(void 0)) return true;
672
+ if (prevByAttnum.size !== nextByAttnum.size) return true;
673
+ for (const [attnum, dir] of prevByAttnum) if (nextByAttnum.get(attnum) !== dir) return true;
674
+ return false;
675
+ }
676
+ function findTableBySchemaAndName(tables, schema, name) {
677
+ for (const table of tables.values()) if (table.schema === schema && table.name === name) return table;
819
678
  }
820
679
  function columnsByID(columns) {
821
- const colsByID = /* @__PURE__ */ new Map();
822
- for (const [name, spec] of Object.entries(columns)) {
823
- colsByID.set(spec.pos, { ...spec, name });
824
- }
825
- return colsByID;
680
+ const colsByID = /* @__PURE__ */ new Map();
681
+ for (const [name, spec] of Object.entries(columns)) colsByID.set(spec.pos, {
682
+ ...spec,
683
+ name
684
+ });
685
+ return colsByID;
826
686
  }
827
687
  function getMetadata(table) {
828
- return {
829
- schemaOID: must(table.schemaOID),
830
- relationOID: table.oid,
831
- rowKey: Object.fromEntries(
832
- table.replicaIdentityColumns.map((k) => [
833
- k,
834
- { attNum: table.columns[k].pos }
835
- ])
836
- )
837
- };
688
+ return {
689
+ schemaOID: must(table.schemaOID),
690
+ relationOID: table.oid,
691
+ rowKey: Object.fromEntries(table.replicaIdentityColumns.map((k) => [k, { attNum: table.columns[k].pos }]))
692
+ };
838
693
  }
839
694
  function makeRelation(relation) {
840
- const { columns: _, keyColumns, replicaIdentity, ...rest } = relation;
841
- return {
842
- ...rest,
843
- rowKey: {
844
- columns: keyColumns,
845
- type: replicaIdentity
846
- },
847
- // For now, deprecated columns are sent for backwards compatibility.
848
- // These can be removed when bumping the MIN_PROTOCOL_VERSION to 5.
849
- keyColumns,
850
- replicaIdentity
851
- };
695
+ const { columns: _, keyColumns, replicaIdentity, ...rest } = relation;
696
+ return {
697
+ ...rest,
698
+ rowKey: {
699
+ columns: keyColumns,
700
+ type: replicaIdentity
701
+ },
702
+ keyColumns,
703
+ replicaIdentity
704
+ };
852
705
  }
853
- class UnsupportedSchemaChangeError extends Error {
854
- name = "UnsupportedSchemaChangeError";
855
- description;
856
- ddlUpdate;
857
- constructor(description, ddlUpdate, options) {
858
- super(
859
- `Replication halted. Resync the replica to recover: ${description}`,
860
- options
861
- );
862
- this.description = description;
863
- this.ddlUpdate = ddlUpdate;
864
- }
865
- }
866
- class MissingEventTriggerSupport extends Error {
867
- name = "MissingEventTriggerSupport";
868
- constructor(msg) {
869
- super(
870
- `${msg}. Schema changes cannot be reliably replicated without event trigger support.`
871
- );
872
- }
873
- }
874
- class ShutdownSignal extends AbortError {
875
- name = "ShutdownSignal";
876
- constructor(cause) {
877
- super(
878
- "shutdown signal received (e.g. another zero-cache taking over the replication stream)",
879
- {
880
- cause
881
- }
882
- );
883
- }
884
- }
885
- export {
886
- Acker,
887
- initializePostgresChangeSource,
888
- relationDifferent
706
+ var UnsupportedSchemaChangeError = class extends Error {
707
+ name = "UnsupportedSchemaChangeError";
708
+ description;
709
+ ddlUpdate;
710
+ constructor(description, ddlUpdate, options) {
711
+ super(`Replication halted. Resync the replica to recover: ${description}`, options);
712
+ this.description = description;
713
+ this.ddlUpdate = ddlUpdate;
714
+ }
715
+ };
716
+ var MissingEventTriggerSupport = class extends Error {
717
+ name = "MissingEventTriggerSupport";
718
+ constructor(msg) {
719
+ super(`${msg}. Schema changes cannot be reliably replicated without event trigger support.`);
720
+ }
721
+ };
722
+ var ShutdownSignal = class extends AbortError {
723
+ name = "ShutdownSignal";
724
+ constructor(cause) {
725
+ super("shutdown signal received (e.g. another zero-cache taking over the replication stream)", { cause });
726
+ }
889
727
  };
890
- //# sourceMappingURL=change-source.js.map
728
+ //#endregion
729
+ export { initializePostgresChangeSource };
730
+
731
+ //# sourceMappingURL=change-source.js.map