@rocicorp/zero 1.12.0-canary.1 → 1.12.0-canary.11

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 (1466) 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 +6 -4
  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 +170 -0
  10. package/out/analyze-query/src/zql-chain.js.map +1 -0
  11. package/out/ast-to-zql/src/ast-to-zql.d.ts.map +1 -1
  12. package/out/ast-to-zql/src/ast-to-zql.js +61 -20
  13. package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
  14. package/out/ast-to-zql/src/bin.js +4 -3
  15. package/out/ast-to-zql/src/bin.js.map +1 -1
  16. package/out/ast-to-zql/src/format.js.map +1 -1
  17. package/out/datadog/src/datadog-log-sink.js +5 -4
  18. package/out/datadog/src/datadog-log-sink.js.map +1 -1
  19. package/out/otel/src/log-options.js.map +1 -1
  20. package/out/replicache/src/btree/node.d.ts +0 -2
  21. package/out/replicache/src/btree/node.d.ts.map +1 -1
  22. package/out/replicache/src/btree/node.js +14 -12
  23. package/out/replicache/src/btree/node.js.map +1 -1
  24. package/out/replicache/src/btree/read.js +4 -2
  25. package/out/replicache/src/btree/read.js.map +1 -1
  26. package/out/replicache/src/btree/splice.js.map +1 -1
  27. package/out/replicache/src/btree/write.js +9 -5
  28. package/out/replicache/src/btree/write.js.map +1 -1
  29. package/out/replicache/src/config.js +1 -2
  30. package/out/replicache/src/connection-loop.d.ts.map +1 -1
  31. package/out/replicache/src/connection-loop.js +1 -1
  32. package/out/replicache/src/connection-loop.js.map +1 -1
  33. package/out/replicache/src/dag/chunk.js +1 -1
  34. package/out/replicache/src/dag/gc.js.map +1 -1
  35. package/out/replicache/src/dag/lazy-store.js +8 -7
  36. package/out/replicache/src/dag/lazy-store.js.map +1 -1
  37. package/out/replicache/src/dag/store-impl.js +1 -1
  38. package/out/replicache/src/dag/store-impl.js.map +1 -1
  39. package/out/replicache/src/dag/visitor.js.map +1 -1
  40. package/out/replicache/src/db/commit.d.ts +0 -1
  41. package/out/replicache/src/db/commit.d.ts.map +1 -1
  42. package/out/replicache/src/db/commit.js +5 -3
  43. package/out/replicache/src/db/commit.js.map +1 -1
  44. package/out/replicache/src/db/read.js +1 -1
  45. package/out/replicache/src/db/read.js.map +1 -1
  46. package/out/replicache/src/db/rebase.js.map +1 -1
  47. package/out/replicache/src/db/write.d.ts +0 -2
  48. package/out/replicache/src/db/write.d.ts.map +1 -1
  49. package/out/replicache/src/db/write.js +5 -2
  50. package/out/replicache/src/db/write.js.map +1 -1
  51. package/out/replicache/src/deleted-clients.d.ts +0 -2
  52. package/out/replicache/src/deleted-clients.d.ts.map +1 -1
  53. package/out/replicache/src/deleted-clients.js +5 -3
  54. package/out/replicache/src/deleted-clients.js.map +1 -1
  55. package/out/replicache/src/expo-sqlite.js +1 -2
  56. package/out/replicache/src/frozen-json.d.ts +0 -1
  57. package/out/replicache/src/frozen-json.d.ts.map +1 -1
  58. package/out/replicache/src/frozen-json.js +1 -1
  59. package/out/replicache/src/frozen-json.js.map +1 -1
  60. package/out/replicache/src/get-default-puller.js +1 -1
  61. package/out/replicache/src/hash.js +1 -1
  62. package/out/replicache/src/hash.js.map +1 -1
  63. package/out/replicache/src/impl.js +1 -2
  64. package/out/replicache/src/index-defs.d.ts +0 -2
  65. package/out/replicache/src/index-defs.d.ts.map +1 -1
  66. package/out/replicache/src/index-defs.js +5 -3
  67. package/out/replicache/src/index-defs.js.map +1 -1
  68. package/out/replicache/src/kv/expo-sqlite/store.d.ts +0 -1
  69. package/out/replicache/src/kv/expo-sqlite/store.d.ts.map +1 -1
  70. package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
  71. package/out/replicache/src/kv/idb-store.js +2 -2
  72. package/out/replicache/src/kv/idb-store.js.map +1 -1
  73. package/out/replicache/src/kv/mem-fallback-store.js +1 -1
  74. package/out/replicache/src/kv/mem-fallback-store.js.map +1 -1
  75. package/out/replicache/src/kv/mem-store.js.map +1 -1
  76. package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
  77. package/out/replicache/src/kv/op-sqlite/types.js.map +1 -1
  78. package/out/replicache/src/kv/read-impl.js.map +1 -1
  79. package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
  80. package/out/replicache/src/kv/sqlite-store.js +8 -4
  81. package/out/replicache/src/kv/sqlite-store.js.map +1 -1
  82. package/out/replicache/src/kv/throw-if-closed.d.ts +0 -3
  83. package/out/replicache/src/kv/throw-if-closed.d.ts.map +1 -1
  84. package/out/replicache/src/kv/throw-if-closed.js.map +1 -1
  85. package/out/replicache/src/kv/write-impl-base.js +4 -1
  86. package/out/replicache/src/kv/write-impl-base.js.map +1 -1
  87. package/out/replicache/src/kv/write-impl.js.map +1 -1
  88. package/out/replicache/src/log-options.js +2 -1
  89. package/out/replicache/src/log-options.js.map +1 -1
  90. package/out/replicache/src/make-idb-name.js +1 -1
  91. package/out/replicache/src/new-client-channel.js +9 -7
  92. package/out/replicache/src/new-client-channel.js.map +1 -1
  93. package/out/replicache/src/on-persist-channel.js +1 -1
  94. package/out/replicache/src/on-persist-channel.js.map +1 -1
  95. package/out/replicache/src/op-sqlite.js +1 -2
  96. package/out/replicache/src/pending-mutations.js +2 -1
  97. package/out/replicache/src/pending-mutations.js.map +1 -1
  98. package/out/replicache/src/persist/client-gc.js +2 -2
  99. package/out/replicache/src/persist/client-gc.js.map +1 -1
  100. package/out/replicache/src/persist/client-group-gc.d.ts +0 -7
  101. package/out/replicache/src/persist/client-group-gc.d.ts.map +1 -1
  102. package/out/replicache/src/persist/client-group-gc.js +1 -1
  103. package/out/replicache/src/persist/client-group-gc.js.map +1 -1
  104. package/out/replicache/src/persist/client-groups.js +1 -1
  105. package/out/replicache/src/persist/client-groups.js.map +1 -1
  106. package/out/replicache/src/persist/clients.js +1 -1
  107. package/out/replicache/src/persist/clients.js.map +1 -1
  108. package/out/replicache/src/persist/collect-idb-databases.js +5 -4
  109. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
  110. package/out/replicache/src/persist/gather-mem-only-visitor.js.map +1 -1
  111. package/out/replicache/src/persist/gather-not-cached-visitor.js.map +1 -1
  112. package/out/replicache/src/persist/heartbeat.js +2 -2
  113. package/out/replicache/src/persist/heartbeat.js.map +1 -1
  114. package/out/replicache/src/persist/idb-databases-store.js +1 -1
  115. package/out/replicache/src/persist/idb-databases-store.js.map +1 -1
  116. package/out/replicache/src/persist/make-client-id.js +1 -1
  117. package/out/replicache/src/persist/make-client-id.js.map +1 -1
  118. package/out/replicache/src/persist/persist.js +3 -2
  119. package/out/replicache/src/persist/persist.js.map +1 -1
  120. package/out/replicache/src/persist/refresh.js +8 -5
  121. package/out/replicache/src/persist/refresh.js.map +1 -1
  122. package/out/replicache/src/process-scheduler.js +1 -1
  123. package/out/replicache/src/process-scheduler.js.map +1 -1
  124. package/out/replicache/src/replicache-impl.d.ts +2 -7
  125. package/out/replicache/src/replicache-impl.d.ts.map +1 -1
  126. package/out/replicache/src/replicache-impl.js +21 -18
  127. package/out/replicache/src/replicache-impl.js.map +1 -1
  128. package/out/replicache/src/scan-iterator.js.map +1 -1
  129. package/out/replicache/src/scan-options.js +7 -6
  130. package/out/replicache/src/scan-options.js.map +1 -1
  131. package/out/replicache/src/sqlite.js +1 -2
  132. package/out/replicache/src/subscriptions.js +1 -1
  133. package/out/replicache/src/subscriptions.js.map +1 -1
  134. package/out/replicache/src/sync/diff.js +3 -1
  135. package/out/replicache/src/sync/diff.js.map +1 -1
  136. package/out/replicache/src/sync/ids.js.map +1 -1
  137. package/out/replicache/src/sync/patch.d.ts +0 -5
  138. package/out/replicache/src/sync/patch.d.ts.map +1 -1
  139. package/out/replicache/src/sync/patch.js +2 -4
  140. package/out/replicache/src/sync/patch.js.map +1 -1
  141. package/out/replicache/src/sync/pull.d.ts +0 -1
  142. package/out/replicache/src/sync/pull.d.ts.map +1 -1
  143. package/out/replicache/src/sync/pull.js +3 -1
  144. package/out/replicache/src/sync/pull.js.map +1 -1
  145. package/out/replicache/src/sync/push.d.ts +2 -1
  146. package/out/replicache/src/sync/push.d.ts.map +1 -1
  147. package/out/replicache/src/sync/push.js.map +1 -1
  148. package/out/replicache/src/sync/request-id.js +1 -1
  149. package/out/replicache/src/sync/request-id.js.map +1 -1
  150. package/out/replicache/src/transactions.js +1 -1
  151. package/out/replicache/src/transactions.js.map +1 -1
  152. package/out/replicache/src/types.d.ts +2 -1
  153. package/out/replicache/src/types.d.ts.map +1 -1
  154. package/out/shared/src/arrays.js +4 -1
  155. package/out/shared/src/arrays.js.map +1 -1
  156. package/out/shared/src/asserts.d.ts +0 -5
  157. package/out/shared/src/asserts.d.ts.map +1 -1
  158. package/out/shared/src/asserts.js.map +1 -1
  159. package/out/shared/src/bigint-json.d.ts +9 -0
  160. package/out/shared/src/bigint-json.d.ts.map +1 -1
  161. package/out/shared/src/bigint-json.js +27 -2
  162. package/out/shared/src/bigint-json.js.map +1 -1
  163. package/out/shared/src/broadcast-channel.js +1 -1
  164. package/out/shared/src/browser-env.d.ts +0 -17
  165. package/out/shared/src/browser-env.d.ts.map +1 -1
  166. package/out/shared/src/browser-env.js.map +1 -1
  167. package/out/shared/src/btree-set.js +11 -8
  168. package/out/shared/src/btree-set.js.map +1 -1
  169. package/out/shared/src/cache.js.map +1 -1
  170. package/out/shared/src/config.js +1 -1
  171. package/out/shared/src/custom-key-map.js.map +1 -1
  172. package/out/shared/src/custom-key-set.js.map +1 -1
  173. package/out/shared/src/deep-clone.d.ts +0 -1
  174. package/out/shared/src/deep-clone.d.ts.map +1 -1
  175. package/out/shared/src/deep-clone.js.map +1 -1
  176. package/out/shared/src/document-visible.js +1 -1
  177. package/out/shared/src/document-visible.js.map +1 -1
  178. package/out/shared/src/dotenv.js.map +1 -1
  179. package/out/shared/src/error.js +1 -1
  180. package/out/shared/src/error.js.map +1 -1
  181. package/out/shared/src/expand.d.ts +0 -3
  182. package/out/shared/src/expand.d.ts.map +1 -1
  183. package/out/shared/src/hash.js +2 -2
  184. package/out/shared/src/hash.js.map +1 -1
  185. package/out/shared/src/immutable.d.ts +1 -1
  186. package/out/shared/src/immutable.d.ts.map +1 -1
  187. package/out/shared/src/iterables.d.ts +0 -1
  188. package/out/shared/src/iterables.d.ts.map +1 -1
  189. package/out/shared/src/iterables.js.map +1 -1
  190. package/out/shared/src/json-schema.js.map +1 -1
  191. package/out/shared/src/json.js.map +1 -1
  192. package/out/shared/src/logging-test-utils.js.map +1 -1
  193. package/out/shared/src/logging.js +1 -1
  194. package/out/shared/src/logging.js.map +1 -1
  195. package/out/shared/src/navigator.js +1 -1
  196. package/out/shared/src/options-types.d.ts +1 -1
  197. package/out/shared/src/options-types.d.ts.map +1 -1
  198. package/out/shared/src/options.d.ts +2 -3
  199. package/out/shared/src/options.d.ts.map +1 -1
  200. package/out/shared/src/options.js +8 -11
  201. package/out/shared/src/options.js.map +1 -1
  202. package/out/shared/src/promise-race.js +1 -1
  203. package/out/shared/src/promise-race.js.map +1 -1
  204. package/out/shared/src/queue.js +1 -1
  205. package/out/shared/src/queue.js.map +1 -1
  206. package/out/shared/src/record-proxy.js.map +1 -1
  207. package/out/shared/src/resolved-promises.d.ts +0 -4
  208. package/out/shared/src/resolved-promises.d.ts.map +1 -1
  209. package/out/shared/src/resolved-promises.js +0 -1
  210. package/out/shared/src/resolved-promises.js.map +1 -1
  211. package/out/shared/src/resolver.d.ts +9 -0
  212. package/out/shared/src/resolver.d.ts.map +1 -0
  213. package/out/shared/src/resolver.js +6 -0
  214. package/out/shared/src/resolver.js.map +1 -0
  215. package/out/shared/src/ring-buffer.js.map +1 -1
  216. package/out/shared/src/size-of-value.js +7 -10
  217. package/out/shared/src/size-of-value.js.map +1 -1
  218. package/out/shared/src/sleep.js +1 -1
  219. package/out/shared/src/sleep.js.map +1 -1
  220. package/out/shared/src/sorted-entries.js.map +1 -1
  221. package/out/shared/src/tdigest-schema.js.map +1 -1
  222. package/out/shared/src/tdigest.d.ts +0 -1
  223. package/out/shared/src/tdigest.d.ts.map +1 -1
  224. package/out/shared/src/tdigest.js.map +1 -1
  225. package/out/shared/src/valita.js +1 -1
  226. package/out/shared/src/valita.js.map +1 -1
  227. package/out/z2s/src/compiler.d.ts +1 -1
  228. package/out/z2s/src/compiler.d.ts.map +1 -1
  229. package/out/z2s/src/compiler.js +344 -9
  230. package/out/z2s/src/compiler.js.map +1 -1
  231. package/out/z2s/src/sql.d.ts +9 -5
  232. package/out/z2s/src/sql.d.ts.map +1 -1
  233. package/out/z2s/src/sql.js +58 -11
  234. package/out/z2s/src/sql.js.map +1 -1
  235. package/out/zero/package.js +210 -189
  236. package/out/zero/package.js.map +1 -1
  237. package/out/zero/src/adapters/drizzle.js +1 -2
  238. package/out/zero/src/adapters/kysely.js +1 -2
  239. package/out/zero/src/adapters/pg.js +1 -2
  240. package/out/zero/src/adapters/postgresjs.js +1 -2
  241. package/out/zero/src/adapters/prisma.js +1 -2
  242. package/out/zero/src/analyze.js +1 -2
  243. package/out/zero/src/bindings.js +4 -4
  244. package/out/zero/src/change-protocol/v0.js +1 -2
  245. package/out/zero/src/expo-sqlite.js +1 -2
  246. package/out/zero/src/op-sqlite.js +1 -2
  247. package/out/zero/src/react-native.js.map +1 -1
  248. package/out/zero/src/sqlite.js +1 -2
  249. package/out/zero/src/zero-cache-dev.js +11 -10
  250. package/out/zero/src/zero-cache-dev.js.map +1 -1
  251. package/out/zero/src/zero-out.js +2 -1
  252. package/out/zero/src/zero-out.js.map +1 -1
  253. package/out/zero-cache/src/auth/auth.js +1 -1
  254. package/out/zero-cache/src/auth/auth.js.map +1 -1
  255. package/out/zero-cache/src/auth/jwt.js +4 -1
  256. package/out/zero-cache/src/auth/jwt.js.map +1 -1
  257. package/out/zero-cache/src/auth/load-permissions.js +1 -1
  258. package/out/zero-cache/src/auth/load-permissions.js.map +1 -1
  259. package/out/zero-cache/src/auth/read-authorizer.js +3 -2
  260. package/out/zero-cache/src/auth/read-authorizer.js.map +1 -1
  261. package/out/zero-cache/src/auth/write-authorizer.js +16 -20
  262. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  263. package/out/zero-cache/src/config/network.js +1 -1
  264. package/out/zero-cache/src/config/network.js.map +1 -1
  265. package/out/zero-cache/src/config/server-context.js.map +1 -1
  266. package/out/zero-cache/src/config/zero-config.d.ts +23 -11
  267. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  268. package/out/zero-cache/src/config/zero-config.js +51 -4
  269. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  270. package/out/zero-cache/src/custom/fetch.js +1 -1
  271. package/out/zero-cache/src/custom/fetch.js.map +1 -1
  272. package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -1
  273. package/out/zero-cache/src/db/create.js +1 -1
  274. package/out/zero-cache/src/db/create.js.map +1 -1
  275. package/out/zero-cache/src/db/index-predicate.js.map +1 -1
  276. package/out/zero-cache/src/db/lite-tables.d.ts +2 -2
  277. package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
  278. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  279. package/out/zero-cache/src/db/migration-lite.js +1 -1
  280. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  281. package/out/zero-cache/src/db/migration.js +5 -3
  282. package/out/zero-cache/src/db/migration.js.map +1 -1
  283. package/out/zero-cache/src/db/pg-copy-binary.js +4 -3
  284. package/out/zero-cache/src/db/pg-copy-binary.js.map +1 -1
  285. package/out/zero-cache/src/db/pg-copy.js +0 -1
  286. package/out/zero-cache/src/db/pg-copy.js.map +1 -1
  287. package/out/zero-cache/src/db/pg-to-lite.js +1 -1
  288. package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
  289. package/out/zero-cache/src/db/pg-type-parser.js.map +1 -1
  290. package/out/zero-cache/src/db/run-transaction.js.map +1 -1
  291. package/out/zero-cache/src/db/specs.d.ts +3 -4
  292. package/out/zero-cache/src/db/specs.d.ts.map +1 -1
  293. package/out/zero-cache/src/db/specs.js +1 -1
  294. package/out/zero-cache/src/db/specs.js.map +1 -1
  295. package/out/zero-cache/src/db/sqlite-corruption.js.map +1 -1
  296. package/out/zero-cache/src/db/statements.d.ts.map +1 -1
  297. package/out/zero-cache/src/db/statements.js +9 -2
  298. package/out/zero-cache/src/db/statements.js.map +1 -1
  299. package/out/zero-cache/src/db/transaction-pool.js +6 -4
  300. package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
  301. package/out/zero-cache/src/db/warmup.js.map +1 -1
  302. package/out/zero-cache/src/observability/events.js +1 -1
  303. package/out/zero-cache/src/observability/events.js.map +1 -1
  304. package/out/zero-cache/src/observability/log-throttle.js.map +1 -1
  305. package/out/zero-cache/src/observability/metrics.js.map +1 -1
  306. package/out/zero-cache/src/scripts/deploy-permissions.js +5 -3
  307. package/out/zero-cache/src/scripts/deploy-permissions.js.map +1 -1
  308. package/out/zero-cache/src/scripts/permissions.js.map +1 -1
  309. package/out/zero-cache/src/server/anonymous-otel-start.js +2 -1
  310. package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
  311. package/out/zero-cache/src/server/change-streamer.js +35 -11
  312. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  313. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
  314. package/out/zero-cache/src/server/logging.js +1 -1
  315. package/out/zero-cache/src/server/logging.js.map +1 -1
  316. package/out/zero-cache/src/server/main.js +2 -2
  317. package/out/zero-cache/src/server/main.js.map +1 -1
  318. package/out/zero-cache/src/server/otel-log-sink.js.map +1 -1
  319. package/out/zero-cache/src/server/otel-start.js.map +1 -1
  320. package/out/zero-cache/src/server/reaper.js +2 -2
  321. package/out/zero-cache/src/server/reaper.js.map +1 -1
  322. package/out/zero-cache/src/server/replicator.js +1 -1
  323. package/out/zero-cache/src/server/replicator.js.map +1 -1
  324. package/out/zero-cache/src/server/runner/run-worker.d.ts.map +1 -1
  325. package/out/zero-cache/src/server/runner/run-worker.js +12 -8
  326. package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
  327. package/out/zero-cache/src/server/runner/runtime.js +2 -1
  328. package/out/zero-cache/src/server/runner/runtime.js.map +1 -1
  329. package/out/zero-cache/src/server/runner/zero-dispatcher.d.ts +9 -1
  330. package/out/zero-cache/src/server/runner/zero-dispatcher.d.ts.map +1 -1
  331. package/out/zero-cache/src/server/runner/zero-dispatcher.js +29 -2
  332. package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
  333. package/out/zero-cache/src/server/shadow-syncer.js +1 -1
  334. package/out/zero-cache/src/server/shadow-syncer.js.map +1 -1
  335. package/out/zero-cache/src/server/slot-keeper.js.map +1 -1
  336. package/out/zero-cache/src/server/syncer-assigner.js.map +1 -1
  337. package/out/zero-cache/src/server/syncer.js +10 -5
  338. package/out/zero-cache/src/server/syncer.js.map +1 -1
  339. package/out/zero-cache/src/server/worker-dispatcher.js +1 -1
  340. package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -1
  341. package/out/zero-cache/src/server/worker-urls.js.map +1 -1
  342. package/out/zero-cache/src/services/analyze.js +2 -2
  343. package/out/zero-cache/src/services/analyze.js.map +1 -1
  344. package/out/zero-cache/src/services/change-source/common/backfill-manager.js +3 -3
  345. package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
  346. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js +1 -1
  347. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -1
  348. package/out/zero-cache/src/services/change-source/common/init-cleanup.js.map +1 -1
  349. package/out/zero-cache/src/services/change-source/common/replica-restore.js.map +1 -1
  350. package/out/zero-cache/src/services/change-source/common/replica-schema.js +4 -4
  351. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  352. package/out/zero-cache/src/services/change-source/custom/change-source.js +3 -3
  353. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  354. package/out/zero-cache/src/services/change-source/pg/backfill-metadata.js.map +1 -1
  355. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +3 -3
  356. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
  357. package/out/zero-cache/src/services/change-source/pg/change-source-init.js +52 -27
  358. package/out/zero-cache/src/services/change-source/pg/change-source-init.js.map +1 -1
  359. package/out/zero-cache/src/services/change-source/pg/change-source.js +70 -15
  360. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  361. package/out/zero-cache/src/services/change-source/pg/decommission.js +2 -1
  362. package/out/zero-cache/src/services/change-source/pg/decommission.js.map +1 -1
  363. package/out/zero-cache/src/services/change-source/pg/fork-request.js +54 -0
  364. package/out/zero-cache/src/services/change-source/pg/fork-request.js.map +1 -0
  365. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +9 -7
  366. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  367. package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js.map +1 -1
  368. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js.map +1 -1
  369. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +4 -3
  370. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  371. package/out/zero-cache/src/services/change-source/pg/lsn.d.ts +0 -2
  372. package/out/zero-cache/src/services/change-source/pg/lsn.d.ts.map +1 -1
  373. package/out/zero-cache/src/services/change-source/pg/lsn.js.map +1 -1
  374. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js +2 -2
  375. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js.map +1 -1
  376. package/out/zero-cache/src/services/change-source/pg/replication-slot-health.js +1 -1
  377. package/out/zero-cache/src/services/change-source/pg/replication-slot-health.js.map +1 -1
  378. package/out/zero-cache/src/services/change-source/pg/replication-slots.js +9 -3
  379. package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
  380. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +0 -12
  381. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
  382. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +5 -3
  383. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
  384. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts +1 -1
  385. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts.map +1 -1
  386. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js +13 -12
  387. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js.map +1 -1
  388. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  389. package/out/zero-cache/src/services/change-source/pg/schema/published.js +2 -2
  390. package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
  391. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js.map +1 -1
  392. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +9 -6
  393. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  394. package/out/zero-cache/src/services/change-source/pg/schema/validation.d.ts +0 -1
  395. package/out/zero-cache/src/services/change-source/pg/schema/validation.d.ts.map +1 -1
  396. package/out/zero-cache/src/services/change-source/pg/schema/validation.js +1 -1
  397. package/out/zero-cache/src/services/change-source/pg/schema/validation.js.map +1 -1
  398. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js +1 -1
  399. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js.map +1 -1
  400. package/out/zero-cache/src/services/change-source/protocol/current/control.js.map +1 -1
  401. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  402. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +1 -0
  403. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
  404. package/out/zero-cache/src/services/change-source/protocol/current/downstream.js.map +1 -1
  405. package/out/zero-cache/src/services/change-source/protocol/current/status.d.ts +3 -0
  406. package/out/zero-cache/src/services/change-source/protocol/current/status.d.ts.map +1 -1
  407. package/out/zero-cache/src/services/change-source/protocol/current/status.js +2 -1
  408. package/out/zero-cache/src/services/change-source/protocol/current/status.js.map +1 -1
  409. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts +1 -0
  410. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts.map +1 -1
  411. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -1
  412. package/out/zero-cache/src/services/change-source/protocol/current.js +1 -1
  413. package/out/zero-cache/src/services/change-source/protocol/mod.js +1 -2
  414. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js.map +1 -1
  415. package/out/zero-cache/src/services/change-streamer/backfill-state.js +1 -1
  416. package/out/zero-cache/src/services/change-streamer/backfill-state.js.map +1 -1
  417. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js +6 -6
  418. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js.map +1 -1
  419. package/out/zero-cache/src/services/change-streamer/backup-monitor.js +56 -21
  420. package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
  421. package/out/zero-cache/src/services/change-streamer/broadcast.js +2 -2
  422. package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
  423. package/out/zero-cache/src/services/change-streamer/change-log-codec.js +2 -3
  424. package/out/zero-cache/src/services/change-streamer/change-log-codec.js.map +1 -1
  425. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js +3 -3
  426. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js.map +1 -1
  427. package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.js.map +1 -1
  428. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +4 -2
  429. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  430. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +49 -30
  431. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  432. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  433. package/out/zero-cache/src/services/change-streamer/drain-tracker.js +1 -1
  434. package/out/zero-cache/src/services/change-streamer/drain-tracker.js.map +1 -1
  435. package/out/zero-cache/src/services/change-streamer/forwarder.js +11 -10
  436. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
  437. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js +81 -12
  438. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js.map +1 -1
  439. package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.js +4 -4
  440. package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.js.map +1 -1
  441. package/out/zero-cache/src/services/change-streamer/replica-poller.js +2 -2
  442. package/out/zero-cache/src/services/change-streamer/replica-poller.js.map +1 -1
  443. package/out/zero-cache/src/services/change-streamer/restore-admission.js +12 -1
  444. package/out/zero-cache/src/services/change-streamer/restore-admission.js.map +1 -1
  445. package/out/zero-cache/src/services/change-streamer/schema/init.js +1 -1
  446. package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
  447. package/out/zero-cache/src/services/change-streamer/schema/tables.js +1 -1
  448. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  449. package/out/zero-cache/src/services/change-streamer/server-start-metrics.js +42 -0
  450. package/out/zero-cache/src/services/change-streamer/server-start-metrics.js.map +1 -0
  451. package/out/zero-cache/src/services/change-streamer/snapshot-message.js +1 -2
  452. package/out/zero-cache/src/services/change-streamer/snapshot-message.js.map +1 -1
  453. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js.map +1 -1
  454. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js +2 -2
  455. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js.map +1 -1
  456. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.js +2 -2
  457. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.js.map +1 -1
  458. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.js.map +1 -1
  459. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-read-router.js.map +1 -1
  460. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js +4 -6
  461. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js.map +1 -1
  462. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js +3 -5
  463. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js.map +1 -1
  464. package/out/zero-cache/src/services/change-streamer/storer.js +4 -4
  465. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  466. package/out/zero-cache/src/services/change-streamer/subscribe.js.map +1 -1
  467. package/out/zero-cache/src/services/change-streamer/subscriber.js +8 -7
  468. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  469. package/out/zero-cache/src/services/change-streamer/upstream-acker.js +0 -1
  470. package/out/zero-cache/src/services/change-streamer/upstream-acker.js.map +1 -1
  471. package/out/zero-cache/src/services/heapz.js +2 -1
  472. package/out/zero-cache/src/services/heapz.js.map +1 -1
  473. package/out/zero-cache/src/services/http-service.d.ts +8 -2
  474. package/out/zero-cache/src/services/http-service.d.ts.map +1 -1
  475. package/out/zero-cache/src/services/http-service.js +19 -5
  476. package/out/zero-cache/src/services/http-service.js.map +1 -1
  477. package/out/zero-cache/src/services/life-cycle.d.ts +19 -0
  478. package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
  479. package/out/zero-cache/src/services/life-cycle.js +55 -3
  480. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  481. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js +4 -2
  482. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js.map +1 -1
  483. package/out/zero-cache/src/services/litestream/commands.js +4 -4
  484. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  485. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js +2 -2
  486. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js.map +1 -1
  487. package/out/zero-cache/src/services/litestream/litestream-controller.js.map +1 -1
  488. package/out/zero-cache/src/services/litestream/metrics.js.map +1 -1
  489. package/out/zero-cache/src/services/litestream/restore-progress.js.map +1 -1
  490. package/out/zero-cache/src/services/mutagen/mutagen.js +3 -4
  491. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  492. package/out/zero-cache/src/services/mutagen/pusher.js +61 -17
  493. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  494. package/out/zero-cache/src/services/plannerz.d.ts +4 -12
  495. package/out/zero-cache/src/services/plannerz.d.ts.map +1 -1
  496. package/out/zero-cache/src/services/plannerz.js +6 -7
  497. package/out/zero-cache/src/services/plannerz.js.map +1 -1
  498. package/out/zero-cache/src/services/profz.js +5 -3
  499. package/out/zero-cache/src/services/profz.js.map +1 -1
  500. package/out/zero-cache/src/services/replicator/change-log-cookies.js.map +1 -1
  501. package/out/zero-cache/src/services/replicator/change-log-db.js +4 -3
  502. package/out/zero-cache/src/services/replicator/change-log-db.js.map +1 -1
  503. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js.map +1 -1
  504. package/out/zero-cache/src/services/replicator/change-processor.js +1 -1
  505. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  506. package/out/zero-cache/src/services/replicator/drain-handler.js +1 -1
  507. package/out/zero-cache/src/services/replicator/drain-handler.js.map +1 -1
  508. package/out/zero-cache/src/services/replicator/incremental-sync.js +4 -4
  509. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  510. package/out/zero-cache/src/services/replicator/notifier.js.map +1 -1
  511. package/out/zero-cache/src/services/replicator/replication-status.js +4 -3
  512. package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
  513. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  514. package/out/zero-cache/src/services/replicator/reporter/recorder.js +2 -2
  515. package/out/zero-cache/src/services/replicator/reporter/recorder.js.map +1 -1
  516. package/out/zero-cache/src/services/replicator/reporter/report-schema.d.ts +2 -11
  517. package/out/zero-cache/src/services/replicator/reporter/report-schema.d.ts.map +1 -1
  518. package/out/zero-cache/src/services/replicator/reporter/report-schema.js.map +1 -1
  519. package/out/zero-cache/src/services/replicator/schema/backfilling.js +2 -2
  520. package/out/zero-cache/src/services/replicator/schema/backfilling.js.map +1 -1
  521. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts +19 -17
  522. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts.map +1 -1
  523. package/out/zero-cache/src/services/replicator/schema/change-log.js +31 -15
  524. package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -1
  525. package/out/zero-cache/src/services/replicator/schema/column-metadata.d.ts +0 -7
  526. package/out/zero-cache/src/services/replicator/schema/column-metadata.d.ts.map +1 -1
  527. package/out/zero-cache/src/services/replicator/schema/column-metadata.js +1 -1
  528. package/out/zero-cache/src/services/replicator/schema/column-metadata.js.map +1 -1
  529. package/out/zero-cache/src/services/replicator/schema/replication-state.js +10 -7
  530. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
  531. package/out/zero-cache/src/services/replicator/schema/table-metadata.js.map +1 -1
  532. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js +1 -1
  533. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js.map +1 -1
  534. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.js +1 -1
  535. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.js.map +1 -1
  536. package/out/zero-cache/src/services/replicator/write-worker-client.js +2 -2
  537. package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
  538. package/out/zero-cache/src/services/replicator/write-worker.js +3 -3
  539. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
  540. package/out/zero-cache/src/services/run-ast.js +1 -1
  541. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  542. package/out/zero-cache/src/services/runner.js.map +1 -1
  543. package/out/zero-cache/src/services/running-state.js +1 -1
  544. package/out/zero-cache/src/services/running-state.js.map +1 -1
  545. package/out/zero-cache/src/services/shadow-sync/shadow-sync-service.js.map +1 -1
  546. package/out/zero-cache/src/services/statz.js +4 -3
  547. package/out/zero-cache/src/services/statz.js.map +1 -1
  548. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js +2 -2
  549. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js.map +1 -1
  550. package/out/zero-cache/src/services/view-syncer/advancement-metrics.js.map +1 -1
  551. package/out/zero-cache/src/services/view-syncer/batch-pacer.js.map +1 -1
  552. package/out/zero-cache/src/services/view-syncer/client-handler.js +71 -24
  553. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  554. package/out/zero-cache/src/services/view-syncer/client-schema.js +46 -6
  555. package/out/zero-cache/src/services/view-syncer/client-schema.js.map +1 -1
  556. package/out/zero-cache/src/services/view-syncer/connection-context-manager.js.map +1 -1
  557. package/out/zero-cache/src/services/view-syncer/cvr-purger.js +2 -2
  558. package/out/zero-cache/src/services/view-syncer/cvr-purger.js.map +1 -1
  559. package/out/zero-cache/src/services/view-syncer/cvr-store.js +12 -7
  560. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  561. package/out/zero-cache/src/services/view-syncer/cvr.js +12 -4
  562. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  563. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js +1 -1
  564. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js.map +1 -1
  565. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +2 -2
  566. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
  567. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.js.map +1 -1
  568. package/out/zero-cache/src/services/view-syncer/hydration-budget.js.map +1 -1
  569. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js +2 -2
  570. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js.map +1 -1
  571. package/out/zero-cache/src/services/view-syncer/inspect-handler.js +6 -4
  572. package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
  573. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +112 -21
  574. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  575. package/out/zero-cache/src/services/view-syncer/plan-warnings.js.map +1 -1
  576. package/out/zero-cache/src/services/view-syncer/push-cost.js.map +1 -1
  577. package/out/zero-cache/src/services/view-syncer/push-cutoff.js.map +1 -1
  578. package/out/zero-cache/src/services/view-syncer/query-covering.js +2 -2
  579. package/out/zero-cache/src/services/view-syncer/query-covering.js.map +1 -1
  580. package/out/zero-cache/src/services/view-syncer/query-shape.js.map +1 -1
  581. package/out/zero-cache/src/services/view-syncer/query-stats.js +1 -1
  582. package/out/zero-cache/src/services/view-syncer/query-stats.js.map +1 -1
  583. package/out/zero-cache/src/services/view-syncer/row-record-cache.js +2 -2
  584. package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
  585. package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
  586. package/out/zero-cache/src/services/view-syncer/schema/types.js +2 -16
  587. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  588. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js +7 -1
  589. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js.map +1 -1
  590. package/out/zero-cache/src/services/view-syncer/snapshotter.js +13 -9
  591. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  592. package/out/zero-cache/src/services/view-syncer/ttl-clock.js.map +1 -1
  593. package/out/zero-cache/src/services/view-syncer/view-syncer.js +52 -28
  594. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  595. package/out/zero-cache/src/types/error-with-level.js.map +1 -1
  596. package/out/zero-cache/src/types/lexi-version.js.map +1 -1
  597. package/out/zero-cache/src/types/lite.d.ts +0 -1
  598. package/out/zero-cache/src/types/lite.d.ts.map +1 -1
  599. package/out/zero-cache/src/types/lite.js +1 -1
  600. package/out/zero-cache/src/types/lite.js.map +1 -1
  601. package/out/zero-cache/src/types/pg-data-type.js +1 -1
  602. package/out/zero-cache/src/types/pg-data-type.js.map +1 -1
  603. package/out/zero-cache/src/types/pg-types.d.ts +0 -40
  604. package/out/zero-cache/src/types/pg-types.d.ts.map +1 -1
  605. package/out/zero-cache/src/types/pg-types.js.map +1 -1
  606. package/out/zero-cache/src/types/pg.js +6 -4
  607. package/out/zero-cache/src/types/pg.js.map +1 -1
  608. package/out/zero-cache/src/types/poke-chunk.d.ts +0 -1
  609. package/out/zero-cache/src/types/poke-chunk.d.ts.map +1 -1
  610. package/out/zero-cache/src/types/poke-chunk.js +1 -1
  611. package/out/zero-cache/src/types/poke-chunk.js.map +1 -1
  612. package/out/zero-cache/src/types/processes.js +5 -5
  613. package/out/zero-cache/src/types/processes.js.map +1 -1
  614. package/out/zero-cache/src/types/profiler.js +1 -1
  615. package/out/zero-cache/src/types/profiler.js.map +1 -1
  616. package/out/zero-cache/src/types/row-key.d.ts +0 -5
  617. package/out/zero-cache/src/types/row-key.d.ts.map +1 -1
  618. package/out/zero-cache/src/types/row-key.js +8 -1
  619. package/out/zero-cache/src/types/row-key.js.map +1 -1
  620. package/out/zero-cache/src/types/sql.js.map +1 -1
  621. package/out/zero-cache/src/types/streams.d.ts.map +1 -1
  622. package/out/zero-cache/src/types/streams.js +11 -10
  623. package/out/zero-cache/src/types/streams.js.map +1 -1
  624. package/out/zero-cache/src/types/strings.js.map +1 -1
  625. package/out/zero-cache/src/types/subscription.js +1 -1
  626. package/out/zero-cache/src/types/subscription.js.map +1 -1
  627. package/out/zero-cache/src/types/timeout.js +1 -1
  628. package/out/zero-cache/src/types/websocket-handoff.d.ts +4 -7
  629. package/out/zero-cache/src/types/websocket-handoff.d.ts.map +1 -1
  630. package/out/zero-cache/src/types/websocket-handoff.js +16 -2
  631. package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
  632. package/out/zero-cache/src/types/ws.d.ts +2 -1
  633. package/out/zero-cache/src/types/ws.d.ts.map +1 -1
  634. package/out/zero-cache/src/types/ws.js.map +1 -1
  635. package/out/zero-cache/src/workers/connection.d.ts +1 -2
  636. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  637. package/out/zero-cache/src/workers/connection.js +10 -8
  638. package/out/zero-cache/src/workers/connection.js.map +1 -1
  639. package/out/zero-cache/src/workers/mutator.js +1 -1
  640. package/out/zero-cache/src/workers/mutator.js.map +1 -1
  641. package/out/zero-cache/src/workers/rehome.d.ts +15 -0
  642. package/out/zero-cache/src/workers/rehome.d.ts.map +1 -0
  643. package/out/zero-cache/src/workers/rehome.js +36 -0
  644. package/out/zero-cache/src/workers/rehome.js.map +1 -0
  645. package/out/zero-cache/src/workers/replicator.js +5 -4
  646. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  647. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +9 -1
  648. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  649. package/out/zero-cache/src/workers/syncer.js +32 -7
  650. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  651. package/out/zero-client/src/client/active-clients-manager.d.ts.map +1 -1
  652. package/out/zero-client/src/client/active-clients-manager.js +2 -2
  653. package/out/zero-client/src/client/active-clients-manager.js.map +1 -1
  654. package/out/zero-client/src/client/bindings.d.ts +1 -1
  655. package/out/zero-client/src/client/bindings.d.ts.map +1 -1
  656. package/out/zero-client/src/client/bindings.js +11 -11
  657. package/out/zero-client/src/client/connection-manager.js +1 -1
  658. package/out/zero-client/src/client/connection-manager.js.map +1 -1
  659. package/out/zero-client/src/client/connection.js +1 -1
  660. package/out/zero-client/src/client/connection.js.map +1 -1
  661. package/out/zero-client/src/client/context.d.ts +7 -1
  662. package/out/zero-client/src/client/context.d.ts.map +1 -1
  663. package/out/zero-client/src/client/context.js +7 -0
  664. package/out/zero-client/src/client/context.js.map +1 -1
  665. package/out/zero-client/src/client/crud-impl.d.ts.map +1 -1
  666. package/out/zero-client/src/client/crud-impl.js +172 -3
  667. package/out/zero-client/src/client/crud-impl.js.map +1 -1
  668. package/out/zero-client/src/client/crud.d.ts +2 -8
  669. package/out/zero-client/src/client/crud.d.ts.map +1 -1
  670. package/out/zero-client/src/client/crud.js.map +1 -1
  671. package/out/zero-client/src/client/custom.d.ts +0 -2
  672. package/out/zero-client/src/client/custom.d.ts.map +1 -1
  673. package/out/zero-client/src/client/custom.js +42 -3
  674. package/out/zero-client/src/client/custom.js.map +1 -1
  675. package/out/zero-client/src/client/delete-clients-manager.js.map +1 -1
  676. package/out/zero-client/src/client/enable-analytics.d.ts +0 -1
  677. package/out/zero-client/src/client/enable-analytics.d.ts.map +1 -1
  678. package/out/zero-client/src/client/enable-analytics.js +1 -0
  679. package/out/zero-client/src/client/enable-analytics.js.map +1 -1
  680. package/out/zero-client/src/client/error.d.ts +4 -5
  681. package/out/zero-client/src/client/error.d.ts.map +1 -1
  682. package/out/zero-client/src/client/error.js.map +1 -1
  683. package/out/zero-client/src/client/inspector/client-group.js.map +1 -1
  684. package/out/zero-client/src/client/inspector/client.js.map +1 -1
  685. package/out/zero-client/src/client/inspector/html-dialog-prompt.js +1 -1
  686. package/out/zero-client/src/client/inspector/html-dialog-prompt.js.map +1 -1
  687. package/out/zero-client/src/client/inspector/inspector.js.map +1 -1
  688. package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -1
  689. package/out/zero-client/src/client/inspector/query.js.map +1 -1
  690. package/out/zero-client/src/client/ivm-branch.d.ts +62 -2
  691. package/out/zero-client/src/client/ivm-branch.d.ts.map +1 -1
  692. package/out/zero-client/src/client/ivm-branch.js +153 -34
  693. package/out/zero-client/src/client/ivm-branch.js.map +1 -1
  694. package/out/zero-client/src/client/keys.d.ts +33 -1
  695. package/out/zero-client/src/client/keys.d.ts.map +1 -1
  696. package/out/zero-client/src/client/keys.js +49 -7
  697. package/out/zero-client/src/client/keys.js.map +1 -1
  698. package/out/zero-client/src/client/log-options.js.map +1 -1
  699. package/out/zero-client/src/client/make-replicache-mutators.js +5 -3
  700. package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
  701. package/out/zero-client/src/client/metrics.js +3 -5
  702. package/out/zero-client/src/client/metrics.js.map +1 -1
  703. package/out/zero-client/src/client/mutation-tracker.d.ts.map +1 -1
  704. package/out/zero-client/src/client/mutation-tracker.js +1 -1
  705. package/out/zero-client/src/client/mutation-tracker.js.map +1 -1
  706. package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
  707. package/out/zero-client/src/client/options.d.ts +0 -4
  708. package/out/zero-client/src/client/options.d.ts.map +1 -1
  709. package/out/zero-client/src/client/options.js.map +1 -1
  710. package/out/zero-client/src/client/query-manager.js +2 -2
  711. package/out/zero-client/src/client/query-manager.js.map +1 -1
  712. package/out/zero-client/src/client/reload-error-handler.js +4 -3
  713. package/out/zero-client/src/client/reload-error-handler.js.map +1 -1
  714. package/out/zero-client/src/client/replicache-types.d.ts +3 -2
  715. package/out/zero-client/src/client/replicache-types.d.ts.map +1 -1
  716. package/out/zero-client/src/client/version.js +1 -1
  717. package/out/zero-client/src/client/zero-poke-handler.d.ts +1 -2
  718. package/out/zero-client/src/client/zero-poke-handler.d.ts.map +1 -1
  719. package/out/zero-client/src/client/zero-poke-handler.js +30 -2
  720. package/out/zero-client/src/client/zero-poke-handler.js.map +1 -1
  721. package/out/zero-client/src/client/zero-rep.d.ts +1 -1
  722. package/out/zero-client/src/client/zero-rep.d.ts.map +1 -1
  723. package/out/zero-client/src/client/zero-rep.js +2 -15
  724. package/out/zero-client/src/client/zero-rep.js.map +1 -1
  725. package/out/zero-client/src/client/zero.d.ts +1 -5
  726. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  727. package/out/zero-client/src/client/zero.js +21 -13
  728. package/out/zero-client/src/client/zero.js.map +1 -1
  729. package/out/zero-client/src/mod.d.ts +3 -3
  730. package/out/zero-client/src/mod.d.ts.map +1 -1
  731. package/out/zero-client/src/mod.js +23 -23
  732. package/out/zero-client/src/types/client-state.d.ts +0 -6
  733. package/out/zero-client/src/types/client-state.d.ts.map +1 -1
  734. package/out/zero-client/src/util/nanoid.js.map +1 -1
  735. package/out/zero-permissions/src/permissions.d.ts +1 -12
  736. package/out/zero-permissions/src/permissions.d.ts.map +1 -1
  737. package/out/zero-permissions/src/permissions.js +3 -3
  738. package/out/zero-permissions/src/permissions.js.map +1 -1
  739. package/out/zero-pg/src/mod.js +9 -9
  740. package/out/zero-protocol/src/aggregate-table.d.ts +15 -0
  741. package/out/zero-protocol/src/aggregate-table.d.ts.map +1 -0
  742. package/out/zero-protocol/src/aggregate-table.js +5 -0
  743. package/out/zero-protocol/src/aggregate-table.js.map +1 -0
  744. package/out/zero-protocol/src/analyze-query-result.js +1 -1
  745. package/out/zero-protocol/src/analyze-query-result.js.map +1 -1
  746. package/out/zero-protocol/src/application-error.js.map +1 -1
  747. package/out/zero-protocol/src/ast.d.ts +140 -8
  748. package/out/zero-protocol/src/ast.d.ts.map +1 -1
  749. package/out/zero-protocol/src/ast.js +264 -28
  750. package/out/zero-protocol/src/ast.js.map +1 -1
  751. package/out/zero-protocol/src/change-desired-queries.d.ts +0 -20
  752. package/out/zero-protocol/src/change-desired-queries.d.ts.map +1 -1
  753. package/out/zero-protocol/src/change-desired-queries.js.map +1 -1
  754. package/out/zero-protocol/src/client-schema.d.ts +2 -5
  755. package/out/zero-protocol/src/client-schema.d.ts.map +1 -1
  756. package/out/zero-protocol/src/client-schema.js.map +1 -1
  757. package/out/zero-protocol/src/close-connection.d.ts +0 -8
  758. package/out/zero-protocol/src/close-connection.d.ts.map +1 -1
  759. package/out/zero-protocol/src/close-connection.js.map +1 -1
  760. package/out/zero-protocol/src/connect.d.ts +0 -12
  761. package/out/zero-protocol/src/connect.d.ts.map +1 -1
  762. package/out/zero-protocol/src/connect.js.map +1 -1
  763. package/out/zero-protocol/src/custom-queries.d.ts +3 -17
  764. package/out/zero-protocol/src/custom-queries.d.ts.map +1 -1
  765. package/out/zero-protocol/src/custom-queries.js.map +1 -1
  766. package/out/zero-protocol/src/data.d.ts +0 -1
  767. package/out/zero-protocol/src/data.d.ts.map +1 -1
  768. package/out/zero-protocol/src/data.js +3 -1
  769. package/out/zero-protocol/src/data.js.map +1 -1
  770. package/out/zero-protocol/src/delete-clients.js.map +1 -1
  771. package/out/zero-protocol/src/down.d.ts +27 -27
  772. package/out/zero-protocol/src/down.js.map +1 -1
  773. package/out/zero-protocol/src/error.js.map +1 -1
  774. package/out/zero-protocol/src/inspect-down.d.ts +1 -3
  775. package/out/zero-protocol/src/inspect-down.d.ts.map +1 -1
  776. package/out/zero-protocol/src/inspect-down.js.map +1 -1
  777. package/out/zero-protocol/src/inspect-up.d.ts +0 -28
  778. package/out/zero-protocol/src/inspect-up.d.ts.map +1 -1
  779. package/out/zero-protocol/src/inspect-up.js.map +1 -1
  780. package/out/zero-protocol/src/mutate-server.d.ts +0 -21
  781. package/out/zero-protocol/src/mutate-server.d.ts.map +1 -1
  782. package/out/zero-protocol/src/mutate-server.js.map +1 -1
  783. package/out/zero-protocol/src/mutation-id.js.map +1 -1
  784. package/out/zero-protocol/src/mutation-type-enum.d.ts +0 -1
  785. package/out/zero-protocol/src/mutation-type-enum.d.ts.map +1 -1
  786. package/out/zero-protocol/src/mutation-type-enum.js.map +1 -1
  787. package/out/zero-protocol/src/mutation.d.ts +2 -4
  788. package/out/zero-protocol/src/mutation.d.ts.map +1 -1
  789. package/out/zero-protocol/src/mutation.js.map +1 -1
  790. package/out/zero-protocol/src/mutations-patch.d.ts +0 -33
  791. package/out/zero-protocol/src/mutations-patch.d.ts.map +1 -1
  792. package/out/zero-protocol/src/mutations-patch.js.map +1 -1
  793. package/out/zero-protocol/src/ping.d.ts +0 -2
  794. package/out/zero-protocol/src/ping.d.ts.map +1 -1
  795. package/out/zero-protocol/src/ping.js.map +1 -1
  796. package/out/zero-protocol/src/poke.d.ts +3 -2
  797. package/out/zero-protocol/src/poke.d.ts.map +1 -1
  798. package/out/zero-protocol/src/poke.js +1 -1
  799. package/out/zero-protocol/src/poke.js.map +1 -1
  800. package/out/zero-protocol/src/pong.d.ts +0 -2
  801. package/out/zero-protocol/src/pong.d.ts.map +1 -1
  802. package/out/zero-protocol/src/pong.js.map +1 -1
  803. package/out/zero-protocol/src/primary-key.js.map +1 -1
  804. package/out/zero-protocol/src/protocol-version.d.ts +1 -1
  805. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
  806. package/out/zero-protocol/src/protocol-version.js +1 -0
  807. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  808. package/out/zero-protocol/src/pull.d.ts +2 -7
  809. package/out/zero-protocol/src/pull.d.ts.map +1 -1
  810. package/out/zero-protocol/src/pull.js.map +1 -1
  811. package/out/zero-protocol/src/push.d.ts +1 -3
  812. package/out/zero-protocol/src/push.d.ts.map +1 -1
  813. package/out/zero-protocol/src/push.js.map +1 -1
  814. package/out/zero-protocol/src/queries-patch.d.ts +0 -16
  815. package/out/zero-protocol/src/queries-patch.d.ts.map +1 -1
  816. package/out/zero-protocol/src/queries-patch.js +1 -1
  817. package/out/zero-protocol/src/queries-patch.js.map +1 -1
  818. package/out/zero-protocol/src/query-hash-visitor.d.ts.map +1 -1
  819. package/out/zero-protocol/src/query-hash-visitor.js +38 -0
  820. package/out/zero-protocol/src/query-hash-visitor.js.map +1 -1
  821. package/out/zero-protocol/src/query-hash.js +2 -2
  822. package/out/zero-protocol/src/query-server.d.ts +2 -41
  823. package/out/zero-protocol/src/query-server.d.ts.map +1 -1
  824. package/out/zero-protocol/src/query-server.js.map +1 -1
  825. package/out/zero-protocol/src/row-patch.js.map +1 -1
  826. package/out/zero-protocol/src/up.d.ts +60 -60
  827. package/out/zero-protocol/src/up.js +1 -1
  828. package/out/zero-protocol/src/up.js.map +1 -1
  829. package/out/zero-protocol/src/update-auth.js.map +1 -1
  830. package/out/zero-protocol/src/version.d.ts +0 -1
  831. package/out/zero-protocol/src/version.d.ts.map +1 -1
  832. package/out/zero-protocol/src/version.js.map +1 -1
  833. package/out/zero-react/src/bindings.js +11 -11
  834. package/out/zero-react/src/mod.js +5 -5
  835. package/out/zero-react/src/use-query.d.ts +3 -1
  836. package/out/zero-react/src/use-query.d.ts.map +1 -1
  837. package/out/zero-react/src/use-query.js +6 -4
  838. package/out/zero-react/src/use-query.js.map +1 -1
  839. package/out/zero-react/src/zero-provider.d.ts +1 -1
  840. package/out/zero-react/src/zero-provider.d.ts.map +1 -1
  841. package/out/zero-react/src/zero-provider.js +2 -1
  842. package/out/zero-react/src/zero-provider.js.map +1 -1
  843. package/out/zero-react/src/zero.js +23 -23
  844. package/out/zero-schema/src/builder/relationship-builder.d.ts +0 -2
  845. package/out/zero-schema/src/builder/relationship-builder.d.ts.map +1 -1
  846. package/out/zero-schema/src/builder/relationship-builder.js.map +1 -1
  847. package/out/zero-schema/src/builder/schema-builder.d.ts.map +1 -1
  848. package/out/zero-schema/src/builder/schema-builder.js +5 -2
  849. package/out/zero-schema/src/builder/schema-builder.js.map +1 -1
  850. package/out/zero-schema/src/builder/table-builder.d.ts +1 -1
  851. package/out/zero-schema/src/builder/table-builder.d.ts.map +1 -1
  852. package/out/zero-schema/src/builder/table-builder.js +1 -1
  853. package/out/zero-schema/src/builder/table-builder.js.map +1 -1
  854. package/out/zero-schema/src/compiled-permissions.js.map +1 -1
  855. package/out/zero-schema/src/name-mapper.d.ts.map +1 -1
  856. package/out/zero-schema/src/name-mapper.js +14 -9
  857. package/out/zero-schema/src/name-mapper.js.map +1 -1
  858. package/out/zero-schema/src/schema-config.d.ts +0 -1
  859. package/out/zero-schema/src/schema-config.d.ts.map +1 -1
  860. package/out/zero-schema/src/schema-config.js +1 -1
  861. package/out/zero-schema/src/schema-config.js.map +1 -1
  862. package/out/zero-schema/src/table-schema.d.ts +3 -11
  863. package/out/zero-schema/src/table-schema.d.ts.map +1 -1
  864. package/out/zero-server/src/adapters/drizzle.js.map +1 -1
  865. package/out/zero-server/src/adapters/kysely.js.map +1 -1
  866. package/out/zero-server/src/adapters/pg.js.map +1 -1
  867. package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
  868. package/out/zero-server/src/adapters/prisma.js.map +1 -1
  869. package/out/zero-server/src/closable-db-transaction.js.map +1 -1
  870. package/out/zero-server/src/custom.js +2 -2
  871. package/out/zero-server/src/custom.js.map +1 -1
  872. package/out/zero-server/src/mod.js +8 -8
  873. package/out/zero-server/src/process-mutations.js.map +1 -1
  874. package/out/zero-server/src/push-processor.js.map +1 -1
  875. package/out/zero-server/src/queries/process-queries.d.ts +2 -4
  876. package/out/zero-server/src/queries/process-queries.d.ts.map +1 -1
  877. package/out/zero-server/src/queries/process-queries.js +2 -1
  878. package/out/zero-server/src/queries/process-queries.js.map +1 -1
  879. package/out/zero-server/src/schema.d.ts.map +1 -1
  880. package/out/zero-server/src/schema.js +20 -9
  881. package/out/zero-server/src/schema.js.map +1 -1
  882. package/out/zero-server/src/zql-database.js.map +1 -1
  883. package/out/zero-solid/src/bindings.js +11 -11
  884. package/out/zero-solid/src/mod.js +5 -5
  885. package/out/zero-solid/src/solid-view.d.ts +0 -2
  886. package/out/zero-solid/src/solid-view.d.ts.map +1 -1
  887. package/out/zero-solid/src/solid-view.js +4 -4
  888. package/out/zero-solid/src/solid-view.js.map +1 -1
  889. package/out/zero-solid/src/use-connection-state.js +2 -1
  890. package/out/zero-solid/src/use-connection-state.js.map +1 -1
  891. package/out/zero-solid/src/use-query.js.map +1 -1
  892. package/out/zero-solid/src/use-zero-online.js +2 -1
  893. package/out/zero-solid/src/use-zero-online.js.map +1 -1
  894. package/out/zero-solid/src/use-zero.js +3 -2
  895. package/out/zero-solid/src/use-zero.js.map +1 -1
  896. package/out/zero-solid/src/zero.js +23 -23
  897. package/out/zero-types/src/format.d.ts +13 -0
  898. package/out/zero-types/src/format.d.ts.map +1 -1
  899. package/out/zero-types/src/format.js.map +1 -1
  900. package/out/zero-types/src/name-mapper.d.ts +16 -1
  901. package/out/zero-types/src/name-mapper.d.ts.map +1 -1
  902. package/out/zero-types/src/name-mapper.js +12 -0
  903. package/out/zero-types/src/name-mapper.js.map +1 -1
  904. package/out/zero-types/src/schema-value.d.ts +5 -2
  905. package/out/zero-types/src/schema-value.d.ts.map +1 -1
  906. package/out/zero-types/src/schema-value.js +15 -0
  907. package/out/zero-types/src/schema-value.js.map +1 -0
  908. package/out/zero-types/src/schema.d.ts +1 -1
  909. package/out/zero-types/src/schema.d.ts.map +1 -1
  910. package/out/zero-types/src/server-schema.d.ts +18 -0
  911. package/out/zero-types/src/server-schema.d.ts.map +1 -1
  912. package/out/zql/src/builder/builder.d.ts +124 -9
  913. package/out/zql/src/builder/builder.d.ts.map +1 -1
  914. package/out/zql/src/builder/builder.js +295 -23
  915. package/out/zql/src/builder/builder.js.map +1 -1
  916. package/out/zql/src/builder/correlated-predicate-pushdown.js.map +1 -1
  917. package/out/zql/src/builder/debug-delegate.js.map +1 -1
  918. package/out/zql/src/builder/filter.d.ts +1 -2
  919. package/out/zql/src/builder/filter.d.ts.map +1 -1
  920. package/out/zql/src/builder/filter.js +41 -3
  921. package/out/zql/src/builder/filter.js.map +1 -1
  922. package/out/zql/src/builder/like.js +0 -1
  923. package/out/zql/src/builder/like.js.map +1 -1
  924. package/out/zql/src/error.d.ts +0 -5
  925. package/out/zql/src/error.d.ts.map +1 -1
  926. package/out/zql/src/error.js.map +1 -1
  927. package/out/zql/src/ivm/aggregate.d.ts +188 -0
  928. package/out/zql/src/ivm/aggregate.d.ts.map +1 -0
  929. package/out/zql/src/ivm/aggregate.js +470 -0
  930. package/out/zql/src/ivm/aggregate.js.map +1 -0
  931. package/out/zql/src/ivm/array-view.d.ts +1 -1
  932. package/out/zql/src/ivm/array-view.d.ts.map +1 -1
  933. package/out/zql/src/ivm/array-view.js +3 -3
  934. package/out/zql/src/ivm/array-view.js.map +1 -1
  935. package/out/zql/src/ivm/cap.d.ts +1 -1
  936. package/out/zql/src/ivm/cap.d.ts.map +1 -1
  937. package/out/zql/src/ivm/cap.js +14 -6
  938. package/out/zql/src/ivm/cap.js.map +1 -1
  939. package/out/zql/src/ivm/constraint.d.ts +0 -7
  940. package/out/zql/src/ivm/constraint.d.ts.map +1 -1
  941. package/out/zql/src/ivm/constraint.js +3 -2
  942. package/out/zql/src/ivm/constraint.js.map +1 -1
  943. package/out/zql/src/ivm/data.d.ts +15 -2
  944. package/out/zql/src/ivm/data.d.ts.map +1 -1
  945. package/out/zql/src/ivm/data.js +15 -1
  946. package/out/zql/src/ivm/data.js.map +1 -1
  947. package/out/zql/src/ivm/deferred-input.js +1 -1
  948. package/out/zql/src/ivm/deferred-input.js.map +1 -1
  949. package/out/zql/src/ivm/exists.d.ts.map +1 -1
  950. package/out/zql/src/ivm/exists.js +32 -22
  951. package/out/zql/src/ivm/exists.js.map +1 -1
  952. package/out/zql/src/ivm/fan-in.js +1 -1
  953. package/out/zql/src/ivm/fan-in.js.map +1 -1
  954. package/out/zql/src/ivm/fan-out.js.map +1 -1
  955. package/out/zql/src/ivm/filter-operators.d.ts +5 -0
  956. package/out/zql/src/ivm/filter-operators.d.ts.map +1 -1
  957. package/out/zql/src/ivm/filter-operators.js +1 -1
  958. package/out/zql/src/ivm/filter-operators.js.map +1 -1
  959. package/out/zql/src/ivm/filter-push.js.map +1 -1
  960. package/out/zql/src/ivm/filter.js.map +1 -1
  961. package/out/zql/src/ivm/flipped-join.d.ts.map +1 -1
  962. package/out/zql/src/ivm/flipped-join.js +4 -5
  963. package/out/zql/src/ivm/flipped-join.js.map +1 -1
  964. package/out/zql/src/ivm/group-by.d.ts +98 -0
  965. package/out/zql/src/ivm/group-by.d.ts.map +1 -0
  966. package/out/zql/src/ivm/group-by.js +384 -0
  967. package/out/zql/src/ivm/group-by.js.map +1 -0
  968. package/out/zql/src/ivm/join-index-tap.js.map +1 -1
  969. package/out/zql/src/ivm/join-index.d.ts.map +1 -1
  970. package/out/zql/src/ivm/join-index.js +2 -1
  971. package/out/zql/src/ivm/join-index.js.map +1 -1
  972. package/out/zql/src/ivm/join-utils.d.ts.map +1 -1
  973. package/out/zql/src/ivm/join-utils.js +13 -14
  974. package/out/zql/src/ivm/join-utils.js.map +1 -1
  975. package/out/zql/src/ivm/join.d.ts.map +1 -1
  976. package/out/zql/src/ivm/join.js +7 -4
  977. package/out/zql/src/ivm/join.js.map +1 -1
  978. package/out/zql/src/ivm/lift-field.d.ts +54 -0
  979. package/out/zql/src/ivm/lift-field.d.ts.map +1 -0
  980. package/out/zql/src/ivm/lift-field.js +168 -0
  981. package/out/zql/src/ivm/lift-field.js.map +1 -0
  982. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +1 -1
  983. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
  984. package/out/zql/src/ivm/memory-source.d.ts +3 -2
  985. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  986. package/out/zql/src/ivm/memory-source.js +36 -27
  987. package/out/zql/src/ivm/memory-source.js.map +1 -1
  988. package/out/zql/src/ivm/memory-storage.js.map +1 -1
  989. package/out/zql/src/ivm/operator.d.ts +6 -0
  990. package/out/zql/src/ivm/operator.d.ts.map +1 -1
  991. package/out/zql/src/ivm/operator.js +2 -2
  992. package/out/zql/src/ivm/operator.js.map +1 -1
  993. package/out/zql/src/ivm/push-accumulated.js +1 -2
  994. package/out/zql/src/ivm/push-accumulated.js.map +1 -1
  995. package/out/zql/src/ivm/schema.d.ts +1 -0
  996. package/out/zql/src/ivm/schema.d.ts.map +1 -1
  997. package/out/zql/src/ivm/skip-yields.js.map +1 -1
  998. package/out/zql/src/ivm/skip.js.map +1 -1
  999. package/out/zql/src/ivm/source.d.ts +21 -0
  1000. package/out/zql/src/ivm/source.d.ts.map +1 -1
  1001. package/out/zql/src/ivm/source.js.map +1 -1
  1002. package/out/zql/src/ivm/stream.d.ts +0 -1
  1003. package/out/zql/src/ivm/stream.d.ts.map +1 -1
  1004. package/out/zql/src/ivm/stream.js.map +1 -1
  1005. package/out/zql/src/ivm/take-gate.js.map +1 -1
  1006. package/out/zql/src/ivm/take.d.ts.map +1 -1
  1007. package/out/zql/src/ivm/take.js +8 -9
  1008. package/out/zql/src/ivm/take.js.map +1 -1
  1009. package/out/zql/src/ivm/union-fan-in.d.ts +0 -1
  1010. package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
  1011. package/out/zql/src/ivm/union-fan-in.js +1 -1
  1012. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  1013. package/out/zql/src/ivm/union-fan-out.js.map +1 -1
  1014. package/out/zql/src/ivm/view-apply-change.d.ts +8 -33
  1015. package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
  1016. package/out/zql/src/ivm/view-apply-change.js +23 -3
  1017. package/out/zql/src/ivm/view-apply-change.js.map +1 -1
  1018. package/out/zql/src/mutate/crud.d.ts +1 -3
  1019. package/out/zql/src/mutate/crud.d.ts.map +1 -1
  1020. package/out/zql/src/mutate/crud.js +2 -1
  1021. package/out/zql/src/mutate/crud.js.map +1 -1
  1022. package/out/zql/src/mutate/mutator-registry.d.ts +1 -1
  1023. package/out/zql/src/mutate/mutator-registry.d.ts.map +1 -1
  1024. package/out/zql/src/mutate/mutator-registry.js.map +1 -1
  1025. package/out/zql/src/mutate/mutator.d.ts +1 -1
  1026. package/out/zql/src/mutate/mutator.d.ts.map +1 -1
  1027. package/out/zql/src/mutate/mutator.js.map +1 -1
  1028. package/out/zql/src/planner/planner-builder.js +1 -1
  1029. package/out/zql/src/planner/planner-builder.js.map +1 -1
  1030. package/out/zql/src/planner/planner-connection.js.map +1 -1
  1031. package/out/zql/src/planner/planner-debug.d.ts +11 -10
  1032. package/out/zql/src/planner/planner-debug.d.ts.map +1 -1
  1033. package/out/zql/src/planner/planner-debug.js +4 -0
  1034. package/out/zql/src/planner/planner-debug.js.map +1 -1
  1035. package/out/zql/src/planner/planner-fan-in.js.map +1 -1
  1036. package/out/zql/src/planner/planner-fan-out.js.map +1 -1
  1037. package/out/zql/src/planner/planner-filter.js.map +1 -1
  1038. package/out/zql/src/planner/planner-graph.js +1 -5
  1039. package/out/zql/src/planner/planner-graph.js.map +1 -1
  1040. package/out/zql/src/planner/planner-join.js +1 -1
  1041. package/out/zql/src/planner/planner-join.js.map +1 -1
  1042. package/out/zql/src/planner/planner-node.d.ts +0 -1
  1043. package/out/zql/src/planner/planner-node.d.ts.map +1 -1
  1044. package/out/zql/src/planner/planner-node.js.map +1 -1
  1045. package/out/zql/src/planner/planner-source.js.map +1 -1
  1046. package/out/zql/src/planner/planner-terminus.js.map +1 -1
  1047. package/out/zql/src/planner/planner-warnings.d.ts +3 -3
  1048. package/out/zql/src/planner/planner-warnings.d.ts.map +1 -1
  1049. package/out/zql/src/planner/planner-warnings.js.map +1 -1
  1050. package/out/zql/src/query/create-builder.js +2 -1
  1051. package/out/zql/src/query/create-builder.js.map +1 -1
  1052. package/out/zql/src/query/expression.d.ts +49 -24
  1053. package/out/zql/src/query/expression.d.ts.map +1 -1
  1054. package/out/zql/src/query/expression.js +62 -6
  1055. package/out/zql/src/query/expression.js.map +1 -1
  1056. package/out/zql/src/query/measure-push-operator.js +1 -1
  1057. package/out/zql/src/query/measure-push-operator.js.map +1 -1
  1058. package/out/zql/src/query/named.js +2 -1
  1059. package/out/zql/src/query/named.js.map +1 -1
  1060. package/out/zql/src/query/query-delegate-base.d.ts +8 -7
  1061. package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
  1062. package/out/zql/src/query/query-delegate-base.js +14 -6
  1063. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  1064. package/out/zql/src/query/query-delegate.d.ts +1 -4
  1065. package/out/zql/src/query/query-delegate.d.ts.map +1 -1
  1066. package/out/zql/src/query/query-impl.d.ts +17 -3
  1067. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  1068. package/out/zql/src/query/query-impl.js +242 -9
  1069. package/out/zql/src/query/query-impl.js.map +1 -1
  1070. package/out/zql/src/query/query-internals.d.ts +0 -3
  1071. package/out/zql/src/query/query-internals.d.ts.map +1 -1
  1072. package/out/zql/src/query/query-internals.js.map +1 -1
  1073. package/out/zql/src/query/query-registry.d.ts +5 -5
  1074. package/out/zql/src/query/query-registry.d.ts.map +1 -1
  1075. package/out/zql/src/query/query-registry.js +1 -1
  1076. package/out/zql/src/query/query-registry.js.map +1 -1
  1077. package/out/zql/src/query/query-transitions.js +1 -1
  1078. package/out/zql/src/query/query-transitions.js.map +1 -1
  1079. package/out/zql/src/query/query.d.ts +321 -20
  1080. package/out/zql/src/query/query.d.ts.map +1 -1
  1081. package/out/zql/src/query/runnable-query-impl.d.ts +1 -19
  1082. package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -1
  1083. package/out/zql/src/query/runnable-query-impl.js +2 -1
  1084. package/out/zql/src/query/runnable-query-impl.js.map +1 -1
  1085. package/out/zql/src/query/static-query.js.map +1 -1
  1086. package/out/zql/src/query/ttl.d.ts +2 -3
  1087. package/out/zql/src/query/ttl.d.ts.map +1 -1
  1088. package/out/zql/src/query/ttl.js +8 -8
  1089. package/out/zql/src/query/ttl.js.map +1 -1
  1090. package/out/zql/src/query/validate-input.js.map +1 -1
  1091. package/out/zqlite/src/database-storage.js +195 -26
  1092. package/out/zqlite/src/database-storage.js.map +1 -1
  1093. package/out/zqlite/src/db.d.ts +47 -1
  1094. package/out/zqlite/src/db.d.ts.map +1 -1
  1095. package/out/zqlite/src/db.js +121 -21
  1096. package/out/zqlite/src/db.js.map +1 -1
  1097. package/out/zqlite/src/explain-queries.js.map +1 -1
  1098. package/out/zqlite/src/fetch-sql.d.ts +27 -0
  1099. package/out/zqlite/src/fetch-sql.d.ts.map +1 -0
  1100. package/out/zqlite/src/fetch-sql.js +112 -0
  1101. package/out/zqlite/src/fetch-sql.js.map +1 -0
  1102. package/out/zqlite/src/index-usage.js.map +1 -1
  1103. package/out/zqlite/src/internal/sql-inline.js.map +1 -1
  1104. package/out/zqlite/src/internal/sql.js.map +1 -1
  1105. package/out/zqlite/src/internal/statement-cache.d.ts +7 -0
  1106. package/out/zqlite/src/internal/statement-cache.d.ts.map +1 -1
  1107. package/out/zqlite/src/internal/statement-cache.js +11 -4
  1108. package/out/zqlite/src/internal/statement-cache.js.map +1 -1
  1109. package/out/zqlite/src/mod.js +5 -5
  1110. package/out/zqlite/src/pending-delta.d.ts.map +1 -1
  1111. package/out/zqlite/src/pending-delta.js +4 -3
  1112. package/out/zqlite/src/pending-delta.js.map +1 -1
  1113. package/out/zqlite/src/query-builder.d.ts +23 -4
  1114. package/out/zqlite/src/query-builder.d.ts.map +1 -1
  1115. package/out/zqlite/src/query-builder.js +135 -19
  1116. package/out/zqlite/src/query-builder.js.map +1 -1
  1117. package/out/zqlite/src/query-delegate.js.map +1 -1
  1118. package/out/zqlite/src/resolve-scalar-subqueries.js +2 -5
  1119. package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
  1120. package/out/zqlite/src/sqlite-cost-model.js +3 -2
  1121. package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
  1122. package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
  1123. package/out/zqlite/src/table-source.d.ts +20 -3
  1124. package/out/zqlite/src/table-source.d.ts.map +1 -1
  1125. package/out/zqlite/src/table-source.js +110 -42
  1126. package/out/zqlite/src/table-source.js.map +1 -1
  1127. package/package.json +39 -39
  1128. package/out/analyze-query/src/bin-analyze.d.ts +0 -2
  1129. package/out/analyze-query/src/bin-analyze.d.ts.map +0 -1
  1130. package/out/analyze-query/src/bin-analyze.js +0 -283
  1131. package/out/analyze-query/src/bin-analyze.js.map +0 -1
  1132. package/out/otel/src/maybe-time.d.ts +0 -3
  1133. package/out/otel/src/maybe-time.d.ts.map +0 -1
  1134. package/out/otel/src/maybe-time.js +0 -15
  1135. package/out/otel/src/maybe-time.js.map +0 -1
  1136. package/out/shared/src/cache.d.ts +0 -22
  1137. package/out/shared/src/cache.d.ts.map +0 -1
  1138. package/out/shared/src/custom-key-map.d.ts +0 -26
  1139. package/out/shared/src/custom-key-map.d.ts.map +0 -1
  1140. package/out/shared/src/custom-key-set.d.ts +0 -25
  1141. package/out/shared/src/custom-key-set.d.ts.map +0 -1
  1142. package/out/shared/src/logging-test-utils.d.ts +0 -12
  1143. package/out/shared/src/logging-test-utils.d.ts.map +0 -1
  1144. package/out/shared/src/sorted-entries.d.ts +0 -2
  1145. package/out/shared/src/sorted-entries.d.ts.map +0 -1
  1146. package/out/zero/src/analyze-query.d.ts +0 -3
  1147. package/out/zero/src/analyze-query.d.ts.map +0 -1
  1148. package/out/zero/src/analyze-query.js +0 -3
  1149. package/out/zero/src/server/change-streamer.d.ts +0 -2
  1150. package/out/zero/src/server/change-streamer.d.ts.map +0 -1
  1151. package/out/zero/src/server/main.d.ts +0 -2
  1152. package/out/zero/src/server/main.d.ts.map +0 -1
  1153. package/out/zero/src/server/reaper.d.ts +0 -2
  1154. package/out/zero/src/server/reaper.d.ts.map +0 -1
  1155. package/out/zero/src/server/replicator.d.ts +0 -2
  1156. package/out/zero/src/server/replicator.d.ts.map +0 -1
  1157. package/out/zero/src/server/syncer.d.ts +0 -2
  1158. package/out/zero/src/server/syncer.d.ts.map +0 -1
  1159. package/out/zero-cache/src/auth/jwt.d.ts +0 -12
  1160. package/out/zero-cache/src/auth/jwt.d.ts.map +0 -1
  1161. package/out/zero-cache/src/auth/load-permissions.d.ts +0 -17
  1162. package/out/zero-cache/src/auth/load-permissions.d.ts.map +0 -1
  1163. package/out/zero-cache/src/auth/write-authorizer.d.ts +0 -28
  1164. package/out/zero-cache/src/auth/write-authorizer.d.ts.map +0 -1
  1165. package/out/zero-cache/src/config/server-context.d.ts +0 -16
  1166. package/out/zero-cache/src/config/server-context.d.ts.map +0 -1
  1167. package/out/zero-cache/src/custom/fetch.d.ts +0 -38
  1168. package/out/zero-cache/src/custom/fetch.d.ts.map +0 -1
  1169. package/out/zero-cache/src/custom/metrics.d.ts +0 -31
  1170. package/out/zero-cache/src/custom/metrics.d.ts.map +0 -1
  1171. package/out/zero-cache/src/custom-queries/transform-query.d.ts +0 -68
  1172. package/out/zero-cache/src/custom-queries/transform-query.d.ts.map +0 -1
  1173. package/out/zero-cache/src/db/create.d.ts +0 -12
  1174. package/out/zero-cache/src/db/create.d.ts.map +0 -1
  1175. package/out/zero-cache/src/db/delete-lite-db.d.ts +0 -2
  1176. package/out/zero-cache/src/db/delete-lite-db.d.ts.map +0 -1
  1177. package/out/zero-cache/src/db/index-predicate.d.ts +0 -4
  1178. package/out/zero-cache/src/db/index-predicate.d.ts.map +0 -1
  1179. package/out/zero-cache/src/db/migration-lite.d.ts +0 -78
  1180. package/out/zero-cache/src/db/migration-lite.d.ts.map +0 -1
  1181. package/out/zero-cache/src/db/migration.d.ts +0 -80
  1182. package/out/zero-cache/src/db/migration.d.ts.map +0 -1
  1183. package/out/zero-cache/src/db/pg-copy-binary.d.ts +0 -101
  1184. package/out/zero-cache/src/db/pg-copy-binary.d.ts.map +0 -1
  1185. package/out/zero-cache/src/db/pg-copy.d.ts +0 -30
  1186. package/out/zero-cache/src/db/pg-copy.d.ts.map +0 -1
  1187. package/out/zero-cache/src/db/pg-type-parser.d.ts +0 -15
  1188. package/out/zero-cache/src/db/pg-type-parser.d.ts.map +0 -1
  1189. package/out/zero-cache/src/db/transaction-pool.d.ts +0 -205
  1190. package/out/zero-cache/src/db/transaction-pool.d.ts.map +0 -1
  1191. package/out/zero-cache/src/db/warmup.d.ts +0 -4
  1192. package/out/zero-cache/src/db/warmup.d.ts.map +0 -1
  1193. package/out/zero-cache/src/observability/events.d.ts +0 -15
  1194. package/out/zero-cache/src/observability/events.d.ts.map +0 -1
  1195. package/out/zero-cache/src/observability/log-throttle.d.ts +0 -44
  1196. package/out/zero-cache/src/observability/log-throttle.d.ts.map +0 -1
  1197. package/out/zero-cache/src/server/anonymous-otel-start.d.ts +0 -21
  1198. package/out/zero-cache/src/server/anonymous-otel-start.d.ts.map +0 -1
  1199. package/out/zero-cache/src/server/change-streamer.d.ts +0 -3
  1200. package/out/zero-cache/src/server/change-streamer.d.ts.map +0 -1
  1201. package/out/zero-cache/src/server/inspector-delegate.d.ts +0 -71
  1202. package/out/zero-cache/src/server/inspector-delegate.d.ts.map +0 -1
  1203. package/out/zero-cache/src/server/main.d.ts +0 -3
  1204. package/out/zero-cache/src/server/main.d.ts.map +0 -1
  1205. package/out/zero-cache/src/server/otel-diag-logger.d.ts +0 -16
  1206. package/out/zero-cache/src/server/otel-diag-logger.d.ts.map +0 -1
  1207. package/out/zero-cache/src/server/otel-start.d.ts +0 -3
  1208. package/out/zero-cache/src/server/otel-start.d.ts.map +0 -1
  1209. package/out/zero-cache/src/server/priority-op.d.ts +0 -8
  1210. package/out/zero-cache/src/server/priority-op.d.ts.map +0 -1
  1211. package/out/zero-cache/src/server/reaper.d.ts +0 -3
  1212. package/out/zero-cache/src/server/reaper.d.ts.map +0 -1
  1213. package/out/zero-cache/src/server/replicator.d.ts +0 -10
  1214. package/out/zero-cache/src/server/replicator.d.ts.map +0 -1
  1215. package/out/zero-cache/src/server/slot-keeper.d.ts +0 -26
  1216. package/out/zero-cache/src/server/slot-keeper.d.ts.map +0 -1
  1217. package/out/zero-cache/src/server/syncer.d.ts +0 -3
  1218. package/out/zero-cache/src/server/syncer.d.ts.map +0 -1
  1219. package/out/zero-cache/src/services/analyze.d.ts +0 -9
  1220. package/out/zero-cache/src/services/analyze.d.ts.map +0 -1
  1221. package/out/zero-cache/src/services/change-source/change-source.d.ts +0 -32
  1222. package/out/zero-cache/src/services/change-source/change-source.d.ts.map +0 -1
  1223. package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts +0 -57
  1224. package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts.map +0 -1
  1225. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.d.ts +0 -55
  1226. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.d.ts.map +0 -1
  1227. package/out/zero-cache/src/services/change-source/common/init-cleanup.d.ts +0 -24
  1228. package/out/zero-cache/src/services/change-source/common/init-cleanup.d.ts.map +0 -1
  1229. package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts +0 -115
  1230. package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts.map +0 -1
  1231. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts +0 -14
  1232. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +0 -1
  1233. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts +0 -25
  1234. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +0 -1
  1235. package/out/zero-cache/src/services/change-source/pg/backfill-metadata.d.ts +0 -14
  1236. package/out/zero-cache/src/services/change-source/pg/backfill-metadata.d.ts.map +0 -1
  1237. package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts +0 -36
  1238. package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts.map +0 -1
  1239. package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts +0 -65
  1240. package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts.map +0 -1
  1241. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +0 -115
  1242. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +0 -1
  1243. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +0 -155
  1244. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +0 -1
  1245. package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.d.ts +0 -17
  1246. package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.d.ts.map +0 -1
  1247. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.d.ts +0 -28
  1248. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.d.ts.map +0 -1
  1249. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput.types.d.ts +0 -76
  1250. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput.types.d.ts.map +0 -1
  1251. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts +0 -169
  1252. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts.map +0 -1
  1253. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts +0 -16
  1254. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts.map +0 -1
  1255. package/out/zero-cache/src/services/change-source/pg/replication-slot-health.d.ts +0 -15
  1256. package/out/zero-cache/src/services/change-source/pg/replication-slot-health.d.ts.map +0 -1
  1257. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts +0 -127
  1258. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts.map +0 -1
  1259. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts +0 -9
  1260. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +0 -1
  1261. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts +0 -68
  1262. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts.map +0 -1
  1263. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts +0 -72
  1264. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts.map +0 -1
  1265. package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts +0 -50
  1266. package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts.map +0 -1
  1267. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts +0 -14
  1268. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts.map +0 -1
  1269. package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts +0 -18
  1270. package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts.map +0 -1
  1271. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts +0 -98
  1272. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts.map +0 -1
  1273. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts +0 -34
  1274. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts.map +0 -1
  1275. package/out/zero-cache/src/services/change-streamer/change-log-compare-digest.d.ts +0 -34
  1276. package/out/zero-cache/src/services/change-streamer/change-log-compare-digest.d.ts.map +0 -1
  1277. package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts +0 -158
  1278. package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts.map +0 -1
  1279. package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.d.ts +0 -19
  1280. package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.d.ts.map +0 -1
  1281. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +0 -78
  1282. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +0 -1
  1283. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +0 -143
  1284. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +0 -1
  1285. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +0 -586
  1286. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +0 -1
  1287. package/out/zero-cache/src/services/change-streamer/drain-tracker.d.ts +0 -24
  1288. package/out/zero-cache/src/services/change-streamer/drain-tracker.d.ts.map +0 -1
  1289. package/out/zero-cache/src/services/change-streamer/error-type-enum.d.ts +0 -15
  1290. package/out/zero-cache/src/services/change-streamer/error-type-enum.d.ts.map +0 -1
  1291. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts +0 -49
  1292. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +0 -1
  1293. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts +0 -53
  1294. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts.map +0 -1
  1295. package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.d.ts +0 -88
  1296. package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.d.ts.map +0 -1
  1297. package/out/zero-cache/src/services/change-streamer/replica-poller.d.ts +0 -15
  1298. package/out/zero-cache/src/services/change-streamer/replica-poller.d.ts.map +0 -1
  1299. package/out/zero-cache/src/services/change-streamer/restore-admission.d.ts +0 -243
  1300. package/out/zero-cache/src/services/change-streamer/restore-admission.d.ts.map +0 -1
  1301. package/out/zero-cache/src/services/change-streamer/schema/init.d.ts +0 -6
  1302. package/out/zero-cache/src/services/change-streamer/schema/init.d.ts.map +0 -1
  1303. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +0 -152
  1304. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +0 -1
  1305. package/out/zero-cache/src/services/change-streamer/shard-sampling.d.ts +0 -11
  1306. package/out/zero-cache/src/services/change-streamer/shard-sampling.d.ts.map +0 -1
  1307. package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts +0 -92
  1308. package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts.map +0 -1
  1309. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts +0 -36
  1310. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts.map +0 -1
  1311. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts +0 -22
  1312. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts.map +0 -1
  1313. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.d.ts +0 -99
  1314. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.d.ts.map +0 -1
  1315. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.d.ts +0 -83
  1316. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.d.ts.map +0 -1
  1317. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.d.ts +0 -121
  1318. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.d.ts.map +0 -1
  1319. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-read-router.d.ts +0 -73
  1320. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-read-router.d.ts.map +0 -1
  1321. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.d.ts +0 -62
  1322. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.d.ts.map +0 -1
  1323. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts +0 -114
  1324. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts.map +0 -1
  1325. package/out/zero-cache/src/services/change-streamer/storer.d.ts +0 -276
  1326. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +0 -1
  1327. package/out/zero-cache/src/services/change-streamer/subscribe.d.ts +0 -485
  1328. package/out/zero-cache/src/services/change-streamer/subscribe.d.ts.map +0 -1
  1329. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +0 -194
  1330. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +0 -1
  1331. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts +0 -52
  1332. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts.map +0 -1
  1333. package/out/zero-cache/src/services/limiter/sliding-window-limiter.d.ts +0 -57
  1334. package/out/zero-cache/src/services/limiter/sliding-window-limiter.d.ts.map +0 -1
  1335. package/out/zero-cache/src/services/litestream/commands.d.ts +0 -77
  1336. package/out/zero-cache/src/services/litestream/commands.d.ts.map +0 -1
  1337. package/out/zero-cache/src/services/litestream/litestream-controller.d.ts +0 -78
  1338. package/out/zero-cache/src/services/litestream/litestream-controller.d.ts.map +0 -1
  1339. package/out/zero-cache/src/services/litestream/metrics.d.ts +0 -31
  1340. package/out/zero-cache/src/services/litestream/metrics.d.ts.map +0 -1
  1341. package/out/zero-cache/src/services/litestream/restore-progress.d.ts +0 -24
  1342. package/out/zero-cache/src/services/litestream/restore-progress.d.ts.map +0 -1
  1343. package/out/zero-cache/src/services/mutagen/mutagen.d.ts +0 -40
  1344. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +0 -1
  1345. package/out/zero-cache/src/services/mutagen/pusher.d.ts +0 -63
  1346. package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +0 -1
  1347. package/out/zero-cache/src/services/replicator/change-log-db.d.ts +0 -368
  1348. package/out/zero-cache/src/services/replicator/change-log-db.d.ts.map +0 -1
  1349. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts +0 -56
  1350. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts.map +0 -1
  1351. package/out/zero-cache/src/services/replicator/change-processor.d.ts +0 -37
  1352. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +0 -1
  1353. package/out/zero-cache/src/services/replicator/drain-handler.d.ts +0 -82
  1354. package/out/zero-cache/src/services/replicator/drain-handler.d.ts.map +0 -1
  1355. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +0 -25
  1356. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +0 -1
  1357. package/out/zero-cache/src/services/replicator/notifier.d.ts +0 -9
  1358. package/out/zero-cache/src/services/replicator/notifier.d.ts.map +0 -1
  1359. package/out/zero-cache/src/services/replicator/replication-status.d.ts +0 -71
  1360. package/out/zero-cache/src/services/replicator/replication-status.d.ts.map +0 -1
  1361. package/out/zero-cache/src/services/replicator/replicator.d.ts +0 -86
  1362. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +0 -1
  1363. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts +0 -55
  1364. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts.map +0 -1
  1365. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts +0 -132
  1366. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts.map +0 -1
  1367. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.d.ts +0 -120
  1368. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.d.ts.map +0 -1
  1369. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts +0 -111
  1370. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts.map +0 -1
  1371. package/out/zero-cache/src/services/run-ast.d.ts +0 -39
  1372. package/out/zero-cache/src/services/run-ast.d.ts.map +0 -1
  1373. package/out/zero-cache/src/services/runner.d.ts +0 -19
  1374. package/out/zero-cache/src/services/runner.d.ts.map +0 -1
  1375. package/out/zero-cache/src/services/view-syncer/active-users-gauge.d.ts +0 -17
  1376. package/out/zero-cache/src/services/view-syncer/active-users-gauge.d.ts.map +0 -1
  1377. package/out/zero-cache/src/services/view-syncer/advancement-metrics.d.ts +0 -26
  1378. package/out/zero-cache/src/services/view-syncer/advancement-metrics.d.ts.map +0 -1
  1379. package/out/zero-cache/src/services/view-syncer/batch-pacer.d.ts +0 -79
  1380. package/out/zero-cache/src/services/view-syncer/batch-pacer.d.ts.map +0 -1
  1381. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +0 -79
  1382. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +0 -1
  1383. package/out/zero-cache/src/services/view-syncer/client-schema.d.ts +0 -5
  1384. package/out/zero-cache/src/services/view-syncer/client-schema.d.ts.map +0 -1
  1385. package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts +0 -184
  1386. package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts.map +0 -1
  1387. package/out/zero-cache/src/services/view-syncer/cvr-purger.d.ts +0 -22
  1388. package/out/zero-cache/src/services/view-syncer/cvr-purger.d.ts.map +0 -1
  1389. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +0 -128
  1390. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +0 -1
  1391. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +0 -294
  1392. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +0 -1
  1393. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts +0 -81
  1394. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts.map +0 -1
  1395. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts +0 -45
  1396. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts.map +0 -1
  1397. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.d.ts +0 -53
  1398. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.d.ts.map +0 -1
  1399. package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts +0 -33
  1400. package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts.map +0 -1
  1401. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts +0 -51
  1402. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts.map +0 -1
  1403. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts +0 -34
  1404. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts.map +0 -1
  1405. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +0 -296
  1406. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +0 -1
  1407. package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts +0 -7
  1408. package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts.map +0 -1
  1409. package/out/zero-cache/src/services/view-syncer/push-cost.d.ts +0 -132
  1410. package/out/zero-cache/src/services/view-syncer/push-cost.d.ts.map +0 -1
  1411. package/out/zero-cache/src/services/view-syncer/push-cutoff.d.ts +0 -55
  1412. package/out/zero-cache/src/services/view-syncer/push-cutoff.d.ts.map +0 -1
  1413. package/out/zero-cache/src/services/view-syncer/query-covering.d.ts +0 -28
  1414. package/out/zero-cache/src/services/view-syncer/query-covering.d.ts.map +0 -1
  1415. package/out/zero-cache/src/services/view-syncer/query-shape.d.ts +0 -25
  1416. package/out/zero-cache/src/services/view-syncer/query-shape.d.ts.map +0 -1
  1417. package/out/zero-cache/src/services/view-syncer/query-stats.d.ts +0 -89
  1418. package/out/zero-cache/src/services/view-syncer/query-stats.d.ts.map +0 -1
  1419. package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts +0 -90
  1420. package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts.map +0 -1
  1421. package/out/zero-cache/src/services/view-syncer/row-set-signature.d.ts +0 -17
  1422. package/out/zero-cache/src/services/view-syncer/row-set-signature.d.ts.map +0 -1
  1423. package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts +0 -86
  1424. package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts.map +0 -1
  1425. package/out/zero-cache/src/services/view-syncer/schema/init.d.ts +0 -5
  1426. package/out/zero-cache/src/services/view-syncer/schema/init.d.ts.map +0 -1
  1427. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +0 -563
  1428. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +0 -1
  1429. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts +0 -95
  1430. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts.map +0 -1
  1431. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +0 -412
  1432. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +0 -1
  1433. package/out/zero-cache/src/services/view-syncer/tracer.d.ts +0 -2
  1434. package/out/zero-cache/src/services/view-syncer/tracer.d.ts.map +0 -1
  1435. package/out/zero-cache/src/services/view-syncer/ttl-clock.d.ts +0 -10
  1436. package/out/zero-cache/src/services/view-syncer/ttl-clock.d.ts.map +0 -1
  1437. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +0 -133
  1438. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +0 -1
  1439. package/out/zero-cache/src/types/pg-patch.d.ts +0 -21
  1440. package/out/zero-cache/src/types/pg-patch.d.ts.map +0 -1
  1441. package/out/zero-cache/src/types/pg-versions.d.ts +0 -3
  1442. package/out/zero-cache/src/types/pg-versions.d.ts.map +0 -1
  1443. package/out/zero-cache/src/workers/replicator.d.ts +0 -57
  1444. package/out/zero-cache/src/workers/replicator.d.ts.map +0 -1
  1445. package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts +0 -14
  1446. package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +0 -1
  1447. package/out/zero-cache/src/workers/syncer.d.ts +0 -67
  1448. package/out/zero-cache/src/workers/syncer.d.ts.map +0 -1
  1449. package/out/zero-events/src/index.d.ts +0 -27
  1450. package/out/zero-events/src/index.d.ts.map +0 -1
  1451. package/out/zero-events/src/json.d.ts +0 -20
  1452. package/out/zero-events/src/json.d.ts.map +0 -1
  1453. package/out/zero-events/src/status.d.ts +0 -144
  1454. package/out/zero-events/src/status.d.ts.map +0 -1
  1455. package/out/zqlite/src/database-storage.d.ts +0 -24
  1456. package/out/zqlite/src/database-storage.d.ts.map +0 -1
  1457. package/out/zqlite/src/explain-queries.d.ts +0 -4
  1458. package/out/zqlite/src/explain-queries.d.ts.map +0 -1
  1459. package/out/zqlite/src/internal/sql-inline.d.ts +0 -13
  1460. package/out/zqlite/src/internal/sql-inline.d.ts.map +0 -1
  1461. package/out/zqlite/src/resolve-scalar-subqueries.d.ts +0 -72
  1462. package/out/zqlite/src/resolve-scalar-subqueries.d.ts.map +0 -1
  1463. package/out/zqlite/src/sqlite-cost-model.d.ts +0 -17
  1464. package/out/zqlite/src/sqlite-cost-model.d.ts.map +0 -1
  1465. package/out/zqlite/src/sqlite-stat-fanout.d.ts +0 -121
  1466. package/out/zqlite/src/sqlite-stat-fanout.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"log-options.js","names":["#wrappedLogSink","#level"],"sources":["../../../../../zero-client/src/client/log-options.ts"],"sourcesContent":["import {\n TeeLogSink,\n consoleLogSink,\n type Context,\n type LogLevel,\n type LogSink,\n} from '@rocicorp/logger';\nimport {\n DatadogLogSink,\n type DatadogLogSinkOptions,\n} from '../../../datadog/src/datadog-log-sink.ts';\nimport {appendPath, type HTTPString} from './http-string.ts';\nimport {version} from './version.ts';\n\nclass LevelFilterLogSink implements LogSink {\n readonly #wrappedLogSink: LogSink;\n readonly #level: LogLevel;\n\n constructor(wrappedLogSink: LogSink, level: LogLevel) {\n this.#wrappedLogSink = wrappedLogSink;\n this.#level = level;\n }\n\n log(level: LogLevel, context: Context | undefined, ...args: unknown[]): void {\n if (this.#level === 'error' && level !== 'error') {\n return;\n }\n if (this.#level === 'info' && level === 'debug') {\n return;\n }\n this.#wrappedLogSink.log(level, context, ...args);\n }\n\n async flush() {\n await consoleLogSink.flush?.();\n }\n}\n\nconst DATADOG_LOG_LEVEL = 'info';\nconst ZERO_SASS_DOMAIN = '.reflect-server.net';\n\nexport type LogOptions = {\n readonly logLevel: LogLevel;\n readonly logSink: LogSink;\n};\n\nexport function createLogOptions(\n options: {\n consoleLogLevel: LogLevel;\n server: HTTPString | null;\n enableAnalytics: boolean;\n consoleLogSink?: LogSink | undefined;\n },\n createDatadogLogSink: (options: DatadogLogSinkOptions) => LogSink = (\n options: DatadogLogSinkOptions,\n ) => new DatadogLogSink(options),\n): LogOptions {\n const {consoleLogLevel, server, enableAnalytics} = options;\n const userSink = options.consoleLogSink ?? consoleLogSink;\n\n if (!enableAnalytics || server === null) {\n return {\n logLevel: consoleLogLevel,\n logSink: userSink,\n };\n }\n\n const serverURL = new URL(server);\n const {hostname} = serverURL;\n const datadogServiceLabel = hostname.endsWith(ZERO_SASS_DOMAIN)\n ? hostname\n .substring(0, hostname.length - ZERO_SASS_DOMAIN.length)\n .toLowerCase()\n : hostname;\n const baseURL = new URL(appendPath(server, '/logs/v0/log'));\n const logLevel = consoleLogLevel === 'debug' ? 'debug' : 'info';\n const logSink = new TeeLogSink([\n new LevelFilterLogSink(userSink, consoleLogLevel),\n new LevelFilterLogSink(\n createDatadogLogSink({\n service: datadogServiceLabel,\n host: location.host,\n version,\n baseURL,\n }),\n DATADOG_LOG_LEVEL,\n ),\n ]);\n return {\n logLevel,\n logSink,\n };\n}\n"],"mappings":";;;;;AAcA,IAAM,qBAAN,MAA4C;CAC1C;CACA;CAEA,YAAY,gBAAyB,OAAiB;EACpD,KAAKA,kBAAkB;EACvB,KAAKC,SAAS;CAChB;CAEA,IAAI,OAAiB,SAA8B,GAAG,MAAuB;EAC3E,IAAI,KAAKA,WAAW,WAAW,UAAU,SACvC;EAEF,IAAI,KAAKA,WAAW,UAAU,UAAU,SACtC;EAEF,KAAKD,gBAAgB,IAAI,OAAO,SAAS,GAAG,IAAI;CAClD;CAEA,MAAM,QAAQ;EACZ,MAAM,eAAe,QAAQ;CAC/B;AACF;AAEA,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AAOzB,SAAgB,iBACd,SAMA,wBACE,YACG,IAAI,eAAe,OAAO,GACnB;CACZ,MAAM,EAAC,iBAAiB,QAAQ,oBAAmB;CACnD,MAAM,WAAW,QAAQ,kBAAkB;CAE3C,IAAI,CAAC,mBAAmB,WAAW,MACjC,OAAO;EACL,UAAU;EACV,SAAS;CACX;CAIF,MAAM,EAAC,aAAY,IADG,IAAI,MACP;CACnB,MAAM,sBAAsB,SAAS,SAAS,gBAAgB,IAC1D,SACG,UAAU,GAAG,SAAS,SAAS,EAAuB,EACtD,YAAY,IACf;CACJ,MAAM,UAAU,IAAI,IAAI,WAAW,QAAQ,cAAc,CAAC;CAc1D,OAAO;EACL,UAde,oBAAoB,UAAU,UAAU;EAevD,SAAA,IAdkB,WAAW,CAC7B,IAAI,mBAAmB,UAAU,eAAe,GAChD,IAAI,mBACF,qBAAqB;GACnB,SAAS;GACT,MAAM,SAAS;GACf;GACA;EACF,CAAC,GACD,iBACF,CACF,CAGE;CACF;AACF"}
