@rocicorp/zero 0.25.0-canary.7 → 0.25.0-canary.8

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 (1332) hide show
  1. package/out/analyze-query/src/bin-analyze.js +258 -236
  2. package/out/analyze-query/src/bin-analyze.js.map +1 -1
  3. package/out/analyze-query/src/bin-transform.js +31 -23
  4. package/out/analyze-query/src/bin-transform.js.map +1 -1
  5. package/out/analyze-query/src/explain-queries.js +13 -16
  6. package/out/analyze-query/src/explain-queries.js.map +1 -1
  7. package/out/analyze-query/src/run-ast.d.ts +3 -2
  8. package/out/analyze-query/src/run-ast.d.ts.map +1 -1
  9. package/out/analyze-query/src/run-ast.js +79 -73
  10. package/out/analyze-query/src/run-ast.js.map +1 -1
  11. package/out/ast-to-zql/src/ast-to-zql.js +146 -180
  12. package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
  13. package/out/ast-to-zql/src/bin.js +51 -54
  14. package/out/ast-to-zql/src/bin.js.map +1 -1
  15. package/out/ast-to-zql/src/format.js +15 -14
  16. package/out/ast-to-zql/src/format.js.map +1 -1
  17. package/out/datadog/src/datadog-log-sink.js +223 -0
  18. package/out/datadog/src/datadog-log-sink.js.map +1 -0
  19. package/out/otel/src/enabled.js +15 -15
  20. package/out/otel/src/enabled.js.map +1 -1
  21. package/out/otel/src/log-options.js +36 -31
  22. package/out/otel/src/log-options.js.map +1 -1
  23. package/out/otel/src/maybe-time.js +14 -11
  24. package/out/otel/src/maybe-time.js.map +1 -1
  25. package/out/otel/src/span.js +30 -27
  26. package/out/otel/src/span.js.map +1 -1
  27. package/out/otel/src/test-log-config.js +10 -7
  28. package/out/otel/src/test-log-config.js.map +1 -1
  29. package/out/otel/src/version.js +5 -2
  30. package/out/otel/src/version.js.map +1 -1
  31. package/out/replicache/src/async-iterable-to-array.js +11 -0
  32. package/out/replicache/src/async-iterable-to-array.js.map +1 -0
  33. package/out/replicache/src/bg-interval.js +38 -0
  34. package/out/replicache/src/bg-interval.js.map +1 -0
  35. package/out/replicache/src/btree/diff.js +8 -0
  36. package/out/replicache/src/btree/diff.js.map +1 -0
  37. package/out/replicache/src/btree/node.js +400 -0
  38. package/out/replicache/src/btree/node.js.map +1 -0
  39. package/out/replicache/src/btree/read.d.ts +3 -2
  40. package/out/replicache/src/btree/read.d.ts.map +1 -1
  41. package/out/replicache/src/btree/read.js +266 -0
  42. package/out/replicache/src/btree/read.js.map +1 -0
  43. package/out/replicache/src/btree/splice.js +83 -0
  44. package/out/replicache/src/btree/splice.js.map +1 -0
  45. package/out/replicache/src/btree/write.d.ts +1 -1
  46. package/out/replicache/src/btree/write.d.ts.map +1 -1
  47. package/out/replicache/src/btree/write.js +163 -0
  48. package/out/replicache/src/btree/write.js.map +1 -0
  49. package/out/replicache/src/call-default-fetch.js +34 -0
  50. package/out/replicache/src/call-default-fetch.js.map +1 -0
  51. package/out/replicache/src/connection-loop-delegates.js +34 -0
  52. package/out/replicache/src/connection-loop-delegates.js.map +1 -0
  53. package/out/replicache/src/connection-loop.js +251 -0
  54. package/out/replicache/src/connection-loop.js.map +1 -0
  55. package/out/replicache/src/cookies.js +40 -0
  56. package/out/replicache/src/cookies.js.map +1 -0
  57. package/out/replicache/src/dag/chunk.js +59 -0
  58. package/out/replicache/src/dag/chunk.js.map +1 -0
  59. package/out/replicache/src/dag/gc.js +117 -0
  60. package/out/replicache/src/dag/gc.js.map +1 -0
  61. package/out/replicache/src/dag/key.js +20 -0
  62. package/out/replicache/src/dag/key.js.map +1 -0
  63. package/out/replicache/src/dag/lazy-store.d.ts +2 -1
  64. package/out/replicache/src/dag/lazy-store.d.ts.map +1 -1
  65. package/out/replicache/src/dag/lazy-store.js +515 -0
  66. package/out/replicache/src/dag/lazy-store.js.map +1 -0
  67. package/out/replicache/src/dag/store-impl.js +183 -0
  68. package/out/replicache/src/dag/store-impl.js.map +1 -0
  69. package/out/replicache/src/dag/store.js +27 -0
  70. package/out/replicache/src/dag/store.js.map +1 -0
  71. package/out/replicache/src/dag/visitor.js +22 -0
  72. package/out/replicache/src/dag/visitor.js.map +1 -0
  73. package/out/replicache/src/db/commit.js +358 -0
  74. package/out/replicache/src/db/commit.js.map +1 -0
  75. package/out/replicache/src/db/index-operation-enum.js +7 -0
  76. package/out/replicache/src/db/index-operation-enum.js.map +1 -0
  77. package/out/replicache/src/db/index.js +134 -0
  78. package/out/replicache/src/db/index.js.map +1 -0
  79. package/out/replicache/src/db/meta-type-enum.js +7 -0
  80. package/out/replicache/src/db/meta-type-enum.js.map +1 -0
  81. package/out/replicache/src/db/read.d.ts +3 -2
  82. package/out/replicache/src/db/read.d.ts.map +1 -1
  83. package/out/replicache/src/db/read.js +72 -0
  84. package/out/replicache/src/db/read.js.map +1 -0
  85. package/out/replicache/src/db/rebase.d.ts +2 -2
  86. package/out/replicache/src/db/rebase.d.ts.map +1 -1
  87. package/out/replicache/src/db/rebase.js +85 -0
  88. package/out/replicache/src/db/rebase.js.map +1 -0
  89. package/out/replicache/src/db/write.d.ts +2 -1
  90. package/out/replicache/src/db/write.d.ts.map +1 -1
  91. package/out/replicache/src/db/write.js +296 -0
  92. package/out/replicache/src/db/write.js.map +1 -0
  93. package/out/replicache/src/deleted-clients.js +104 -0
  94. package/out/replicache/src/deleted-clients.js.map +1 -0
  95. package/out/replicache/src/error-responses.js +34 -0
  96. package/out/replicache/src/error-responses.js.map +1 -0
  97. package/out/replicache/src/format-version-enum.js +11 -0
  98. package/out/replicache/src/format-version-enum.js.map +1 -0
  99. package/out/{chunk-EZM3XBAB.js → replicache/src/frozen-json.js} +8 -75
  100. package/out/replicache/src/frozen-json.js.map +1 -0
  101. package/out/replicache/src/get-default-puller.js +61 -0
  102. package/out/replicache/src/get-default-puller.js.map +1 -0
  103. package/out/replicache/src/get-default-pusher.js +39 -0
  104. package/out/replicache/src/get-default-pusher.js.map +1 -0
  105. package/out/replicache/src/get-kv-store-provider.js +23 -0
  106. package/out/replicache/src/get-kv-store-provider.js.map +1 -0
  107. package/out/replicache/src/hash.js +38 -0
  108. package/out/replicache/src/hash.js.map +1 -0
  109. package/out/replicache/src/http-request-info.js +10 -0
  110. package/out/replicache/src/http-request-info.js.map +1 -0
  111. package/out/replicache/src/http-status-unauthorized.js +5 -0
  112. package/out/replicache/src/http-status-unauthorized.js.map +1 -0
  113. package/out/replicache/src/index-defs.js +32 -0
  114. package/out/replicache/src/index-defs.js.map +1 -0
  115. package/out/replicache/src/invoke-kind-enum.js +7 -0
  116. package/out/replicache/src/invoke-kind-enum.js.map +1 -0
  117. package/out/{chunk-HCZQVP5R.js → replicache/src/kv/expo-sqlite/store.js} +8 -16
  118. package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -0
  119. package/out/replicache/src/kv/idb-store-with-mem-fallback.js +80 -0
  120. package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +1 -0
  121. package/out/replicache/src/kv/idb-store.js +183 -0
  122. package/out/replicache/src/kv/idb-store.js.map +1 -0
  123. package/out/replicache/src/kv/mem-store.js +51 -0
  124. package/out/replicache/src/kv/mem-store.js.map +1 -0
  125. package/out/{op-sqlite.js → replicache/src/kv/op-sqlite/store.js} +7 -18
  126. package/out/replicache/src/kv/op-sqlite/store.js.map +1 -0
  127. package/out/replicache/src/kv/op-sqlite/types.js +6 -0
  128. package/out/replicache/src/kv/op-sqlite/types.js.map +1 -0
  129. package/out/replicache/src/kv/read-impl.js +27 -0
  130. package/out/replicache/src/kv/read-impl.js.map +1 -0
  131. package/out/{chunk-WPAQ4EPM.js → replicache/src/kv/sqlite-store.js} +15 -19
  132. package/out/replicache/src/kv/sqlite-store.js.map +1 -0
  133. package/out/{chunk-ASRS2LFV.js → replicache/src/kv/throw-if-closed.js} +4 -6
  134. package/out/replicache/src/kv/throw-if-closed.js.map +1 -0
  135. package/out/replicache/src/kv/write-impl-base.js +57 -0
  136. package/out/replicache/src/kv/write-impl-base.js.map +1 -0
  137. package/out/replicache/src/kv/write-impl.js +30 -0
  138. package/out/replicache/src/kv/write-impl.js.map +1 -0
  139. package/out/replicache/src/lazy.js +13 -0
  140. package/out/replicache/src/lazy.js.map +1 -0
  141. package/out/replicache/src/log-options.js +9 -0
  142. package/out/replicache/src/log-options.js.map +1 -0
  143. package/out/replicache/src/make-idb-name.js +13 -0
  144. package/out/replicache/src/make-idb-name.js.map +1 -0
  145. package/out/replicache/src/new-client-channel.js +51 -0
  146. package/out/replicache/src/new-client-channel.js.map +1 -0
  147. package/out/replicache/src/on-persist-channel.js +36 -0
  148. package/out/replicache/src/on-persist-channel.js.map +1 -0
  149. package/out/replicache/src/patch-operation.js +42 -0
  150. package/out/replicache/src/patch-operation.js.map +1 -0
  151. package/out/replicache/src/pending-mutations.js +16 -0
  152. package/out/replicache/src/pending-mutations.js.map +1 -0
  153. package/out/replicache/src/persist/client-gc.js +58 -0
  154. package/out/replicache/src/persist/client-gc.js.map +1 -0
  155. package/out/replicache/src/persist/client-group-gc.js +43 -0
  156. package/out/replicache/src/persist/client-group-gc.js.map +1 -0
  157. package/out/replicache/src/persist/client-groups.js +184 -0
  158. package/out/replicache/src/persist/client-groups.js.map +1 -0
  159. package/out/replicache/src/persist/clients.d.ts +3 -2
  160. package/out/replicache/src/persist/clients.d.ts.map +1 -1
  161. package/out/replicache/src/persist/clients.js +353 -0
  162. package/out/replicache/src/persist/clients.js.map +1 -0
  163. package/out/replicache/src/persist/collect-idb-databases.js +188 -0
  164. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -0
  165. package/out/replicache/src/persist/gather-mem-only-visitor.js +27 -0
  166. package/out/replicache/src/persist/gather-mem-only-visitor.js.map +1 -0
  167. package/out/replicache/src/persist/gather-not-cached-visitor.js +37 -0
  168. package/out/replicache/src/persist/gather-not-cached-visitor.js.map +1 -0
  169. package/out/replicache/src/persist/heartbeat.js +48 -0
  170. package/out/replicache/src/persist/heartbeat.js.map +1 -0
  171. package/out/replicache/src/persist/idb-databases-store-db-name.js +14 -0
  172. package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -0
  173. package/out/replicache/src/persist/idb-databases-store.js +92 -0
  174. package/out/replicache/src/persist/idb-databases-store.js.map +1 -0
  175. package/out/replicache/src/persist/make-client-id.js +12 -0
  176. package/out/replicache/src/persist/make-client-id.js.map +1 -0
  177. package/out/replicache/src/persist/persist.d.ts +2 -2
  178. package/out/replicache/src/persist/persist.d.ts.map +1 -1
  179. package/out/replicache/src/persist/persist.js +183 -0
  180. package/out/replicache/src/persist/persist.js.map +1 -0
  181. package/out/replicache/src/persist/refresh.d.ts +4 -3
  182. package/out/replicache/src/persist/refresh.d.ts.map +1 -1
  183. package/out/replicache/src/persist/refresh.js +198 -0
  184. package/out/replicache/src/persist/refresh.js.map +1 -0
  185. package/out/replicache/src/process-scheduler.js +96 -0
  186. package/out/replicache/src/process-scheduler.js.map +1 -0
  187. package/out/replicache/src/pusher.js +33 -0
  188. package/out/replicache/src/pusher.js.map +1 -0
  189. package/out/replicache/src/replicache-impl.d.ts +1 -1
  190. package/out/replicache/src/replicache-impl.d.ts.map +1 -1
  191. package/out/replicache/src/replicache-impl.js +1200 -0
  192. package/out/replicache/src/replicache-impl.js.map +1 -0
  193. package/out/replicache/src/report-error.js +6 -0
  194. package/out/replicache/src/report-error.js.map +1 -0
  195. package/out/replicache/src/request-idle.js +13 -0
  196. package/out/replicache/src/request-idle.js.map +1 -0
  197. package/out/replicache/src/scan-iterator.js +146 -0
  198. package/out/replicache/src/scan-iterator.js.map +1 -0
  199. package/out/replicache/src/scan-options.js +45 -0
  200. package/out/replicache/src/scan-options.js.map +1 -0
  201. package/out/replicache/src/set-interval-with-signal.js +12 -0
  202. package/out/replicache/src/set-interval-with-signal.js.map +1 -0
  203. package/out/replicache/src/subscriptions.js +355 -0
  204. package/out/replicache/src/subscriptions.js.map +1 -0
  205. package/out/replicache/src/sync/diff.d.ts +3 -2
  206. package/out/replicache/src/sync/diff.d.ts.map +1 -1
  207. package/out/replicache/src/sync/diff.js +72 -0
  208. package/out/replicache/src/sync/diff.js.map +1 -0
  209. package/out/replicache/src/sync/handle-pull-response-result-type-enum.js +9 -0
  210. package/out/replicache/src/sync/handle-pull-response-result-type-enum.js.map +1 -0
  211. package/out/replicache/src/sync/ids.js +9 -0
  212. package/out/replicache/src/sync/ids.js.map +1 -0
  213. package/out/replicache/src/sync/patch.js +49 -0
  214. package/out/replicache/src/sync/patch.js.map +1 -0
  215. package/out/replicache/src/sync/pull-error.js +16 -0
  216. package/out/replicache/src/sync/pull-error.js.map +1 -0
  217. package/out/replicache/src/sync/pull.d.ts +3 -2
  218. package/out/replicache/src/sync/pull.d.ts.map +1 -1
  219. package/out/replicache/src/sync/pull.js +301 -0
  220. package/out/replicache/src/sync/pull.js.map +1 -0
  221. package/out/replicache/src/sync/push.js +88 -0
  222. package/out/replicache/src/sync/push.js.map +1 -0
  223. package/out/replicache/src/sync/request-id.js +20 -0
  224. package/out/replicache/src/sync/request-id.js.map +1 -0
  225. package/out/replicache/src/sync/sync-head-name.js +5 -0
  226. package/out/replicache/src/sync/sync-head-name.js.map +1 -0
  227. package/out/replicache/src/to-error.js +10 -0
  228. package/out/replicache/src/to-error.js.map +1 -0
  229. package/out/replicache/src/transaction-closed-error.js +19 -0
  230. package/out/replicache/src/transaction-closed-error.js.map +1 -0
  231. package/out/replicache/src/transactions.js +152 -0
  232. package/out/replicache/src/transactions.js.map +1 -0
  233. package/out/replicache/src/version.js +5 -0
  234. package/out/replicache/src/version.js.map +1 -0
  235. package/out/replicache/src/with-transactions.js +28 -0
  236. package/out/replicache/src/with-transactions.js.map +1 -0
  237. package/out/shared/src/abort-error.js +6 -3
  238. package/out/shared/src/abort-error.js.map +1 -1
  239. package/out/shared/src/arrays.js +45 -43
  240. package/out/shared/src/arrays.js.map +1 -1
  241. package/out/shared/src/asserts.js +64 -68
  242. package/out/shared/src/asserts.js.map +1 -1
  243. package/out/shared/src/bigint-json.js +38 -42
  244. package/out/shared/src/bigint-json.js.map +1 -1
  245. package/out/shared/src/binary-search.js +18 -29
  246. package/out/shared/src/binary-search.js.map +1 -1
  247. package/out/shared/src/broadcast-channel.js +24 -0
  248. package/out/shared/src/broadcast-channel.js.map +1 -0
  249. package/out/shared/src/browser-env.js +25 -0
  250. package/out/shared/src/browser-env.js.map +1 -0
  251. package/out/shared/src/btree-set.js +464 -507
  252. package/out/shared/src/btree-set.js.map +1 -1
  253. package/out/shared/src/cache.js +34 -38
  254. package/out/shared/src/cache.js.map +1 -1
  255. package/out/shared/src/centroid.js +24 -24
  256. package/out/shared/src/centroid.js.map +1 -1
  257. package/out/shared/src/config.js +6 -3
  258. package/out/shared/src/config.js.map +1 -1
  259. package/out/shared/src/custom-key-map.js +58 -64
  260. package/out/shared/src/custom-key-map.js.map +1 -1
  261. package/out/shared/src/custom-key-set.js +51 -57
  262. package/out/shared/src/custom-key-set.js.map +1 -1
  263. package/out/shared/src/deep-clone.js +46 -0
  264. package/out/shared/src/deep-clone.js.map +1 -0
  265. package/out/shared/src/document-visible.js +74 -0
  266. package/out/shared/src/document-visible.js.map +1 -0
  267. package/out/shared/src/dotenv.js +5 -7
  268. package/out/shared/src/dotenv.js.map +1 -1
  269. package/out/shared/src/error.js +57 -56
  270. package/out/shared/src/error.js.map +1 -1
  271. package/out/shared/src/has-own.js +5 -3
  272. package/out/shared/src/has-own.js.map +1 -1
  273. package/out/shared/src/hash.js +15 -14
  274. package/out/shared/src/hash.js.map +1 -1
  275. package/out/shared/src/iterables.js +71 -73
  276. package/out/shared/src/iterables.js.map +1 -1
  277. package/out/shared/src/json-schema.js +30 -33
  278. package/out/shared/src/json-schema.js.map +1 -1
  279. package/out/shared/src/json.js +128 -143
  280. package/out/shared/src/json.js.map +1 -1
  281. package/out/shared/src/logging-test-utils.js +12 -19
  282. package/out/shared/src/logging-test-utils.js.map +1 -1
  283. package/out/shared/src/logging.js +83 -83
  284. package/out/shared/src/logging.js.map +1 -1
  285. package/out/shared/src/must.js +9 -7
  286. package/out/shared/src/must.js.map +1 -1
  287. package/out/shared/src/navigator.js +5 -0
  288. package/out/shared/src/navigator.js.map +1 -0
  289. package/out/shared/src/objects.js +21 -22
  290. package/out/shared/src/objects.js.map +1 -1
  291. package/out/shared/src/options.js +289 -322
  292. package/out/shared/src/options.js.map +1 -1
  293. package/out/shared/src/parse-big-int.js +12 -10
  294. package/out/shared/src/parse-big-int.js.map +1 -1
  295. package/out/shared/src/promise-race.js +20 -0
  296. package/out/shared/src/promise-race.js.map +1 -0
  297. package/out/shared/src/queue.js +119 -122
  298. package/out/shared/src/queue.js.map +1 -1
  299. package/out/shared/src/rand.js +8 -10
  300. package/out/shared/src/rand.js.map +1 -1
  301. package/out/shared/src/random-uint64.js +9 -0
  302. package/out/shared/src/random-uint64.js.map +1 -0
  303. package/out/shared/src/random-values.js +13 -0
  304. package/out/shared/src/random-values.js.map +1 -0
  305. package/out/shared/src/resolved-promises.js +12 -9
  306. package/out/shared/src/resolved-promises.js.map +1 -1
  307. package/out/shared/src/sentinels.js +13 -6
  308. package/out/shared/src/sentinels.js.map +1 -1
  309. package/out/shared/src/set-utils.js +63 -62
  310. package/out/shared/src/set-utils.js.map +1 -1
  311. package/out/shared/src/size-of-value.js +58 -0
  312. package/out/shared/src/size-of-value.js.map +1 -0
  313. package/out/shared/src/sleep.js +45 -53
  314. package/out/shared/src/sleep.js.map +1 -1
  315. package/out/shared/src/string-compare.js +12 -9
  316. package/out/shared/src/string-compare.js.map +1 -1
  317. package/out/shared/src/subscribable.js +34 -0
  318. package/out/shared/src/subscribable.js.map +1 -0
  319. package/out/shared/src/tdigest-schema.js +7 -7
  320. package/out/shared/src/tdigest-schema.js.map +1 -1
  321. package/out/shared/src/tdigest.js +247 -271
  322. package/out/shared/src/tdigest.js.map +1 -1
  323. package/out/shared/src/valita.js +195 -207
  324. package/out/shared/src/valita.js.map +1 -1
  325. package/out/z2s/src/compiler.d.ts.map +1 -1
  326. package/out/z2s/src/compiler.js +437 -310
  327. package/out/z2s/src/compiler.js.map +1 -1
  328. package/out/z2s/src/sql.js +186 -218
  329. package/out/z2s/src/sql.js.map +1 -1
  330. package/out/zero/package.json.js +9 -0
  331. package/out/zero/package.json.js.map +1 -0
  332. package/out/zero/src/adapters/drizzle.js +5 -2
  333. package/out/zero/src/adapters/drizzle.js.map +1 -1
  334. package/out/zero/src/adapters/pg.js +7 -2
  335. package/out/zero/src/adapters/pg.js.map +1 -1
  336. package/out/zero/src/adapters/postgresjs.js +7 -2
  337. package/out/zero/src/adapters/postgresjs.js.map +1 -1
  338. package/out/zero/src/analyze-query.js +1 -1
  339. package/out/zero/src/analyze-query.js.map +1 -1
  340. package/out/zero/src/ast-to-zql.js +1 -1
  341. package/out/zero/src/ast-to-zql.js.map +1 -1
  342. package/out/zero/src/build-schema.js +3 -5
  343. package/out/zero/src/build-schema.js.map +1 -1
  344. package/out/zero/src/change-protocol/v0.js +5 -3
  345. package/out/zero/src/change-protocol/v0.js.map +1 -1
  346. package/out/zero/src/cli.js +2 -2
  347. package/out/zero/src/cli.js.map +1 -1
  348. package/out/zero/src/deploy-permissions.js +1 -1
  349. package/out/zero/src/deploy-permissions.js.map +1 -1
  350. package/out/zero/src/expo-sqlite.js +5 -0
  351. package/out/zero/src/expo-sqlite.js.map +1 -0
  352. package/out/zero/src/op-sqlite.js +5 -0
  353. package/out/zero/src/op-sqlite.js.map +1 -0
  354. package/out/zero/src/pg.js +31 -3
  355. package/out/zero/src/pg.js.map +1 -1
  356. package/out/zero/src/react-native.js +13 -0
  357. package/out/zero/src/react-native.js.map +1 -0
  358. package/out/zero/src/react.js +17 -0
  359. package/out/zero/src/react.js.map +1 -0
  360. package/out/zero/src/server.js +27 -3
  361. package/out/zero/src/server.js.map +1 -1
  362. package/out/zero/src/solid.js +15 -0
  363. package/out/zero/src/solid.js.map +1 -0
  364. package/out/zero/src/sqlite.js +7 -0
  365. package/out/zero/src/sqlite.js.map +1 -0
  366. package/out/zero/src/transform-query.js +1 -1
  367. package/out/zero/src/transform-query.js.map +1 -1
  368. package/out/zero/src/zero-cache-dev.js +135 -126
  369. package/out/zero/src/zero-cache-dev.js.map +1 -1
  370. package/out/zero/src/zero-out.js +6 -6
  371. package/out/zero/src/zero-out.js.map +1 -1
  372. package/out/zero/src/zero.js +55 -0
  373. package/out/zero/src/zero.js.map +1 -0
  374. package/out/zero/src/zqlite.js +11 -3
  375. package/out/zero/src/zqlite.js.map +1 -1
  376. package/out/zero-cache/src/auth/jwt.js +33 -38
  377. package/out/zero-cache/src/auth/jwt.js.map +1 -1
  378. package/out/zero-cache/src/auth/load-permissions.js +61 -45
  379. package/out/zero-cache/src/auth/load-permissions.js.map +1 -1
  380. package/out/zero-cache/src/auth/read-authorizer.js +79 -91
  381. package/out/zero-cache/src/auth/read-authorizer.js.map +1 -1
  382. package/out/zero-cache/src/auth/write-authorizer.d.ts +2 -2
  383. package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
  384. package/out/zero-cache/src/auth/write-authorizer.js +394 -349
  385. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  386. package/out/zero-cache/src/config/network.js +42 -45
  387. package/out/zero-cache/src/config/network.js.map +1 -1
  388. package/out/zero-cache/src/config/normalize.js +86 -83
  389. package/out/zero-cache/src/config/normalize.js.map +1 -1
  390. package/out/zero-cache/src/config/zero-config.js +676 -682
  391. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  392. package/out/zero-cache/src/custom/fetch.d.ts.map +1 -1
  393. package/out/zero-cache/src/custom/fetch.js +166 -162
  394. package/out/zero-cache/src/custom/fetch.js.map +1 -1
  395. package/out/zero-cache/src/custom-queries/transform-query.d.ts +7 -0
  396. package/out/zero-cache/src/custom-queries/transform-query.d.ts.map +1 -1
  397. package/out/zero-cache/src/custom-queries/transform-query.js +101 -106
  398. package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -1
  399. package/out/zero-cache/src/db/create.js +32 -36
  400. package/out/zero-cache/src/db/create.js.map +1 -1
  401. package/out/zero-cache/src/db/delete-lite-db.js +9 -6
  402. package/out/zero-cache/src/db/delete-lite-db.js.map +1 -1
  403. package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
  404. package/out/zero-cache/src/db/lite-tables.js +150 -174
  405. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  406. package/out/zero-cache/src/db/migration-lite.js +170 -165
  407. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  408. package/out/zero-cache/src/db/migration.js +157 -137
  409. package/out/zero-cache/src/db/migration.js.map +1 -1
  410. package/out/zero-cache/src/db/mode-enum.js +9 -4
  411. package/out/zero-cache/src/db/mode-enum.js.map +1 -1
  412. package/out/zero-cache/src/db/pg-copy.js +51 -90
  413. package/out/zero-cache/src/db/pg-copy.js.map +1 -1
  414. package/out/zero-cache/src/db/pg-to-lite.js +114 -109
  415. package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
  416. package/out/zero-cache/src/db/pg-type-parser.js +27 -39
  417. package/out/zero-cache/src/db/pg-type-parser.js.map +1 -1
  418. package/out/zero-cache/src/db/postgres-replica-identity-enum.js +11 -6
  419. package/out/zero-cache/src/db/postgres-replica-identity-enum.js.map +1 -1
  420. package/out/zero-cache/src/db/postgres-type-class-enum.js +17 -9
  421. package/out/zero-cache/src/db/postgres-type-class-enum.js.map +1 -1
  422. package/out/zero-cache/src/db/specs.d.ts +0 -6
  423. package/out/zero-cache/src/db/specs.d.ts.map +1 -1
  424. package/out/zero-cache/src/db/specs.js +66 -40
  425. package/out/zero-cache/src/db/specs.js.map +1 -1
  426. package/out/zero-cache/src/db/statements.d.ts +1 -1
  427. package/out/zero-cache/src/db/statements.d.ts.map +1 -1
  428. package/out/zero-cache/src/db/statements.js +59 -52
  429. package/out/zero-cache/src/db/statements.js.map +1 -1
  430. package/out/zero-cache/src/db/transaction-pool.d.ts +1 -1
  431. package/out/zero-cache/src/db/transaction-pool.d.ts.map +1 -1
  432. package/out/zero-cache/src/db/transaction-pool.js +375 -501
  433. package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
  434. package/out/zero-cache/src/db/warmup.js +25 -12
  435. package/out/zero-cache/src/db/warmup.js.map +1 -1
  436. package/out/zero-cache/src/observability/events.js +71 -82
  437. package/out/zero-cache/src/observability/events.js.map +1 -1
  438. package/out/zero-cache/src/observability/metrics.js +54 -32
  439. package/out/zero-cache/src/observability/metrics.js.map +1 -1
  440. package/out/zero-cache/src/scripts/decommission.js +47 -43
  441. package/out/zero-cache/src/scripts/decommission.js.map +1 -1
  442. package/out/zero-cache/src/scripts/deploy-permissions.js +128 -118
  443. package/out/zero-cache/src/scripts/deploy-permissions.js.map +1 -1
  444. package/out/zero-cache/src/scripts/permissions.js +107 -99
  445. package/out/zero-cache/src/scripts/permissions.js.map +1 -1
  446. package/out/zero-cache/src/server/anonymous-otel-start.js +410 -366
  447. package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
  448. package/out/zero-cache/src/server/change-streamer.js +104 -60
  449. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  450. package/out/zero-cache/src/server/inspector-delegate.js +112 -109
  451. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
  452. package/out/zero-cache/src/server/logging.d.ts +1 -1
  453. package/out/zero-cache/src/server/logging.d.ts.map +1 -1
  454. package/out/zero-cache/src/server/logging.js +26 -19
  455. package/out/zero-cache/src/server/logging.js.map +1 -1
  456. package/out/zero-cache/src/server/main.d.ts.map +1 -1
  457. package/out/zero-cache/src/server/main.js +137 -120
  458. package/out/zero-cache/src/server/main.js.map +1 -1
  459. package/out/zero-cache/src/server/mutator.js +19 -0
  460. package/out/zero-cache/src/server/mutator.js.map +1 -0
  461. package/out/zero-cache/src/server/otel-diag-logger.d.ts +1 -1
  462. package/out/zero-cache/src/server/otel-diag-logger.d.ts.map +1 -1
  463. package/out/zero-cache/src/server/otel-diag-logger.js +67 -70
  464. package/out/zero-cache/src/server/otel-diag-logger.js.map +1 -1
  465. package/out/zero-cache/src/server/otel-log-sink.js +40 -41
  466. package/out/zero-cache/src/server/otel-log-sink.js.map +1 -1
  467. package/out/zero-cache/src/server/otel-start.d.ts +1 -1
  468. package/out/zero-cache/src/server/otel-start.d.ts.map +1 -1
  469. package/out/zero-cache/src/server/otel-start.js +57 -68
  470. package/out/zero-cache/src/server/otel-start.js.map +1 -1
  471. package/out/zero-cache/src/server/reaper.js +34 -26
  472. package/out/zero-cache/src/server/reaper.js.map +1 -1
  473. package/out/zero-cache/src/server/replicator.js +53 -31
  474. package/out/zero-cache/src/server/replicator.js.map +1 -1
  475. package/out/zero-cache/src/server/runner/main.js +6 -4
  476. package/out/zero-cache/src/server/runner/main.js.map +1 -1
  477. package/out/zero-cache/src/server/runner/run-worker.d.ts.map +1 -1
  478. package/out/zero-cache/src/server/runner/run-worker.js +46 -50
  479. package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
  480. package/out/zero-cache/src/server/runner/runtime.js +33 -32
  481. package/out/zero-cache/src/server/runner/runtime.js.map +1 -1
  482. package/out/zero-cache/src/server/runner/zero-dispatcher.d.ts.map +1 -1
  483. package/out/zero-cache/src/server/runner/zero-dispatcher.js +28 -22
  484. package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
  485. package/out/zero-cache/src/server/syncer.js +112 -63
  486. package/out/zero-cache/src/server/syncer.js.map +1 -1
  487. package/out/zero-cache/src/server/worker-dispatcher.d.ts +1 -1
  488. package/out/zero-cache/src/server/worker-dispatcher.d.ts.map +1 -1
  489. package/out/zero-cache/src/server/worker-dispatcher.js +112 -106
  490. package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -1
  491. package/out/zero-cache/src/server/worker-urls.d.ts +7 -0
  492. package/out/zero-cache/src/server/worker-urls.d.ts.map +1 -0
  493. package/out/zero-cache/src/server/worker-urls.js +21 -0
  494. package/out/zero-cache/src/server/worker-urls.js.map +1 -0
  495. package/out/zero-cache/src/services/analyze.d.ts +3 -4
  496. package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
  497. package/out/zero-cache/src/services/analyze.js +96 -122
  498. package/out/zero-cache/src/services/analyze.js.map +1 -1
  499. package/out/zero-cache/src/services/change-source/column-metadata.js +152 -155
  500. package/out/zero-cache/src/services/change-source/column-metadata.js.map +1 -1
  501. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts +1 -1
  502. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
  503. package/out/zero-cache/src/services/change-source/custom/change-source.js +197 -171
  504. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  505. package/out/zero-cache/src/services/change-source/custom/sync-schema.js +11 -3
  506. package/out/zero-cache/src/services/change-source/custom/sync-schema.js.map +1 -1
  507. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +1 -1
  508. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  509. package/out/zero-cache/src/services/change-source/pg/change-source.js +601 -622
  510. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  511. package/out/zero-cache/src/services/change-source/pg/decommission.js +24 -23
  512. package/out/zero-cache/src/services/change-source/pg/decommission.js.map +1 -1
  513. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +1 -1
  514. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  515. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +327 -284
  516. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  517. package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js +61 -69
  518. package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js.map +1 -1
  519. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js +247 -257
  520. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js.map +1 -1
  521. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +127 -119
  522. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  523. package/out/zero-cache/src/services/change-source/pg/lsn.js +20 -19
  524. package/out/zero-cache/src/services/change-source/pg/lsn.js.map +1 -1
  525. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +96 -119
  526. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
  527. package/out/zero-cache/src/services/change-source/pg/schema/init.js +138 -117
  528. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  529. package/out/zero-cache/src/services/change-source/pg/schema/published.js +67 -74
  530. package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
  531. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +199 -188
  532. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  533. package/out/zero-cache/src/services/change-source/pg/schema/validation.js +53 -38
  534. package/out/zero-cache/src/services/change-source/pg/schema/validation.js.map +1 -1
  535. package/out/zero-cache/src/services/change-source/pg/sync-schema.js +11 -3
  536. package/out/zero-cache/src/services/change-source/pg/sync-schema.js.map +1 -1
  537. package/out/zero-cache/src/services/change-source/protocol/current/control.js +9 -19
  538. package/out/zero-cache/src/services/change-source/protocol/current/control.js.map +1 -1
  539. package/out/zero-cache/src/services/change-source/protocol/current/data.js +143 -116
  540. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  541. package/out/zero-cache/src/services/change-source/protocol/current/downstream.js +29 -19
  542. package/out/zero-cache/src/services/change-source/protocol/current/downstream.js.map +1 -1
  543. package/out/zero-cache/src/services/change-source/protocol/current/path.js +5 -20
  544. package/out/zero-cache/src/services/change-source/protocol/current/path.js.map +1 -1
  545. package/out/zero-cache/src/services/change-source/protocol/current/status.js +12 -13
  546. package/out/zero-cache/src/services/change-source/protocol/current/status.js.map +1 -1
  547. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts +1 -1
  548. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts.map +1 -1
  549. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js +5 -4
  550. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -1
  551. package/out/zero-cache/src/services/change-source/protocol/current.js +35 -7
  552. package/out/zero-cache/src/services/change-source/protocol/current.js.map +1 -1
  553. package/out/zero-cache/src/services/change-source/replica-schema.js +64 -47
  554. package/out/zero-cache/src/services/change-source/replica-schema.js.map +1 -1
  555. package/out/zero-cache/src/services/change-streamer/backup-monitor.js +139 -161
  556. package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
  557. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +2 -2
  558. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  559. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +178 -158
  560. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  561. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +1 -1
  562. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  563. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +234 -355
  564. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  565. package/out/zero-cache/src/services/change-streamer/change-streamer.js +24 -26
  566. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  567. package/out/zero-cache/src/services/change-streamer/error-type-enum.js +9 -4
  568. package/out/zero-cache/src/services/change-streamer/error-type-enum.js.map +1 -1
  569. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts +1 -1
  570. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -1
  571. package/out/zero-cache/src/services/change-streamer/forwarder.js +53 -57
  572. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
  573. package/out/zero-cache/src/services/change-streamer/replica-monitor.js +40 -44
  574. package/out/zero-cache/src/services/change-streamer/replica-monitor.js.map +1 -1
  575. package/out/zero-cache/src/services/change-streamer/schema/init.js +82 -68
  576. package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
  577. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +2 -2
  578. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
  579. package/out/zero-cache/src/services/change-streamer/schema/tables.js +93 -78
  580. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  581. package/out/zero-cache/src/services/change-streamer/snapshot.js +28 -37
  582. package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -1
  583. package/out/zero-cache/src/services/change-streamer/storer.d.ts +2 -2
  584. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  585. package/out/zero-cache/src/services/change-streamer/storer.js +309 -372
  586. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  587. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +2 -1
  588. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
  589. package/out/zero-cache/src/services/change-streamer/subscriber.js +83 -90
  590. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  591. package/out/zero-cache/src/services/heapz.js +21 -25
  592. package/out/zero-cache/src/services/heapz.js.map +1 -1
  593. package/out/zero-cache/src/services/http-service.d.ts +1 -1
  594. package/out/zero-cache/src/services/http-service.d.ts.map +1 -1
  595. package/out/zero-cache/src/services/http-service.js +56 -59
  596. package/out/zero-cache/src/services/http-service.js.map +1 -1
  597. package/out/zero-cache/src/services/life-cycle.d.ts +1 -1
  598. package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
  599. package/out/zero-cache/src/services/life-cycle.js +216 -255
  600. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  601. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js +76 -130
  602. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js.map +1 -1
  603. package/out/zero-cache/src/services/litestream/commands.d.ts +1 -1
  604. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  605. package/out/zero-cache/src/services/litestream/commands.js +193 -178
  606. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  607. package/out/zero-cache/src/services/mutagen/error.js +11 -6
  608. package/out/zero-cache/src/services/mutagen/error.js.map +1 -1
  609. package/out/zero-cache/src/services/mutagen/mutagen.js +270 -267
  610. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  611. package/out/zero-cache/src/services/mutagen/pusher.js +351 -344
  612. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  613. package/out/zero-cache/src/services/replicator/change-processor.js +483 -530
  614. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  615. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +1 -1
  616. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  617. package/out/zero-cache/src/services/replicator/incremental-sync.js +97 -97
  618. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  619. package/out/zero-cache/src/services/replicator/notifier.js +28 -52
  620. package/out/zero-cache/src/services/replicator/notifier.js.map +1 -1
  621. package/out/zero-cache/src/services/replicator/replication-status.js +100 -83
  622. package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
  623. package/out/zero-cache/src/services/replicator/replicator.d.ts +1 -1
  624. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
  625. package/out/zero-cache/src/services/replicator/replicator.js +33 -26
  626. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  627. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts +1 -1
  628. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts.map +1 -1
  629. package/out/zero-cache/src/services/replicator/schema/change-log.js +74 -86
  630. package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -1
  631. package/out/zero-cache/src/services/replicator/schema/constants.js +5 -7
  632. package/out/zero-cache/src/services/replicator/schema/constants.js.map +1 -1
  633. package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts +2 -2
  634. package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts.map +1 -1
  635. package/out/zero-cache/src/services/replicator/schema/replication-state.js +70 -74
  636. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
  637. package/out/zero-cache/src/services/run-ast.d.ts +5 -3
  638. package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
  639. package/out/zero-cache/src/services/run-ast.js +80 -79
  640. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  641. package/out/zero-cache/src/services/runner.d.ts +1 -1
  642. package/out/zero-cache/src/services/runner.d.ts.map +1 -1
  643. package/out/zero-cache/src/services/runner.js +40 -40
  644. package/out/zero-cache/src/services/runner.js.map +1 -1
  645. package/out/zero-cache/src/services/running-state.d.ts +1 -1
  646. package/out/zero-cache/src/services/running-state.d.ts.map +1 -1
  647. package/out/zero-cache/src/services/running-state.js +122 -119
  648. package/out/zero-cache/src/services/running-state.js.map +1 -1
  649. package/out/zero-cache/src/services/statz.js +184 -162
  650. package/out/zero-cache/src/services/statz.js.map +1 -1
  651. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js +40 -39
  652. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js.map +1 -1
  653. package/out/zero-cache/src/services/view-syncer/client-handler.js +307 -298
  654. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  655. package/out/zero-cache/src/services/view-syncer/client-schema.d.ts.map +1 -1
  656. package/out/zero-cache/src/services/view-syncer/client-schema.js +80 -82
  657. package/out/zero-cache/src/services/view-syncer/client-schema.js.map +1 -1
  658. package/out/zero-cache/src/services/view-syncer/cvr-purger.js +83 -92
  659. package/out/zero-cache/src/services/view-syncer/cvr-purger.js.map +1 -1
  660. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +2 -4
  661. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  662. package/out/zero-cache/src/services/view-syncer/cvr-store.js +628 -616
  663. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  664. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +1 -1
  665. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  666. package/out/zero-cache/src/services/view-syncer/cvr.js +631 -694
  667. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  668. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +38 -60
  669. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
  670. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts +2 -1
  671. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts.map +1 -1
  672. package/out/zero-cache/src/services/view-syncer/inspect-handler.js +168 -158
  673. package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
  674. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +14 -13
  675. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  676. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +529 -482
  677. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  678. package/out/zero-cache/src/services/view-syncer/row-record-cache.js +229 -280
  679. package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
  680. package/out/zero-cache/src/services/view-syncer/schema/cvr.js +53 -120
  681. package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
  682. package/out/zero-cache/src/services/view-syncer/schema/init.js +171 -150
  683. package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -1
  684. package/out/zero-cache/src/services/view-syncer/schema/types.js +265 -257
  685. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  686. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +3 -3
  687. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  688. package/out/zero-cache/src/services/view-syncer/snapshotter.js +295 -338
  689. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  690. package/out/zero-cache/src/services/view-syncer/ttl-clock.js +13 -7
  691. package/out/zero-cache/src/services/view-syncer/ttl-clock.js.map +1 -1
  692. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +3 -3
  693. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  694. package/out/zero-cache/src/services/view-syncer/view-syncer.js +1485 -1307
  695. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  696. package/out/zero-cache/src/types/error-with-level.d.ts.map +1 -1
  697. package/out/zero-cache/src/types/error-with-level.js +29 -25
  698. package/out/zero-cache/src/types/error-with-level.js.map +1 -1
  699. package/out/zero-cache/src/types/http.js +27 -14
  700. package/out/zero-cache/src/types/http.js.map +1 -1
  701. package/out/zero-cache/src/types/lexi-version.js +46 -31
  702. package/out/zero-cache/src/types/lexi-version.js.map +1 -1
  703. package/out/zero-cache/src/types/lite.js +118 -125
  704. package/out/zero-cache/src/types/lite.js.map +1 -1
  705. package/out/zero-cache/src/types/names.js +6 -3
  706. package/out/zero-cache/src/types/names.js.map +1 -1
  707. package/out/zero-cache/src/types/pg-data-type.js +74 -68
  708. package/out/zero-cache/src/types/pg-data-type.js.map +1 -1
  709. package/out/zero-cache/src/types/pg-types.js +17 -72
  710. package/out/zero-cache/src/types/pg-types.js.map +1 -1
  711. package/out/zero-cache/src/types/pg.d.ts +1 -1
  712. package/out/zero-cache/src/types/pg.d.ts.map +1 -1
  713. package/out/zero-cache/src/types/pg.js +213 -233
  714. package/out/zero-cache/src/types/pg.js.map +1 -1
  715. package/out/zero-cache/src/types/processes.d.ts +2 -2
  716. package/out/zero-cache/src/types/processes.d.ts.map +1 -1
  717. package/out/zero-cache/src/types/processes.js +95 -143
  718. package/out/zero-cache/src/types/processes.js.map +1 -1
  719. package/out/zero-cache/src/types/profiler.js +29 -30
  720. package/out/zero-cache/src/types/profiler.js.map +1 -1
  721. package/out/zero-cache/src/types/row-key.js +30 -68
  722. package/out/zero-cache/src/types/row-key.js.map +1 -1
  723. package/out/zero-cache/src/types/schema-versions.js +25 -19
  724. package/out/zero-cache/src/types/schema-versions.js.map +1 -1
  725. package/out/zero-cache/src/types/shards.js +50 -36
  726. package/out/zero-cache/src/types/shards.js.map +1 -1
  727. package/out/zero-cache/src/types/sql.js +9 -13
  728. package/out/zero-cache/src/types/sql.js.map +1 -1
  729. package/out/zero-cache/src/types/streams.js +245 -254
  730. package/out/zero-cache/src/types/streams.js.map +1 -1
  731. package/out/zero-cache/src/types/strings.js +14 -11
  732. package/out/zero-cache/src/types/strings.js.map +1 -1
  733. package/out/zero-cache/src/types/subscription.js +200 -259
  734. package/out/zero-cache/src/types/subscription.js.map +1 -1
  735. package/out/zero-cache/src/types/url-params.js +35 -30
  736. package/out/zero-cache/src/types/url-params.js.map +1 -1
  737. package/out/zero-cache/src/types/websocket-handoff.d.ts +3 -2
  738. package/out/zero-cache/src/types/websocket-handoff.d.ts.map +1 -1
  739. package/out/zero-cache/src/types/websocket-handoff.js +68 -76
  740. package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
  741. package/out/zero-cache/src/types/ws.js +56 -59
  742. package/out/zero-cache/src/types/ws.js.map +1 -1
  743. package/out/zero-cache/src/workers/connect-params.js +44 -40
  744. package/out/zero-cache/src/workers/connect-params.js.map +1 -1
  745. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  746. package/out/zero-cache/src/workers/connection.js +277 -243
  747. package/out/zero-cache/src/workers/connection.js.map +1 -1
  748. package/out/zero-cache/src/workers/mutator.js +24 -0
  749. package/out/zero-cache/src/workers/mutator.js.map +1 -0
  750. package/out/zero-cache/src/workers/replicator.d.ts +1 -1
  751. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
  752. package/out/zero-cache/src/workers/replicator.js +103 -106
  753. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  754. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +179 -147
  755. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  756. package/out/zero-cache/src/workers/syncer.d.ts +3 -3
  757. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  758. package/out/zero-cache/src/workers/syncer.js +192 -169
  759. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  760. package/out/zero-client/src/client/active-clients-manager.js +199 -0
  761. package/out/zero-client/src/client/active-clients-manager.js.map +1 -0
  762. package/out/zero-client/src/client/bindings.d.ts +8 -7
  763. package/out/zero-client/src/client/bindings.d.ts.map +1 -1
  764. package/out/zero-client/src/client/bindings.js +33 -0
  765. package/out/zero-client/src/client/bindings.js.map +1 -0
  766. package/out/zero-client/src/client/client-error-kind-enum.js +29 -0
  767. package/out/zero-client/src/client/client-error-kind-enum.js.map +1 -0
  768. package/out/zero-client/src/client/connection-manager.d.ts +12 -31
  769. package/out/zero-client/src/client/connection-manager.d.ts.map +1 -1
  770. package/out/zero-client/src/client/connection-manager.js +310 -0
  771. package/out/zero-client/src/client/connection-manager.js.map +1 -0
  772. package/out/zero-client/src/client/connection-status-enum.js +15 -0
  773. package/out/zero-client/src/client/connection-status-enum.js.map +1 -0
  774. package/out/zero-client/src/client/connection.d.ts +45 -2
  775. package/out/zero-client/src/client/connection.d.ts.map +1 -1
  776. package/out/zero-client/src/client/connection.js +103 -0
  777. package/out/zero-client/src/client/connection.js.map +1 -0
  778. package/out/zero-client/src/client/context.d.ts +3 -6
  779. package/out/zero-client/src/client/context.d.ts.map +1 -1
  780. package/out/zero-client/src/client/context.js +104 -0
  781. package/out/zero-client/src/client/context.js.map +1 -0
  782. package/out/zero-client/src/client/crud.js +225 -0
  783. package/out/zero-client/src/client/crud.js.map +1 -0
  784. package/out/zero-client/src/client/custom.d.ts +9 -12
  785. package/out/zero-client/src/client/custom.d.ts.map +1 -1
  786. package/out/zero-client/src/client/custom.js +123 -0
  787. package/out/zero-client/src/client/custom.js.map +1 -0
  788. package/out/zero-client/src/client/delete-clients-manager.js +71 -0
  789. package/out/zero-client/src/client/delete-clients-manager.js.map +1 -0
  790. package/out/zero-client/src/client/enable-analytics.js +18 -0
  791. package/out/zero-client/src/client/enable-analytics.js.map +1 -0
  792. package/out/zero-client/src/client/error.d.ts +2 -1
  793. package/out/zero-client/src/client/error.d.ts.map +1 -1
  794. package/out/zero-client/src/client/error.js +148 -0
  795. package/out/zero-client/src/client/error.js.map +1 -0
  796. package/out/zero-client/src/client/http-string.js +11 -0
  797. package/out/zero-client/src/client/http-string.js.map +1 -0
  798. package/out/zero-client/src/client/inspector/client-group.js +27 -0
  799. package/out/zero-client/src/client/inspector/client-group.js.map +1 -0
  800. package/out/zero-client/src/client/inspector/client.js +28 -0
  801. package/out/zero-client/src/client/inspector/client.js.map +1 -0
  802. package/out/zero-client/src/client/inspector/html-dialog-prompt.js +77 -0
  803. package/out/zero-client/src/client/inspector/html-dialog-prompt.js.map +1 -0
  804. package/out/zero-client/src/client/inspector/inspector.d.ts +1 -1
  805. package/out/zero-client/src/client/inspector/inspector.d.ts.map +1 -1
  806. package/out/zero-client/src/client/inspector/inspector.js +47 -0
  807. package/out/zero-client/src/client/inspector/inspector.js.map +1 -0
  808. package/out/zero-client/src/client/inspector/lazy-inspector.d.ts +1 -1
  809. package/out/zero-client/src/client/inspector/lazy-inspector.d.ts.map +1 -1
  810. package/out/zero-client/src/client/inspector/lazy-inspector.js +243 -0
  811. package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -0
  812. package/out/zero-client/src/client/inspector/query.d.ts.map +1 -1
  813. package/out/zero-client/src/client/inspector/query.js +82 -0
  814. package/out/zero-client/src/client/inspector/query.js.map +1 -0
  815. package/out/zero-client/src/client/ivm-branch.d.ts +4 -4
  816. package/out/zero-client/src/client/ivm-branch.d.ts.map +1 -1
  817. package/out/zero-client/src/client/ivm-branch.js +149 -0
  818. package/out/zero-client/src/client/ivm-branch.js.map +1 -0
  819. package/out/zero-client/src/client/keys.js +45 -0
  820. package/out/zero-client/src/client/keys.js.map +1 -0
  821. package/out/zero-client/src/client/log-options.js +60 -0
  822. package/out/zero-client/src/client/log-options.js.map +1 -0
  823. package/out/zero-client/src/client/metric-name-enum.js +15 -0
  824. package/out/zero-client/src/client/metric-name-enum.js.map +1 -0
  825. package/out/zero-client/src/client/metrics.d.ts.map +1 -1
  826. package/out/zero-client/src/client/metrics.js +249 -0
  827. package/out/zero-client/src/client/metrics.js.map +1 -0
  828. package/out/zero-client/src/client/mutation-tracker.js +363 -0
  829. package/out/zero-client/src/client/mutation-tracker.js.map +1 -0
  830. package/out/zero-client/src/client/mutator-proxy.d.ts +1 -2
  831. package/out/zero-client/src/client/mutator-proxy.d.ts.map +1 -1
  832. package/out/zero-client/src/client/mutator-proxy.js +132 -0
  833. package/out/zero-client/src/client/mutator-proxy.js.map +1 -0
  834. package/out/zero-client/src/client/options.d.ts +36 -19
  835. package/out/zero-client/src/client/options.d.ts.map +1 -1
  836. package/out/zero-client/src/client/options.js +11 -0
  837. package/out/zero-client/src/client/options.js.map +1 -0
  838. package/out/zero-client/src/client/query-manager.d.ts +4 -4
  839. package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
  840. package/out/zero-client/src/client/query-manager.js +377 -0
  841. package/out/zero-client/src/client/query-manager.js.map +1 -0
  842. package/out/zero-client/src/client/reload-error-handler.d.ts +1 -1
  843. package/out/zero-client/src/client/reload-error-handler.d.ts.map +1 -1
  844. package/out/zero-client/src/client/reload-error-handler.js +114 -0
  845. package/out/zero-client/src/client/reload-error-handler.js.map +1 -0
  846. package/out/zero-client/src/client/server-option.js +64 -0
  847. package/out/zero-client/src/client/server-option.js.map +1 -0
  848. package/out/zero-client/src/client/update-needed-reason-type-enum.js +9 -0
  849. package/out/zero-client/src/client/update-needed-reason-type-enum.js.map +1 -0
  850. package/out/zero-client/src/client/version.js +5 -0
  851. package/out/zero-client/src/client/version.js.map +1 -0
  852. package/out/zero-client/src/client/zero-poke-handler.js +303 -0
  853. package/out/zero-client/src/client/zero-poke-handler.js.map +1 -0
  854. package/out/zero-client/src/client/zero-rep.d.ts +2 -2
  855. package/out/zero-client/src/client/zero-rep.d.ts.map +1 -1
  856. package/out/zero-client/src/client/zero-rep.js +72 -0
  857. package/out/zero-client/src/client/zero-rep.js.map +1 -0
  858. package/out/zero-client/src/client/zero.d.ts +26 -9
  859. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  860. package/out/zero-client/src/client/zero.js +1825 -0
  861. package/out/zero-client/src/client/zero.js.map +1 -0
  862. package/out/zero-client/src/mod.d.ts +4 -12
  863. package/out/zero-client/src/mod.d.ts.map +1 -1
  864. package/out/zero-client/src/util/nanoid.js +21 -0
  865. package/out/zero-client/src/util/nanoid.js.map +1 -0
  866. package/out/zero-client/src/util/socket.js +7 -0
  867. package/out/zero-client/src/util/socket.js.map +1 -0
  868. package/out/zero-protocol/src/analyze-query-result.js +32 -24
  869. package/out/zero-protocol/src/analyze-query-result.js.map +1 -1
  870. package/out/zero-protocol/src/application-error.js +35 -37
  871. package/out/zero-protocol/src/application-error.js.map +1 -1
  872. package/out/zero-protocol/src/ast.d.ts +1 -1
  873. package/out/zero-protocol/src/ast.js +296 -277
  874. package/out/zero-protocol/src/ast.js.map +1 -1
  875. package/out/zero-protocol/src/change-desired-queries.d.ts +2 -2
  876. package/out/zero-protocol/src/change-desired-queries.js +11 -7
  877. package/out/zero-protocol/src/change-desired-queries.js.map +1 -1
  878. package/out/zero-protocol/src/client-schema.d.ts +2 -2
  879. package/out/zero-protocol/src/client-schema.d.ts.map +1 -1
  880. package/out/zero-protocol/src/client-schema.js +40 -26
  881. package/out/zero-protocol/src/client-schema.js.map +1 -1
  882. package/out/zero-protocol/src/close-connection.js +11 -18
  883. package/out/zero-protocol/src/close-connection.js.map +1 -1
  884. package/out/zero-protocol/src/connect.d.ts +4 -4
  885. package/out/zero-protocol/src/connect.js +46 -51
  886. package/out/zero-protocol/src/connect.js.map +1 -1
  887. package/out/zero-protocol/src/custom-queries.d.ts +4 -4
  888. package/out/zero-protocol/src/custom-queries.js +61 -39
  889. package/out/zero-protocol/src/custom-queries.js.map +1 -1
  890. package/out/zero-protocol/src/data.js +9 -4
  891. package/out/zero-protocol/src/data.js.map +1 -1
  892. package/out/zero-protocol/src/delete-clients.js +16 -9
  893. package/out/zero-protocol/src/delete-clients.js.map +1 -1
  894. package/out/zero-protocol/src/down.d.ts +6 -6
  895. package/out/zero-protocol/src/down.js +20 -4
  896. package/out/zero-protocol/src/down.js.map +1 -1
  897. package/out/zero-protocol/src/error-kind-enum.js +41 -23
  898. package/out/zero-protocol/src/error-kind-enum.js.map +1 -1
  899. package/out/zero-protocol/src/error-origin-enum.js +9 -4
  900. package/out/zero-protocol/src/error-origin-enum.js.map +1 -1
  901. package/out/zero-protocol/src/error-reason-enum.js +17 -8
  902. package/out/zero-protocol/src/error-reason-enum.js.map +1 -1
  903. package/out/zero-protocol/src/error.d.ts +17 -17
  904. package/out/zero-protocol/src/error.js +151 -89
  905. package/out/zero-protocol/src/error.js.map +1 -1
  906. package/out/zero-protocol/src/inspect-down.d.ts +18 -18
  907. package/out/zero-protocol/src/inspect-down.js +72 -54
  908. package/out/zero-protocol/src/inspect-down.js.map +1 -1
  909. package/out/zero-protocol/src/inspect-up.d.ts +6 -6
  910. package/out/zero-protocol/src/inspect-up.js +38 -26
  911. package/out/zero-protocol/src/inspect-up.js.map +1 -1
  912. package/out/zero-protocol/src/mutation-id.js +9 -5
  913. package/out/zero-protocol/src/mutation-id.js.map +1 -1
  914. package/out/zero-protocol/src/mutation-type-enum.js +7 -3
  915. package/out/zero-protocol/src/mutation-type-enum.js.map +1 -1
  916. package/out/zero-protocol/src/mutations-patch.js +16 -17
  917. package/out/zero-protocol/src/mutations-patch.js.map +1 -1
  918. package/out/zero-protocol/src/ping.js +9 -4
  919. package/out/zero-protocol/src/ping.js.map +1 -1
  920. package/out/zero-protocol/src/poke.js +55 -72
  921. package/out/zero-protocol/src/poke.js.map +1 -1
  922. package/out/zero-protocol/src/pong.js +9 -4
  923. package/out/zero-protocol/src/pong.js.map +1 -1
  924. package/out/zero-protocol/src/primary-key.js +19 -5
  925. package/out/zero-protocol/src/primary-key.js.map +1 -1
  926. package/out/zero-protocol/src/protocol-version.d.ts +2 -2
  927. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
  928. package/out/zero-protocol/src/protocol-version.js +7 -59
  929. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  930. package/out/zero-protocol/src/pull.js +26 -19
  931. package/out/zero-protocol/src/pull.js.map +1 -1
  932. package/out/zero-protocol/src/push.d.ts +4 -4
  933. package/out/zero-protocol/src/push.js +179 -176
  934. package/out/zero-protocol/src/push.js.map +1 -1
  935. package/out/zero-protocol/src/queries-patch.d.ts +3 -3
  936. package/out/zero-protocol/src/queries-patch.js +29 -22
  937. package/out/zero-protocol/src/queries-patch.js.map +1 -1
  938. package/out/zero-protocol/src/query-hash.js +18 -14
  939. package/out/zero-protocol/src/query-hash.js.map +1 -1
  940. package/out/zero-protocol/src/row-patch.js +29 -20
  941. package/out/zero-protocol/src/row-patch.js.map +1 -1
  942. package/out/zero-protocol/src/up.d.ts +5 -5
  943. package/out/zero-protocol/src/up.js +18 -4
  944. package/out/zero-protocol/src/up.js.map +1 -1
  945. package/out/zero-protocol/src/version.js +9 -4
  946. package/out/zero-protocol/src/version.js.map +1 -1
  947. package/out/{inspector-GP3CBZRU.js → zero-react/src/components/inspector.js} +4 -9
  948. package/out/zero-react/src/components/inspector.js.map +1 -0
  949. package/out/{chunk-VZOYWIRW.js → zero-react/src/components/mark-icon.js} +3 -5
  950. package/out/zero-react/src/components/mark-icon.js.map +1 -0
  951. package/out/zero-react/src/components/zero-inspector.js +44 -0
  952. package/out/zero-react/src/components/zero-inspector.js.map +1 -0
  953. package/out/zero-react/src/mod.d.ts +1 -3
  954. package/out/zero-react/src/mod.d.ts.map +1 -1
  955. package/out/zero-react/src/use-query.d.ts +4 -4
  956. package/out/zero-react/src/use-query.d.ts.map +1 -1
  957. package/out/{react.js → zero-react/src/use-query.js} +25 -217
  958. package/out/zero-react/src/use-query.js.map +1 -0
  959. package/out/zero-react/src/use-zero-connection-state.d.ts +1 -1
  960. package/out/zero-react/src/use-zero-connection-state.d.ts.map +1 -1
  961. package/out/zero-react/src/use-zero-connection-state.js +14 -0
  962. package/out/zero-react/src/use-zero-connection-state.js.map +1 -0
  963. package/out/zero-react/src/use-zero-online.js +14 -0
  964. package/out/zero-react/src/use-zero-online.js.map +1 -0
  965. package/out/zero-react/src/zero-provider.d.ts +7 -6
  966. package/out/zero-react/src/zero-provider.d.ts.map +1 -1
  967. package/out/zero-react/src/zero-provider.js +59 -0
  968. package/out/zero-react/src/zero-provider.js.map +1 -0
  969. package/out/zero-schema/src/builder/relationship-builder.js +27 -0
  970. package/out/zero-schema/src/builder/relationship-builder.js.map +1 -0
  971. package/out/zero-schema/src/builder/schema-builder.js +88 -0
  972. package/out/zero-schema/src/builder/schema-builder.js.map +1 -0
  973. package/out/zero-schema/src/builder/table-builder.js +129 -0
  974. package/out/zero-schema/src/builder/table-builder.js.map +1 -0
  975. package/out/zero-schema/src/compiled-permissions.js +23 -19
  976. package/out/zero-schema/src/compiled-permissions.js.map +1 -1
  977. package/out/zero-schema/src/name-mapper.js +43 -38
  978. package/out/zero-schema/src/name-mapper.js.map +1 -1
  979. package/out/zero-schema/src/permissions.d.ts.map +1 -1
  980. package/out/zero-schema/src/permissions.js +199 -0
  981. package/out/zero-schema/src/permissions.js.map +1 -0
  982. package/out/zero-schema/src/schema-config.js +35 -51
  983. package/out/zero-schema/src/schema-config.js.map +1 -1
  984. package/out/zero-server/src/adapters/drizzle.d.ts +1 -1
  985. package/out/zero-server/src/adapters/drizzle.d.ts.map +1 -1
  986. package/out/zero-server/src/adapters/drizzle.js +83 -100
  987. package/out/zero-server/src/adapters/drizzle.js.map +1 -1
  988. package/out/zero-server/src/adapters/pg.d.ts +3 -2
  989. package/out/zero-server/src/adapters/pg.d.ts.map +1 -1
  990. package/out/zero-server/src/adapters/pg.js +53 -77
  991. package/out/zero-server/src/adapters/pg.js.map +1 -1
  992. package/out/zero-server/src/adapters/postgresjs.d.ts +1 -1
  993. package/out/zero-server/src/adapters/postgresjs.d.ts.map +1 -1
  994. package/out/zero-server/src/adapters/postgresjs.js +39 -57
  995. package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
  996. package/out/zero-server/src/custom.d.ts +6 -6
  997. package/out/zero-server/src/custom.d.ts.map +1 -1
  998. package/out/zero-server/src/custom.js +185 -117
  999. package/out/zero-server/src/custom.js.map +1 -1
  1000. package/out/zero-server/src/logging.js +7 -4
  1001. package/out/zero-server/src/logging.js.map +1 -1
  1002. package/out/zero-server/src/mod.d.ts +2 -0
  1003. package/out/zero-server/src/mod.d.ts.map +1 -1
  1004. package/out/zero-server/src/pg-query-executor.js +17 -14
  1005. package/out/zero-server/src/pg-query-executor.js.map +1 -1
  1006. package/out/zero-server/src/process-mutations.js +293 -274
  1007. package/out/zero-server/src/process-mutations.js.map +1 -1
  1008. package/out/zero-server/src/push-processor.js +55 -31
  1009. package/out/zero-server/src/push-processor.js.map +1 -1
  1010. package/out/zero-server/src/queries/process-queries.d.ts +63 -2
  1011. package/out/zero-server/src/queries/process-queries.d.ts.map +1 -1
  1012. package/out/zero-server/src/queries/process-queries.js +101 -95
  1013. package/out/zero-server/src/queries/process-queries.js.map +1 -1
  1014. package/out/zero-server/src/query-registry.d.ts +10 -0
  1015. package/out/zero-server/src/query-registry.d.ts.map +1 -0
  1016. package/out/zero-server/src/query-registry.js +35 -0
  1017. package/out/zero-server/src/query-registry.js.map +1 -0
  1018. package/out/zero-server/src/schema.js +136 -124
  1019. package/out/zero-server/src/schema.js.map +1 -1
  1020. package/out/zero-server/src/zql-database.d.ts +4 -4
  1021. package/out/zero-server/src/zql-database.d.ts.map +1 -1
  1022. package/out/zero-server/src/zql-database.js +66 -47
  1023. package/out/zero-server/src/zql-database.js.map +1 -1
  1024. package/out/zero-solid/src/mod.d.ts +1 -2
  1025. package/out/zero-solid/src/mod.d.ts.map +1 -1
  1026. package/out/zero-solid/src/solid-view.d.ts +1 -1
  1027. package/out/zero-solid/src/solid-view.d.ts.map +1 -1
  1028. package/out/{solid.js → zero-solid/src/solid-view.js} +42 -196
  1029. package/out/zero-solid/src/solid-view.js.map +1 -0
  1030. package/out/zero-solid/src/use-query.d.ts +1 -1
  1031. package/out/zero-solid/src/use-query.d.ts.map +1 -1
  1032. package/out/zero-solid/src/use-query.js +70 -0
  1033. package/out/zero-solid/src/use-query.js.map +1 -0
  1034. package/out/zero-solid/src/use-zero-connection-state.d.ts +1 -1
  1035. package/out/zero-solid/src/use-zero-connection-state.d.ts.map +1 -1
  1036. package/out/zero-solid/src/use-zero-connection-state.js +15 -0
  1037. package/out/zero-solid/src/use-zero-connection-state.js.map +1 -0
  1038. package/out/zero-solid/src/use-zero-online.js +13 -0
  1039. package/out/zero-solid/src/use-zero-online.js.map +1 -0
  1040. package/out/zero-solid/src/use-zero.d.ts +1 -1
  1041. package/out/zero-solid/src/use-zero.d.ts.map +1 -1
  1042. package/out/zero-solid/src/use-zero.js +74 -0
  1043. package/out/zero-solid/src/use-zero.js.map +1 -0
  1044. package/out/zero-types/src/format.js +7 -4
  1045. package/out/zero-types/src/format.js.map +1 -1
  1046. package/out/zero-types/src/name-mapper.js +43 -40
  1047. package/out/zero-types/src/name-mapper.js.map +1 -1
  1048. package/out/zql/src/builder/builder.d.ts +2 -1
  1049. package/out/zql/src/builder/builder.d.ts.map +1 -1
  1050. package/out/zql/src/builder/builder.js +486 -428
  1051. package/out/zql/src/builder/builder.js.map +1 -1
  1052. package/out/zql/src/builder/debug-delegate.js +68 -64
  1053. package/out/zql/src/builder/debug-delegate.js.map +1 -1
  1054. package/out/zql/src/builder/filter.js +132 -138
  1055. package/out/zql/src/builder/filter.js.map +1 -1
  1056. package/out/zql/src/builder/like.js +44 -51
  1057. package/out/zql/src/builder/like.js.map +1 -1
  1058. package/out/zql/src/error.d.ts +5 -0
  1059. package/out/zql/src/error.d.ts.map +1 -1
  1060. package/out/zql/src/error.js +18 -6
  1061. package/out/zql/src/error.js.map +1 -1
  1062. package/out/zql/src/ivm/array-view.js +86 -92
  1063. package/out/zql/src/ivm/array-view.js.map +1 -1
  1064. package/out/zql/src/ivm/constraint.js +74 -127
  1065. package/out/zql/src/ivm/constraint.js.map +1 -1
  1066. package/out/zql/src/ivm/data.js +59 -85
  1067. package/out/zql/src/ivm/data.js.map +1 -1
  1068. package/out/zql/src/ivm/exists.js +236 -243
  1069. package/out/zql/src/ivm/exists.js.map +1 -1
  1070. package/out/zql/src/ivm/fan-in.js +50 -51
  1071. package/out/zql/src/ivm/fan-in.js.map +1 -1
  1072. package/out/zql/src/ivm/fan-out.js +48 -50
  1073. package/out/zql/src/ivm/fan-out.js.map +1 -1
  1074. package/out/zql/src/ivm/filter-operators.js +87 -87
  1075. package/out/zql/src/ivm/filter-operators.js.map +1 -1
  1076. package/out/zql/src/ivm/filter-push.js +26 -23
  1077. package/out/zql/src/ivm/filter-push.js.map +1 -1
  1078. package/out/zql/src/ivm/filter.js +30 -32
  1079. package/out/zql/src/ivm/filter.js.map +1 -1
  1080. package/out/zql/src/ivm/flipped-join.js +343 -326
  1081. package/out/zql/src/ivm/flipped-join.js.map +1 -1
  1082. package/out/zql/src/ivm/join-utils.js +85 -79
  1083. package/out/zql/src/ivm/join-utils.js.map +1 -1
  1084. package/out/zql/src/ivm/join.js +287 -207
  1085. package/out/zql/src/ivm/join.js.map +1 -1
  1086. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +26 -24
  1087. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
  1088. package/out/zql/src/ivm/memory-source.d.ts +2 -2
  1089. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  1090. package/out/zql/src/ivm/memory-source.js +471 -489
  1091. package/out/zql/src/ivm/memory-source.js.map +1 -1
  1092. package/out/zql/src/ivm/memory-storage.js +32 -31
  1093. package/out/zql/src/ivm/memory-storage.js.map +1 -1
  1094. package/out/zql/src/ivm/operator.js +8 -9
  1095. package/out/zql/src/ivm/operator.js.map +1 -1
  1096. package/out/zql/src/ivm/push-accumulated.js +236 -305
  1097. package/out/zql/src/ivm/push-accumulated.js.map +1 -1
  1098. package/out/zql/src/ivm/skip.js +92 -106
  1099. package/out/zql/src/ivm/skip.js.map +1 -1
  1100. package/out/zql/src/ivm/source.d.ts +3 -1
  1101. package/out/zql/src/ivm/source.d.ts.map +1 -1
  1102. package/out/zql/src/ivm/stream.js +20 -16
  1103. package/out/zql/src/ivm/stream.js.map +1 -1
  1104. package/out/zql/src/ivm/take.js +502 -456
  1105. package/out/zql/src/ivm/take.js.map +1 -1
  1106. package/out/zql/src/ivm/union-fan-in.js +156 -134
  1107. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  1108. package/out/zql/src/ivm/union-fan-out.js +46 -45
  1109. package/out/zql/src/ivm/union-fan-out.js.map +1 -1
  1110. package/out/zql/src/ivm/view-apply-change.js +246 -216
  1111. package/out/zql/src/ivm/view-apply-change.js.map +1 -1
  1112. package/out/zql/src/ivm/view.d.ts +2 -2
  1113. package/out/zql/src/ivm/view.d.ts.map +1 -1
  1114. package/out/zql/src/mutate/custom.d.ts +10 -10
  1115. package/out/zql/src/mutate/custom.d.ts.map +1 -1
  1116. package/out/zql/src/mutate/custom.js +15 -7
  1117. package/out/zql/src/mutate/custom.js.map +1 -1
  1118. package/out/zql/src/planner/planner-builder.js +238 -172
  1119. package/out/zql/src/planner/planner-builder.js.map +1 -1
  1120. package/out/zql/src/planner/planner-connection.js +202 -251
  1121. package/out/zql/src/planner/planner-connection.js.map +1 -1
  1122. package/out/zql/src/planner/planner-constraint.js +8 -11
  1123. package/out/zql/src/planner/planner-constraint.js.map +1 -1
  1124. package/out/zql/src/planner/planner-fan-in.js +154 -164
  1125. package/out/zql/src/planner/planner-fan-in.js.map +1 -1
  1126. package/out/zql/src/planner/planner-fan-out.js +71 -60
  1127. package/out/zql/src/planner/planner-fan-out.js.map +1 -1
  1128. package/out/zql/src/planner/planner-graph.d.ts +6 -6
  1129. package/out/zql/src/planner/planner-graph.d.ts.map +1 -1
  1130. package/out/zql/src/planner/planner-graph.js +315 -338
  1131. package/out/zql/src/planner/planner-graph.js.map +1 -1
  1132. package/out/zql/src/planner/planner-join.js +234 -342
  1133. package/out/zql/src/planner/planner-join.js.map +1 -1
  1134. package/out/zql/src/planner/planner-source.js +23 -12
  1135. package/out/zql/src/planner/planner-source.js.map +1 -1
  1136. package/out/zql/src/planner/planner-terminus.js +28 -27
  1137. package/out/zql/src/planner/planner-terminus.js.map +1 -1
  1138. package/out/zql/src/query/complete-ordering.d.ts +5 -0
  1139. package/out/zql/src/query/complete-ordering.d.ts.map +1 -0
  1140. package/out/zql/src/query/complete-ordering.js +71 -0
  1141. package/out/zql/src/query/complete-ordering.js.map +1 -0
  1142. package/out/zql/src/query/define-query.d.ts +47 -23
  1143. package/out/zql/src/query/define-query.d.ts.map +1 -1
  1144. package/out/zql/src/query/define-query.js +45 -51
  1145. package/out/zql/src/query/define-query.js.map +1 -1
  1146. package/out/zql/src/query/error.js +12 -8
  1147. package/out/zql/src/query/error.js.map +1 -1
  1148. package/out/zql/src/query/escape-like.js +7 -0
  1149. package/out/zql/src/query/escape-like.js.map +1 -0
  1150. package/out/zql/src/query/expression.js +153 -151
  1151. package/out/zql/src/query/expression.js.map +1 -1
  1152. package/out/zql/src/query/measure-push-operator.js +42 -35
  1153. package/out/zql/src/query/measure-push-operator.js.map +1 -1
  1154. package/out/zql/src/query/metrics-delegate.js +9 -5
  1155. package/out/zql/src/query/metrics-delegate.js.map +1 -1
  1156. package/out/zql/src/query/named.d.ts +9 -5
  1157. package/out/zql/src/query/named.d.ts.map +1 -1
  1158. package/out/zql/src/query/named.js +70 -85
  1159. package/out/zql/src/query/named.js.map +1 -1
  1160. package/out/zql/src/query/query-definitions.d.ts +32 -0
  1161. package/out/zql/src/query/query-definitions.d.ts.map +1 -0
  1162. package/out/zql/src/query/query-delegate-base.d.ts +6 -14
  1163. package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
  1164. package/out/zql/src/query/query-delegate-base.js +118 -134
  1165. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  1166. package/out/zql/src/query/query-delegate.d.ts +6 -8
  1167. package/out/zql/src/query/query-delegate.d.ts.map +1 -1
  1168. package/out/zql/src/query/query-impl.d.ts +17 -18
  1169. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  1170. package/out/zql/src/query/query-impl.js +511 -433
  1171. package/out/zql/src/query/query-impl.js.map +1 -1
  1172. package/out/zql/src/query/query-internals.d.ts +11 -13
  1173. package/out/zql/src/query/query-internals.d.ts.map +1 -1
  1174. package/out/zql/src/query/query-internals.js +13 -19
  1175. package/out/zql/src/query/query-internals.js.map +1 -1
  1176. package/out/zql/src/query/query.d.ts +15 -16
  1177. package/out/zql/src/query/query.d.ts.map +1 -1
  1178. package/out/zql/src/query/static-query.d.ts +3 -3
  1179. package/out/zql/src/query/static-query.d.ts.map +1 -1
  1180. package/out/zql/src/query/static-query.js +41 -18
  1181. package/out/zql/src/query/static-query.js.map +1 -1
  1182. package/out/zql/src/query/ttl.js +69 -62
  1183. package/out/zql/src/query/ttl.js.map +1 -1
  1184. package/out/zql/src/query/validate-input.d.ts +15 -0
  1185. package/out/zql/src/query/validate-input.d.ts.map +1 -0
  1186. package/out/zql/src/query/validate-input.js +25 -0
  1187. package/out/zql/src/query/validate-input.js.map +1 -0
  1188. package/out/zqlite/src/database-storage.d.ts +1 -1
  1189. package/out/zqlite/src/database-storage.d.ts.map +1 -1
  1190. package/out/zqlite/src/database-storage.js +99 -102
  1191. package/out/zqlite/src/database-storage.js.map +1 -1
  1192. package/out/zqlite/src/db.js +241 -194
  1193. package/out/zqlite/src/db.js.map +1 -1
  1194. package/out/zqlite/src/explain-queries.js +13 -16
  1195. package/out/zqlite/src/explain-queries.js.map +1 -1
  1196. package/out/zqlite/src/internal/sql.js +15 -10
  1197. package/out/zqlite/src/internal/sql.js.map +1 -1
  1198. package/out/zqlite/src/internal/statement-cache.js +86 -110
  1199. package/out/zqlite/src/internal/statement-cache.js.map +1 -1
  1200. package/out/zqlite/src/query-builder.js +172 -143
  1201. package/out/zqlite/src/query-builder.js.map +1 -1
  1202. package/out/zqlite/src/query-delegate.d.ts +2 -2
  1203. package/out/zqlite/src/query-delegate.d.ts.map +1 -1
  1204. package/out/zqlite/src/query-delegate.js +53 -43
  1205. package/out/zqlite/src/query-delegate.js.map +1 -1
  1206. package/out/zqlite/src/sqlite-cost-model.js +94 -125
  1207. package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
  1208. package/out/zqlite/src/sqlite-stat-fanout.js +277 -353
  1209. package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
  1210. package/out/zqlite/src/table-source.d.ts +9 -4
  1211. package/out/zqlite/src/table-source.d.ts.map +1 -1
  1212. package/out/zqlite/src/table-source.js +424 -327
  1213. package/out/zqlite/src/table-source.js.map +1 -1
  1214. package/package.json +22 -25
  1215. package/out/chunk-424PT5DM.js +0 -23
  1216. package/out/chunk-424PT5DM.js.map +0 -7
  1217. package/out/chunk-AFADJQ2O.js +0 -1
  1218. package/out/chunk-AFADJQ2O.js.map +0 -7
  1219. package/out/chunk-ASRS2LFV.js.map +0 -7
  1220. package/out/chunk-EZM3XBAB.js.map +0 -7
  1221. package/out/chunk-FODUNUAD.js +0 -18850
  1222. package/out/chunk-FODUNUAD.js.map +0 -7
  1223. package/out/chunk-HCZQVP5R.js.map +0 -7
  1224. package/out/chunk-S633A55A.js +0 -495
  1225. package/out/chunk-S633A55A.js.map +0 -7
  1226. package/out/chunk-TAUDS4QP.js +0 -4129
  1227. package/out/chunk-TAUDS4QP.js.map +0 -7
  1228. package/out/chunk-VZOYWIRW.js.map +0 -7
  1229. package/out/chunk-WPAQ4EPM.js.map +0 -7
  1230. package/out/expo-sqlite.js +0 -11
  1231. package/out/expo-sqlite.js.map +0 -7
  1232. package/out/inspector-GP3CBZRU.js.map +0 -7
  1233. package/out/lazy-inspector-XLKVABX2.js +0 -575
  1234. package/out/lazy-inspector-XLKVABX2.js.map +0 -7
  1235. package/out/op-sqlite.js.map +0 -7
  1236. package/out/react-native.js +0 -25
  1237. package/out/react-native.js.map +0 -7
  1238. package/out/react.js.map +0 -7
  1239. package/out/shared/src/enum.js +0 -2
  1240. package/out/shared/src/enum.js.map +0 -1
  1241. package/out/shared/src/expand.js +0 -2
  1242. package/out/shared/src/expand.js.map +0 -1
  1243. package/out/shared/src/immutable.js +0 -2
  1244. package/out/shared/src/immutable.js.map +0 -1
  1245. package/out/shared/src/types.js +0 -2
  1246. package/out/shared/src/types.js.map +0 -1
  1247. package/out/shared/src/writable.js +0 -2
  1248. package/out/shared/src/writable.js.map +0 -1
  1249. package/out/solid.js.map +0 -7
  1250. package/out/sqlite.js +0 -15
  1251. package/out/sqlite.js.map +0 -7
  1252. package/out/zero/package.json +0 -195
  1253. package/out/zero/src/server/change-streamer.js +0 -2
  1254. package/out/zero/src/server/change-streamer.js.map +0 -1
  1255. package/out/zero/src/server/main.js +0 -2
  1256. package/out/zero/src/server/main.js.map +0 -1
  1257. package/out/zero/src/server/reaper.js +0 -2
  1258. package/out/zero/src/server/reaper.js.map +0 -1
  1259. package/out/zero/src/server/replicator.js +0 -2
  1260. package/out/zero/src/server/replicator.js.map +0 -1
  1261. package/out/zero/src/server/runner/main.js +0 -2
  1262. package/out/zero/src/server/runner/main.js.map +0 -1
  1263. package/out/zero/src/server/syncer.js +0 -2
  1264. package/out/zero/src/server/syncer.js.map +0 -1
  1265. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput.types.js +0 -4
  1266. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput.types.js.map +0 -1
  1267. package/out/zero-cache/src/services/change-source/protocol/mod.js +0 -5
  1268. package/out/zero-cache/src/services/change-source/protocol/mod.js.map +0 -1
  1269. package/out/zero-cache/src/services/service.js +0 -2
  1270. package/out/zero-cache/src/services/service.js.map +0 -1
  1271. package/out/zero-cache/src/services/view-syncer/key-columns.d.ts +0 -32
  1272. package/out/zero-cache/src/services/view-syncer/key-columns.d.ts.map +0 -1
  1273. package/out/zero-cache/src/services/view-syncer/key-columns.js +0 -75
  1274. package/out/zero-cache/src/services/view-syncer/key-columns.js.map +0 -1
  1275. package/out/zero-cache/src/types/satisfies.js +0 -2
  1276. package/out/zero-cache/src/types/satisfies.js.map +0 -1
  1277. package/out/zero-events/src/index.js +0 -2
  1278. package/out/zero-events/src/index.js.map +0 -1
  1279. package/out/zero-events/src/json.js +0 -2
  1280. package/out/zero-events/src/json.js.map +0 -1
  1281. package/out/zero-events/src/status.js +0 -3
  1282. package/out/zero-events/src/status.js.map +0 -1
  1283. package/out/zero-pg/src/mod.js +0 -6
  1284. package/out/zero-pg/src/mod.js.map +0 -1
  1285. package/out/zero-protocol/src/error-kind.js +0 -3
  1286. package/out/zero-protocol/src/error-kind.js.map +0 -1
  1287. package/out/zero-protocol/src/error-origin.js +0 -3
  1288. package/out/zero-protocol/src/error-origin.js.map +0 -1
  1289. package/out/zero-protocol/src/error-reason.js +0 -3
  1290. package/out/zero-protocol/src/error-reason.js.map +0 -1
  1291. package/out/zero-schema/src/table-schema.js +0 -7
  1292. package/out/zero-schema/src/table-schema.js.map +0 -1
  1293. package/out/zero-server/src/mod.js +0 -8
  1294. package/out/zero-server/src/mod.js.map +0 -1
  1295. package/out/zero-types/src/schema-value.js +0 -2
  1296. package/out/zero-types/src/schema-value.js.map +0 -1
  1297. package/out/zero-types/src/schema.js +0 -2
  1298. package/out/zero-types/src/schema.js.map +0 -1
  1299. package/out/zero-types/src/server-schema.js +0 -2
  1300. package/out/zero-types/src/server-schema.js.map +0 -1
  1301. package/out/zero.js +0 -95
  1302. package/out/zero.js.map +0 -7
  1303. package/out/zql/src/ivm/change.js +0 -2
  1304. package/out/zql/src/ivm/change.js.map +0 -1
  1305. package/out/zql/src/ivm/default-format.js +0 -2
  1306. package/out/zql/src/ivm/default-format.js.map +0 -1
  1307. package/out/zql/src/ivm/schema.js +0 -2
  1308. package/out/zql/src/ivm/schema.js.map +0 -1
  1309. package/out/zql/src/ivm/source.js +0 -2
  1310. package/out/zql/src/ivm/source.js.map +0 -1
  1311. package/out/zql/src/ivm/view.js +0 -2
  1312. package/out/zql/src/ivm/view.js.map +0 -1
  1313. package/out/zql/src/planner/planner-debug.js +0 -176
  1314. package/out/zql/src/planner/planner-debug.js.map +0 -1
  1315. package/out/zql/src/planner/planner-node.js +0 -2
  1316. package/out/zql/src/planner/planner-node.js.map +0 -1
  1317. package/out/zql/src/query/chained-query.d.ts +0 -35
  1318. package/out/zql/src/query/chained-query.d.ts.map +0 -1
  1319. package/out/zql/src/query/chained-query.js +0 -66
  1320. package/out/zql/src/query/chained-query.js.map +0 -1
  1321. package/out/zql/src/query/query-delegate.js +0 -2
  1322. package/out/zql/src/query/query-delegate.js.map +0 -1
  1323. package/out/zql/src/query/query.js +0 -8
  1324. package/out/zql/src/query/query.js.map +0 -1
  1325. package/out/zql/src/query/root-named-query.d.ts +0 -33
  1326. package/out/zql/src/query/root-named-query.d.ts.map +0 -1
  1327. package/out/zql/src/query/root-named-query.js +0 -95
  1328. package/out/zql/src/query/root-named-query.js.map +0 -1
  1329. package/out/zql/src/query/typed-view.js +0 -2
  1330. package/out/zql/src/query/typed-view.js.map +0 -1
  1331. package/out/zqlite/src/mod.js +0 -5
  1332. package/out/zqlite/src/mod.js.map +0 -1
