@rocicorp/zero 1.12.0-canary.0 → 1.12.0-canary.10

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 (1387) hide show
  1. package/out/_virtual/{_@oxc-project_runtime@0.130.0/helpers → _@oxc-project_runtime@0.154.0/helpers/esm}/usingCtx.js +2 -2
  2. package/out/analyze-query/src/analyze-cli.d.ts.map +1 -1
  3. package/out/analyze-query/src/analyze-cli.js +4 -2
  4. package/out/analyze-query/src/analyze-cli.js.map +1 -1
  5. package/out/analyze-query/src/bin-transform.js +4 -3
  6. package/out/analyze-query/src/bin-transform.js.map +1 -1
  7. package/out/analyze-query/src/zql-chain.d.ts +23 -0
  8. package/out/analyze-query/src/zql-chain.d.ts.map +1 -0
  9. package/out/analyze-query/src/zql-chain.js +162 -0
  10. package/out/analyze-query/src/zql-chain.js.map +1 -0
  11. package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
  12. package/out/ast-to-zql/src/bin.js +4 -3
  13. package/out/ast-to-zql/src/bin.js.map +1 -1
  14. package/out/ast-to-zql/src/format.js.map +1 -1
  15. package/out/datadog/src/datadog-log-sink.js +5 -4
  16. package/out/datadog/src/datadog-log-sink.js.map +1 -1
  17. package/out/otel/src/log-options.js.map +1 -1
  18. package/out/replicache/src/btree/node.d.ts +0 -2
  19. package/out/replicache/src/btree/node.d.ts.map +1 -1
  20. package/out/replicache/src/btree/node.js +14 -12
  21. package/out/replicache/src/btree/node.js.map +1 -1
  22. package/out/replicache/src/btree/read.js +4 -2
  23. package/out/replicache/src/btree/read.js.map +1 -1
  24. package/out/replicache/src/btree/splice.js.map +1 -1
  25. package/out/replicache/src/btree/write.js +9 -5
  26. package/out/replicache/src/btree/write.js.map +1 -1
  27. package/out/replicache/src/config.js +1 -2
  28. package/out/replicache/src/connection-loop.d.ts.map +1 -1
  29. package/out/replicache/src/connection-loop.js +1 -1
  30. package/out/replicache/src/connection-loop.js.map +1 -1
  31. package/out/replicache/src/dag/chunk.js +1 -1
  32. package/out/replicache/src/dag/gc.js.map +1 -1
  33. package/out/replicache/src/dag/lazy-store.js +8 -7
  34. package/out/replicache/src/dag/lazy-store.js.map +1 -1
  35. package/out/replicache/src/dag/store-impl.js +1 -1
  36. package/out/replicache/src/dag/store-impl.js.map +1 -1
  37. package/out/replicache/src/dag/visitor.js.map +1 -1
  38. package/out/replicache/src/db/commit.d.ts +0 -1
  39. package/out/replicache/src/db/commit.d.ts.map +1 -1
  40. package/out/replicache/src/db/commit.js +5 -3
  41. package/out/replicache/src/db/commit.js.map +1 -1
  42. package/out/replicache/src/db/read.js +1 -1
  43. package/out/replicache/src/db/read.js.map +1 -1
  44. package/out/replicache/src/db/rebase.js.map +1 -1
  45. package/out/replicache/src/db/write.d.ts +0 -2
  46. package/out/replicache/src/db/write.d.ts.map +1 -1
  47. package/out/replicache/src/db/write.js +5 -2
  48. package/out/replicache/src/db/write.js.map +1 -1
  49. package/out/replicache/src/deleted-clients.d.ts +0 -2
  50. package/out/replicache/src/deleted-clients.d.ts.map +1 -1
  51. package/out/replicache/src/deleted-clients.js +5 -3
  52. package/out/replicache/src/deleted-clients.js.map +1 -1
  53. package/out/replicache/src/expo-sqlite.js +1 -2
  54. package/out/replicache/src/frozen-json.d.ts +0 -1
  55. package/out/replicache/src/frozen-json.d.ts.map +1 -1
  56. package/out/replicache/src/frozen-json.js +1 -1
  57. package/out/replicache/src/frozen-json.js.map +1 -1
  58. package/out/replicache/src/get-default-puller.js +1 -1
  59. package/out/replicache/src/hash.js +1 -1
  60. package/out/replicache/src/hash.js.map +1 -1
  61. package/out/replicache/src/impl.js +1 -2
  62. package/out/replicache/src/index-defs.d.ts +0 -2
  63. package/out/replicache/src/index-defs.d.ts.map +1 -1
  64. package/out/replicache/src/index-defs.js +5 -3
  65. package/out/replicache/src/index-defs.js.map +1 -1
  66. package/out/replicache/src/kv/expo-sqlite/store.d.ts +0 -1
  67. package/out/replicache/src/kv/expo-sqlite/store.d.ts.map +1 -1
  68. package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
  69. package/out/replicache/src/kv/idb-store.js +2 -2
  70. package/out/replicache/src/kv/idb-store.js.map +1 -1
  71. package/out/replicache/src/kv/mem-fallback-store.js +1 -1
  72. package/out/replicache/src/kv/mem-fallback-store.js.map +1 -1
  73. package/out/replicache/src/kv/mem-store.js.map +1 -1
  74. package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
  75. package/out/replicache/src/kv/op-sqlite/types.js.map +1 -1
  76. package/out/replicache/src/kv/read-impl.js.map +1 -1
  77. package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
  78. package/out/replicache/src/kv/sqlite-store.js +8 -4
  79. package/out/replicache/src/kv/sqlite-store.js.map +1 -1
  80. package/out/replicache/src/kv/throw-if-closed.d.ts +0 -3
  81. package/out/replicache/src/kv/throw-if-closed.d.ts.map +1 -1
  82. package/out/replicache/src/kv/throw-if-closed.js.map +1 -1
  83. package/out/replicache/src/kv/write-impl-base.js +4 -1
  84. package/out/replicache/src/kv/write-impl-base.js.map +1 -1
  85. package/out/replicache/src/kv/write-impl.js.map +1 -1
  86. package/out/replicache/src/log-options.js +2 -1
  87. package/out/replicache/src/log-options.js.map +1 -1
  88. package/out/replicache/src/make-idb-name.js +1 -1
  89. package/out/replicache/src/new-client-channel.js +9 -7
  90. package/out/replicache/src/new-client-channel.js.map +1 -1
  91. package/out/replicache/src/on-persist-channel.js +1 -1
  92. package/out/replicache/src/on-persist-channel.js.map +1 -1
  93. package/out/replicache/src/op-sqlite.js +1 -2
  94. package/out/replicache/src/pending-mutations.js +2 -1
  95. package/out/replicache/src/pending-mutations.js.map +1 -1
  96. package/out/replicache/src/persist/client-gc.js +2 -2
  97. package/out/replicache/src/persist/client-gc.js.map +1 -1
  98. package/out/replicache/src/persist/client-group-gc.d.ts +0 -7
  99. package/out/replicache/src/persist/client-group-gc.d.ts.map +1 -1
  100. package/out/replicache/src/persist/client-group-gc.js +1 -1
  101. package/out/replicache/src/persist/client-group-gc.js.map +1 -1
  102. package/out/replicache/src/persist/client-groups.js +1 -1
  103. package/out/replicache/src/persist/client-groups.js.map +1 -1
  104. package/out/replicache/src/persist/clients.js +1 -1
  105. package/out/replicache/src/persist/clients.js.map +1 -1
  106. package/out/replicache/src/persist/collect-idb-databases.js +5 -4
  107. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
  108. package/out/replicache/src/persist/gather-mem-only-visitor.js.map +1 -1
  109. package/out/replicache/src/persist/gather-not-cached-visitor.js.map +1 -1
  110. package/out/replicache/src/persist/heartbeat.js +2 -2
  111. package/out/replicache/src/persist/heartbeat.js.map +1 -1
  112. package/out/replicache/src/persist/idb-databases-store.js +1 -1
  113. package/out/replicache/src/persist/idb-databases-store.js.map +1 -1
  114. package/out/replicache/src/persist/make-client-id.js +1 -1
  115. package/out/replicache/src/persist/make-client-id.js.map +1 -1
  116. package/out/replicache/src/persist/persist.js +3 -2
  117. package/out/replicache/src/persist/persist.js.map +1 -1
  118. package/out/replicache/src/persist/refresh.js +8 -5
  119. package/out/replicache/src/persist/refresh.js.map +1 -1
  120. package/out/replicache/src/process-scheduler.js +1 -1
  121. package/out/replicache/src/process-scheduler.js.map +1 -1
  122. package/out/replicache/src/replicache-impl.d.ts +2 -7
  123. package/out/replicache/src/replicache-impl.d.ts.map +1 -1
  124. package/out/replicache/src/replicache-impl.js +21 -18
  125. package/out/replicache/src/replicache-impl.js.map +1 -1
  126. package/out/replicache/src/scan-iterator.js.map +1 -1
  127. package/out/replicache/src/scan-options.js +7 -6
  128. package/out/replicache/src/scan-options.js.map +1 -1
  129. package/out/replicache/src/sqlite.js +1 -2
  130. package/out/replicache/src/subscriptions.js +1 -1
  131. package/out/replicache/src/subscriptions.js.map +1 -1
  132. package/out/replicache/src/sync/diff.js +3 -1
  133. package/out/replicache/src/sync/diff.js.map +1 -1
  134. package/out/replicache/src/sync/ids.js.map +1 -1
  135. package/out/replicache/src/sync/patch.d.ts +0 -5
  136. package/out/replicache/src/sync/patch.d.ts.map +1 -1
  137. package/out/replicache/src/sync/patch.js +2 -4
  138. package/out/replicache/src/sync/patch.js.map +1 -1
  139. package/out/replicache/src/sync/pull.d.ts +0 -1
  140. package/out/replicache/src/sync/pull.d.ts.map +1 -1
  141. package/out/replicache/src/sync/pull.js +3 -1
  142. package/out/replicache/src/sync/pull.js.map +1 -1
  143. package/out/replicache/src/sync/push.d.ts +2 -1
  144. package/out/replicache/src/sync/push.d.ts.map +1 -1
  145. package/out/replicache/src/sync/push.js.map +1 -1
  146. package/out/replicache/src/sync/request-id.js +1 -1
  147. package/out/replicache/src/sync/request-id.js.map +1 -1
  148. package/out/replicache/src/transactions.js +1 -1
  149. package/out/replicache/src/transactions.js.map +1 -1
  150. package/out/replicache/src/types.d.ts +2 -1
  151. package/out/replicache/src/types.d.ts.map +1 -1
  152. package/out/shared/src/arrays.js +4 -1
  153. package/out/shared/src/arrays.js.map +1 -1
  154. package/out/shared/src/asserts.d.ts +0 -5
  155. package/out/shared/src/asserts.d.ts.map +1 -1
  156. package/out/shared/src/asserts.js.map +1 -1
  157. package/out/shared/src/bigint-json.d.ts +9 -0
  158. package/out/shared/src/bigint-json.d.ts.map +1 -1
  159. package/out/shared/src/bigint-json.js +27 -2
  160. package/out/shared/src/bigint-json.js.map +1 -1
  161. package/out/shared/src/broadcast-channel.js +1 -1
  162. package/out/shared/src/browser-env.d.ts +0 -17
  163. package/out/shared/src/browser-env.d.ts.map +1 -1
  164. package/out/shared/src/browser-env.js.map +1 -1
  165. package/out/shared/src/btree-set.js +11 -8
  166. package/out/shared/src/btree-set.js.map +1 -1
  167. package/out/shared/src/cache.js.map +1 -1
  168. package/out/shared/src/config.js +1 -1
  169. package/out/shared/src/custom-key-map.js.map +1 -1
  170. package/out/shared/src/custom-key-set.js.map +1 -1
  171. package/out/shared/src/deep-clone.d.ts +0 -1
  172. package/out/shared/src/deep-clone.d.ts.map +1 -1
  173. package/out/shared/src/deep-clone.js.map +1 -1
  174. package/out/shared/src/document-visible.js +1 -1
  175. package/out/shared/src/document-visible.js.map +1 -1
  176. package/out/shared/src/dotenv.js.map +1 -1
  177. package/out/shared/src/error.js +1 -1
  178. package/out/shared/src/error.js.map +1 -1
  179. package/out/shared/src/expand.d.ts +0 -3
  180. package/out/shared/src/expand.d.ts.map +1 -1
  181. package/out/shared/src/hash.js +2 -2
  182. package/out/shared/src/hash.js.map +1 -1
  183. package/out/shared/src/immutable.d.ts +1 -1
  184. package/out/shared/src/immutable.d.ts.map +1 -1
  185. package/out/shared/src/iterables.d.ts +0 -1
  186. package/out/shared/src/iterables.d.ts.map +1 -1
  187. package/out/shared/src/iterables.js.map +1 -1
  188. package/out/shared/src/json-schema.js.map +1 -1
  189. package/out/shared/src/json.js.map +1 -1
  190. package/out/shared/src/logging-test-utils.js.map +1 -1
  191. package/out/shared/src/logging.js +1 -1
  192. package/out/shared/src/logging.js.map +1 -1
  193. package/out/shared/src/navigator.js +1 -1
  194. package/out/shared/src/options-types.d.ts +1 -1
  195. package/out/shared/src/options-types.d.ts.map +1 -1
  196. package/out/shared/src/options.d.ts +2 -3
  197. package/out/shared/src/options.d.ts.map +1 -1
  198. package/out/shared/src/options.js +8 -11
  199. package/out/shared/src/options.js.map +1 -1
  200. package/out/shared/src/promise-race.js +1 -1
  201. package/out/shared/src/promise-race.js.map +1 -1
  202. package/out/shared/src/queue.js +1 -1
  203. package/out/shared/src/queue.js.map +1 -1
  204. package/out/shared/src/record-proxy.js.map +1 -1
  205. package/out/shared/src/resolved-promises.d.ts +0 -4
  206. package/out/shared/src/resolved-promises.d.ts.map +1 -1
  207. package/out/shared/src/resolved-promises.js +0 -1
  208. package/out/shared/src/resolved-promises.js.map +1 -1
  209. package/out/shared/src/resolver.d.ts +9 -0
  210. package/out/shared/src/resolver.d.ts.map +1 -0
  211. package/out/shared/src/resolver.js +6 -0
  212. package/out/shared/src/resolver.js.map +1 -0
  213. package/out/shared/src/ring-buffer.js.map +1 -1
  214. package/out/shared/src/size-of-value.js +7 -10
  215. package/out/shared/src/size-of-value.js.map +1 -1
  216. package/out/shared/src/sleep.js +1 -1
  217. package/out/shared/src/sleep.js.map +1 -1
  218. package/out/shared/src/sorted-entries.js.map +1 -1
  219. package/out/shared/src/tdigest-schema.js.map +1 -1
  220. package/out/shared/src/tdigest.d.ts +0 -1
  221. package/out/shared/src/tdigest.d.ts.map +1 -1
  222. package/out/shared/src/tdigest.js.map +1 -1
  223. package/out/shared/src/valita.js +1 -1
  224. package/out/shared/src/valita.js.map +1 -1
  225. package/out/z2s/src/compiler.js +5 -7
  226. package/out/z2s/src/compiler.js.map +1 -1
  227. package/out/z2s/src/sql.d.ts +1 -5
  228. package/out/z2s/src/sql.d.ts.map +1 -1
  229. package/out/z2s/src/sql.js +1 -1
  230. package/out/z2s/src/sql.js.map +1 -1
  231. package/out/zero/package.js +210 -189
  232. package/out/zero/package.js.map +1 -1
  233. package/out/zero/src/adapters/drizzle.js +1 -2
  234. package/out/zero/src/adapters/kysely.js +1 -2
  235. package/out/zero/src/adapters/pg.js +1 -2
  236. package/out/zero/src/adapters/postgresjs.js +1 -2
  237. package/out/zero/src/adapters/prisma.js +1 -2
  238. package/out/zero/src/analyze.js +1 -2
  239. package/out/zero/src/change-protocol/v0.js +1 -2
  240. package/out/zero/src/expo-sqlite.js +1 -2
  241. package/out/zero/src/op-sqlite.js +1 -2
  242. package/out/zero/src/react-native.js.map +1 -1
  243. package/out/zero/src/sqlite.js +1 -2
  244. package/out/zero/src/zero-cache-dev.js +11 -10
  245. package/out/zero/src/zero-cache-dev.js.map +1 -1
  246. package/out/zero/src/zero-out.js +2 -1
  247. package/out/zero/src/zero-out.js.map +1 -1
  248. package/out/zero-cache/src/auth/auth.js +1 -1
  249. package/out/zero-cache/src/auth/auth.js.map +1 -1
  250. package/out/zero-cache/src/auth/jwt.js +4 -1
  251. package/out/zero-cache/src/auth/jwt.js.map +1 -1
  252. package/out/zero-cache/src/auth/load-permissions.js +1 -1
  253. package/out/zero-cache/src/auth/load-permissions.js.map +1 -1
  254. package/out/zero-cache/src/auth/read-authorizer.js +3 -2
  255. package/out/zero-cache/src/auth/read-authorizer.js.map +1 -1
  256. package/out/zero-cache/src/auth/write-authorizer.js +15 -19
  257. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  258. package/out/zero-cache/src/config/network.js +1 -1
  259. package/out/zero-cache/src/config/network.js.map +1 -1
  260. package/out/zero-cache/src/config/server-context.js.map +1 -1
  261. package/out/zero-cache/src/config/zero-config.d.ts +19 -11
  262. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  263. package/out/zero-cache/src/config/zero-config.js +47 -10
  264. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  265. package/out/zero-cache/src/custom/fetch.js +1 -1
  266. package/out/zero-cache/src/custom/fetch.js.map +1 -1
  267. package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -1
  268. package/out/zero-cache/src/db/create.js.map +1 -1
  269. package/out/zero-cache/src/db/index-predicate.js.map +1 -1
  270. package/out/zero-cache/src/db/lite-tables.d.ts +2 -2
  271. package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
  272. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  273. package/out/zero-cache/src/db/migration-lite.js +1 -1
  274. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  275. package/out/zero-cache/src/db/migration.js +5 -3
  276. package/out/zero-cache/src/db/migration.js.map +1 -1
  277. package/out/zero-cache/src/db/pg-copy-binary.js +4 -3
  278. package/out/zero-cache/src/db/pg-copy-binary.js.map +1 -1
  279. package/out/zero-cache/src/db/pg-copy.js +0 -1
  280. package/out/zero-cache/src/db/pg-copy.js.map +1 -1
  281. package/out/zero-cache/src/db/pg-to-lite.js +1 -1
  282. package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
  283. package/out/zero-cache/src/db/pg-type-parser.js.map +1 -1
  284. package/out/zero-cache/src/db/run-transaction.js.map +1 -1
  285. package/out/zero-cache/src/db/specs.d.ts +3 -4
  286. package/out/zero-cache/src/db/specs.d.ts.map +1 -1
  287. package/out/zero-cache/src/db/specs.js +1 -1
  288. package/out/zero-cache/src/db/specs.js.map +1 -1
  289. package/out/zero-cache/src/db/sqlite-corruption.js.map +1 -1
  290. package/out/zero-cache/src/db/statements.d.ts.map +1 -1
  291. package/out/zero-cache/src/db/statements.js +9 -2
  292. package/out/zero-cache/src/db/statements.js.map +1 -1
  293. package/out/zero-cache/src/db/transaction-pool.js +6 -4
  294. package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
  295. package/out/zero-cache/src/db/warmup.js.map +1 -1
  296. package/out/zero-cache/src/observability/events.js +1 -1
  297. package/out/zero-cache/src/observability/events.js.map +1 -1
  298. package/out/zero-cache/src/observability/log-throttle.js.map +1 -1
  299. package/out/zero-cache/src/observability/metrics.js.map +1 -1
  300. package/out/zero-cache/src/scripts/decommission.js +1 -1
  301. package/out/zero-cache/src/scripts/deploy-permissions.js +5 -3
  302. package/out/zero-cache/src/scripts/deploy-permissions.js.map +1 -1
  303. package/out/zero-cache/src/scripts/permissions.js.map +1 -1
  304. package/out/zero-cache/src/server/anonymous-otel-start.js +2 -1
  305. package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
  306. package/out/zero-cache/src/server/change-streamer.js +49 -16
  307. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  308. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
  309. package/out/zero-cache/src/server/logging.js +1 -1
  310. package/out/zero-cache/src/server/logging.js.map +1 -1
  311. package/out/zero-cache/src/server/main.js +2 -2
  312. package/out/zero-cache/src/server/main.js.map +1 -1
  313. package/out/zero-cache/src/server/otel-log-sink.js.map +1 -1
  314. package/out/zero-cache/src/server/otel-start.js.map +1 -1
  315. package/out/zero-cache/src/server/reaper.js +2 -2
  316. package/out/zero-cache/src/server/reaper.js.map +1 -1
  317. package/out/zero-cache/src/server/replicator.js +1 -1
  318. package/out/zero-cache/src/server/replicator.js.map +1 -1
  319. package/out/zero-cache/src/server/runner/run-worker.d.ts.map +1 -1
  320. package/out/zero-cache/src/server/runner/run-worker.js +4 -3
  321. package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
  322. package/out/zero-cache/src/server/runner/runtime.js +2 -1
  323. package/out/zero-cache/src/server/runner/runtime.js.map +1 -1
  324. package/out/zero-cache/src/server/runner/zero-dispatcher.d.ts +9 -1
  325. package/out/zero-cache/src/server/runner/zero-dispatcher.d.ts.map +1 -1
  326. package/out/zero-cache/src/server/runner/zero-dispatcher.js +29 -2
  327. package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
  328. package/out/zero-cache/src/server/shadow-syncer.js +1 -1
  329. package/out/zero-cache/src/server/shadow-syncer.js.map +1 -1
  330. package/out/zero-cache/src/server/slot-keeper.js.map +1 -1
  331. package/out/zero-cache/src/server/syncer-assigner.js.map +1 -1
  332. package/out/zero-cache/src/server/syncer.js +10 -5
  333. package/out/zero-cache/src/server/syncer.js.map +1 -1
  334. package/out/zero-cache/src/server/worker-dispatcher.js +1 -1
  335. package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -1
  336. package/out/zero-cache/src/server/worker-urls.js.map +1 -1
  337. package/out/zero-cache/src/services/analyze.js +2 -2
  338. package/out/zero-cache/src/services/analyze.js.map +1 -1
  339. package/out/zero-cache/src/services/change-source/common/backfill-manager.js +3 -3
  340. package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
  341. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js +1 -1
  342. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -1
  343. package/out/zero-cache/src/services/change-source/common/init-cleanup.js.map +1 -1
  344. package/out/zero-cache/src/services/change-source/common/replica-restore.js.map +1 -1
  345. package/out/zero-cache/src/services/change-source/common/replica-schema.js +4 -4
  346. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  347. package/out/zero-cache/src/services/change-source/custom/change-source.js +1 -1
  348. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  349. package/out/zero-cache/src/services/change-source/pg/backfill-metadata.js.map +1 -1
  350. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +4 -4
  351. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
  352. package/out/zero-cache/src/services/change-source/pg/change-source-init.js +52 -27
  353. package/out/zero-cache/src/services/change-source/pg/change-source-init.js.map +1 -1
  354. package/out/zero-cache/src/services/change-source/pg/change-source.js +70 -15
  355. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  356. package/out/zero-cache/src/services/change-source/pg/decommission.js +2 -1
  357. package/out/zero-cache/src/services/change-source/pg/decommission.js.map +1 -1
  358. package/out/zero-cache/src/services/change-source/pg/fork-request.js +54 -0
  359. package/out/zero-cache/src/services/change-source/pg/fork-request.js.map +1 -0
  360. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +9 -7
  361. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  362. package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js.map +1 -1
  363. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js.map +1 -1
  364. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +5 -4
  365. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  366. package/out/zero-cache/src/services/change-source/pg/lsn.d.ts +0 -2
  367. package/out/zero-cache/src/services/change-source/pg/lsn.d.ts.map +1 -1
  368. package/out/zero-cache/src/services/change-source/pg/lsn.js.map +1 -1
  369. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js +2 -2
  370. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js.map +1 -1
  371. package/out/zero-cache/src/services/change-source/pg/replication-slot-health.js +1 -1
  372. package/out/zero-cache/src/services/change-source/pg/replication-slot-health.js.map +1 -1
  373. package/out/zero-cache/src/services/change-source/pg/replication-slots.js +9 -3
  374. package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
  375. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +0 -12
  376. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
  377. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +6 -4
  378. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
  379. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts +1 -1
  380. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts.map +1 -1
  381. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js +13 -12
  382. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js.map +1 -1
  383. package/out/zero-cache/src/services/change-source/pg/schema/init.js +1 -1
  384. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  385. package/out/zero-cache/src/services/change-source/pg/schema/published.js +2 -2
  386. package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
  387. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js.map +1 -1
  388. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +10 -7
  389. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  390. package/out/zero-cache/src/services/change-source/pg/schema/validation.d.ts +0 -1
  391. package/out/zero-cache/src/services/change-source/pg/schema/validation.d.ts.map +1 -1
  392. package/out/zero-cache/src/services/change-source/pg/schema/validation.js +1 -1
  393. package/out/zero-cache/src/services/change-source/pg/schema/validation.js.map +1 -1
  394. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js +1 -1
  395. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js.map +1 -1
  396. package/out/zero-cache/src/services/change-source/protocol/current/control.js.map +1 -1
  397. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  398. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +1 -0
  399. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
  400. package/out/zero-cache/src/services/change-source/protocol/current/downstream.js.map +1 -1
  401. package/out/zero-cache/src/services/change-source/protocol/current/status.d.ts +3 -0
  402. package/out/zero-cache/src/services/change-source/protocol/current/status.d.ts.map +1 -1
  403. package/out/zero-cache/src/services/change-source/protocol/current/status.js +2 -1
  404. package/out/zero-cache/src/services/change-source/protocol/current/status.js.map +1 -1
  405. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts +1 -0
  406. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts.map +1 -1
  407. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -1
  408. package/out/zero-cache/src/services/change-source/protocol/current.js +1 -1
  409. package/out/zero-cache/src/services/change-source/protocol/mod.js +1 -2
  410. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js.map +1 -1
  411. package/out/zero-cache/src/services/change-streamer/backfill-state.js +1 -1
  412. package/out/zero-cache/src/services/change-streamer/backfill-state.js.map +1 -1
  413. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js +6 -6
  414. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js.map +1 -1
  415. package/out/zero-cache/src/services/change-streamer/backup-monitor.js +56 -21
  416. package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
  417. package/out/zero-cache/src/services/change-streamer/broadcast.js +2 -2
  418. package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
  419. package/out/zero-cache/src/services/change-streamer/change-log-codec.js +2 -3
  420. package/out/zero-cache/src/services/change-streamer/change-log-codec.js.map +1 -1
  421. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js +3 -3
  422. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js.map +1 -1
  423. package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.js.map +1 -1
  424. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +8 -4
  425. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  426. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +85 -59
  427. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  428. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  429. package/out/zero-cache/src/services/change-streamer/drain-tracker.js +1 -1
  430. package/out/zero-cache/src/services/change-streamer/drain-tracker.js.map +1 -1
  431. package/out/zero-cache/src/services/change-streamer/forwarder.js +11 -10
  432. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
  433. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js +81 -12
  434. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js.map +1 -1
  435. package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.js +4 -4
  436. package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.js.map +1 -1
  437. package/out/zero-cache/src/services/change-streamer/replica-poller.js +2 -2
  438. package/out/zero-cache/src/services/change-streamer/replica-poller.js.map +1 -1
  439. package/out/zero-cache/src/services/change-streamer/restore-admission.js +12 -1
  440. package/out/zero-cache/src/services/change-streamer/restore-admission.js.map +1 -1
  441. package/out/zero-cache/src/services/change-streamer/schema/init.js +1 -1
  442. package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
  443. package/out/zero-cache/src/services/change-streamer/schema/tables.js +1 -1
  444. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  445. package/out/zero-cache/src/services/change-streamer/server-start-metrics.js +42 -0
  446. package/out/zero-cache/src/services/change-streamer/server-start-metrics.js.map +1 -0
  447. package/out/zero-cache/src/services/change-streamer/snapshot-message.js +1 -2
  448. package/out/zero-cache/src/services/change-streamer/snapshot-message.js.map +1 -1
  449. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js.map +1 -1
  450. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js +2 -2
  451. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js.map +1 -1
  452. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.js +2 -2
  453. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.js.map +1 -1
  454. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.js.map +1 -1
  455. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-read-router.js.map +1 -1
  456. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js +4 -6
  457. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js.map +1 -1
  458. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js +3 -5
  459. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js.map +1 -1
  460. package/out/zero-cache/src/services/change-streamer/storer.js +4 -4
  461. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  462. package/out/zero-cache/src/services/change-streamer/subscribe.js.map +1 -1
  463. package/out/zero-cache/src/services/change-streamer/subscriber.js +8 -7
  464. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  465. package/out/zero-cache/src/services/change-streamer/upstream-acker.js +0 -1
  466. package/out/zero-cache/src/services/change-streamer/upstream-acker.js.map +1 -1
  467. package/out/zero-cache/src/services/heapz.js +2 -1
  468. package/out/zero-cache/src/services/heapz.js.map +1 -1
  469. package/out/zero-cache/src/services/http-service.d.ts +2 -2
  470. package/out/zero-cache/src/services/http-service.d.ts.map +1 -1
  471. package/out/zero-cache/src/services/http-service.js +6 -4
  472. package/out/zero-cache/src/services/http-service.js.map +1 -1
  473. package/out/zero-cache/src/services/life-cycle.js +3 -3
  474. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  475. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js +4 -2
  476. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js.map +1 -1
  477. package/out/zero-cache/src/services/litestream/commands.js +4 -4
  478. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  479. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js +2 -2
  480. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js.map +1 -1
  481. package/out/zero-cache/src/services/litestream/litestream-controller.js.map +1 -1
  482. package/out/zero-cache/src/services/litestream/metrics.js.map +1 -1
  483. package/out/zero-cache/src/services/litestream/restore-progress.js.map +1 -1
  484. package/out/zero-cache/src/services/mutagen/mutagen.js +3 -4
  485. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  486. package/out/zero-cache/src/services/mutagen/pusher.js +61 -17
  487. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  488. package/out/zero-cache/src/services/plannerz.d.ts +4 -12
  489. package/out/zero-cache/src/services/plannerz.d.ts.map +1 -1
  490. package/out/zero-cache/src/services/plannerz.js +6 -7
  491. package/out/zero-cache/src/services/plannerz.js.map +1 -1
  492. package/out/zero-cache/src/services/profz.js +5 -3
  493. package/out/zero-cache/src/services/profz.js.map +1 -1
  494. package/out/zero-cache/src/services/replicator/change-log-cookies.js.map +1 -1
  495. package/out/zero-cache/src/services/replicator/change-log-db.js +4 -3
  496. package/out/zero-cache/src/services/replicator/change-log-db.js.map +1 -1
  497. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js.map +1 -1
  498. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  499. package/out/zero-cache/src/services/replicator/drain-handler.js +1 -1
  500. package/out/zero-cache/src/services/replicator/drain-handler.js.map +1 -1
  501. package/out/zero-cache/src/services/replicator/incremental-sync.js +4 -4
  502. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  503. package/out/zero-cache/src/services/replicator/notifier.js.map +1 -1
  504. package/out/zero-cache/src/services/replicator/replication-status.js +4 -3
  505. package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
  506. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  507. package/out/zero-cache/src/services/replicator/reporter/recorder.js +2 -2
  508. package/out/zero-cache/src/services/replicator/reporter/recorder.js.map +1 -1
  509. package/out/zero-cache/src/services/replicator/reporter/report-schema.d.ts +2 -11
  510. package/out/zero-cache/src/services/replicator/reporter/report-schema.d.ts.map +1 -1
  511. package/out/zero-cache/src/services/replicator/reporter/report-schema.js.map +1 -1
  512. package/out/zero-cache/src/services/replicator/schema/backfilling.js +2 -2
  513. package/out/zero-cache/src/services/replicator/schema/backfilling.js.map +1 -1
  514. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts +19 -17
  515. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts.map +1 -1
  516. package/out/zero-cache/src/services/replicator/schema/change-log.js +31 -15
  517. package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -1
  518. package/out/zero-cache/src/services/replicator/schema/column-metadata.d.ts +0 -7
  519. package/out/zero-cache/src/services/replicator/schema/column-metadata.d.ts.map +1 -1
  520. package/out/zero-cache/src/services/replicator/schema/column-metadata.js +1 -1
  521. package/out/zero-cache/src/services/replicator/schema/column-metadata.js.map +1 -1
  522. package/out/zero-cache/src/services/replicator/schema/replication-state.js +10 -7
  523. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
  524. package/out/zero-cache/src/services/replicator/schema/table-metadata.js.map +1 -1
  525. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js +1 -1
  526. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js.map +1 -1
  527. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.js +1 -1
  528. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.js.map +1 -1
  529. package/out/zero-cache/src/services/replicator/write-worker-client.js +2 -2
  530. package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
  531. package/out/zero-cache/src/services/replicator/write-worker.js +3 -3
  532. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
  533. package/out/zero-cache/src/services/run-ast.js +1 -1
  534. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  535. package/out/zero-cache/src/services/runner.js.map +1 -1
  536. package/out/zero-cache/src/services/running-state.js +1 -1
  537. package/out/zero-cache/src/services/running-state.js.map +1 -1
  538. package/out/zero-cache/src/services/shadow-sync/shadow-sync-service.js.map +1 -1
  539. package/out/zero-cache/src/services/statz.d.ts.map +1 -1
  540. package/out/zero-cache/src/services/statz.js +5 -4
  541. package/out/zero-cache/src/services/statz.js.map +1 -1
  542. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js +2 -2
  543. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js.map +1 -1
  544. package/out/zero-cache/src/services/view-syncer/advancement-metrics.js.map +1 -1
  545. package/out/zero-cache/src/services/view-syncer/batch-pacer.js.map +1 -1
  546. package/out/zero-cache/src/services/view-syncer/client-handler.js +71 -24
  547. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  548. package/out/zero-cache/src/services/view-syncer/client-schema.js +46 -6
  549. package/out/zero-cache/src/services/view-syncer/client-schema.js.map +1 -1
  550. package/out/zero-cache/src/services/view-syncer/connection-context-manager.js.map +1 -1
  551. package/out/zero-cache/src/services/view-syncer/cvr-purger.js +2 -2
  552. package/out/zero-cache/src/services/view-syncer/cvr-purger.js.map +1 -1
  553. package/out/zero-cache/src/services/view-syncer/cvr-store.js +12 -7
  554. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  555. package/out/zero-cache/src/services/view-syncer/cvr.js +12 -4
  556. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  557. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js +1 -1
  558. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js.map +1 -1
  559. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +2 -2
  560. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
  561. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.js.map +1 -1
  562. package/out/zero-cache/src/services/view-syncer/hydration-budget.js.map +1 -1
  563. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js +2 -2
  564. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js.map +1 -1
  565. package/out/zero-cache/src/services/view-syncer/inspect-handler.js +6 -4
  566. package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
  567. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +13 -10
  568. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  569. package/out/zero-cache/src/services/view-syncer/plan-warnings.js.map +1 -1
  570. package/out/zero-cache/src/services/view-syncer/push-cost.js.map +1 -1
  571. package/out/zero-cache/src/services/view-syncer/push-cutoff.js.map +1 -1
  572. package/out/zero-cache/src/services/view-syncer/query-covering.js.map +1 -1
  573. package/out/zero-cache/src/services/view-syncer/query-shape.js.map +1 -1
  574. package/out/zero-cache/src/services/view-syncer/query-stats.js +1 -1
  575. package/out/zero-cache/src/services/view-syncer/query-stats.js.map +1 -1
  576. package/out/zero-cache/src/services/view-syncer/row-record-cache.js +2 -2
  577. package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
  578. package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
  579. package/out/zero-cache/src/services/view-syncer/schema/types.js +2 -16
  580. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  581. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js +7 -1
  582. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js.map +1 -1
  583. package/out/zero-cache/src/services/view-syncer/snapshotter.js +12 -8
  584. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  585. package/out/zero-cache/src/services/view-syncer/ttl-clock.js.map +1 -1
  586. package/out/zero-cache/src/services/view-syncer/view-syncer.js +52 -28
  587. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  588. package/out/zero-cache/src/types/error-with-level.js.map +1 -1
  589. package/out/zero-cache/src/types/lexi-version.js.map +1 -1
  590. package/out/zero-cache/src/types/lite.d.ts +0 -1
  591. package/out/zero-cache/src/types/lite.d.ts.map +1 -1
  592. package/out/zero-cache/src/types/lite.js +1 -1
  593. package/out/zero-cache/src/types/lite.js.map +1 -1
  594. package/out/zero-cache/src/types/pg-data-type.js +1 -1
  595. package/out/zero-cache/src/types/pg-data-type.js.map +1 -1
  596. package/out/zero-cache/src/types/pg-types.d.ts +0 -40
  597. package/out/zero-cache/src/types/pg-types.d.ts.map +1 -1
  598. package/out/zero-cache/src/types/pg-types.js.map +1 -1
  599. package/out/zero-cache/src/types/pg.js +6 -4
  600. package/out/zero-cache/src/types/pg.js.map +1 -1
  601. package/out/zero-cache/src/types/poke-chunk.d.ts +0 -1
  602. package/out/zero-cache/src/types/poke-chunk.d.ts.map +1 -1
  603. package/out/zero-cache/src/types/poke-chunk.js +1 -1
  604. package/out/zero-cache/src/types/poke-chunk.js.map +1 -1
  605. package/out/zero-cache/src/types/processes.js +1 -1
  606. package/out/zero-cache/src/types/processes.js.map +1 -1
  607. package/out/zero-cache/src/types/profiler.js +1 -1
  608. package/out/zero-cache/src/types/profiler.js.map +1 -1
  609. package/out/zero-cache/src/types/row-key.d.ts +0 -5
  610. package/out/zero-cache/src/types/row-key.d.ts.map +1 -1
  611. package/out/zero-cache/src/types/row-key.js.map +1 -1
  612. package/out/zero-cache/src/types/sql.js.map +1 -1
  613. package/out/zero-cache/src/types/streams.d.ts.map +1 -1
  614. package/out/zero-cache/src/types/streams.js +11 -10
  615. package/out/zero-cache/src/types/streams.js.map +1 -1
  616. package/out/zero-cache/src/types/strings.js.map +1 -1
  617. package/out/zero-cache/src/types/subscription.js +1 -1
  618. package/out/zero-cache/src/types/subscription.js.map +1 -1
  619. package/out/zero-cache/src/types/timeout.js +1 -1
  620. package/out/zero-cache/src/types/websocket-handoff.d.ts +4 -7
  621. package/out/zero-cache/src/types/websocket-handoff.d.ts.map +1 -1
  622. package/out/zero-cache/src/types/websocket-handoff.js +16 -2
  623. package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
  624. package/out/zero-cache/src/types/ws.d.ts +2 -1
  625. package/out/zero-cache/src/types/ws.d.ts.map +1 -1
  626. package/out/zero-cache/src/types/ws.js.map +1 -1
  627. package/out/zero-cache/src/workers/connection.d.ts +1 -2
  628. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  629. package/out/zero-cache/src/workers/connection.js +5 -3
  630. package/out/zero-cache/src/workers/connection.js.map +1 -1
  631. package/out/zero-cache/src/workers/mutator.js +1 -1
  632. package/out/zero-cache/src/workers/mutator.js.map +1 -1
  633. package/out/zero-cache/src/workers/rehome.d.ts +15 -0
  634. package/out/zero-cache/src/workers/rehome.d.ts.map +1 -0
  635. package/out/zero-cache/src/workers/rehome.js +36 -0
  636. package/out/zero-cache/src/workers/rehome.js.map +1 -0
  637. package/out/zero-cache/src/workers/replicator.js +5 -4
  638. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  639. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +9 -1
  640. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  641. package/out/zero-cache/src/workers/syncer.js +30 -5
  642. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  643. package/out/zero-client/src/client/active-clients-manager.d.ts.map +1 -1
  644. package/out/zero-client/src/client/active-clients-manager.js +2 -2
  645. package/out/zero-client/src/client/active-clients-manager.js.map +1 -1
  646. package/out/zero-client/src/client/bindings.js +11 -11
  647. package/out/zero-client/src/client/connection-manager.js +1 -1
  648. package/out/zero-client/src/client/connection-manager.js.map +1 -1
  649. package/out/zero-client/src/client/connection.js +1 -1
  650. package/out/zero-client/src/client/connection.js.map +1 -1
  651. package/out/zero-client/src/client/context.js.map +1 -1
  652. package/out/zero-client/src/client/crud-impl.js +1 -1
  653. package/out/zero-client/src/client/crud-impl.js.map +1 -1
  654. package/out/zero-client/src/client/crud.d.ts +2 -8
  655. package/out/zero-client/src/client/crud.d.ts.map +1 -1
  656. package/out/zero-client/src/client/crud.js.map +1 -1
  657. package/out/zero-client/src/client/custom.d.ts +0 -2
  658. package/out/zero-client/src/client/custom.d.ts.map +1 -1
  659. package/out/zero-client/src/client/custom.js.map +1 -1
  660. package/out/zero-client/src/client/delete-clients-manager.js.map +1 -1
  661. package/out/zero-client/src/client/enable-analytics.d.ts +0 -1
  662. package/out/zero-client/src/client/enable-analytics.d.ts.map +1 -1
  663. package/out/zero-client/src/client/enable-analytics.js +1 -0
  664. package/out/zero-client/src/client/enable-analytics.js.map +1 -1
  665. package/out/zero-client/src/client/error.d.ts +4 -5
  666. package/out/zero-client/src/client/error.d.ts.map +1 -1
  667. package/out/zero-client/src/client/error.js.map +1 -1
  668. package/out/zero-client/src/client/inspector/client-group.js.map +1 -1
  669. package/out/zero-client/src/client/inspector/client.js.map +1 -1
  670. package/out/zero-client/src/client/inspector/html-dialog-prompt.js +1 -1
  671. package/out/zero-client/src/client/inspector/html-dialog-prompt.js.map +1 -1
  672. package/out/zero-client/src/client/inspector/inspector.js.map +1 -1
  673. package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -1
  674. package/out/zero-client/src/client/inspector/query.js.map +1 -1
  675. package/out/zero-client/src/client/ivm-branch.js +1 -3
  676. package/out/zero-client/src/client/ivm-branch.js.map +1 -1
  677. package/out/zero-client/src/client/keys.d.ts +0 -1
  678. package/out/zero-client/src/client/keys.d.ts.map +1 -1
  679. package/out/zero-client/src/client/keys.js +6 -3
  680. package/out/zero-client/src/client/keys.js.map +1 -1
  681. package/out/zero-client/src/client/log-options.js.map +1 -1
  682. package/out/zero-client/src/client/make-replicache-mutators.js +5 -3
  683. package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
  684. package/out/zero-client/src/client/metrics.js +3 -5
  685. package/out/zero-client/src/client/metrics.js.map +1 -1
  686. package/out/zero-client/src/client/mutation-tracker.d.ts.map +1 -1
  687. package/out/zero-client/src/client/mutation-tracker.js +1 -1
  688. package/out/zero-client/src/client/mutation-tracker.js.map +1 -1
  689. package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
  690. package/out/zero-client/src/client/options.d.ts +0 -4
  691. package/out/zero-client/src/client/options.d.ts.map +1 -1
  692. package/out/zero-client/src/client/options.js.map +1 -1
  693. package/out/zero-client/src/client/query-manager.js +2 -2
  694. package/out/zero-client/src/client/query-manager.js.map +1 -1
  695. package/out/zero-client/src/client/reload-error-handler.js +4 -3
  696. package/out/zero-client/src/client/reload-error-handler.js.map +1 -1
  697. package/out/zero-client/src/client/replicache-types.d.ts +3 -2
  698. package/out/zero-client/src/client/replicache-types.d.ts.map +1 -1
  699. package/out/zero-client/src/client/version.js +1 -1
  700. package/out/zero-client/src/client/zero-poke-handler.d.ts +1 -2
  701. package/out/zero-client/src/client/zero-poke-handler.d.ts.map +1 -1
  702. package/out/zero-client/src/client/zero-poke-handler.js +1 -1
  703. package/out/zero-client/src/client/zero-poke-handler.js.map +1 -1
  704. package/out/zero-client/src/client/zero-rep.js.map +1 -1
  705. package/out/zero-client/src/client/zero.d.ts +1 -5
  706. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  707. package/out/zero-client/src/client/zero.js +20 -12
  708. package/out/zero-client/src/client/zero.js.map +1 -1
  709. package/out/zero-client/src/mod.js +23 -23
  710. package/out/zero-client/src/types/client-state.d.ts +0 -6
  711. package/out/zero-client/src/types/client-state.d.ts.map +1 -1
  712. package/out/zero-client/src/util/nanoid.js.map +1 -1
  713. package/out/zero-permissions/src/permissions.d.ts +1 -12
  714. package/out/zero-permissions/src/permissions.d.ts.map +1 -1
  715. package/out/zero-permissions/src/permissions.js +3 -3
  716. package/out/zero-permissions/src/permissions.js.map +1 -1
  717. package/out/zero-pg/src/mod.js +9 -9
  718. package/out/zero-protocol/src/analyze-query-result.js +1 -1
  719. package/out/zero-protocol/src/analyze-query-result.js.map +1 -1
  720. package/out/zero-protocol/src/application-error.js.map +1 -1
  721. package/out/zero-protocol/src/ast.d.ts +0 -4
  722. package/out/zero-protocol/src/ast.d.ts.map +1 -1
  723. package/out/zero-protocol/src/ast.js +21 -11
  724. package/out/zero-protocol/src/ast.js.map +1 -1
  725. package/out/zero-protocol/src/change-desired-queries.d.ts +0 -20
  726. package/out/zero-protocol/src/change-desired-queries.d.ts.map +1 -1
  727. package/out/zero-protocol/src/change-desired-queries.js.map +1 -1
  728. package/out/zero-protocol/src/client-schema.d.ts +2 -5
  729. package/out/zero-protocol/src/client-schema.d.ts.map +1 -1
  730. package/out/zero-protocol/src/client-schema.js.map +1 -1
  731. package/out/zero-protocol/src/close-connection.d.ts +0 -8
  732. package/out/zero-protocol/src/close-connection.d.ts.map +1 -1
  733. package/out/zero-protocol/src/close-connection.js.map +1 -1
  734. package/out/zero-protocol/src/connect.d.ts +0 -12
  735. package/out/zero-protocol/src/connect.d.ts.map +1 -1
  736. package/out/zero-protocol/src/connect.js.map +1 -1
  737. package/out/zero-protocol/src/custom-queries.d.ts +3 -17
  738. package/out/zero-protocol/src/custom-queries.d.ts.map +1 -1
  739. package/out/zero-protocol/src/custom-queries.js.map +1 -1
  740. package/out/zero-protocol/src/data.d.ts +0 -1
  741. package/out/zero-protocol/src/data.d.ts.map +1 -1
  742. package/out/zero-protocol/src/data.js +3 -1
  743. package/out/zero-protocol/src/data.js.map +1 -1
  744. package/out/zero-protocol/src/delete-clients.js.map +1 -1
  745. package/out/zero-protocol/src/down.d.ts +2 -2
  746. package/out/zero-protocol/src/down.js.map +1 -1
  747. package/out/zero-protocol/src/error.js.map +1 -1
  748. package/out/zero-protocol/src/inspect-down.d.ts +82 -84
  749. package/out/zero-protocol/src/inspect-down.d.ts.map +1 -1
  750. package/out/zero-protocol/src/inspect-down.js.map +1 -1
  751. package/out/zero-protocol/src/inspect-up.d.ts +0 -28
  752. package/out/zero-protocol/src/inspect-up.d.ts.map +1 -1
  753. package/out/zero-protocol/src/inspect-up.js.map +1 -1
  754. package/out/zero-protocol/src/mutate-server.d.ts +0 -21
  755. package/out/zero-protocol/src/mutate-server.d.ts.map +1 -1
  756. package/out/zero-protocol/src/mutate-server.js.map +1 -1
  757. package/out/zero-protocol/src/mutation-id.js.map +1 -1
  758. package/out/zero-protocol/src/mutation-type-enum.d.ts +0 -1
  759. package/out/zero-protocol/src/mutation-type-enum.d.ts.map +1 -1
  760. package/out/zero-protocol/src/mutation-type-enum.js.map +1 -1
  761. package/out/zero-protocol/src/mutation.d.ts +2 -4
  762. package/out/zero-protocol/src/mutation.d.ts.map +1 -1
  763. package/out/zero-protocol/src/mutation.js.map +1 -1
  764. package/out/zero-protocol/src/mutations-patch.d.ts +0 -33
  765. package/out/zero-protocol/src/mutations-patch.d.ts.map +1 -1
  766. package/out/zero-protocol/src/mutations-patch.js.map +1 -1
  767. package/out/zero-protocol/src/ping.d.ts +0 -2
  768. package/out/zero-protocol/src/ping.d.ts.map +1 -1
  769. package/out/zero-protocol/src/ping.js.map +1 -1
  770. package/out/zero-protocol/src/poke.d.ts +3 -2
  771. package/out/zero-protocol/src/poke.d.ts.map +1 -1
  772. package/out/zero-protocol/src/poke.js +1 -1
  773. package/out/zero-protocol/src/poke.js.map +1 -1
  774. package/out/zero-protocol/src/pong.d.ts +0 -2
  775. package/out/zero-protocol/src/pong.d.ts.map +1 -1
  776. package/out/zero-protocol/src/pong.js.map +1 -1
  777. package/out/zero-protocol/src/primary-key.js.map +1 -1
  778. package/out/zero-protocol/src/protocol-version.js +1 -0
  779. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  780. package/out/zero-protocol/src/pull.d.ts +2 -7
  781. package/out/zero-protocol/src/pull.d.ts.map +1 -1
  782. package/out/zero-protocol/src/pull.js.map +1 -1
  783. package/out/zero-protocol/src/push.d.ts +1 -3
  784. package/out/zero-protocol/src/push.d.ts.map +1 -1
  785. package/out/zero-protocol/src/push.js.map +1 -1
  786. package/out/zero-protocol/src/queries-patch.d.ts +0 -16
  787. package/out/zero-protocol/src/queries-patch.d.ts.map +1 -1
  788. package/out/zero-protocol/src/queries-patch.js +1 -1
  789. package/out/zero-protocol/src/queries-patch.js.map +1 -1
  790. package/out/zero-protocol/src/query-hash-visitor.js.map +1 -1
  791. package/out/zero-protocol/src/query-hash.js +2 -2
  792. package/out/zero-protocol/src/query-server.d.ts +2 -41
  793. package/out/zero-protocol/src/query-server.d.ts.map +1 -1
  794. package/out/zero-protocol/src/query-server.js.map +1 -1
  795. package/out/zero-protocol/src/row-patch.js.map +1 -1
  796. package/out/zero-protocol/src/up.d.ts +60 -60
  797. package/out/zero-protocol/src/up.js +1 -1
  798. package/out/zero-protocol/src/up.js.map +1 -1
  799. package/out/zero-protocol/src/update-auth.js.map +1 -1
  800. package/out/zero-protocol/src/version.d.ts +0 -1
  801. package/out/zero-protocol/src/version.d.ts.map +1 -1
  802. package/out/zero-protocol/src/version.js.map +1 -1
  803. package/out/zero-react/src/bindings.js +11 -11
  804. package/out/zero-react/src/mod.js +5 -5
  805. package/out/zero-react/src/use-query.js +2 -2
  806. package/out/zero-react/src/use-query.js.map +1 -1
  807. package/out/zero-react/src/zero-provider.d.ts +1 -1
  808. package/out/zero-react/src/zero-provider.d.ts.map +1 -1
  809. package/out/zero-react/src/zero-provider.js +2 -1
  810. package/out/zero-react/src/zero-provider.js.map +1 -1
  811. package/out/zero-react/src/zero.js +23 -23
  812. package/out/zero-schema/src/builder/relationship-builder.d.ts +0 -2
  813. package/out/zero-schema/src/builder/relationship-builder.d.ts.map +1 -1
  814. package/out/zero-schema/src/builder/relationship-builder.js.map +1 -1
  815. package/out/zero-schema/src/builder/schema-builder.js +3 -2
  816. package/out/zero-schema/src/builder/schema-builder.js.map +1 -1
  817. package/out/zero-schema/src/builder/table-builder.d.ts +1 -1
  818. package/out/zero-schema/src/builder/table-builder.d.ts.map +1 -1
  819. package/out/zero-schema/src/builder/table-builder.js +1 -1
  820. package/out/zero-schema/src/builder/table-builder.js.map +1 -1
  821. package/out/zero-schema/src/compiled-permissions.js.map +1 -1
  822. package/out/zero-schema/src/name-mapper.js +7 -5
  823. package/out/zero-schema/src/name-mapper.js.map +1 -1
  824. package/out/zero-schema/src/schema-config.d.ts +0 -1
  825. package/out/zero-schema/src/schema-config.d.ts.map +1 -1
  826. package/out/zero-schema/src/schema-config.js +1 -1
  827. package/out/zero-schema/src/schema-config.js.map +1 -1
  828. package/out/zero-schema/src/table-schema.d.ts +3 -11
  829. package/out/zero-schema/src/table-schema.d.ts.map +1 -1
  830. package/out/zero-server/src/adapters/drizzle.js.map +1 -1
  831. package/out/zero-server/src/adapters/kysely.js.map +1 -1
  832. package/out/zero-server/src/adapters/pg.js.map +1 -1
  833. package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
  834. package/out/zero-server/src/adapters/prisma.js.map +1 -1
  835. package/out/zero-server/src/closable-db-transaction.js.map +1 -1
  836. package/out/zero-server/src/custom.js +1 -1
  837. package/out/zero-server/src/custom.js.map +1 -1
  838. package/out/zero-server/src/mod.js +8 -8
  839. package/out/zero-server/src/process-mutations.js.map +1 -1
  840. package/out/zero-server/src/push-processor.js.map +1 -1
  841. package/out/zero-server/src/queries/process-queries.d.ts +2 -4
  842. package/out/zero-server/src/queries/process-queries.d.ts.map +1 -1
  843. package/out/zero-server/src/queries/process-queries.js +2 -1
  844. package/out/zero-server/src/queries/process-queries.js.map +1 -1
  845. package/out/zero-server/src/schema.js +7 -7
  846. package/out/zero-server/src/schema.js.map +1 -1
  847. package/out/zero-server/src/zql-database.js.map +1 -1
  848. package/out/zero-solid/src/bindings.js +11 -11
  849. package/out/zero-solid/src/mod.js +5 -5
  850. package/out/zero-solid/src/solid-view.d.ts +0 -2
  851. package/out/zero-solid/src/solid-view.d.ts.map +1 -1
  852. package/out/zero-solid/src/solid-view.js +1 -1
  853. package/out/zero-solid/src/solid-view.js.map +1 -1
  854. package/out/zero-solid/src/use-connection-state.js +2 -1
  855. package/out/zero-solid/src/use-connection-state.js.map +1 -1
  856. package/out/zero-solid/src/use-query.js.map +1 -1
  857. package/out/zero-solid/src/use-zero-online.js +2 -1
  858. package/out/zero-solid/src/use-zero-online.js.map +1 -1
  859. package/out/zero-solid/src/use-zero.js +3 -2
  860. package/out/zero-solid/src/use-zero.js.map +1 -1
  861. package/out/zero-solid/src/zero.js +23 -23
  862. package/out/zero-types/src/name-mapper.d.ts +2 -1
  863. package/out/zero-types/src/name-mapper.d.ts.map +1 -1
  864. package/out/zero-types/src/name-mapper.js.map +1 -1
  865. package/out/zero-types/src/schema-value.d.ts +3 -2
  866. package/out/zero-types/src/schema-value.d.ts.map +1 -1
  867. package/out/zero-types/src/schema.d.ts +1 -1
  868. package/out/zero-types/src/schema.d.ts.map +1 -1
  869. package/out/zql/src/builder/builder.d.ts +1 -11
  870. package/out/zql/src/builder/builder.d.ts.map +1 -1
  871. package/out/zql/src/builder/builder.js +15 -13
  872. package/out/zql/src/builder/builder.js.map +1 -1
  873. package/out/zql/src/builder/correlated-predicate-pushdown.js.map +1 -1
  874. package/out/zql/src/builder/debug-delegate.js.map +1 -1
  875. package/out/zql/src/builder/filter.d.ts +0 -1
  876. package/out/zql/src/builder/filter.d.ts.map +1 -1
  877. package/out/zql/src/builder/filter.js.map +1 -1
  878. package/out/zql/src/builder/like.js +0 -1
  879. package/out/zql/src/builder/like.js.map +1 -1
  880. package/out/zql/src/error.d.ts +0 -5
  881. package/out/zql/src/error.d.ts.map +1 -1
  882. package/out/zql/src/error.js.map +1 -1
  883. package/out/zql/src/ivm/array-view.js.map +1 -1
  884. package/out/zql/src/ivm/cap.d.ts +1 -1
  885. package/out/zql/src/ivm/cap.d.ts.map +1 -1
  886. package/out/zql/src/ivm/cap.js +12 -4
  887. package/out/zql/src/ivm/cap.js.map +1 -1
  888. package/out/zql/src/ivm/constraint.d.ts +0 -7
  889. package/out/zql/src/ivm/constraint.d.ts.map +1 -1
  890. package/out/zql/src/ivm/constraint.js +1 -1
  891. package/out/zql/src/ivm/constraint.js.map +1 -1
  892. package/out/zql/src/ivm/data.d.ts +15 -2
  893. package/out/zql/src/ivm/data.d.ts.map +1 -1
  894. package/out/zql/src/ivm/data.js +15 -1
  895. package/out/zql/src/ivm/data.js.map +1 -1
  896. package/out/zql/src/ivm/deferred-input.js.map +1 -1
  897. package/out/zql/src/ivm/exists.d.ts.map +1 -1
  898. package/out/zql/src/ivm/exists.js +32 -22
  899. package/out/zql/src/ivm/exists.js.map +1 -1
  900. package/out/zql/src/ivm/fan-in.js.map +1 -1
  901. package/out/zql/src/ivm/fan-out.js.map +1 -1
  902. package/out/zql/src/ivm/filter-operators.d.ts +5 -0
  903. package/out/zql/src/ivm/filter-operators.d.ts.map +1 -1
  904. package/out/zql/src/ivm/filter-operators.js +1 -1
  905. package/out/zql/src/ivm/filter-operators.js.map +1 -1
  906. package/out/zql/src/ivm/filter-push.js.map +1 -1
  907. package/out/zql/src/ivm/filter.js.map +1 -1
  908. package/out/zql/src/ivm/flipped-join.js +1 -3
  909. package/out/zql/src/ivm/flipped-join.js.map +1 -1
  910. package/out/zql/src/ivm/join-index-tap.js.map +1 -1
  911. package/out/zql/src/ivm/join-index.js.map +1 -1
  912. package/out/zql/src/ivm/join-utils.js +11 -13
  913. package/out/zql/src/ivm/join-utils.js.map +1 -1
  914. package/out/zql/src/ivm/join.d.ts.map +1 -1
  915. package/out/zql/src/ivm/join.js +6 -3
  916. package/out/zql/src/ivm/join.js.map +1 -1
  917. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
  918. package/out/zql/src/ivm/memory-source.d.ts +1 -2
  919. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  920. package/out/zql/src/ivm/memory-source.js +27 -23
  921. package/out/zql/src/ivm/memory-source.js.map +1 -1
  922. package/out/zql/src/ivm/memory-storage.js.map +1 -1
  923. package/out/zql/src/ivm/operator.d.ts +6 -0
  924. package/out/zql/src/ivm/operator.d.ts.map +1 -1
  925. package/out/zql/src/ivm/operator.js +2 -2
  926. package/out/zql/src/ivm/operator.js.map +1 -1
  927. package/out/zql/src/ivm/push-accumulated.js +0 -1
  928. package/out/zql/src/ivm/push-accumulated.js.map +1 -1
  929. package/out/zql/src/ivm/skip-yields.js.map +1 -1
  930. package/out/zql/src/ivm/skip.js.map +1 -1
  931. package/out/zql/src/ivm/stream.d.ts +0 -1
  932. package/out/zql/src/ivm/stream.d.ts.map +1 -1
  933. package/out/zql/src/ivm/stream.js.map +1 -1
  934. package/out/zql/src/ivm/take-gate.js.map +1 -1
  935. package/out/zql/src/ivm/take.d.ts.map +1 -1
  936. package/out/zql/src/ivm/take.js +7 -8
  937. package/out/zql/src/ivm/take.js.map +1 -1
  938. package/out/zql/src/ivm/union-fan-in.d.ts +0 -1
  939. package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
  940. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  941. package/out/zql/src/ivm/union-fan-out.js.map +1 -1
  942. package/out/zql/src/ivm/view-apply-change.d.ts +5 -35
  943. package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
  944. package/out/zql/src/ivm/view-apply-change.js.map +1 -1
  945. package/out/zql/src/mutate/crud.d.ts +1 -3
  946. package/out/zql/src/mutate/crud.d.ts.map +1 -1
  947. package/out/zql/src/mutate/crud.js +2 -1
  948. package/out/zql/src/mutate/crud.js.map +1 -1
  949. package/out/zql/src/mutate/mutator-registry.d.ts +1 -1
  950. package/out/zql/src/mutate/mutator-registry.d.ts.map +1 -1
  951. package/out/zql/src/mutate/mutator-registry.js.map +1 -1
  952. package/out/zql/src/mutate/mutator.d.ts +1 -1
  953. package/out/zql/src/mutate/mutator.d.ts.map +1 -1
  954. package/out/zql/src/mutate/mutator.js.map +1 -1
  955. package/out/zql/src/planner/planner-builder.js +1 -1
  956. package/out/zql/src/planner/planner-builder.js.map +1 -1
  957. package/out/zql/src/planner/planner-connection.js.map +1 -1
  958. package/out/zql/src/planner/planner-debug.d.ts +10 -9
  959. package/out/zql/src/planner/planner-debug.d.ts.map +1 -1
  960. package/out/zql/src/planner/planner-debug.js.map +1 -1
  961. package/out/zql/src/planner/planner-fan-in.js.map +1 -1
  962. package/out/zql/src/planner/planner-fan-out.js.map +1 -1
  963. package/out/zql/src/planner/planner-filter.js.map +1 -1
  964. package/out/zql/src/planner/planner-graph.js +1 -5
  965. package/out/zql/src/planner/planner-graph.js.map +1 -1
  966. package/out/zql/src/planner/planner-join.js +1 -1
  967. package/out/zql/src/planner/planner-join.js.map +1 -1
  968. package/out/zql/src/planner/planner-node.d.ts +0 -1
  969. package/out/zql/src/planner/planner-node.d.ts.map +1 -1
  970. package/out/zql/src/planner/planner-node.js.map +1 -1
  971. package/out/zql/src/planner/planner-source.js.map +1 -1
  972. package/out/zql/src/planner/planner-terminus.js.map +1 -1
  973. package/out/zql/src/planner/planner-warnings.d.ts +3 -3
  974. package/out/zql/src/planner/planner-warnings.d.ts.map +1 -1
  975. package/out/zql/src/planner/planner-warnings.js.map +1 -1
  976. package/out/zql/src/query/create-builder.js +2 -1
  977. package/out/zql/src/query/create-builder.js.map +1 -1
  978. package/out/zql/src/query/expression.d.ts +0 -22
  979. package/out/zql/src/query/expression.d.ts.map +1 -1
  980. package/out/zql/src/query/expression.js +1 -1
  981. package/out/zql/src/query/expression.js.map +1 -1
  982. package/out/zql/src/query/measure-push-operator.js.map +1 -1
  983. package/out/zql/src/query/named.js +2 -1
  984. package/out/zql/src/query/named.js.map +1 -1
  985. package/out/zql/src/query/query-delegate-base.d.ts +0 -7
  986. package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
  987. package/out/zql/src/query/query-delegate-base.js +1 -1
  988. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  989. package/out/zql/src/query/query-delegate.d.ts +1 -4
  990. package/out/zql/src/query/query-delegate.d.ts.map +1 -1
  991. package/out/zql/src/query/query-impl.js +3 -2
  992. package/out/zql/src/query/query-impl.js.map +1 -1
  993. package/out/zql/src/query/query-internals.d.ts +0 -3
  994. package/out/zql/src/query/query-internals.d.ts.map +1 -1
  995. package/out/zql/src/query/query-internals.js.map +1 -1
  996. package/out/zql/src/query/query-registry.d.ts +5 -5
  997. package/out/zql/src/query/query-registry.d.ts.map +1 -1
  998. package/out/zql/src/query/query-registry.js +1 -1
  999. package/out/zql/src/query/query-registry.js.map +1 -1
  1000. package/out/zql/src/query/query-transitions.js +1 -1
  1001. package/out/zql/src/query/query-transitions.js.map +1 -1
  1002. package/out/zql/src/query/query.d.ts +2 -13
  1003. package/out/zql/src/query/query.d.ts.map +1 -1
  1004. package/out/zql/src/query/runnable-query-impl.d.ts +1 -19
  1005. package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -1
  1006. package/out/zql/src/query/runnable-query-impl.js +2 -1
  1007. package/out/zql/src/query/runnable-query-impl.js.map +1 -1
  1008. package/out/zql/src/query/static-query.js.map +1 -1
  1009. package/out/zql/src/query/ttl.d.ts +2 -3
  1010. package/out/zql/src/query/ttl.d.ts.map +1 -1
  1011. package/out/zql/src/query/ttl.js +8 -8
  1012. package/out/zql/src/query/ttl.js.map +1 -1
  1013. package/out/zql/src/query/validate-input.js.map +1 -1
  1014. package/out/zqlite/src/database-storage.js +195 -26
  1015. package/out/zqlite/src/database-storage.js.map +1 -1
  1016. package/out/zqlite/src/db.d.ts +47 -1
  1017. package/out/zqlite/src/db.d.ts.map +1 -1
  1018. package/out/zqlite/src/db.js +121 -21
  1019. package/out/zqlite/src/db.js.map +1 -1
  1020. package/out/zqlite/src/explain-queries.js.map +1 -1
  1021. package/out/zqlite/src/fetch-sql.d.ts +27 -0
  1022. package/out/zqlite/src/fetch-sql.d.ts.map +1 -0
  1023. package/out/zqlite/src/fetch-sql.js +112 -0
  1024. package/out/zqlite/src/fetch-sql.js.map +1 -0
  1025. package/out/zqlite/src/index-usage.js.map +1 -1
  1026. package/out/zqlite/src/internal/sql-inline.js.map +1 -1
  1027. package/out/zqlite/src/internal/sql.js.map +1 -1
  1028. package/out/zqlite/src/internal/statement-cache.d.ts +7 -0
  1029. package/out/zqlite/src/internal/statement-cache.d.ts.map +1 -1
  1030. package/out/zqlite/src/internal/statement-cache.js +11 -4
  1031. package/out/zqlite/src/internal/statement-cache.js.map +1 -1
  1032. package/out/zqlite/src/mod.js +5 -5
  1033. package/out/zqlite/src/pending-delta.js.map +1 -1
  1034. package/out/zqlite/src/query-builder.d.ts +11 -3
  1035. package/out/zqlite/src/query-builder.d.ts.map +1 -1
  1036. package/out/zqlite/src/query-builder.js +22 -7
  1037. package/out/zqlite/src/query-builder.js.map +1 -1
  1038. package/out/zqlite/src/query-delegate.js.map +1 -1
  1039. package/out/zqlite/src/resolve-scalar-subqueries.js +2 -5
  1040. package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
  1041. package/out/zqlite/src/sqlite-cost-model.js +3 -2
  1042. package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
  1043. package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
  1044. package/out/zqlite/src/table-source.d.ts +20 -3
  1045. package/out/zqlite/src/table-source.d.ts.map +1 -1
  1046. package/out/zqlite/src/table-source.js +74 -40
  1047. package/out/zqlite/src/table-source.js.map +1 -1
  1048. package/package.json +39 -39
  1049. package/out/analyze-query/src/bin-analyze.d.ts +0 -2
  1050. package/out/analyze-query/src/bin-analyze.d.ts.map +0 -1
  1051. package/out/analyze-query/src/bin-analyze.js +0 -283
  1052. package/out/analyze-query/src/bin-analyze.js.map +0 -1
  1053. package/out/otel/src/maybe-time.d.ts +0 -3
  1054. package/out/otel/src/maybe-time.d.ts.map +0 -1
  1055. package/out/otel/src/maybe-time.js +0 -15
  1056. package/out/otel/src/maybe-time.js.map +0 -1
  1057. package/out/shared/src/cache.d.ts +0 -22
  1058. package/out/shared/src/cache.d.ts.map +0 -1
  1059. package/out/shared/src/custom-key-map.d.ts +0 -26
  1060. package/out/shared/src/custom-key-map.d.ts.map +0 -1
  1061. package/out/shared/src/custom-key-set.d.ts +0 -25
  1062. package/out/shared/src/custom-key-set.d.ts.map +0 -1
  1063. package/out/shared/src/logging-test-utils.d.ts +0 -12
  1064. package/out/shared/src/logging-test-utils.d.ts.map +0 -1
  1065. package/out/shared/src/sorted-entries.d.ts +0 -2
  1066. package/out/shared/src/sorted-entries.d.ts.map +0 -1
  1067. package/out/zero/src/analyze-query.d.ts +0 -3
  1068. package/out/zero/src/analyze-query.d.ts.map +0 -1
  1069. package/out/zero/src/analyze-query.js +0 -3
  1070. package/out/zero/src/server/change-streamer.d.ts +0 -2
  1071. package/out/zero/src/server/change-streamer.d.ts.map +0 -1
  1072. package/out/zero/src/server/main.d.ts +0 -2
  1073. package/out/zero/src/server/main.d.ts.map +0 -1
  1074. package/out/zero/src/server/reaper.d.ts +0 -2
  1075. package/out/zero/src/server/reaper.d.ts.map +0 -1
  1076. package/out/zero/src/server/replicator.d.ts +0 -2
  1077. package/out/zero/src/server/replicator.d.ts.map +0 -1
  1078. package/out/zero/src/server/syncer.d.ts +0 -2
  1079. package/out/zero/src/server/syncer.d.ts.map +0 -1
  1080. package/out/zero-cache/src/auth/jwt.d.ts +0 -12
  1081. package/out/zero-cache/src/auth/jwt.d.ts.map +0 -1
  1082. package/out/zero-cache/src/auth/load-permissions.d.ts +0 -17
  1083. package/out/zero-cache/src/auth/load-permissions.d.ts.map +0 -1
  1084. package/out/zero-cache/src/auth/write-authorizer.d.ts +0 -28
  1085. package/out/zero-cache/src/auth/write-authorizer.d.ts.map +0 -1
  1086. package/out/zero-cache/src/config/server-context.d.ts +0 -16
  1087. package/out/zero-cache/src/config/server-context.d.ts.map +0 -1
  1088. package/out/zero-cache/src/custom/fetch.d.ts +0 -38
  1089. package/out/zero-cache/src/custom/fetch.d.ts.map +0 -1
  1090. package/out/zero-cache/src/custom/metrics.d.ts +0 -31
  1091. package/out/zero-cache/src/custom/metrics.d.ts.map +0 -1
  1092. package/out/zero-cache/src/custom-queries/transform-query.d.ts +0 -68
  1093. package/out/zero-cache/src/custom-queries/transform-query.d.ts.map +0 -1
  1094. package/out/zero-cache/src/db/create.d.ts +0 -12
  1095. package/out/zero-cache/src/db/create.d.ts.map +0 -1
  1096. package/out/zero-cache/src/db/delete-lite-db.d.ts +0 -2
  1097. package/out/zero-cache/src/db/delete-lite-db.d.ts.map +0 -1
  1098. package/out/zero-cache/src/db/index-predicate.d.ts +0 -4
  1099. package/out/zero-cache/src/db/index-predicate.d.ts.map +0 -1
  1100. package/out/zero-cache/src/db/migration-lite.d.ts +0 -78
  1101. package/out/zero-cache/src/db/migration-lite.d.ts.map +0 -1
  1102. package/out/zero-cache/src/db/migration.d.ts +0 -80
  1103. package/out/zero-cache/src/db/migration.d.ts.map +0 -1
  1104. package/out/zero-cache/src/db/pg-copy-binary.d.ts +0 -101
  1105. package/out/zero-cache/src/db/pg-copy-binary.d.ts.map +0 -1
  1106. package/out/zero-cache/src/db/pg-copy.d.ts +0 -30
  1107. package/out/zero-cache/src/db/pg-copy.d.ts.map +0 -1
  1108. package/out/zero-cache/src/db/pg-type-parser.d.ts +0 -15
  1109. package/out/zero-cache/src/db/pg-type-parser.d.ts.map +0 -1
  1110. package/out/zero-cache/src/db/transaction-pool.d.ts +0 -205
  1111. package/out/zero-cache/src/db/transaction-pool.d.ts.map +0 -1
  1112. package/out/zero-cache/src/db/warmup.d.ts +0 -4
  1113. package/out/zero-cache/src/db/warmup.d.ts.map +0 -1
  1114. package/out/zero-cache/src/observability/events.d.ts +0 -15
  1115. package/out/zero-cache/src/observability/events.d.ts.map +0 -1
  1116. package/out/zero-cache/src/observability/log-throttle.d.ts +0 -44
  1117. package/out/zero-cache/src/observability/log-throttle.d.ts.map +0 -1
  1118. package/out/zero-cache/src/server/anonymous-otel-start.d.ts +0 -21
  1119. package/out/zero-cache/src/server/anonymous-otel-start.d.ts.map +0 -1
  1120. package/out/zero-cache/src/server/change-streamer.d.ts +0 -3
  1121. package/out/zero-cache/src/server/change-streamer.d.ts.map +0 -1
  1122. package/out/zero-cache/src/server/inspector-delegate.d.ts +0 -71
  1123. package/out/zero-cache/src/server/inspector-delegate.d.ts.map +0 -1
  1124. package/out/zero-cache/src/server/main.d.ts +0 -3
  1125. package/out/zero-cache/src/server/main.d.ts.map +0 -1
  1126. package/out/zero-cache/src/server/otel-diag-logger.d.ts +0 -16
  1127. package/out/zero-cache/src/server/otel-diag-logger.d.ts.map +0 -1
  1128. package/out/zero-cache/src/server/otel-start.d.ts +0 -3
  1129. package/out/zero-cache/src/server/otel-start.d.ts.map +0 -1
  1130. package/out/zero-cache/src/server/priority-op.d.ts +0 -8
  1131. package/out/zero-cache/src/server/priority-op.d.ts.map +0 -1
  1132. package/out/zero-cache/src/server/reaper.d.ts +0 -3
  1133. package/out/zero-cache/src/server/reaper.d.ts.map +0 -1
  1134. package/out/zero-cache/src/server/replicator.d.ts +0 -10
  1135. package/out/zero-cache/src/server/replicator.d.ts.map +0 -1
  1136. package/out/zero-cache/src/server/slot-keeper.d.ts +0 -26
  1137. package/out/zero-cache/src/server/slot-keeper.d.ts.map +0 -1
  1138. package/out/zero-cache/src/server/syncer.d.ts +0 -3
  1139. package/out/zero-cache/src/server/syncer.d.ts.map +0 -1
  1140. package/out/zero-cache/src/services/analyze.d.ts +0 -9
  1141. package/out/zero-cache/src/services/analyze.d.ts.map +0 -1
  1142. package/out/zero-cache/src/services/change-source/change-source.d.ts +0 -32
  1143. package/out/zero-cache/src/services/change-source/change-source.d.ts.map +0 -1
  1144. package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts +0 -57
  1145. package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts.map +0 -1
  1146. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.d.ts +0 -55
  1147. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.d.ts.map +0 -1
  1148. package/out/zero-cache/src/services/change-source/common/init-cleanup.d.ts +0 -24
  1149. package/out/zero-cache/src/services/change-source/common/init-cleanup.d.ts.map +0 -1
  1150. package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts +0 -115
  1151. package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts.map +0 -1
  1152. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts +0 -14
  1153. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +0 -1
  1154. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts +0 -25
  1155. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +0 -1
  1156. package/out/zero-cache/src/services/change-source/pg/backfill-metadata.d.ts +0 -14
  1157. package/out/zero-cache/src/services/change-source/pg/backfill-metadata.d.ts.map +0 -1
  1158. package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts +0 -36
  1159. package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts.map +0 -1
  1160. package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts +0 -65
  1161. package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts.map +0 -1
  1162. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +0 -115
  1163. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +0 -1
  1164. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +0 -155
  1165. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +0 -1
  1166. package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.d.ts +0 -17
  1167. package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.d.ts.map +0 -1
  1168. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.d.ts +0 -28
  1169. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.d.ts.map +0 -1
  1170. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput.types.d.ts +0 -76
  1171. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput.types.d.ts.map +0 -1
  1172. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts +0 -169
  1173. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts.map +0 -1
  1174. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts +0 -16
  1175. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts.map +0 -1
  1176. package/out/zero-cache/src/services/change-source/pg/replication-slot-health.d.ts +0 -15
  1177. package/out/zero-cache/src/services/change-source/pg/replication-slot-health.d.ts.map +0 -1
  1178. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts +0 -127
  1179. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts.map +0 -1
  1180. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts +0 -9
  1181. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +0 -1
  1182. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts +0 -68
  1183. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts.map +0 -1
  1184. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts +0 -72
  1185. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts.map +0 -1
  1186. package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts +0 -50
  1187. package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts.map +0 -1
  1188. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts +0 -14
  1189. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts.map +0 -1
  1190. package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts +0 -18
  1191. package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts.map +0 -1
  1192. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts +0 -98
  1193. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts.map +0 -1
  1194. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts +0 -34
  1195. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts.map +0 -1
  1196. package/out/zero-cache/src/services/change-streamer/change-log-compare-digest.d.ts +0 -34
  1197. package/out/zero-cache/src/services/change-streamer/change-log-compare-digest.d.ts.map +0 -1
  1198. package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts +0 -158
  1199. package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts.map +0 -1
  1200. package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.d.ts +0 -19
  1201. package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.d.ts.map +0 -1
  1202. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +0 -78
  1203. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +0 -1
  1204. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +0 -139
  1205. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +0 -1
  1206. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +0 -586
  1207. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +0 -1
  1208. package/out/zero-cache/src/services/change-streamer/drain-tracker.d.ts +0 -24
  1209. package/out/zero-cache/src/services/change-streamer/drain-tracker.d.ts.map +0 -1
  1210. package/out/zero-cache/src/services/change-streamer/error-type-enum.d.ts +0 -15
  1211. package/out/zero-cache/src/services/change-streamer/error-type-enum.d.ts.map +0 -1
  1212. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts +0 -49
  1213. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +0 -1
  1214. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts +0 -53
  1215. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts.map +0 -1
  1216. package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.d.ts +0 -88
  1217. package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.d.ts.map +0 -1
  1218. package/out/zero-cache/src/services/change-streamer/replica-poller.d.ts +0 -15
  1219. package/out/zero-cache/src/services/change-streamer/replica-poller.d.ts.map +0 -1
  1220. package/out/zero-cache/src/services/change-streamer/restore-admission.d.ts +0 -243
  1221. package/out/zero-cache/src/services/change-streamer/restore-admission.d.ts.map +0 -1
  1222. package/out/zero-cache/src/services/change-streamer/schema/init.d.ts +0 -6
  1223. package/out/zero-cache/src/services/change-streamer/schema/init.d.ts.map +0 -1
  1224. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +0 -152
  1225. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +0 -1
  1226. package/out/zero-cache/src/services/change-streamer/shard-sampling.d.ts +0 -11
  1227. package/out/zero-cache/src/services/change-streamer/shard-sampling.d.ts.map +0 -1
  1228. package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts +0 -92
  1229. package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts.map +0 -1
  1230. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts +0 -36
  1231. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts.map +0 -1
  1232. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts +0 -22
  1233. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts.map +0 -1
  1234. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.d.ts +0 -99
  1235. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.d.ts.map +0 -1
  1236. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.d.ts +0 -83
  1237. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.d.ts.map +0 -1
  1238. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.d.ts +0 -121
  1239. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.d.ts.map +0 -1
  1240. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-read-router.d.ts +0 -73
  1241. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-read-router.d.ts.map +0 -1
  1242. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.d.ts +0 -62
  1243. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.d.ts.map +0 -1
  1244. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts +0 -114
  1245. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts.map +0 -1
  1246. package/out/zero-cache/src/services/change-streamer/storer.d.ts +0 -276
  1247. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +0 -1
  1248. package/out/zero-cache/src/services/change-streamer/subscribe.d.ts +0 -485
  1249. package/out/zero-cache/src/services/change-streamer/subscribe.d.ts.map +0 -1
  1250. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +0 -194
  1251. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +0 -1
  1252. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts +0 -52
  1253. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts.map +0 -1
  1254. package/out/zero-cache/src/services/limiter/sliding-window-limiter.d.ts +0 -57
  1255. package/out/zero-cache/src/services/limiter/sliding-window-limiter.d.ts.map +0 -1
  1256. package/out/zero-cache/src/services/litestream/commands.d.ts +0 -77
  1257. package/out/zero-cache/src/services/litestream/commands.d.ts.map +0 -1
  1258. package/out/zero-cache/src/services/litestream/litestream-controller.d.ts +0 -78
  1259. package/out/zero-cache/src/services/litestream/litestream-controller.d.ts.map +0 -1
  1260. package/out/zero-cache/src/services/litestream/metrics.d.ts +0 -31
  1261. package/out/zero-cache/src/services/litestream/metrics.d.ts.map +0 -1
  1262. package/out/zero-cache/src/services/litestream/restore-progress.d.ts +0 -24
  1263. package/out/zero-cache/src/services/litestream/restore-progress.d.ts.map +0 -1
  1264. package/out/zero-cache/src/services/mutagen/mutagen.d.ts +0 -40
  1265. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +0 -1
  1266. package/out/zero-cache/src/services/mutagen/pusher.d.ts +0 -63
  1267. package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +0 -1
  1268. package/out/zero-cache/src/services/replicator/change-log-db.d.ts +0 -368
  1269. package/out/zero-cache/src/services/replicator/change-log-db.d.ts.map +0 -1
  1270. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts +0 -56
  1271. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts.map +0 -1
  1272. package/out/zero-cache/src/services/replicator/change-processor.d.ts +0 -37
  1273. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +0 -1
  1274. package/out/zero-cache/src/services/replicator/drain-handler.d.ts +0 -82
  1275. package/out/zero-cache/src/services/replicator/drain-handler.d.ts.map +0 -1
  1276. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +0 -25
  1277. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +0 -1
  1278. package/out/zero-cache/src/services/replicator/notifier.d.ts +0 -9
  1279. package/out/zero-cache/src/services/replicator/notifier.d.ts.map +0 -1
  1280. package/out/zero-cache/src/services/replicator/replication-status.d.ts +0 -71
  1281. package/out/zero-cache/src/services/replicator/replication-status.d.ts.map +0 -1
  1282. package/out/zero-cache/src/services/replicator/replicator.d.ts +0 -86
  1283. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +0 -1
  1284. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts +0 -55
  1285. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts.map +0 -1
  1286. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts +0 -132
  1287. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts.map +0 -1
  1288. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.d.ts +0 -120
  1289. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.d.ts.map +0 -1
  1290. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts +0 -111
  1291. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts.map +0 -1
  1292. package/out/zero-cache/src/services/run-ast.d.ts +0 -39
  1293. package/out/zero-cache/src/services/run-ast.d.ts.map +0 -1
  1294. package/out/zero-cache/src/services/runner.d.ts +0 -19
  1295. package/out/zero-cache/src/services/runner.d.ts.map +0 -1
  1296. package/out/zero-cache/src/services/view-syncer/active-users-gauge.d.ts +0 -17
  1297. package/out/zero-cache/src/services/view-syncer/active-users-gauge.d.ts.map +0 -1
  1298. package/out/zero-cache/src/services/view-syncer/advancement-metrics.d.ts +0 -26
  1299. package/out/zero-cache/src/services/view-syncer/advancement-metrics.d.ts.map +0 -1
  1300. package/out/zero-cache/src/services/view-syncer/batch-pacer.d.ts +0 -79
  1301. package/out/zero-cache/src/services/view-syncer/batch-pacer.d.ts.map +0 -1
  1302. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +0 -79
  1303. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +0 -1
  1304. package/out/zero-cache/src/services/view-syncer/client-schema.d.ts +0 -5
  1305. package/out/zero-cache/src/services/view-syncer/client-schema.d.ts.map +0 -1
  1306. package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts +0 -184
  1307. package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts.map +0 -1
  1308. package/out/zero-cache/src/services/view-syncer/cvr-purger.d.ts +0 -22
  1309. package/out/zero-cache/src/services/view-syncer/cvr-purger.d.ts.map +0 -1
  1310. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +0 -128
  1311. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +0 -1
  1312. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +0 -294
  1313. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +0 -1
  1314. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts +0 -81
  1315. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts.map +0 -1
  1316. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts +0 -45
  1317. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts.map +0 -1
  1318. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.d.ts +0 -53
  1319. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.d.ts.map +0 -1
  1320. package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts +0 -33
  1321. package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts.map +0 -1
  1322. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts +0 -51
  1323. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts.map +0 -1
  1324. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts +0 -34
  1325. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts.map +0 -1
  1326. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +0 -296
  1327. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +0 -1
  1328. package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts +0 -7
  1329. package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts.map +0 -1
  1330. package/out/zero-cache/src/services/view-syncer/push-cost.d.ts +0 -132
  1331. package/out/zero-cache/src/services/view-syncer/push-cost.d.ts.map +0 -1
  1332. package/out/zero-cache/src/services/view-syncer/push-cutoff.d.ts +0 -55
  1333. package/out/zero-cache/src/services/view-syncer/push-cutoff.d.ts.map +0 -1
  1334. package/out/zero-cache/src/services/view-syncer/query-covering.d.ts +0 -28
  1335. package/out/zero-cache/src/services/view-syncer/query-covering.d.ts.map +0 -1
  1336. package/out/zero-cache/src/services/view-syncer/query-shape.d.ts +0 -25
  1337. package/out/zero-cache/src/services/view-syncer/query-shape.d.ts.map +0 -1
  1338. package/out/zero-cache/src/services/view-syncer/query-stats.d.ts +0 -89
  1339. package/out/zero-cache/src/services/view-syncer/query-stats.d.ts.map +0 -1
  1340. package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts +0 -90
  1341. package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts.map +0 -1
  1342. package/out/zero-cache/src/services/view-syncer/row-set-signature.d.ts +0 -17
  1343. package/out/zero-cache/src/services/view-syncer/row-set-signature.d.ts.map +0 -1
  1344. package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts +0 -86
  1345. package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts.map +0 -1
  1346. package/out/zero-cache/src/services/view-syncer/schema/init.d.ts +0 -5
  1347. package/out/zero-cache/src/services/view-syncer/schema/init.d.ts.map +0 -1
  1348. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +0 -563
  1349. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +0 -1
  1350. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts +0 -95
  1351. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts.map +0 -1
  1352. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +0 -412
  1353. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +0 -1
  1354. package/out/zero-cache/src/services/view-syncer/tracer.d.ts +0 -2
  1355. package/out/zero-cache/src/services/view-syncer/tracer.d.ts.map +0 -1
  1356. package/out/zero-cache/src/services/view-syncer/ttl-clock.d.ts +0 -10
  1357. package/out/zero-cache/src/services/view-syncer/ttl-clock.d.ts.map +0 -1
  1358. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +0 -133
  1359. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +0 -1
  1360. package/out/zero-cache/src/types/pg-patch.d.ts +0 -21
  1361. package/out/zero-cache/src/types/pg-patch.d.ts.map +0 -1
  1362. package/out/zero-cache/src/types/pg-versions.d.ts +0 -3
  1363. package/out/zero-cache/src/types/pg-versions.d.ts.map +0 -1
  1364. package/out/zero-cache/src/workers/replicator.d.ts +0 -57
  1365. package/out/zero-cache/src/workers/replicator.d.ts.map +0 -1
  1366. package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts +0 -14
  1367. package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +0 -1
  1368. package/out/zero-cache/src/workers/syncer.d.ts +0 -67
  1369. package/out/zero-cache/src/workers/syncer.d.ts.map +0 -1
  1370. package/out/zero-events/src/index.d.ts +0 -27
  1371. package/out/zero-events/src/index.d.ts.map +0 -1
  1372. package/out/zero-events/src/json.d.ts +0 -20
  1373. package/out/zero-events/src/json.d.ts.map +0 -1
  1374. package/out/zero-events/src/status.d.ts +0 -144
  1375. package/out/zero-events/src/status.d.ts.map +0 -1
  1376. package/out/zqlite/src/database-storage.d.ts +0 -24
  1377. package/out/zqlite/src/database-storage.d.ts.map +0 -1
  1378. package/out/zqlite/src/explain-queries.d.ts +0 -4
  1379. package/out/zqlite/src/explain-queries.d.ts.map +0 -1
  1380. package/out/zqlite/src/internal/sql-inline.d.ts +0 -13
  1381. package/out/zqlite/src/internal/sql-inline.d.ts.map +0 -1
  1382. package/out/zqlite/src/resolve-scalar-subqueries.d.ts +0 -72
  1383. package/out/zqlite/src/resolve-scalar-subqueries.d.ts.map +0 -1
  1384. package/out/zqlite/src/sqlite-cost-model.d.ts +0 -17
  1385. package/out/zqlite/src/sqlite-cost-model.d.ts.map +0 -1
  1386. package/out/zqlite/src/sqlite-stat-fanout.d.ts +0 -121
  1387. package/out/zqlite/src/sqlite-stat-fanout.d.ts.map +0 -1