1
+ {"version":3,"file":"log-options.js","names":[],"sources":["../../../../../zero-client/src/client/log-options.ts"],"sourcesContent":["import {\n TeeLogSink,\n consoleLogSink,\n type Context,\n type LogLevel,\n type LogSink,\n} from '@rocicorp/logger';\nimport {\n DatadogLogSink,\n type DatadogLogSinkOptions,\n} from '../../../datadog/src/datadog-log-sink.ts';\nimport {appendPath, type HTTPString} from './http-string.ts';\nimport {version} from './version.ts';\n\nclass LevelFilterLogSink implements LogSink {\n readonly #wrappedLogSink: LogSink;\n readonly #level: LogLevel;\n\n constructor(wrappedLogSink: LogSink, level: LogLevel) {\n this.#wrappedLogSink = wrappedLogSink;\n this.#level = level;\n }\n\n log(level: LogLevel, context: Context | undefined, ...args: unknown[]): void {\n if (this.#level === 'error' && level !== 'error') {\n return;\n }\n if (this.#level === 'info' && level === 'debug') {\n return;\n }\n this.#wrappedLogSink.log(level, context, ...args);\n }\n\n async flush() {\n await consoleLogSink.flush?.();\n }\n}\n\nconst DATADOG_LOG_LEVEL = 'info';\nconst ZERO_SASS_DOMAIN = '.reflect-server.net';\n\nexport type LogOptions = {\n readonly logLevel: LogLevel;\n readonly logSink: LogSink;\n};\n\nexport function createLogOptions(\n options: {\n consoleLogLevel: LogLevel;\n server: HTTPString | null;\n enableAnalytics: boolean;\n consoleLogSink?: LogSink | undefined;\n },\n createDatadogLogSink: (options: DatadogLogSinkOptions) => LogSink = (\n options: DatadogLogSinkOptions,\n ) => new DatadogLogSink(options),\n): LogOptions {\n const {consoleLogLevel, server, enableAnalytics} = options;\n const userSink = options.consoleLogSink ?? consoleLogSink;\n\n if (!enableAnalytics || server === null) {\n return {\n logLevel: consoleLogLevel,\n logSink: userSink,\n };\n }\n\n const serverURL = new URL(server);\n const {hostname} = serverURL;\n const datadogServiceLabel = hostname.endsWith(ZERO_SASS_DOMAIN)\n ? hostname\n .substring(0, hostname.length - ZERO_SASS_DOMAIN.length)\n .toLowerCase()\n : hostname;\n const baseURL = new URL(appendPath(server, '/logs/v0/log'));\n const logLevel = consoleLogLevel === 'debug' ? 'debug' : 'info';\n const logSink = new TeeLogSink([\n new LevelFilterLogSink(userSink, consoleLogLevel),\n new LevelFilterLogSink(\n createDatadogLogSink({\n service: datadogServiceLabel,\n host: location.host,\n version,\n baseURL,\n }),\n DATADOG_LOG_LEVEL,\n ),\n ]);\n return {\n logLevel,\n logSink,\n };\n}\n"],"mappings":";;;;;AAcA,IAAM,qBAAN,MAA4C;CAC1C;CACA;CAEA,YAAY,gBAAyB,OAAiB;EACpD,KAAK,kBAAkB;EACvB,KAAK,SAAS;CAChB;CAEA,IAAI,OAAiB,SAA8B,GAAG,MAAuB;EAC3E,IAAI,KAAK,WAAW,WAAW,UAAU,SACvC;EAEF,IAAI,KAAK,WAAW,UAAU,UAAU,SACtC;EAEF,KAAK,gBAAgB,IAAI,OAAO,SAAS,GAAG,IAAI;CAClD;CAEA,MAAM,QAAQ;EACZ,MAAM,eAAe,QAAQ;CAC/B;AACF;AAEA,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AAOzB,SAAgB,iBACd,SAMA,wBACE,YACG,IAAI,eAAe,OAAO,GACnB;CACZ,MAAM,EAAC,iBAAiB,QAAQ,oBAAmB;CACnD,MAAM,WAAW,QAAQ,kBAAkB;CAE3C,IAAI,CAAC,mBAAmB,WAAW,MACjC,OAAO;EACL,UAAU;EACV,SAAS;CACX;CAIF,MAAM,EAAC,aAAY,IADG,IAAI,MACP;CACnB,MAAM,sBAAsB,SAAS,SAAS,gBAAgB,IAC1D,SACG,UAAU,GAAG,SAAS,SAAS,EAAuB,CAAC,CACvD,YAAY,IACf;CACJ,MAAM,UAAU,IAAI,IAAI,WAAW,QAAQ,cAAc,CAAC;CAc1D,OAAO;EACL,UAde,oBAAoB,UAAU,UAAU;EAevD,SAAA,IAdkB,WAAW,CAC7B,IAAI,mBAAmB,UAAU,eAAe,GAChD,IAAI,mBACF,qBAAqB;GACnB,SAAS;GACT,MAAM,SAAS;GACf;GACA;EACF,CAAC,GACD,iBACF,CACF,CAGE;CACF;AACF"}
@@ -63,8 +63,10 @@ function makeReplicacheMutators(schema, mutators, context, lc) {
63
63
  kind: Internal,
64
64
  message: "Zero CRUD mutators are not enabled."
65
65
  })) };