@@ -1,694 +1,673 @@
1
- import { PG_ADMIN_SHUTDOWN, PG_OBJECT_IN_USE, } from '@drdgvhbh/postgres-error-codes';
2
- import { LogContext } from '@rocicorp/logger';
3
- import postgres from 'postgres';
1
+ import { PG_OBJECT_IN_USE, PG_ADMIN_SHUTDOWN } from "@drdgvhbh/postgres-error-codes";
2
+ import postgres from "postgres";
4
3
  import { AbortError } from "../../../../../shared/src/abort-error.js";
5
4
  import { stringify } from "../../../../../shared/src/bigint-json.js";
6
5
  import { deepEqual } from "../../../../../shared/src/json.js";
7
6
  import { must } from "../../../../../shared/src/must.js";
8
7
  import { promiseVoid } from "../../../../../shared/src/resolved-promises.js";
9
- import { equals, intersection, symmetricDifferences, } from "../../../../../shared/src/set-utils.js";
8
+ import { symmetricDifferences, intersection, equals } from "../../../../../shared/src/set-utils.js";
10
9
  import { sleep } from "../../../../../shared/src/sleep.js";
11
- import * as v from "../../../../../shared/src/valita.js";
10
+ import { parse } from "../../../../../shared/src/valita.js";
12
11
  import { Database } from "../../../../../zqlite/src/db.js";