@@ -1,19 +1,22 @@
1
1
  import { assert, unreachable } from "../../shared/src/asserts.js";
2
2
  import { getOrInsertComputed } from "../../shared/src/map.js";
3
3
  import { must } from "../../shared/src/must.js";
4
- import { assertOrderingIncludesPK } from "../../zql/src/query/complete-ordering.js";
4
+ import { assignProperty } from "../../shared/src/objects.js";
5
5
  import { makeComparator } from "../../zql/src/ivm/data.js";
6
+ import { assertOrderingIncludesPK } from "../../zql/src/query/complete-ordering.js";
6
7
  import { createPredicate, transformFilters } from "../../zql/src/builder/filter.js";
7
8
  import { genPushAndWriteWithSplitEdit, generateWithOverlay, generateWithOverlayUnordered, generateWithStart } from "../../zql/src/ivm/memory-source.js";
8
- import { timeSampled } from "../../otel/src/maybe-time.js";
9
- import { recordIndexUsage } from "./index-usage.js";
10
9
  import { compile, format, sql } from "./internal/sql.js";
10
+ import { toSQLiteType } from "./query-builder.js";
11
+ import { FetchSQLCache } from "./fetch-sql.js";
12
+ import { recordIndexUsage } from "./index-usage.js";
11
13
  import { StatementCache } from "./internal/statement-cache.js";