66
- if (mutators) if (isMutatorRegistry(mutators)) extendFromMutatorRegistry(lc, context, mutators, schema, replicacheMutators);
67
- else extendReplicacheMutators(lc, context, mutators, schema, replicacheMutators);
66
+ if (mutators) {
67
+ if (isMutatorRegistry(mutators)) extendFromMutatorRegistry(lc, context, mutators, schema, replicacheMutators);
68
+ else extendReplicacheMutators(lc, context, mutators, schema, replicacheMutators);
69
+ }
68
70
  return replicacheMutators;
69
71
  }
70
72
  /**
@@ -87,6 +89,6 @@ function extendFromMutatorRegistry(lc, context, registry, schema, mutateObject)
87
89
  walk(registry);
88
90
  }
89
91
  //#endregion
90
- export { makeReplicacheMutators };
92
+ export { extendReplicacheMutators, makeReplicacheMutators };
91
93
 
92
94
  //# sourceMappingURL=make-replicache-mutators.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"make-replicache-mutators.js","names":[],"sources":["../../../../../zero-client/src/client/make-replicache-mutators.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport type {MutatorDefs} from '../../../replicache/src/types.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport {CRUD_MUTATION_NAME} from '../../../zero-protocol/src/mutation.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {customMutatorKey} from '../../../zql/src/mutate/custom.ts';\nimport {\n isMutatorRegistry,\n type AnyMutatorRegistry,\n} from '../../../zql/src/mutate/mutator-registry.ts';\nimport {isMutator, type Mutator} from '../../../zql/src/mutate/mutator.ts';\nimport {ClientErrorKind} from './client-error-kind.ts';\nimport {makeCRUDMutator, type CRUDMutator} from './crud.ts';\nimport type {CustomMutatorDefs, CustomMutatorImpl} from './custom.ts';\nimport {\n makeReplicacheMutator as makeReplicacheMutatorLegacy,\n TransactionImpl,\n} from './custom.ts';\nimport {ClientError} from './error.ts';\nimport type {WriteTransaction} from './replicache-types.ts';\n\nexport function extendReplicacheMutators<S extends Schema, C>(\n lc: LogContext,\n context: C,\n mutators: AnyMutatorRegistry | CustomMutatorDefs,\n schema: S,\n mutateObject: Record<string, unknown>,\n): void {\n // Recursively process mutator definitions at arbitrary depth\n const processMutators = (mutators: object, path: string[]) => {\n for (const [key, mutator] of Object.entries(mutators)) {\n if (key === '~') {\n // Skip phantom type\n continue;\n }\n\n path.push(key);\n if (isMutator(mutator)) {\n const fullKey = customMutatorKey('.', path);\n mutateObject[fullKey] = makeReplicacheMutator(\n lc,\n mutator,\n schema,\n context,\n );\n } else if (typeof mutator === 'function') {\n const fullKey = customMutatorKey('|', path);\n mutateObject[fullKey] = makeReplicacheMutatorLegacy(\n lc,\n // oxlint-disable-next-line no-explicit-any\n mutator as CustomMutatorImpl<any>,\n schema,\n context,\n );\n } else if (mutator !== null && typeof mutator === 'object') {\n processMutators(mutator, path);\n }\n path.pop();\n }\n };\n\n processMutators(mutators, []);\n}\n\nfunction makeReplicacheMutator<\n TArgs extends ReadonlyJSONValue | undefined,\n TSchema extends Schema,\n TContext,\n TWrappedTransaction,\n>(\n lc: LogContext,\n mutator: Mutator<TArgs, TSchema, TContext, TWrappedTransaction>,\n schema: TSchema,\n context: TContext,\n): (\n repTx: WriteTransaction,\n args: ReadonlyJSONValue,\n) => Promise<ReadonlyJSONValue | void> {\n return async (\n repTx: WriteTransaction,\n args: ReadonlyJSONValue,\n ): Promise<ReadonlyJSONValue | void> => {\n const tx = new TransactionImpl(lc, repTx, schema);\n // fn does input validation internally\n return await mutator.fn({\n args: args as TArgs,\n ctx: context,\n tx: tx,\n });\n };\n}\n\n/**\n * Creates Replicache mutators from mutator definitions.\n *\n * This function processes mutator definitions at arbitrary depth, supporting both\n * new-style mutator definitions and legacy custom mutator implementations. It creates\n * a mutator object with the CRUD mutator and any provided custom mutators, with keys\n * generated based on their path in the mutator definition hierarchy.\n *\n * @template S - The schema type that defines the structure of the data\n * @template C - The type of the context object passed to mutators\n *\n * @param schema - The schema instance used for validation and type checking\n * @param mutators - The mutator definitions to process, can be nested objects or custom mutator definitions\n * @param context - The context to be passed to mutators\n * @param lc - The log context used for logging operations\n *\n * @returns A mutator definitions object containing the CRUD mutator and any custom mutators\n *\n * @remarks\n * - New-style mutator definitions use '.' as a separator in their keys\n * - Legacy custom mutator implementations use '|' as a separator in their keys\n * - The CRUD mutator can be disabled by setting `enableLegacyMutators: false` in the schema\n */\nexport function makeReplicacheMutators<const S extends Schema, C>(\n schema: S,\n mutators: AnyMutatorRegistry | CustomMutatorDefs | undefined,\n context: C,\n lc: LogContext,\n): MutatorDefs & {_zero_crud: CRUDMutator} {\n const {enableLegacyMutators = false} = schema;\n\n const replicacheMutators = {\n [CRUD_MUTATION_NAME]: enableLegacyMutators\n ? makeCRUDMutator(schema)\n : // TODO(arv): This code is unreachable since the public API prevents\n // calling CRUD mutators when enableLegacyMutators is false. Remove this.\n () =>\n Promise.reject(\n new ClientError({\n kind: ClientErrorKind.Internal,\n message: 'Zero CRUD mutators are not enabled.',\n }),\n ),\n };\n\n if (mutators) {\n if (isMutatorRegistry(mutators)) {\n extendFromMutatorRegistry(\n lc,\n context,\n mutators,\n schema,\n replicacheMutators,\n );\n } else {\n extendReplicacheMutators(\n lc,\n context,\n mutators as CustomMutatorDefs,\n schema,\n replicacheMutators,\n );\n }\n }\n\n return replicacheMutators;\n}\n\n/**\n * Extends replicache mutators from a MutatorRegistry.\n * Walks the registry tree and wraps each Mutator.fn for Replicache.\n */\nfunction extendFromMutatorRegistry<S extends Schema, C>(\n lc: LogContext,\n context: C,\n registry: AnyMutatorRegistry,\n schema: S,\n mutateObject: Record<string, unknown>,\n): void {\n const walk = (node: unknown) => {\n if (typeof node !== 'object' || node === null) {\n return;\n }\n for (const value of Object.values(node)) {\n if (isMutator<S>(value)) {\n // Mutator.fn already handles validation internally\n mutateObject[value.mutatorName] = (\n repTx: WriteTransaction,\n args: ReadonlyJSONValue,\n ): Promise<ReadonlyJSONValue | void> => {\n const tx = new TransactionImpl(lc, repTx, schema);\n return value.fn({args, ctx: context, tx});\n };\n } else if (typeof value === 'object' && value !== null) {\n // Nested namespace\n walk(value);\n }\n }\n };\n walk(registry);\n}\n"],"mappings":";;;;;;;;;AAqBA,SAAgB,yBACd,IACA,SACA,UACA,QACA,cACM;CAEN,MAAM,mBAAmB,UAAkB,SAAmB;EAC5D,KAAK,MAAM,CAAC,KAAK,YAAY,OAAO,QAAQ,QAAQ,GAAG;GACrD,IAAI,QAAQ,KAEV;GAGF,KAAK,KAAK,GAAG;GACb,IAAI,UAAU,OAAO,GAAG;IACtB,MAAM,UAAU,iBAAiB,KAAK,IAAI;IAC1C,aAAa,WAAW,sBACtB,IACA,SACA,QACA,OACF;GACF,OAAO,IAAI,OAAO,YAAY,YAAY;IACxC,MAAM,UAAU,iBAAiB,KAAK,IAAI;IAC1C,aAAa,WAAW,wBACtB,IAEA,SACA,QACA,OACF;GACF,OAAO,IAAI,YAAY,QAAQ,OAAO,YAAY,UAChD,gBAAgB,SAAS,IAAI;GAE/B,KAAK,IAAI;EACX;CACF;CAEA,gBAAgB,UAAU,CAAC,CAAC;AAC9B;AAEA,SAAS,sBAMP,IACA,SACA,QACA,SAIqC;CACrC,OAAO,OACL,OACA,SACsC;EACtC,MAAM,KAAK,IAAI,gBAAgB,IAAI,OAAO,MAAM;EAEhD,OAAO,MAAM,QAAQ,GAAG;GAChB;GACN,KAAK;GACD;EACN,CAAC;CACH;AACF;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,SAAgB,uBACd,QACA,UACA,SACA,IACyC;CACzC,MAAM,EAAC,uBAAuB,UAAS;CAEvC,MAAM,qBAAqB,GACxB,qBAAqB,uBAClB,gBAAgB,MAAM,UAIpB,QAAQ,OACN,IAAI,YAAY;EACd,MAAM;EACN,SAAS;CACX,CAAC,CACH,EACR;CAEA,IAAI,UACF,IAAI,kBAAkB,QAAQ,GAC5B,0BACE,IACA,SACA,UACA,QACA,kBACF;MAEA,yBACE,IACA,SACA,UACA,QACA,kBACF;CAIJ,OAAO;AACT;;;;;AAMA,SAAS,0BACP,IACA,SACA,UACA,QACA,cACM;CACN,MAAM,QAAQ,SAAkB;EAC9B,IAAI,OAAO,SAAS,YAAY,SAAS,MACvC;EAEF,KAAK,MAAM,SAAS,OAAO,OAAO,IAAI,GACpC,IAAI,UAAa,KAAK,GAEpB,aAAa,MAAM,gBACjB,OACA,SACsC;GACtC,MAAM,KAAK,IAAI,gBAAgB,IAAI,OAAO,MAAM;GAChD,OAAO,MAAM,GAAG;IAAC;IAAM,KAAK;IAAS;GAAE,CAAC;EAC1C;OACK,IAAI,OAAO,UAAU,YAAY,UAAU,MAEhD,KAAK,KAAK;CAGhB;CACA,KAAK,QAAQ;AACf"}
1
+ {"version":3,"file":"make-replicache-mutators.js","names":["makeReplicacheMutatorLegacy","ClientErrorKind.Internal"],"sources":["../../../../../zero-client/src/client/make-replicache-mutators.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport type {MutatorDefs} from '../../../replicache/src/types.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport {CRUD_MUTATION_NAME} from '../../../zero-protocol/src/mutation.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {customMutatorKey} from '../../../zql/src/mutate/custom.ts';\nimport {\n isMutatorRegistry,\n type AnyMutatorRegistry,\n} from '../../../zql/src/mutate/mutator-registry.ts';\nimport {isMutator, type Mutator} from '../../../zql/src/mutate/mutator.ts';\nimport {ClientErrorKind} from './client-error-kind.ts';\nimport {makeCRUDMutator, type CRUDMutator} from './crud.ts';\nimport type {CustomMutatorDefs, CustomMutatorImpl} from './custom.ts';\nimport {\n makeReplicacheMutator as makeReplicacheMutatorLegacy,\n TransactionImpl,\n} from './custom.ts';\nimport {ClientError} from './error.ts';\nimport type {WriteTransaction} from './replicache-types.ts';\n\nexport function extendReplicacheMutators<S extends Schema, C>(\n lc: LogContext,\n context: C,\n mutators: AnyMutatorRegistry | CustomMutatorDefs,\n schema: S,\n mutateObject: Record<string, unknown>,\n): void {\n // Recursively process mutator definitions at arbitrary depth\n const processMutators = (mutators: object, path: string[]) => {\n for (const [key, mutator] of Object.entries(mutators)) {\n if (key === '~') {\n // Skip phantom type\n continue;\n }\n\n path.push(key);\n if (isMutator(mutator)) {\n const fullKey = customMutatorKey('.', path);\n mutateObject[fullKey] = makeReplicacheMutator(\n lc,\n mutator,\n schema,\n context,\n );\n } else if (typeof mutator === 'function') {\n const fullKey = customMutatorKey('|', path);\n mutateObject[fullKey] = makeReplicacheMutatorLegacy(\n lc,\n // oxlint-disable-next-line no-explicit-any\n mutator as CustomMutatorImpl<any>,\n schema,\n context,\n );\n } else if (mutator !== null && typeof mutator === 'object') {\n processMutators(mutator, path);\n }\n path.pop();\n }\n };\n\n processMutators(mutators, []);\n}\n\nfunction makeReplicacheMutator<\n TArgs extends ReadonlyJSONValue | undefined,\n TSchema extends Schema,\n TContext,\n TWrappedTransaction,\n>(\n lc: LogContext,\n mutator: Mutator<TArgs, TSchema, TContext, TWrappedTransaction>,\n schema: TSchema,\n context: TContext,\n): (\n repTx: WriteTransaction,\n args: ReadonlyJSONValue,\n) => Promise<ReadonlyJSONValue | void> {\n return async (\n repTx: WriteTransaction,\n args: ReadonlyJSONValue,\n ): Promise<ReadonlyJSONValue | void> => {\n const tx = new TransactionImpl(lc, repTx, schema);\n // fn does input validation internally\n return await mutator.fn({\n args: args as TArgs,\n ctx: context,\n tx: tx,\n });\n };\n}\n\n/**\n * Creates Replicache mutators from mutator definitions.\n *\n * This function processes mutator definitions at arbitrary depth, supporting both\n * new-style mutator definitions and legacy custom mutator implementations. It creates\n * a mutator object with the CRUD mutator and any provided custom mutators, with keys\n * generated based on their path in the mutator definition hierarchy.\n *\n * @template S - The schema type that defines the structure of the data\n * @template C - The type of the context object passed to mutators\n *\n * @param schema - The schema instance used for validation and type checking\n * @param mutators - The mutator definitions to process, can be nested objects or custom mutator definitions\n * @param context - The context to be passed to mutators\n * @param lc - The log context used for logging operations\n *\n * @returns A mutator definitions object containing the CRUD mutator and any custom mutators\n *\n * @remarks\n * - New-style mutator definitions use '.' as a separator in their keys\n * - Legacy custom mutator implementations use '|' as a separator in their keys\n * - The CRUD mutator can be disabled by setting `enableLegacyMutators: false` in the schema\n */\nexport function makeReplicacheMutators<const S extends Schema, C>(\n schema: S,\n mutators: AnyMutatorRegistry | CustomMutatorDefs | undefined,\n context: C,\n lc: LogContext,\n): MutatorDefs & {_zero_crud: CRUDMutator} {\n const {enableLegacyMutators = false} = schema;\n\n const replicacheMutators = {\n [CRUD_MUTATION_NAME]: enableLegacyMutators\n ? makeCRUDMutator(schema)\n : // TODO(arv): This code is unreachable since the public API prevents\n // calling CRUD mutators when enableLegacyMutators is false. Remove this.\n () =>\n Promise.reject(\n new ClientError({\n kind: ClientErrorKind.Internal,\n message: 'Zero CRUD mutators are not enabled.',\n }),\n ),\n };\n\n if (mutators) {\n if (isMutatorRegistry(mutators)) {\n extendFromMutatorRegistry(\n lc,\n context,\n mutators,\n schema,\n replicacheMutators,\n );\n } else {\n extendReplicacheMutators(\n lc,\n context,\n mutators as CustomMutatorDefs,\n schema,\n replicacheMutators,\n );\n }\n }\n\n return replicacheMutators;\n}\n\n/**\n * Extends replicache mutators from a MutatorRegistry.\n * Walks the registry tree and wraps each Mutator.fn for Replicache.\n */\nfunction extendFromMutatorRegistry<S extends Schema, C>(\n lc: LogContext,\n context: C,\n registry: AnyMutatorRegistry,\n schema: S,\n mutateObject: Record<string, unknown>,\n): void {\n const walk = (node: unknown) => {\n if (typeof node !== 'object' || node === null) {\n return;\n }\n for (const value of Object.values(node)) {\n if (isMutator<S>(value)) {\n // Mutator.fn already handles validation internally\n mutateObject[value.mutatorName] = (\n repTx: WriteTransaction,\n args: ReadonlyJSONValue,\n ): Promise<ReadonlyJSONValue | void> => {\n const tx = new TransactionImpl(lc, repTx, schema);\n return value.fn({args, ctx: context, tx});\n };\n } else if (typeof value === 'object' && value !== null) {\n // Nested namespace\n walk(value);\n }\n }\n };\n walk(registry);\n}\n"],"mappings":";;;;;;;;;AAqBA,SAAgB,yBACd,IACA,SACA,UACA,QACA,cACM;CAEN,MAAM,mBAAmB,UAAkB,SAAmB;EAC5D,KAAK,MAAM,CAAC,KAAK,YAAY,OAAO,QAAQ,QAAQ,GAAG;GACrD,IAAI,QAAQ,KAEV;GAGF,KAAK,KAAK,GAAG;GACb,IAAI,UAAU,OAAO,GAAG;IACtB,MAAM,UAAU,iBAAiB,KAAK,IAAI;IAC1C,aAAa,WAAW,sBACtB,IACA,SACA,QACA,OACF;GACF,OAAO,IAAI,OAAO,YAAY,YAAY;IACxC,MAAM,UAAU,iBAAiB,KAAK,IAAI;IAC1C,aAAa,WAAWA,wBACtB,IAEA,SACA,QACA,OACF;GACF,OAAO,IAAI,YAAY,QAAQ,OAAO,YAAY,UAChD,gBAAgB,SAAS,IAAI;GAE/B,KAAK,IAAI;EACX;CACF;CAEA,gBAAgB,UAAU,CAAC,CAAC;AAC9B;AAEA,SAAS,sBAMP,IACA,SACA,QACA,SAIqC;CACrC,OAAO,OACL,OACA,SACsC;EACtC,MAAM,KAAK,IAAI,gBAAgB,IAAI,OAAO,MAAM;EAEhD,OAAO,MAAM,QAAQ,GAAG;GAChB;GACN,KAAK;GACD;EACN,CAAC;CACH;AACF;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,SAAgB,uBACd,QACA,UACA,SACA,IACyC;CACzC,MAAM,EAAC,uBAAuB,UAAS;CAEvC,MAAM,qBAAqB,GACxB,qBAAqB,uBAClB,gBAAgB,MAAM,UAIpB,QAAQ,OACN,IAAI,YAAY;EACd,MAAMC;EACN,SAAS;CACX,CAAC,CACH,EACR;CAEA,IAAI,UAAU;EACZ,IAAI,kBAAkB,QAAQ,GAC5B,0BACE,IACA,SACA,UACA,QACA,kBACF;OAEA,yBACE,IACA,SACA,UACA,QACA,kBACF;CAEJ;CAEA,OAAO;AACT;;;;;AAMA,SAAS,0BACP,IACA,SACA,UACA,QACA,cACM;CACN,MAAM,QAAQ,SAAkB;EAC9B,IAAI,OAAO,SAAS,YAAY,SAAS,MACvC;EAEF,KAAK,MAAM,SAAS,OAAO,OAAO,IAAI,GACpC,IAAI,UAAa,KAAK,GAEpB,aAAa,MAAM,gBACjB,OACA,SACsC;GACtC,MAAM,KAAK,IAAI,gBAAgB,IAAI,OAAO,MAAM;GAChD,OAAO,MAAM,GAAG;IAAC;IAAM,KAAK;IAAS;GAAE,CAAC;EAC1C;OACK,IAAI,OAAO,UAAU,YAAY,UAAU,MAEhD,KAAK,KAAK;CAGhB;CACA,KAAK,QAAQ;AACf"}
@@ -2,7 +2,7 @@ import { AbruptClose, CleanClose, ClientClosed, Hidden, UserDisconnect } from ".
2
2
  import { isClientError, isServerError } from "./error.js";
3
3
  import { LastConnectError, LastConnectErrorV2, NotConnected, TimeToConnectMs, TimeToConnectMsV2, TotalTimeToConnectMs } from "./metric-name-enum.js";
4
4
  //#region ../zero-client/src/client/metrics.ts
5
- var DID_NOT_CONNECT_VALUE = 100 * 1e3;
5
+ var DID_NOT_CONNECT_VALUE = 1e5;
6
6
  var REPORT_INTERVAL_MS = 5e3;
7
7
  function getLastConnectErrorValue(reason) {
8
8
  return `${isServerError(reason) ? "server_" : "client_"}${camelToSnake(reason.kind)}`;
@@ -80,9 +80,7 @@ var MetricManager = class {
80
80
  case "error":
81
81
  notConnectedReason = "hidden_was_error";
82
82
  break;
83
- default:
84
- notConnectedReason = "hidden";
85
- break;
83
+ default: notConnectedReason = "hidden";
86
84
  }
87
85
  this.#setNotConnectedReason(notConnectedReason);
88
86
  }
@@ -218,6 +216,6 @@ var State = class {
218
216
  }
219
217
  };
220
218
  //#endregion
221
- export { DID_NOT_CONNECT_VALUE, MetricManager, REPORT_INTERVAL_MS, getLastConnectErrorValue, shouldReportConnectError };
219
+ export { DID_NOT_CONNECT_VALUE, Gauge, MetricManager, REPORT_INTERVAL_MS, State, getLastConnectErrorValue, shouldReportConnectError };
222
220
 
223
221
  //# sourceMappingURL=metrics.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","names":["#reportIntervalMs","#host","#reporter","#lc","#setNotConnectedReason","#timerID","#register","#notConnected","#timeToConnectMsV2","#lastConnectErrorV2","#totalTimeToConnectMs","#metrics","#name","#value","#prefix","#clearOnFlush","#current"],"sources":["../../../../../zero-client/src/client/metrics.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport type {MaybePromise} from '../../../shared/src/types.ts';\nimport {ClientErrorKind} from './client-error-kind.ts';\nimport {\n isClientError,\n isServerError,\n type ZeroError,\n type ZeroErrorKind,\n} from './error.ts';\nimport {MetricName} from './metric-name.ts';\n\n// This value is used to indicate that the client's last connection attempt\n// failed. We don't make this -1 because we want to stack this never connected\n// state in a graph on top of actual connection times, so it should be greater\n// than any other value.\nexport const DID_NOT_CONNECT_VALUE = 100 * 1000;\n\nexport const REPORT_INTERVAL_MS = 5_000;\n\ntype NotConnectedReason =\n | 'init'\n | 'error'\n | 'hidden'\n | 'hidden_was_init'\n | 'hidden_was_error';\n\nexport function getLastConnectErrorValue(reason: ZeroError) {\n return `${isServerError(reason) ? 'server_' : 'client_'}${camelToSnake(reason.kind)}` as const;\n}\n\nconst upperCasesRegExp = /\\.?(?=[A-Z])/;\n\n// camelToSnake is used to convert a ZeroErrorKind into a suitable\n// metric name, eg AuthInvalidated => auth_invalidated. It converts\n// both PascalCase and camelCase to snake_case.\nfunction camelToSnake(kind: ZeroErrorKind): string {\n return kind.split(upperCasesRegExp).join('_').toLowerCase();\n}\n\n/**\n * Returns whether an error should be reported in metrics and\n * increment the connect error count.\n *\n * Returns `true` for all server errors and client errors that represent actual\n * connection problems. Returns `false` for expected client-side disconnections\n * (user disconnect, client closed, hidden tab, clean/abrupt close).\n */\nexport function shouldReportConnectError(reason: ZeroError): boolean {\n if (!isClientError(reason)) {\n return true;\n }\n switch (reason.kind) {\n case ClientErrorKind.Hidden:\n case ClientErrorKind.ClientClosed:\n case ClientErrorKind.UserDisconnect:\n case ClientErrorKind.CleanClose:\n case ClientErrorKind.AbruptClose:\n return false;\n default:\n return true;\n }\n}\n\ntype MetricsReporter = (metrics: Series[]) => MaybePromise<void>;\n\nexport type MetricManagerOptions = {\n reportIntervalMs: number;\n host: string;\n source: string;\n reporter: MetricsReporter;\n lc: LogContext;\n};\n\n/**\n * MetricManager keeps track of the set of metrics in use and flushes them\n * to a format suitable for reporting.\n */\nexport class MetricManager {\n #reportIntervalMs: number;\n #host: string;\n #reporter: MetricsReporter;\n #lc: LogContext;\n #timerID: ReturnType<typeof setInterval> | null;\n\n constructor(opts: MetricManagerOptions) {\n this.#reportIntervalMs = opts.reportIntervalMs;\n this.#host = opts.host;\n this.#reporter = opts.reporter;\n this.#lc = opts.lc;\n\n this.tags.push(`source:${opts.source}`);\n\n this.timeToConnectMs.set(DID_NOT_CONNECT_VALUE);\n this.#setNotConnectedReason('init');\n\n this.#timerID = setInterval(() => {\n void this.flush();\n }, this.#reportIntervalMs);\n }\n\n #metrics: Flushable[] = [];\n\n // timeToConnectMs measures the time from the call to connect() to receiving\n // the 'connected' ws message. We record the DID_NOT_CONNECT_VALUE if the previous\n // connection attempt failed for any reason.\n //\n // We set the gauge using #connectStart as follows:\n // - #connectStart is undefined if we are disconnected or connected; it is\n // defined only in the Connecting state, as a number representing the timestamp\n // at which we started connecting.\n // - #connectStart is set to the current time when connect() is called.\n // - When we receive the 'connected' message we record the time to connect and\n // set #connectStart to undefined.\n // - If disconnect() is called with a defined #connectStart then we record\n // DID_NOT_CONNECT_VALUE and set #connectStart to undefined.\n //\n // TODO: this should be folded into the ConnectionManager.\n readonly timeToConnectMs = this.#register(\n new Gauge(MetricName.TimeToConnectMs),\n );\n\n // lastConnectError records the last error that occurred when connecting,\n // if any. It is cleared when connecting successfully or when reported, so this\n // state only gets reported if there was a failure during the reporting period and\n // we are still not connected.\n readonly lastConnectError = this.#register(\n new State(\n MetricName.LastConnectError,\n true, // clearOnFlush\n ),\n );\n\n // notConnected records the reason why the client is not currently connected.\n // It is cleared when the client successfully connects.\n readonly #notConnected = this.#register(new State(MetricName.NotConnected));\n\n // The time from the call to connect() to receiving the 'connected' ws message\n // for the current connection. Cleared when the client is not connected.\n // TODO: Not actually currently cleared on disconnect untill there is a\n // connect error, or client reports disconnected and waiting for visible.\n // Should have a value iff _notConnected has no value.\n readonly #timeToConnectMsV2 = this.#register(\n new Gauge(MetricName.TimeToConnectMsV2),\n );\n\n // lastConnectErrorV2 records the last error that occurred when connecting,\n // if any. It is cleared when the client successfully connects or\n // stops trying to connect due to being hidden.\n // Should have a value iff notConnected state is NotConnectedReason.Error.\n readonly #lastConnectErrorV2 = this.#register(\n new State(MetricName.LastConnectErrorV2),\n );\n\n // The total time it took to connect across retries for the current\n // connection. Cleared when the client is not connected.\n // TODO: Not actually currently cleared on disconnect until there is a\n // connect error, or client reports disconnected and waiting for visible.\n // See Zero.#totalToConnectStart for details of how this total is computed.\n // Should have a value iff _notConnected has no value.\n readonly #totalTimeToConnectMs = this.#register(\n new Gauge(MetricName.TotalTimeToConnectMs),\n );\n\n #setNotConnectedReason(reason: NotConnectedReason) {\n this.#notConnected.set(reason);\n }\n\n setConnected(timeToConnectMs: number, totalTimeToConnectMs: number) {\n this.#notConnected.clear();\n this.#lastConnectErrorV2.clear();\n this.#timeToConnectMsV2.set(timeToConnectMs);\n this.#totalTimeToConnectMs.set(totalTimeToConnectMs);\n }\n\n setDisconnectedWaitingForVisible() {\n this.#timeToConnectMsV2.clear();\n this.#totalTimeToConnectMs.clear();\n this.#lastConnectErrorV2.clear();\n let notConnectedReason: NotConnectedReason;\n switch (this.#notConnected.get()) {\n case 'init':\n notConnectedReason = 'hidden_was_init';\n break;\n case 'error':\n notConnectedReason = 'hidden_was_error';\n break;\n default:\n notConnectedReason = 'hidden';\n break;\n }\n this.#setNotConnectedReason(notConnectedReason);\n }\n\n setConnectError(reason: ZeroError) {\n this.#timeToConnectMsV2.clear();\n this.#totalTimeToConnectMs.clear();\n this.#setNotConnectedReason('error');\n this.#lastConnectErrorV2.set(getLastConnectErrorValue(reason));\n }\n\n /**\n * Tags to include in all metrics.\n */\n readonly tags: string[] = [];\n\n // Flushes all metrics to an array of time series (plural), one Series\n // per metric.\n async flush() {\n const lc = this.#lc;\n if (this.#timerID === null) {\n lc.error?.('MetricManager.flush() called but already stopped');\n return;\n }\n const allSeries: Series[] = [];\n for (const metric of this.#metrics) {\n const series = metric.flush();\n if (series !== undefined) {\n allSeries.push({\n ...series,\n host: this.#host,\n tags: this.tags,\n });\n }\n }\n if (allSeries.length === 0) {\n lc?.debug?.('No metrics to report');\n return;\n }\n try {\n await this.#reporter(allSeries);\n } catch (e) {\n lc?.error?.('Error reporting metrics', e);\n }\n }\n\n stop() {\n if (this.#timerID === null) {\n this.#lc.error?.('MetricManager.stop() called but already stopped');\n return;\n }\n clearInterval(this.#timerID);\n this.#timerID = null;\n }\n\n #register<M extends Flushable>(metric: M) {\n this.#metrics.push(metric);\n return metric;\n }\n}\n\n// These two types are influenced by Datadog's API's needs. We could change what\n// we use internally if necessary, but we'd just have to convert to/from before\n// sending to DD. So for convenience we go with their format.\n\n/** Series is a time series of points for a single metric. */\nexport type Series = {\n host: string;\n metric: string; // We call this 'name' bc 'metric' is overloaded in code.\n points: Point[];\n tags?: string[];\n};\n/**\n * A point is a second-resolution timestamp and a set of values for that\n * timestamp. A point represents exactly one second in time and the values\n * are those recorded for that second. The first element of this array\n * is the timestamp and the second element is an array of values.\n */\nexport type Point = [number, number[]];\n\nfunction makePoint(ts: number, value: number): Point {\n return [ts, [value]];\n}\n\ntype Flushable = {\n flush(): Pick<Series, 'metric' | 'points'> | undefined;\n};\n\n/**\n * Gauge is a metric type that represents a single value that can go up and\n * down. It's typically used to track discrete values or counts eg the number\n * of active users, number of connections, cpu load, etc. A gauge retains\n * its value when flushed.\n *\n * We use a Gauge to sample at the client. If we are interested in tracking\n * a metric value *per client*, the client can note the latest value in\n * a Gauge metric. The metric is periodically reported via Reporter. On the\n * server, we graph the value of the metric rolled up over the periodic\n * reporting period, that is, counted over a span of time equal to the\n * reporting period. The result is ~one point per client per reporting\n * period.\n */\nexport class Gauge implements Flushable {\n readonly #name: string;\n #value: number | undefined = undefined;\n\n constructor(name: string) {\n this.#name = name;\n }\n\n set(value: number) {\n this.#value = value;\n }\n\n get() {\n return this.#value;\n }\n\n clear() {\n this.#value = undefined;\n }\n\n flush() {\n if (this.#value === undefined) {\n return undefined;\n }\n // Gauge reports the timestamp at flush time, not at the point the value was\n // recorded.\n const points = [makePoint(t(), this.#value)];\n return {metric: this.#name, points};\n }\n}\n\nfunction t() {\n return Math.round(Date.now() / 1000);\n}\n\n/**\n * State is a metric type that represents a specific state that the system is\n * in, for example the state of a connection which may be 'open' or 'closed'.\n * The state is given a name/prefix at construction time (eg 'connection') and\n * then can be set to a specific state (eg 'open'). The prefix is prepended to\n * the set state (eg, 'connection_open') and a value of 1 is reported.\n * Unset/cleared states are not reported.\n *\n * Example:\n * const s = new State('connection');\n * s.set('open');\n * s.flush(); // returns {metric: 'connection_open', points: [[now(), [1]]]}\n */\nexport class State implements Flushable {\n readonly #prefix: string;\n readonly #clearOnFlush: boolean;\n #current: string | undefined = undefined;\n\n constructor(prefix: string, clearOnFlush = false) {\n this.#prefix = prefix;\n this.#clearOnFlush = clearOnFlush;\n }\n\n set(state: string) {\n this.#current = state;\n }\n\n get() {\n return this.#current;\n }\n\n clear() {\n this.#current = undefined;\n }\n\n flush() {\n if (this.#current === undefined) {\n return undefined;\n }\n const gauge = new Gauge([this.#prefix, this.#current].join('_'));\n gauge.set(1);\n const series = gauge.flush();\n if (this.#clearOnFlush) {\n this.clear();\n }\n return series;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"metrics.js","names":["ClientErrorKind.Hidden","ClientErrorKind.ClientClosed","ClientErrorKind.UserDisconnect","ClientErrorKind.CleanClose","ClientErrorKind.AbruptClose","MetricName.TimeToConnectMs","MetricName.LastConnectError","MetricName.NotConnected","MetricName.TimeToConnectMsV2","MetricName.LastConnectErrorV2","MetricName.TotalTimeToConnectMs"],"sources":["../../../../../zero-client/src/client/metrics.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport type {MaybePromise} from '../../../shared/src/types.ts';\nimport {ClientErrorKind} from './client-error-kind.ts';\nimport {\n isClientError,\n isServerError,\n type ZeroError,\n type ZeroErrorKind,\n} from './error.ts';\nimport {MetricName} from './metric-name.ts';\n\n// This value is used to indicate that the client's last connection attempt\n// failed. We don't make this -1 because we want to stack this never connected\n// state in a graph on top of actual connection times, so it should be greater\n// than any other value.\nexport const DID_NOT_CONNECT_VALUE = 100 * 1000;\n\nexport const REPORT_INTERVAL_MS = 5_000;\n\ntype NotConnectedReason =\n | 'init'\n | 'error'\n | 'hidden'\n | 'hidden_was_init'\n | 'hidden_was_error';\n\nexport function getLastConnectErrorValue(reason: ZeroError) {\n return `${isServerError(reason) ? 'server_' : 'client_'}${camelToSnake(reason.kind)}` as const;\n}\n\nconst upperCasesRegExp = /\\.?(?=[A-Z])/;\n\n// camelToSnake is used to convert a ZeroErrorKind into a suitable\n// metric name, eg AuthInvalidated => auth_invalidated. It converts\n// both PascalCase and camelCase to snake_case.\nfunction camelToSnake(kind: ZeroErrorKind): string {\n return kind.split(upperCasesRegExp).join('_').toLowerCase();\n}\n\n/**\n * Returns whether an error should be reported in metrics and\n * increment the connect error count.\n *\n * Returns `true` for all server errors and client errors that represent actual\n * connection problems. Returns `false` for expected client-side disconnections\n * (user disconnect, client closed, hidden tab, clean/abrupt close).\n */\nexport function shouldReportConnectError(reason: ZeroError): boolean {\n if (!isClientError(reason)) {\n return true;\n }\n switch (reason.kind) {\n case ClientErrorKind.Hidden:\n case ClientErrorKind.ClientClosed:\n case ClientErrorKind.UserDisconnect:\n case ClientErrorKind.CleanClose:\n case ClientErrorKind.AbruptClose:\n return false;\n default:\n return true;\n }\n}\n\ntype MetricsReporter = (metrics: Series[]) => MaybePromise<void>;\n\nexport type MetricManagerOptions = {\n reportIntervalMs: number;\n host: string;\n source: string;\n reporter: MetricsReporter;\n lc: LogContext;\n};\n\n/**\n * MetricManager keeps track of the set of metrics in use and flushes them\n * to a format suitable for reporting.\n */\nexport class MetricManager {\n #reportIntervalMs: number;\n #host: string;\n #reporter: MetricsReporter;\n #lc: LogContext;\n #timerID: ReturnType<typeof setInterval> | null;\n\n constructor(opts: MetricManagerOptions) {\n this.#reportIntervalMs = opts.reportIntervalMs;\n this.#host = opts.host;\n this.#reporter = opts.reporter;\n this.#lc = opts.lc;\n\n this.tags.push(`source:${opts.source}`);\n\n this.timeToConnectMs.set(DID_NOT_CONNECT_VALUE);\n this.#setNotConnectedReason('init');\n\n this.#timerID = setInterval(() => {\n void this.flush();\n }, this.#reportIntervalMs);\n }\n\n #metrics: Flushable[] = [];\n\n // timeToConnectMs measures the time from the call to connect() to receiving\n // the 'connected' ws message. We record the DID_NOT_CONNECT_VALUE if the previous\n // connection attempt failed for any reason.\n //\n // We set the gauge using #connectStart as follows:\n // - #connectStart is undefined if we are disconnected or connected; it is\n // defined only in the Connecting state, as a number representing the timestamp\n // at which we started connecting.\n // - #connectStart is set to the current time when connect() is called.\n // - When we receive the 'connected' message we record the time to connect and\n // set #connectStart to undefined.\n // - If disconnect() is called with a defined #connectStart then we record\n // DID_NOT_CONNECT_VALUE and set #connectStart to undefined.\n //\n // TODO: this should be folded into the ConnectionManager.\n readonly timeToConnectMs = this.#register(\n new Gauge(MetricName.TimeToConnectMs),\n );\n\n // lastConnectError records the last error that occurred when connecting,\n // if any. It is cleared when connecting successfully or when reported, so this\n // state only gets reported if there was a failure during the reporting period and\n // we are still not connected.\n readonly lastConnectError = this.#register(\n new State(\n MetricName.LastConnectError,\n true, // clearOnFlush\n ),\n );\n\n // notConnected records the reason why the client is not currently connected.\n // It is cleared when the client successfully connects.\n readonly #notConnected = this.#register(new State(MetricName.NotConnected));\n\n // The time from the call to connect() to receiving the 'connected' ws message\n // for the current connection. Cleared when the client is not connected.\n // TODO: Not actually currently cleared on disconnect untill there is a\n // connect error, or client reports disconnected and waiting for visible.\n // Should have a value iff _notConnected has no value.\n readonly #timeToConnectMsV2 = this.#register(\n new Gauge(MetricName.TimeToConnectMsV2),\n );\n\n // lastConnectErrorV2 records the last error that occurred when connecting,\n // if any. It is cleared when the client successfully connects or\n // stops trying to connect due to being hidden.\n // Should have a value iff notConnected state is NotConnectedReason.Error.\n readonly #lastConnectErrorV2 = this.#register(\n new State(MetricName.LastConnectErrorV2),\n );\n\n // The total time it took to connect across retries for the current\n // connection. Cleared when the client is not connected.\n // TODO: Not actually currently cleared on disconnect until there is a\n // connect error, or client reports disconnected and waiting for visible.\n // See Zero.#totalToConnectStart for details of how this total is computed.\n // Should have a value iff _notConnected has no value.\n readonly #totalTimeToConnectMs = this.#register(\n new Gauge(MetricName.TotalTimeToConnectMs),\n );\n\n #setNotConnectedReason(reason: NotConnectedReason) {\n this.#notConnected.set(reason);\n }\n\n setConnected(timeToConnectMs: number, totalTimeToConnectMs: number) {\n this.#notConnected.clear();\n this.#lastConnectErrorV2.clear();\n this.#timeToConnectMsV2.set(timeToConnectMs);\n this.#totalTimeToConnectMs.set(totalTimeToConnectMs);\n }\n\n setDisconnectedWaitingForVisible() {\n this.#timeToConnectMsV2.clear();\n this.#totalTimeToConnectMs.clear();\n this.#lastConnectErrorV2.clear();\n let notConnectedReason: NotConnectedReason;\n switch (this.#notConnected.get()) {\n case 'init':\n notConnectedReason = 'hidden_was_init';\n break;\n case 'error':\n notConnectedReason = 'hidden_was_error';\n break;\n default:\n notConnectedReason = 'hidden';\n break;\n }\n this.#setNotConnectedReason(notConnectedReason);\n }\n\n setConnectError(reason: ZeroError) {\n this.#timeToConnectMsV2.clear();\n this.#totalTimeToConnectMs.clear();\n this.#setNotConnectedReason('error');\n this.#lastConnectErrorV2.set(getLastConnectErrorValue(reason));\n }\n\n /**\n * Tags to include in all metrics.\n */\n readonly tags: string[] = [];\n\n // Flushes all metrics to an array of time series (plural), one Series\n // per metric.\n async flush() {\n const lc = this.#lc;\n if (this.#timerID === null) {\n lc.error?.('MetricManager.flush() called but already stopped');\n return;\n }\n const allSeries: Series[] = [];\n for (const metric of this.#metrics) {\n const series = metric.flush();\n if (series !== undefined) {\n allSeries.push({\n ...series,\n host: this.#host,\n tags: this.tags,\n });\n }\n }\n if (allSeries.length === 0) {\n lc?.debug?.('No metrics to report');\n return;\n }\n try {\n await this.#reporter(allSeries);\n } catch (e) {\n lc?.error?.('Error reporting metrics', e);\n }\n }\n\n stop() {\n if (this.#timerID === null) {\n this.#lc.error?.('MetricManager.stop() called but already stopped');\n return;\n }\n clearInterval(this.#timerID);\n this.#timerID = null;\n }\n\n #register<M extends Flushable>(metric: M) {\n this.#metrics.push(metric);\n return metric;\n }\n}\n\n// These two types are influenced by Datadog's API's needs. We could change what\n// we use internally if necessary, but we'd just have to convert to/from before\n// sending to DD. So for convenience we go with their format.\n\n/** Series is a time series of points for a single metric. */\nexport type Series = {\n host: string;\n metric: string; // We call this 'name' bc 'metric' is overloaded in code.\n points: Point[];\n tags?: string[];\n};\n/**\n * A point is a second-resolution timestamp and a set of values for that\n * timestamp. A point represents exactly one second in time and the values\n * are those recorded for that second. The first element of this array\n * is the timestamp and the second element is an array of values.\n */\nexport type Point = [number, number[]];\n\nfunction makePoint(ts: number, value: number): Point {\n return [ts, [value]];\n}\n\ntype Flushable = {\n flush(): Pick<Series, 'metric' | 'points'> | undefined;\n};\n\n/**\n * Gauge is a metric type that represents a single value that can go up and\n * down. It's typically used to track discrete values or counts eg the number\n * of active users, number of connections, cpu load, etc. A gauge retains\n * its value when flushed.\n *\n * We use a Gauge to sample at the client. If we are interested in tracking\n * a metric value *per client*, the client can note the latest value in\n * a Gauge metric. The metric is periodically reported via Reporter. On the\n * server, we graph the value of the metric rolled up over the periodic\n * reporting period, that is, counted over a span of time equal to the\n * reporting period. The result is ~one point per client per reporting\n * period.\n */\nexport class Gauge implements Flushable {\n readonly #name: string;\n #value: number | undefined = undefined;\n\n constructor(name: string) {\n this.#name = name;\n }\n\n set(value: number) {\n this.#value = value;\n }\n\n get() {\n return this.#value;\n }\n\n clear() {\n this.#value = undefined;\n }\n\n flush() {\n if (this.#value === undefined) {\n return undefined;\n }\n // Gauge reports the timestamp at flush time, not at the point the value was\n // recorded.\n const points = [makePoint(t(), this.#value)];\n return {metric: this.#name, points};\n }\n}\n\nfunction t() {\n return Math.round(Date.now() / 1000);\n}\n\n/**\n * State is a metric type that represents a specific state that the system is\n * in, for example the state of a connection which may be 'open' or 'closed'.\n * The state is given a name/prefix at construction time (eg 'connection') and\n * then can be set to a specific state (eg 'open'). The prefix is prepended to\n * the set state (eg, 'connection_open') and a value of 1 is reported.\n * Unset/cleared states are not reported.\n *\n * Example:\n * const s = new State('connection');\n * s.set('open');\n * s.flush(); // returns {metric: 'connection_open', points: [[now(), [1]]]}\n */\nexport class State implements Flushable {\n readonly #prefix: string;\n readonly #clearOnFlush: boolean;\n #current: string | undefined = undefined;\n\n constructor(prefix: string, clearOnFlush = false) {\n this.#prefix = prefix;\n this.#clearOnFlush = clearOnFlush;\n }\n\n set(state: string) {\n this.#current = state;\n }\n\n get() {\n return this.#current;\n }\n\n clear() {\n this.#current = undefined;\n }\n\n flush() {\n if (this.#current === undefined) {\n return undefined;\n }\n const gauge = new Gauge([this.#prefix, this.#current].join('_'));\n gauge.set(1);\n const series = gauge.flush();\n if (this.#clearOnFlush) {\n this.clear();\n }\n return series;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mutation-tracker.d.ts","sourceRoot":"","sources":["../../../../../zero-client/src/client/mutation-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAGjD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,iCAAiC,CAAC;AACpE,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EACrB,MAAM,+CAA+C,CAAC;AAGvD,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AAanE,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,2CAA2C,CAAC;AAM1E,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAc,KAAK,SAAS,EAAC,MAAM,YAAY,CAAC;AAGvD,KAAK,mBAAmB,GAAG,iBAAiB,GAAG,SAAS,CAAC;AAQzD;;GAEG;AACH,qBAAa,eAAe;;IAmB1B,YACE,EAAE,EAAE,UAAU,EACd,YAAY,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,EACxC,YAAY,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,EAUzC;IAED,mBAAmB,CACjB,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,cAAc,CAAC,mBAAmB,CAAC,QAavD;IAED,aAAa,IAAI,oBAAoB,CAAC,mBAAmB,CAAC,CAQzD;IAED,kBAAkB,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAU5D;IAED;;;OAGG;IACH,cAAc,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,GAAG,IAAI,CAKhD;IAED;;;OAGG;IACH,6BAA6B,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CASpD;IAiDD,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAapD;IA0CD;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,WAAW,CAAC,cAAc,EAAE,MAAM,QAEjC;IAED;;;;;;OAMG;IACH,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAkBzC;IAED,IAAI,IAAI,WAEP;IA2JD;;;;;;;;;OASG;IACH,qBAAqB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAEhD;CAOF"}
1
+ {"version":3,"file":"mutation-tracker.d.ts","sourceRoot":"","sources":["../../../../../zero-client/src/client/mutation-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,iCAAiC,CAAC;AACpE,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EACrB,MAAM,+CAA+C,CAAC;AAGvD,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AAcnE,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,2CAA2C,CAAC;AAM1E,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAc,KAAK,SAAS,EAAC,MAAM,YAAY,CAAC;AAGvD,KAAK,mBAAmB,GAAG,iBAAiB,GAAG,SAAS,CAAC;AAQzD;;GAEG;AACH,qBAAa,eAAe;;IAmB1B,YACE,EAAE,EAAE,UAAU,EACd,YAAY,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,EACxC,YAAY,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,EAUzC;IAED,mBAAmB,CACjB,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,cAAc,CAAC,mBAAmB,CAAC,QAavD;IAED,aAAa,IAAI,oBAAoB,CAAC,mBAAmB,CAAC,CAQzD;IAED,kBAAkB,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAU5D;IAED;;;OAGG;IACH,cAAc,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,GAAG,IAAI,CAKhD;IAED;;;OAGG;IACH,6BAA6B,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CASpD;IAiDD,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAapD;IA0CD;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,WAAW,CAAC,cAAc,EAAE,MAAM,QAEjC;IAED;;;;;;OAMG;IACH,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAkBzC;IAED,IAAI,IAAI,WAEP;IA2JD;;;;;;;;;OASG;IACH,qBAAqB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAEhD;CAOF"}
@@ -1,4 +1,5 @@
1
1
  import { assert, unreachable } from "../../../shared/src/asserts.js";
2
+ import { resolver } from "../../../shared/src/resolver.js";
2
3
  import { parse } from "../../../shared/src/valita.js";
3
4
  import { must } from "../../../shared/src/must.js";
4
5
  import { getErrorDetails } from "../../../shared/src/error.js";
@@ -11,7 +12,6 @@ import { emptyObject } from "../../../shared/src/sentinels.js";
11
12
  import { mutationResultSchema } from "../../../zero-protocol/src/mutation.js";
12
13
  import { isZeroError } from "./error.js";
13
14
  import "./keys.js";
14
- import { resolver } from "@rocicorp/resolver";
15
15
  //#region ../zero-client/src/client/mutation-tracker.ts
16
16
  var currentEphemeralID = 0;
17
17
  function nextEphemeralID() {
@@ -1 +1 @@
1
- {"version":3,"file":"mutation-tracker.js","names":["#outstandingMutations","#ephemeralIDsByMutationID","#allMutationsAppliedListeners","#lc","#ackMutations","#onFatalError","#largestOutstandingMutationID","#currentMutationID","#clientID","#processMutationResponses","#settleMutation","#notifyAllMutationsAppliedListeners","#processMutationError","#processMutationOk","#fatalErrorFromPushError","#processPushOk","#resolveMutations"],"sources":["../../../../../zero-client/src/client/mutation-tracker.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport {resolver, type Resolver} from '@rocicorp/resolver';\nimport type {NoIndexDiff} from '../../../replicache/src/btree/node.ts';\nimport type {ReplicacheImpl} from '../../../replicache/src/impl.ts';\nimport type {\n EphemeralID,\n MutationTrackingData,\n} from '../../../replicache/src/replicache-options.ts';\nimport {assert, unreachable} from '../../../shared/src/asserts.ts';\nimport {getErrorDetails} from '../../../shared/src/error.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport {must} from '../../../shared/src/must.ts';\nimport {emptyObject} from '../../../shared/src/sentinels.ts';\nimport * as v from '../../../shared/src/valita.ts';\nimport {\n ApplicationError,\n isApplicationError,\n wrapWithApplicationError,\n} from '../../../zero-protocol/src/application-error.ts';\nimport {ErrorKind} from '../../../zero-protocol/src/error-kind.ts';\nimport {ErrorOrigin} from '../../../zero-protocol/src/error-origin.ts';\nimport {ErrorReason} from '../../../zero-protocol/src/error-reason.ts';\nimport {ProtocolError} from '../../../zero-protocol/src/error.ts';\nimport type {MutationID} from '../../../zero-protocol/src/mutation-id.ts';\nimport {\n mutationResultSchema,\n type MutationError,\n type MutationOk,\n} from '../../../zero-protocol/src/mutation.ts';\nimport type {\n PushError,\n PushOk,\n PushResponseBody,\n} from '../../../zero-protocol/src/push.ts';\nimport {isZeroError, type ZeroError} from './error.ts';\nimport {MUTATIONS_KEY_PREFIX} from './keys.ts';\n\ntype MutationSuccessType = ReadonlyJSONValue | undefined;\ntype MutationErrorType = ApplicationError | ZeroError;\n\nlet currentEphemeralID = 0;\nfunction nextEphemeralID(): EphemeralID {\n return ++currentEphemeralID as EphemeralID;\n}\n\n/**\n * Tracks what pushes are in-flight and resolves promises when they're acked.\n */\nexport class MutationTracker {\n readonly #outstandingMutations: Map<\n EphemeralID,\n {\n mutationID?: number | undefined;\n resolver: Resolver<MutationSuccessType, MutationErrorType>;\n }\n >;\n readonly #ephemeralIDsByMutationID: Map<number, EphemeralID>;\n readonly #allMutationsAppliedListeners: Set<() => void>;\n readonly #lc: LogContext;\n\n readonly #ackMutations: (upTo: MutationID) => void;\n readonly #onFatalError: (error: ZeroError) => void;\n\n #clientID: string | undefined;\n #largestOutstandingMutationID: number;\n #currentMutationID: number;\n\n constructor(\n lc: LogContext,\n ackMutations: (upTo: MutationID) => void,\n onFatalError: (error: ZeroError) => void,\n ) {\n this.#lc = lc.withContext('MutationTracker');\n this.#outstandingMutations = new Map();\n this.#ephemeralIDsByMutationID = new Map();\n this.#allMutationsAppliedListeners = new Set();\n this.#largestOutstandingMutationID = 0;\n this.#currentMutationID = 0;\n this.#ackMutations = ackMutations;\n this.#onFatalError = onFatalError;\n }\n\n setClientIDAndWatch(\n clientID: string,\n experimentalWatch: ReplicacheImpl['experimentalWatch'],\n ) {\n assert(this.#clientID === undefined, 'clientID already set');\n this.#clientID = clientID;\n experimentalWatch(\n diffs => {\n this.#processMutationResponses(diffs);\n },\n {\n prefix: MUTATIONS_KEY_PREFIX + clientID + '/',\n initialValuesInFirstDiff: true,\n },\n );\n }\n\n trackMutation(): MutationTrackingData<MutationSuccessType> {\n const id = nextEphemeralID();\n const mutationResolver = resolver<MutationSuccessType, MutationErrorType>();\n\n this.#outstandingMutations.set(id, {\n resolver: mutationResolver,\n });\n return {ephemeralID: id, serverPromise: mutationResolver.promise};\n }\n\n mutationIDAssigned(id: EphemeralID, mutationID: number): void {\n const entry = this.#outstandingMutations.get(id);\n if (entry) {\n entry.mutationID = mutationID;\n this.#ephemeralIDsByMutationID.set(mutationID, id);\n this.#largestOutstandingMutationID = Math.max(\n this.#largestOutstandingMutationID,\n mutationID,\n );\n }\n }\n\n /**\n * Reject the mutation due to an unhandled exception on the client.\n * The mutation must not have been persisted to the client store.\n */\n rejectMutation(id: EphemeralID, e: unknown): void {\n const entry = this.#outstandingMutations.get(id);\n if (entry) {\n this.#settleMutation(id, entry, wrapWithApplicationError(e));\n }\n }\n\n /**\n * Reject all outstanding mutations. Called when the client is in a state\n * that prevents mutations from being applied, such as offline or closed.\n */\n rejectAllOutstandingMutations(error: ZeroError): void {\n if (this.#outstandingMutations.size === 0) {\n return;\n }\n for (const [id, entry] of this.#outstandingMutations) {\n this.#settleMutation(id, entry, error);\n }\n this.#largestOutstandingMutationID = this.#currentMutationID;\n this.#notifyAllMutationsAppliedListeners();\n }\n\n /**\n * Used when zero-cache pokes down mutation results.\n */\n #processMutationResponses(diffs: NoIndexDiff): void {\n const clientID = must(this.#clientID);\n let largestLmid = 0;\n for (const diff of diffs) {\n const mutationID = Number(\n diff.key.slice(MUTATIONS_KEY_PREFIX.length + clientID.length + 1),\n );\n assert(\n !isNaN(mutationID),\n `MutationTracker received a diff with an invalid mutation ID: ${diff.key}`,\n );\n largestLmid = Math.max(largestLmid, mutationID);\n switch (diff.op) {\n case 'add': {\n // Results are stored as the server sent them, so a newer server can\n // add fields. Don't use 'strip': mutationResultSchema's OK branch\n // has no discriminator, so it would turn every error into `{}`.\n const result = v.parse(\n diff.newValue,\n mutationResultSchema,\n 'passthrough',\n );\n if ('error' in result) {\n this.#processMutationError(clientID, mutationID, result);\n } else {\n this.#processMutationOk(clientID, mutationID, result);\n }\n break;\n }\n case 'del':\n break;\n case 'change':\n throw new Error('MutationTracker does not expect change operations');\n }\n }\n\n if (largestLmid > 0) {\n this.#ackMutations({\n clientID: must(this.#clientID),\n id: largestLmid,\n });\n }\n }\n\n processPushResponse(response: PushResponseBody): void {\n if ('error' in response) {\n this.#lc.error?.(\n 'Received an error response when pushing mutations',\n response,\n );\n const fatalError = this.#fatalErrorFromPushError(response);\n if (fatalError) {\n this.#onFatalError(fatalError);\n }\n } else {\n this.#processPushOk(response);\n }\n }\n\n #fatalErrorFromPushError(error: PushError): ZeroError | undefined {\n switch (error.error) {\n case 'unsupportedPushVersion':\n return new ProtocolError({\n kind: ErrorKind.PushFailed,\n origin: ErrorOrigin.ZeroCache,\n reason: ErrorReason.Internal,\n message: `Unsupported push version`,\n mutationIDs: [],\n });\n case 'unsupportedSchemaVersion':\n return new ProtocolError({\n kind: ErrorKind.PushFailed,\n origin: ErrorOrigin.ZeroCache,\n reason: ErrorReason.Internal,\n message: `Unsupported schema version`,\n mutationIDs: [],\n });\n case 'http':\n return new ProtocolError({\n kind: ErrorKind.PushFailed,\n origin: ErrorOrigin.ZeroCache,\n reason: ErrorReason.HTTP,\n status: error.status,\n message: `Fetch from API server returned non-OK status ${error.status}: ${error.details ?? 'unknown'}`,\n mutationIDs: [],\n });\n case 'zeroPusher':\n return new ProtocolError({\n kind: ErrorKind.PushFailed,\n origin: ErrorOrigin.ZeroCache,\n reason: ErrorReason.Internal,\n message: `ZeroPusher error: ${error.details ?? 'unknown'}`,\n mutationIDs: [],\n });\n default:\n unreachable(error);\n }\n }\n\n /**\n * DEPRECATED: to be removed when we switch to fully driving\n * mutation resolution via poke.\n *\n * When we reconnect to zero-cache, we resolve all outstanding mutations\n * whose ID is less than or equal to the lastMutationID.\n *\n * The reason is that any responses the API server sent\n * to those mutations have been lost.\n *\n * An example case: the API server responds while the connection\n * is down. Those responses are lost.\n *\n * Mutations whose LMID is > the lastMutationID are not resolved\n * since they will be retried by the client, giving us another chance\n * at getting a response.\n *\n * The only way to ensure that all API server responses are\n * received would be to have the API server write them\n * to the DB while writing the LMID.\n */\n onConnected(lastMutationID: number) {\n this.lmidAdvanced(lastMutationID);\n }\n\n /**\n * lmid advance will:\n * 1. notify \"allMutationsApplied\" listeners if the lastMutationID\n * is greater than or equal to the largest outstanding mutation ID.\n * 2. resolve all mutations whose mutation ID is less than or equal to\n * the lastMutationID.\n */\n lmidAdvanced(lastMutationID: number): void {\n assert(\n lastMutationID >= this.#currentMutationID,\n 'lmid must be greater than or equal to current lmid',\n );\n if (lastMutationID === this.#currentMutationID) {\n return;\n }\n\n try {\n this.#currentMutationID = lastMutationID;\n this.#resolveMutations(lastMutationID);\n } finally {\n if (lastMutationID >= this.#largestOutstandingMutationID) {\n // this is very important otherwise we hang query de-registration\n this.#notifyAllMutationsAppliedListeners();\n }\n }\n }\n\n get size() {\n return this.#outstandingMutations.size;\n }\n\n #resolveMutations(upTo: number): void {\n // We resolve all mutations whose mutation ID is less than or equal to\n // the upTo mutation ID.\n for (const [id, entry] of this.#outstandingMutations) {\n if (entry.mutationID && entry.mutationID <= upTo) {\n this.#settleMutation(id, entry, emptyObject);\n } else {\n break; // the map is in insertion order which is in mutation ID order\n }\n }\n }\n\n #processPushOk(success: PushOk): void {\n for (const mutation of success.mutations) {\n if ('error' in mutation.result) {\n this.#processMutationError(\n mutation.id.clientID,\n mutation.id.id,\n mutation.result,\n );\n } else {\n this.#processMutationOk(\n mutation.id.clientID,\n mutation.id.id,\n mutation.result,\n );\n }\n }\n }\n\n #processMutationError(\n clientID: string,\n mid: number,\n error: MutationError | Omit<PushError, 'mutationIDs'>,\n ): void {\n assert(\n clientID === this.#clientID,\n 'received mutation for the wrong client',\n );\n\n // Each tab sends all mutations for the client group\n // and the server responds back to the individual client that actually\n // ran the mutation. This means that N clients can send the same\n // mutation concurrently. If that happens, the promise for the mutation tracked\n // by this class will try to be resolved N times.\n // Every time after the first, the ephemeral ID will not be found.\n //\n // We also reject all outstanding mutations when the client is in a state\n // that prevents mutations from being applied, such as offline or closed.\n // In this case, the ephemeral ID will also not be found.\n const ephemeralID = this.#ephemeralIDsByMutationID.get(mid);\n if (!ephemeralID) {\n this.#lc.debug?.(\n 'Mutation already resolved or rejected (e.g. due to disconnect); ignore late reject.',\n );\n return;\n }\n\n const entry = this.#outstandingMutations.get(ephemeralID);\n assert(\n entry && entry.mutationID === mid,\n `outstanding mutation not found for mutation ID ${mid} and ephemeral ID ${ephemeralID}`,\n );\n\n if (error.error === 'alreadyProcessed') {\n // An earlier push committed this mutation, but its response was lost.\n // Leave it outstanding: its persisted result (if the mutator returned\n // data) or the lastMutationID advance arrives in a poke and settles it,\n // so returned data isn't dropped.\n return;\n }\n\n this.#settleMutation(\n ephemeralID,\n entry,\n error.error === 'app'\n ? new ApplicationError(\n error.message ?? `Unknown application error: ${error.error}`,\n error.details ? {details: error.details} : undefined,\n )\n : new ProtocolError({\n kind: ErrorKind.InvalidPush,\n origin: ErrorOrigin.Server,\n reason: ErrorReason.Internal,\n message:\n error.error === 'oooMutation'\n ? 'Server reported an out-of-order mutation'\n : `Unknown fallback error with mutation ID ${mid}: ${error.error}`,\n details: getErrorDetails(error),\n }),\n );\n\n // this is included for backwards compatibility with the per-mutation fatal error responses\n if (error.error === 'oooMutation') {\n this.#onFatalError(\n new ProtocolError({\n kind: ErrorKind.InvalidPush,\n origin: ErrorOrigin.Server,\n reason: ErrorReason.Internal,\n message: 'Server reported an out-of-order mutation',\n details: error.details,\n }),\n );\n }\n }\n\n #processMutationOk(clientID: string, mid: number, result: MutationOk): void {\n assert(\n clientID === this.#clientID,\n 'received mutation for the wrong client',\n );\n\n // We reject all outstanding mutations when the client is in a state\n // that prevents mutations from being applied, such as offline or closed.\n // In this case, the ephemeral ID will not be found.\n const ephemeralID = this.#ephemeralIDsByMutationID.get(mid);\n if (!ephemeralID) {\n this.#lc.debug?.(\n 'Mutation already resolved or rejected (e.g. due to disconnect); ignore late resolve.',\n );\n return;\n }\n\n const entry = this.#outstandingMutations.get(ephemeralID);\n assert(\n entry && entry.mutationID === mid,\n `outstanding mutation not found for mutation ID ${mid} and ephemeral ID ${ephemeralID}`,\n );\n this.#settleMutation(ephemeralID, entry, result);\n }\n\n #settleMutation<Result extends MutationOk | ApplicationError | ZeroError>(\n ephemeralID: EphemeralID,\n entry: {\n mutationID?: number | undefined;\n resolver: Resolver<MutationSuccessType, MutationErrorType>;\n },\n result: Result,\n ): void {\n if (isApplicationError(result) || isZeroError(result)) {\n // we reject here and catch in the mutator proxy\n // the mutator proxy catches both client and server errors\n entry.resolver.reject(result);\n } else {\n entry.resolver.resolve(result.data);\n }\n\n this.#outstandingMutations.delete(ephemeralID);\n if (entry.mutationID) {\n this.#ephemeralIDsByMutationID.delete(entry.mutationID);\n }\n }\n\n /**\n * Be notified when all mutations have been included in the server snapshot.\n *\n * The query manager will not de-register queries from the server until there\n * are no pending mutations.\n *\n * The reason is that a mutation may need to be rebased. We do not want\n * data that was available the first time it was run to not be available\n * on a rebase.\n */\n onAllMutationsApplied(listener: () => void): void {\n this.#allMutationsAppliedListeners.add(listener);\n }\n\n #notifyAllMutationsAppliedListeners() {\n for (const listener of this.#allMutationsAppliedListeners) {\n listener();\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mutation-tracker.js","names":["v.parse","ErrorKind.PushFailed","ErrorOrigin.ZeroCache","ErrorReason.Internal","ErrorReason.HTTP","ErrorKind.InvalidPush","ErrorOrigin.Server"],"sources":["../../../../../zero-client/src/client/mutation-tracker.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport type {NoIndexDiff} from '../../../replicache/src/btree/node.ts';\nimport type {ReplicacheImpl} from '../../../replicache/src/impl.ts';\nimport type {\n EphemeralID,\n MutationTrackingData,\n} from '../../../replicache/src/replicache-options.ts';\nimport {assert, unreachable} from '../../../shared/src/asserts.ts';\nimport {getErrorDetails} from '../../../shared/src/error.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport {must} from '../../../shared/src/must.ts';\nimport {resolver, type Resolver} from '../../../shared/src/resolver.ts';\nimport {emptyObject} from '../../../shared/src/sentinels.ts';\nimport * as v from '../../../shared/src/valita.ts';\nimport {\n ApplicationError,\n isApplicationError,\n wrapWithApplicationError,\n} from '../../../zero-protocol/src/application-error.ts';\nimport {ErrorKind} from '../../../zero-protocol/src/error-kind.ts';\nimport {ErrorOrigin} from '../../../zero-protocol/src/error-origin.ts';\nimport {ErrorReason} from '../../../zero-protocol/src/error-reason.ts';\nimport {ProtocolError} from '../../../zero-protocol/src/error.ts';\nimport type {MutationID} from '../../../zero-protocol/src/mutation-id.ts';\nimport {\n mutationResultSchema,\n type MutationError,\n type MutationOk,\n} from '../../../zero-protocol/src/mutation.ts';\nimport type {\n PushError,\n PushOk,\n PushResponseBody,\n} from '../../../zero-protocol/src/push.ts';\nimport {isZeroError, type ZeroError} from './error.ts';\nimport {MUTATIONS_KEY_PREFIX} from './keys.ts';\n\ntype MutationSuccessType = ReadonlyJSONValue | undefined;\ntype MutationErrorType = ApplicationError | ZeroError;\n\nlet currentEphemeralID = 0;\nfunction nextEphemeralID(): EphemeralID {\n return ++currentEphemeralID as EphemeralID;\n}\n\n/**\n * Tracks what pushes are in-flight and resolves promises when they're acked.\n */\nexport class MutationTracker {\n readonly #outstandingMutations: Map<\n EphemeralID,\n {\n mutationID?: number | undefined;\n resolver: Resolver<MutationSuccessType, MutationErrorType>;\n }\n >;\n readonly #ephemeralIDsByMutationID: Map<number, EphemeralID>;\n readonly #allMutationsAppliedListeners: Set<() => void>;\n readonly #lc: LogContext;\n\n readonly #ackMutations: (upTo: MutationID) => void;\n readonly #onFatalError: (error: ZeroError) => void;\n\n #clientID: string | undefined;\n #largestOutstandingMutationID: number;\n #currentMutationID: number;\n\n constructor(\n lc: LogContext,\n ackMutations: (upTo: MutationID) => void,\n onFatalError: (error: ZeroError) => void,\n ) {\n this.#lc = lc.withContext('MutationTracker');\n this.#outstandingMutations = new Map();\n this.#ephemeralIDsByMutationID = new Map();\n this.#allMutationsAppliedListeners = new Set();\n this.#largestOutstandingMutationID = 0;\n this.#currentMutationID = 0;\n this.#ackMutations = ackMutations;\n this.#onFatalError = onFatalError;\n }\n\n setClientIDAndWatch(\n clientID: string,\n experimentalWatch: ReplicacheImpl['experimentalWatch'],\n ) {\n assert(this.#clientID === undefined, 'clientID already set');\n this.#clientID = clientID;\n experimentalWatch(\n diffs => {\n this.#processMutationResponses(diffs);\n },\n {\n prefix: MUTATIONS_KEY_PREFIX + clientID + '/',\n initialValuesInFirstDiff: true,\n },\n );\n }\n\n trackMutation(): MutationTrackingData<MutationSuccessType> {\n const id = nextEphemeralID();\n const mutationResolver = resolver<MutationSuccessType, MutationErrorType>();\n\n this.#outstandingMutations.set(id, {\n resolver: mutationResolver,\n });\n return {ephemeralID: id, serverPromise: mutationResolver.promise};\n }\n\n mutationIDAssigned(id: EphemeralID, mutationID: number): void {\n const entry = this.#outstandingMutations.get(id);\n if (entry) {\n entry.mutationID = mutationID;\n this.#ephemeralIDsByMutationID.set(mutationID, id);\n this.#largestOutstandingMutationID = Math.max(\n this.#largestOutstandingMutationID,\n mutationID,\n );\n }\n }\n\n /**\n * Reject the mutation due to an unhandled exception on the client.\n * The mutation must not have been persisted to the client store.\n */\n rejectMutation(id: EphemeralID, e: unknown): void {\n const entry = this.#outstandingMutations.get(id);\n if (entry) {\n this.#settleMutation(id, entry, wrapWithApplicationError(e));\n }\n }\n\n /**\n * Reject all outstanding mutations. Called when the client is in a state\n * that prevents mutations from being applied, such as offline or closed.\n */\n rejectAllOutstandingMutations(error: ZeroError): void {\n if (this.#outstandingMutations.size === 0) {\n return;\n }\n for (const [id, entry] of this.#outstandingMutations) {\n this.#settleMutation(id, entry, error);\n }\n this.#largestOutstandingMutationID = this.#currentMutationID;\n this.#notifyAllMutationsAppliedListeners();\n }\n\n /**\n * Used when zero-cache pokes down mutation results.\n */\n #processMutationResponses(diffs: NoIndexDiff): void {\n const clientID = must(this.#clientID);\n let largestLmid = 0;\n for (const diff of diffs) {\n const mutationID = Number(\n diff.key.slice(MUTATIONS_KEY_PREFIX.length + clientID.length + 1),\n );\n assert(\n !isNaN(mutationID),\n `MutationTracker received a diff with an invalid mutation ID: ${diff.key}`,\n );\n largestLmid = Math.max(largestLmid, mutationID);\n switch (diff.op) {\n case 'add': {\n // Results are stored as the server sent them, so a newer server can\n // add fields. Don't use 'strip': mutationResultSchema's OK branch\n // has no discriminator, so it would turn every error into `{}`.\n const result = v.parse(\n diff.newValue,\n mutationResultSchema,\n 'passthrough',\n );\n if ('error' in result) {\n this.#processMutationError(clientID, mutationID, result);\n } else {\n this.#processMutationOk(clientID, mutationID, result);\n }\n break;\n }\n case 'del':\n break;\n case 'change':\n throw new Error('MutationTracker does not expect change operations');\n }\n }\n\n if (largestLmid > 0) {\n this.#ackMutations({\n clientID: must(this.#clientID),\n id: largestLmid,\n });\n }\n }\n\n processPushResponse(response: PushResponseBody): void {\n if ('error' in response) {\n this.#lc.error?.(\n 'Received an error response when pushing mutations',\n response,\n );\n const fatalError = this.#fatalErrorFromPushError(response);\n if (fatalError) {\n this.#onFatalError(fatalError);\n }\n } else {\n this.#processPushOk(response);\n }\n }\n\n #fatalErrorFromPushError(error: PushError): ZeroError | undefined {\n switch (error.error) {\n case 'unsupportedPushVersion':\n return new ProtocolError({\n kind: ErrorKind.PushFailed,\n origin: ErrorOrigin.ZeroCache,\n reason: ErrorReason.Internal,\n message: `Unsupported push version`,\n mutationIDs: [],\n });\n case 'unsupportedSchemaVersion':\n return new ProtocolError({\n kind: ErrorKind.PushFailed,\n origin: ErrorOrigin.ZeroCache,\n reason: ErrorReason.Internal,\n message: `Unsupported schema version`,\n mutationIDs: [],\n });\n case 'http':\n return new ProtocolError({\n kind: ErrorKind.PushFailed,\n origin: ErrorOrigin.ZeroCache,\n reason: ErrorReason.HTTP,\n status: error.status,\n message: `Fetch from API server returned non-OK status ${error.status}: ${error.details ?? 'unknown'}`,\n mutationIDs: [],\n });\n case 'zeroPusher':\n return new ProtocolError({\n kind: ErrorKind.PushFailed,\n origin: ErrorOrigin.ZeroCache,\n reason: ErrorReason.Internal,\n message: `ZeroPusher error: ${error.details ?? 'unknown'}`,\n mutationIDs: [],\n });\n default:\n unreachable(error);\n }\n }\n\n /**\n * DEPRECATED: to be removed when we switch to fully driving\n * mutation resolution via poke.\n *\n * When we reconnect to zero-cache, we resolve all outstanding mutations\n * whose ID is less than or equal to the lastMutationID.\n *\n * The reason is that any responses the API server sent\n * to those mutations have been lost.\n *\n * An example case: the API server responds while the connection\n * is down. Those responses are lost.\n *\n * Mutations whose LMID is > the lastMutationID are not resolved\n * since they will be retried by the client, giving us another chance\n * at getting a response.\n *\n * The only way to ensure that all API server responses are\n * received would be to have the API server write them\n * to the DB while writing the LMID.\n */\n onConnected(lastMutationID: number) {\n this.lmidAdvanced(lastMutationID);\n }\n\n /**\n * lmid advance will:\n * 1. notify \"allMutationsApplied\" listeners if the lastMutationID\n * is greater than or equal to the largest outstanding mutation ID.\n * 2. resolve all mutations whose mutation ID is less than or equal to\n * the lastMutationID.\n */\n lmidAdvanced(lastMutationID: number): void {\n assert(\n lastMutationID >= this.#currentMutationID,\n 'lmid must be greater than or equal to current lmid',\n );\n if (lastMutationID === this.#currentMutationID) {\n return;\n }\n\n try {\n this.#currentMutationID = lastMutationID;\n this.#resolveMutations(lastMutationID);\n } finally {\n if (lastMutationID >= this.#largestOutstandingMutationID) {\n // this is very important otherwise we hang query de-registration\n this.#notifyAllMutationsAppliedListeners();\n }\n }\n }\n\n get size() {\n return this.#outstandingMutations.size;\n }\n\n #resolveMutations(upTo: number): void {\n // We resolve all mutations whose mutation ID is less than or equal to\n // the upTo mutation ID.\n for (const [id, entry] of this.#outstandingMutations) {\n if (entry.mutationID && entry.mutationID <= upTo) {\n this.#settleMutation(id, entry, emptyObject);\n } else {\n break; // the map is in insertion order which is in mutation ID order\n }\n }\n }\n\n #processPushOk(success: PushOk): void {\n for (const mutation of success.mutations) {\n if ('error' in mutation.result) {\n this.#processMutationError(\n mutation.id.clientID,\n mutation.id.id,\n mutation.result,\n );\n } else {\n this.#processMutationOk(\n mutation.id.clientID,\n mutation.id.id,\n mutation.result,\n );\n }\n }\n }\n\n #processMutationError(\n clientID: string,\n mid: number,\n error: MutationError | Omit<PushError, 'mutationIDs'>,\n ): void {\n assert(\n clientID === this.#clientID,\n 'received mutation for the wrong client',\n );\n\n // Each tab sends all mutations for the client group\n // and the server responds back to the individual client that actually\n // ran the mutation. This means that N clients can send the same\n // mutation concurrently. If that happens, the promise for the mutation tracked\n // by this class will try to be resolved N times.\n // Every time after the first, the ephemeral ID will not be found.\n //\n // We also reject all outstanding mutations when the client is in a state\n // that prevents mutations from being applied, such as offline or closed.\n // In this case, the ephemeral ID will also not be found.\n const ephemeralID = this.#ephemeralIDsByMutationID.get(mid);\n if (!ephemeralID) {\n this.#lc.debug?.(\n 'Mutation already resolved or rejected (e.g. due to disconnect); ignore late reject.',\n );\n return;\n }\n\n const entry = this.#outstandingMutations.get(ephemeralID);\n assert(\n entry && entry.mutationID === mid,\n `outstanding mutation not found for mutation ID ${mid} and ephemeral ID ${ephemeralID}`,\n );\n\n if (error.error === 'alreadyProcessed') {\n // An earlier push committed this mutation, but its response was lost.\n // Leave it outstanding: its persisted result (if the mutator returned\n // data) or the lastMutationID advance arrives in a poke and settles it,\n // so returned data isn't dropped.\n return;\n }\n\n this.#settleMutation(\n ephemeralID,\n entry,\n error.error === 'app'\n ? new ApplicationError(\n error.message ?? `Unknown application error: ${error.error}`,\n error.details ? {details: error.details} : undefined,\n )\n : new ProtocolError({\n kind: ErrorKind.InvalidPush,\n origin: ErrorOrigin.Server,\n reason: ErrorReason.Internal,\n message:\n error.error === 'oooMutation'\n ? 'Server reported an out-of-order mutation'\n : `Unknown fallback error with mutation ID ${mid}: ${error.error}`,\n details: getErrorDetails(error),\n }),\n );\n\n // this is included for backwards compatibility with the per-mutation fatal error responses\n if (error.error === 'oooMutation') {\n this.#onFatalError(\n new ProtocolError({\n kind: ErrorKind.InvalidPush,\n origin: ErrorOrigin.Server,\n reason: ErrorReason.Internal,\n message: 'Server reported an out-of-order mutation',\n details: error.details,\n }),\n );\n }\n }\n\n #processMutationOk(clientID: string, mid: number, result: MutationOk): void {\n assert(\n clientID === this.#clientID,\n 'received mutation for the wrong client',\n );\n\n // We reject all outstanding mutations when the client is in a state\n // that prevents mutations from being applied, such as offline or closed.\n // In this case, the ephemeral ID will not be found.\n const ephemeralID = this.#ephemeralIDsByMutationID.get(mid);\n if (!ephemeralID) {\n this.#lc.debug?.(\n 'Mutation already resolved or rejected (e.g. due to disconnect); ignore late resolve.',\n );\n return;\n }\n\n const entry = this.#outstandingMutations.get(ephemeralID);\n assert(\n entry && entry.mutationID === mid,\n `outstanding mutation not found for mutation ID ${mid} and ephemeral ID ${ephemeralID}`,\n );\n this.#settleMutation(ephemeralID, entry, result);\n }\n\n #settleMutation<Result extends MutationOk | ApplicationError | ZeroError>(\n ephemeralID: EphemeralID,\n entry: {\n mutationID?: number | undefined;\n resolver: Resolver<MutationSuccessType, MutationErrorType>;\n },\n result: Result,\n ): void {\n if (isApplicationError(result) || isZeroError(result)) {\n // we reject here and catch in the mutator proxy\n // the mutator proxy catches both client and server errors\n entry.resolver.reject(result);\n } else {\n entry.resolver.resolve(result.data);\n }\n\n this.#outstandingMutations.delete(ephemeralID);\n if (entry.mutationID) {\n this.#ephemeralIDsByMutationID.delete(entry.mutationID);\n }\n }\n\n /**\n * Be notified when all mutations have been included in the server snapshot.\n *\n * The query manager will not de-register queries from the server until there\n * are no pending mutations.\n *\n * The reason is that a mutation may need to be rebased. We do not want\n * data that was available the first time it was run to not be available\n * on a rebase.\n */\n onAllMutationsApplied(listener: () => void): void {\n this.#allMutationsAppliedListeners.add(listener);\n }\n\n #notifyAllMutationsAppliedListeners() {\n for (const listener of this.#allMutationsAppliedListeners) {\n listener();\n }\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mutator-proxy.js","names":["#lc","#connectionManager","#mutationTracker","#onConnectionStateChange","#mutationRejection","#makeZeroErrorResultDetails","#makeApplicationErrorResultDetails","#normalizeResultPromise"],"sources":["../../../../../zero-client/src/client/mutator-proxy.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport {getStorageFailure} from '../../../replicache/src/storage-failure.ts';\nimport {unreachable} from '../../../shared/src/asserts.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport type {ApplicationError} from '../../../zero-protocol/src/application-error.ts';\nimport {wrapWithApplicationError} from '../../../zero-protocol/src/application-error.ts';\nimport {ClientErrorKind} from './client-error-kind.ts';\nimport type {\n ConnectionManager,\n ConnectionManagerState,\n} from './connection-manager.ts';\nimport {ConnectionStatus} from './connection-status.ts';\nimport type {\n MutatorResult,\n MutatorResultErrorDetails,\n MutatorResultSuccessDetails,\n} from './custom.ts';\nimport {isZeroError, type ZeroError} from './error.ts';\nimport type {MutationTracker} from './mutation-tracker.ts';\n\nconst successResult = (data: unknown): MutatorResultSuccessDetails => ({\n type: 'success',\n data: data as ReadonlyJSONValue | undefined,\n});\n\nfunction getStateDescription(error: ZeroError): string {\n switch (error.kind) {\n case ClientErrorKind.Offline:\n return 'offline';\n case ClientErrorKind.ClientClosed:\n return 'closed';\n default:\n return 'in error state';\n }\n}\n\ntype CachedMutationRejection = {\n readonly error: ZeroError;\n readonly promise: Promise<MutatorResultErrorDetails>;\n};\n\nexport class MutatorProxy {\n readonly #lc: LogContext;\n readonly #connectionManager: ConnectionManager;\n readonly #mutationTracker: MutationTracker;\n #mutationRejection: CachedMutationRejection | undefined;\n\n constructor(\n lc: LogContext,\n connectionManager: ConnectionManager,\n mutationTracker: MutationTracker,\n ) {\n this.#lc = lc;\n this.#connectionManager = connectionManager;\n this.#mutationTracker = mutationTracker;\n\n this.#connectionManager.subscribe(state =>\n this.#onConnectionStateChange(state),\n );\n this.#onConnectionStateChange(connectionManager.state);\n }\n\n get mutationRejectionError(): ZeroError | undefined {\n return this.#mutationRejection?.error;\n }\n\n /**\n * Called when the connection state changes.\n *\n * If the connection state is disconnected, error, or closed, the\n * mutation rejection error is set and all outstanding `.server` promises in\n * the mutation tracker are rejected with the error.\n */\n #onConnectionStateChange(state: ConnectionManagerState) {\n // we short circuit the rejection if the error is due to a missing cacheURL\n // this allows local writes to continue\n if (\n state.name === ConnectionStatus.Disconnected &&\n state.reason.kind === ClientErrorKind.NoSocketOrigin\n ) {\n this.#mutationRejection = undefined;\n return;\n }\n\n switch (state.name) {\n case ConnectionStatus.Disconnected:\n case ConnectionStatus.Error:\n case ConnectionStatus.Closed:\n this.#mutationRejection = {\n error: state.reason,\n promise: Promise.resolve(\n this.#makeZeroErrorResultDetails(state.reason),\n ),\n };\n this.#mutationTracker.rejectAllOutstandingMutations(state.reason);\n break;\n case ConnectionStatus.Initializing:\n case ConnectionStatus.Connected:\n case ConnectionStatus.Connecting:\n case ConnectionStatus.NeedsAuth:\n this.#mutationRejection = undefined;\n return;\n default:\n unreachable(state);\n }\n }\n\n wrapCustomMutator<\n F extends (...args: [] | [ReadonlyJSONValue]) => {\n client: Promise<unknown>;\n server: Promise<unknown>;\n },\n >(name: string, f: F): (...args: Parameters<F>) => MutatorResult {\n return (...args) => {\n if (this.#mutationRejection) {\n const error = this.#mutationRejection.error;\n this.#lc.warn?.(\n `Mutation \"${name}\" rejected because Zero is ${getStateDescription(error)}. Details: ${error.message}. See also: https://zero.rocicorp.dev/docs/connection.`,\n );\n return {\n client: this.#mutationRejection.promise,\n server: this.#mutationRejection.promise,\n } as const satisfies MutatorResult;\n }\n\n let result: {\n client: Promise<unknown>;\n server: Promise<unknown>;\n };\n\n const cachedMutationPromises: Partial<\n Record<'client' | 'server', Promise<MutatorResultErrorDetails>>\n > = {};\n\n const wrapErrorFor =\n (origin: 'client' | 'server') =>\n (error: unknown): Promise<MutatorResultErrorDetails> => {\n const cachedPromise = cachedMutationPromises[origin];\n if (cachedPromise) {\n return cachedPromise;\n }\n\n if (isZeroError(error)) {\n this.#lc.error?.(`Mutator \"${name}\" error on ${origin}`, error);\n\n const zeroErrorPromise = this.#makeZeroErrorResultDetails(error);\n cachedMutationPromises[origin] = zeroErrorPromise;\n return zeroErrorPromise;\n }\n\n const applicationError = wrapWithApplicationError(error);\n if (getStorageFailure(error) === undefined) {\n this.#lc.error?.(\n `Mutator \"${name}\" app error on ${origin}`,\n applicationError,\n );\n } else {\n // The local store's storage failed under the mutation. That is\n // the device's condition, reported once through\n // `onStorageFailure`, not the app's mutator throwing and not a\n // developer's to fix.\n this.#lc.warn?.(\n `Mutator \"${name}\" storage failure on ${origin}`,\n applicationError,\n );\n }\n\n const applicationErrorPromise =\n this.#makeApplicationErrorResultDetails(applicationError);\n cachedMutationPromises[origin] = applicationErrorPromise;\n return applicationErrorPromise;\n };\n\n try {\n result = f(...args);\n } catch (error) {\n const clientPromise = wrapErrorFor('client')(error);\n const serverPromise = wrapErrorFor('server')(error);\n\n return {\n client: clientPromise,\n server: serverPromise,\n } as const satisfies MutatorResult;\n }\n\n const client = this.#normalizeResultPromise(\n result.client,\n wrapErrorFor('client'),\n );\n const server = this.#normalizeResultPromise(\n result.server,\n wrapErrorFor('server'),\n );\n\n return {\n client,\n server,\n };\n };\n }\n\n #normalizeResultPromise(\n promise: Promise<unknown>,\n wrapError: (error: unknown) => Promise<MutatorResultErrorDetails>,\n ) {\n return promise.then<MutatorResultSuccessDetails, MutatorResultErrorDetails>(\n successResult,\n wrapError,\n );\n }\n\n #makeZeroErrorResultDetails(zeroError: ZeroError) {\n return Promise.resolve({\n type: 'error',\n error: {\n type: 'zero',\n message: zeroError.message,\n },\n } as const satisfies MutatorResultErrorDetails);\n }\n\n #makeApplicationErrorResultDetails(applicationError: ApplicationError) {\n return Promise.resolve({\n type: 'error',\n error: {\n type: 'app',\n message: applicationError.message,\n details: applicationError.details,\n },\n } as const satisfies MutatorResultErrorDetails);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mutator-proxy.js","names":["ClientErrorKind.Offline","ClientErrorKind.ClientClosed","ConnectionStatus.Disconnected","ConnectionStatus.Error","ConnectionStatus.Closed","ConnectionStatus.Initializing","ConnectionStatus.Connected","ConnectionStatus.Connecting","ConnectionStatus.NeedsAuth"],"sources":["../../../../../zero-client/src/client/mutator-proxy.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport {getStorageFailure} from '../../../replicache/src/storage-failure.ts';\nimport {unreachable} from '../../../shared/src/asserts.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport type {ApplicationError} from '../../../zero-protocol/src/application-error.ts';\nimport {wrapWithApplicationError} from '../../../zero-protocol/src/application-error.ts';\nimport {ClientErrorKind} from './client-error-kind.ts';\nimport type {\n ConnectionManager,\n ConnectionManagerState,\n} from './connection-manager.ts';\nimport {ConnectionStatus} from './connection-status.ts';\nimport type {\n MutatorResult,\n MutatorResultErrorDetails,\n MutatorResultSuccessDetails,\n} from './custom.ts';\nimport {isZeroError, type ZeroError} from './error.ts';\nimport type {MutationTracker} from './mutation-tracker.ts';\n\nconst successResult = (data: unknown): MutatorResultSuccessDetails => ({\n type: 'success',\n data: data as ReadonlyJSONValue | undefined,\n});\n\nfunction getStateDescription(error: ZeroError): string {\n switch (error.kind) {\n case ClientErrorKind.Offline:\n return 'offline';\n case ClientErrorKind.ClientClosed:\n return 'closed';\n default:\n return 'in error state';\n }\n}\n\ntype CachedMutationRejection = {\n readonly error: ZeroError;\n readonly promise: Promise<MutatorResultErrorDetails>;\n};\n\nexport class MutatorProxy {\n readonly #lc: LogContext;\n readonly #connectionManager: ConnectionManager;\n readonly #mutationTracker: MutationTracker;\n #mutationRejection: CachedMutationRejection | undefined;\n\n constructor(\n lc: LogContext,\n connectionManager: ConnectionManager,\n mutationTracker: MutationTracker,\n ) {\n this.#lc = lc;\n this.#connectionManager = connectionManager;\n this.#mutationTracker = mutationTracker;\n\n this.#connectionManager.subscribe(state =>\n this.#onConnectionStateChange(state),\n );\n this.#onConnectionStateChange(connectionManager.state);\n }\n\n get mutationRejectionError(): ZeroError | undefined {\n return this.#mutationRejection?.error;\n }\n\n /**\n * Called when the connection state changes.\n *\n * If the connection state is disconnected, error, or closed, the\n * mutation rejection error is set and all outstanding `.server` promises in\n * the mutation tracker are rejected with the error.\n */\n #onConnectionStateChange(state: ConnectionManagerState) {\n // we short circuit the rejection if the error is due to a missing cacheURL\n // this allows local writes to continue\n if (\n state.name === ConnectionStatus.Disconnected &&\n state.reason.kind === ClientErrorKind.NoSocketOrigin\n ) {\n this.#mutationRejection = undefined;\n return;\n }\n\n switch (state.name) {\n case ConnectionStatus.Disconnected:\n case ConnectionStatus.Error:\n case ConnectionStatus.Closed:\n this.#mutationRejection = {\n error: state.reason,\n promise: Promise.resolve(\n this.#makeZeroErrorResultDetails(state.reason),\n ),\n };\n this.#mutationTracker.rejectAllOutstandingMutations(state.reason);\n break;\n case ConnectionStatus.Initializing:\n case ConnectionStatus.Connected:\n case ConnectionStatus.Connecting:\n case ConnectionStatus.NeedsAuth:\n this.#mutationRejection = undefined;\n return;\n default:\n unreachable(state);\n }\n }\n\n wrapCustomMutator<\n F extends (...args: [] | [ReadonlyJSONValue]) => {\n client: Promise<unknown>;\n server: Promise<unknown>;\n },\n >(name: string, f: F): (...args: Parameters<F>) => MutatorResult {\n return (...args) => {\n if (this.#mutationRejection) {\n const error = this.#mutationRejection.error;\n this.#lc.warn?.(\n `Mutation \"${name}\" rejected because Zero is ${getStateDescription(error)}. Details: ${error.message}. See also: https://zero.rocicorp.dev/docs/connection.`,\n );\n return {\n client: this.#mutationRejection.promise,\n server: this.#mutationRejection.promise,\n } as const satisfies MutatorResult;\n }\n\n let result: {\n client: Promise<unknown>;\n server: Promise<unknown>;\n };\n\n const cachedMutationPromises: Partial<\n Record<'client' | 'server', Promise<MutatorResultErrorDetails>>\n > = {};\n\n const wrapErrorFor =\n (origin: 'client' | 'server') =>\n (error: unknown): Promise<MutatorResultErrorDetails> => {\n const cachedPromise = cachedMutationPromises[origin];\n if (cachedPromise) {\n return cachedPromise;\n }\n\n if (isZeroError(error)) {\n this.#lc.error?.(`Mutator \"${name}\" error on ${origin}`, error);\n\n const zeroErrorPromise = this.#makeZeroErrorResultDetails(error);\n cachedMutationPromises[origin] = zeroErrorPromise;\n return zeroErrorPromise;\n }\n\n const applicationError = wrapWithApplicationError(error);\n if (getStorageFailure(error) === undefined) {\n this.#lc.error?.(\n `Mutator \"${name}\" app error on ${origin}`,\n applicationError,\n );\n } else {\n // The local store's storage failed under the mutation. That is\n // the device's condition, reported once through\n // `onStorageFailure`, not the app's mutator throwing and not a\n // developer's to fix.\n this.#lc.warn?.(\n `Mutator \"${name}\" storage failure on ${origin}`,\n applicationError,\n );\n }\n\n const applicationErrorPromise =\n this.#makeApplicationErrorResultDetails(applicationError);\n cachedMutationPromises[origin] = applicationErrorPromise;\n return applicationErrorPromise;\n };\n\n try {\n result = f(...args);\n } catch (error) {\n const clientPromise = wrapErrorFor('client')(error);\n const serverPromise = wrapErrorFor('server')(error);\n\n return {\n client: clientPromise,\n server: serverPromise,\n } as const satisfies MutatorResult;\n }\n\n const client = this.#normalizeResultPromise(\n result.client,\n wrapErrorFor('client'),\n );\n const server = this.#normalizeResultPromise(\n result.server,\n wrapErrorFor('server'),\n );\n\n return {\n client,\n server,\n };\n };\n }\n\n #normalizeResultPromise(\n promise: Promise<unknown>,\n wrapError: (error: unknown) => Promise<MutatorResultErrorDetails>,\n ) {\n return promise.then<MutatorResultSuccessDetails, MutatorResultErrorDetails>(\n successResult,\n wrapError,\n );\n }\n\n #makeZeroErrorResultDetails(zeroError: ZeroError) {\n return Promise.resolve({\n type: 'error',\n error: {\n type: 'zero',\n message: zeroError.message,\n },\n } as const satisfies MutatorResultErrorDetails);\n }\n\n #makeApplicationErrorResultDetails(applicationError: ApplicationError) {\n return Promise.resolve({\n type: 'error',\n error: {\n type: 'app',\n message: applicationError.message,\n details: applicationError.details,\n },\n } as const satisfies MutatorResultErrorDetails);\n }\n}\n"],"mappings":"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"}
@@ -368,10 +368,6 @@ export type ZeroOptions<S extends BaseDefaultSchema = DefaultSchema, MD extends
368
368
  } & (unknown extends DefaultContext ? {} : {
369
369
  context: C;
370
370
  });
371
- /**
372
- * @deprecated Use {@link ZeroOptions} instead.
373
- */
374
- export type ZeroAdvancedOptions<S extends BaseDefaultSchema, MD extends CustomMutatorDefs | undefined, Context extends BaseDefaultContext> = ZeroOptions<S, MD, Context>;
375
371
  type UpdateNeededReasonBase = {
376
372
  message?: string;
377
373
  };
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../../../zero-client/src/client/options.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../../../zero-client/src/client/options.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","names":[],"sources":["../../../../../zero-client/src/client/options.ts"],"sourcesContent":["import type {LogLevel, LogSink} from '@rocicorp/logger';\nimport type {StoreProvider} from '../../../replicache/src/kv/store.ts';\nimport type {StorageFailureError} from '../../../replicache/src/storage-failure.ts';\nimport * as v from '../../../shared/src/valita.ts';\nimport type {\n BaseDefaultContext,\n BaseDefaultSchema,\n DefaultContext,\n DefaultSchema,\n} from '../../../zero-types/src/default-types.ts';\nimport type {AnyMutatorRegistry} from '../../../zql/src/mutate/mutator-registry.ts';\nimport type {CustomMutatorDefs} from './custom.ts';\nimport {UpdateNeededReasonType} from './update-needed-reason-type.ts';\n\n/**\n * Configuration for {@link Zero}.\n */\nexport type ZeroOptions<\n S extends BaseDefaultSchema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n C extends BaseDefaultContext = DefaultContext,\n> = {\n /**\n * URL to the zero-cache. This can be a simple hostname, e.g.\n * - \"https://myapp-myteam.zero.ms\"\n * or a prefix with a single path component, e.g.\n * - \"https://myapp-myteam.zero.ms/zero\"\n * - \"https://myapp-myteam.zero.ms/db\"\n *\n * The latter is useful for configuring routing rules (e.g. \"/zero/\\*\") when\n * the zero-cache is hosted on the same domain as the application. **Note that\n * only a single path segment is allowed (e.g. it cannot be \"/proxy/zero/\\*\")**.\n */\n cacheURL?: string | null | undefined;\n\n /**\n * @deprecated Use {@link cacheURL} instead.\n */\n server?: string | null | undefined;\n\n /**\n * A token to identify and authenticate the user.\n *\n * Set `auth` to `null` or `undefined` if there is no logged in user.\n *\n * The call to `connect` is handled automatically by the ZeroProvider component\n * for React and SolidJS when the `auth` prop changes.\n *\n * Transitions between authenticated and logged-out states recreate the Zero\n * instance instead.\n *\n * When `auth` changes while connected, Zero refreshes server-side auth context\n * and re-transforms queries without reconnecting.\n *\n * When a 401 or 403 HTTP status code is received from your server, Zero will\n * transition to the `needs-auth` connection state. The app should call\n * `zero.connection.connect({auth: newToken})` with a new token to reconnect.\n */\n auth?: string | null | undefined;\n\n /**\n * A unique identifier for the user.\n *\n * Omit this, or set to `null`, for logged-out clients.\n *\n * Each userID gets its own client-side storage so that the app can switch\n * between users without losing state.\n */\n userID?: string | null | undefined;\n\n /**\n * Distinguishes the storage used by this Zero instance from that of other\n * instances with the same userID. Useful in the case where the app wants to\n * have multiple Zero instances for the same user for different parts of the\n * app.\n */\n storageKey?: string | undefined;\n\n /**\n * Determines the level of detail at which Zero logs messages about\n * its operation. Messages are logged to the `console`.\n *\n * When this is set to `'debug'`, `'info'` and `'error'` messages are also\n * logged. When set to `'info'`, `'info'` and `'error'` but not\n * `'debug'` messages are logged. When set to `'error'` only `'error'`\n * messages are logged.\n *\n * Default is `'error'`.\n */\n logLevel?: LogLevel | undefined;\n\n /**\n * Destination for Zero's log output. When omitted, logs are written with\n * `console.log`/`info`/`warn`/`error` etc.\n *\n * Provide a custom {@link LogSink} to redirect logs — for example, to\n * `process.stderr` in a CLI so that the tool's structured stdout output\n * isn't polluted by log lines.\n *\n * Note: this overrides only the console sink. When analytics logging is\n * enabled, the Datadog sink is still installed alongside this one.\n */\n logSink?: LogSink | undefined;\n\n /**\n * This defines the schema of the tables used in Zero and their relationships\n * to one another.\n */\n schema: S;\n\n /**\n * `mutators` is a map of custom mutator definitions. The keys are\n * namespaces or names of the mutators. The values are the mutator\n * implementations. Client side mutators must be idempotent as a\n * mutation can be rebased multiple times when folding in authoritative\n * changes from the server to the client.\n *\n * Define mutators using the `defineMutator` function to create type-safe,\n * parameterized mutations. Mutators can be top-level or grouped in namespaces.\n *\n * @example\n * ```ts\n * import {defineMutator} from '@rocicorp/zero';\n *\n * const z = new Zero({\n * schema,\n * userID,\n * mutators: {\n * // Top-level mutator\n * increment: defineMutator(({tx, args}: {tx: Transaction<Schema>, args: {id: string}}) =>\n * tx.mutate.counter.update({id: args.id, value: tx.query.counter.where('id', '=', args.id).value + 1})\n * ),\n * // Namespace with multiple mutators\n * issues: {\n * create: defineMutator(({tx, args}: {tx: Transaction<Schema>, args: {title: string}}) =>\n * tx.mutate.issues.insert({id: nanoid(), title: args.title, status: 'open'})\n * ),\n * close: defineMutator(({tx, args}: {tx: Transaction<Schema>, args: {id: string}}) =>\n * tx.mutate.issues.update({id: args.id, status: 'closed'})\n * ),\n * },\n * },\n * });\n *\n * // Usage\n * await z.mutate.increment({id: 'counter-1'}).client;\n * await z.mutate.issues.create({title: 'New issue'}).client;\n * await z.mutate.issues.close({id: 'issue-123'}).client;\n * ```\n */\n mutators?: MD extends CustomMutatorDefs ? MD : AnyMutatorRegistry | undefined;\n\n /**\n * Custom URL for mutation requests sent to your API server.\n * If not provided, uses the default configured in zero-cache.\n */\n mutateURL?: string | undefined;\n\n /**\n * Custom headers to include in mutation requests sent to your API server.\n * These headers are passed through zero-cache to the mutate endpoint.\n */\n mutateHeaders?: Record<string, string> | undefined;\n\n /**\n * Custom URL for query requests sent to your API server.\n * If not provided, uses the default configured in zero-cache.\n *\n * @deprecated Use {@link queryURL} instead.\n */\n getQueriesURL?: string | undefined;\n\n /**\n * Custom URL for query requests sent to your API server.\n * If not provided, uses the default configured in zero-cache.\n */\n queryURL?: string | undefined;\n\n /**\n * Custom headers to include in query requests sent to your API server.\n * These headers are passed through zero-cache to the query endpoint.\n */\n queryHeaders?: Record<string, string> | undefined;\n\n /**\n * Optional callback that returns a W3C `traceparent` header value for\n * distributed tracing. Called before sending WebSocket messages that\n * trigger API server calls (`push`, `changeDesiredQueries`,\n * `initConnection`).\n *\n * This enables end-to-end trace correlation from your frontend through\n * zero-cache to your API server.\n *\n * @example\n * ```ts\n * import {propagation, context} from '@opentelemetry/api';\n *\n * new Zero({\n * getTraceparent: () => {\n * const carrier: Record<string, string> = {};\n * propagation.inject(context.active(), carrier);\n * return carrier.traceparent;\n * },\n * });\n * ```\n */\n getTraceparent?: (() => string | undefined) | undefined;\n\n /**\n * `onOnlineChange` is called when the Zero instance's online status changes.\n *\n * @deprecated Use {@link Connection.state.subscribe} on the Zero instance instead. e.g.\n * ```ts\n * const zero = new Zero({...});\n * zero.connection.state.subscribe((state) => {\n * console.log('Connection state:', state.name);\n * });\n * ```\n *\n * Or use a hook like {@link useConnectionState} to subscribe to state changes.\n */\n onOnlineChange?: ((online: boolean) => void) | undefined;\n\n /**\n * `onUpdateNeeded` is called when a client code update is needed.\n *\n * See {@link UpdateNeededReason} for why updates can be needed.\n *\n * The default behavior is to reload the page (using `location.reload()`).\n * Provide your own function to prevent the page from\n * reloading automatically. You may want to display a toast to inform the end\n * user there is a new version of your app available and prompt them to\n * refresh.\n */\n onUpdateNeeded?: ((reason: UpdateNeededReason) => void) | undefined;\n\n /**\n * `onClientStateNotFound` is called when this client is no longer able\n * to sync with zero-cache due to missing synchronization state. This\n * can be because:\n * - the local persistent synchronization state has been garbage collected.\n * This can happen if the client has no pending mutations and has not been\n * used for a while (e.g. the client's tab has been hidden for a long time).\n * - the local persistent synchronization state was found to be corrupt.\n * Replicache tries to drop the local database so that a reload starts\n * fresh. The callback is called even if that fails.\n * - zero-cache fails to find the server side synchronization state for\n * this client.\n * - zero-cache rejects this client's persisted synchronization state,\n * requiring the local Replicache database to be reset.\n *\n * The current `Zero` instance should be treated as dead and replaced, not\n * reconnected.\n *\n * The default behavior for the Zero client is to reload the page\n * (using `location.reload()`). The React and SolidJS providers will replace\n * the client in-place, without a full page reload.\n *\n * Provide your own function to prevent this functionality.\n */\n onClientStateNotFound?: (() => void) | undefined;\n\n /**\n * `onStorageFailure` is called once, the first time the local persistent\n * store reports that its storage has failed rather than its data, with the\n * {@link StorageFailureError} it threw: the device is out of space\n * (`full`), the database cannot be opened (`cannot-open`, including an\n * IndexedDB that fails to open), or a read or write to it failed\n * (`io-error`).\n *\n * A failure while this `Zero` instance is opening runs it on memory for the\n * session, as with `kvStore: 'mem'`: nothing is written to disk. A failure\n * after that stops persisting locally: queries and mutations keep running\n * against what the in-memory dag holds, and mutations keep pushing to\n * zero-cache, but nothing is written to disk until a new instance is\n * created; a read that needs a chunk not yet loaded\n * from the store (or since evicted from the in-memory cache) still fails\n * the way any store read does, and is reported here too, whichever caller\n * made it. An invalid ref count seen while the store is\n * failing with `cannot-open` or `io-error` is not treated as corruption, so\n * {@link onClientStateNotFound} is not called for it: a store that cannot\n * complete its reads and writes produces such readings without the data\n * being corrupt, and dropping the database would rebuild onto the same\n * failing storage. A `full` disk keeps the drop, since deleting the database\n * is also what frees the space.\n *\n * The default behavior is to log the failure and nothing else. Provide a\n * function to show the user what to do — free up space, or restart the\n * app once the storage is available again.\n */\n onStorageFailure?: ((failure: StorageFailureError) => void) | undefined;\n\n /**\n * The number of milliseconds to wait before disconnecting a Zero\n * instance whose tab has become hidden.\n *\n * Instances in hidden tabs are disconnected to save resources.\n *\n * Default is 5 minutes.\n */\n hiddenTabDisconnectDelay?: number | undefined;\n\n /**\n * The number of milliseconds to wait before disconnecting a Zero\n * instance when the connection to the server has timed out.\n *\n * Default is 1 minute.\n */\n disconnectTimeoutMs?: number | undefined;\n\n /**\n * The timeout in milliseconds for ping operations. This value is used for:\n * - How long to wait in idle before sending a ping to the server\n * - How long to wait for a pong response after sending a ping\n *\n * Total time to detect a dead connection is 2 × pingTimeoutMs.\n *\n * Default is 5_000.\n */\n pingTimeoutMs?: number | undefined;\n\n /**\n * Determines what kind of storage implementation to use on the client.\n *\n * Defaults to `'idb'` which means that Zero uses an IndexedDB storage\n * implementation. This allows the data to be persisted on the client and\n * enables faster syncs between application restarts.\n *\n * By setting this to `'mem'`, Zero uses an in memory storage and\n * the data is not persisted on the client.\n *\n * You can also set this to a function that is used to create new KV stores,\n * allowing a custom implementation of the underlying storage layer.\n */\n kvStore?: 'mem' | 'idb' | StoreProvider | undefined;\n\n /**\n * The maximum number of bytes to allow in a single header.\n *\n * Zero adds some extra information to headers on initialization if possible.\n * This speeds up data synchronization. This number should be kept less than\n * or equal to the maximum header size allowed by the zero-cache and any load\n * balancers.\n *\n * Default value: 8kb.\n */\n maxHeaderLength?: number | undefined;\n\n /**\n * The maximum amount of milliseconds to wait for a materialization to\n * complete (including network/server time) before printing a warning to the\n * console.\n *\n * Default value: 5_000.\n */\n slowMaterializeThreshold?: number | undefined;\n\n /**\n * UI rendering libraries will often provide a utility for batching multiple\n * state updates into a single render. Some examples are React's\n * `unstable_batchedUpdates`, and solid-js's `batch`.\n *\n * This option enables integrating these batch utilities with Zero.\n *\n * When `batchViewUpdates` is provided, Zero will call it whenever\n * it updates query view state with an `applyViewUpdates` function\n * that performs the actual state updates.\n *\n * Zero updates query view state when:\n * 1. creating a new view\n * 2. updating all existing queries' views to a new consistent state\n *\n * When creating a new view, that single view's creation will be wrapped\n * in a `batchViewUpdates` call.\n *\n * When updating existing queries, all queries will be updated in a single\n * `batchViewUpdates` call, so that the transition to the new consistent\n * state can be done in a single render.\n *\n * Implementations must always call `applyViewUpdates` synchronously.\n */\n batchViewUpdates?: ((applyViewUpdates: () => void) => void) | undefined;\n\n /**\n * The maximum number of recent queries, no longer subscribed to by a preload\n * or view, to continue syncing.\n *\n * Defaults is 0.\n *\n * @deprecated Use ttl instead\n */\n maxRecentQueries?: number | undefined;\n\n /**\n * Changes to queries are sent to server in batches. This option controls\n * the number of milliseconds to wait before sending the next batch.\n *\n * Defaults is 10.\n */\n queryChangeThrottleMs?: number | undefined;\n\n /**\n * Context is passed to queries when they are executed.\n */\n context?: C | undefined;\n} & (unknown extends DefaultContext\n ? {}\n : {\n context: C;\n });\n\n/**\n * @deprecated Use {@link ZeroOptions} instead.\n */\nexport type ZeroAdvancedOptions<\n S extends BaseDefaultSchema,\n MD extends CustomMutatorDefs | undefined,\n Context extends BaseDefaultContext,\n> = ZeroOptions<S, MD, Context>;\n\ntype UpdateNeededReasonBase = {\n message?: string;\n};\n\nexport type UpdateNeededReason =\n | ({type: UpdateNeededReasonType.NewClientGroup} & UpdateNeededReasonBase)\n | ({\n type: UpdateNeededReasonType.VersionNotSupported;\n } & UpdateNeededReasonBase)\n | ({\n type: UpdateNeededReasonType.SchemaVersionNotSupported;\n } & UpdateNeededReasonBase);\n\nexport const updateNeededReasonTypeSchema: v.Type<UpdateNeededReason['type']> =\n v.literalUnion(\n UpdateNeededReasonType.NewClientGroup,\n UpdateNeededReasonType.VersionNotSupported,\n UpdateNeededReasonType.SchemaVersionNotSupported,\n );\n"],"mappings":";;;AAibA,IAAa,+BACX,aACE,gBACA,qBACA,yBACF"}
1
+ {"version":3,"file":"options.js","names":["v.literalUnion","UpdateNeededReasonType.NewClientGroup","UpdateNeededReasonType.VersionNotSupported","UpdateNeededReasonType.SchemaVersionNotSupported"],"sources":["../../../../../zero-client/src/client/options.ts"],"sourcesContent":["import type {LogLevel, LogSink} from '@rocicorp/logger';\nimport type {StoreProvider} from '../../../replicache/src/kv/store.ts';\nimport type {StorageFailureError} from '../../../replicache/src/storage-failure.ts';\nimport * as v from '../../../shared/src/valita.ts';\nimport type {\n BaseDefaultContext,\n BaseDefaultSchema,\n DefaultContext,\n DefaultSchema,\n} from '../../../zero-types/src/default-types.ts';\nimport type {AnyMutatorRegistry} from '../../../zql/src/mutate/mutator-registry.ts';\nimport type {CustomMutatorDefs} from './custom.ts';\nimport {UpdateNeededReasonType} from './update-needed-reason-type.ts';\n\n/**\n * Configuration for {@link Zero}.\n */\nexport type ZeroOptions<\n S extends BaseDefaultSchema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n C extends BaseDefaultContext = DefaultContext,\n> = {\n /**\n * URL to the zero-cache. This can be a simple hostname, e.g.\n * - \"https://myapp-myteam.zero.ms\"\n * or a prefix with a single path component, e.g.\n * - \"https://myapp-myteam.zero.ms/zero\"\n * - \"https://myapp-myteam.zero.ms/db\"\n *\n * The latter is useful for configuring routing rules (e.g. \"/zero/\\*\") when\n * the zero-cache is hosted on the same domain as the application. **Note that\n * only a single path segment is allowed (e.g. it cannot be \"/proxy/zero/\\*\")**.\n */\n cacheURL?: string | null | undefined;\n\n /**\n * @deprecated Use {@link cacheURL} instead.\n */\n server?: string | null | undefined;\n\n /**\n * A token to identify and authenticate the user.\n *\n * Set `auth` to `null` or `undefined` if there is no logged in user.\n *\n * The call to `connect` is handled automatically by the ZeroProvider component\n * for React and SolidJS when the `auth` prop changes.\n *\n * Transitions between authenticated and logged-out states recreate the Zero\n * instance instead.\n *\n * When `auth` changes while connected, Zero refreshes server-side auth context\n * and re-transforms queries without reconnecting.\n *\n * When a 401 or 403 HTTP status code is received from your server, Zero will\n * transition to the `needs-auth` connection state. The app should call\n * `zero.connection.connect({auth: newToken})` with a new token to reconnect.\n */\n auth?: string | null | undefined;\n\n /**\n * A unique identifier for the user.\n *\n * Omit this, or set to `null`, for logged-out clients.\n *\n * Each userID gets its own client-side storage so that the app can switch\n * between users without losing state.\n */\n userID?: string | null | undefined;\n\n /**\n * Distinguishes the storage used by this Zero instance from that of other\n * instances with the same userID. Useful in the case where the app wants to\n * have multiple Zero instances for the same user for different parts of the\n * app.\n */\n storageKey?: string | undefined;\n\n /**\n * Determines the level of detail at which Zero logs messages about\n * its operation. Messages are logged to the `console`.\n *\n * When this is set to `'debug'`, `'info'` and `'error'` messages are also\n * logged. When set to `'info'`, `'info'` and `'error'` but not\n * `'debug'` messages are logged. When set to `'error'` only `'error'`\n * messages are logged.\n *\n * Default is `'error'`.\n */\n logLevel?: LogLevel | undefined;\n\n /**\n * Destination for Zero's log output. When omitted, logs are written with\n * `console.log`/`info`/`warn`/`error` etc.\n *\n * Provide a custom {@link LogSink} to redirect logs — for example, to\n * `process.stderr` in a CLI so that the tool's structured stdout output\n * isn't polluted by log lines.\n *\n * Note: this overrides only the console sink. When analytics logging is\n * enabled, the Datadog sink is still installed alongside this one.\n */\n logSink?: LogSink | undefined;\n\n /**\n * This defines the schema of the tables used in Zero and their relationships\n * to one another.\n */\n schema: S;\n\n /**\n * `mutators` is a map of custom mutator definitions. The keys are\n * namespaces or names of the mutators. The values are the mutator\n * implementations. Client side mutators must be idempotent as a\n * mutation can be rebased multiple times when folding in authoritative\n * changes from the server to the client.\n *\n * Define mutators using the `defineMutator` function to create type-safe,\n * parameterized mutations. Mutators can be top-level or grouped in namespaces.\n *\n * @example\n * ```ts\n * import {defineMutator} from '@rocicorp/zero';\n *\n * const z = new Zero({\n * schema,\n * userID,\n * mutators: {\n * // Top-level mutator\n * increment: defineMutator(({tx, args}: {tx: Transaction<Schema>, args: {id: string}}) =>\n * tx.mutate.counter.update({id: args.id, value: tx.query.counter.where('id', '=', args.id).value + 1})\n * ),\n * // Namespace with multiple mutators\n * issues: {\n * create: defineMutator(({tx, args}: {tx: Transaction<Schema>, args: {title: string}}) =>\n * tx.mutate.issues.insert({id: nanoid(), title: args.title, status: 'open'})\n * ),\n * close: defineMutator(({tx, args}: {tx: Transaction<Schema>, args: {id: string}}) =>\n * tx.mutate.issues.update({id: args.id, status: 'closed'})\n * ),\n * },\n * },\n * });\n *\n * // Usage\n * await z.mutate.increment({id: 'counter-1'}).client;\n * await z.mutate.issues.create({title: 'New issue'}).client;\n * await z.mutate.issues.close({id: 'issue-123'}).client;\n * ```\n */\n mutators?: MD extends CustomMutatorDefs ? MD : AnyMutatorRegistry | undefined;\n\n /**\n * Custom URL for mutation requests sent to your API server.\n * If not provided, uses the default configured in zero-cache.\n */\n mutateURL?: string | undefined;\n\n /**\n * Custom headers to include in mutation requests sent to your API server.\n * These headers are passed through zero-cache to the mutate endpoint.\n */\n mutateHeaders?: Record<string, string> | undefined;\n\n /**\n * Custom URL for query requests sent to your API server.\n * If not provided, uses the default configured in zero-cache.\n *\n * @deprecated Use {@link queryURL} instead.\n */\n getQueriesURL?: string | undefined;\n\n /**\n * Custom URL for query requests sent to your API server.\n * If not provided, uses the default configured in zero-cache.\n */\n queryURL?: string | undefined;\n\n /**\n * Custom headers to include in query requests sent to your API server.\n * These headers are passed through zero-cache to the query endpoint.\n */\n queryHeaders?: Record<string, string> | undefined;\n\n /**\n * Optional callback that returns a W3C `traceparent` header value for\n * distributed tracing. Called before sending WebSocket messages that\n * trigger API server calls (`push`, `changeDesiredQueries`,\n * `initConnection`).\n *\n * This enables end-to-end trace correlation from your frontend through\n * zero-cache to your API server.\n *\n * @example\n * ```ts\n * import {propagation, context} from '@opentelemetry/api';\n *\n * new Zero({\n * getTraceparent: () => {\n * const carrier: Record<string, string> = {};\n * propagation.inject(context.active(), carrier);\n * return carrier.traceparent;\n * },\n * });\n * ```\n */\n getTraceparent?: (() => string | undefined) | undefined;\n\n /**\n * `onOnlineChange` is called when the Zero instance's online status changes.\n *\n * @deprecated Use {@link Connection.state.subscribe} on the Zero instance instead. e.g.\n * ```ts\n * const zero = new Zero({...});\n * zero.connection.state.subscribe((state) => {\n * console.log('Connection state:', state.name);\n * });\n * ```\n *\n * Or use a hook like {@link useConnectionState} to subscribe to state changes.\n */\n onOnlineChange?: ((online: boolean) => void) | undefined;\n\n /**\n * `onUpdateNeeded` is called when a client code update is needed.\n *\n * See {@link UpdateNeededReason} for why updates can be needed.\n *\n * The default behavior is to reload the page (using `location.reload()`).\n * Provide your own function to prevent the page from\n * reloading automatically. You may want to display a toast to inform the end\n * user there is a new version of your app available and prompt them to\n * refresh.\n */\n onUpdateNeeded?: ((reason: UpdateNeededReason) => void) | undefined;\n\n /**\n * `onClientStateNotFound` is called when this client is no longer able\n * to sync with zero-cache due to missing synchronization state. This\n * can be because:\n * - the local persistent synchronization state has been garbage collected.\n * This can happen if the client has no pending mutations and has not been\n * used for a while (e.g. the client's tab has been hidden for a long time).\n * - the local persistent synchronization state was found to be corrupt.\n * Replicache tries to drop the local database so that a reload starts\n * fresh. The callback is called even if that fails.\n * - zero-cache fails to find the server side synchronization state for\n * this client.\n * - zero-cache rejects this client's persisted synchronization state,\n * requiring the local Replicache database to be reset.\n *\n * The current `Zero` instance should be treated as dead and replaced, not\n * reconnected.\n *\n * The default behavior for the Zero client is to reload the page\n * (using `location.reload()`). The React and SolidJS providers will replace\n * the client in-place, without a full page reload.\n *\n * Provide your own function to prevent this functionality.\n */\n onClientStateNotFound?: (() => void) | undefined;\n\n /**\n * `onStorageFailure` is called once, the first time the local persistent\n * store reports that its storage has failed rather than its data, with the\n * {@link StorageFailureError} it threw: the device is out of space\n * (`full`), the database cannot be opened (`cannot-open`, including an\n * IndexedDB that fails to open), or a read or write to it failed\n * (`io-error`).\n *\n * A failure while this `Zero` instance is opening runs it on memory for the\n * session, as with `kvStore: 'mem'`: nothing is written to disk. A failure\n * after that stops persisting locally: queries and mutations keep running\n * against what the in-memory dag holds, and mutations keep pushing to\n * zero-cache, but nothing is written to disk until a new instance is\n * created; a read that needs a chunk not yet loaded\n * from the store (or since evicted from the in-memory cache) still fails\n * the way any store read does, and is reported here too, whichever caller\n * made it. An invalid ref count seen while the store is\n * failing with `cannot-open` or `io-error` is not treated as corruption, so\n * {@link onClientStateNotFound} is not called for it: a store that cannot\n * complete its reads and writes produces such readings without the data\n * being corrupt, and dropping the database would rebuild onto the same\n * failing storage. A `full` disk keeps the drop, since deleting the database\n * is also what frees the space.\n *\n * The default behavior is to log the failure and nothing else. Provide a\n * function to show the user what to do — free up space, or restart the\n * app once the storage is available again.\n */\n onStorageFailure?: ((failure: StorageFailureError) => void) | undefined;\n\n /**\n * The number of milliseconds to wait before disconnecting a Zero\n * instance whose tab has become hidden.\n *\n * Instances in hidden tabs are disconnected to save resources.\n *\n * Default is 5 minutes.\n */\n hiddenTabDisconnectDelay?: number | undefined;\n\n /**\n * The number of milliseconds to wait before disconnecting a Zero\n * instance when the connection to the server has timed out.\n *\n * Default is 1 minute.\n */\n disconnectTimeoutMs?: number | undefined;\n\n /**\n * The timeout in milliseconds for ping operations. This value is used for:\n * - How long to wait in idle before sending a ping to the server\n * - How long to wait for a pong response after sending a ping\n *\n * Total time to detect a dead connection is 2 × pingTimeoutMs.\n *\n * Default is 5_000.\n */\n pingTimeoutMs?: number | undefined;\n\n /**\n * Determines what kind of storage implementation to use on the client.\n *\n * Defaults to `'idb'` which means that Zero uses an IndexedDB storage\n * implementation. This allows the data to be persisted on the client and\n * enables faster syncs between application restarts.\n *\n * By setting this to `'mem'`, Zero uses an in memory storage and\n * the data is not persisted on the client.\n *\n * You can also set this to a function that is used to create new KV stores,\n * allowing a custom implementation of the underlying storage layer.\n */\n kvStore?: 'mem' | 'idb' | StoreProvider | undefined;\n\n /**\n * The maximum number of bytes to allow in a single header.\n *\n * Zero adds some extra information to headers on initialization if possible.\n * This speeds up data synchronization. This number should be kept less than\n * or equal to the maximum header size allowed by the zero-cache and any load\n * balancers.\n *\n * Default value: 8kb.\n */\n maxHeaderLength?: number | undefined;\n\n /**\n * The maximum amount of milliseconds to wait for a materialization to\n * complete (including network/server time) before printing a warning to the\n * console.\n *\n * Default value: 5_000.\n */\n slowMaterializeThreshold?: number | undefined;\n\n /**\n * UI rendering libraries will often provide a utility for batching multiple\n * state updates into a single render. Some examples are React's\n * `unstable_batchedUpdates`, and solid-js's `batch`.\n *\n * This option enables integrating these batch utilities with Zero.\n *\n * When `batchViewUpdates` is provided, Zero will call it whenever\n * it updates query view state with an `applyViewUpdates` function\n * that performs the actual state updates.\n *\n * Zero updates query view state when:\n * 1. creating a new view\n * 2. updating all existing queries' views to a new consistent state\n *\n * When creating a new view, that single view's creation will be wrapped\n * in a `batchViewUpdates` call.\n *\n * When updating existing queries, all queries will be updated in a single\n * `batchViewUpdates` call, so that the transition to the new consistent\n * state can be done in a single render.\n *\n * Implementations must always call `applyViewUpdates` synchronously.\n */\n batchViewUpdates?: ((applyViewUpdates: () => void) => void) | undefined;\n\n /**\n * The maximum number of recent queries, no longer subscribed to by a preload\n * or view, to continue syncing.\n *\n * Defaults is 0.\n *\n * @deprecated Use ttl instead\n */\n maxRecentQueries?: number | undefined;\n\n /**\n * Changes to queries are sent to server in batches. This option controls\n * the number of milliseconds to wait before sending the next batch.\n *\n * Defaults is 10.\n */\n queryChangeThrottleMs?: number | undefined;\n\n /**\n * Context is passed to queries when they are executed.\n */\n context?: C | undefined;\n} & (unknown extends DefaultContext\n ? {}\n : {\n context: C;\n });\n\ntype UpdateNeededReasonBase = {\n message?: string;\n};\n\nexport type UpdateNeededReason =\n | ({type: UpdateNeededReasonType.NewClientGroup} & UpdateNeededReasonBase)\n | ({\n type: UpdateNeededReasonType.VersionNotSupported;\n } & UpdateNeededReasonBase)\n | ({\n type: UpdateNeededReasonType.SchemaVersionNotSupported;\n } & UpdateNeededReasonBase);\n\nexport const updateNeededReasonTypeSchema: v.Type<UpdateNeededReason['type']> =\n v.literalUnion(\n UpdateNeededReasonType.NewClientGroup,\n UpdateNeededReasonType.VersionNotSupported,\n UpdateNeededReasonType.SchemaVersionNotSupported,\n );\n"],"mappings":";;;AAwaA,IAAa,+BACXA,aACEC,gBACAC,qBACAC,yBACF"}
@@ -83,7 +83,6 @@ var QueryManager = class {
83
83
  this.#gotQueries.delete(queryHash);
84
84
  this.#cachedQueries.delete(queryHash);
85
85
  fire(queryHash, false);
86
- break;
87
86
  }
88
87
  }
89
88
  if (thrown) throw thrown.error;
@@ -276,7 +275,8 @@ var QueryManager = class {
276
275
  }
277
276
  /** @deprecated */
278
277
  updateLegacy(ast, ttl) {
279
- const queryID = hashOfAST(normalizeAST(ast));
278
+ const normalized = normalizeAST(ast);
279
+ const queryID = hashOfAST(normalized);
280
280
  const entry = must(this.#queries.get(queryID));
281
281
  this.#updateEntry(entry, queryID, ttl);
282
282
  }