13
12
  import { mapPostgresToLiteColumn } from "../../../db/pg-to-lite.js";
14
13
  import { StatementRunner } from "../../../db/statements.js";
15
- import { oneAfter, versionFromLexi, versionToLexi, } from "../../../types/lexi-version.js";
14
+ import { oneAfter, versionFromLexi, versionToLexi } from "../../../types/lexi-version.js";
16
15
  import { pgClient } from "../../../types/pg.js";
17
- import { upstreamSchema, } from "../../../types/shards.js";
16
+ import { upstreamSchema } from "../../../types/shards.js";
18
17
  import { Subscription } from "../../../types/subscription.js";
19
18
  import { AutoResetSignal } from "../../change-streamer/schema/tables.js";
20
- import { getSubscriptionState, } from "../../replicator/schema/replication-state.js";
21
- import {} from "./initial-sync.js";
22
- import { subscribe } from "./logical-replication/stream.js";
19
+ import { getSubscriptionState } from "../../replicator/schema/replication-state.js";
20
+ import "../../../types/pg-data-type.js";
21
+ import "@rocicorp/resolver";
22
+ import "@rocicorp/logger";
23
+ import "../../../../../zero-protocol/src/primary-key.js";
24
+ import "../../../observability/events.js";
25
+ import "../../replicator/schema/change-log.js";
23
26
  import { fromBigInt, toLexiVersion } from "./lsn.js";
