@rocicorp/zero 0.26.1 → 0.26.2-canary.4

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