12
14
  import { NOT_OVERRIDDEN, PendingDelta, generateWithPendingDelta, generateWithPendingDeltaUnordered } from "./pending-delta.js";
13
- import { buildSelectQueries, toSQLiteType } from "./query-builder.js";
14
15
  import SQLite3Database from "@rocicorp/zero-sqlite3";
15
16
  //#region ../zqlite/src/table-source.ts
16
17
  var eventCount = 0;
18
+ var FIRST_BATCH_ROWS = 1;
19
+ var MAX_BATCH_ROWS = 128;
17
20
  /**
18
21
  * A source that is backed by a SQLite table.
19
22
  *
@@ -30,6 +33,7 @@ var eventCount = 0;
30
33
  */
31
34
  var TableSource = class {
32
35
  #dbCache = /* @__PURE__ */ new WeakMap();
36
+ #rawColumns = /* @__PURE__ */ new WeakMap();
33
37
  #connections = [];
34
38
  #table;
35
39
  #columns;
@@ -166,9 +170,10 @@ var TableSource = class {
166
170
  const transformedFilters = transformFilters(filters);
167
171
  const unordered = sort === void 0;
168
172
  const primaryKeySort = this.#primaryKeySort;
173
+ const fetchSQL = new FetchSQLCache(this.#table, this.#columns, transformedFilters.filters, sort);
169
174
  const input = {
170
175
  getSchema: () => schema,
171
- fetch: (req) => this.#fetch(req, connection),
176
+ fetch: (req) => this.#fetch(req, connection, fetchSQL),
172
177
  setOutput: (output) => {
173
178
  connection.output = output;
174
179
  },
@@ -200,9 +205,9 @@ var TableSource = class {
200
205
  toSQLiteRow(row) {
201
206
  return Object.fromEntries(Object.entries(row).map(([key, value]) => [key, toSQLiteType(value, this.#columns[key].type)]));
202
207
  }
203
- *#fetch(req, connection) {
208
+ *#fetch(req, connection, fetchSQL) {
204
209
  const { sort, debug } = connection;
205
- const rows = this.#queryRows(this.#requestToSQL(req, connection.filters?.condition, sort), debug);
210
+ const rows = this.#queryRows(fetchSQL.get(req), debug);
206
211
  const overlayPredicate = mergeOverlayPredicate(connection.filters?.predicate, req.filter);
207
212
  try {
208
213
  if (sort) {
@@ -214,22 +219,20 @@ var TableSource = class {
214
219
  }
215
220
  }
216
221
  /**
217
- * The rows of `queries`, run one after another as {@link buildSelectQueries}
222
+ * The rows of `queries`, run one after another as `buildSelectQueries`
218
223
  * requires. Each statement is run only once the previous one is exhausted,
219
224
  * so a fetch that stops early never runs the rest.
220
225
  */
221
226
  *#queryRows(queries, debug) {
222
227
  const { cache } = this.#stmts;
223
- for (const query of queries) {
224
- const sqlAndBindings = format(query);
225
- const cachedStatement = cache.get(sqlAndBindings.text);
226
- cachedStatement.statement.safeIntegers(true);
227
- const rowIterator = cachedStatement.statement.iterate(...sqlAndBindings.values);
228
+ for (const sqlAndBindings of queries) {
229
+ const cachedStatement = cache.getExact(sqlAndBindings.text);
230
+ const cursor = cachedStatement.statement.batches(sqlAndBindings.values);
228
231
  try {
229
232
  debug?.initQuery(this.#table, sqlAndBindings.text);
230
- yield* this.#mapFromSQLiteTypes(this.#columns, rowIterator, sqlAndBindings.text, debug);
233
+ yield* this.#readRows(cursor, this.#rawColumnsFor(cachedStatement.statement), sqlAndBindings.text, debug);
231
234
  } finally {
232
- rowIterator.return?.();
235
+ cursor.close();
233
236
  recordIndexUsage(cachedStatement.statement, this.#table);
234
237
  if (debug) {
235
238
  let totalNvisit = 0;
@@ -265,16 +268,29 @@ var TableSource = class {
265
268
  const deltaRows = delta.rowsFor(sort ?? this.#primaryKeySort, req.constraint, sort ? req.reverse : false, predicate, req.multiConstraints, sort ? req.start?.row : void 0);
266
269
  return compare ? generateWithPendingDelta(baseRows, deltaRows, delta, compare) : generateWithPendingDeltaUnordered(baseRows, deltaRows, delta);
267
270
  }
268
- *#mapFromSQLiteTypes(valueTypes, rowIterator, query, debug) {
269
- let result;
270
- do {
271
- result = timeSampled(this.#lc, ++eventCount, this.#logConfig.ivmSampling, () => rowIterator.next(), this.#logConfig.slowRowThreshold, () => `table-source.next took too long for ${query}. Are you missing an index?`);
272
- if (result.done) break;
273
- this.#rowsRead++;
274
- const row = fromSQLiteTypes(valueTypes, result.value, this.#table);
275
- debug?.rowVended(this.#table, query, row);
276
- yield row;
277
- } while (!result.done);
271
+ #rawColumnsFor(statement) {
272
+ return getOrInsertComputed(this.#rawColumns, statement, () => statement.columns().map(({ name }) => rawColumn(this.#columns, name, this.#table)));
273
+ }
274
+ *#readRows(cursor, columns, query, debug) {
275
+ for (let capacity = FIRST_BATCH_ROWS;;) {
276
+ const { ivmSampling, slowRowThreshold } = this.#logConfig;
277
+ const sampled = ivmSampling > 0 && ++eventCount % ivmSampling === 0;
278
+ const start = sampled ? performance.now() : 0;
279
+ const values = cursor.next(capacity);
280
+ const n = values.length / columns.length;
281
+ if (sampled) {
282
+ const duration = performance.now() - start;
283
+ if (duration > slowRowThreshold * Math.max(n, 1)) this.#lc.warn?.(`table-source.next took too long for ${query}. Are you missing an index? duration: ${duration}ms`);
284
+ }
285
+ if (n === 0) return;
286
+ for (let r = 0; r < n; r++) {
287
+ const row = fromSQLiteRawRow(columns, values, this.#table, r * columns.length);
288
+ this.#rowsRead++;
289
+ debug?.rowVended(this.#table, query, row);
290
+ yield row;
291
+ }
292
+ capacity = Math.min(capacity * 2, MAX_BATCH_ROWS);
293
+ }
278
294
  }
279
295
  *push(change) {
280
296
  for (const result of this.genPush(change)) if (result === "yield") yield result;
@@ -437,12 +453,11 @@ var TableSource = class {
437
453
  getRow(rowKey) {
438
454
  const keyCols = Object.keys(rowKey);
439
455
  const stmt = this.#getRowStmt(keyCols);
440
- const raw = this.#stmts.cache.use(stmt, ({ statement }) => {
441
- const row = statement.safeIntegers(true).get(...toSQLiteTypes(keyCols, rowKey, this.#columns));
456
+ const row = this.#stmts.cache.use(stmt, ({ statement }) => {
457
+ const values = statement.safeIntegers(true).raw(true).get(...toSQLiteTypes(keyCols, rowKey, this.#columns));
442
458
  recordIndexUsage(statement, this.#table);
443
- return row;
459
+ return values === void 0 ? void 0 : fromSQLiteRawRow(this.#rawColumnsFor(statement), values, this.#table);
444
460
  });
445
- const row = raw ? fromSQLiteTypes(this.#columns, raw, this.#table) : raw;
446
461
  const delta = this.#delta;
447
462
  if (delta === void 0 || delta.isEmpty) return row;
448
463
  if (row !== void 0) {
@@ -452,9 +467,6 @@ var TableSource = class {
452
467
  }
453
468
  return delta.getByColumns(keyCols, rowKey);
454
469
  }
455
- #requestToSQL(request, filters, order) {
456
- return buildSelectQueries(this.#table, this.#columns, request.constraint, filters, order, request.reverse, request.start, request.multiConstraints, request.filter);
457
- }
458
470
  };
459
471
  function mergeOverlayPredicate(connPredicate, reqFilter) {
460
472
  if (!reqFilter) return connPredicate;
@@ -504,14 +516,37 @@ function fromSQLiteTypes(valueTypes, row, tableName) {
504
516
  const newRow = {};
505
517
  for (const key of Object.keys(row)) {
506
518
  const valueType = valueTypes[key];
507
- if (valueType === void 0) {
508
- const columnList = Object.keys(valueTypes).sort().join(", ");
509
- throw new Error(`Invalid column "${key}" for table "${tableName}". Synced columns include ${columnList}`);
510
- }
519
+ if (valueType === void 0) throw invalidColumnError(valueTypes, key, tableName);
511
520
  newRow[key] = fromSQLiteType(valueType.type, row[key], key, tableName);
512
521
  }
513
522
  return newRow;
514
523
  }
524
+ function rawColumn(valueTypes, name, tableName) {
525
+ const valueType = Object.hasOwn(valueTypes, name) ? valueTypes[name] : void 0;
526
+ if (valueType === void 0) throw invalidColumnError(valueTypes, name, tableName);
527
+ return {
528
+ name,
529
+ type: valueType.type
530
+ };
531
+ }
532
+ function invalidColumnError(valueTypes, name, tableName) {
533
+ const columnList = Object.keys(valueTypes).sort().join(", ");
534
+ return /* @__PURE__ */ new Error(`Invalid column "${name}" for table "${tableName}". Synced columns include ${columnList}`);
535
+ }
536
+ /**
537
+ * Like {@link fromSQLiteTypes}, for a row read with `raw(true)`: the row's
538
+ * values are `values[offset]` up to `values[offset + columns.length - 1]`.
539
+ */
540
+ function fromSQLiteRawRow(columns, values, tableName, offset = 0) {
541
+ const newRow = {};
542
+ for (let i = 0; i < columns.length; i++) {
543
+ const { name, type } = columns[i];
544
+ const value = fromSQLiteType(type, values[offset + i], name, tableName);
545
+ if (name === "__proto__") assignProperty(newRow, name, value);
546
+ else newRow[name] = value;
547
+ }
548
+ return newRow;
549
+ }
515
550
  function fromSQLiteType(valueType, v, column, tableName) {
516
551
  if (v === null) return null;
517
552
  switch (valueType) {
@@ -520,9 +555,8 @@ function fromSQLiteType(valueType, v, column, tableName) {
520
555
  case "string":
521
556
  case "null":
522
557
  if (typeof v === "bigint") {
523
- const bi = v;
524
- if (bi > Number.MAX_SAFE_INTEGER || bi < Number.MIN_SAFE_INTEGER) throw new UnsupportedValueError(`value ${bi} (in ${tableName}.${column}) is outside of supported bounds`);
525
- return Number(bi);
558
+ if (v > Number.MAX_SAFE_INTEGER || v < Number.MIN_SAFE_INTEGER) throw new UnsupportedValueError(`value ${v} (in ${tableName}.${column}) is outside of supported bounds`);
559
+ return Number(v);
526
560
  }
527
561
  return v;
528
562
  case "json": try {
@@ -550,6 +584,6 @@ function* generateWithYields(stream, shouldYield) {
550
584
  }
551
585
  }
552
586
  //#endregion
553
- export { TableSource, fromSQLiteTypes };
587
+ export { TableSource, UnsupportedValueError, fromSQLiteRawRow, fromSQLiteTypes, rawColumn };
554
588
 
555
589
  //# sourceMappingURL=table-source.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"table-source.js","names":["#dbCache","#connections","#table","#columns","#uniqueIndexes","#primaryKey","#logConfig","#lc","#shouldYield","#skipUnobservableChanges","#primaryKeySort","#stmts","#getStatementsFor","#delta","#rowsRead","#allColumns","#fetch","#getSchema","#queryRows","#requestToSQL","#withPendingDelta","#overlay","#mapFromSQLiteTypes","#mayAcceptChange","#writeChange","#pushEpoch","#writeChangeToDelta","#syncedDeleteKey","#getRowStmtCache","#getRowStmt"],"sources":["../../../../zqlite/src/table-source.ts"],"sourcesContent":["import type {SQLQuery} from '@databases/sql';\nimport type {LogContext} from '@rocicorp/logger';\nimport SQLite3Database from '@rocicorp/zero-sqlite3';\nimport type {LogConfig} from '../../otel/src/log-options.ts';\nimport {timeSampled} from '../../otel/src/maybe-time.ts';\nimport {assert, unreachable} from '../../shared/src/asserts.ts';\nimport {getOrInsertComputed} from '../../shared/src/map.ts';\nimport {must} from '../../shared/src/must.ts';\nimport type {Writable} from '../../shared/src/writable.ts';\nimport type {Condition, Ordering} from '../../zero-protocol/src/ast.ts';\nimport type {Row, Value} from '../../zero-protocol/src/data.ts';\nimport type {PrimaryKey} from '../../zero-protocol/src/primary-key.ts';\nimport type {\n SchemaValue,\n ValueType,\n} from '../../zero-schema/src/table-schema.ts';\nimport type {DebugDelegate} from '../../zql/src/builder/debug-delegate.ts';\nimport {\n createPredicate,\n transformFilters,\n type NoSubqueryCondition as StrictNoSubqueryCondition,\n} from '../../zql/src/builder/filter.ts';\nimport {ChangeType} from '../../zql/src/ivm/change-type.ts';\nimport {\n makeComparator,\n type Comparator,\n type Node,\n} from '../../zql/src/ivm/data.ts';\nimport {\n generateWithOverlay,\n generateWithOverlayUnordered,\n generateWithStart,\n genPushAndWriteWithSplitEdit,\n type Connection,\n type Overlay,\n} from '../../zql/src/ivm/memory-source.ts';\nimport {type FetchRequest} from '../../zql/src/ivm/operator.ts';\nimport type {SourceSchema} from '../../zql/src/ivm/schema.ts';\nimport {SourceChangeIndex} from '../../zql/src/ivm/source-change-index.ts';\nimport {\n type Source,\n type SourceChange,\n type SourceInput,\n} from '../../zql/src/ivm/source.ts';\nimport type {Stream} from '../../zql/src/ivm/stream.ts';\nimport {assertOrderingIncludesPK} from '../../zql/src/query/complete-ordering.ts';\nimport type {Database, Statement} from './db.ts';\nimport {recordIndexUsage} from './index-usage.ts';\nimport {compile, format, sql} from './internal/sql.ts';\nimport {StatementCache} from './internal/statement-cache.ts';\nimport {\n generateWithPendingDelta,\n generateWithPendingDeltaUnordered,\n NOT_OVERRIDDEN,\n PendingDelta,\n} from './pending-delta.ts';\nimport {\n buildSelectQueries,\n toSQLiteType,\n type NoSubqueryCondition,\n} from './query-builder.ts';\n\ntype Statements = {\n readonly cache: StatementCache;\n readonly insert: Statement;\n readonly delete: Statement;\n readonly update: Statement | undefined;\n};\n\nlet eventCount = 0;\n\nexport type TableSourceOptions = {\n /**\n * When set, a pushed change that the filters of every connection reject\n * is neither pushed nor applied to the backing table, on the grounds that\n * no connection can observe it. This departs from the `Source.push`\n * contract (a push commits the change to the source), so it is only\n * appropriate when the caller does not read the table through any other\n * path and replaces the table's contents afterwards, as the view-syncer's\n * pipeline driver does when it advances to the next snapshot.\n */\n skipUnobservableChanges?: boolean | undefined;\n\n /**\n * When set, pushed changes are held in an in-memory {@link PendingDelta}\n * merged into every read instead of being written to the backing table.\n * The delta is dropped when the source moves to the next snapshot. This is\n * the initial mode; see {@link TableSource.setDeferWrites}.\n */\n deferWrites?: boolean | undefined;\n};\n\n/**\n * A source that is backed by a SQLite table.\n *\n * Values are written to the backing table _after_ being vended by the source.\n *\n * This ordering of events is to ensure self joins function properly. That is,\n * we can't reveal a value to an output before it has been pushed to that output.\n *\n * The code is fairly straightforward except for:\n * 1. Dealing with a `fetch` that has a basis of `before`.\n * 2. Dealing with compound orders that have differing directions (a ASC, b DESC, c ASC)\n *\n * See comments in relevant functions for more details.\n */\nexport class TableSource implements Source {\n readonly #dbCache = new WeakMap<Database, Statements>();\n readonly #connections: Connection[] = [];\n readonly #table: string;\n readonly #columns: Record<string, SchemaValue>;\n // Maps sorted columns JSON string (e.g. '[\"a\",\"b\"]) to Set of columns.\n readonly #uniqueIndexes: Map<string, Set<string>>;\n readonly #primaryKey: PrimaryKey;\n readonly #logConfig: LogConfig;\n readonly #lc: LogContext;\n readonly #shouldYield: () => boolean;\n readonly #skipUnobservableChanges: boolean;\n readonly #primaryKeySort: Ordering;\n #stmts: Statements;\n #overlay?: Overlay | undefined;\n #pushEpoch = 0;\n /**\n * When present, derivation is read-only: changes accumulate here instead of\n * being written to (and later rolled back out of) the backing snapshot. See\n * {@link PendingDelta}.\n */\n #delta: PendingDelta | undefined;\n #rowsRead = 0;\n\n /**\n * @param shouldYield a function called after each row is read from the database,\n * which should return true if the source should yield the special 'yield' value\n * to yield control back to the caller at the end of the pipeline. Can\n * also throw an error to abort the pipeline processing.\n */\n constructor(\n logContext: LogContext,\n logConfig: LogConfig,\n db: Database,\n tableName: string,\n columns: Record<string, SchemaValue>,\n primaryKey: PrimaryKey,\n shouldYield = () => false,\n options: TableSourceOptions = {},\n ) {\n this.#lc = logContext;\n this.#logConfig = logConfig;\n this.#table = tableName;\n this.#columns = columns;\n this.#uniqueIndexes = getUniqueIndexes(db, tableName);\n this.#primaryKey = primaryKey;\n this.#primaryKeySort = primaryKey.map(k => [k, 'asc']);\n this.#stmts = this.#getStatementsFor(db);\n this.#shouldYield = shouldYield;\n this.#skipUnobservableChanges = options.skipUnobservableChanges ?? false;\n this.#delta = options.deferWrites\n ? new PendingDelta(primaryKey)\n : undefined;\n\n const primaryKeyStr = JSON.stringify(primaryKey.toSorted());\n assert(\n this.#uniqueIndexes.has(primaryKeyStr),\n `primary key ${primaryKeyStr} does not have a UNIQUE index`,\n );\n }\n\n /**\n * The number of rows read from SQLite by fetches, over the lifetime of this\n * source. Rows that SQLite scans and filters out itself are not counted.\n */\n get rowsRead(): number {\n return this.#rowsRead;\n }\n\n get tableSchema() {\n return {\n name: this.#table,\n columns: this.#columns,\n primaryKey: this.#primaryKey,\n };\n }\n\n /**\n * Sets the db (snapshot) to use, to facilitate the Snapshotter leapfrog\n * algorithm for concurrent traversal of historic timelines.\n */\n setDB(db: Database) {\n this.#stmts = this.#getStatementsFor(db);\n // The new snapshot already contains everything the batch was standing in\n // for, so the batch is done.\n this.#delta?.clear();\n }\n\n /**\n * Sets whether the changes pushed from now on are held in memory (see\n * {@link TableSourceOptions.deferWrites}) or written to the backing\n * snapshot. The two must not be mixed within one snapshot, so this may only\n * be called before the first push after construction or {@link setDB}. To\n * switch to writing through partway, see {@link writePendingChanges}.\n */\n setDeferWrites(deferWrites: boolean) {\n assert(\n this.#delta === undefined || this.#delta.isEmpty,\n 'Cannot change how writes are applied while changes are pending',\n );\n if (!deferWrites) {\n this.#delta = undefined;\n } else {\n this.#delta ??= new PendingDelta(this.#primaryKey);\n }\n }\n\n /**\n * Drops the changes held in memory (see {@link setDeferWrites}), for an\n * advancement that has been abandoned. The source then no longer reflects\n * the changes pushed to it, so it must not be read again until it has moved\n * to another snapshot ({@link setDB}), if it is used again at all.\n */\n discardPendingChanges(): void {\n this.#delta?.clear();\n }\n\n /**\n * Writes the changes held in memory (see {@link setDeferWrites}) to the\n * backing snapshot, which is left as if they had been written through (in\n * the source's columns), and writes the changes pushed from then on through\n * to it. Yields when the\n * source's `shouldYield` says to, and must not be interleaved with a push.\n */\n *writePendingChanges(): Stream<'yield'> {\n const delta = this.#delta;\n if (delta === undefined) {\n return;\n }\n // The rows the delta holds satisfy the table's unique keys, but one may\n // take a unique value from another row that the delta also changed. So\n // every row it touched is deleted before any is inserted.\n for (const key of delta.touchedKeys()) {\n this.#stmts.delete.run(\n ...toSQLiteTypes(this.#primaryKey, key, this.#columns),\n );\n if (this.#shouldYield()) {\n yield 'yield';\n }\n }\n const columns = Object.keys(this.#columns);\n for (const row of delta.liveRows()) {\n this.#stmts.insert.run(...toSQLiteTypes(columns, row, this.#columns));\n if (this.#shouldYield()) {\n yield 'yield';\n }\n }\n this.#delta = undefined;\n }\n\n #getStatementsFor(db: Database) {\n const cached = this.#dbCache.get(db);\n if (cached) {\n return cached;\n }\n\n const stmts = {\n cache: new StatementCache(db),\n insert: db.prepare(\n compile(\n sql`INSERT INTO ${sql.ident(this.#table)} (${sql.join(\n Object.keys(this.#columns).map(c => sql.ident(c)),\n ', ',\n )}) VALUES (${sql.__dangerous__rawValue(\n Array.from({length: Object.keys(this.#columns).length})\n .fill('?')\n .join(','),\n )})`,\n ),\n ),\n delete: db.prepare(\n compile(\n sql`DELETE FROM ${sql.ident(this.#table)} WHERE ${sql.join(\n this.#primaryKey.map(k => sql`${sql.ident(k)}=?`),\n ' AND ',\n )}`,\n ),\n ),\n // If all the columns are part of the primary key, we cannot use UPDATE.\n update:\n Object.keys(this.#columns).length > this.#primaryKey.length\n ? db.prepare(\n compile(\n sql`UPDATE ${sql.ident(this.#table)} SET ${sql.join(\n nonPrimaryKeys(this.#columns, this.#primaryKey).map(\n c => sql`${sql.ident(c)}=?`,\n ),\n ',',\n )} WHERE ${sql.join(\n this.#primaryKey.map(k => sql`${sql.ident(k)}=?`),\n ' AND ',\n )}`,\n ),\n )\n : undefined,\n };\n this.#dbCache.set(db, stmts);\n return stmts;\n }\n\n get #allColumns() {\n return sql.join(\n Object.keys(this.#columns).map(c => sql.ident(c)),\n sql`,`,\n );\n }\n\n #getSchema(connection: Connection, unordered: boolean): SourceSchema {\n return {\n tableName: this.#table,\n columns: this.#columns,\n primaryKey: this.#primaryKey,\n sort: unordered ? undefined : connection.sort,\n relationships: {},\n isHidden: false,\n system: 'client',\n compareRows: connection.compareRows,\n };\n }\n\n connect(\n sort: Ordering | undefined,\n filters?: Condition,\n splitEditKeys?: Set<string>,\n debug?: DebugDelegate,\n ) {\n const transformedFilters = transformFilters(filters);\n const unordered = sort === undefined;\n // PK comparator is used for source-level overlay matching (remove by PK\n // equality) even when no ordering is requested.\n const primaryKeySort: Ordering = this.#primaryKeySort;\n\n const input: SourceInput = {\n getSchema: () => schema,\n fetch: req => this.#fetch(req, connection),\n setOutput: output => {\n connection.output = output;\n },\n destroy: () => {\n const idx = this.#connections.indexOf(connection);\n assert(idx !== -1, 'Connection not found');\n this.#connections.splice(idx, 1);\n },\n fullyAppliedFilters: !transformedFilters.conditionsRemoved,\n };\n\n const connection: Connection = {\n input,\n debug,\n output: undefined,\n sort,\n splitEditKeys,\n filters: transformedFilters.filters\n ? {\n condition: transformedFilters.filters,\n predicate: createPredicate(transformedFilters.filters),\n }\n : undefined,\n compareRows: sort ? makeComparator(sort) : makeComparator(primaryKeySort),\n lastPushedEpoch: 0,\n };\n const schema = this.#getSchema(connection, unordered);\n if (!unordered) {\n assertOrderingIncludesPK(sort, this.#primaryKey);\n }\n\n this.#connections.push(connection);\n return input;\n }\n\n toSQLiteRow(row: Row): Row {\n return Object.fromEntries(\n Object.entries(row).map(([key, value]) => [\n key,\n toSQLiteType(value, this.#columns[key].type),\n ]),\n ) as Row;\n }\n\n *#fetch(req: FetchRequest, connection: Connection): Stream<Node | 'yield'> {\n const {sort, debug} = connection;\n\n const rows = this.#queryRows(\n this.#requestToSQL(req, connection.filters?.condition, sort),\n debug,\n );\n const overlayPredicate = mergeOverlayPredicate(\n connection.filters?.predicate,\n req.filter,\n );\n try {\n if (sort) {\n const comparator = makeComparator(sort, req.reverse);\n yield* generateWithStart(\n generateWithYields(\n generateWithOverlay(\n req.start?.row,\n this.#withPendingDelta(\n rows,\n req,\n overlayPredicate,\n sort,\n comparator,\n ),\n req.constraint,\n this.#overlay,\n connection.lastPushedEpoch,\n comparator,\n // SQL does the ordering and constraining, so the row stream is\n // already in the connection's sort order: the splice comparator\n // and the `startAt` comparator coincide here.\n comparator,\n overlayPredicate,\n req.multiConstraints,\n ),\n this.#shouldYield,\n ),\n req.start,\n comparator,\n );\n } else {\n yield* generateWithYields(\n generateWithOverlayUnordered(\n this.#withPendingDelta(\n rows,\n req,\n overlayPredicate,\n undefined,\n undefined,\n ),\n req.constraint,\n this.#overlay,\n connection.lastPushedEpoch,\n this.#primaryKey,\n overlayPredicate,\n req.multiConstraints,\n ),\n this.#shouldYield,\n );\n }\n } finally {\n // The generators above do not close `rows` when they are abandoned\n // partway, which leaves its statement open.\n rows.return();\n }\n }\n\n /**\n * The rows of `queries`, run one after another as {@link buildSelectQueries}\n * requires. Each statement is run only once the previous one is exhausted,\n * so a fetch that stops early never runs the rest.\n */\n *#queryRows(\n queries: readonly SQLQuery[],\n debug: DebugDelegate | undefined,\n ): Generator<Row, void, undefined> {\n const {cache} = this.#stmts;\n for (const query of queries) {\n const sqlAndBindings = format(query);\n const cachedStatement = cache.get(sqlAndBindings.text);\n cachedStatement.statement.safeIntegers(true);\n const rowIterator = cachedStatement.statement.iterate<Row>(\n ...sqlAndBindings.values,\n );\n try {\n debug?.initQuery(this.#table, sqlAndBindings.text);\n yield* this.#mapFromSQLiteTypes(\n this.#columns,\n rowIterator,\n sqlAndBindings.text,\n debug,\n );\n } finally {\n // Ensure the SQLite iterate() is closed.\n rowIterator.return?.();\n recordIndexUsage(cachedStatement.statement, this.#table);\n if (debug) {\n let totalNvisit = 0;\n const planLines: string[] = [];\n for (let i = 0; ; i++) {\n const nvisit = cachedStatement.statement.scanStatus(\n i,\n SQLite3Database.SQLITE_SCANSTAT_NVISIT,\n 1,\n );\n if (nvisit === undefined) {\n break;\n }\n totalNvisit += Number(nvisit);\n const explain = cachedStatement.statement.scanStatus(\n i,\n SQLite3Database.SQLITE_SCANSTAT_EXPLAIN,\n 1,\n );\n if (typeof explain === 'string' && explain.length > 0) {\n planLines.push(explain);\n }\n }\n if (totalNvisit !== 0) {\n debug.recordNVisit(this.#table, sqlAndBindings.text, totalNvisit);\n }\n if (planLines.length > 0) {\n debug.recordExplain(this.#table, sqlAndBindings.text, planLines);\n }\n cachedStatement.statement.scanStatusReset();\n }\n cache.return(cachedStatement);\n }\n }\n }\n\n /**\n * Splices the batch overlay into a base row stream, if there is one. When\n * derivation is not deferred, or the batch is empty -- every fetch during\n * hydration, and every fetch before the first change of a pass -- this is\n * the identity and the source behaves exactly as it did before.\n *\n * `predicate` is the connection's filters ANDed with `req.filter`, which\n * SQL applies to the base rows. `sort` and `compare` are absent for\n * unordered fetches, where nothing downstream depends on position.\n */\n #withPendingDelta(\n baseRows: IterableIterator<Row>,\n req: FetchRequest,\n predicate: ((row: Row) => boolean) | undefined,\n sort: Ordering | undefined,\n compare: Comparator | undefined,\n ): IterableIterator<Row> {\n const delta = this.#delta;\n if (delta === undefined || delta.isEmpty) {\n return baseRows;\n }\n const deltaRows = delta.rowsFor(\n sort ?? this.#primaryKeySort,\n req.constraint,\n sort ? req.reverse : false,\n predicate,\n req.multiConstraints,\n sort ? req.start?.row : undefined,\n );\n return compare\n ? generateWithPendingDelta(baseRows, deltaRows, delta, compare)\n : generateWithPendingDeltaUnordered(baseRows, deltaRows, delta);\n }\n\n *#mapFromSQLiteTypes(\n valueTypes: Record<string, SchemaValue>,\n rowIterator: IterableIterator<Row>,\n query: string,\n debug: DebugDelegate | undefined,\n ): IterableIterator<Row> {\n let result;\n do {\n result = timeSampled(\n this.#lc,\n ++eventCount,\n this.#logConfig.ivmSampling,\n () => rowIterator.next(),\n this.#logConfig.slowRowThreshold,\n () =>\n `table-source.next took too long for ${query}. Are you missing an index?`,\n );\n if (result.done) {\n break;\n }\n this.#rowsRead++;\n const row = fromSQLiteTypes(valueTypes, result.value, this.#table);\n debug?.rowVended(this.#table, query, row);\n yield row;\n } while (!result.done);\n }\n\n *push(change: SourceChange): Stream<'yield'> {\n for (const result of this.genPush(change)) {\n if (result === 'yield') {\n yield result;\n }\n }\n }\n\n /**\n * The number of rows held in memory for changes that have been pushed but\n * not written, i.e. with `deferWrites`, since the last {@link setDB}.\n */\n get pendingRows(): number {\n return this.#delta?.size ?? 0;\n }\n\n /** Estimated bytes retained by deferred changes and their indexes. */\n get pendingBytes(): number {\n return this.#delta?.estimatedBytes ?? 0;\n }\n\n /**\n * Returns whether any connected pipeline could observe the given row.\n * If false, this row is completely invisible to this TableSource's connections.\n */\n mayAcceptRow(row: Row): boolean {\n if (!this.#skipUnobservableChanges || this.#connections.length === 0) {\n return true;\n }\n for (const conn of this.#connections) {\n if (!conn.filters || conn.filters.predicate(row)) {\n return true;\n }\n }\n return false;\n }\n\n #mayAcceptChange(change: SourceChange): boolean {\n if (!this.#skipUnobservableChanges || this.#connections.length === 0) {\n return true;\n }\n const row = change[SourceChangeIndex.ROW];\n if (this.mayAcceptRow(row)) {\n return true;\n }\n if (change[SourceChangeIndex.TYPE] === ChangeType.EDIT) {\n const oldRow = change[SourceChangeIndex.OLD_ROW];\n if (oldRow && this.mayAcceptRow(oldRow)) {\n return true;\n }\n }\n return false;\n }\n\n *genPush(change: SourceChange): Stream<'yield' | undefined> {\n if (this.#skipUnobservableChanges && !this.#mayAcceptChange(change)) {\n // No connection can observe this row, so only a REMOVE needs to be\n // applied to the snapshot.\n if (change[SourceChangeIndex.TYPE] === ChangeType.REMOVE) {\n this.#writeChange(change);\n }\n return;\n }\n\n const setOverlay = (o: Overlay | undefined) => (this.#overlay = o);\n const writeChange = (c: SourceChange) => this.#writeChange(c);\n\n // Note: TableSource intentionally does not implement checkExists (which MemorySource\n // uses for defensive asserts like \"Row already exists\" and \"Row not found\"):\n //\n // 1. Edit detection does not rely on checkExists:\n // Edits are detected upstream in PipelineDriver by matching row primary keys\n // against prevValues (via deepEqual on PK columns) and emitting SourceChangeEdit.\n //\n // 2. Upstream guarantees and error handling:\n // - Replicated streams from Postgres WAL / SnapshotDiff guarantee transactional\n // consistency, ordering, and row existence.\n // - PipelineDriver.#advance reconciles incoming row keys against both the prev\n // snapshot and pending delta, guaranteeing that any existing primary key is\n // emitted as an EDIT rather than an ADD.\n // - In write-through mode, SQLite's native PRIMARY KEY or UNIQUE constraints\n // immediately fail if a duplicate INSERT is attempted.\n // - In deferred-writes mode, writePendingChanges() deletes touched primary keys\n // before inserting (to handle unique-index permutations), meaning an erroneous\n // duplicate ADD would act as a replacement. We intentionally do not execute a\n // synchronous SQLite SELECT existence probe on every ADD to catch a theoretical\n // upstream bug, which is instead guarded by unit tests.\n // - Deletes of non-existent rows in SQLite are safe no-ops (0 rows affected).\n //\n // Omitting checkExists avoids executing expensive synchronous SQLite SELECT queries on every\n // pushed row change, eliminating a major bottleneck in push advancement.\n yield* genPushAndWriteWithSplitEdit(\n this.#connections,\n change,\n undefined,\n setOverlay,\n writeChange,\n () => ++this.#pushEpoch,\n );\n }\n\n #writeChange(change: SourceChange) {\n const delta = this.#delta;\n if (delta !== undefined) {\n this.#writeChangeToDelta(delta, change);\n return;\n }\n switch (change[SourceChangeIndex.TYPE]) {\n case ChangeType.ADD:\n this.#stmts.insert.run(\n ...toSQLiteTypes(\n // TODO(arv): Compute this once!\n Object.keys(this.#columns),\n change[SourceChangeIndex.ROW],\n this.#columns,\n ),\n );\n break;\n case ChangeType.REMOVE:\n this.#stmts.delete.run(\n ...toSQLiteTypes(\n this.#primaryKey,\n change[SourceChangeIndex.ROW],\n this.#columns,\n ),\n );\n break;\n case ChangeType.EDIT: {\n // If the PK is the same, use UPDATE.\n if (\n canUseUpdate(\n change[SourceChangeIndex.OLD_ROW],\n change[SourceChangeIndex.ROW],\n this.#columns,\n this.#primaryKey,\n )\n ) {\n const mergedRow = {\n ...change[SourceChangeIndex.OLD_ROW],\n ...change[SourceChangeIndex.ROW],\n };\n const params = [\n ...nonPrimaryValues(this.#columns, this.#primaryKey, mergedRow),\n ...toSQLiteTypes(this.#primaryKey, mergedRow, this.#columns),\n ];\n must(this.#stmts.update).run(params);\n } else {\n this.#stmts.delete.run(\n ...toSQLiteTypes(\n this.#primaryKey,\n change[SourceChangeIndex.OLD_ROW],\n this.#columns,\n ),\n );\n this.#stmts.insert.run(\n ...toSQLiteTypes(\n Object.keys(this.#columns),\n change[SourceChangeIndex.ROW],\n this.#columns,\n ),\n );\n }\n\n break;\n }\n default:\n unreachable(change);\n }\n }\n\n /**\n * Reconciles a set of rows that the caller found in the *backing snapshot*\n * with the changes this source has applied but not written.\n *\n * A view-syncer computes the rows a replicated change collides with -- by\n * change-log key for a delete, by every unique key for a set -- against the\n * snapshot it is reading. When derivation writes through, that snapshot has\n * already absorbed the earlier changes of the same advancement, so the\n * probe sees them. When derivation is deferred they live here instead, and\n * the probe has to be brought up to date or the source is pushed a change\n * that contradicts its own state (a delete of a row the batch already\n * removed, an edit whose old row is stale).\n *\n * Two ways the batch can disagree with the probe, both handled here: a\n * probed row may have been removed, or may have been edited (so the\n * caller's copy is stale, or it no longer collides at all).\n *\n * The batch cannot have edited a row the probe missed *into* collision. The\n * change log keeps one entry per row key, so every row the batch holds is\n * that row's value at the advancement's target version, as is `next`, and\n * two distinct rows of one version cannot share a non-null unique key.\n *\n * Returns `base` untouched when derivation is not deferred, which is what\n * makes this a no-op for the write-through path.\n */\n reconcilePendingConflicts(\n base: readonly Row[],\n next: Row | null,\n rowKey: Row,\n uniqueKeys: readonly (readonly string[])[],\n ): readonly Row[] {\n const delta = this.#delta;\n if (delta === undefined || delta.isEmpty) {\n return base;\n }\n\n // The change-log key uses SQLite values, while pending rows use ZQL\n // values. It is the upstream replica identity, which may include columns\n // the source does not sync. The batch cannot have changed those (nor can a\n // write-through `UPDATE`), so only the synced columns are compared.\n const deleteKey = next === null ? this.#syncedDeleteKey(rowKey) : undefined;\n const out: Row[] = [];\n for (const row of base) {\n const pending = delta.get(row);\n const current = pending === NOT_OVERRIDDEN ? row : pending;\n if (current === undefined) {\n continue; // the batch removed it\n }\n if (\n deleteKey !== undefined\n ? !deleteKey.every(([col, value]) =>\n sqliteValuesEqual(current[col], value, this.#columns[col].type),\n )\n : !collides(\n current,\n must(next),\n uniqueKeys,\n this.#primaryKey,\n this.#columns,\n )\n ) {\n continue; // the batch edited it out of collision\n }\n out.push(current);\n }\n return out;\n }\n\n #syncedDeleteKey(rowKey: Row): [string, Value][] {\n const synced: Writable<Row> = {};\n for (const [col, value] of Object.entries(rowKey)) {\n if (Object.hasOwn(this.#columns, col)) {\n synced[col] = value;\n }\n }\n return Object.entries(fromSQLiteTypes(this.#columns, synced, this.#table));\n }\n\n /**\n * The batch-overlay counterpart of {@link #writeChange}. It must reproduce\n * that method's semantics exactly, including its treatment of an edit that\n * cannot be expressed as an `UPDATE` -- a changed primary key, or a table\n * whose columns are all part of the key -- as a delete followed by an\n * insert.\n */\n #writeChangeToDelta(delta: PendingDelta, change: SourceChange) {\n switch (change[SourceChangeIndex.TYPE]) {\n case ChangeType.ADD:\n delta.set(change[SourceChangeIndex.ROW]);\n break;\n case ChangeType.REMOVE:\n delta.delete(change[SourceChangeIndex.ROW]);\n break;\n case ChangeType.EDIT: {\n const oldRow = change[SourceChangeIndex.OLD_ROW];\n const row = change[SourceChangeIndex.ROW];\n if (canUseUpdate(oldRow, row, this.#columns, this.#primaryKey)) {\n // `UPDATE` sets only the non-primary columns, so the row keeps any\n // column the change did not mention.\n delta.set({...oldRow, ...row});\n } else {\n delta.delete(oldRow);\n delta.set(row);\n }\n break;\n }\n default:\n unreachable(change);\n }\n }\n\n #getRowStmtCache = new Map<string, string>();\n\n #getRowStmt(keyCols: string[]): string {\n const keyString = JSON.stringify(keyCols);\n return getOrInsertComputed(this.#getRowStmtCache, keyString, () =>\n compile(\n sql`SELECT ${this.#allColumns} FROM ${sql.ident(\n this.#table,\n )} WHERE ${sql.join(\n keyCols.map(k => sql`${sql.ident(k)}=?`),\n sql` AND`,\n )}`,\n ),\n );\n }\n\n /**\n * Retrieves a row from the backing DB by a unique key, or `undefined` if such a\n * row does not exist. This is not used in the IVM pipeline but is useful\n * for retrieving data that is consistent with the state (and type\n * semantics) of the pipeline. Note that this key may not necessarily correspond\n * to the `primaryKey` with which this TableSource.\n */\n getRow(rowKey: Row): Row | undefined {\n const keyCols = Object.keys(rowKey);\n\n const stmt = this.#getRowStmt(keyCols);\n const raw = this.#stmts.cache.use(stmt, ({statement}) => {\n const row = statement\n .safeIntegers(true)\n .get<Row>(...toSQLiteTypes(keyCols, rowKey, this.#columns));\n recordIndexUsage(statement, this.#table);\n return row;\n });\n const row = raw ? fromSQLiteTypes(this.#columns, raw, this.#table) : raw;\n\n const delta = this.#delta;\n if (delta === undefined || delta.isEmpty) {\n return row;\n }\n if (row !== undefined) {\n // The batch may have edited or removed the base row out from under this\n // lookup. Its own primary key is what identifies it in the batch.\n const overridden = delta.get(row);\n if (overridden === NOT_OVERRIDDEN) {\n return row;\n }\n if (\n overridden !== undefined &&\n keyCols.every(c => overridden[c] === rowKey[c])\n ) {\n return overridden;\n }\n }\n // The base match is absent, removed, or no longer matches this key. Another\n // pending row may now own the key.\n return delta.getByColumns(keyCols, rowKey);\n }\n\n #requestToSQL(\n request: FetchRequest,\n filters: NoSubqueryCondition | undefined,\n order: Ordering | undefined,\n ): readonly SQLQuery[] {\n return buildSelectQueries(\n this.#table,\n this.#columns,\n request.constraint,\n filters,\n order,\n request.reverse,\n request.start,\n request.multiConstraints,\n request.filter,\n );\n }\n}\n\nfunction mergeOverlayPredicate(\n connPredicate: ((row: Row) => boolean) | undefined,\n reqFilter: StrictNoSubqueryCondition | undefined,\n): ((row: Row) => boolean) | undefined {\n if (!reqFilter) {\n return connPredicate;\n }\n const reqPredicate = createPredicate(reqFilter);\n if (!connPredicate) {\n return reqPredicate;\n }\n return row => connPredicate(row) && reqPredicate(row);\n}\n\n/**\n * Whether `a` occupies the same row identity as `b` -- the same primary key,\n * or the same value on any unique key, which is what a replicated write\n * conflicts on.\n */\nfunction collides(\n a: Row,\n b: Row,\n uniqueKeys: readonly (readonly string[])[],\n primaryKey: PrimaryKey,\n columns: Record<string, SchemaValue>,\n): boolean {\n if (\n primaryKey.every(col =>\n sqliteValuesEqual(a[col], b[col], columns[col].type),\n )\n ) {\n return true;\n }\n for (const key of uniqueKeys) {\n if (key.some(col => b[col] === null || b[col] === undefined)) {\n continue;\n }\n if (\n key.every(col => sqliteValuesEqual(a[col], b[col], columns[col].type))\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction sqliteValuesEqual(\n a: Value | undefined,\n b: Value | undefined,\n type: ValueType,\n) {\n return toSQLiteType(a, type) === toSQLiteType(b, type);\n}\n\nfunction getUniqueIndexes(\n db: Database,\n tableName: string,\n): Map<string, Set<string>> {\n const sqlAndBindings = format(\n sql`\n SELECT idx.name, json_group_array(col.name) as columnsJSON\n FROM sqlite_master as idx\n JOIN pragma_index_list(idx.tbl_name) AS info ON info.name = idx.name\n JOIN pragma_index_info(idx.name) as col\n WHERE idx.tbl_name = ${tableName} AND\n idx.type = 'index' AND \n info.\"unique\" != 0 AND\n info.partial = 0\n GROUP BY idx.name\n ORDER BY idx.name`,\n );\n const stmt = db.prepare(sqlAndBindings.text);\n const indexes = stmt.all<{columnsJSON: string}>(...sqlAndBindings.values);\n return new Map(\n indexes.map(({columnsJSON}) => {\n const columns = JSON.parse(columnsJSON);\n const set = new Set<string>(columns);\n return [JSON.stringify(columns.sort()), set];\n }),\n );\n}\n\nexport function toSQLiteTypes(\n columns: readonly string[],\n row: Row,\n columnTypes: Record<string, SchemaValue>,\n): readonly unknown[] {\n return columns.map(col => toSQLiteType(row[col], columnTypes[col].type));\n}\n\nexport function toSQLiteTypeName(type: ValueType) {\n switch (type) {\n case 'boolean':\n return 'INTEGER';\n case 'number':\n return 'REAL';\n case 'string':\n return 'TEXT';\n case 'null':\n return 'NULL';\n case 'json':\n return 'TEXT';\n }\n}\n\nexport function fromSQLiteTypes(\n valueTypes: Record<string, SchemaValue>,\n row: Row,\n tableName: string,\n): Row {\n const newRow: Writable<Row> = {};\n for (const key of Object.keys(row)) {\n const valueType = valueTypes[key];\n if (valueType === undefined) {\n const columnList = Object.keys(valueTypes).sort().join(', ');\n throw new Error(\n `Invalid column \"${key}\" for table \"${tableName}\". Synced columns include ${columnList}`,\n );\n }\n newRow[key] = fromSQLiteType(valueType.type, row[key], key, tableName);\n }\n return newRow;\n}\n\nfunction fromSQLiteType(\n valueType: ValueType,\n v: Value,\n column: string,\n tableName: string,\n): Value {\n if (v === null) {\n return null;\n }\n switch (valueType) {\n case 'boolean':\n return !!v;\n case 'number':\n case 'string':\n case 'null':\n if (typeof v === 'bigint') {\n const bi = v as bigint;\n if (bi > Number.MAX_SAFE_INTEGER || bi < Number.MIN_SAFE_INTEGER) {\n throw new UnsupportedValueError(\n `value ${bi} (in ${tableName}.${column}) is outside of supported bounds`,\n );\n }\n return Number(bi);\n }\n return v;\n case 'json':\n try {\n return JSON.parse(v as string);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n throw new UnsupportedValueError(\n `Failed to parse JSON for ${tableName}.${column}: ${errorMessage}`,\n {cause: error},\n );\n }\n }\n}\n\nexport class UnsupportedValueError extends Error {}\n\nfunction canUseUpdate(\n oldRow: Row,\n row: Row,\n columns: Record<string, SchemaValue>,\n primaryKey: PrimaryKey,\n): boolean {\n for (const pk of primaryKey) {\n if (oldRow[pk] !== row[pk]) {\n return false;\n }\n }\n return Object.keys(columns).length > primaryKey.length;\n}\n\nfunction nonPrimaryValues(\n columns: Record<string, SchemaValue>,\n primaryKey: PrimaryKey,\n row: Row,\n): Iterable<unknown> {\n return nonPrimaryKeys(columns, primaryKey).map(c =>\n toSQLiteType(row[c], columns[c].type),\n );\n}\n\nfunction nonPrimaryKeys(\n columns: Record<string, SchemaValue>,\n primaryKey: PrimaryKey,\n) {\n return Object.keys(columns).filter(c => !primaryKey.includes(c));\n}\n\nfunction* generateWithYields(stream: Stream<Node>, shouldYield: () => boolean) {\n for (const n of stream) {\n if (shouldYield()) {\n yield 'yield';\n }\n yield n;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"table-source.js","names":[],"sources":["../../../../zqlite/src/table-source.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport SQLite3Database from '@rocicorp/zero-sqlite3';\nimport type {LogConfig} from '../../otel/src/log-options.ts';\nimport {assert, unreachable} from '../../shared/src/asserts.ts';\nimport {getOrInsertComputed} from '../../shared/src/map.ts';\nimport {must} from '../../shared/src/must.ts';\nimport {assignProperty} from '../../shared/src/objects.ts';\nimport type {Writable} from '../../shared/src/writable.ts';\nimport type {Condition, Ordering} from '../../zero-protocol/src/ast.ts';\nimport type {Row, Value} from '../../zero-protocol/src/data.ts';\nimport type {PrimaryKey} from '../../zero-protocol/src/primary-key.ts';\nimport type {\n SchemaValue,\n ValueType,\n} from '../../zero-schema/src/table-schema.ts';\nimport type {DebugDelegate} from '../../zql/src/builder/debug-delegate.ts';\nimport {\n createPredicate,\n transformFilters,\n type NoSubqueryCondition as StrictNoSubqueryCondition,\n} from '../../zql/src/builder/filter.ts';\nimport {ChangeType} from '../../zql/src/ivm/change-type.ts';\nimport {\n makeComparator,\n type Comparator,\n type Node,\n} from '../../zql/src/ivm/data.ts';\nimport {\n generateWithOverlay,\n generateWithOverlayUnordered,\n generateWithStart,\n genPushAndWriteWithSplitEdit,\n type Connection,\n type Overlay,\n} from '../../zql/src/ivm/memory-source.ts';\nimport {type FetchRequest} from '../../zql/src/ivm/operator.ts';\nimport type {SourceSchema} from '../../zql/src/ivm/schema.ts';\nimport {SourceChangeIndex} from '../../zql/src/ivm/source-change-index.ts';\nimport {\n type Source,\n type SourceChange,\n type SourceInput,\n} from '../../zql/src/ivm/source.ts';\nimport type {Stream} from '../../zql/src/ivm/stream.ts';\nimport {assertOrderingIncludesPK} from '../../zql/src/query/complete-ordering.ts';\nimport type {BatchCursor, Database, Statement} from './db.ts';\nimport {FetchSQLCache, type FetchSQL} from './fetch-sql.ts';\nimport {recordIndexUsage} from './index-usage.ts';\nimport {compile, format, sql} from './internal/sql.ts';\nimport {StatementCache} from './internal/statement-cache.ts';\nimport {\n generateWithPendingDelta,\n generateWithPendingDeltaUnordered,\n NOT_OVERRIDDEN,\n PendingDelta,\n} from './pending-delta.ts';\nimport {toSQLiteType} from './query-builder.ts';\n\ntype Statements = {\n readonly cache: StatementCache;\n readonly insert: Statement;\n readonly delete: Statement;\n readonly update: Statement | undefined;\n};\n\nlet eventCount = 0;\n\n// A fetch reads its rows in batches that start at one row and double up to the\n// maximum. Take, Cap and EXISTS often stop after a row or two, and the rows a\n// batch reads ahead are work SQLite does for nothing; doubling keeps them\n// fewer than the rows consumed.\nconst FIRST_BATCH_ROWS = 1;\nconst MAX_BATCH_ROWS = 128;\n\nexport type TableSourceOptions = {\n /**\n * When set, a pushed change that the filters of every connection reject\n * is neither pushed nor applied to the backing table, on the grounds that\n * no connection can observe it. This departs from the `Source.push`\n * contract (a push commits the change to the source), so it is only\n * appropriate when the caller does not read the table through any other\n * path and replaces the table's contents afterwards, as the view-syncer's\n * pipeline driver does when it advances to the next snapshot.\n */\n skipUnobservableChanges?: boolean | undefined;\n\n /**\n * When set, pushed changes are held in an in-memory {@link PendingDelta}\n * merged into every read instead of being written to the backing table.\n * The delta is dropped when the source moves to the next snapshot. This is\n * the initial mode; see {@link TableSource.setDeferWrites}.\n */\n deferWrites?: boolean | undefined;\n};\n\n/**\n * A source that is backed by a SQLite table.\n *\n * Values are written to the backing table _after_ being vended by the source.\n *\n * This ordering of events is to ensure self joins function properly. That is,\n * we can't reveal a value to an output before it has been pushed to that output.\n *\n * The code is fairly straightforward except for:\n * 1. Dealing with a `fetch` that has a basis of `before`.\n * 2. Dealing with compound orders that have differing directions (a ASC, b DESC, c ASC)\n *\n * See comments in relevant functions for more details.\n */\nexport class TableSource implements Source {\n readonly #dbCache = new WeakMap<Database, Statements>();\n readonly #rawColumns = new WeakMap<Statement, readonly RawColumn[]>();\n readonly #connections: Connection[] = [];\n readonly #table: string;\n readonly #columns: Record<string, SchemaValue>;\n // Maps sorted columns JSON string (e.g. '[\"a\",\"b\"]) to Set of columns.\n readonly #uniqueIndexes: Map<string, Set<string>>;\n readonly #primaryKey: PrimaryKey;\n readonly #logConfig: LogConfig;\n readonly #lc: LogContext;\n readonly #shouldYield: () => boolean;\n readonly #skipUnobservableChanges: boolean;\n readonly #primaryKeySort: Ordering;\n #stmts: Statements;\n #overlay?: Overlay | undefined;\n #pushEpoch = 0;\n /**\n * When present, derivation is read-only: changes accumulate here instead of\n * being written to (and later rolled back out of) the backing snapshot. See\n * {@link PendingDelta}.\n */\n #delta: PendingDelta | undefined;\n #rowsRead = 0;\n\n /**\n * @param shouldYield a function called after each row is read from the database,\n * which should return true if the source should yield the special 'yield' value\n * to yield control back to the caller at the end of the pipeline. Can\n * also throw an error to abort the pipeline processing.\n */\n constructor(\n logContext: LogContext,\n logConfig: LogConfig,\n db: Database,\n tableName: string,\n columns: Record<string, SchemaValue>,\n primaryKey: PrimaryKey,\n shouldYield = () => false,\n options: TableSourceOptions = {},\n ) {\n this.#lc = logContext;\n this.#logConfig = logConfig;\n this.#table = tableName;\n this.#columns = columns;\n this.#uniqueIndexes = getUniqueIndexes(db, tableName);\n this.#primaryKey = primaryKey;\n this.#primaryKeySort = primaryKey.map(k => [k, 'asc']);\n this.#stmts = this.#getStatementsFor(db);\n this.#shouldYield = shouldYield;\n this.#skipUnobservableChanges = options.skipUnobservableChanges ?? false;\n this.#delta = options.deferWrites\n ? new PendingDelta(primaryKey)\n : undefined;\n\n const primaryKeyStr = JSON.stringify(primaryKey.toSorted());\n assert(\n this.#uniqueIndexes.has(primaryKeyStr),\n `primary key ${primaryKeyStr} does not have a UNIQUE index`,\n );\n }\n\n /**\n * The number of rows read from SQLite by fetches, over the lifetime of this\n * source. Rows that SQLite scans and filters out itself are not counted.\n */\n get rowsRead(): number {\n return this.#rowsRead;\n }\n\n get tableSchema() {\n return {\n name: this.#table,\n columns: this.#columns,\n primaryKey: this.#primaryKey,\n };\n }\n\n /**\n * Sets the db (snapshot) to use, to facilitate the Snapshotter leapfrog\n * algorithm for concurrent traversal of historic timelines.\n */\n setDB(db: Database) {\n this.#stmts = this.#getStatementsFor(db);\n // The new snapshot already contains everything the batch was standing in\n // for, so the batch is done.\n this.#delta?.clear();\n }\n\n /**\n * Sets whether the changes pushed from now on are held in memory (see\n * {@link TableSourceOptions.deferWrites}) or written to the backing\n * snapshot. The two must not be mixed within one snapshot, so this may only\n * be called before the first push after construction or {@link setDB}. To\n * switch to writing through partway, see {@link writePendingChanges}.\n */\n setDeferWrites(deferWrites: boolean) {\n assert(\n this.#delta === undefined || this.#delta.isEmpty,\n 'Cannot change how writes are applied while changes are pending',\n );\n if (!deferWrites) {\n this.#delta = undefined;\n } else {\n this.#delta ??= new PendingDelta(this.#primaryKey);\n }\n }\n\n /**\n * Drops the changes held in memory (see {@link setDeferWrites}), for an\n * advancement that has been abandoned. The source then no longer reflects\n * the changes pushed to it, so it must not be read again until it has moved\n * to another snapshot ({@link setDB}), if it is used again at all.\n */\n discardPendingChanges(): void {\n this.#delta?.clear();\n }\n\n /**\n * Writes the changes held in memory (see {@link setDeferWrites}) to the\n * backing snapshot, which is left as if they had been written through (in\n * the source's columns), and writes the changes pushed from then on through\n * to it. Yields when the\n * source's `shouldYield` says to, and must not be interleaved with a push.\n */\n *writePendingChanges(): Stream<'yield'> {\n const delta = this.#delta;\n if (delta === undefined) {\n return;\n }\n // The rows the delta holds satisfy the table's unique keys, but one may\n // take a unique value from another row that the delta also changed. So\n // every row it touched is deleted before any is inserted.\n for (const key of delta.touchedKeys()) {\n this.#stmts.delete.run(\n ...toSQLiteTypes(this.#primaryKey, key, this.#columns),\n );\n if (this.#shouldYield()) {\n yield 'yield';\n }\n }\n const columns = Object.keys(this.#columns);\n for (const row of delta.liveRows()) {\n this.#stmts.insert.run(...toSQLiteTypes(columns, row, this.#columns));\n if (this.#shouldYield()) {\n yield 'yield';\n }\n }\n this.#delta = undefined;\n }\n\n #getStatementsFor(db: Database) {\n const cached = this.#dbCache.get(db);\n if (cached) {\n return cached;\n }\n\n const stmts = {\n cache: new StatementCache(db),\n insert: db.prepare(\n compile(\n sql`INSERT INTO ${sql.ident(this.#table)} (${sql.join(\n Object.keys(this.#columns).map(c => sql.ident(c)),\n ', ',\n )}) VALUES (${sql.__dangerous__rawValue(\n Array.from({length: Object.keys(this.#columns).length})\n .fill('?')\n .join(','),\n )})`,\n ),\n ),\n delete: db.prepare(\n compile(\n sql`DELETE FROM ${sql.ident(this.#table)} WHERE ${sql.join(\n this.#primaryKey.map(k => sql`${sql.ident(k)}=?`),\n ' AND ',\n )}`,\n ),\n ),\n // If all the columns are part of the primary key, we cannot use UPDATE.\n update:\n Object.keys(this.#columns).length > this.#primaryKey.length\n ? db.prepare(\n compile(\n sql`UPDATE ${sql.ident(this.#table)} SET ${sql.join(\n nonPrimaryKeys(this.#columns, this.#primaryKey).map(\n c => sql`${sql.ident(c)}=?`,\n ),\n ',',\n )} WHERE ${sql.join(\n this.#primaryKey.map(k => sql`${sql.ident(k)}=?`),\n ' AND ',\n )}`,\n ),\n )\n : undefined,\n };\n this.#dbCache.set(db, stmts);\n return stmts;\n }\n\n get #allColumns() {\n return sql.join(\n Object.keys(this.#columns).map(c => sql.ident(c)),\n sql`,`,\n );\n }\n\n #getSchema(connection: Connection, unordered: boolean): SourceSchema {\n return {\n tableName: this.#table,\n columns: this.#columns,\n primaryKey: this.#primaryKey,\n sort: unordered ? undefined : connection.sort,\n relationships: {},\n isHidden: false,\n system: 'client',\n compareRows: connection.compareRows,\n };\n }\n\n connect(\n sort: Ordering | undefined,\n filters?: Condition,\n splitEditKeys?: Set<string>,\n debug?: DebugDelegate,\n ) {\n const transformedFilters = transformFilters(filters);\n const unordered = sort === undefined;\n // PK comparator is used for source-level overlay matching (remove by PK\n // equality) even when no ordering is requested.\n const primaryKeySort: Ordering = this.#primaryKeySort;\n\n const fetchSQL = new FetchSQLCache(\n this.#table,\n this.#columns,\n transformedFilters.filters,\n sort,\n );\n const input: SourceInput = {\n getSchema: () => schema,\n fetch: req => this.#fetch(req, connection, fetchSQL),\n setOutput: output => {\n connection.output = output;\n },\n destroy: () => {\n const idx = this.#connections.indexOf(connection);\n assert(idx !== -1, 'Connection not found');\n this.#connections.splice(idx, 1);\n },\n fullyAppliedFilters: !transformedFilters.conditionsRemoved,\n };\n\n const connection: Connection = {\n input,\n debug,\n output: undefined,\n sort,\n splitEditKeys,\n filters: transformedFilters.filters\n ? {\n condition: transformedFilters.filters,\n predicate: createPredicate(transformedFilters.filters),\n }\n : undefined,\n compareRows: sort ? makeComparator(sort) : makeComparator(primaryKeySort),\n lastPushedEpoch: 0,\n };\n const schema = this.#getSchema(connection, unordered);\n if (!unordered) {\n assertOrderingIncludesPK(sort, this.#primaryKey);\n }\n\n this.#connections.push(connection);\n return input;\n }\n\n toSQLiteRow(row: Row): Row {\n return Object.fromEntries(\n Object.entries(row).map(([key, value]) => [\n key,\n toSQLiteType(value, this.#columns[key].type),\n ]),\n ) as Row;\n }\n\n *#fetch(\n req: FetchRequest,\n connection: Connection,\n fetchSQL: FetchSQLCache,\n ): Stream<Node | 'yield'> {\n const {sort, debug} = connection;\n\n const rows = this.#queryRows(fetchSQL.get(req), debug);\n const overlayPredicate = mergeOverlayPredicate(\n connection.filters?.predicate,\n req.filter,\n );\n try {\n if (sort) {\n const comparator = makeComparator(sort, req.reverse);\n yield* generateWithStart(\n generateWithYields(\n generateWithOverlay(\n req.start?.row,\n this.#withPendingDelta(\n rows,\n req,\n overlayPredicate,\n sort,\n comparator,\n ),\n req.constraint,\n this.#overlay,\n connection.lastPushedEpoch,\n comparator,\n // SQL does the ordering and constraining, so the row stream is\n // already in the connection's sort order: the splice comparator\n // and the `startAt` comparator coincide here.\n comparator,\n overlayPredicate,\n req.multiConstraints,\n ),\n this.#shouldYield,\n ),\n req.start,\n comparator,\n );\n } else {\n yield* generateWithYields(\n generateWithOverlayUnordered(\n this.#withPendingDelta(\n rows,\n req,\n overlayPredicate,\n undefined,\n undefined,\n ),\n req.constraint,\n this.#overlay,\n connection.lastPushedEpoch,\n this.#primaryKey,\n overlayPredicate,\n req.multiConstraints,\n ),\n this.#shouldYield,\n );\n }\n } finally {\n // The generators above do not close `rows` when they are abandoned\n // partway, which leaves its statement open.\n rows.return();\n }\n }\n\n /**\n * The rows of `queries`, run one after another as `buildSelectQueries`\n * requires. Each statement is run only once the previous one is exhausted,\n * so a fetch that stops early never runs the rest.\n */\n *#queryRows(\n queries: readonly FetchSQL[],\n debug: DebugDelegate | undefined,\n ): Generator<Row, void, undefined> {\n const {cache} = this.#stmts;\n for (const sqlAndBindings of queries) {\n // The text of a fetch shape is the same string every time, so it needs\n // no normalizing.\n const cachedStatement = cache.getExact(sqlAndBindings.text);\n const cursor = cachedStatement.statement.batches(sqlAndBindings.values);\n try {\n debug?.initQuery(this.#table, sqlAndBindings.text);\n yield* this.#readRows(\n cursor,\n this.#rawColumnsFor(cachedStatement.statement),\n sqlAndBindings.text,\n debug,\n );\n } finally {\n // Ensure the SQLite cursor is closed.\n cursor.close();\n recordIndexUsage(cachedStatement.statement, this.#table);\n if (debug) {\n let totalNvisit = 0;\n const planLines: string[] = [];\n for (let i = 0; ; i++) {\n const nvisit = cachedStatement.statement.scanStatus(\n i,\n SQLite3Database.SQLITE_SCANSTAT_NVISIT,\n 1,\n );\n if (nvisit === undefined) {\n break;\n }\n totalNvisit += Number(nvisit);\n const explain = cachedStatement.statement.scanStatus(\n i,\n SQLite3Database.SQLITE_SCANSTAT_EXPLAIN,\n 1,\n );\n if (typeof explain === 'string' && explain.length > 0) {\n planLines.push(explain);\n }\n }\n if (totalNvisit !== 0) {\n debug.recordNVisit(this.#table, sqlAndBindings.text, totalNvisit);\n }\n if (planLines.length > 0) {\n debug.recordExplain(this.#table, sqlAndBindings.text, planLines);\n }\n cachedStatement.statement.scanStatusReset();\n }\n cache.return(cachedStatement);\n }\n }\n }\n\n /**\n * Splices the batch overlay into a base row stream, if there is one. When\n * derivation is not deferred, or the batch is empty -- every fetch during\n * hydration, and every fetch before the first change of a pass -- this is\n * the identity and the source behaves exactly as it did before.\n *\n * `predicate` is the connection's filters ANDed with `req.filter`, which\n * SQL applies to the base rows. `sort` and `compare` are absent for\n * unordered fetches, where nothing downstream depends on position.\n */\n #withPendingDelta(\n baseRows: IterableIterator<Row>,\n req: FetchRequest,\n predicate: ((row: Row) => boolean) | undefined,\n sort: Ordering | undefined,\n compare: Comparator | undefined,\n ): IterableIterator<Row> {\n const delta = this.#delta;\n if (delta === undefined || delta.isEmpty) {\n return baseRows;\n }\n const deltaRows = delta.rowsFor(\n sort ?? this.#primaryKeySort,\n req.constraint,\n sort ? req.reverse : false,\n predicate,\n req.multiConstraints,\n sort ? req.start?.row : undefined,\n );\n return compare\n ? generateWithPendingDelta(baseRows, deltaRows, delta, compare)\n : generateWithPendingDeltaUnordered(baseRows, deltaRows, delta);\n }\n\n #rawColumnsFor(statement: Statement): readonly RawColumn[] {\n return getOrInsertComputed(this.#rawColumns, statement, () =>\n statement\n .columns()\n .map(({name}) => rawColumn(this.#columns, name, this.#table)),\n );\n }\n\n *#readRows(\n cursor: BatchCursor,\n columns: readonly RawColumn[],\n query: string,\n debug: DebugDelegate | undefined,\n ): IterableIterator<Row> {\n for (let capacity = FIRST_BATCH_ROWS; ;) {\n const {ivmSampling, slowRowThreshold} = this.#logConfig;\n const sampled = ivmSampling > 0 && ++eventCount % ivmSampling === 0;\n const start = sampled ? performance.now() : 0;\n const values = cursor.next(capacity);\n const n = values.length / columns.length;\n if (sampled) {\n const duration = performance.now() - start;\n // slowRowThreshold is per row: scale it by the rows actually read.\n if (duration > slowRowThreshold * Math.max(n, 1)) {\n this.#lc.warn?.(\n `table-source.next took too long for ${query}. Are you missing an index? duration: ${duration}ms`,\n );\n }\n }\n if (n === 0) {\n return;\n }\n // Rows are converted only when they are consumed, so rows read ahead\n // and never used cost no conversion and cannot fail the fetch.\n for (let r = 0; r < n; r++) {\n const row = fromSQLiteRawRow(\n columns,\n values,\n this.#table,\n r * columns.length,\n );\n this.#rowsRead++;\n debug?.rowVended(this.#table, query, row);\n yield row;\n }\n capacity = Math.min(capacity * 2, MAX_BATCH_ROWS);\n }\n }\n\n *push(change: SourceChange): Stream<'yield'> {\n for (const result of this.genPush(change)) {\n if (result === 'yield') {\n yield result;\n }\n }\n }\n\n /**\n * The number of rows held in memory for changes that have been pushed but\n * not written, i.e. with `deferWrites`, since the last {@link setDB}.\n */\n get pendingRows(): number {\n return this.#delta?.size ?? 0;\n }\n\n /** Estimated bytes retained by deferred changes and their indexes. */\n get pendingBytes(): number {\n return this.#delta?.estimatedBytes ?? 0;\n }\n\n /**\n * Returns whether any connected pipeline could observe the given row.\n * If false, this row is completely invisible to this TableSource's connections.\n */\n mayAcceptRow(row: Row): boolean {\n if (!this.#skipUnobservableChanges || this.#connections.length === 0) {\n return true;\n }\n for (const conn of this.#connections) {\n if (!conn.filters || conn.filters.predicate(row)) {\n return true;\n }\n }\n return false;\n }\n\n #mayAcceptChange(change: SourceChange): boolean {\n if (!this.#skipUnobservableChanges || this.#connections.length === 0) {\n return true;\n }\n const row = change[SourceChangeIndex.ROW];\n if (this.mayAcceptRow(row)) {\n return true;\n }\n if (change[SourceChangeIndex.TYPE] === ChangeType.EDIT) {\n const oldRow = change[SourceChangeIndex.OLD_ROW];\n if (oldRow && this.mayAcceptRow(oldRow)) {\n return true;\n }\n }\n return false;\n }\n\n *genPush(change: SourceChange): Stream<'yield' | undefined> {\n if (this.#skipUnobservableChanges && !this.#mayAcceptChange(change)) {\n // No connection can observe this row, so only a REMOVE needs to be\n // applied to the snapshot.\n if (change[SourceChangeIndex.TYPE] === ChangeType.REMOVE) {\n this.#writeChange(change);\n }\n return;\n }\n\n const setOverlay = (o: Overlay | undefined) => (this.#overlay = o);\n const writeChange = (c: SourceChange) => this.#writeChange(c);\n\n // Note: TableSource intentionally does not implement checkExists (which MemorySource\n // uses for defensive asserts like \"Row already exists\" and \"Row not found\"):\n //\n // 1. Edit detection does not rely on checkExists:\n // Edits are detected upstream in PipelineDriver by matching row primary keys\n // against prevValues (via deepEqual on PK columns) and emitting SourceChangeEdit.\n //\n // 2. Upstream guarantees and error handling:\n // - Replicated streams from Postgres WAL / SnapshotDiff guarantee transactional\n // consistency, ordering, and row existence.\n // - PipelineDriver.#advance reconciles incoming row keys against both the prev\n // snapshot and pending delta, guaranteeing that any existing primary key is\n // emitted as an EDIT rather than an ADD.\n // - In write-through mode, SQLite's native PRIMARY KEY or UNIQUE constraints\n // immediately fail if a duplicate INSERT is attempted.\n // - In deferred-writes mode, writePendingChanges() deletes touched primary keys\n // before inserting (to handle unique-index permutations), meaning an erroneous\n // duplicate ADD would act as a replacement. We intentionally do not execute a\n // synchronous SQLite SELECT existence probe on every ADD to catch a theoretical\n // upstream bug, which is instead guarded by unit tests.\n // - Deletes of non-existent rows in SQLite are safe no-ops (0 rows affected).\n //\n // Omitting checkExists avoids executing expensive synchronous SQLite SELECT queries on every\n // pushed row change, eliminating a major bottleneck in push advancement.\n yield* genPushAndWriteWithSplitEdit(\n this.#connections,\n change,\n undefined,\n setOverlay,\n writeChange,\n () => ++this.#pushEpoch,\n );\n }\n\n #writeChange(change: SourceChange) {\n const delta = this.#delta;\n if (delta !== undefined) {\n this.#writeChangeToDelta(delta, change);\n return;\n }\n switch (change[SourceChangeIndex.TYPE]) {\n case ChangeType.ADD:\n this.#stmts.insert.run(\n ...toSQLiteTypes(\n // TODO(arv): Compute this once!\n Object.keys(this.#columns),\n change[SourceChangeIndex.ROW],\n this.#columns,\n ),\n );\n break;\n case ChangeType.REMOVE:\n this.#stmts.delete.run(\n ...toSQLiteTypes(\n this.#primaryKey,\n change[SourceChangeIndex.ROW],\n this.#columns,\n ),\n );\n break;\n case ChangeType.EDIT: {\n // If the PK is the same, use UPDATE.\n if (\n canUseUpdate(\n change[SourceChangeIndex.OLD_ROW],\n change[SourceChangeIndex.ROW],\n this.#columns,\n this.#primaryKey,\n )\n ) {\n const mergedRow = {\n ...change[SourceChangeIndex.OLD_ROW],\n ...change[SourceChangeIndex.ROW],\n };\n const params = [\n ...nonPrimaryValues(this.#columns, this.#primaryKey, mergedRow),\n ...toSQLiteTypes(this.#primaryKey, mergedRow, this.#columns),\n ];\n must(this.#stmts.update).run(params);\n } else {\n this.#stmts.delete.run(\n ...toSQLiteTypes(\n this.#primaryKey,\n change[SourceChangeIndex.OLD_ROW],\n this.#columns,\n ),\n );\n this.#stmts.insert.run(\n ...toSQLiteTypes(\n Object.keys(this.#columns),\n change[SourceChangeIndex.ROW],\n this.#columns,\n ),\n );\n }\n\n break;\n }\n default:\n unreachable(change);\n }\n }\n\n /**\n * Reconciles a set of rows that the caller found in the *backing snapshot*\n * with the changes this source has applied but not written.\n *\n * A view-syncer computes the rows a replicated change collides with -- by\n * change-log key for a delete, by every unique key for a set -- against the\n * snapshot it is reading. When derivation writes through, that snapshot has\n * already absorbed the earlier changes of the same advancement, so the\n * probe sees them. When derivation is deferred they live here instead, and\n * the probe has to be brought up to date or the source is pushed a change\n * that contradicts its own state (a delete of a row the batch already\n * removed, an edit whose old row is stale).\n *\n * Two ways the batch can disagree with the probe, both handled here: a\n * probed row may have been removed, or may have been edited (so the\n * caller's copy is stale, or it no longer collides at all).\n *\n * The batch cannot have edited a row the probe missed *into* collision. The\n * change log keeps one entry per row key, so every row the batch holds is\n * that row's value at the advancement's target version, as is `next`, and\n * two distinct rows of one version cannot share a non-null unique key.\n *\n * Returns `base` untouched when derivation is not deferred, which is what\n * makes this a no-op for the write-through path.\n */\n reconcilePendingConflicts(\n base: readonly Row[],\n next: Row | null,\n rowKey: SQLiteRow,\n uniqueKeys: readonly (readonly string[])[],\n ): readonly Row[] {\n const delta = this.#delta;\n if (delta === undefined || delta.isEmpty) {\n return base;\n }\n\n // The change-log key uses SQLite values, while pending rows use ZQL\n // values. It is the upstream replica identity, which may include columns\n // the source does not sync. The batch cannot have changed those (nor can a\n // write-through `UPDATE`), so only the synced columns are compared.\n const deleteKey = next === null ? this.#syncedDeleteKey(rowKey) : undefined;\n const out: Row[] = [];\n for (const row of base) {\n const pending = delta.get(row);\n const current = pending === NOT_OVERRIDDEN ? row : pending;\n if (current === undefined) {\n continue; // the batch removed it\n }\n if (\n deleteKey !== undefined\n ? !deleteKey.every(([col, value]) =>\n sqliteValuesEqual(current[col], value, this.#columns[col].type),\n )\n : !collides(\n current,\n must(next),\n uniqueKeys,\n this.#primaryKey,\n this.#columns,\n )\n ) {\n continue; // the batch edited it out of collision\n }\n out.push(current);\n }\n return out;\n }\n\n #syncedDeleteKey(rowKey: SQLiteRow): [string, Value][] {\n const synced: Writable<SQLiteRow> = {};\n for (const [col, value] of Object.entries(rowKey)) {\n if (Object.hasOwn(this.#columns, col)) {\n synced[col] = value;\n }\n }\n return Object.entries(fromSQLiteTypes(this.#columns, synced, this.#table));\n }\n\n /**\n * The batch-overlay counterpart of {@link #writeChange}. It must reproduce\n * that method's semantics exactly, including its treatment of an edit that\n * cannot be expressed as an `UPDATE` -- a changed primary key, or a table\n * whose columns are all part of the key -- as a delete followed by an\n * insert.\n */\n #writeChangeToDelta(delta: PendingDelta, change: SourceChange) {\n switch (change[SourceChangeIndex.TYPE]) {\n case ChangeType.ADD:\n delta.set(change[SourceChangeIndex.ROW]);\n break;\n case ChangeType.REMOVE:\n delta.delete(change[SourceChangeIndex.ROW]);\n break;\n case ChangeType.EDIT: {\n const oldRow = change[SourceChangeIndex.OLD_ROW];\n const row = change[SourceChangeIndex.ROW];\n if (canUseUpdate(oldRow, row, this.#columns, this.#primaryKey)) {\n // `UPDATE` sets only the non-primary columns, so the row keeps any\n // column the change did not mention.\n delta.set({...oldRow, ...row});\n } else {\n delta.delete(oldRow);\n delta.set(row);\n }\n break;\n }\n default:\n unreachable(change);\n }\n }\n\n #getRowStmtCache = new Map<string, string>();\n\n #getRowStmt(keyCols: string[]): string {\n const keyString = JSON.stringify(keyCols);\n return getOrInsertComputed(this.#getRowStmtCache, keyString, () =>\n compile(\n sql`SELECT ${this.#allColumns} FROM ${sql.ident(\n this.#table,\n )} WHERE ${sql.join(\n keyCols.map(k => sql`${sql.ident(k)}=?`),\n sql` AND`,\n )}`,\n ),\n );\n }\n\n /**\n * Retrieves a row from the backing DB by a unique key, or `undefined` if such a\n * row does not exist. This is not used in the IVM pipeline but is useful\n * for retrieving data that is consistent with the state (and type\n * semantics) of the pipeline. Note that this key may not necessarily correspond\n * to the `primaryKey` with which this TableSource.\n */\n getRow(rowKey: Row): Row | undefined {\n const keyCols = Object.keys(rowKey);\n\n const stmt = this.#getRowStmt(keyCols);\n const row = this.#stmts.cache.use(stmt, ({statement}) => {\n const values = statement\n .safeIntegers(true)\n .raw(true)\n .get<SQLiteValue[] | undefined>(\n ...toSQLiteTypes(keyCols, rowKey, this.#columns),\n );\n recordIndexUsage(statement, this.#table);\n return values === undefined\n ? undefined\n : fromSQLiteRawRow(this.#rawColumnsFor(statement), values, this.#table);\n });\n\n const delta = this.#delta;\n if (delta === undefined || delta.isEmpty) {\n return row;\n }\n if (row !== undefined) {\n // The batch may have edited or removed the base row out from under this\n // lookup. Its own primary key is what identifies it in the batch.\n const overridden = delta.get(row);\n if (overridden === NOT_OVERRIDDEN) {\n return row;\n }\n if (\n overridden !== undefined &&\n keyCols.every(c => overridden[c] === rowKey[c])\n ) {\n return overridden;\n }\n }\n // The base match is absent, removed, or no longer matches this key. Another\n // pending row may now own the key.\n return delta.getByColumns(keyCols, rowKey);\n }\n}\n\nfunction mergeOverlayPredicate(\n connPredicate: ((row: Row) => boolean) | undefined,\n reqFilter: StrictNoSubqueryCondition | undefined,\n): ((row: Row) => boolean) | undefined {\n if (!reqFilter) {\n return connPredicate;\n }\n const reqPredicate = createPredicate(reqFilter);\n if (!connPredicate) {\n return reqPredicate;\n }\n return row => connPredicate(row) && reqPredicate(row);\n}\n\n/**\n * Whether `a` occupies the same row identity as `b` -- the same primary key,\n * or the same value on any unique key, which is what a replicated write\n * conflicts on.\n */\nfunction collides(\n a: Row,\n b: Row,\n uniqueKeys: readonly (readonly string[])[],\n primaryKey: PrimaryKey,\n columns: Record<string, SchemaValue>,\n): boolean {\n if (\n primaryKey.every(col =>\n sqliteValuesEqual(a[col], b[col], columns[col].type),\n )\n ) {\n return true;\n }\n for (const key of uniqueKeys) {\n if (key.some(col => b[col] === null || b[col] === undefined)) {\n continue;\n }\n if (\n key.every(col => sqliteValuesEqual(a[col], b[col], columns[col].type))\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction sqliteValuesEqual(\n a: Value | undefined,\n b: Value | undefined,\n type: ValueType,\n) {\n return toSQLiteType(a, type) === toSQLiteType(b, type);\n}\n\nfunction getUniqueIndexes(\n db: Database,\n tableName: string,\n): Map<string, Set<string>> {\n const sqlAndBindings = format(\n sql`\n SELECT idx.name, json_group_array(col.name) as columnsJSON\n FROM sqlite_master as idx\n JOIN pragma_index_list(idx.tbl_name) AS info ON info.name = idx.name\n JOIN pragma_index_info(idx.name) as col\n WHERE idx.tbl_name = ${tableName} AND\n idx.type = 'index' AND \n info.\"unique\" != 0 AND\n info.partial = 0\n GROUP BY idx.name\n ORDER BY idx.name`,\n );\n const stmt = db.prepare(sqlAndBindings.text);\n const indexes = stmt.all<{columnsJSON: string}>(...sqlAndBindings.values);\n return new Map(\n indexes.map(({columnsJSON}) => {\n const columns = JSON.parse(columnsJSON);\n const set = new Set<string>(columns);\n return [JSON.stringify(columns.sort()), set];\n }),\n );\n}\n\nfunction toSQLiteTypes(\n columns: readonly string[],\n row: Row,\n columnTypes: Record<string, SchemaValue>,\n): readonly unknown[] {\n return columns.map(col => toSQLiteType(row[col], columnTypes[col].type));\n}\n\nexport function toSQLiteTypeName(type: ValueType) {\n switch (type) {\n case 'boolean':\n return 'INTEGER';\n case 'number':\n return 'REAL';\n case 'string':\n return 'TEXT';\n case 'null':\n return 'NULL';\n case 'json':\n return 'TEXT';\n }\n}\n\n/**\n * A column value as read from SQLite with `safeIntegers(true)`, i.e. before\n * {@link fromSQLiteTypes} converts it to a {@link Value}.\n */\nexport type SQLiteValue = bigint | number | string | null;\n\n/** A row as read from SQLite, before {@link fromSQLiteTypes}. */\nexport type SQLiteRow = Readonly<Record<string, SQLiteValue>>;\n\nexport function fromSQLiteTypes(\n valueTypes: Record<string, SchemaValue>,\n row: SQLiteRow,\n tableName: string,\n): Row {\n const newRow: Writable<Row> = {};\n for (const key of Object.keys(row)) {\n const valueType = valueTypes[key];\n if (valueType === undefined) {\n throw invalidColumnError(valueTypes, key, tableName);\n }\n newRow[key] = fromSQLiteType(valueType.type, row[key], key, tableName);\n }\n return newRow;\n}\n\n/** A result column of a raw row and the type it converts to. */\nexport type RawColumn = {\n readonly name: string;\n readonly type: ValueType;\n};\n\nexport function rawColumn(\n valueTypes: Record<string, SchemaValue>,\n name: string,\n tableName: string,\n): RawColumn {\n // Not a column that `valueTypes` merely inherits, e.g. `toString`.\n const valueType = Object.hasOwn(valueTypes, name)\n ? valueTypes[name]\n : undefined;\n if (valueType === undefined) {\n throw invalidColumnError(valueTypes, name, tableName);\n }\n return {name, type: valueType.type};\n}\n\nfunction invalidColumnError(\n valueTypes: Record<string, SchemaValue>,\n name: string,\n tableName: string,\n): Error {\n const columnList = Object.keys(valueTypes).sort().join(', ');\n return new Error(\n `Invalid column \"${name}\" for table \"${tableName}\". Synced columns include ${columnList}`,\n );\n}\n\n/**\n * Like {@link fromSQLiteTypes}, for a row read with `raw(true)`: the row's\n * values are `values[offset]` up to `values[offset + columns.length - 1]`.\n */\nexport function fromSQLiteRawRow(\n columns: readonly RawColumn[],\n values: readonly SQLiteValue[],\n tableName: string,\n offset = 0,\n): Row {\n const newRow: Writable<Row> = {};\n for (let i = 0; i < columns.length; i++) {\n const {name, type} = columns[i];\n const value = fromSQLiteType(type, values[offset + i], name, tableName);\n if (name === '__proto__') {\n // An own property, not the legacy setter.\n assignProperty<string, Value>(newRow, name, value);\n } else {\n newRow[name] = value;\n }\n }\n return newRow;\n}\n\nfunction fromSQLiteType(\n valueType: ValueType,\n v: SQLiteValue,\n column: string,\n tableName: string,\n): Value {\n if (v === null) {\n return null;\n }\n switch (valueType) {\n case 'boolean':\n return !!v;\n case 'number':\n case 'string':\n case 'null':\n if (typeof v === 'bigint') {\n if (v > Number.MAX_SAFE_INTEGER || v < Number.MIN_SAFE_INTEGER) {\n throw new UnsupportedValueError(\n `value ${v} (in ${tableName}.${column}) is outside of supported bounds`,\n );\n }\n return Number(v);\n }\n return v;\n case 'json':\n try {\n return JSON.parse(v as string);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n throw new UnsupportedValueError(\n `Failed to parse JSON for ${tableName}.${column}: ${errorMessage}`,\n {cause: error},\n );\n }\n }\n}\n\nexport class UnsupportedValueError extends Error {}\n\nfunction canUseUpdate(\n oldRow: Row,\n row: Row,\n columns: Record<string, SchemaValue>,\n primaryKey: PrimaryKey,\n): boolean {\n for (const pk of primaryKey) {\n if (oldRow[pk] !== row[pk]) {\n return false;\n }\n }\n return Object.keys(columns).length > primaryKey.length;\n}\n\nfunction nonPrimaryValues(\n columns: Record<string, SchemaValue>,\n primaryKey: PrimaryKey,\n row: Row,\n): Iterable<unknown> {\n return nonPrimaryKeys(columns, primaryKey).map(c =>\n toSQLiteType(row[c], columns[c].type),\n );\n}\n\nfunction nonPrimaryKeys(\n columns: Record<string, SchemaValue>,\n primaryKey: PrimaryKey,\n) {\n return Object.keys(columns).filter(c => !primaryKey.includes(c));\n}\n\nfunction* generateWithYields(stream: Stream<Node>, shouldYield: () => boolean) {\n for (const n of stream) {\n if (shouldYield()) {\n yield 'yield';\n }\n yield n;\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rocicorp/zero",
3
- "version": "1.12.0-canary.0",
3
+ "version": "1.12.0-canary.10",
4
4
  "description": "Zero is a web framework for serverless web development.",
5
5
  "homepage": "https://zero.rocicorp.dev",
6
6
  "bugs": {
@@ -14,7 +14,6 @@
14
14
  "directory": "packages/zero"
15
15
  },
16
16
  "bin": {
17
- "analyze-query": "./out/zero/src/analyze-query.js",
18
17
  "ast-to-zql": "./out/zero/src/ast-to-zql.js",
19
18
  "transform-query": "./out/zero/src/transform-query.js",
20
19
  "zero-build-schema": "./out/zero/src/build-schema.js",
@@ -123,65 +122,66 @@
123
122
  "@badrap/valita": "0.5.5",
124
123
  "@databases/escape-identifier": "^1.0.3",
125
124
  "@databases/sql": "^3.3.0",
126
- "@dotenvx/dotenvx": "^1.39.0",
125
+ "@dotenvx/dotenvx": "^1.66.0",
127
126
  "@drdgvhbh/postgres-error-codes": "^0.0.6",
128
- "@fastify/cors": "^10.0.0",
129
- "@fastify/websocket": "^11.0.0",
127
+ "@fastify/cors": "^10.1.0",
128
+ "@fastify/websocket": "^11.2.0",
130
129
  "@google-cloud/precise-date": "^4.0.0",
131
- "@opentelemetry/api": "^1.9.0",
132
- "@opentelemetry/api-logs": "^0.218.0",
133
- "@opentelemetry/auto-instrumentations-node": "^0.76.0",
134
- "@opentelemetry/exporter-metrics-otlp-http": "^0.218.0",
135
- "@opentelemetry/resources": "^2.7.1",
136
- "@opentelemetry/sdk-metrics": "^2.7.1",
137
- "@opentelemetry/sdk-node": "^0.218.0",
138
- "@opentelemetry/sdk-trace-node": "^2.7.1",
139
- "@opentelemetry/semantic-conventions": "^1.41.1",
130
+ "@opentelemetry/api": "1.9.1",
131
+ "@opentelemetry/api-logs": "0.223.0",
132
+ "@opentelemetry/auto-instrumentations-node": "0.81.2",
133
+ "@opentelemetry/exporter-metrics-otlp-http": "0.223.0",
134
+ "@opentelemetry/resources": "2.12.0",
135
+ "@opentelemetry/sdk-metrics": "2.12.0",
136
+ "@opentelemetry/sdk-node": "0.223.0",
137
+ "@opentelemetry/sdk-trace-node": "2.12.0",
138
+ "@opentelemetry/semantic-conventions": "1.43.0",
140
139
  "@postgresql-typed/oids": "^0.2.0",
141
- "@rocicorp/lock": "^1.0.4",
140
+ "@rocicorp/lock": "^2.0.1",
142
141
  "@rocicorp/logger": "^6.1.0",
143
- "@rocicorp/resolver": "^1.0.2",
144
- "@rocicorp/zero-sqlite3": "^1.1.5",
145
- "@standard-schema/spec": "^1.0.0",
142
+ "@rocicorp/zero-sqlite3": "^1.1.7",
143
+ "@standard-schema/spec": "^1.1.0",
146
144
  "@types/basic-auth": "^1.1.8",
147
- "@types/ws": "^8.5.12",
145
+ "@types/ws": "^8.18.1",
148
146
  "basic-auth": "^2.0.1",
149
- "chalk-template": "^1.1.0",
150
- "chokidar": "^4.0.1",
147
+ "chalk-template": "^1.1.2",
148
+ "chokidar": "^4.0.3",
151
149
  "cloudevents": "^10.0.0",
152
- "command-line-args": "^6.0.1",
153
- "command-line-usage": "^7.0.3",
150
+ "command-line-args": "^6.0.2",
151
+ "command-line-usage": "^7.0.4",
154
152
  "compare-utf8": "^0.2.3",
155
- "defu": "^6.1.4",
156
- "eventemitter3": "^5.0.1",
157
- "fastify": "^5.0.0",
153
+ "defu": "^6.1.7",
154
+ "eventemitter3": "^5.0.4",
155
+ "fastify": "^5.12.7",
158
156
  "is-in-subnet": "^4.0.1",
159
- "jose": "^5.9.3",
157
+ "jose": "^5.10.0",
160
158
  "json-custom-numbers": "^3.1.1",
161
- "kasi": "^1.1.0",
162
- "nanoid": "^5.1.2",
163
- "oxfmt": "^0.65.0",
159
+ "kasi": "^1.1.2",
160
+ "nanoid": "^5.1.16",
161
+ "oxc-parser": "^0.129.0",
162
+ "oxfmt": "^0.74.0",
164
163
  "parse-prometheus-text-format": "^1.1.1",
165
164
  "pg-format": "npm:pg-format-fix@^1.0.5",
166
165
  "postgres": "3.4.7",
167
- "semver": "^7.5.4",
166
+ "semver": "^7.8.0",
168
167
  "url-pattern": "^1.0.3",
169
168
  "urlpattern-polyfill": "^10.1.0",
170
- "ws": "^8.18.1"
169
+ "ws": "^8.22.0"
171
170
  },
172
171
  "devDependencies": {
173
- "@op-engineering/op-sqlite": ">=15",
172
+ "@op-engineering/op-sqlite": "^18.2.5",
174
173
  "analyze-query": "workspace:*",
175
174
  "ast-to-zql": "workspace:*",
176
- "expo-sqlite": ">=15",
177
- "oxc-parser": "^0.129.0",
175
+ "expo": "^58.0.14",
176
+ "expo-sqlite": "^58.0.13",
177
+ "react-native": "^0.88.0",
178
178
  "replicache": "workspace:*",
179
179
  "shared": "workspace:*",
180
- "syncpack": "^14.3.0",
181
- "typedoc": "^0.28.17",
180
+ "syncpack": "^14.3.1",
181
+ "typedoc": "^0.28.19",
182
182
  "typescript": "~7.0.2",
183
- "vite": "^8.0.13",
184
- "vitest": "^5.0.0",
183
+ "vite": "^8.3.4",
184
+ "vitest": "^5.0.5",
185
185
  "zero-cache": "workspace:*",
186
186
  "zero-client": "workspace:*",
187
187
  "zero-pg": "workspace:*",
@@ -1,2 +0,0 @@
1
- import '../../shared/src/dotenv.ts';
2
- //# sourceMappingURL=bin-analyze.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bin-analyze.d.ts","sourceRoot":"","sources":["../../../../analyze-query/src/bin-analyze.ts"],"names":[],"mappings":"AAAA,OAAO,4BAA4B,CAAC"}