24
- import { replicationEventSchema } from "./schema/ddl.js";
25
27
  import { updateShardSchema } from "./schema/init.js";
26
28
  import { getPublicationInfo } from "./schema/published.js";
27
- import { dropShard, getInternalShardConfig, getReplicaAtVersion, internalPublicationPrefix, legacyReplicationSlot, replicaIdentitiesForTablesWithoutPrimaryKeys, replicationSlotExpression, } from "./schema/shard.js";
29
+ import { getReplicaAtVersion, internalPublicationPrefix, dropShard, getInternalShardConfig, replicationSlotExpression, legacyReplicationSlot, replicaIdentitiesForTablesWithoutPrimaryKeys } from "./schema/shard.js";
30
+ import { subscribe } from "./logical-replication/stream.js";
31
+ import { replicationEventSchema } from "./schema/ddl.js";
28
32
  import { validate } from "./schema/validation.js";
29
33
  import { initSyncSchema } from "./sync-schema.js";
30
- /**
31
- * Initializes a Postgres change source, including the initial sync of the
32
- * replica, before streaming changes from the corresponding logical replication
33
- * stream.
34
- */
35
- export async function initializePostgresChangeSource(lc, upstreamURI, shard, replicaDbFile, syncOptions) {
36
- await initSyncSchema(lc, `replica-${shard.appID}-${shard.shardNum}`, shard, replicaDbFile, upstreamURI, syncOptions);
37
- const replica = new Database(lc, replicaDbFile);
38
- const subscriptionState = getSubscriptionState(new StatementRunner(replica));
39
- replica.close();
40
- // Check that upstream is properly setup, and throw an AutoReset to re-run
41
- // initial sync if not.
42
- const db = pgClient(lc, upstreamURI);
43
- try {
44
- const upstreamReplica = await checkAndUpdateUpstream(lc, db, shard, subscriptionState);
45
- const changeSource = new PostgresChangeSource(lc, upstreamURI, shard, upstreamReplica);
46
- return { subscriptionState, changeSource };
47
- }
48
- finally {
49
- await db.end();
50
- }
34
+ async function initializePostgresChangeSource(lc, upstreamURI, shard, replicaDbFile, syncOptions) {
35
+ await initSyncSchema(
36
+ lc,
37
+ `replica-${shard.appID}-${shard.shardNum}`,
38
+ shard,
39
+ replicaDbFile,
40
+ upstreamURI,
41
+ syncOptions
42
+ );
43
+ const replica = new Database(lc, replicaDbFile);
44
+ const subscriptionState = getSubscriptionState(new StatementRunner(replica));
45
+ replica.close();
46
+ const db = pgClient(lc, upstreamURI);
47
+ try {
48
+ const upstreamReplica = await checkAndUpdateUpstream(
49
+ lc,
50
+ db,
51
+ shard,
52
+ subscriptionState
53
+ );
54
+ const changeSource = new PostgresChangeSource(
55
+ lc,
56
+ upstreamURI,
57
+ shard,
58
+ upstreamReplica
59
+ );
60
+ return { subscriptionState, changeSource };
61
+ } finally {
62
+ await db.end();
63
+ }
51
64
  }
52
65
  async function checkAndUpdateUpstream(lc, sql, shard, { replicaVersion, publications: subscribed }) {
53
- // Perform any shard schema updates
54
- await updateShardSchema(lc, sql, shard, replicaVersion);
55
- const upstreamReplica = await getReplicaAtVersion(lc, sql, shard, replicaVersion);
56
- if (!upstreamReplica) {
57
- throw new AutoResetSignal(`No replication slot for replica at version ${replicaVersion}`);
58
- }
59
- // Verify that the publications match what is being replicated.
60
- const requested = [...shard.publications].sort();
61
- const replicated = upstreamReplica.publications
62
- .filter(p => !p.startsWith(internalPublicationPrefix(shard)))
63
- .sort();
64
- if (!deepEqual(requested, replicated)) {
65
- lc.warn?.(`Dropping shard to change publications to: [${requested}]`);
66
- await sql.unsafe(dropShard(shard.appID, shard.shardNum));
67
- throw new AutoResetSignal(`Requested publications [${requested}] do not match configured ` +
68
- `publications: [${replicated}]`);
69
- }
70
- // Sanity check: The subscription state on the replica should have the
71
- // same publications. This should be guaranteed by the equivalence of the
72
- // replicaVersion, but it doesn't hurt to verify.
73
- if (!deepEqual(upstreamReplica.publications, subscribed)) {
74
- throw new AutoResetSignal(`Upstream publications [${upstreamReplica.publications}] do not ` +
75
- `match subscribed publications [${subscribed}]`);
76
- }
77
- // Verify that the publications exist.
78
- const exists = await sql `
66
+ await updateShardSchema(lc, sql, shard, replicaVersion);
67
+ const upstreamReplica = await getReplicaAtVersion(
68
+ lc,
69
+ sql,
70
+ shard,
71
+ replicaVersion
72
+ );
73
+ if (!upstreamReplica) {
74
+ throw new AutoResetSignal(
75
+ `No replication slot for replica at version ${replicaVersion}`
76
+ );
77
+ }
78
+ const requested = [...shard.publications].sort();
79
+ const replicated = upstreamReplica.publications.filter((p) => !p.startsWith(internalPublicationPrefix(shard))).sort();
80
+ if (!deepEqual(requested, replicated)) {
81
+ lc.warn?.(`Dropping shard to change publications to: [${requested}]`);
82
+ await sql.unsafe(dropShard(shard.appID, shard.shardNum));
83
+ throw new AutoResetSignal(
84
+ `Requested publications [${requested}] do not match configured publications: [${replicated}]`
85
+ );
86
+ }
87
+ if (!deepEqual(upstreamReplica.publications, subscribed)) {
88
+ throw new AutoResetSignal(
89
+ `Upstream publications [${upstreamReplica.publications}] do not match subscribed publications [${subscribed}]`
90
+ );
91
+ }
92
+ const exists = await sql`
79
93
  SELECT pubname FROM pg_publication WHERE pubname IN ${sql(subscribed)};
80
94
  `.values();
81
- if (exists.length !== subscribed.length) {
82
- throw new AutoResetSignal(`Upstream publications [${exists.flat()}] do not contain ` +
83
- `all subscribed publications [${subscribed}]`);
84
- }
85
- const { slot } = upstreamReplica;
86
- const result = await sql `
95
+ if (exists.length !== subscribed.length) {
96
+ throw new AutoResetSignal(
97
+ `Upstream publications [${exists.flat()}] do not contain all subscribed publications [${subscribed}]`
98
+ );
99
+ }
100
+ const { slot } = upstreamReplica;
101
+ const result = await sql`
87
102
  SELECT restart_lsn as "restartLSN", wal_status as "walStatus" FROM pg_replication_slots
88
103
  WHERE slot_name = ${slot}`;
89
- if (result.length === 0) {
90
- throw new AutoResetSignal(`replication slot ${slot} is missing`);
91
- }
92
- const [{ restartLSN, walStatus }] = result;
93
- if (restartLSN === null || walStatus === 'lost') {
94
- throw new AutoResetSignal(`replication slot ${slot} has been invalidated for exceeding the max_slot_wal_keep_size`);
95
- }
96
- return upstreamReplica;
104
+ if (result.length === 0) {
105
+ throw new AutoResetSignal(`replication slot ${slot} is missing`);
106
+ }
107
+ const [{ restartLSN, walStatus }] = result;
108
+ if (restartLSN === null || walStatus === "lost") {
109
+ throw new AutoResetSignal(
110
+ `replication slot ${slot} has been invalidated for exceeding the max_slot_wal_keep_size`
111
+ );
112
+ }
113
+ return upstreamReplica;
97
114
  }
98
- /**
99
- * Postgres implementation of a {@link ChangeSource} backed by a logical
100
- * replication stream.
101
- */
102
115
  class PostgresChangeSource {
103
- #lc;
104
- #upstreamUri;
105
- #shard;
106
- #replica;
107
- constructor(lc, upstreamUri, shard, replica) {
108
- this.#lc = lc.withContext('component', 'change-source');
109
- this.#upstreamUri = upstreamUri;
110
- this.#shard = shard;
111
- this.#replica = replica;
112
- }
113
- async startStream(clientWatermark) {
114
- const db = pgClient(this.#lc, this.#upstreamUri, {}, 'json-as-string');
115
- const { slot } = this.#replica;
116
- let cleanup = promiseVoid;
117
- try {
118
- ({ cleanup } = await this.#stopExistingReplicationSlotSubscribers(db, slot));
119
- const config = await getInternalShardConfig(db, this.#shard);
120
- this.#lc.info?.(`starting replication stream@${slot}`);
121
- return await this.#startStream(db, slot, clientWatermark, config);
122
- }
123
- finally {
124
- void cleanup.then(() => db.end());
116
+ #lc;
117
+ #upstreamUri;
118
+ #shard;
119
+ #replica;
120
+ constructor(lc, upstreamUri, shard, replica) {
121
+ this.#lc = lc.withContext("component", "change-source");
122
+ this.#upstreamUri = upstreamUri;
123
+ this.#shard = shard;
124
+ this.#replica = replica;
125
+ }
126
+ async startStream(clientWatermark) {
127
+ const db = pgClient(this.#lc, this.#upstreamUri, {}, "json-as-string");
128
+ const { slot } = this.#replica;
129
+ let cleanup = promiseVoid;
130
+ try {
131
+ ({ cleanup } = await this.#stopExistingReplicationSlotSubscribers(
132
+ db,
133
+ slot
134
+ ));
135
+ const config = await getInternalShardConfig(db, this.#shard);
136
+ this.#lc.info?.(`starting replication stream@${slot}`);
137
+ return await this.#startStream(db, slot, clientWatermark, config);
138
+ } finally {
139
+ void cleanup.then(() => db.end());
140
+ }
141
+ }
142
+ async #startStream(db, slot, clientWatermark, shardConfig) {
143
+ const clientStart = oneAfter(clientWatermark);
144
+ const { messages, acks } = await subscribe(
145
+ this.#lc,
146
+ db,
147
+ slot,
148
+ [...shardConfig.publications],
149
+ versionFromLexi(clientStart)
150
+ );
151
+ const changes = Subscription.create({
152
+ cleanup: () => messages.cancel()
153
+ });
154
+ const acker = new Acker(acks);
155
+ const changeMaker = new ChangeMaker(
156
+ this.#lc,
157
+ this.#shard,
158
+ shardConfig,
159
+ this.#replica.initialSchema,
160
+ this.#upstreamUri
161
+ );
162
+ void (async function() {
163
+ try {
164
+ for await (const [lsn, msg] of messages) {
165
+ if (msg.tag === "keepalive") {
166
+ changes.push(["status", msg, { watermark: versionToLexi(lsn) }]);
167
+ continue;
168
+ }
169
+ let last;
170
+ for (const change of await changeMaker.makeChanges(lsn, msg)) {
171
+ last = changes.push(change);
172
+ }
173
+ await last?.result;
125
174
  }
126
- }
127
- async #startStream(db, slot, clientWatermark, shardConfig) {
128
- const clientStart = oneAfter(clientWatermark);
129
- const { messages, acks } = await subscribe(this.#lc, db, slot, [...shardConfig.publications], versionFromLexi(clientStart));
130
- const changes = Subscription.create({
131
- cleanup: () => messages.cancel(),
132
- });
133
- const acker = new Acker(acks);
134
- const changeMaker = new ChangeMaker(this.#lc, this.#shard, shardConfig, this.#replica.initialSchema, this.#upstreamUri);
135
- void (async function () {
136
- try {
137
- for await (const [lsn, msg] of messages) {
138
- if (msg.tag === 'keepalive') {
139
- changes.push(['status', msg, { watermark: versionToLexi(lsn) }]);
140
- continue;
141
- }
142
- let last;
143
- for (const change of await changeMaker.makeChanges(lsn, msg)) {
144
- last = changes.push(change);
145
- }
146
- await last?.result; // Allow the change-streamer to push back.
147
- }
148
- }
149
- catch (e) {
150
- changes.fail(translateError(e));
151
- }
152
- })();
153
- this.#lc.info?.(`started replication stream@${slot} from ${clientWatermark} (replicaVersion: ${this.#replica.version})`);
154
- return {
155
- changes,
156
- acks: { push: status => acker.ack(status[2].watermark) },
157
- };
158
- }
159
- /**
160
- * Stops replication slots associated with this shard, and returns
161
- * a `cleanup` task that drops any slot other than the specified
162
- * `slotToKeep`.
163
- *
164
- * Note that replication slots created after `slotToKeep` (as indicated by
165
- * the timestamp suffix) are preserved, as those are newly syncing replicas
166
- * that will soon take over the slot.
167
- */
168
- async #stopExistingReplicationSlotSubscribers(sql, slotToKeep) {
169
- const slotExpression = replicationSlotExpression(this.#shard);
170
- const legacySlotName = legacyReplicationSlot(this.#shard);
171
- // Note: `slot_name <= slotToKeep` uses a string compare of the millisecond
172
- // timestamp, which works until it exceeds 13 digits (sometime in 2286).
173
- const result = await sql `
175
+ } catch (e) {
176
+ changes.fail(translateError(e));
177
+ }
178
+ })();
179
+ this.#lc.info?.(
180
+ `started replication stream@${slot} from ${clientWatermark} (replicaVersion: ${this.#replica.version})`
181
+ );
182
+ return {
183
+ changes,
184
+ acks: { push: (status) => acker.ack(status[2].watermark) }
185
+ };
186
+ }
187
+ /**
188
+ * Stops replication slots associated with this shard, and returns
189
+ * a `cleanup` task that drops any slot other than the specified
190
+ * `slotToKeep`.
191
+ *
192
+ * Note that replication slots created after `slotToKeep` (as indicated by
193
+ * the timestamp suffix) are preserved, as those are newly syncing replicas
194
+ * that will soon take over the slot.
195
+ */
196
+ async #stopExistingReplicationSlotSubscribers(sql, slotToKeep) {
197
+ const slotExpression = replicationSlotExpression(this.#shard);
198
+ const legacySlotName = legacyReplicationSlot(this.#shard);
199
+ const result = await sql`
174
200
  SELECT slot_name as slot, pg_terminate_backend(active_pid), active_pid as pid
175
201
  FROM pg_replication_slots
176
202
  WHERE (slot_name LIKE ${slotExpression} OR slot_name = ${legacySlotName})
177
203
  AND slot_name <= ${slotToKeep}`;
178
- if (result.length === 0) {
179
- throw new AbortError(`replication slot ${slotToKeep} is missing. A different ` +
180
- `replication-manager should now be running on a new ` +
181
- `replication slot.`);
182
- }
183
- // Clean up the replicas table.
184
- const replicasTable = `${upstreamSchema(this.#shard)}.replicas`;
185
- await sql `DELETE FROM ${sql(replicasTable)} WHERE slot != ${slotToKeep}`;
186
- const pids = result.filter(({ pid }) => pid !== null).map(({ pid }) => pid);
187
- if (pids.length) {
188
- this.#lc.info?.(`signaled subscriber ${pids} to shut down`);
189
- }
190
- const otherSlots = result
191
- .filter(({ slot }) => slot !== slotToKeep)
192
- .map(({ slot }) => slot);
193
- return {
194
- cleanup: otherSlots.length
195
- ? this.#dropReplicationSlots(sql, otherSlots)
196
- : promiseVoid,
197
- };
198
- }
199
- async #dropReplicationSlots(sql, slots) {
200
- this.#lc.info?.(`dropping other replication slot(s) ${slots}`);
201
- for (let i = 0; i < 5; i++) {
202
- try {
203
- await sql `
204
+ if (result.length === 0) {
205
+ throw new AbortError(
206
+ `replication slot ${slotToKeep} is missing. A different replication-manager should now be running on a new replication slot.`
207
+ );
208
+ }
209
+ const replicasTable = `${upstreamSchema(this.#shard)}.replicas`;
210
+ await sql`DELETE FROM ${sql(replicasTable)} WHERE slot != ${slotToKeep}`;
211
+ const pids = result.filter(({ pid }) => pid !== null).map(({ pid }) => pid);
212
+ if (pids.length) {
213
+ this.#lc.info?.(`signaled subscriber ${pids} to shut down`);
214
+ }
215
+ const otherSlots = result.filter(({ slot }) => slot !== slotToKeep).map(({ slot }) => slot);
216
+ return {
217
+ cleanup: otherSlots.length ? this.#dropReplicationSlots(sql, otherSlots) : promiseVoid
218
+ };
219
+ }
220
+ async #dropReplicationSlots(sql, slots) {
221
+ this.#lc.info?.(`dropping other replication slot(s) ${slots}`);
222
+ for (let i = 0; i < 5; i++) {
223
+ try {
224
+ await sql`
204
225
  SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots
205
226
  WHERE slot_name IN ${sql(slots)}
206
227
  `;
207
- this.#lc.info?.(`successfully dropped ${slots}`);
208
- return;
209
- }
210
- catch (e) {
211
- // error: replication slot "zero_slot_change_source_test_id" is active for PID 268
212
- if (e instanceof postgres.PostgresError &&
213
- e.code === PG_OBJECT_IN_USE) {
214
- // The freeing up of the replication slot is not transactional;
215
- // sometimes it takes time for Postgres to consider the slot
216
- // inactive.
217
- this.#lc.debug?.(`attempt ${i + 1}: ${String(e)}`, e);
218
- }
219
- else {
220
- this.#lc.warn?.(`error dropping ${slots}`, e);
221
- }
222
- await sleep(1000);
223
- }
228
+ this.#lc.info?.(`successfully dropped ${slots}`);
229
+ return;
230
+ } catch (e) {
231
+ if (e instanceof postgres.PostgresError && e.code === PG_OBJECT_IN_USE) {
232
+ this.#lc.debug?.(`attempt ${i + 1}: ${String(e)}`, e);
233
+ } else {
234
+ this.#lc.warn?.(`error dropping ${slots}`, e);
224
235
  }
225
- this.#lc.warn?.(`maximum attempts exceeded dropping ${slots}`);
236
+ await sleep(1e3);
237
+ }
226
238
  }
239
+ this.#lc.warn?.(`maximum attempts exceeded dropping ${slots}`);
240
+ }
227
241
  }
228
- // Exported for testing.
229
- export class Acker {
230
- #acks;
231
- #keepaliveTimer;
232
- constructor(acks) {
233
- this.#acks = acks;
234
- }
235
- keepalive() {
236
- // Sets a timeout to send a standby status update in response to
237
- // a primary keepalive message.
238
- //
239
- // https://www.postgresql.org/docs/current/protocol-replication.html#PROTOCOL-REPLICATION-PRIMARY-KEEPALIVE-MESSAGE
240
- //
241
- // A primary keepalive message is streamed to the change-streamer as a
242
- // 'status' message, which in turn responds with an ack. However, in the
243
- // event that the change-streamer is backed up processing preceding
244
- // changes, this timeout will fire to send a status update that does not
245
- // change the confirmed flush position. This timeout must be shorter than
246
- // the `wal_sender_timeout`, which defaults to 60 seconds.
247
- //
248
- // https://www.postgresql.org/docs/current/runtime-config-replication.html#GUC-WAL-SENDER-TIMEOUT
249
- this.#keepaliveTimer ??= setTimeout(() => this.#sendAck(), 1000);
250
- }
251
- ack(watermark) {
252
- this.#sendAck(watermark);
253
- }
254
- #sendAck(watermark) {
255
- clearTimeout(this.#keepaliveTimer);
256
- this.#keepaliveTimer = undefined;
257
- // Note: Sending '0/0' means "keep alive but do not update confirmed_flush_lsn"
258
- // https://github.com/postgres/postgres/blob/3edc67d337c2e498dad1cd200e460f7c63e512e6/src/backend/replication/walsender.c#L2457
259
- const lsn = watermark ? versionFromLexi(watermark) : 0n;
260
- this.#acks.push(lsn);
261
- }
242
+ class Acker {
243
+ #acks;
244
+ #keepaliveTimer;
245
+ constructor(acks) {
246
+ this.#acks = acks;
247
+ }
248
+ keepalive() {
249
+ this.#keepaliveTimer ??= setTimeout(() => this.#sendAck(), 1e3);
250
+ }
251
+ ack(watermark) {
252
+ this.#sendAck(watermark);
253
+ }
254
+ #sendAck(watermark) {
255
+ clearTimeout(this.#keepaliveTimer);
256
+ this.#keepaliveTimer = void 0;
257
+ const lsn = watermark ? versionFromLexi(watermark) : 0n;
258
+ this.#acks.push(lsn);
259
+ }
262
260
  }
263
261
  const SET_REPLICA_IDENTITY_DELAY_MS = 500;
264
262
  class ChangeMaker {
265
- #lc;
266
- #shardPrefix;
267
- #shardConfig;
268
- #initialSchema;
269
- #upstreamDB;
270
- #replicaIdentityTimer;
271
- #error;
272
- constructor(lc, { appID, shardNum }, shardConfig, initialSchema, upstreamURI) {
273
- this.#lc = lc;
274
- // Note: This matches the prefix used in pg_logical_emit_message() in pg/schema/ddl.ts.
275
- this.#shardPrefix = `${appID}/${shardNum}`;
276
- this.#shardConfig = shardConfig;
277
- this.#initialSchema = initialSchema;
278
- this.#upstreamDB = pgClient(lc, upstreamURI, {
279
- ['idle_timeout']: 10, // only used occasionally
280
- connection: { ['application_name']: 'zero-schema-change-detector' },
281
- });
282
- }
283
- async makeChanges(lsn, msg) {
284
- if (this.#error) {
285
- this.#logError(this.#error);
286
- return [];
287
- }
288
- try {
289
- return await this.#makeChanges(msg);
290
- }
291
- catch (err) {
292
- this.#error = { lsn, msg, err, lastLogTime: 0 };
293
- this.#logError(this.#error);
294
- // Rollback the current transaction to avoid dangling transactions in
295
- // downstream processors (i.e. changeLog, replicator).
296
- return [
297
- ['rollback', { tag: 'rollback' }],
298
- ['control', { tag: 'reset-required' }],
299
- ];
300
- }
301
- }
302
- #logError(error) {
303
- const { lsn, msg, err, lastLogTime } = error;
304
- const now = Date.now();
305
- // Output an error to logs as replication messages continue to be dropped,
306
- // at most once a minute.
307
- if (now - lastLogTime > 60_000) {
308
- this.#lc.error?.(`Unable to continue replication from LSN ${fromBigInt(lsn)}: ${String(err)}`,
309
- // 'content' can be a large byte Buffer. Exclude it from logging output.
310
- { ...msg, content: undefined });
311
- error.lastLogTime = now;
312
- }
263
+ #lc;
264
+ #shardPrefix;
265
+ #shardConfig;
266
+ #initialSchema;
267
+ #upstreamDB;
268
+ #replicaIdentityTimer;
269
+ #error;
270
+ constructor(lc, { appID, shardNum }, shardConfig, initialSchema, upstreamURI) {
271
+ this.#lc = lc;
272
+ this.#shardPrefix = `${appID}/${shardNum}`;
273
+ this.#shardConfig = shardConfig;
274
+ this.#initialSchema = initialSchema;
275
+ this.#upstreamDB = pgClient(lc, upstreamURI, {
276
+ ["idle_timeout"]: 10,
277
+ // only used occasionally
278
+ connection: { ["application_name"]: "zero-schema-change-detector" }
279
+ });
280
+ }
281
+ async makeChanges(lsn, msg) {
282
+ if (this.#error) {
283
+ this.#logError(this.#error);
284
+ return [];
313
285
  }
314
- // oxlint-disable-next-line require-await
315
- async #makeChanges(msg) {
316
- switch (msg.tag) {
317
- case 'begin':
318
- return [
319
- [
320
- 'begin',
321
- { ...msg, json: 's' },
322
- { commitWatermark: toLexiVersion(must(msg.commitLsn)) },
323
- ],
324
- ];
325
- case 'delete': {
326
- if (!(msg.key ?? msg.old)) {
327
- throw new Error(`Invalid DELETE msg (missing key): ${stringify(msg)}`);
328
- }
329
- return [
330
- [
331
- 'data',
332
- {
333
- ...msg,
334
- relation: withoutColumns(msg.relation),
335
- // https://www.postgresql.org/docs/current/protocol-logicalrep-message-formats.html#PROTOCOL-LOGICALREP-MESSAGE-FORMATS-DELETE
336
- key: must(msg.old ?? msg.key),
337
- },
338
- ],
339
- ];
340
- }
341
- case 'update': {
342
- return [
343
- [
344
- 'data',
345
- {
346
- ...msg,
347
- relation: withoutColumns(msg.relation),
348
- // https://www.postgresql.org/docs/current/protocol-logicalrep-message-formats.html#PROTOCOL-LOGICALREP-MESSAGE-FORMATS-UPDATE
349
- key: msg.old ?? msg.key,
350
- },
351
- ],
352
- ];
353
- }
354
- case 'insert':
355
- return [['data', { ...msg, relation: withoutColumns(msg.relation) }]];
356
- case 'truncate':
357
- return [
358
- ['data', { ...msg, relations: msg.relations.map(withoutColumns) }],
359
- ];
360
- case 'message':
361
- if (msg.prefix !== this.#shardPrefix) {
362
- this.#lc.debug?.('ignoring message for different shard', msg.prefix);
363
- return [];
364
- }
365
- return this.#handleCustomMessage(msg);
366
- case 'commit':
367
- return [
368
- ['commit', msg, { watermark: toLexiVersion(must(msg.commitLsn)) }],
369
- ];
370
- case 'relation':
371
- return this.#handleRelation(msg);
372
- case 'type':
373
- return []; // Nothing need be done for custom types.
374
- case 'origin':
375
- // No need to detect replication loops since we are not a
376
- // PG replication source.
377
- return [];
378
- default:
379
- msg;
380
- throw new Error(`Unexpected message type ${stringify(msg)}`);
381
- }
382
- }
383
- #preSchema;
384
- #handleCustomMessage(msg) {
385
- const event = this.#parseReplicationEvent(msg.content);
386
- // Cancel manual schema adjustment timeouts when an upstream schema change
387
- // is about to happen, so as to avoid interfering / redundant work.
388
- clearTimeout(this.#replicaIdentityTimer);
389
- if (event.type === 'ddlStart') {
390
- // Store the schema in order to diff it with a potential ddlUpdate.
391
- this.#preSchema = event.schema;
392
- return [];
393
- }
394
- // ddlUpdate
395
- const changes = this.#makeSchemaChanges(must(this.#preSchema, `ddlUpdate received without a ddlStart`), event).map(change => ['data', change]);
396
- this.#lc
397
- .withContext('query', event.context.query)
398
- .info?.(`${changes.length} schema change(s)`, changes);
399
- const replicaIdentities = replicaIdentitiesForTablesWithoutPrimaryKeys(event.schema);
400
- if (replicaIdentities) {
401
- this.#replicaIdentityTimer = setTimeout(async () => {
402
- try {
403
- await replicaIdentities.apply(this.#lc, this.#upstreamDB);
404
- }
405
- catch (err) {
406
- this.#lc.warn?.(`error setting replica identities`, err);
407
- }
408
- }, SET_REPLICA_IDENTITY_DELAY_MS);
409
- }
410
- return changes;
411
- }
412
- /**
413
- * A note on operation order:
414
- *
415
- * Postgres will drop related indexes when columns are dropped,
416
- * but SQLite will error instead (https://sqlite.org/forum/forumpost/2e62dba69f?t=c&hist).
417
- * The current workaround is to drop indexes first.
418
- *
419
- * Also note that although it should not be possible to both rename and
420
- * add/drop tables/columns in a single statement, the operations are
421
- * ordered to handle that possibility, by always dropping old entities,
422
- * then modifying kept entities, and then adding new entities.
423
- *
424
- * Thus, the order of replicating DDL updates is:
425
- * - drop indexes
426
- * - drop tables
427
- * - alter tables
428
- * - drop columns
429
- * - alter columns
430
- * - add columns
431
- * - create tables
432
- * - create indexes
433
- *
434
- * In the future the replication logic should be improved to handle this
435
- * behavior in SQLite by dropping dependent indexes manually before dropping
436
- * columns. This, for example, would be needed to properly support changing
437
- * the type of a column that's indexed.
438
- */
439
- #makeSchemaChanges(preSchema, update) {
440
- const [prevTbl, prevIdx] = specsByID(preSchema);
441
- const [nextTbl, nextIdx] = specsByID(update.schema);
442
- const changes = [];
443
- // Validate the new table schemas
444
- for (const table of nextTbl.values()) {
445
- validate(this.#lc, table, update.schema.indexes);
446
- }
447
- const [droppedIdx, createdIdx] = symmetricDifferences(prevIdx, nextIdx);
448
- for (const id of droppedIdx) {
449
- const { schema, name } = must(prevIdx.get(id));
450
- changes.push({ tag: 'drop-index', id: { schema, name } });
451
- }
452
- // DROP
453
- const [droppedTbl, createdTbl] = symmetricDifferences(prevTbl, nextTbl);
454
- for (const id of droppedTbl) {
455
- const { schema, name } = must(prevTbl.get(id));
456
- changes.push({ tag: 'drop-table', id: { schema, name } });
457
- }
458
- // ALTER
459
- const tables = intersection(prevTbl, nextTbl);
460
- for (const id of tables) {
461
- changes.push(...this.#getTableChanges(must(prevTbl.get(id)), must(nextTbl.get(id))));
462
- }
463
- // CREATE
464
- for (const id of createdTbl) {
465
- const spec = must(nextTbl.get(id));
466
- changes.push({ tag: 'create-table', spec });
467
- }
468
- // Add indexes last since they may reference tables / columns that need
469
- // to be created first.
470
- for (const id of createdIdx) {
471
- const spec = must(nextIdx.get(id));
472
- changes.push({ tag: 'create-index', spec });
473
- }
474
- return changes;
475
- }
476
- #getTableChanges(oldTable, newTable) {
477
- const changes = [];
478
- if (oldTable.schema !== newTable.schema ||
479
- oldTable.name !== newTable.name) {
480
- changes.push({
481
- tag: 'rename-table',
482
- old: { schema: oldTable.schema, name: oldTable.name },
483
- new: { schema: newTable.schema, name: newTable.name },
484
- });
485
- }
486
- const table = { schema: newTable.schema, name: newTable.name };
487
- const oldColumns = columnsByID(oldTable.columns);
488
- const newColumns = columnsByID(newTable.columns);
489
- // DROP
490
- const [dropped, added] = symmetricDifferences(oldColumns, newColumns);
491
- for (const id of dropped) {
492
- const { name: column } = must(oldColumns.get(id));
493
- changes.push({ tag: 'drop-column', table, column });
494
- }
495
- // ALTER
496
- const both = intersection(oldColumns, newColumns);
497
- for (const id of both) {
498
- const { name: oldName, ...oldSpec } = must(oldColumns.get(id));
499
- const { name: newName, ...newSpec } = must(newColumns.get(id));
500
- // The three things that we care about are:
501
- // 1. name
502
- // 2. type
503
- // 3. not-null
504
- if (oldName !== newName ||
505
- oldSpec.dataType !== newSpec.dataType ||
506
- oldSpec.notNull !== newSpec.notNull) {
507
- changes.push({
508
- tag: 'update-column',
509
- table,
510
- old: { name: oldName, spec: oldSpec },
511
- new: { name: newName, spec: newSpec },
512
- });
513
- }
286
+ try {
287
+ return await this.#makeChanges(msg);
288
+ } catch (err) {
289
+ this.#error = { lsn, msg, err, lastLogTime: 0 };
290
+ this.#logError(this.#error);
291
+ return [
292
+ ["rollback", { tag: "rollback" }],
293
+ ["control", { tag: "reset-required" }]
294
+ ];
295
+ }
296
+ }
297
+ #logError(error) {
298
+ const { lsn, msg, err, lastLogTime } = error;
299
+ const now = Date.now();
300
+ if (now - lastLogTime > 6e4) {
301
+ this.#lc.error?.(
302
+ `Unable to continue replication from LSN ${fromBigInt(lsn)}: ${String(
303
+ err
304
+ )}`,
305
+ // 'content' can be a large byte Buffer. Exclude it from logging output.
306
+ { ...msg, content: void 0 }
307
+ );
308
+ error.lastLogTime = now;
309
+ }
310
+ }
311
+ // oxlint-disable-next-line require-await
312
+ async #makeChanges(msg) {
313
+ switch (msg.tag) {
314
+ case "begin":
315
+ return [
316
+ [
317
+ "begin",
318
+ { ...msg, json: "s" },
319
+ { commitWatermark: toLexiVersion(must(msg.commitLsn)) }
320
+ ]
321
+ ];
322
+ case "delete": {
323
+ if (!(msg.key ?? msg.old)) {
324
+ throw new Error(
325
+ `Invalid DELETE msg (missing key): ${stringify(msg)}`
326
+ );
514
327
  }
515
- // ADD
516
- for (const id of added) {
517
- const { name, ...spec } = must(newColumns.get(id));
518
- const column = { name, spec };
519
- try {
520
- // Validate that the ChangeProcessor will accept the column change.
521
- mapPostgresToLiteColumn(table.name, column);
328
+ return [
329
+ [
330
+ "data",
331
+ {
332
+ ...msg,
333
+ relation: withoutColumns(msg.relation),
334
+ // https://www.postgresql.org/docs/current/protocol-logicalrep-message-formats.html#PROTOCOL-LOGICALREP-MESSAGE-FORMATS-DELETE
335
+ key: must(msg.old ?? msg.key)
522
336
  }
523
- catch (cause) {
524
- throw new UnsupportedSchemaChangeError(String(cause), { cause });
337
+ ]
338
+ ];
339
+ }
340
+ case "update": {
341
+ return [
342
+ [
343
+ "data",
344
+ {
345
+ ...msg,
346
+ relation: withoutColumns(msg.relation),
347
+ // https://www.postgresql.org/docs/current/protocol-logicalrep-message-formats.html#PROTOCOL-LOGICALREP-MESSAGE-FORMATS-UPDATE
348
+ key: msg.old ?? msg.key
525
349
  }
526
- changes.push({ tag: 'add-column', table, column });
527
- }
528
- return changes;
529
- }
530
- #parseReplicationEvent(content) {
531
- const str = content instanceof Buffer
532
- ? content.toString('utf-8')
533
- : new TextDecoder().decode(content);
534
- const json = JSON.parse(str);
535
- return v.parse(json, replicationEventSchema, 'passthrough');
536
- }
537
- /**
538
- * If `ddlDetection === true`, relation messages are irrelevant,
539
- * as schema changes are detected by event triggers that
540
- * emit custom messages.
541
- *
542
- * For degraded-mode replication (`ddlDetection === false`):
543
- * 1. query the current published schemas on upstream
544
- * 2. compare that with the InternalShardConfig.initialSchema
545
- * 3. compare that with the incoming MessageRelation
546
- * 4. On any discrepancy, throw an UnsupportedSchemaChangeError
547
- * to halt replication.
548
- *
549
- * Note that schemas queried in step [1] will be *post-transaction*
550
- * schemas, which are not necessarily suitable for actually processing
551
- * the statements in the transaction being replicated. In other words,
552
- * this mechanism cannot be used to reliably *replicate* schema changes.
553
- * However, they serve the purpose determining if schemas have changed.
554
- */
555
- async #handleRelation(rel) {
556
- const { publications, ddlDetection } = this.#shardConfig;
557
- if (ddlDetection) {
558
- return [];
559
- }
560
- const currentSchema = await getPublicationInfo(this.#upstreamDB, publications);
561
- const difference = getSchemaDifference(this.#initialSchema, currentSchema);
562
- if (difference !== null) {
563
- throw new MissingEventTriggerSupport(difference);
564
- }
565
- // Even if the currentSchema is equal to the initialSchema, the
566
- // MessageRelation itself must be checked to detect transient
567
- // schema changes within the transaction (e.g. adding and dropping
568
- // a table, or renaming a column and then renaming it back).
569
- const orel = this.#initialSchema.tables.find(t => t.oid === rel.relationOid);
570
- if (!orel) {
571
- // Can happen if a table is created and then dropped in the same transaction.
572
- throw new MissingEventTriggerSupport(`relation not in initialSchema: ${stringify(rel)}`);
573
- }
574
- if (relationDifferent(orel, rel)) {
575
- throw new MissingEventTriggerSupport(`relation has changed within the transaction: ${stringify(orel)} vs ${stringify(rel)}`);
350
+ ]
351
+ ];
352
+ }
353
+ case "insert":
354
+ return [["data", { ...msg, relation: withoutColumns(msg.relation) }]];
355
+ case "truncate":
356
+ return [
357
+ ["data", { ...msg, relations: msg.relations.map(withoutColumns) }]
358
+ ];
359
+ case "message":
360
+ if (msg.prefix !== this.#shardPrefix) {
361
+ this.#lc.debug?.("ignoring message for different shard", msg.prefix);
362
+ return [];
576
363
  }
364
+ return this.#handleCustomMessage(msg);
365
+ case "commit":
366
+ return [
367
+ ["commit", msg, { watermark: toLexiVersion(must(msg.commitLsn)) }]
368
+ ];
369
+ case "relation":
370
+ return this.#handleRelation(msg);
371
+ case "type":
577
372
  return [];
578
- }
373
+ // Nothing need be done for custom types.
374
+ case "origin":
375
+ return [];
376
+ default:
377
+ throw new Error(`Unexpected message type ${stringify(msg)}`);
378
+ }
379
+ }
380
+ #preSchema;
381
+ #handleCustomMessage(msg) {
382
+ const event = this.#parseReplicationEvent(msg.content);
383
+ clearTimeout(this.#replicaIdentityTimer);
384
+ if (event.type === "ddlStart") {
385
+ this.#preSchema = event.schema;
386
+ return [];
387
+ }
388
+ const changes = this.#makeSchemaChanges(
389
+ must(this.#preSchema, `ddlUpdate received without a ddlStart`),
390
+ event
391
+ ).map((change) => ["data", change]);
392
+ this.#lc.withContext("query", event.context.query).info?.(`${changes.length} schema change(s)`, changes);
393
+ const replicaIdentities = replicaIdentitiesForTablesWithoutPrimaryKeys(
394
+ event.schema
395
+ );
396
+ if (replicaIdentities) {
397
+ this.#replicaIdentityTimer = setTimeout(async () => {
398
+ try {
399
+ await replicaIdentities.apply(this.#lc, this.#upstreamDB);
400
+ } catch (err) {
401
+ this.#lc.warn?.(`error setting replica identities`, err);
402
+ }
403
+ }, SET_REPLICA_IDENTITY_DELAY_MS);
404
+ }
405
+ return changes;
406
+ }
407
+ /**
408
+ * A note on operation order:
409
+ *
410
+ * Postgres will drop related indexes when columns are dropped,
411
+ * but SQLite will error instead (https://sqlite.org/forum/forumpost/2e62dba69f?t=c&hist).
412
+ * The current workaround is to drop indexes first.
413
+ *
414
+ * Also note that although it should not be possible to both rename and
415
+ * add/drop tables/columns in a single statement, the operations are
416
+ * ordered to handle that possibility, by always dropping old entities,
417
+ * then modifying kept entities, and then adding new entities.
418
+ *
419
+ * Thus, the order of replicating DDL updates is:
420
+ * - drop indexes
421
+ * - drop tables
422
+ * - alter tables
423
+ * - drop columns
424
+ * - alter columns
425
+ * - add columns
426
+ * - create tables
427
+ * - create indexes
428
+ *
429
+ * In the future the replication logic should be improved to handle this
430
+ * behavior in SQLite by dropping dependent indexes manually before dropping
431
+ * columns. This, for example, would be needed to properly support changing
432
+ * the type of a column that's indexed.
433
+ */
434
+ #makeSchemaChanges(preSchema, update) {
435
+ const [prevTbl, prevIdx] = specsByID(preSchema);
436
+ const [nextTbl, nextIdx] = specsByID(update.schema);
437
+ const changes = [];
438
+ for (const table of nextTbl.values()) {
439
+ validate(this.#lc, table, update.schema.indexes);
440
+ }
441
+ const [droppedIdx, createdIdx] = symmetricDifferences(prevIdx, nextIdx);
442
+ for (const id of droppedIdx) {
443
+ const { schema, name } = must(prevIdx.get(id));
444
+ changes.push({ tag: "drop-index", id: { schema, name } });
445
+ }
446
+ const [droppedTbl, createdTbl] = symmetricDifferences(prevTbl, nextTbl);
447
+ for (const id of droppedTbl) {
448
+ const { schema, name } = must(prevTbl.get(id));
449
+ changes.push({ tag: "drop-table", id: { schema, name } });
450
+ }
451
+ const tables = intersection(prevTbl, nextTbl);
452
+ for (const id of tables) {
453
+ changes.push(
454
+ ...this.#getTableChanges(must(prevTbl.get(id)), must(nextTbl.get(id)))
455
+ );
456
+ }
457
+ for (const id of createdTbl) {
458
+ const spec = must(nextTbl.get(id));
459
+ changes.push({ tag: "create-table", spec });
460
+ }
461
+ for (const id of createdIdx) {
462
+ const spec = must(nextIdx.get(id));
463
+ changes.push({ tag: "create-index", spec });
464
+ }
465
+ return changes;
466
+ }
467
+ #getTableChanges(oldTable, newTable) {
468
+ const changes = [];
469
+ if (oldTable.schema !== newTable.schema || oldTable.name !== newTable.name) {
470
+ changes.push({
471
+ tag: "rename-table",
472
+ old: { schema: oldTable.schema, name: oldTable.name },
473
+ new: { schema: newTable.schema, name: newTable.name }
474
+ });
475
+ }
476
+ const table = { schema: newTable.schema, name: newTable.name };
477
+ const oldColumns = columnsByID(oldTable.columns);
478
+ const newColumns = columnsByID(newTable.columns);
479
+ const [dropped, added] = symmetricDifferences(oldColumns, newColumns);
480
+ for (const id of dropped) {
481
+ const { name: column } = must(oldColumns.get(id));
482
+ changes.push({ tag: "drop-column", table, column });
483
+ }
484
+ const both = intersection(oldColumns, newColumns);
485
+ for (const id of both) {
486
+ const { name: oldName, ...oldSpec } = must(oldColumns.get(id));
487
+ const { name: newName, ...newSpec } = must(newColumns.get(id));
488
+ if (oldName !== newName || oldSpec.dataType !== newSpec.dataType || oldSpec.notNull !== newSpec.notNull) {
489
+ changes.push({
490
+ tag: "update-column",
491
+ table,
492
+ old: { name: oldName, spec: oldSpec },
493
+ new: { name: newName, spec: newSpec }
494
+ });
495
+ }
496
+ }
497
+ for (const id of added) {
498
+ const { name, ...spec } = must(newColumns.get(id));
499
+ const column = { name, spec };
500
+ try {
501
+ mapPostgresToLiteColumn(table.name, column);
502
+ } catch (cause) {
503
+ throw new UnsupportedSchemaChangeError(String(cause), { cause });
504
+ }
505
+ changes.push({ tag: "add-column", table, column });
506
+ }
507
+ return changes;
508
+ }
509
+ #parseReplicationEvent(content) {
510
+ const str = content instanceof Buffer ? content.toString("utf-8") : new TextDecoder().decode(content);
511
+ const json = JSON.parse(str);
512
+ return parse(json, replicationEventSchema, "passthrough");
513
+ }
514
+ /**
515
+ * If `ddlDetection === true`, relation messages are irrelevant,
516
+ * as schema changes are detected by event triggers that
517
+ * emit custom messages.
518
+ *
519
+ * For degraded-mode replication (`ddlDetection === false`):
520
+ * 1. query the current published schemas on upstream
521
+ * 2. compare that with the InternalShardConfig.initialSchema
522
+ * 3. compare that with the incoming MessageRelation
523
+ * 4. On any discrepancy, throw an UnsupportedSchemaChangeError
524
+ * to halt replication.
525
+ *
526
+ * Note that schemas queried in step [1] will be *post-transaction*
527
+ * schemas, which are not necessarily suitable for actually processing
528
+ * the statements in the transaction being replicated. In other words,
529
+ * this mechanism cannot be used to reliably *replicate* schema changes.
530
+ * However, they serve the purpose determining if schemas have changed.
531
+ */
532
+ async #handleRelation(rel) {
533
+ const { publications, ddlDetection } = this.#shardConfig;
534
+ if (ddlDetection) {
535
+ return [];
536
+ }
537
+ const currentSchema = await getPublicationInfo(
538
+ this.#upstreamDB,
539
+ publications
540
+ );
541
+ const difference = getSchemaDifference(this.#initialSchema, currentSchema);
542
+ if (difference !== null) {
543
+ throw new MissingEventTriggerSupport(difference);
544
+ }
545
+ const orel = this.#initialSchema.tables.find(
546
+ (t) => t.oid === rel.relationOid
547
+ );
548
+ if (!orel) {
549
+ throw new MissingEventTriggerSupport(
550
+ `relation not in initialSchema: ${stringify(rel)}`
551
+ );
552
+ }
553
+ if (relationDifferent(orel, rel)) {
554
+ throw new MissingEventTriggerSupport(
555
+ `relation has changed within the transaction: ${stringify(orel)} vs ${stringify(rel)}`
556
+ );
557
+ }
558
+ return [];
559
+ }
579
560
  }
580
561
  function getSchemaDifference(a, b) {
581
- // Note: ignore indexes since changes need not to halt replication
582
- if (a.tables.length !== b.tables.length) {
583
- return `tables created or dropped`;
584
- }
585
- for (let i = 0; i < a.tables.length; i++) {
586
- const at = a.tables[i];
587
- const bt = b.tables[i];
588
- const difference = getTableDifference(at, bt);
589
- if (difference) {
590
- return difference;
591
- }
592
- }
593
- return null;
562
+ if (a.tables.length !== b.tables.length) {
563
+ return `tables created or dropped`;
564
+ }
565
+ for (let i = 0; i < a.tables.length; i++) {
566
+ const at = a.tables[i];
567
+ const bt = b.tables[i];
568
+ const difference = getTableDifference(at, bt);
569
+ if (difference) {
570
+ return difference;
571
+ }
572
+ }
573
+ return null;
594
574
  }
595
- // ColumnSpec comparator
596
575
  const byColumnPos = (a, b) => a[1].pos < b[1].pos ? -1 : a[1].pos > b[1].pos ? 1 : 0;
597
576
  function getTableDifference(a, b) {
598
- if (a.oid !== b.oid || a.schema !== b.schema || a.name !== b.name) {
599
- return `Table "${a.name}" differs from table "${b.name}"`;
600
- }
601
- if (!deepEqual(a.primaryKey, b.primaryKey)) {
602
- return `Primary key of table "${a.name}" has changed`;
603
- }
604
- const acols = Object.entries(a.columns).sort(byColumnPos);
605
- const bcols = Object.entries(b.columns).sort(byColumnPos);
606
- if (acols.length !== bcols.length ||
607
- acols.some(([aname, acol], i) => {
608
- const [bname, bcol] = bcols[i];
609
- return (aname !== bname ||
610
- acol.pos !== bcol.pos ||
611
- acol.typeOID !== bcol.typeOID ||
612
- acol.notNull !== bcol.notNull);
613
- })) {
614
- return `Columns of table "${a.name}" have changed`;
615
- }
616
- return null;
577
+ if (a.oid !== b.oid || a.schema !== b.schema || a.name !== b.name) {
578
+ return `Table "${a.name}" differs from table "${b.name}"`;
579
+ }
580
+ if (!deepEqual(a.primaryKey, b.primaryKey)) {
581
+ return `Primary key of table "${a.name}" has changed`;
582
+ }
583
+ const acols = Object.entries(a.columns).sort(byColumnPos);
584
+ const bcols = Object.entries(b.columns).sort(byColumnPos);
585
+ if (acols.length !== bcols.length || acols.some(([aname, acol], i) => {
586
+ const [bname, bcol] = bcols[i];
587
+ return aname !== bname || acol.pos !== bcol.pos || acol.typeOID !== bcol.typeOID || acol.notNull !== bcol.notNull;
588
+ })) {
589
+ return `Columns of table "${a.name}" have changed`;
590
+ }
591
+ return null;
617
592
  }
618
- export function relationDifferent(a, b) {
619
- if (a.oid !== b.relationOid || a.schema !== b.schema || a.name !== b.name) {
620
- return true;
621
- }
622
- if (
593
+ function relationDifferent(a, b) {
594
+ if (a.oid !== b.relationOid || a.schema !== b.schema || a.name !== b.name) {
595
+ return true;
596
+ }
597
+ if (
623
598
  // The MessageRelation's `keyColumns` field contains the columns in column
624
599
  // declaration order, whereas the PublishedTableSpec's `primaryKey`
625
600
  // contains the columns in primary key (i.e. index) order. Do an
626
601
  // order-agnostic compare here since it is not possible to detect
627
602
  // key-order changes from the MessageRelation message alone.
628
- b.replicaIdentity === 'default' &&
629
- !equals(new Set(a.primaryKey), new Set(b.keyColumns))) {
630
- return true;
631
- }
632
- const acols = Object.entries(a.columns).sort(byColumnPos);
633
- const bcols = b.columns;
634
- return (acols.length !== bcols.length ||
635
- acols.some(([aname, acol], i) => {
636
- const bcol = bcols[i];
637
- return aname !== bcol.name || acol.typeOID !== bcol.typeOid;
638
- }));
603
+ b.replicaIdentity === "default" && !equals(new Set(a.primaryKey), new Set(b.keyColumns))
604
+ ) {
605
+ return true;
606
+ }
607
+ const acols = Object.entries(a.columns).sort(byColumnPos);
608
+ const bcols = b.columns;
609
+ return acols.length !== bcols.length || acols.some(([aname, acol], i) => {
610
+ const bcol = bcols[i];
611
+ return aname !== bcol.name || acol.typeOID !== bcol.typeOid;
612
+ });
639
613
  }
640
614
  function translateError(e) {
641
- if (!(e instanceof Error)) {
642
- return new Error(String(e));
643
- }
644
- if (e instanceof postgres.PostgresError && e.code === PG_ADMIN_SHUTDOWN) {
645
- return new ShutdownSignal(e);
646
- }
647
- return e;
615
+ if (!(e instanceof Error)) {
616
+ return new Error(String(e));
617
+ }
618
+ if (e instanceof postgres.PostgresError && e.code === PG_ADMIN_SHUTDOWN) {
619
+ return new ShutdownSignal(e);
620
+ }
621
+ return e;
648
622
  }
649
623
  const idString = (id) => `${id.schema}.${id.name}`;
650
624
  function specsByID(published) {
651
- return [
652
- // It would have been nice to use a CustomKeyMap here, but we rely on set-utils
653
- // operations which use plain Sets.
654
- new Map(published.tables.map(t => [t.oid, t])),
655
- new Map(published.indexes.map(i => [idString(i), i])),
656
- ];
625
+ return [
626
+ // It would have been nice to use a CustomKeyMap here, but we rely on set-utils
627
+ // operations which use plain Sets.
628
+ new Map(published.tables.map((t) => [t.oid, t])),
629
+ new Map(published.indexes.map((i) => [idString(i), i]))
630
+ ];
657
631
  }
658
632
  function columnsByID(columns) {
659
- const colsByID = new Map();
660
- for (const [name, spec] of Object.entries(columns)) {
661
- // The `pos` field is the `attnum` in `pg_attribute`, which is a stable
662
- // identifier for the column in this table (i.e. never reused).
663
- colsByID.set(spec.pos, { ...spec, name });
664
- }
665
- return colsByID;
633
+ const colsByID = /* @__PURE__ */ new Map();
634
+ for (const [name, spec] of Object.entries(columns)) {
635
+ colsByID.set(spec.pos, { ...spec, name });
636
+ }
637
+ return colsByID;
666
638
  }
667
- // Avoid sending the `columns` from the Postgres MessageRelation message.
668
- // They are not used downstream and the message can be large.
669
639
  function withoutColumns(relation) {
670
- const { columns: _, ...rest } = relation;
671
- return rest;
640
+ const { columns: _, ...rest } = relation;
641
+ return rest;
672
642
  }
673
643
  class UnsupportedSchemaChangeError extends Error {
674
- name = 'UnsupportedSchemaChangeError';
675
- // Schema changes cannot be reliably replicated without event trigger support.
676
- constructor(msg, options) {
677
- super(`Replication halted. Resync the replica to recover: ${msg}`, options);
678
- }
644
+ name = "UnsupportedSchemaChangeError";
645
+ // Schema changes cannot be reliably replicated without event trigger support.
646
+ constructor(msg, options) {
647
+ super(`Replication halted. Resync the replica to recover: ${msg}`, options);
648
+ }
679
649
  }
680
650
  class MissingEventTriggerSupport extends UnsupportedSchemaChangeError {
681
- constructor(msg) {
682
- super(`${msg}. Schema changes cannot be reliably replicated without event trigger support.`);
683
- }
651
+ constructor(msg) {
652
+ super(
653
+ `${msg}. Schema changes cannot be reliably replicated without event trigger support.`
654
+ );
655
+ }
684
656
  }
685
- // TODO(0xcadams): should this be a ProtocolError?
686
657
  class ShutdownSignal extends AbortError {
687
- name = 'ShutdownSignal';
688
- constructor(cause) {
689
- super('shutdown signal received (e.g. another zero-cache taking over the replication stream)', {
690
- cause,
691
- });
692
- }
658
+ name = "ShutdownSignal";
659
+ constructor(cause) {
660
+ super(
661
+ "shutdown signal received (e.g. another zero-cache taking over the replication stream)",
662
+ {
663
+ cause
664
+ }
665
+ );
666
+ }
693
667
  }
694
- //# sourceMappingURL=change-source.js.map
668
+ export {
669
+ Acker,
670
+ initializePostgresChangeSource,
671
+ relationDifferent
672
+ };
673
+ //# sourceMappingURL=change-source.js.map