@rocicorp/zero 1.11.0-canary.3 → 1.11.0-canary.30

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 (988) hide show
  1. package/out/analyze-query/src/analyze-cli.js +4 -4
  2. package/out/analyze-query/src/analyze-cli.js.map +1 -1
  3. package/out/analyze-query/src/bin-analyze.js +13 -12
  4. package/out/analyze-query/src/bin-analyze.js.map +1 -1
  5. package/out/analyze-query/src/bin-transform.js +1 -1
  6. package/out/analyze-query/src/bin-transform.js.map +1 -1
  7. package/out/ast-to-zql/src/ast-to-zql.d.ts +8 -1
  8. package/out/ast-to-zql/src/ast-to-zql.d.ts.map +1 -1
  9. package/out/ast-to-zql/src/ast-to-zql.js +25 -25
  10. package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
  11. package/out/otel/src/log-options.d.ts +16 -0
  12. package/out/otel/src/log-options.d.ts.map +1 -1
  13. package/out/otel/src/log-options.js +60 -6
  14. package/out/otel/src/log-options.js.map +1 -1
  15. package/out/replicache/src/bg-interval.d.ts +2 -1
  16. package/out/replicache/src/bg-interval.d.ts.map +1 -1
  17. package/out/replicache/src/bg-interval.js +13 -4
  18. package/out/replicache/src/bg-interval.js.map +1 -1
  19. package/out/replicache/src/btree/node.d.ts.map +1 -1
  20. package/out/replicache/src/btree/node.js +3 -6
  21. package/out/replicache/src/btree/node.js.map +1 -1
  22. package/out/replicache/src/dag/gc.d.ts.map +1 -1
  23. package/out/replicache/src/dag/gc.js +8 -11
  24. package/out/replicache/src/dag/gc.js.map +1 -1
  25. package/out/replicache/src/dag/invalid-ref-count-error.d.ts +12 -0
  26. package/out/replicache/src/dag/invalid-ref-count-error.d.ts.map +1 -0
  27. package/out/replicache/src/dag/invalid-ref-count-error.js +19 -0
  28. package/out/replicache/src/dag/invalid-ref-count-error.js.map +1 -0
  29. package/out/replicache/src/dag/lazy-store.d.ts +17 -4
  30. package/out/replicache/src/dag/lazy-store.d.ts.map +1 -1
  31. package/out/replicache/src/dag/lazy-store.js +35 -9
  32. package/out/replicache/src/dag/lazy-store.js.map +1 -1
  33. package/out/replicache/src/dag/store-impl.d.ts +12 -2
  34. package/out/replicache/src/dag/store-impl.d.ts.map +1 -1
  35. package/out/replicache/src/dag/store-impl.js +29 -9
  36. package/out/replicache/src/dag/store-impl.js.map +1 -1
  37. package/out/replicache/src/db/rebase.d.ts +14 -2
  38. package/out/replicache/src/db/rebase.d.ts.map +1 -1
  39. package/out/replicache/src/db/rebase.js +27 -5
  40. package/out/replicache/src/db/rebase.js.map +1 -1
  41. package/out/replicache/src/get-kv-store-provider.d.ts +1 -1
  42. package/out/replicache/src/get-kv-store-provider.d.ts.map +1 -1
  43. package/out/replicache/src/get-kv-store-provider.js +4 -4
  44. package/out/replicache/src/get-kv-store-provider.js.map +1 -1
  45. package/out/replicache/src/kv/expo-sqlite/store.d.ts.map +1 -1
  46. package/out/replicache/src/kv/expo-sqlite/store.js +28 -5
  47. package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
  48. package/out/replicache/src/kv/idb-store.d.ts +18 -0
  49. package/out/replicache/src/kv/idb-store.d.ts.map +1 -1
  50. package/out/replicache/src/kv/idb-store.js +30 -2
  51. package/out/replicache/src/kv/idb-store.js.map +1 -1
  52. package/out/replicache/src/kv/mem-fallback-store.d.ts +54 -0
  53. package/out/replicache/src/kv/mem-fallback-store.d.ts.map +1 -0
  54. package/out/replicache/src/kv/mem-fallback-store.js +177 -0
  55. package/out/replicache/src/kv/mem-fallback-store.js.map +1 -0
  56. package/out/replicache/src/kv/mem-store.d.ts +1 -0
  57. package/out/replicache/src/kv/mem-store.d.ts.map +1 -1
  58. package/out/replicache/src/kv/mem-store.js +3 -0
  59. package/out/replicache/src/kv/mem-store.js.map +1 -1
  60. package/out/replicache/src/kv/op-sqlite/store.d.ts.map +1 -1
  61. package/out/replicache/src/kv/op-sqlite/store.js +4 -4
  62. package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
  63. package/out/replicache/src/kv/sqlite-store.d.ts +22 -1
  64. package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
  65. package/out/replicache/src/kv/sqlite-store.js +159 -14
  66. package/out/replicache/src/kv/sqlite-store.js.map +1 -1
  67. package/out/replicache/src/kv/store.d.ts +6 -0
  68. package/out/replicache/src/kv/store.d.ts.map +1 -1
  69. package/out/replicache/src/new-client-channel.js.map +1 -1
  70. package/out/replicache/src/persist/client-gc.d.ts +2 -1
  71. package/out/replicache/src/persist/client-gc.d.ts.map +1 -1
  72. package/out/replicache/src/persist/client-gc.js +2 -2
  73. package/out/replicache/src/persist/client-gc.js.map +1 -1
  74. package/out/replicache/src/persist/client-group-gc.d.ts +2 -1
  75. package/out/replicache/src/persist/client-group-gc.d.ts.map +1 -1
  76. package/out/replicache/src/persist/client-group-gc.js +2 -2
  77. package/out/replicache/src/persist/client-group-gc.js.map +1 -1
  78. package/out/replicache/src/persist/clients.d.ts +2 -2
  79. package/out/replicache/src/persist/collect-idb-databases.d.ts +28 -8
  80. package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
  81. package/out/replicache/src/persist/collect-idb-databases.js +97 -20
  82. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
  83. package/out/replicache/src/persist/heartbeat.d.ts +2 -1
  84. package/out/replicache/src/persist/heartbeat.d.ts.map +1 -1
  85. package/out/replicache/src/persist/heartbeat.js +2 -2
  86. package/out/replicache/src/persist/heartbeat.js.map +1 -1
  87. package/out/replicache/src/persist/idb-databases-store-db-name.js +1 -1
  88. package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -1
  89. package/out/replicache/src/persist/persist.d.ts.map +1 -1
  90. package/out/replicache/src/persist/persist.js +18 -8
  91. package/out/replicache/src/persist/persist.js.map +1 -1
  92. package/out/replicache/src/persist/refresh.js +6 -2
  93. package/out/replicache/src/persist/refresh.js.map +1 -1
  94. package/out/replicache/src/replicache-impl.d.ts +85 -3
  95. package/out/replicache/src/replicache-impl.d.ts.map +1 -1
  96. package/out/replicache/src/replicache-impl.js +321 -29
  97. package/out/replicache/src/replicache-impl.js.map +1 -1
  98. package/out/replicache/src/replicache-options.d.ts +9 -0
  99. package/out/replicache/src/replicache-options.d.ts.map +1 -1
  100. package/out/replicache/src/storage-failure.d.ts +37 -0
  101. package/out/replicache/src/storage-failure.d.ts.map +1 -0
  102. package/out/replicache/src/storage-failure.js +31 -0
  103. package/out/replicache/src/storage-failure.js.map +1 -0
  104. package/out/shared/src/arrays.d.ts +5 -0
  105. package/out/shared/src/arrays.d.ts.map +1 -1
  106. package/out/shared/src/arrays.js +8 -10
  107. package/out/shared/src/arrays.js.map +1 -1
  108. package/out/shared/src/base64.d.ts +19 -0
  109. package/out/shared/src/base64.d.ts.map +1 -0
  110. package/out/shared/src/base64.js +40 -0
  111. package/out/shared/src/base64.js.map +1 -0
  112. package/out/shared/src/centroid.d.ts +0 -1
  113. package/out/shared/src/centroid.d.ts.map +1 -1
  114. package/out/shared/src/centroid.js +1 -4
  115. package/out/shared/src/centroid.js.map +1 -1
  116. package/out/shared/src/error.d.ts +11 -0
  117. package/out/shared/src/error.d.ts.map +1 -1
  118. package/out/shared/src/error.js +35 -1
  119. package/out/shared/src/error.js.map +1 -1
  120. package/out/shared/src/hash.d.ts.map +1 -1
  121. package/out/shared/src/hash.js +32 -7
  122. package/out/shared/src/hash.js.map +1 -1
  123. package/out/shared/src/iterables.d.ts +2 -0
  124. package/out/shared/src/iterables.d.ts.map +1 -1
  125. package/out/shared/src/iterables.js +18 -1
  126. package/out/shared/src/iterables.js.map +1 -1
  127. package/out/shared/src/map.d.ts +24 -2
  128. package/out/shared/src/map.d.ts.map +1 -1
  129. package/out/shared/src/map.js +18 -4
  130. package/out/shared/src/map.js.map +1 -1
  131. package/out/shared/src/options-types.d.ts +2 -2
  132. package/out/shared/src/options.d.ts.map +1 -1
  133. package/out/shared/src/options.js +10 -7
  134. package/out/shared/src/options.js.map +1 -1
  135. package/out/shared/src/packed-boolean-map.d.ts +7 -0
  136. package/out/shared/src/packed-boolean-map.d.ts.map +1 -0
  137. package/out/shared/src/packed-boolean-map.js +36 -0
  138. package/out/shared/src/packed-boolean-map.js.map +1 -0
  139. package/out/shared/src/random-values.js +12 -1
  140. package/out/shared/src/random-values.js.map +1 -1
  141. package/out/shared/src/ring-buffer.d.ts +10 -0
  142. package/out/shared/src/ring-buffer.d.ts.map +1 -1
  143. package/out/shared/src/ring-buffer.js +26 -1
  144. package/out/shared/src/ring-buffer.js.map +1 -1
  145. package/out/shared/src/tdigest.d.ts +10 -0
  146. package/out/shared/src/tdigest.d.ts.map +1 -1
  147. package/out/shared/src/tdigest.js +147 -63
  148. package/out/shared/src/tdigest.js.map +1 -1
  149. package/out/shared/src/valita.d.ts +13 -0
  150. package/out/shared/src/valita.d.ts.map +1 -1
  151. package/out/shared/src/valita.js +23 -23
  152. package/out/shared/src/valita.js.map +1 -1
  153. package/out/z2s/src/compiler.d.ts.map +1 -1
  154. package/out/z2s/src/compiler.js +10 -6
  155. package/out/z2s/src/compiler.js.map +1 -1
  156. package/out/z2s/src/sql.d.ts.map +1 -1
  157. package/out/z2s/src/sql.js +9 -5
  158. package/out/z2s/src/sql.js.map +1 -1
  159. package/out/zero/package.js +4 -5
  160. package/out/zero/package.js.map +1 -1
  161. package/out/zero/src/zero.js +2 -1
  162. package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
  163. package/out/zero-cache/src/auth/write-authorizer.js +1 -0
  164. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  165. package/out/zero-cache/src/config/normalize.d.ts +1 -0
  166. package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
  167. package/out/zero-cache/src/config/normalize.js +46 -4
  168. package/out/zero-cache/src/config/normalize.js.map +1 -1
  169. package/out/zero-cache/src/config/zero-config.d.ts +116 -24
  170. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  171. package/out/zero-cache/src/config/zero-config.js +409 -157
  172. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  173. package/out/zero-cache/src/custom/fetch.d.ts +1 -1
  174. package/out/zero-cache/src/custom/fetch.d.ts.map +1 -1
  175. package/out/zero-cache/src/custom/fetch.js.map +1 -1
  176. package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
  177. package/out/zero-cache/src/db/lite-tables.js +3 -4
  178. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  179. package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
  180. package/out/zero-cache/src/db/migration-lite.js +5 -3
  181. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  182. package/out/zero-cache/src/observability/events.js +4 -1
  183. package/out/zero-cache/src/observability/events.js.map +1 -1
  184. package/out/zero-cache/src/observability/log-throttle.d.ts +44 -0
  185. package/out/zero-cache/src/observability/log-throttle.d.ts.map +1 -0
  186. package/out/zero-cache/src/observability/log-throttle.js +76 -0
  187. package/out/zero-cache/src/observability/log-throttle.js.map +1 -0
  188. package/out/zero-cache/src/observability/metrics.d.ts.map +1 -1
  189. package/out/zero-cache/src/observability/metrics.js +2 -7
  190. package/out/zero-cache/src/observability/metrics.js.map +1 -1
  191. package/out/zero-cache/src/scripts/permissions.d.ts +16 -0
  192. package/out/zero-cache/src/scripts/permissions.d.ts.map +1 -1
  193. package/out/zero-cache/src/scripts/permissions.js +3 -3
  194. package/out/zero-cache/src/scripts/permissions.js.map +1 -1
  195. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  196. package/out/zero-cache/src/server/change-streamer.js +117 -77
  197. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  198. package/out/zero-cache/src/server/inspector-delegate.d.ts +28 -2
  199. package/out/zero-cache/src/server/inspector-delegate.d.ts.map +1 -1
  200. package/out/zero-cache/src/server/inspector-delegate.js +37 -17
  201. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
  202. package/out/zero-cache/src/server/main.d.ts.map +1 -1
  203. package/out/zero-cache/src/server/main.js +8 -1
  204. package/out/zero-cache/src/server/main.js.map +1 -1
  205. package/out/zero-cache/src/server/mutator.js +2 -0
  206. package/out/zero-cache/src/server/mutator.js.map +1 -1
  207. package/out/zero-cache/src/server/reaper.d.ts.map +1 -1
  208. package/out/zero-cache/src/server/reaper.js +2 -0
  209. package/out/zero-cache/src/server/reaper.js.map +1 -1
  210. package/out/zero-cache/src/server/replicator.d.ts +3 -0
  211. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  212. package/out/zero-cache/src/server/replicator.js +95 -21
  213. package/out/zero-cache/src/server/replicator.js.map +1 -1
  214. package/out/zero-cache/src/server/runner/zero-dispatcher.d.ts.map +1 -1
  215. package/out/zero-cache/src/server/runner/zero-dispatcher.js +5 -0
  216. package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
  217. package/out/zero-cache/src/server/syncer-assigner.d.ts +14 -0
  218. package/out/zero-cache/src/server/syncer-assigner.d.ts.map +1 -0
  219. package/out/zero-cache/src/server/syncer-assigner.js +72 -0
  220. package/out/zero-cache/src/server/syncer-assigner.js.map +1 -0
  221. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  222. package/out/zero-cache/src/server/syncer.js +24 -2
  223. package/out/zero-cache/src/server/syncer.js.map +1 -1
  224. package/out/zero-cache/src/server/worker-dispatcher.d.ts.map +1 -1
  225. package/out/zero-cache/src/server/worker-dispatcher.js +21 -4
  226. package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -1
  227. package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
  228. package/out/zero-cache/src/services/analyze.js +11 -9
  229. package/out/zero-cache/src/services/analyze.js.map +1 -1
  230. package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts.map +1 -1
  231. package/out/zero-cache/src/services/change-source/common/backfill-manager.js +198 -24
  232. package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
  233. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.d.ts.map +1 -1
  234. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js +16 -4
  235. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -1
  236. package/out/zero-cache/src/services/change-source/common/init-cleanup.d.ts +24 -0
  237. package/out/zero-cache/src/services/change-source/common/init-cleanup.d.ts.map +1 -0
  238. package/out/zero-cache/src/services/change-source/common/init-cleanup.js +44 -0
  239. package/out/zero-cache/src/services/change-source/common/init-cleanup.js.map +1 -0
  240. package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts +92 -2
  241. package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts.map +1 -1
  242. package/out/zero-cache/src/services/change-source/common/replica-restore.js +27 -10
  243. package/out/zero-cache/src/services/change-source/common/replica-restore.js.map +1 -1
  244. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts +1 -0
  245. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
  246. package/out/zero-cache/src/services/change-source/common/replica-schema.js +15 -3
  247. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  248. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts +1 -1
  249. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
  250. package/out/zero-cache/src/services/change-source/custom/change-source.js +7 -3
  251. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  252. package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts +9 -0
  253. package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts.map +1 -1
  254. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +206 -19
  255. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
  256. package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts +55 -0
  257. package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts.map +1 -0
  258. package/out/zero-cache/src/services/change-source/pg/change-source-init.js +305 -0
  259. package/out/zero-cache/src/services/change-source/pg/change-source-init.js.map +1 -0
  260. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +31 -18
  261. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  262. package/out/zero-cache/src/services/change-source/pg/change-source.js +130 -157
  263. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  264. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +38 -2
  265. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  266. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +55 -21
  267. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  268. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts +31 -0
  269. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts.map +1 -1
  270. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +102 -3
  271. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  272. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts +16 -0
  273. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts.map +1 -0
  274. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js +113 -0
  275. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js.map +1 -0
  276. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts +40 -15
  277. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts.map +1 -1
  278. package/out/zero-cache/src/services/change-source/pg/replication-slots.js +149 -27
  279. package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
  280. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts.map +1 -1
  281. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js +68 -8
  282. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js.map +1 -1
  283. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
  284. package/out/zero-cache/src/services/change-source/pg/schema/init.js +32 -1
  285. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  286. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.d.ts +10 -0
  287. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.d.ts.map +1 -0
  288. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js +6 -0
  289. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js.map +1 -0
  290. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +50 -27
  291. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
  292. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +98 -34
  293. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  294. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts +68 -0
  295. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts.map +1 -0
  296. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js +141 -0
  297. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js.map +1 -0
  298. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +45 -2
  299. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
  300. package/out/zero-cache/src/services/change-source/protocol/current/data.js +10 -1
  301. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  302. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +60 -3
  303. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
  304. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts +23 -10
  305. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts.map +1 -1
  306. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js +17 -7
  307. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -1
  308. package/out/zero-cache/src/services/change-source/protocol/current.js +2 -1
  309. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts +72 -0
  310. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts.map +1 -0
  311. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js +162 -0
  312. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js.map +1 -0
  313. package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts +50 -0
  314. package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts.map +1 -0
  315. package/out/zero-cache/src/services/change-streamer/backfill-state.js +268 -0
  316. package/out/zero-cache/src/services/change-streamer/backfill-state.js.map +1 -0
  317. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts.map +1 -1
  318. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js +6 -17
  319. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js.map +1 -1
  320. package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts.map +1 -1
  321. package/out/zero-cache/src/services/change-streamer/backup-monitor.js +59 -8
  322. package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
  323. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts +8 -2
  324. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts.map +1 -1
  325. package/out/zero-cache/src/services/change-streamer/broadcast.js +24 -4
  326. package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
  327. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts +19 -4
  328. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts.map +1 -1
  329. package/out/zero-cache/src/services/change-streamer/change-log-codec.js +28 -8
  330. package/out/zero-cache/src/services/change-streamer/change-log-codec.js.map +1 -1
  331. package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts +17 -0
  332. package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts.map +1 -1
  333. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js +44 -1
  334. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js.map +1 -1
  335. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +48 -6
  336. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  337. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +131 -34
  338. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  339. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +22 -0
  340. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  341. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +149 -78
  342. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  343. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +38 -16
  344. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
  345. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  346. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts +3 -3
  347. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -1
  348. package/out/zero-cache/src/services/change-streamer/forwarder.js +36 -5
  349. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
  350. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts +53 -0
  351. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts.map +1 -0
  352. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js +156 -0
  353. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js.map +1 -0
  354. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +58 -1
  355. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
  356. package/out/zero-cache/src/services/change-streamer/schema/tables.js +107 -16
  357. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  358. package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts +92 -0
  359. package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts.map +1 -0
  360. package/out/zero-cache/src/services/change-streamer/snapshot-message.js +42 -0
  361. package/out/zero-cache/src/services/change-streamer/snapshot-message.js.map +1 -0
  362. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts +1 -1
  363. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts.map +1 -1
  364. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js +16 -4
  365. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js.map +1 -1
  366. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts +7 -69
  367. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts.map +1 -1
  368. package/out/zero-cache/src/services/change-streamer/snapshot.js +21 -53
  369. package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -1
  370. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts +6 -1
  371. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts.map +1 -1
  372. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js +27 -9
  373. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js.map +1 -1
  374. package/out/zero-cache/src/services/change-streamer/storer.d.ts +95 -4
  375. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  376. package/out/zero-cache/src/services/change-streamer/storer.js +293 -83
  377. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  378. package/out/zero-cache/src/services/change-streamer/subscribe.d.ts +446 -0
  379. package/out/zero-cache/src/services/change-streamer/subscribe.d.ts.map +1 -0
  380. package/out/zero-cache/src/services/change-streamer/subscribe.js +76 -0
  381. package/out/zero-cache/src/services/change-streamer/subscribe.js.map +1 -0
  382. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +58 -1
  383. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
  384. package/out/zero-cache/src/services/change-streamer/subscriber.js +123 -12
  385. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  386. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts +19 -1
  387. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts.map +1 -1
  388. package/out/zero-cache/src/services/change-streamer/upstream-acker.js +23 -3
  389. package/out/zero-cache/src/services/change-streamer/upstream-acker.js.map +1 -1
  390. package/out/zero-cache/src/services/http-service.d.ts +1 -1
  391. package/out/zero-cache/src/services/http-service.d.ts.map +1 -1
  392. package/out/zero-cache/src/services/http-service.js.map +1 -1
  393. package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
  394. package/out/zero-cache/src/services/life-cycle.js +3 -1
  395. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  396. package/out/zero-cache/src/services/litestream/commands.d.ts +34 -3
  397. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  398. package/out/zero-cache/src/services/litestream/commands.js +121 -35
  399. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  400. package/out/zero-cache/src/services/litestream/config-v5.yml +6 -7
  401. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js +51 -24
  402. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js.map +1 -1
  403. package/out/zero-cache/src/services/litestream/litestream-controller.d.ts +10 -2
  404. package/out/zero-cache/src/services/litestream/litestream-controller.d.ts.map +1 -1
  405. package/out/zero-cache/src/services/litestream/litestream-controller.js +3 -2
  406. package/out/zero-cache/src/services/litestream/litestream-controller.js.map +1 -1
  407. package/out/zero-cache/src/services/litestream/restore-progress.d.ts +24 -0
  408. package/out/zero-cache/src/services/litestream/restore-progress.d.ts.map +1 -0
  409. package/out/zero-cache/src/services/litestream/restore-progress.js +91 -0
  410. package/out/zero-cache/src/services/litestream/restore-progress.js.map +1 -0
  411. package/out/zero-cache/src/services/litestream/wal-keeper.d.ts +33 -0
  412. package/out/zero-cache/src/services/litestream/wal-keeper.d.ts.map +1 -0
  413. package/out/zero-cache/src/services/litestream/wal-keeper.js +49 -0
  414. package/out/zero-cache/src/services/litestream/wal-keeper.js.map +1 -0
  415. package/out/zero-cache/src/services/mutagen/mutagen.d.ts +5 -0
  416. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  417. package/out/zero-cache/src/services/mutagen/mutagen.js +7 -1
  418. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  419. package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
  420. package/out/zero-cache/src/services/mutagen/pusher.js +5 -6
  421. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  422. package/out/zero-cache/src/services/plannerz.d.ts +163 -0
  423. package/out/zero-cache/src/services/plannerz.d.ts.map +1 -0
  424. package/out/zero-cache/src/services/plannerz.js +267 -0
  425. package/out/zero-cache/src/services/plannerz.js.map +1 -0
  426. package/out/zero-cache/src/services/profz.d.ts +30 -0
  427. package/out/zero-cache/src/services/profz.d.ts.map +1 -0
  428. package/out/zero-cache/src/services/profz.js +163 -0
  429. package/out/zero-cache/src/services/profz.js.map +1 -0
  430. package/out/zero-cache/src/services/replicator/change-log-cookies.js +1 -1
  431. package/out/zero-cache/src/services/replicator/change-log-cookies.js.map +1 -1
  432. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts +5 -4
  433. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts.map +1 -1
  434. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js +20 -22
  435. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js.map +1 -1
  436. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
  437. package/out/zero-cache/src/services/replicator/change-processor.js +51 -5
  438. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  439. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +5 -2
  440. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  441. package/out/zero-cache/src/services/replicator/incremental-sync.js +54 -21
  442. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  443. package/out/zero-cache/src/services/replicator/replication-status.d.ts +35 -1
  444. package/out/zero-cache/src/services/replicator/replication-status.d.ts.map +1 -1
  445. package/out/zero-cache/src/services/replicator/replication-status.js +99 -8
  446. package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
  447. package/out/zero-cache/src/services/replicator/replicator.d.ts +4 -1
  448. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
  449. package/out/zero-cache/src/services/replicator/replicator.js +5 -2
  450. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  451. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts +16 -1
  452. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts.map +1 -1
  453. package/out/zero-cache/src/services/replicator/reporter/recorder.js +70 -27
  454. package/out/zero-cache/src/services/replicator/reporter/recorder.js.map +1 -1
  455. package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts +23 -2
  456. package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts.map +1 -1
  457. package/out/zero-cache/src/services/replicator/schema/backfilling.js +54 -2
  458. package/out/zero-cache/src/services/replicator/schema/backfilling.js.map +1 -1
  459. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts +6 -6
  460. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts.map +1 -1
  461. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js +19 -14
  462. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js.map +1 -1
  463. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts +11 -3
  464. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts.map +1 -1
  465. package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
  466. package/out/zero-cache/src/services/replicator/write-worker.js +5 -1
  467. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
  468. package/out/zero-cache/src/services/run-ast.d.ts +12 -0
  469. package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
  470. package/out/zero-cache/src/services/run-ast.js +42 -22
  471. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  472. package/out/zero-cache/src/services/runner.d.ts +2 -1
  473. package/out/zero-cache/src/services/runner.d.ts.map +1 -1
  474. package/out/zero-cache/src/services/runner.js +10 -2
  475. package/out/zero-cache/src/services/runner.js.map +1 -1
  476. package/out/zero-cache/src/services/statz.d.ts +4 -0
  477. package/out/zero-cache/src/services/statz.d.ts.map +1 -1
  478. package/out/zero-cache/src/services/statz.js +22 -5
  479. package/out/zero-cache/src/services/statz.js.map +1 -1
  480. package/out/zero-cache/src/services/view-syncer/advancement-metrics.d.ts +26 -0
  481. package/out/zero-cache/src/services/view-syncer/advancement-metrics.d.ts.map +1 -0
  482. package/out/zero-cache/src/services/view-syncer/advancement-metrics.js +26 -0
  483. package/out/zero-cache/src/services/view-syncer/advancement-metrics.js.map +1 -0
  484. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +19 -2
  485. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
  486. package/out/zero-cache/src/services/view-syncer/client-handler.js +42 -30
  487. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  488. package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts +2 -1
  489. package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts.map +1 -1
  490. package/out/zero-cache/src/services/view-syncer/connection-context-manager.js +1 -0
  491. package/out/zero-cache/src/services/view-syncer/connection-context-manager.js.map +1 -1
  492. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +27 -2
  493. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  494. package/out/zero-cache/src/services/view-syncer/cvr-store.js +85 -20
  495. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  496. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +76 -11
  497. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  498. package/out/zero-cache/src/services/view-syncer/cvr.js +214 -40
  499. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  500. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts +81 -0
  501. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts.map +1 -0
  502. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js +128 -0
  503. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js.map +1 -0
  504. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts +14 -1
  505. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts.map +1 -1
  506. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +30 -4
  507. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
  508. package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts +33 -0
  509. package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts.map +1 -0
  510. package/out/zero-cache/src/services/view-syncer/hydration-budget.js +62 -0
  511. package/out/zero-cache/src/services/view-syncer/hydration-budget.js.map +1 -0
  512. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts +51 -0
  513. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts.map +1 -0
  514. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js +78 -0
  515. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js.map +1 -0
  516. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts +10 -1
  517. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts.map +1 -1
  518. package/out/zero-cache/src/services/view-syncer/inspect-handler.js +18 -4
  519. package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
  520. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +80 -6
  521. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  522. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +658 -195
  523. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  524. package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts +7 -0
  525. package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts.map +1 -0
  526. package/out/zero-cache/src/services/view-syncer/plan-warnings.js +35 -0
  527. package/out/zero-cache/src/services/view-syncer/plan-warnings.js.map +1 -0
  528. package/out/zero-cache/src/services/view-syncer/query-covering.d.ts.map +1 -1
  529. package/out/zero-cache/src/services/view-syncer/query-covering.js +2 -6
  530. package/out/zero-cache/src/services/view-syncer/query-covering.js.map +1 -1
  531. package/out/zero-cache/src/services/view-syncer/query-shape.d.ts +25 -0
  532. package/out/zero-cache/src/services/view-syncer/query-shape.d.ts.map +1 -0
  533. package/out/zero-cache/src/services/view-syncer/query-shape.js +28 -0
  534. package/out/zero-cache/src/services/view-syncer/query-shape.js.map +1 -0
  535. package/out/zero-cache/src/services/view-syncer/query-stats.d.ts +82 -0
  536. package/out/zero-cache/src/services/view-syncer/query-stats.d.ts.map +1 -0
  537. package/out/zero-cache/src/services/view-syncer/query-stats.js +214 -0
  538. package/out/zero-cache/src/services/view-syncer/query-stats.js.map +1 -0
  539. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +2 -107
  540. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +1 -1
  541. package/out/zero-cache/src/services/view-syncer/schema/types.js +5 -20
  542. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  543. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts +95 -0
  544. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts.map +1 -0
  545. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js +155 -0
  546. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js.map +1 -0
  547. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +96 -14
  548. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  549. package/out/zero-cache/src/services/view-syncer/snapshotter.js +214 -30
  550. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  551. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +11 -1
  552. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  553. package/out/zero-cache/src/services/view-syncer/view-syncer.js +566 -107
  554. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  555. package/out/zero-cache/src/types/pg-data-type.d.ts +2 -0
  556. package/out/zero-cache/src/types/pg-data-type.d.ts.map +1 -1
  557. package/out/zero-cache/src/types/pg-data-type.js +6 -1
  558. package/out/zero-cache/src/types/pg-data-type.js.map +1 -1
  559. package/out/zero-cache/src/types/pg.d.ts.map +1 -1
  560. package/out/zero-cache/src/types/pg.js +1 -1
  561. package/out/zero-cache/src/types/pg.js.map +1 -1
  562. package/out/zero-cache/src/types/processes.d.ts +39 -0
  563. package/out/zero-cache/src/types/processes.d.ts.map +1 -1
  564. package/out/zero-cache/src/types/processes.js +43 -4
  565. package/out/zero-cache/src/types/processes.js.map +1 -1
  566. package/out/zero-cache/src/types/profiler.d.ts +12 -0
  567. package/out/zero-cache/src/types/profiler.d.ts.map +1 -1
  568. package/out/zero-cache/src/types/profiler.js +46 -1
  569. package/out/zero-cache/src/types/profiler.js.map +1 -1
  570. package/out/zero-cache/src/types/row-key.d.ts +1 -15
  571. package/out/zero-cache/src/types/row-key.d.ts.map +1 -1
  572. package/out/zero-cache/src/types/row-key.js +6 -8
  573. package/out/zero-cache/src/types/row-key.js.map +1 -1
  574. package/out/zero-cache/src/types/streams.d.ts +49 -7
  575. package/out/zero-cache/src/types/streams.d.ts.map +1 -1
  576. package/out/zero-cache/src/types/streams.js +190 -58
  577. package/out/zero-cache/src/types/streams.js.map +1 -1
  578. package/out/zero-cache/src/types/subscription.d.ts +15 -0
  579. package/out/zero-cache/src/types/subscription.d.ts.map +1 -1
  580. package/out/zero-cache/src/types/subscription.js +123 -31
  581. package/out/zero-cache/src/types/subscription.js.map +1 -1
  582. package/out/zero-cache/src/types/websocket-handoff.d.ts +1 -1
  583. package/out/zero-cache/src/types/websocket-handoff.d.ts.map +1 -1
  584. package/out/zero-cache/src/types/websocket-handoff.js +18 -9
  585. package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
  586. package/out/zero-cache/src/types/ws.d.ts.map +1 -1
  587. package/out/zero-cache/src/types/ws.js +1 -16
  588. package/out/zero-cache/src/types/ws.js.map +1 -1
  589. package/out/zero-cache/src/workers/connect-params.d.ts +18 -1
  590. package/out/zero-cache/src/workers/connect-params.d.ts.map +1 -1
  591. package/out/zero-cache/src/workers/connect-params.js +25 -1
  592. package/out/zero-cache/src/workers/connect-params.js.map +1 -1
  593. package/out/zero-cache/src/workers/connection.d.ts +4 -4
  594. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  595. package/out/zero-cache/src/workers/connection.js +8 -8
  596. package/out/zero-cache/src/workers/connection.js.map +1 -1
  597. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
  598. package/out/zero-cache/src/workers/replicator.js +15 -7
  599. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  600. package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +1 -1
  601. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +21 -16
  602. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  603. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  604. package/out/zero-cache/src/workers/syncer.js +55 -4
  605. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  606. package/out/zero-client/src/client/active-clients-manager.d.ts.map +1 -1
  607. package/out/zero-client/src/client/active-clients-manager.js +4 -1
  608. package/out/zero-client/src/client/active-clients-manager.js.map +1 -1
  609. package/out/zero-client/src/client/connection-manager.d.ts +20 -0
  610. package/out/zero-client/src/client/connection-manager.d.ts.map +1 -1
  611. package/out/zero-client/src/client/connection-manager.js +77 -13
  612. package/out/zero-client/src/client/connection-manager.js.map +1 -1
  613. package/out/zero-client/src/client/connection-status-enum.d.ts +2 -0
  614. package/out/zero-client/src/client/connection-status-enum.d.ts.map +1 -1
  615. package/out/zero-client/src/client/connection-status-enum.js +3 -1
  616. package/out/zero-client/src/client/connection-status-enum.js.map +1 -1
  617. package/out/zero-client/src/client/connection.d.ts +6 -0
  618. package/out/zero-client/src/client/connection.d.ts.map +1 -1
  619. package/out/zero-client/src/client/connection.js +2 -1
  620. package/out/zero-client/src/client/connection.js.map +1 -1
  621. package/out/zero-client/src/client/context.d.ts +23 -13
  622. package/out/zero-client/src/client/context.d.ts.map +1 -1
  623. package/out/zero-client/src/client/context.js +94 -26
  624. package/out/zero-client/src/client/context.js.map +1 -1
  625. package/out/zero-client/src/client/crud-impl.d.ts.map +1 -1
  626. package/out/zero-client/src/client/crud-impl.js +1 -1
  627. package/out/zero-client/src/client/crud-impl.js.map +1 -1
  628. package/out/zero-client/src/client/custom.d.ts +5 -4
  629. package/out/zero-client/src/client/custom.d.ts.map +1 -1
  630. package/out/zero-client/src/client/custom.js +3 -3
  631. package/out/zero-client/src/client/custom.js.map +1 -1
  632. package/out/zero-client/src/client/inspector/lazy-inspector.js +1 -1
  633. package/out/zero-client/src/client/ivm-branch.d.ts.map +1 -1
  634. package/out/zero-client/src/client/ivm-branch.js +20 -3
  635. package/out/zero-client/src/client/ivm-branch.js.map +1 -1
  636. package/out/zero-client/src/client/keys.d.ts.map +1 -1
  637. package/out/zero-client/src/client/keys.js +19 -1
  638. package/out/zero-client/src/client/keys.js.map +1 -1
  639. package/out/zero-client/src/client/make-mutate-property.d.ts +1 -1
  640. package/out/zero-client/src/client/make-mutate-property.d.ts.map +1 -1
  641. package/out/zero-client/src/client/make-mutate-property.js.map +1 -1
  642. package/out/zero-client/src/client/make-replicache-mutators.d.ts.map +1 -1
  643. package/out/zero-client/src/client/make-replicache-mutators.js +1 -1
  644. package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
  645. package/out/zero-client/src/client/mutation-tracker.d.ts +2 -2
  646. package/out/zero-client/src/client/mutation-tracker.d.ts.map +1 -1
  647. package/out/zero-client/src/client/mutation-tracker.js +3 -7
  648. package/out/zero-client/src/client/mutation-tracker.js.map +1 -1
  649. package/out/zero-client/src/client/mutator-proxy.d.ts.map +1 -1
  650. package/out/zero-client/src/client/mutator-proxy.js +9 -4
  651. package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
  652. package/out/zero-client/src/client/options.d.ts +33 -0
  653. package/out/zero-client/src/client/options.d.ts.map +1 -1
  654. package/out/zero-client/src/client/options.js.map +1 -1
  655. package/out/zero-client/src/client/query-manager.d.ts +9 -0
  656. package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
  657. package/out/zero-client/src/client/query-manager.js +47 -14
  658. package/out/zero-client/src/client/query-manager.js.map +1 -1
  659. package/out/zero-client/src/client/reload-error-handler.js +2 -2
  660. package/out/zero-client/src/client/reload-error-handler.js.map +1 -1
  661. package/out/zero-client/src/client/version.js +1 -1
  662. package/out/zero-client/src/client/zero-rep.d.ts +1 -0
  663. package/out/zero-client/src/client/zero-rep.d.ts.map +1 -1
  664. package/out/zero-client/src/client/zero-rep.js +8 -6
  665. package/out/zero-client/src/client/zero-rep.js.map +1 -1
  666. package/out/zero-client/src/client/zero.d.ts +18 -3
  667. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  668. package/out/zero-client/src/client/zero.js +89 -50
  669. package/out/zero-client/src/client/zero.js.map +1 -1
  670. package/out/zero-client/src/mod.d.ts +2 -1
  671. package/out/zero-client/src/mod.d.ts.map +1 -1
  672. package/out/zero-client/src/mod.js +1 -0
  673. package/out/zero-client/src/types/query-result.d.ts +2 -0
  674. package/out/zero-client/src/types/query-result.d.ts.map +1 -1
  675. package/out/zero-events/src/status.d.ts +64 -0
  676. package/out/zero-events/src/status.d.ts.map +1 -1
  677. package/out/zero-protocol/src/analyze-query-result.d.ts +5 -0
  678. package/out/zero-protocol/src/analyze-query-result.d.ts.map +1 -1
  679. package/out/zero-protocol/src/analyze-query-result.js.map +1 -1
  680. package/out/zero-protocol/src/ast.d.ts.map +1 -1
  681. package/out/zero-protocol/src/ast.js +13 -14
  682. package/out/zero-protocol/src/ast.js.map +1 -1
  683. package/out/zero-protocol/src/connect.d.ts +16 -0
  684. package/out/zero-protocol/src/connect.d.ts.map +1 -1
  685. package/out/zero-protocol/src/connect.js +27 -1
  686. package/out/zero-protocol/src/connect.js.map +1 -1
  687. package/out/zero-protocol/src/down.d.ts +31 -31
  688. package/out/zero-protocol/src/feature-flag-enum.d.ts +14 -0
  689. package/out/zero-protocol/src/feature-flag-enum.d.ts.map +1 -0
  690. package/out/zero-protocol/src/feature-flag-enum.js +10 -0
  691. package/out/zero-protocol/src/feature-flag-enum.js.map +1 -0
  692. package/out/zero-protocol/src/feature-flag.d.ts +5 -0
  693. package/out/zero-protocol/src/feature-flag.d.ts.map +1 -0
  694. package/out/zero-protocol/src/inspect-down.d.ts +16 -16
  695. package/out/zero-protocol/src/poke.d.ts +17 -10
  696. package/out/zero-protocol/src/poke.d.ts.map +1 -1
  697. package/out/zero-protocol/src/poke.js +3 -2
  698. package/out/zero-protocol/src/poke.js.map +1 -1
  699. package/out/zero-protocol/src/protocol-version.d.ts +30 -6
  700. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
  701. package/out/zero-protocol/src/protocol-version.js +1 -1
  702. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  703. package/out/zero-protocol/src/query-hash.d.ts.map +1 -1
  704. package/out/zero-protocol/src/query-hash.js +2 -5
  705. package/out/zero-protocol/src/query-hash.js.map +1 -1
  706. package/out/zero-react/src/use-query.d.ts +5 -4
  707. package/out/zero-react/src/use-query.d.ts.map +1 -1
  708. package/out/zero-react/src/use-query.js +74 -7
  709. package/out/zero-react/src/use-query.js.map +1 -1
  710. package/out/zero-react/src/zero.js +1 -0
  711. package/out/zero-server/src/adapters/drizzle.d.ts +2 -1
  712. package/out/zero-server/src/adapters/drizzle.d.ts.map +1 -1
  713. package/out/zero-server/src/adapters/drizzle.js +12 -7
  714. package/out/zero-server/src/adapters/drizzle.js.map +1 -1
  715. package/out/zero-server/src/adapters/kysely.d.ts +2 -1
  716. package/out/zero-server/src/adapters/kysely.d.ts.map +1 -1
  717. package/out/zero-server/src/adapters/kysely.js +8 -2
  718. package/out/zero-server/src/adapters/kysely.js.map +1 -1
  719. package/out/zero-server/src/adapters/pg.d.ts +5 -1
  720. package/out/zero-server/src/adapters/pg.d.ts.map +1 -1
  721. package/out/zero-server/src/adapters/pg.js +28 -7
  722. package/out/zero-server/src/adapters/pg.js.map +1 -1
  723. package/out/zero-server/src/adapters/postgresjs.d.ts +1 -0
  724. package/out/zero-server/src/adapters/postgresjs.d.ts.map +1 -1
  725. package/out/zero-server/src/adapters/postgresjs.js +7 -1
  726. package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
  727. package/out/zero-server/src/adapters/prisma.d.ts +3 -2
  728. package/out/zero-server/src/adapters/prisma.d.ts.map +1 -1
  729. package/out/zero-server/src/adapters/prisma.js +8 -2
  730. package/out/zero-server/src/adapters/prisma.js.map +1 -1
  731. package/out/zero-server/src/closable-db-transaction.d.ts +16 -0
  732. package/out/zero-server/src/closable-db-transaction.d.ts.map +1 -0
  733. package/out/zero-server/src/closable-db-transaction.js +31 -0
  734. package/out/zero-server/src/closable-db-transaction.js.map +1 -0
  735. package/out/zero-server/src/custom.d.ts +10 -4
  736. package/out/zero-server/src/custom.d.ts.map +1 -1
  737. package/out/zero-server/src/custom.js +15 -6
  738. package/out/zero-server/src/custom.js.map +1 -1
  739. package/out/zero-server/src/logging.d.ts +2 -2
  740. package/out/zero-server/src/logging.d.ts.map +1 -1
  741. package/out/zero-server/src/logging.js +2 -2
  742. package/out/zero-server/src/logging.js.map +1 -1
  743. package/out/zero-server/src/mod.d.ts +1 -1
  744. package/out/zero-server/src/mod.d.ts.map +1 -1
  745. package/out/zero-server/src/pg-query-executor.d.ts +2 -2
  746. package/out/zero-server/src/pg-query-executor.d.ts.map +1 -1
  747. package/out/zero-server/src/pg-query-executor.js +2 -2
  748. package/out/zero-server/src/pg-query-executor.js.map +1 -1
  749. package/out/zero-server/src/process-mutations.d.ts +25 -4
  750. package/out/zero-server/src/process-mutations.d.ts.map +1 -1
  751. package/out/zero-server/src/process-mutations.js +103 -52
  752. package/out/zero-server/src/process-mutations.js.map +1 -1
  753. package/out/zero-server/src/push-processor.d.ts +8 -2
  754. package/out/zero-server/src/push-processor.d.ts.map +1 -1
  755. package/out/zero-server/src/push-processor.js +12 -4
  756. package/out/zero-server/src/push-processor.js.map +1 -1
  757. package/out/zero-server/src/schema.d.ts +2 -2
  758. package/out/zero-server/src/schema.d.ts.map +1 -1
  759. package/out/zero-server/src/schema.js +3 -2
  760. package/out/zero-server/src/schema.js.map +1 -1
  761. package/out/zero-server/src/zql-database.d.ts +21 -1
  762. package/out/zero-server/src/zql-database.d.ts.map +1 -1
  763. package/out/zero-server/src/zql-database.js +61 -24
  764. package/out/zero-server/src/zql-database.js.map +1 -1
  765. package/out/zero-solid/src/solid-view.d.ts +17 -0
  766. package/out/zero-solid/src/solid-view.d.ts.map +1 -1
  767. package/out/zero-solid/src/solid-view.js +39 -1
  768. package/out/zero-solid/src/solid-view.js.map +1 -1
  769. package/out/zero-solid/src/use-query.js +1 -2
  770. package/out/zero-solid/src/use-query.js.map +1 -1
  771. package/out/zero-solid/src/zero.js +1 -0
  772. package/out/zql/src/builder/builder.d.ts +25 -0
  773. package/out/zql/src/builder/builder.d.ts.map +1 -1
  774. package/out/zql/src/builder/builder.js +69 -19
  775. package/out/zql/src/builder/builder.js.map +1 -1
  776. package/out/zql/src/builder/correlated-predicate-pushdown.d.ts +43 -0
  777. package/out/zql/src/builder/correlated-predicate-pushdown.d.ts.map +1 -0
  778. package/out/zql/src/builder/correlated-predicate-pushdown.js +161 -0
  779. package/out/zql/src/builder/correlated-predicate-pushdown.js.map +1 -0
  780. package/out/zql/src/builder/debug-delegate.d.ts +6 -1
  781. package/out/zql/src/builder/debug-delegate.d.ts.map +1 -1
  782. package/out/zql/src/builder/debug-delegate.js +14 -2
  783. package/out/zql/src/builder/debug-delegate.js.map +1 -1
  784. package/out/zql/src/ivm/array-view.d.ts +29 -0
  785. package/out/zql/src/ivm/array-view.d.ts.map +1 -1
  786. package/out/zql/src/ivm/array-view.js +74 -16
  787. package/out/zql/src/ivm/array-view.js.map +1 -1
  788. package/out/zql/src/ivm/cap.d.ts +2 -1
  789. package/out/zql/src/ivm/cap.d.ts.map +1 -1
  790. package/out/zql/src/ivm/cap.js +14 -4
  791. package/out/zql/src/ivm/cap.js.map +1 -1
  792. package/out/zql/src/ivm/data.d.ts.map +1 -1
  793. package/out/zql/src/ivm/data.js +8 -3
  794. package/out/zql/src/ivm/data.js.map +1 -1
  795. package/out/zql/src/ivm/deferred-input.d.ts.map +1 -1
  796. package/out/zql/src/ivm/deferred-input.js +3 -2
  797. package/out/zql/src/ivm/deferred-input.js.map +1 -1
  798. package/out/zql/src/ivm/exists.d.ts +3 -1
  799. package/out/zql/src/ivm/exists.d.ts.map +1 -1
  800. package/out/zql/src/ivm/exists.js +4 -1
  801. package/out/zql/src/ivm/exists.js.map +1 -1
  802. package/out/zql/src/ivm/fan-in.d.ts +6 -2
  803. package/out/zql/src/ivm/fan-in.d.ts.map +1 -1
  804. package/out/zql/src/ivm/fan-in.js +13 -5
  805. package/out/zql/src/ivm/fan-in.js.map +1 -1
  806. package/out/zql/src/ivm/fan-out.d.ts +5 -2
  807. package/out/zql/src/ivm/fan-out.d.ts.map +1 -1
  808. package/out/zql/src/ivm/fan-out.js +4 -0
  809. package/out/zql/src/ivm/fan-out.js.map +1 -1
  810. package/out/zql/src/ivm/filter-operators.d.ts +8 -6
  811. package/out/zql/src/ivm/filter-operators.d.ts.map +1 -1
  812. package/out/zql/src/ivm/filter-operators.js +19 -8
  813. package/out/zql/src/ivm/filter-operators.js.map +1 -1
  814. package/out/zql/src/ivm/filter.d.ts +5 -2
  815. package/out/zql/src/ivm/filter.d.ts.map +1 -1
  816. package/out/zql/src/ivm/filter.js +10 -4
  817. package/out/zql/src/ivm/filter.js.map +1 -1
  818. package/out/zql/src/ivm/flipped-join.d.ts +9 -4
  819. package/out/zql/src/ivm/flipped-join.d.ts.map +1 -1
  820. package/out/zql/src/ivm/flipped-join.js +97 -46
  821. package/out/zql/src/ivm/flipped-join.js.map +1 -1
  822. package/out/zql/src/ivm/join-index-tap.d.ts +33 -0
  823. package/out/zql/src/ivm/join-index-tap.d.ts.map +1 -0
  824. package/out/zql/src/ivm/join-index-tap.js +70 -0
  825. package/out/zql/src/ivm/join-index-tap.js.map +1 -0
  826. package/out/zql/src/ivm/join-index.d.ts +35 -0
  827. package/out/zql/src/ivm/join-index.d.ts.map +1 -0
  828. package/out/zql/src/ivm/join-index.js +141 -0
  829. package/out/zql/src/ivm/join-index.js.map +1 -0
  830. package/out/zql/src/ivm/join-utils.d.ts +6 -0
  831. package/out/zql/src/ivm/join-utils.d.ts.map +1 -1
  832. package/out/zql/src/ivm/join-utils.js +22 -1
  833. package/out/zql/src/ivm/join-utils.js.map +1 -1
  834. package/out/zql/src/ivm/join.d.ts +19 -1
  835. package/out/zql/src/ivm/join.d.ts.map +1 -1
  836. package/out/zql/src/ivm/join.js +107 -15
  837. package/out/zql/src/ivm/join.js.map +1 -1
  838. package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts +1 -1
  839. package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts.map +1 -1
  840. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +6 -4
  841. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
  842. package/out/zql/src/ivm/memory-source.d.ts +29 -4
  843. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  844. package/out/zql/src/ivm/memory-source.js +70 -34
  845. package/out/zql/src/ivm/memory-source.js.map +1 -1
  846. package/out/zql/src/ivm/memory-storage.d.ts +1 -0
  847. package/out/zql/src/ivm/memory-storage.d.ts.map +1 -1
  848. package/out/zql/src/ivm/memory-storage.js +1 -0
  849. package/out/zql/src/ivm/memory-storage.js.map +1 -1
  850. package/out/zql/src/ivm/operator.d.ts +45 -10
  851. package/out/zql/src/ivm/operator.d.ts.map +1 -1
  852. package/out/zql/src/ivm/operator.js +9 -4
  853. package/out/zql/src/ivm/operator.js.map +1 -1
  854. package/out/zql/src/ivm/push-accumulated.d.ts +6 -1
  855. package/out/zql/src/ivm/push-accumulated.d.ts.map +1 -1
  856. package/out/zql/src/ivm/push-accumulated.js +47 -2
  857. package/out/zql/src/ivm/push-accumulated.js.map +1 -1
  858. package/out/zql/src/ivm/skip.d.ts +2 -1
  859. package/out/zql/src/ivm/skip.d.ts.map +1 -1
  860. package/out/zql/src/ivm/skip.js +3 -0
  861. package/out/zql/src/ivm/skip.js.map +1 -1
  862. package/out/zql/src/ivm/take-gate.d.ts +57 -0
  863. package/out/zql/src/ivm/take-gate.d.ts.map +1 -0
  864. package/out/zql/src/ivm/take-gate.js +106 -0
  865. package/out/zql/src/ivm/take-gate.js.map +1 -0
  866. package/out/zql/src/ivm/take.d.ts +8 -2
  867. package/out/zql/src/ivm/take.d.ts.map +1 -1
  868. package/out/zql/src/ivm/take.js +139 -103
  869. package/out/zql/src/ivm/take.js.map +1 -1
  870. package/out/zql/src/ivm/union-fan-in.d.ts +3 -0
  871. package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
  872. package/out/zql/src/ivm/union-fan-in.js +63 -10
  873. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  874. package/out/zql/src/ivm/union-fan-out.d.ts +2 -1
  875. package/out/zql/src/ivm/union-fan-out.d.ts.map +1 -1
  876. package/out/zql/src/ivm/union-fan-out.js +5 -0
  877. package/out/zql/src/ivm/union-fan-out.js.map +1 -1
  878. package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
  879. package/out/zql/src/ivm/view-apply-change.js +9 -4
  880. package/out/zql/src/ivm/view-apply-change.js.map +1 -1
  881. package/out/zql/src/ivm/view.d.ts +15 -0
  882. package/out/zql/src/ivm/view.d.ts.map +1 -1
  883. package/out/zql/src/mutate/custom.d.ts +53 -1
  884. package/out/zql/src/mutate/custom.d.ts.map +1 -1
  885. package/out/zql/src/mutate/custom.js.map +1 -1
  886. package/out/zql/src/mutate/mutator-registry.d.ts.map +1 -1
  887. package/out/zql/src/mutate/mutator-registry.js +3 -3
  888. package/out/zql/src/mutate/mutator-registry.js.map +1 -1
  889. package/out/zql/src/mutate/mutator.d.ts +2 -2
  890. package/out/zql/src/mutate/mutator.d.ts.map +1 -1
  891. package/out/zql/src/mutate/mutator.js.map +1 -1
  892. package/out/zql/src/planner/planner-builder.d.ts +23 -3
  893. package/out/zql/src/planner/planner-builder.d.ts.map +1 -1
  894. package/out/zql/src/planner/planner-builder.js +34 -17
  895. package/out/zql/src/planner/planner-builder.js.map +1 -1
  896. package/out/zql/src/planner/planner-connection.d.ts +58 -2
  897. package/out/zql/src/planner/planner-connection.d.ts.map +1 -1
  898. package/out/zql/src/planner/planner-connection.js +103 -11
  899. package/out/zql/src/planner/planner-connection.js.map +1 -1
  900. package/out/zql/src/planner/planner-debug.d.ts.map +1 -1
  901. package/out/zql/src/planner/planner-debug.js +3 -8
  902. package/out/zql/src/planner/planner-debug.js.map +1 -1
  903. package/out/zql/src/planner/planner-graph.d.ts +10 -0
  904. package/out/zql/src/planner/planner-graph.d.ts.map +1 -1
  905. package/out/zql/src/planner/planner-graph.js +14 -0
  906. package/out/zql/src/planner/planner-graph.js.map +1 -1
  907. package/out/zql/src/planner/planner-source.d.ts +2 -2
  908. package/out/zql/src/planner/planner-source.d.ts.map +1 -1
  909. package/out/zql/src/planner/planner-source.js +2 -2
  910. package/out/zql/src/planner/planner-source.js.map +1 -1
  911. package/out/zql/src/planner/planner-warnings.d.ts +83 -0
  912. package/out/zql/src/planner/planner-warnings.d.ts.map +1 -0
  913. package/out/zql/src/planner/planner-warnings.js +78 -0
  914. package/out/zql/src/planner/planner-warnings.js.map +1 -0
  915. package/out/zql/src/query/measure-push-operator.d.ts +9 -2
  916. package/out/zql/src/query/measure-push-operator.d.ts.map +1 -1
  917. package/out/zql/src/query/measure-push-operator.js +52 -5
  918. package/out/zql/src/query/measure-push-operator.js.map +1 -1
  919. package/out/zql/src/query/query-delegate-base.d.ts +4 -2
  920. package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
  921. package/out/zql/src/query/query-delegate-base.js +66 -33
  922. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  923. package/out/zql/src/query/query-delegate.d.ts +33 -6
  924. package/out/zql/src/query/query-delegate.d.ts.map +1 -1
  925. package/out/zql/src/query/query-impl.d.ts +1 -0
  926. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  927. package/out/zql/src/query/query-impl.js +6 -23
  928. package/out/zql/src/query/query-impl.js.map +1 -1
  929. package/out/zql/src/query/query-transitions.d.ts.map +1 -1
  930. package/out/zql/src/query/query-transitions.js +2 -5
  931. package/out/zql/src/query/query-transitions.js.map +1 -1
  932. package/out/zql/src/query/query.d.ts +22 -5
  933. package/out/zql/src/query/query.d.ts.map +1 -1
  934. package/out/zql/src/query/runnable-query-impl.d.ts +1 -0
  935. package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -1
  936. package/out/zql/src/query/runnable-query-impl.js +2 -10
  937. package/out/zql/src/query/runnable-query-impl.js.map +1 -1
  938. package/out/zql/src/query/typed-view.d.ts +1 -1
  939. package/out/zql/src/query/typed-view.d.ts.map +1 -1
  940. package/out/zqlite/src/database-storage.d.ts.map +1 -1
  941. package/out/zqlite/src/database-storage.js +9 -1
  942. package/out/zqlite/src/database-storage.js.map +1 -1
  943. package/out/zqlite/src/db.d.ts +9 -1
  944. package/out/zqlite/src/db.d.ts.map +1 -1
  945. package/out/zqlite/src/db.js +62 -30
  946. package/out/zqlite/src/db.js.map +1 -1
  947. package/out/zqlite/src/index-usage.d.ts +19 -0
  948. package/out/zqlite/src/index-usage.d.ts.map +1 -0
  949. package/out/zqlite/src/index-usage.js +49 -0
  950. package/out/zqlite/src/index-usage.js.map +1 -0
  951. package/out/zqlite/src/pending-delta.d.ts +110 -0
  952. package/out/zqlite/src/pending-delta.d.ts.map +1 -0
  953. package/out/zqlite/src/pending-delta.js +278 -0
  954. package/out/zqlite/src/pending-delta.js.map +1 -0
  955. package/out/zqlite/src/query-builder.d.ts +17 -1
  956. package/out/zqlite/src/query-builder.d.ts.map +1 -1
  957. package/out/zqlite/src/query-builder.js +111 -20
  958. package/out/zqlite/src/query-builder.js.map +1 -1
  959. package/out/zqlite/src/query-delegate.d.ts.map +1 -1
  960. package/out/zqlite/src/query-delegate.js +10 -7
  961. package/out/zqlite/src/query-delegate.js.map +1 -1
  962. package/out/zqlite/src/resolve-scalar-subqueries.d.ts +3 -1
  963. package/out/zqlite/src/resolve-scalar-subqueries.d.ts.map +1 -1
  964. package/out/zqlite/src/resolve-scalar-subqueries.js +1 -0
  965. package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
  966. package/out/zqlite/src/sqlite-cost-model.d.ts.map +1 -1
  967. package/out/zqlite/src/sqlite-cost-model.js +52 -1
  968. package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
  969. package/out/zqlite/src/sqlite-stat-fanout.d.ts.map +1 -1
  970. package/out/zqlite/src/sqlite-stat-fanout.js +5 -31
  971. package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
  972. package/out/zqlite/src/sqlite-stat4-sample.d.ts +37 -0
  973. package/out/zqlite/src/sqlite-stat4-sample.d.ts.map +1 -0
  974. package/out/zqlite/src/sqlite-stat4-sample.js +61 -0
  975. package/out/zqlite/src/sqlite-stat4-sample.js.map +1 -0
  976. package/out/zqlite/src/table-source.d.ts +87 -2
  977. package/out/zqlite/src/table-source.d.ts.map +1 -1
  978. package/out/zqlite/src/table-source.js +276 -42
  979. package/out/zqlite/src/table-source.js.map +1 -1
  980. package/package.json +4 -5
  981. package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts +0 -25
  982. package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts.map +0 -1
  983. package/out/replicache/src/kv/idb-store-with-mem-fallback.js +0 -83
  984. package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +0 -1
  985. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts +0 -29
  986. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts.map +0 -1
  987. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js +0 -154
  988. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"zero.js","names":["#rep","#server","#lc","#logOptions","#enableAnalytics","#clientSchema","#pokeHandler","#queryManager","#ivmMain","#clientToServer","#deleteClientsManager","#mutationTracker","#lastMutationIDsSent","#onlineManager","#onUpdateNeeded","#onClientStateNotFound","#zeroContext","#visibilityWatcher","#connectionManager","#connection","#activeClientsManager","#options","#kvStore","#checkAuthValid","#createLogOptions","#sendIfConnected","#disconnect","#pusher","#puller","#addMetric","#enableRefresh","#setAuth","#closeAbortController","#reload","#metrics","#reportMetrics","#onPokeError","#runLoop","#expose","#connectStart","#socketResolver","#forceEnableRefresh","#send","#socket","#recentSentMessages","#unexpose","#messageCount","#handlePokeChunk","#handleConnectedMessage","#handleErrorMessage","#onPong","#handlePokeStart","#handlePokePart","#handlePokeEnd","#handlePullResponse","#currentConnectAttempt","#addConnectEvent","#connectedCount","#checkConnectivity","#connectErrorCount","#connectedAt","#totalToConnectStart","#initConnectionQueries","#deletedClients","#connectCookie","#connectAttempt","#lastMutationIDReceived","#onMessage","#onOpen","#onClose","#armConnectTimeout","#abortPingTimeout","#pendingPullsByRequestID","#connectionReadyResolver","#ping","#checkConnectivityAsync","#inspector","#online"],"sources":["../../../../../zero-client/src/client/zero.ts"],"sourcesContent":["import {LogContext, type LogLevel, type LogSink} from '@rocicorp/logger';\nimport {type Resolver, resolver} from '@rocicorp/resolver';\nimport {type DeletedClients} from '../../../replicache/src/deleted-clients.ts';\nimport {getKVStoreProvider} from '../../../replicache/src/get-kv-store-provider.ts';\nimport {\n ReplicacheImpl,\n type ReplicacheImplOptions,\n} from '../../../replicache/src/impl.ts';\nimport {dropDatabase as dropReplicacheDatabase} from '../../../replicache/src/persist/collect-idb-databases.ts';\nimport {IDBDatabasesStore} from '../../../replicache/src/persist/idb-databases-store.ts';\nimport type {Puller, PullerResult} from '../../../replicache/src/puller.ts';\nimport type {Pusher, PusherResult} from '../../../replicache/src/pusher.ts';\nimport type {ReplicacheOptions} from '../../../replicache/src/replicache-options.ts';\nimport type {\n ClientGroupID,\n ClientID,\n} from '../../../replicache/src/sync/ids.ts';\nimport type {PullRequest} from '../../../replicache/src/sync/pull.ts';\nimport type {PushRequest} from '../../../replicache/src/sync/push.ts';\nimport type {\n MutatorDefs,\n UpdateNeededReason as ReplicacheUpdateNeededReason,\n} from '../../../replicache/src/types.ts';\nimport {AbortError} from '../../../shared/src/abort-error.ts';\nimport {assert, unreachable} from '../../../shared/src/asserts.ts';\nimport {\n getBrowserGlobal,\n mustGetBrowserGlobal,\n} from '../../../shared/src/browser-env.ts';\nimport {getDocumentVisibilityWatcher} from '../../../shared/src/document-visible.ts';\nimport {getErrorMessage} from '../../../shared/src/error.ts';\nimport {h64} from '../../../shared/src/hash.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport {must} from '../../../shared/src/must.ts';\nimport {navigator} from '../../../shared/src/navigator.ts';\nimport {promiseRace} from '../../../shared/src/promise-race.ts';\nimport {emptyFunction} from '../../../shared/src/sentinels.ts';\nimport {sleep, sleepWithAbort} from '../../../shared/src/sleep.ts';\nimport {Subscribable} from '../../../shared/src/subscribable.ts';\nimport {assertTesting, TESTING} from '../../../shared/src/testing.ts';\nimport * as valita from '../../../shared/src/valita.ts';\nimport type {Writable} from '../../../shared/src/writable.ts';\nimport {type ClientSchema} from '../../../zero-protocol/src/client-schema.ts';\nimport type {ConnectedMessage} from '../../../zero-protocol/src/connect.ts';\nimport {encodeSecProtocols} from '../../../zero-protocol/src/connect.ts';\nimport type {DeleteClientsBody} from '../../../zero-protocol/src/delete-clients.ts';\nimport type {Downstream} from '../../../zero-protocol/src/down.ts';\nimport {downstreamSchema} from '../../../zero-protocol/src/down.ts';\nimport {ErrorKind} from '../../../zero-protocol/src/error-kind.ts';\nimport {\n type ErrorMessage,\n ProtocolError,\n} from '../../../zero-protocol/src/error.ts';\nimport type {MutationID} from '../../../zero-protocol/src/mutation-id.ts';\nimport * as MutationType from '../../../zero-protocol/src/mutation-type-enum.ts';\nimport {\n type CRUDMutation,\n type CRUDMutationArg,\n CRUD_MUTATION_NAME,\n type CustomMutation,\n mapCRUD,\n} from '../../../zero-protocol/src/mutation.ts';\nimport type {PingMessage} from '../../../zero-protocol/src/ping.ts';\nimport {\n POKE_CHUNK_MESSAGE_TYPE,\n type PokeEndMessage,\n type PokePartMessage,\n type PokeStartMessage,\n} from '../../../zero-protocol/src/poke.ts';\nimport {PROTOCOL_VERSION} from '../../../zero-protocol/src/protocol-version.ts';\nimport type {\n PullRequestMessage,\n PullResponseBody,\n PullResponseMessage,\n} from '../../../zero-protocol/src/pull.ts';\nimport type {PushMessage} from '../../../zero-protocol/src/push.ts';\nimport type {UpQueriesPatchOp} from '../../../zero-protocol/src/queries-patch.ts';\nimport type {Upstream} from '../../../zero-protocol/src/up.ts';\nimport type {NullableVersion} from '../../../zero-protocol/src/version.ts';\nimport {nullableVersionSchema} from '../../../zero-protocol/src/version.ts';\nimport {clientSchemaFrom} from '../../../zero-schema/src/builder/schema-builder.ts';\nimport {\n type NameMapper,\n clientToServer,\n} from '../../../zero-schema/src/name-mapper.ts';\nimport type {\n BaseDefaultContext,\n BaseDefaultSchema,\n DefaultContext,\n DefaultSchema,\n} from '../../../zero-types/src/default-types.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport type {ViewFactory} from '../../../zql/src/ivm/view.ts';\nimport {\n isMutatorRegistry,\n iterateMutators,\n} from '../../../zql/src/mutate/mutator-registry.ts';\nimport type {\n AnyMutator,\n MutateRequest,\n} from '../../../zql/src/mutate/mutator.ts';\nimport {createRunnableBuilder} from '../../../zql/src/query/create-builder.ts';\nimport {\n type ClientMetricMap,\n type MetricMap,\n isClientMetric,\n} from '../../../zql/src/query/metrics-delegate.ts';\nimport type {QueryDelegate} from '../../../zql/src/query/query-delegate.ts';\nimport {\n type QueryOrQueryRequest,\n addContextToQuery,\n} from '../../../zql/src/query/query-registry.ts';\nimport {\n type HumanReadable,\n type MaterializeOptions,\n type PreloadOptions,\n type RunOptions,\n} from '../../../zql/src/query/query.ts';\nimport type {ConditionalSchemaQuery} from '../../../zql/src/query/schema-query.ts';\nimport type {TypedView} from '../../../zql/src/query/typed-view.ts';\nimport {nanoid} from '../util/nanoid.ts';\n\nimport {ActiveClientsManager} from './active-clients-manager.ts';\nimport {ClientErrorKind} from './client-error-kind.ts';\nimport {\n ConnectionManager,\n type ConnectionManagerState,\n throwIfConnectionError,\n} from './connection-manager.ts';\nimport {ConnectionStatus} from './connection-status.ts';\nimport {type Connection, ConnectionImpl} from './connection.ts';\nimport {ZeroContext} from './context.ts';\nimport {\n type BatchMutator,\n type WithCRUD,\n addTableCRUDProperties,\n makeCRUDMutateBatch,\n} from './crud.ts';\nimport type {CustomMutatorDefs, MutatorResult} from './custom.ts';\nimport {DeleteClientsManager} from './delete-clients-manager.ts';\nimport {shouldEnableAnalytics} from './enable-analytics.ts';\nimport {\n ClientError,\n NO_STATUS_TRANSITION,\n type ZeroError,\n getBackoffParams,\n getErrorConnectionTransition,\n isAuthError,\n isClientError,\n isServerError,\n isZeroError,\n} from './error.ts';\nimport {\n type HTTPString,\n type WSString,\n appendPath,\n toWSString,\n} from './http-string.ts';\nimport {Inspector} from './inspector/inspector.ts';\nimport {IVMSourceBranch} from './ivm-branch.ts';\nimport {type LogOptions, createLogOptions} from './log-options.ts';\nimport type {MakeMutatePropertyType} from './make-mutate-property.ts';\nimport {addCustomMutatorsProperties} from './make-mutate-property.ts';\nimport {makeReplicacheMutators} from './make-replicache-mutators.ts';\nimport {\n DID_NOT_CONNECT_VALUE,\n MetricManager,\n REPORT_INTERVAL_MS,\n type Series,\n getLastConnectErrorValue,\n shouldReportConnectError,\n} from './metrics.ts';\nimport {MutationTracker} from './mutation-tracker.ts';\nimport {MutatorProxy} from './mutator-proxy.ts';\nimport type {UpdateNeededReason, ZeroOptions} from './options.ts';\nimport {QueryManager} from './query-manager.ts';\nimport {\n reloadScheduled,\n reloadWithReason,\n reportReloadReason,\n resetBackoff,\n} from './reload-error-handler.ts';\nimport {getServer} from './server-option.ts';\nimport {version} from './version.ts';\nimport {PokeHandler} from './zero-poke-handler.ts';\nimport {\n ZeroRep,\n fromReplicacheAuthToken,\n toReplicacheAuthToken,\n} from './zero-rep.ts';\n\nexport type NoRelations = Record<string, never>;\n\nexport type TestingContext = {\n puller: Puller;\n pusher: Pusher;\n setReload: (r: () => void) => void;\n logOptions: LogOptions;\n connectStart: () => number | undefined;\n socketResolver: () => Resolver<WebSocket>;\n connectionManager: () => ConnectionManager;\n queryDelegate: () => QueryDelegate;\n queryManager: () => QueryManager;\n enableRefresh: () => boolean;\n};\n\nexport const exposedToTestingSymbol = Symbol();\nexport const createLogOptionsSymbol = Symbol();\n\ninterface TestZero {\n [exposedToTestingSymbol]?: TestingContext;\n [createLogOptionsSymbol]?: (options: {\n consoleLogLevel: LogLevel;\n server: string | null;\n }) => LogOptions;\n}\n\ntype ConnectAttemptControl = {\n readonly controller: AbortController;\n readonly connected: Resolver<void>;\n readonly events: [date: Date, event: string][];\n /**\n * Cancels whichever phase deadline is currently running. Swapped when the\n * attempt stops setting up locally and starts waiting for the server.\n */\n clearTimeout?: (() => void) | undefined;\n};\n\nfunction connectionReadyResolver(): Resolver<void> {\n const ready = resolver<void>();\n // A connection attempt can fail without any push, pull, or inspector\n // currently waiting on it. The run loop handles the corresponding attempt\n // failure; this handler prevents the optional readiness listener from\n // becoming an unhandled rejection.\n void ready.promise.catch(() => {});\n return ready;\n}\n\nfunction asTestZero<\n S extends BaseDefaultSchema,\n MD extends CustomMutatorDefs | undefined,\n C extends BaseDefaultContext,\n>(z: Zero<S, MD, C>): TestZero {\n return z as TestZero;\n}\n\nexport const RUN_LOOP_INTERVAL_MS = 5_000;\n\n/**\n * Default timeout for ping operations. Controls both:\n * - How long to wait in idle before sending a ping\n * - How long to wait for a pong response\n */\nexport const DEFAULT_PING_TIMEOUT_MS = 5_000;\n\n/**\n * The amount of time we wait for a pull response before we consider a pull\n * request timed out.\n */\nexport const PULL_TIMEOUT_MS = 5_000;\n\nexport const DEFAULT_DISCONNECT_HIDDEN_DELAY_MS = 5 * 60 * 1000;\n\n/**\n * The amount of time we allow for continuous connecting attempts before\n * transitioning to disconnected state.\n */\nexport const DEFAULT_DISCONNECT_TIMEOUT_MS = 60 * 1_000;\n\n/**\n * The amount of time we wait for a connection to be established before we\n * consider it timed out.\n */\nexport const CONNECT_TIMEOUT_MS = 10_000;\n\n/**\n * Setting up active-client tracking blocks the first connect attempt. Above\n * this, say so.\n */\nconst SLOW_ACTIVE_CLIENTS_THRESHOLD_MS = 50;\n\nconst CHECK_CONNECTIVITY_ON_ERROR_FREQUENCY = 6;\n\nconst DEFAULT_QUERY_CHANGE_THROTTLE_MS = 10;\n\nexport const LOGGED_OUT_STORAGE_USER_ID = '__anonymous__';\n\nfunction convertOnUpdateNeededReason(\n reason: ReplicacheUpdateNeededReason,\n): UpdateNeededReason {\n return {type: reason.type};\n}\n\nfunction updateNeededReloadReasonMessage(reason: UpdateNeededReason) {\n const {type} = reason;\n let reasonMsg = '';\n switch (type) {\n case 'NewClientGroup':\n reasonMsg =\n \"This client could not sync with a newer client. This is probably due to another tab loading a newer incompatible version of the app's code.\";\n break;\n case 'VersionNotSupported':\n reasonMsg =\n \"The server no longer supports this client's protocol version.\";\n break;\n case 'SchemaVersionNotSupported':\n reasonMsg = 'Client and server schemas incompatible.';\n break;\n default:\n unreachable(type);\n }\n if (reason.message) {\n reasonMsg += ' ' + reason.message;\n }\n return reasonMsg;\n}\n\nconst serverAheadReloadReason = `Server reported that client is ahead of server. This probably happened because the server is in development mode and restarted. Currently when this happens, the dev server loses its state and on reconnect sees the client as ahead. If you see this in other cases, it may be a bug in Zero.`;\n\nfunction onClientStateNotFoundServerReason(serverErrMsg: string) {\n return `Server could not find state needed to synchronize this client. ${serverErrMsg}`;\n}\nconst ON_CLIENT_STATE_NOT_FOUND_REASON_CLIENT =\n 'The local persistent state needed to synchronize this client has been garbage collected.';\n\n// Keep in sync with packages/replicache/src/replicache-options.ts\nexport interface ReplicacheInternalAPI {\n lastMutationID(): number;\n}\n\nconst internalReplicacheImplMap = new WeakMap<object, ReplicacheImpl>();\n\nexport function getInternalReplicacheImplForTesting(\n z: object,\n): ReplicacheImpl<MutatorDefs> {\n assertTesting();\n return must(internalReplicacheImplMap.get(z));\n}\n\nconst CLOSE_CODE_NORMAL = 1000;\nconst CLOSE_CODE_GOING_AWAY = 1001;\ntype CloseCode = typeof CLOSE_CODE_NORMAL | typeof CLOSE_CODE_GOING_AWAY;\n\nexport type ZeroMutate<\n S extends Schema,\n MD extends CustomMutatorDefs | undefined,\n C,\n> = MakeMutatePropertyType<S, MD, C> &\n // Also callable with MutateRequest: zero.mutate(mr)\n // oxlint-disable-next-line no-explicit-any\n ((mr: MutateRequest<any, S, C, any>) => MutatorResult);\n\nexport class Zero<\n const S extends BaseDefaultSchema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n C extends BaseDefaultContext = DefaultContext,\n> {\n readonly version = version;\n\n readonly #rep: ReplicacheImpl<WithCRUD<MutatorDefs>>;\n readonly #server: HTTPString | null;\n readonly userID: string | undefined;\n readonly storageKey: string;\n\n readonly #lc: LogContext;\n readonly #logOptions: LogOptions;\n readonly #enableAnalytics: boolean;\n readonly #clientSchema: ClientSchema;\n\n readonly #pokeHandler: PokeHandler;\n readonly #queryManager: QueryManager;\n readonly #ivmMain: IVMSourceBranch;\n readonly #clientToServer: NameMapper;\n readonly #deleteClientsManager: DeleteClientsManager;\n readonly #mutationTracker: MutationTracker;\n\n /**\n * The queries we sent when inside the sec-protocol header when establishing a connection.\n * More queries could be registered while we're waiting for the 'connected' message\n * to come back from the server. To understand what queries we need to send\n * to the server, we diff the `initConnectionQueries` with the current set of desired queries.\n *\n * If this is set to `undefined` that means no queries were sent inside the `sec-protocol` header\n * and an `initConnection` message must be sent to the server after receiving the `connected` message.\n */\n #initConnectionQueries: Map<string, UpQueriesPatchOp> | undefined;\n\n /**\n * We try to send the deleted clients and (client groups) as part of the\n * sec-protocol header. If we can't because the header would get too large we\n * keep track of the deleted clients and send them after the connection is\n * established.\n */\n #deletedClients: DeleteClientsBody | undefined;\n\n /**\n * The highest mutation ID we have sent on the current connection, for each\n * client in our client group.\n *\n * The mutations we push are the client group's local commit chain, so they\n * include mutations made by every tab in the group, not just this one. The\n * order of that chain changes from one push to the next: when we persist our\n * own mutations they move to the end of the chain, behind whatever the other\n * tabs persisted in the meantime. So a mutation from another tab can end up\n * in front of one we already sent, which means we cannot decide what to send\n * next by remembering a single position in the chain. Remembering the last ID\n * we sent for each client works no matter how the chain is ordered: we never\n * skip a mutation, and we never leave a hole in a client's run of mutation\n * IDs (the server rejects a hole as an invalid push).\n *\n * Cleared whenever the connection is established or torn down. The server\n * does remember what it has processed, in a last mutation ID per client, and\n * it ignores anything it has already applied. But we don't know which of our\n * sends actually made it across before the socket died, so we start over and\n * let the server drop the duplicates. The only mutations we don't resend are\n * the ones the server has acknowledged in a poke, because those have already\n * been rebased out of the commit chain.\n */\n readonly #lastMutationIDsSent: Map<ClientID, number> = new Map();\n\n #onPong: () => void = () => undefined;\n\n readonly #onlineManager: OnlineManager;\n\n readonly #onUpdateNeeded: (reason: UpdateNeededReason) => void;\n readonly #onClientStateNotFound: (kind: ErrorKind, message: string) => void;\n // Last cookie used to initiate a connection\n #connectCookie: NullableVersion = null;\n // Total number of sockets successfully connected by this client\n #connectedCount = 0;\n // Number of messages received over currently connected socket. Reset\n // on disconnect.\n #messageCount = 0;\n #connectedAt = 0;\n // Reset on successful connection.\n #connectErrorCount = 0;\n\n #abortPingTimeout = () => {\n // intentionally empty\n };\n\n #forceEnableRefresh = false;\n\n // Ring buffer of up to 5 recent outbound messages (excluding pings).\n // Tracks type, serialized size, and a 200-character snippet for diagnostics\n // when a 1009 (Message Too Big) close occurs.\n #recentSentMessages: {type: string; size: number; snippet: string}[] = [];\n\n /**\n * The timeout in milliseconds for ping operations. Controls both:\n * - How long to wait in idle before sending a ping\n * - How long to wait for a pong response\n *\n * Total time to detect a dead connection is 2 × pingTimeoutMs.\n *\n * The new value will take effect on the next ping cycle.\n */\n pingTimeoutMs: number;\n\n readonly #zeroContext: ZeroContext;\n\n #pendingPullsByRequestID: Map<string, Resolver<PullResponseBody>> = new Map();\n #lastMutationIDReceived = 0;\n\n #socket: WebSocket | undefined = undefined;\n #socketResolver = resolver<WebSocket>();\n\n // Resolves when the run loop establishes a usable connection. The run loop\n // replaces it if the attempt fails or the established connection disconnects.\n #connectionReadyResolver = connectionReadyResolver();\n\n // Installed and removed by the run loop so socket events and disconnects can\n // deliver inputs to the active attempt without settling its returned promise.\n #currentConnectAttempt: ConnectAttemptControl | undefined;\n\n #closeAbortController = new AbortController();\n\n readonly #visibilityWatcher;\n\n readonly #connectionManager: ConnectionManager;\n readonly #connection: Connection;\n readonly #activeClientsManager: Promise<ActiveClientsManager>;\n #inspector: Inspector | undefined;\n\n #connectStart: number | undefined = undefined;\n // Set on connect attempt if currently undefined.\n // Reset to undefined when\n // 1. client stops trying to connect because it is hidden\n // 2. client encounters a connect error and canary request indicates\n // the client is offline\n // 2. client successfully connects\n #totalToConnectStart: number | undefined = undefined;\n\n readonly #options: ZeroOptions<S, MD, C>;\n readonly #kvStore: ZeroOptions<S, MD, C>['kvStore'];\n\n /**\n * Query builders for each table in the schema.\n *\n * @deprecated Use {@linkcode createBuilder} to create query builders instead.\n */\n readonly query: ConditionalSchemaQuery<S>;\n\n // TODO: Metrics needs to be rethought entirely as we're not going to\n // send metrics to customer server.\n #metrics: MetricManager;\n\n // Store as field to allow test subclass to override. Web API doesn't allow\n // overwriting location fields for security reasons.\n #reload = () => getBrowserGlobal('location')?.reload();\n\n /**\n * Constructs a new Zero client.\n */\n\n constructor(options: ZeroOptions<S, MD, C>) {\n const {\n userID,\n storageKey,\n onOnlineChange,\n onUpdateNeeded,\n onClientStateNotFound,\n hiddenTabDisconnectDelay = DEFAULT_DISCONNECT_HIDDEN_DELAY_MS,\n pingTimeoutMs = DEFAULT_PING_TIMEOUT_MS,\n disconnectTimeoutMs = DEFAULT_DISCONNECT_TIMEOUT_MS,\n schema,\n batchViewUpdates = applyViewUpdates => applyViewUpdates(),\n maxRecentQueries = 0,\n slowMaterializeThreshold = 5_000,\n } = options;\n\n if (userID === '') {\n throw new ClientError({\n kind: ClientErrorKind.Internal,\n message:\n 'ZeroOptions.userID should not be empty. Omit it entirely for logged-out clients.',\n });\n }\n\n this.#checkAuthValid(userID ?? undefined, options.auth);\n\n const cacheURL = options.cacheURL ?? options.server;\n const server = getServer(cacheURL);\n this.#enableAnalytics = shouldEnableAnalytics(\n server,\n false /*options.enableAnalytics,*/, // Reenable analytics\n );\n\n let {kvStore = 'idb'} = options;\n if (kvStore === 'idb') {\n if (!getBrowserGlobal('indexedDB')) {\n // oxlint-disable-next-line no-console\n console.warn(\n 'IndexedDB is not supported in this environment. Falling back to memory storage.',\n );\n kvStore = 'mem';\n }\n }\n\n if (hiddenTabDisconnectDelay < 0) {\n throw new ClientError({\n kind: ClientErrorKind.Internal,\n message: 'ZeroOptions.hiddenTabDisconnectDelay must not be negative.',\n });\n }\n\n this.#kvStore = kvStore;\n\n this.pingTimeoutMs = pingTimeoutMs;\n\n this.#onlineManager = new OnlineManager();\n\n if (onOnlineChange) {\n this.#onlineManager.subscribe(onOnlineChange);\n }\n\n this.#options = options;\n\n this.#logOptions = this.#createLogOptions({\n consoleLogLevel: options.logLevel ?? 'warn',\n server: null, //server, // Reenable remote logging\n enableAnalytics: this.#enableAnalytics,\n consoleLogSink: options.logSink,\n });\n const logOptions = this.#logOptions;\n\n this.#connectionManager = new ConnectionManager({\n disconnectTimeout: disconnectTimeoutMs,\n });\n\n const syncConnectionState = (state: ConnectionManagerState) => {\n this.#onlineManager.setOnline(state.name === ConnectionStatus.Connected);\n\n if (state.name === ConnectionStatus.Closed) {\n this.#queryManager.handleClosed(state.reason);\n }\n };\n syncConnectionState(this.#connectionManager.state);\n this.#connectionManager.subscribe(syncConnectionState);\n\n const sink = logOptions.logSink;\n const lc = new LogContext(logOptions.logLevel, {}, sink);\n\n this.#mutationTracker = new MutationTracker(\n lc,\n (upTo: MutationID) =>\n this.#sendIfConnected(['ackMutationResponses', upTo]),\n error => this.#disconnect(lc, error),\n );\n\n this.#ivmMain = new IVMSourceBranch(schema.tables);\n\n const {enableLegacyQueries = false} = schema;\n\n const replicacheMutators = makeReplicacheMutators<S, C>(\n schema,\n options.mutators,\n this.context,\n lc,\n );\n\n this.storageKey = storageKey ?? '';\n\n const {clientSchema, hash} = clientSchemaFrom(schema);\n this.#clientSchema = clientSchema;\n\n // Create a hash that includes storage key, URL configuration, and query parameters\n const nameKey = JSON.stringify({\n storageKey: this.storageKey,\n mutateUrl: options.mutateURL ?? '',\n queryUrl: options.queryURL ?? options.getQueriesURL ?? '',\n });\n const hashedKey = h64(nameKey).toString(36);\n // Logged-out clients still need a stable local storage namespace.\n // This sentinel is only for IDB naming; logged-out connections omit userID on the wire.\n const storageScopedUserID = userID ?? LOGGED_OUT_STORAGE_USER_ID;\n\n const replicacheOptions: ReplicacheOptions<WithCRUD<MutatorDefs>> = {\n // The schema stored in IDB is dependent upon both the ClientSchema\n // and the AST schema (i.e. PROTOCOL_VERSION).\n schemaVersion: `${PROTOCOL_VERSION}.${hash}`,\n logLevel: logOptions.logLevel,\n logSinks: [logOptions.logSink],\n mutators: replicacheMutators,\n name: `zero-${storageScopedUserID}-${hashedKey}`,\n pusher: (req, reqID) => this.#pusher(req, reqID),\n puller: (req, reqID) => this.#puller(req, reqID),\n pushDelay: 0,\n requestOptions: {\n maxDelayMs: 0,\n minDelayMs: 0,\n },\n licenseKey: 'zero-client-static-key',\n kvStore,\n };\n\n this.#zeroContext = new ZeroContext(\n lc,\n this.#ivmMain,\n (ast, ttl, gotCallback) => {\n if (enableLegacyQueries) {\n return this.#queryManager.addLegacy(ast, ttl, gotCallback);\n }\n // legacy queries are client side only. Do not track with the server\n return emptyFunction;\n },\n (ast, customQueryID, ttl, gotCallback) =>\n this.#queryManager.addCustom(ast, customQueryID, ttl, gotCallback),\n (ast, ttl) => {\n if (enableLegacyQueries) {\n this.#queryManager.updateLegacy(ast, ttl);\n }\n },\n (customQueryID, ttl) =>\n this.#queryManager.updateCustom(customQueryID, ttl),\n () => this.#queryManager.flushBatch(),\n batchViewUpdates,\n this.#addMetric,\n assertValidRunOptions,\n );\n\n // Defer building query pipelines until ZeroRep.init has loaded the replica\n // into the IVM sources (see ZeroContext.markPipelinesReady).\n this.#zeroContext.deferPipelines();\n\n this.query = createRunnableBuilder(this.#zeroContext, schema);\n\n const replicacheImplOptions: ReplicacheImplOptions = {\n enableClientGroupForking: false,\n enableMutationRecovery: false,\n enablePullAndPushInOpen: false, // Zero calls push in its connection management code\n enableRefresh: () => this.#enableRefresh(),\n onClientsDeleted: deletedClients =>\n this.#deleteClientsManager.onClientsDeleted(deletedClients),\n zero: new ZeroRep(\n this.#zeroContext,\n this.#ivmMain,\n options.mutators !== undefined,\n this.#mutationTracker,\n ),\n };\n\n const rep = new ReplicacheImpl(replicacheOptions, replicacheImplOptions);\n this.#rep = rep;\n\n if (TESTING) {\n internalReplicacheImplMap.set(this, rep);\n }\n this.#server = server;\n this.userID = userID ?? undefined;\n this.#lc = lc.withContext('clientID', rep.clientID);\n\n if (userID === 'anon' && !options.auth) {\n this.#lc.warn?.(\n 'ZeroOptions.userID \"anon\" is deprecated for logged-out clients. Omit it entirely for logged-out clients.',\n );\n }\n\n this.#connection = new ConnectionImpl(\n this.#connectionManager,\n this.#lc,\n auth => this.#setAuth(auth),\n );\n this.#mutationTracker.setClientIDAndWatch(\n rep.clientID,\n rep.experimentalWatch.bind(rep),\n );\n\n this.#activeClientsManager = makeActiveClientsManager(\n rep.clientGroupID,\n this.clientID,\n this.#closeAbortController.signal,\n (clientID: ClientID, clientGroupID: ClientGroupID) =>\n this.#deleteClientsManager.onClientsDeleted([\n {clientGroupID, clientID},\n ]),\n this.#lc,\n );\n\n const onUpdateNeededCallback = (reason: UpdateNeededReason) => {\n if (onUpdateNeeded) {\n onUpdateNeeded(reason);\n } else {\n reloadWithReason(\n this.#lc,\n this.#reload,\n reason.type,\n updateNeededReloadReasonMessage(reason),\n );\n }\n };\n this.#onUpdateNeeded = onUpdateNeededCallback;\n this.#rep.onUpdateNeeded = reason => {\n onUpdateNeededCallback(convertOnUpdateNeededReason(reason));\n };\n\n this.#onClientStateNotFound = (kind: ErrorKind, message: string) => {\n if (onClientStateNotFound) {\n onClientStateNotFound();\n } else {\n reloadWithReason(this.#lc, this.#reload, kind, message);\n }\n };\n this.#rep.onClientStateNotFound = () => {\n this.#onClientStateNotFound(\n ErrorKind.ClientNotFound,\n ON_CLIENT_STATE_NOT_FOUND_REASON_CLIENT,\n );\n };\n\n const mutatorProxy = new MutatorProxy(\n this.#lc,\n this.#connectionManager,\n this.#mutationTracker,\n );\n\n // Create a callable function that handles zero.mutate(mr) calls.\n // The CRUD table properties (e.g. zero.mutate.issues.insert(args)) are added by makeCRUDMutate.\n const {mutators} = options;\n\n // If mutators is a MutatorRegistry, we store the mutator in a Map so we can quickly check if it was registered.\n const registeredMutators: Set<AnyMutator> = new Set(\n isMutatorRegistry(mutators) ? iterateMutators(mutators) : undefined,\n );\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const callableMutate = (mr: MutateRequest<any, S, C, any>) => {\n if (!registeredMutators.has(mr.mutator)) {\n throw new Error(\n `Mutator \"${mr.mutator.mutatorName}\" is not registered. ` +\n `Mutators must be registered with the Zero constructor before use.`,\n );\n }\n const repMutator = rep.mutate[mr.mutator.mutatorName] as unknown as (\n args?: unknown,\n ) => MutatorResult;\n return mutatorProxy.wrapCustomMutator(\n mr.mutator.mutatorName,\n repMutator,\n )(mr.args);\n };\n\n const mutateBatch = makeCRUDMutateBatch<S>(schema, rep.mutate);\n\n if (schema.enableLegacyMutators) {\n addTableCRUDProperties(schema, callableMutate, rep.mutate);\n }\n\n // This is the legacy mutators. They are added to zero.mutate.<mutatorName>.\n if (mutators && !isMutatorRegistry(mutators)) {\n addCustomMutatorsProperties(\n mutators as CustomMutatorDefs,\n mutatorProxy,\n callableMutate as unknown as Record<string, unknown>,\n rep.mutate,\n );\n }\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n this.mutate = callableMutate as any;\n this.mutateBatch = mutateBatch;\n\n this.#queryManager = new QueryManager(\n this.#lc,\n this.#mutationTracker,\n rep.clientID,\n schema.tables,\n msg => {\n let body = msg[1];\n if (this.#options.getTraceparent) {\n body = {\n ...msg[1],\n traceparent: this.#options.getTraceparent?.(),\n };\n }\n\n this.#sendIfConnected([msg[0], body]);\n },\n rep.experimentalWatch.bind(rep),\n maxRecentQueries,\n options.queryChangeThrottleMs ?? DEFAULT_QUERY_CHANGE_THROTTLE_MS,\n slowMaterializeThreshold,\n error => {\n this.#disconnect(lc, error);\n },\n );\n\n this.#clientToServer = clientToServer(schema.tables);\n\n this.#deleteClientsManager = new DeleteClientsManager(\n msg => this.#sendIfConnected(msg),\n rep.perdag,\n this.#lc,\n this.#rep.clientGroupID,\n rep.clientID,\n );\n\n reportReloadReason(this.#lc);\n\n this.#metrics = new MetricManager({\n reportIntervalMs: REPORT_INTERVAL_MS,\n host: getBrowserGlobal('location')?.host ?? '',\n source: 'client',\n reporter: this.#enableAnalytics\n ? allSeries => this.#reportMetrics(allSeries)\n : () => Promise.resolve(),\n lc: this.#lc,\n });\n this.#metrics.tags.push(`version:${this.version}`);\n\n this.#pokeHandler = new PokeHandler(\n async poke => {\n await this.#rep.poke(poke);\n // poke() fires the got-queries watch synchronously, so `#gotQueries` is\n // up to date and safe to trust now that the server has caught us up.\n this.#queryManager.markGotQueriesAuthoritative();\n },\n e => this.#onPokeError(e),\n rep.clientID,\n schema,\n this.#lc,\n this.#mutationTracker,\n );\n\n this.#visibilityWatcher = getDocumentVisibilityWatcher(\n getBrowserGlobal('document'),\n hiddenTabDisconnectDelay,\n this.#closeAbortController.signal,\n );\n\n void this.#runLoop();\n\n this.#expose();\n\n if (TESTING) {\n asTestZero(this)[exposedToTestingSymbol] = {\n puller: this.#puller,\n pusher: this.#pusher,\n setReload: (r: () => void) => {\n this.#reload = r;\n },\n logOptions: this.#logOptions,\n connectStart: () => this.#connectStart,\n socketResolver: () => this.#socketResolver,\n connectionManager: () => this.#connectionManager,\n queryDelegate: () => this.#zeroContext,\n queryManager: () => this.#queryManager,\n enableRefresh: () => this.#enableRefresh(),\n };\n }\n }\n\n #enableRefresh(): boolean {\n // Don't refresh if connected or connecting, unless #forceEnableRefresh to\n // avoid receiving new snapshots from refresh before receiving the new\n // snapshot via poke from the connection (which results in a \"unexpected\n // base cookie for poke\" error).\n return (\n this.#forceEnableRefresh ||\n (!this.#connectionManager.is(ConnectionStatus.Connected) &&\n !this.#connectionManager.is(ConnectionStatus.Connecting))\n );\n }\n\n #expose() {\n // Expose the Zero instance to the global scope.\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const g = globalThis as any;\n if (g.__zero === undefined) {\n g.__zero = this;\n } else if (g.__zero instanceof Zero) {\n const prev = g.__zero;\n g.__zero = {\n [prev.clientID]: prev,\n [this.clientID]: this,\n };\n } else {\n g.__zero[this.clientID] = this;\n }\n }\n\n #unexpose() {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const g = globalThis as any;\n assert(g.__zero !== undefined, 'No global zero instance found');\n if (g.__zero instanceof Zero) {\n assert(\n g.__zero === this,\n 'Global zero instance does not match this instance',\n );\n delete g.__zero;\n } else {\n delete g.__zero[this.clientID];\n if (Object.entries(g.__zero).length === 1) {\n g.__zero = Object.values(g.__zero)[0];\n }\n }\n }\n\n #sendIfConnected(msg: Upstream): void {\n if (this.#connectionManager.is(ConnectionStatus.Connected)) {\n this.#send(msg);\n }\n }\n\n #send(msg: Upstream): void {\n if (this.#socket) {\n const json = JSON.stringify(msg);\n if (msg[0] !== 'ping') {\n const history = this.#recentSentMessages;\n if (history.length >= 5) {\n history.shift();\n }\n history.push({\n type: msg[0],\n size: json.length,\n snippet: json.slice(0, 200),\n });\n }\n this.#socket.send(json);\n }\n }\n\n #createLogOptions(options: {\n consoleLogLevel: LogLevel;\n server: HTTPString | null;\n enableAnalytics: boolean;\n consoleLogSink?: LogSink | undefined;\n }): LogOptions {\n if (TESTING) {\n const testZero = asTestZero(this);\n if (testZero[createLogOptionsSymbol]) {\n return testZero[createLogOptionsSymbol](options);\n }\n }\n return createLogOptions(options);\n }\n\n /**\n * Preloads data for a query into the cache, without keeping it in memory.\n *\n * This function is useful when you want to populate the cache ahead of time,\n * for example after login, to avoid a flash of loading screen on the next page.\n *\n * Returns an object with two properties:\n * - `complete`: a Promise that resolves when the data is loaded\n * - `cleanup`: a function that can be called to cancel the preload\n *\n * @example\n * ```ts\n * const {complete, cleanup} = zero.preload(userQuery);\n * await complete;\n * // Now the data is cached and can be used immediately\n * ```\n */\n preload<\n TTable extends keyof S['tables'] & string,\n TInput extends ReadonlyJSONValue | undefined,\n TOutput extends ReadonlyJSONValue | undefined,\n TReturn,\n >(\n query: QueryOrQueryRequest<TTable, TInput, TOutput, S, TReturn, C>,\n options?: PreloadOptions,\n ) {\n return this.#zeroContext.preload(\n addContextToQuery(query, this.context),\n options,\n );\n }\n\n /**\n * Executes a query once and returns the results.\n *\n * By default, runs immediately with whatever data is available locally.\n * Use `{type: 'complete'}` to wait for fresh results from the server.\n *\n * @param query - The query to execute\n * @param runOptions - Options controlling query execution\n * @returns A Promise resolving to the query results\n *\n * @example\n * ```ts\n * // Run with local data only\n * const users = await zero.run(userQuery);\n *\n * // Wait for server sync\n * const freshUsers = await zero.run(userQuery, {type: 'complete'});\n * ```\n */\n run<\n TTable extends keyof S['tables'] & string,\n TInput extends ReadonlyJSONValue | undefined,\n TOutput extends ReadonlyJSONValue | undefined,\n TReturn,\n >(\n query: QueryOrQueryRequest<TTable, TInput, TOutput, S, TReturn, C>,\n runOptions?: RunOptions,\n ): Promise<HumanReadable<TReturn>> {\n return this.#zeroContext.run(\n addContextToQuery(query, this.context),\n runOptions,\n );\n }\n\n get context(): C {\n return this.#options.context as C;\n }\n\n /**\n * Creates a materialized view of a query that stays synchronized with the database.\n *\n * The materialized view automatically updates when the underlying data changes.\n * When done with the view, call `view.destroy()` to clean up subscriptions.\n *\n * Optionally accepts a factory function to create a custom view implementation.\n *\n * @param query - The query to materialize\n * @param factory - Optional factory function to create a custom view\n * @param options - Options controlling view behavior\n * @returns A TypedView that stays synchronized with the data\n *\n * @example\n * ```ts\n * // Create a standard view\n * const view = zero.materialize(userQuery);\n * console.log(view.data); // Current query results\n * view.destroy(); // Clean up when done\n *\n * // Create a custom view\n * const customView = zero.materialize(userQuery, (query) => new MyCustomView(query));\n * ```\n */\n materialize<\n TTable extends keyof S['tables'] & string,\n TInput extends ReadonlyJSONValue | undefined,\n TOutput extends ReadonlyJSONValue | undefined,\n TReturn,\n >(\n query: QueryOrQueryRequest<TTable, TInput, TOutput, S, TReturn, C>,\n options?: MaterializeOptions,\n ): TypedView<HumanReadable<TReturn>>;\n materialize<\n T,\n TTable extends keyof S['tables'] & string,\n TInput extends ReadonlyJSONValue | undefined,\n TOutput extends ReadonlyJSONValue | undefined,\n TReturn,\n >(\n query: QueryOrQueryRequest<TTable, TInput, TOutput, S, TReturn, C>,\n factory: ViewFactory<TTable, S, TReturn, T>,\n options?: MaterializeOptions,\n ): T;\n materialize<\n T,\n TTable extends keyof S['tables'] & string,\n TInput extends ReadonlyJSONValue | undefined,\n TOutput extends ReadonlyJSONValue | undefined,\n TReturn,\n >(\n query: QueryOrQueryRequest<TTable, TInput, TOutput, S, TReturn, C>,\n factoryOrOptions?: ViewFactory<TTable, S, TReturn, T> | MaterializeOptions,\n maybeOptions?: MaterializeOptions,\n ) {\n const q = addContextToQuery(query, this.context);\n\n let factory;\n let options;\n if (typeof factoryOrOptions === 'function') {\n factory = factoryOrOptions;\n options = maybeOptions;\n } else {\n options = factoryOrOptions;\n }\n return this.#zeroContext.materialize(q, factory, options);\n }\n\n /**\n * The server URL that this Zero instance is configured with.\n */\n get server(): HTTPString | null {\n return this.#server;\n }\n\n /**\n * The name of the IndexedDB database in which the data of this\n * instance of Zero is stored.\n */\n get idbName(): string {\n return this.#rep.idbName;\n }\n\n /**\n * The schema version of the data understood by this application.\n * See [[ZeroOptions.schemaVersion]].\n */\n get schemaVersion(): string {\n return this.#rep.schemaVersion;\n }\n\n /**\n * The schema passed into Zero when it was constructed.\n *\n * This can be paired with the inspector API to explore the client cache for\n * debugging or tooling. The inspector exposes the raw key/value map as well\n * as the per-table rows that back `zero.query[tableName].run()`.\n *\n * ```ts\n * const inspector = __zero.inspector;\n * const client = inspector.client;\n *\n * console.log('client map:', await client.map());\n *\n * for (const tableName of Object.keys(__zero.schema.tables)) {\n * console.table(await client.rows(tableName));\n * }\n * ```\n */\n get schema(): S {\n return this.#options.schema;\n }\n\n /**\n * The client ID for this instance of Zero. Each instance\n * gets a unique client ID.\n */\n get clientID(): ClientID {\n return this.#rep.clientID;\n }\n\n get clientGroupID(): Promise<ClientGroupID> {\n return this.#rep.clientGroupID;\n }\n\n /**\n * Use to execute mutations. The primary flow is to call\n * `zero.mutate(mutationRequest)` with your registered custom mutators:\n *\n * ```ts\n * await zero.mutate(\n * mutators.myMutator({id: '1', title: 'First issue'}),\n * );\n * ```\n *\n * When `schema.enableLegacyMutators` is true, legacy conveniences are added:\n * - Table-scoped CRUD helpers, e.g. `zero.mutate.issue.create` / `set` / `update` / `delete`\n * - Your custom mutators exposed directly on `zero.mutate`\n *\n * ```ts\n * await zero.mutate.issue.create({id: '1', title: 'First issue', priority: 'high'});\n * await zero.mutate.comment.create({id: '1', text: 'First comment', issueID: '1'});\n * await zero.mutate.myMutator({id: '1', title: 'First issue'});\n * ```\n *\n * The `update` methods support partials. Unspecified or `undefined` fields\n * are left unchanged:\n *\n * ```ts\n * // Priority left unchanged.\n * await zero.mutate.issue.update({id: '1', title: 'Updated title'});\n * ```\n */\n readonly mutate: ZeroMutate<S, MD, C>;\n\n /**\n * Provides a way to batch multiple CRUD mutations together:\n *\n * ```ts\n * await zero.mutateBatch(m => {\n * await m.issue.create({id: '1', title: 'First issue'});\n * await m.comment.create({id: '1', text: 'First comment', issueID: '1'});\n * });\n * ```\n *\n * Batch sends all mutations in a single transaction. If one fails, all are\n * rolled back together. Batch can also be more efficient than making many\n * individual mutations.\n *\n * `mutateBatch` is not allowed inside another `mutateBatch` call. Doing so\n * will throw an error.\n *\n * @deprecated Use `zero.mutate(mutationRequest)`\n */\n readonly mutateBatch: BatchMutator<S>;\n\n /**\n * The connection API for managing Zero's connection lifecycle.\n *\n * Use this to monitor connection state and manually control connections.\n *\n * @example\n * ```ts\n * // Subscribe to connection state changes\n * z.connection.state.subscribe(state => {\n * console.log('Connection state:', state.name);\n * });\n *\n * // Manually resume connection from error state\n * await z.connection.connect();\n * ```\n */\n get connection(): Connection {\n return this.#connection;\n }\n\n /**\n * Whether this Zero instance has been closed.\n *\n * Once a Zero instance has been closed it no longer syncs, you can no\n * longer query or mutate data with it, and its query views stop updating.\n */\n get closed(): boolean {\n return this.#connectionManager.is(ConnectionStatus.Closed);\n }\n\n /**\n * Closes this Zero instance.\n *\n * Once a Zero instance has been closed it no longer syncs, you can no\n * longer query or mutate data with it, and its query views stop updating.\n */\n async close(): Promise<void> {\n const lc = this.#lc.withContext('close');\n\n try {\n if (this.closed) {\n lc.debug?.('close() called on already closed instance');\n return;\n }\n\n lc.debug?.('Closing Zero instance. Stack:', new Error().stack);\n\n this.#onlineManager.cleanup();\n\n if (!this.#connectionManager.is(ConnectionStatus.Disconnected)) {\n this.#disconnect(\n lc,\n new ClientError({\n kind: ClientErrorKind.ClientClosed,\n message: 'Zero instance closed by user',\n }),\n CLOSE_CODE_NORMAL,\n );\n }\n lc.debug?.('Aborting closeAbortController due to close()');\n this.#closeAbortController.abort();\n this.#metrics.stop();\n const ret = await this.#rep.close();\n this.#unexpose();\n return ret;\n } catch (e) {\n lc.error?.('Error closing Zero instance', e);\n throw e;\n } finally {\n this.#connectionManager.closed();\n }\n }\n\n #onMessage = (e: MessageEvent<string | ArrayBuffer>) => {\n const lc = this.#lc;\n const {data} = e;\n lc.debug?.(\n 'received message',\n data instanceof ArrayBuffer\n ? {type: 'binary', byteLength: data.byteLength}\n : data,\n );\n if (this.closed) {\n lc.debug?.('ignoring message because already closed');\n return;\n }\n\n let downMessage: Downstream;\n if (data instanceof ArrayBuffer) {\n this.#messageCount++;\n const message = new Uint8Array(data);\n if (message[0] !== POKE_CHUNK_MESSAGE_TYPE) {\n this.#disconnect(\n lc,\n new ClientError({\n kind: ClientErrorKind.InvalidMessage,\n message: `Unknown binary message type: ${String(message[0])}`,\n }),\n );\n return;\n }\n this.#handlePokeChunk(message.subarray(1));\n return;\n }\n if (typeof data !== 'string') {\n this.#disconnect(\n lc,\n new ClientError({\n kind: ClientErrorKind.InvalidMessage,\n message: 'Invalid binary message received from server',\n }),\n );\n return;\n }\n try {\n downMessage = valita.parse(\n JSON.parse(data),\n downstreamSchema,\n 'passthrough',\n );\n } catch (e) {\n const invalidMessageError = new ClientError(\n {\n kind: ClientErrorKind.InvalidMessage,\n message: `Invalid message received from server: ${getErrorMessage(e)}${data}`,\n },\n {cause: e},\n );\n this.#disconnect(lc, invalidMessageError);\n return;\n }\n this.#messageCount++;\n const msgType = downMessage[0];\n try {\n switch (msgType) {\n case 'connected':\n return this.#handleConnectedMessage(lc, downMessage);\n\n case 'error':\n return this.#handleErrorMessage(lc, downMessage);\n\n case 'pong':\n // Receiving a pong means that the connection is healthy, as the\n // initial schema / versioning negotiations would produce an error\n // before a ping-pong timeout.\n resetBackoff();\n return this.#onPong();\n\n case 'pokeStart':\n return this.#handlePokeStart(lc, downMessage);\n\n case 'pokePart':\n if (downMessage[1].rowsPatch) {\n // Receiving row data indicates that the client is in a good state\n // and can reset the reload backoff state.\n resetBackoff();\n }\n return this.#handlePokePart(lc, downMessage);\n\n case 'pokeEnd':\n return this.#handlePokeEnd(lc, downMessage);\n\n case 'pull':\n return this.#handlePullResponse(lc, downMessage);\n\n case 'deleteClients':\n return this.#deleteClientsManager.clientsDeletedOnServer(\n downMessage[1],\n );\n\n case 'pushResponse':\n return this.#mutationTracker.processPushResponse(downMessage[1]);\n\n case 'transformError':\n this.#queryManager.handleTransformErrors(downMessage[1]);\n break;\n\n case 'inspect':\n // ignore at this layer.\n break;\n\n default:\n unreachable(msgType);\n }\n } catch (e) {\n lc.error?.('Unhandled error in onOpen', e);\n this.#disconnect(\n lc,\n new ClientError(\n {\n kind: ClientErrorKind.Internal,\n message: getErrorMessage(e),\n },\n {cause: e},\n ),\n );\n return;\n }\n };\n\n #onOpen = () => {\n let lc = this.#lc;\n try {\n assert(this.#socket, 'Socket is not set before onOpen');\n\n lc = addWebSocketIDFromSocketToLogContext(this.#socket, lc);\n if (this.#connectStart === undefined) {\n throw new Error('Got open event but connect start time is undefined.');\n } else {\n const now = Date.now();\n const timeToOpenMs = now - this.#connectStart;\n lc.info?.('Got socket open event', {\n navigatorOnline: navigator?.onLine,\n timeToOpenMs,\n });\n }\n } catch (e) {\n lc.error?.('Unhandled error in onOpen', e);\n this.#disconnect(\n lc,\n new ClientError(\n {\n kind: ClientErrorKind.Internal,\n message: getErrorMessage(e),\n },\n {cause: e},\n ),\n );\n }\n };\n\n #onClose = async (e: CloseEvent) => {\n let lc = this.#lc;\n try {\n assert(this.#socket, 'Socket is not set before onClose');\n\n lc = addWebSocketIDFromSocketToLogContext(this.#socket, lc);\n const {code, reason, wasClean} = e;\n // 1006 = abnormal closure, generated by the browser when the connection\n // drops (e.g. laptop sleep, network change). expected in practice.\n if (code <= 1001 || code === 1006) {\n lc.info?.('Got socket close event', {code, reason, wasClean});\n } else {\n lc.error?.('Got unexpected socket close event', {\n code,\n reason,\n wasClean,\n });\n }\n\n // 1009 = Message Too Big. The server rejected an oversized WebSocket\n // message, most likely a mutation containing a large value (e.g. a\n // base64-encoded image), but possibly a large changeDesiredQueries\n // payload. Because mutations are persisted in IndexedDB, the client\n // would otherwise reconnect and immediately re-send the message,\n // causing an infinite reconnect loop. Disable the client group to\n // abandon the stuck message and reload with a fresh client group.\n //\n // Using InvalidMessage as the error kind transitions the connection\n // to Error state, making it observable via connection.state.subscribe().\n // The reload is routed through onClientStateNotFound so customers can\n // override it (e.g. to show UI, defer reload, or report to Sentry).\n if (code === 1009) {\n const recentMessagesInfo =\n this.#recentSentMessages.length > 0\n ? '\\nRecent sent messages:\\n' +\n JSON.stringify(this.#recentSentMessages, null, 2)\n : '';\n const messageTooLargeError = new ClientError({\n kind: ClientErrorKind.InvalidMessage,\n message:\n 'A WebSocket message exceeded the server message size limit. ' +\n \"This is usually caused by a mutation's args containing a large \" +\n 'value such as a base64-encoded image. Consider uploading ' +\n 'large files to object storage and storing only the URL in Zero.' +\n recentMessagesInfo,\n });\n this.#disconnect(lc, messageTooLargeError);\n\n await this.#rep.disableClientGroup();\n this.#onClientStateNotFound(\n ErrorKind.InvalidMessage,\n messageTooLargeError.message,\n );\n } else {\n const closeError = new ClientError(\n wasClean\n ? {\n kind: ClientErrorKind.CleanClose,\n message: 'WebSocket connection closed cleanly',\n }\n : {\n kind: ClientErrorKind.AbruptClose,\n message: 'WebSocket connection closed abruptly',\n },\n );\n this.#disconnect(lc, closeError);\n }\n } catch (e) {\n lc.error?.('Unhandled error in onClose', e);\n const internalError = new ClientError(\n {\n kind: ClientErrorKind.Internal,\n message: getErrorMessage(e),\n },\n {cause: e},\n );\n this.#disconnect(lc, internalError);\n }\n };\n\n // An error on the connection is fatal for the connection.\n async #handleErrorMessage(\n lc: LogContext,\n downMessage: ErrorMessage,\n ): Promise<void> {\n const [, {kind, message}] = downMessage;\n\n // Rate limit errors are not fatal to the connection.\n // We really don't want to disconnect and reconnect a rate limited user as\n // it'll use more resources on the server\n if (kind === ErrorKind.MutationRateLimited) {\n this.#lastMutationIDsSent.clear();\n lc.error?.(kind, 'Mutation rate limited', {message});\n return;\n }\n\n lc.info?.(`${kind}: ${message}}`);\n const error = new ProtocolError(downMessage[1]);\n lc.error?.(`${error.kind}:\\n\\n${error.errorBody.message}`, error);\n\n this.#disconnect(lc, error);\n\n if (kind === ErrorKind.VersionNotSupported) {\n this.#onUpdateNeeded({type: kind, message});\n } else if (kind === ErrorKind.SchemaVersionNotSupported) {\n await this.#rep.disableClientGroup();\n this.#onUpdateNeeded({\n type: 'SchemaVersionNotSupported',\n message,\n });\n } else if (kind === ErrorKind.ClientNotFound) {\n await this.#rep.disableClientGroup();\n this.#onClientStateNotFound(\n kind,\n onClientStateNotFoundServerReason(message),\n );\n } else if (\n kind === ErrorKind.InvalidConnectionRequestLastMutationID ||\n kind === ErrorKind.InvalidConnectionRequestBaseCookie\n ) {\n await dropReplicacheDatabase(this.#rep.idbName, {\n kvStore: this.#kvStore,\n });\n\n this.#onClientStateNotFound(kind, serverAheadReloadReason);\n }\n }\n\n async #handleConnectedMessage(\n lc: LogContext,\n connectedMessage: ConnectedMessage,\n ): Promise<void> {\n const attempt = must(\n this.#currentConnectAttempt,\n 'Connected message received without an active connection attempt',\n );\n const now = Date.now();\n const [, connectBody] = connectedMessage;\n lc = addWebSocketIDToLogContext(connectBody.wsid, lc);\n this.#addConnectEvent(lc, attempt, 'processing the server acknowledgement');\n\n if (this.#connectedCount === 0) {\n this.#checkConnectivity('firstConnect');\n } else if (this.#connectErrorCount > 0) {\n this.#checkConnectivity('connectAfterError');\n }\n this.#connectedCount++;\n this.#connectedAt = now;\n this.#metrics.lastConnectError.clear();\n const proceedingConnectErrorCount = this.#connectErrorCount;\n this.#connectErrorCount = 0;\n\n let timeToConnectMs: number | undefined;\n let connectMsgLatencyMs: number | undefined;\n if (this.#connectStart === undefined) {\n lc.error?.('Got connected message but connect start time is undefined.');\n } else {\n timeToConnectMs = now - this.#connectStart;\n this.#metrics.timeToConnectMs.set(timeToConnectMs);\n connectMsgLatencyMs =\n connectBody.timestamp !== undefined\n ? now - connectBody.timestamp\n : undefined;\n this.#connectStart = undefined;\n }\n let totalTimeToConnectMs: number | undefined;\n if (this.#totalToConnectStart === undefined) {\n lc.error?.(\n 'Got connected message but total to connect start time is undefined.',\n );\n } else {\n totalTimeToConnectMs = now - this.#totalToConnectStart;\n this.#totalToConnectStart = undefined;\n }\n\n this.#metrics.setConnected(timeToConnectMs ?? 0, totalTimeToConnectMs ?? 0);\n\n lc.info?.('Connected', {\n navigatorOnline: navigator?.onLine,\n timeToConnectMs,\n totalTimeToConnectMs,\n connectMsgLatencyMs,\n connectedCount: this.#connectedCount,\n proceedingConnectErrorCount,\n });\n this.#lastMutationIDsSent.clear();\n\n lc.debug?.('Resolving connect resolver');\n must(this.#socket);\n const queriesPatch = await this.#rep.query(tx =>\n this.#queryManager.getQueriesPatch(tx, this.#initConnectionQueries),\n );\n\n const hasDeletedClients = () =>\n skipEmptyArray(this.#deletedClients?.clientIDs) ||\n skipEmptyArray(this.#deletedClients?.clientGroupIDs);\n\n const maybeSendDeletedClients = () => {\n if (hasDeletedClients()) {\n this.#send(['deleteClients', this.#deletedClients!]);\n this.#deletedClients = undefined;\n }\n };\n\n if (queriesPatch.size > 0 && this.#initConnectionQueries !== undefined) {\n maybeSendDeletedClients();\n this.#send([\n 'changeDesiredQueries',\n {\n desiredQueriesPatch: [...queriesPatch.values()],\n traceparent: this.#options.getTraceparent?.(),\n },\n ]);\n } else if (this.#initConnectionQueries === undefined) {\n // if #initConnectionQueries was undefined that means we never\n // sent `initConnection` to the server inside the sec-protocol header.\n const clientSchema = this.#clientSchema;\n this.#send([\n 'initConnection',\n {\n desiredQueriesPatch: [...queriesPatch.values()],\n deleted: skipEmptyDeletedClients(this.#deletedClients),\n // The clientSchema only needs to be sent for the very first request.\n // Henceforth it is stored with the CVR and verified automatically.\n ...(this.#connectCookie === null ? {clientSchema} : {}),\n userPushURL: this.#options.mutateURL,\n userPushHeaders: this.#options.mutateHeaders,\n userQueryURL: this.#options.queryURL ?? this.#options.getQueriesURL,\n userQueryHeaders: this.#options.queryHeaders,\n traceparent: this.#options.getTraceparent?.(),\n },\n ]);\n this.#deletedClients = undefined;\n }\n this.#initConnectionQueries = undefined;\n\n maybeSendDeletedClients();\n\n this.#connectionManager.connected();\n attempt.connected.resolve();\n }\n\n /**\n * Starts a new connection. This will create the WebSocket that does the HTTP\n * request to the server.\n *\n * {@link #connectAttempt} will throw an assertion error if the\n * {@link #connectionManager} status is not {@link ConnectionManagerState.Disconnected}\n * or {@link ConnectionManagerState.Connecting}.\n * Callers MUST check the connection status before calling this method and log\n * an error as needed.\n *\n * The returned promise resolves after receiving the {@link ConnectedMessage}\n * and rejects if setup, the socket, or the connection handshake fails.\n */\n async #connectAttempt(\n lc: LogContext,\n additionalConnectParams: Record<string, string> | undefined,\n attempt: ConnectAttemptControl,\n ): Promise<void> {\n if (this.closed) {\n return;\n }\n\n assert(this.#server, 'No server provided');\n const socketOrigin = toWSString(this.#server);\n\n // can be called from both disconnected and connecting states.\n // connecting() handles incrementing attempt counter if already connecting.\n assert(\n this.#connectionManager.is(ConnectionStatus.Disconnected) ||\n this.#connectionManager.is(ConnectionStatus.Connecting),\n 'connectAttempt() called from invalid state: ' +\n this.#connectionManager.state.name,\n );\n\n const wsid = nanoid();\n lc = addWebSocketIDToLogContext(wsid, lc);\n lc.info?.('Connecting...', {navigatorOnline: navigator?.onLine});\n\n this.#connectionManager.connecting();\n\n // connectAttempt() called but connect start time is defined. This should not\n // happen.\n assert(this.#connectStart === undefined, 'connect start time is defined');\n\n const now = Date.now();\n this.#connectStart = now;\n if (this.#totalToConnectStart === undefined) {\n this.#totalToConnectStart = now;\n }\n\n const {signal} = attempt.controller;\n this.#addConnectEvent(lc, attempt, 'reading the cookie');\n const connectCookie = valita.parse(\n await this.#rep.cookie,\n nullableVersionSchema,\n 'passthrough',\n );\n this.#addConnectEvent(lc, attempt, 'reading the client group ID');\n const clientGroupID = await this.clientGroupID;\n this.#addConnectEvent(lc, attempt, 'initializing active clients');\n const activeClientsManager = await this.#activeClientsManager;\n\n // The run loop has already stopped waiting for this attempt if it was\n // canceled. Do not let setup that completed late create a socket.\n if (signal.aborted) {\n throw signal.reason;\n }\n\n const [ws, initConnectionQueries, deletedClients] = await createSocket(\n this.#rep,\n this.#queryManager,\n this.#deleteClientsManager,\n socketOrigin,\n connectCookie,\n this.clientID,\n clientGroupID,\n this.#clientSchema,\n this.userID,\n fromReplicacheAuthToken(this.#rep.auth),\n this.#lastMutationIDReceived,\n wsid,\n this.#options.logLevel === 'debug',\n lc,\n this.#options.mutateURL,\n this.#options.mutateHeaders,\n this.#options.queryURL ?? this.#options.getQueriesURL,\n this.#options.queryHeaders,\n additionalConnectParams,\n activeClientsManager,\n this.#options.maxHeaderLength,\n event => this.#addConnectEvent(lc, attempt, event),\n );\n\n // createSocket performs asynchronous preparation before constructing the\n // WebSocket. If the attempt was canceled during that work, the late socket\n // still belongs to this attempt and must be closed.\n if (signal.aborted) {\n ws.close();\n throw signal.reason;\n }\n\n if (this.closed) {\n ws.close();\n return;\n }\n\n this.#connectCookie = connectCookie;\n this.#initConnectionQueries = initConnectionQueries;\n this.#deletedClients = deletedClients;\n ws.addEventListener('message', this.#onMessage);\n ws.addEventListener('open', this.#onOpen);\n ws.addEventListener('close', this.#onClose);\n this.#socket = ws;\n this.#socketResolver.resolve(ws);\n\n this.#addConnectEvent(\n lc,\n attempt,\n 'waiting for the server acknowledgement',\n );\n lc.debug?.('Waiting for connection to be acknowledged');\n // Local setup is done; the rest of the wait is the server's, and gets its\n // own budget rather than whatever the setup left over.\n attempt.clearTimeout?.();\n attempt.clearTimeout = this.#armConnectTimeout(lc, attempt, 'ack');\n await attempt.connected.promise;\n if (signal.aborted) {\n throw signal.reason;\n }\n this.#mutationTracker.onConnected(this.#lastMutationIDReceived);\n // push any outstanding mutations on reconnect.\n this.#rep.push().catch(() => {});\n }\n\n /**\n * Starts the deadline for one phase of a connection attempt, and returns a\n * function that cancels it.\n *\n * The two phases are measured separately because they fail for unrelated\n * reasons. `setup` covers local work — reading the cookie, the client group\n * ID and the active clients from IDB, then preparing and opening the socket\n * — whose duration says nothing about whether the server is reachable.\n * `ack` covers the wait for the server's response. Running them on one\n * budget meant a slow cold boot spent the server's time before the socket\n * existed, and reported a healthy server as unreachable.\n */\n #armConnectTimeout(\n lc: LogContext,\n attempt: ConnectAttemptControl,\n phase: 'setup' | 'ack',\n ): () => void {\n const {signal} = attempt.controller;\n\n // A deadline outlives the caller that armed it. The run loop stops waiting\n // on a canceled attempt and clears whatever deadline was running, but\n // #connectAttempt keeps going — its in-flight awaits do not all honor the\n // abort — so it can reach the setup-to-ack handover afterwards. A timer\n // armed at that point would have no owner left to clear it, and would\n // disconnect whichever attempt came next. Tying it to the signal means it\n // is cleared by any abort, whenever it happens and whoever holds it.\n if (signal.aborted) {\n return () => {};\n }\n\n const timeoutID = setTimeout(() => {\n lc.debug?.('Connection attempt timed out');\n this.#disconnect(\n lc,\n new ClientError({\n kind: ClientErrorKind.ConnectTimeout,\n message:\n (phase === 'setup'\n ? `Connection setup timed out after ${CONNECT_TIMEOUT_MS / 1000} seconds. `\n : `Server did not acknowledge the connection within ${CONNECT_TIMEOUT_MS / 1000} seconds. `) +\n `Connect events: ${JSON.stringify(attempt.events)}`,\n }),\n );\n }, CONNECT_TIMEOUT_MS);\n\n const clear = () => {\n clearTimeout(timeoutID);\n signal.removeEventListener('abort', clear);\n };\n signal.addEventListener('abort', clear, {once: true});\n return clear;\n }\n\n #addConnectEvent(\n lc: LogContext,\n attempt: ConnectAttemptControl,\n event: string,\n ): void {\n attempt.events.push([new Date(), event]);\n lc.debug?.('Connect event', event);\n }\n\n #disconnect(lc: LogContext, reason: ZeroError, closeCode?: CloseCode): void {\n this.#currentConnectAttempt?.controller.abort(reason);\n\n if (shouldReportConnectError(reason)) {\n this.#connectErrorCount++;\n this.#metrics.lastConnectError.set(getLastConnectErrorValue(reason));\n this.#metrics.timeToConnectMs.set(DID_NOT_CONNECT_VALUE);\n this.#metrics.setConnectError(reason);\n if (\n this.#connectErrorCount % CHECK_CONNECTIVITY_ON_ERROR_FREQUENCY ===\n 1\n ) {\n this.#checkConnectivity(`connectErrorCount=${this.#connectErrorCount}`);\n }\n }\n\n lc.info?.('disconnecting', {\n navigatorOnline: navigator?.onLine,\n reason: reason.kind,\n connectStart: this.#connectStart,\n totalToConnectStart: this.#totalToConnectStart,\n connectedAt: this.#connectedAt,\n connectionDuration: this.#connectedAt\n ? Date.now() - this.#connectedAt\n : 0,\n messageCount: this.#messageCount,\n connectionState: this.#connectionManager.state,\n connectErrorCount: this.#connectErrorCount,\n });\n\n const connectionStatus = this.#connectionManager.state.name;\n switch (connectionStatus) {\n case ConnectionStatus.Connected: {\n if (this.#connectStart !== undefined) {\n lc.error?.(\n 'disconnect() called while connected but connect start time is defined.',\n );\n // this._connectStart reset below.\n }\n break;\n }\n case ConnectionStatus.Closed:\n lc.debug?.('disconnect() called while closed');\n return;\n\n case ConnectionStatus.Disconnected:\n case ConnectionStatus.Connecting:\n case ConnectionStatus.NeedsAuth:\n case ConnectionStatus.Error:\n break;\n\n default:\n unreachable(connectionStatus);\n }\n\n this.#socketResolver = resolver();\n this.#messageCount = 0;\n this.#connectStart = undefined; // don't reset this._totalToConnectStart\n this.#connectedAt = 0;\n this.#socket?.removeEventListener('message', this.#onMessage);\n this.#socket?.removeEventListener('open', this.#onOpen);\n this.#socket?.removeEventListener('close', this.#onClose);\n this.#socket?.close(closeCode);\n this.#socket = undefined;\n this.#lastMutationIDsSent.clear();\n this.#pokeHandler.handleDisconnect();\n this.#queryManager.clearGotQueriesAuthoritative();\n\n const transition = getErrorConnectionTransition(reason);\n\n switch (transition.status) {\n case ConnectionStatus.NeedsAuth:\n this.#connectionManager.needsAuth(transition.reason);\n break;\n case ConnectionStatus.Error:\n this.#connectionManager.error(transition.reason);\n break;\n case ConnectionStatus.Disconnected:\n this.#connectionManager.disconnected(transition.reason);\n break;\n case ConnectionStatus.Closed:\n this.#connectionManager.closed();\n break;\n case NO_STATUS_TRANSITION:\n if (!this.#connectionManager.isInTerminalState()) {\n this.#connectionManager.connecting(transition.reason);\n }\n break;\n default:\n unreachable(transition);\n }\n }\n\n #handlePokeStart(_lc: LogContext, pokeMessage: PokeStartMessage): void {\n this.#abortPingTimeout();\n this.#pokeHandler.handlePokeStart(pokeMessage[1]);\n }\n\n #handlePokePart(_lc: LogContext, pokeMessage: PokePartMessage): void {\n this.#abortPingTimeout();\n const lastMutationIDChangeForSelf = this.#pokeHandler.handlePokePart(\n pokeMessage[1],\n );\n if (lastMutationIDChangeForSelf !== undefined) {\n this.#lastMutationIDReceived = lastMutationIDChangeForSelf;\n }\n }\n\n #handlePokeChunk(chunk: Uint8Array): void {\n this.#abortPingTimeout();\n this.#pokeHandler.handlePokeChunk(chunk);\n }\n\n #handlePokeEnd(_lc: LogContext, pokeMessage: PokeEndMessage): void {\n this.#abortPingTimeout();\n const result = this.#pokeHandler.handlePokeEnd(pokeMessage[1]);\n if (result?.hasRows) {\n // Receiving row data indicates that the client is in a good state and\n // can reset the reload backoff state.\n resetBackoff();\n }\n if (result?.lastMutationIDChangeForSelf !== undefined) {\n this.#lastMutationIDReceived = result.lastMutationIDChangeForSelf;\n }\n }\n\n #onPokeError(error: unknown): void {\n const lc = this.#lc;\n lc.info?.(\n 'poke error, disconnecting?',\n !this.#connectionManager.is(ConnectionStatus.Disconnected),\n );\n\n // It is theoretically possible that we get disconnected during the\n // async poke above. Only disconnect if we are not already\n // disconnected.\n if (!this.#connectionManager.is(ConnectionStatus.Disconnected)) {\n const errorStr = String(error);\n const isBaseCookieError = errorStr.includes('unexpected base cookie');\n this.#disconnect(\n lc,\n new ClientError({\n kind: isBaseCookieError\n ? ClientErrorKind.UnexpectedBaseCookie\n : ClientErrorKind.Internal,\n message: isBaseCookieError\n ? 'Server returned unexpected base cookie during sync'\n : `Poke processing error: ${errorStr}`,\n }),\n );\n }\n }\n\n #handlePullResponse(\n lc: LogContext,\n pullResponseMessage: PullResponseMessage,\n ): void {\n this.#abortPingTimeout();\n const body = pullResponseMessage[1];\n lc = lc.withContext('requestID', body.requestID);\n lc.debug?.('Handling pull response', body);\n const resolver = this.#pendingPullsByRequestID.get(body.requestID);\n if (!resolver) {\n // This can happen because resolvers are deleted\n // from this._pendingPullsByRequestID when pulls timeout.\n lc.debug?.('No resolver found');\n return;\n }\n resolver.resolve(pullResponseMessage[1]);\n }\n\n async #pusher(req: PushRequest, requestID: string): Promise<PusherResult> {\n // The deprecation of pushVersion 0 predates zero-client\n assert(req.pushVersion === 1, 'Expected pushVersion 1');\n // If we are connecting we wait until we are connected.\n await this.#connectionReadyResolver.promise;\n const lc = this.#lc.withContext('requestID', requestID);\n lc.debug?.(`pushing ${req.mutations.length} mutations`);\n assert(this.#socket, 'Expected socket to be connected for push');\n\n const isMutationRecoveryPush =\n req.clientGroupID !== (await this.clientGroupID);\n // A recovery push is for a different client group, so nothing has been sent\n // for it on this connection.\n const toSend = isMutationRecoveryPush\n ? req.mutations\n : req.mutations.filter(\n m => m.id > (this.#lastMutationIDsSent.get(m.clientID) ?? 0),\n );\n lc.debug?.(\n isMutationRecoveryPush ? 'pushing for recovery' : 'pushing',\n toSend.length,\n 'mutations of',\n req.mutations.length,\n 'mutations.',\n );\n const now = Date.now();\n for (const m of toSend) {\n const timestamp = now - Math.round(performance.now() - m.timestamp);\n const zeroM =\n m.name === CRUD_MUTATION_NAME\n ? ({\n type: MutationType.CRUD,\n timestamp,\n id: m.id,\n clientID: m.clientID,\n name: m.name,\n args: [mapCRUD(m.args as CRUDMutationArg, this.#clientToServer)],\n } satisfies CRUDMutation)\n : ({\n type: MutationType.Custom,\n timestamp,\n id: m.id,\n clientID: m.clientID,\n name: m.name,\n args: [m.args],\n } satisfies CustomMutation);\n const msg: PushMessage = [\n 'push',\n {\n timestamp: now,\n clientGroupID: req.clientGroupID,\n mutations: [zeroM],\n pushVersion: req.pushVersion,\n requestID,\n traceparent: this.#options.getTraceparent?.(),\n },\n ];\n this.#send(msg);\n if (!isMutationRecoveryPush) {\n this.#lastMutationIDsSent.set(m.clientID, m.id);\n }\n }\n return {\n httpRequestInfo: {\n errorMessage: '',\n httpStatusCode: 200,\n },\n };\n }\n\n async #runLoop() {\n this.#lc.info?.(`Starting Zero version: ${this.version}`);\n\n if (this.#server === null) {\n this.#lc.info?.('No socket origin provided, not starting connect loop.');\n this.#connectionManager.disconnected(\n new ClientError({\n kind: ClientErrorKind.NoSocketOrigin,\n message: 'No server socket origin provided',\n }),\n );\n return;\n }\n\n let runLoopCounter = 0;\n const bareLogContext = this.#lc;\n const getLogContext = () => {\n let lc = bareLogContext;\n if (this.#socket) {\n lc = addWebSocketIDFromSocketToLogContext(this.#socket, lc);\n }\n return lc.withContext('runLoopCounter', runLoopCounter);\n };\n\n // Set initial auth from options\n const {auth} = this.#options;\n this.#setAuth(auth);\n\n let backoffMs: number | undefined;\n let additionalConnectParams: Record<string, string> | undefined;\n\n while (this.#connectionManager.shouldContinueRunLoop()) {\n runLoopCounter++;\n let lc = getLogContext();\n backoffMs = RUN_LOOP_INTERVAL_MS;\n\n try {\n const currentState = this.#connectionManager.state;\n\n switch (currentState.name) {\n case ConnectionStatus.Connecting:\n case ConnectionStatus.Disconnected: {\n if (this.#visibilityWatcher.visibilityState === 'hidden') {\n this.#metrics.setDisconnectedWaitingForVisible();\n // reset this._totalToConnectStart since this client\n // is no longer trying to connect due to being hidden.\n this.#totalToConnectStart = undefined;\n }\n\n // If hidden, we wait for the tab to become visible before trying again.\n // or for a state change (e.g. an error)\n const visibilityResult = await promiseRace({\n visible: this.#visibilityWatcher.waitForVisible(),\n stateChange: this.#connectionManager.waitForStateChange(),\n });\n\n if (visibilityResult.key === 'stateChange') {\n throwIfConnectionError(visibilityResult.result);\n break;\n }\n\n // If a reload is pending, do not try to reconnect.\n if (reloadScheduled()) {\n break;\n }\n\n const ready = this.#connectionReadyResolver;\n assert(\n this.#currentConnectAttempt === undefined,\n 'Connection attempt already active',\n );\n const attempt: ConnectAttemptControl = {\n controller: new AbortController(),\n connected: resolver(),\n events: [],\n };\n this.#currentConnectAttempt = attempt;\n this.#addConnectEvent(lc, attempt, 'starting the connection');\n attempt.clearTimeout = this.#armConnectTimeout(\n lc,\n attempt,\n 'setup',\n );\n const canceled = resolver<never>();\n const abortHandler = () =>\n canceled.reject(attempt.controller.signal.reason);\n attempt.controller.signal.addEventListener('abort', abortHandler, {\n once: true,\n });\n try {\n try {\n await Promise.race([\n this.#connectAttempt(lc, additionalConnectParams, attempt),\n canceled.promise,\n ]);\n } catch (ex) {\n const error = isZeroError(ex)\n ? ex\n : new ClientError(\n {\n kind: ClientErrorKind.Internal,\n message: getErrorMessage(ex),\n },\n {cause: ex},\n );\n if (!attempt.controller.signal.aborted) {\n this.#disconnect(lc, error);\n }\n ready.reject(error);\n if (this.#connectionReadyResolver === ready) {\n this.#connectionReadyResolver = connectionReadyResolver();\n }\n throw error;\n }\n ready.resolve();\n additionalConnectParams = undefined;\n } finally {\n attempt.clearTimeout?.();\n attempt.controller.signal.removeEventListener(\n 'abort',\n abortHandler,\n );\n if (this.#currentConnectAttempt === attempt) {\n this.#currentConnectAttempt = undefined;\n }\n }\n\n throwIfConnectionError(this.#connectionManager.state);\n\n // Now we have a new socket, update lc with the new wsid.\n assert(this.#socket, 'Expected socket after reconnection');\n lc = getLogContext();\n\n lc.debug?.('Connected successfully');\n break;\n }\n\n case ConnectionStatus.Connected: {\n const ready = this.#connectionReadyResolver;\n // When connected we wait for whatever happens first out of:\n // - After pingTimeoutMs we send a ping\n // - We get a message\n // - The tab becomes hidden (with a delay)\n // - We get a state change (e.g. an error or disconnect)\n\n const controller = new AbortController();\n this.#abortPingTimeout = () => controller.abort();\n const [pingTimeoutPromise, pingTimeoutAborted] = sleepWithAbort(\n this.pingTimeoutMs,\n controller.signal,\n );\n\n try {\n const raceResult = await promiseRace({\n waitForPing: pingTimeoutPromise,\n waitForPingAborted: pingTimeoutAborted,\n tabHidden: this.#visibilityWatcher.waitForHidden(),\n stateChange: this.#connectionManager.waitForStateChange(),\n });\n\n switch (raceResult.key) {\n case 'waitForPing': {\n await this.#ping(lc);\n break;\n }\n\n case 'waitForPingAborted':\n break;\n\n case 'tabHidden': {\n const hiddenError = new ClientError({\n kind: ClientErrorKind.Hidden,\n message: 'Connection closed because tab was hidden',\n });\n this.#disconnect(lc, hiddenError);\n break;\n }\n\n case 'stateChange': {\n throwIfConnectionError(raceResult.result);\n break;\n }\n\n default:\n unreachable(raceResult);\n }\n } finally {\n if (\n !this.#connectionManager.is(ConnectionStatus.Connected) &&\n this.#connectionReadyResolver === ready\n ) {\n this.#connectionReadyResolver = connectionReadyResolver();\n }\n }\n\n break;\n }\n\n case ConnectionStatus.NeedsAuth: {\n // we pause the run loop and wait for connect() to be called with new credentials\n lc.info?.(\n `Run loop paused in needs-auth state. Call zero.connection.connect({auth}) to resume.`,\n currentState.reason,\n );\n const resumeResult = await promiseRace({\n connectRequest: this.#connectionManager.waitForConnectRequest(),\n stateChange: this.#connectionManager.waitForStateChange(),\n });\n if (resumeResult.key === 'connectRequest') {\n this.#connectionManager.resumeFromConnectRequest();\n }\n break;\n }\n\n case ConnectionStatus.Error: {\n // we pause the run loop and wait for a state change\n lc.info?.(\n `Run loop paused in error state. Call zero.connection.connect() to resume.`,\n currentState.reason,\n );\n const resumeResult = await promiseRace({\n connectRequest: this.#connectionManager.waitForConnectRequest(),\n stateChange: this.#connectionManager.waitForStateChange(),\n });\n if (resumeResult.key === 'connectRequest') {\n this.#connectionManager.resumeFromConnectRequest();\n }\n break;\n }\n\n case ConnectionStatus.Closed:\n // run loop will terminate\n break;\n\n default:\n unreachable(currentState);\n }\n } catch (ex) {\n const isClientClosedError =\n isClientError(ex) && ex.kind === ClientErrorKind.ClientClosed;\n\n if (\n !this.#connectionManager.is(ConnectionStatus.Connected) &&\n !isClientClosedError\n ) {\n const level = isAuthError(ex) ? 'warn' : 'error';\n const kind = isServerError(ex) ? ex.kind : 'Unknown Error';\n lc[level]?.('Failed to connect', ex, kind, {\n lmid: this.#lastMutationIDReceived,\n baseCookie: this.#connectCookie,\n });\n }\n\n lc.debug?.(\n 'Got an exception in the run loop',\n 'state:',\n this.#connectionManager.state,\n 'exception:',\n ex,\n );\n\n const transition = getErrorConnectionTransition(ex);\n let sleepMs: number | undefined = undefined;\n switch (transition.status) {\n case NO_STATUS_TRANSITION: {\n // We continue the loop because the error does not indicate\n // a need to transition to a new state and we should continue retrying\n\n const backoffParams = getBackoffParams(transition.reason);\n if (backoffParams) {\n if (backoffParams.minBackoffMs !== undefined) {\n backoffMs = Math.max(backoffMs, backoffParams.minBackoffMs);\n }\n if (backoffParams.maxBackoffMs !== undefined) {\n backoffMs = Math.min(backoffMs, backoffParams.maxBackoffMs);\n }\n additionalConnectParams = backoffParams.reconnectParams;\n }\n\n lc.debug?.(\n 'Sleeping',\n backoffMs,\n 'ms before reconnecting due to error, state:',\n this.#connectionManager.state,\n );\n sleepMs = backoffMs;\n break;\n }\n case ConnectionStatus.NeedsAuth: {\n lc.debug?.(\n 'Auth error encountered, transitioning to needs-auth state',\n );\n this.#connectionManager.needsAuth(transition.reason);\n // run loop will enter the needs-auth state case and await a state change\n break;\n }\n case ConnectionStatus.Error: {\n lc.debug?.('Fatal error encountered, transitioning to error state');\n\n this.#connectionManager.error(transition.reason);\n // run loop will enter the error state case and await a state change\n break;\n }\n case ConnectionStatus.Disconnected: {\n this.#connectionManager.disconnected(transition.reason);\n break;\n }\n case ConnectionStatus.Closed: {\n break;\n }\n default:\n unreachable(transition);\n }\n\n // refresh to ensure any persisted snapshots that we're not refreshed\n // becasue refreshes are disabled while connecting and connected and\n // were not received via poke from the server, are picked up.\n // Do this before back off sleep.\n if (transition.status !== ConnectionStatus.Closed) {\n try {\n this.#forceEnableRefresh = true;\n await this.#rep.runRefresh();\n } catch (ex) {\n if (ex instanceof AbortError) {\n this.#lc.debug?.(\n `Refresh from storage did not complete before close.`,\n );\n } else {\n this.#lc.error?.(`Error during refresh from storage`, ex);\n }\n } finally {\n this.#forceEnableRefresh = false;\n }\n }\n\n if (sleepMs) {\n await sleep(sleepMs);\n }\n }\n }\n }\n\n async #puller(req: PullRequest, requestID: string): Promise<PullerResult> {\n // The deprecation of pushVersion 0 predates zero-client\n assert(req.pullVersion === 1, 'Expected pullVersion 1');\n const lc = this.#lc.withContext('requestID', requestID);\n lc.debug?.('Pull', req);\n // Pull request for this instance's client group. A no-op response is\n // returned as pulls for this client group are handled via poke over the\n // socket.\n if (req.clientGroupID === (await this.clientGroupID)) {\n return {\n httpRequestInfo: {\n errorMessage: '',\n httpStatusCode: 200,\n },\n };\n }\n\n // If we are connecting we wait until we are connected.\n await this.#connectionReadyResolver.promise;\n assert(\n this.#socket,\n 'Expected socket to be connected for mutation recovery pull',\n );\n // Mutation recovery pull.\n lc.debug?.('Pull is for mutation recovery');\n const cookie = valita.parse(\n req.cookie,\n nullableVersionSchema,\n 'passthrough',\n );\n const pullRequestMessage: PullRequestMessage = [\n 'pull',\n {\n clientGroupID: req.clientGroupID,\n cookie,\n requestID,\n },\n ];\n this.#send(pullRequestMessage);\n const pullResponseResolver: Resolver<PullResponseBody> = resolver();\n this.#pendingPullsByRequestID.set(requestID, pullResponseResolver);\n try {\n const raceResult = await promiseRace({\n timeout: sleep(PULL_TIMEOUT_MS),\n success: pullResponseResolver.promise,\n });\n switch (raceResult.key) {\n case 'timeout':\n lc.debug?.('Mutation recovery pull timed out');\n throw new ClientError({\n kind: ClientErrorKind.PullTimeout,\n message: 'Pull timed out',\n });\n case 'success': {\n lc.debug?.('Returning mutation recovery pull response');\n const response = await pullResponseResolver.promise;\n return {\n response: {\n cookie: response.cookie,\n lastMutationIDChanges: response.lastMutationIDChanges,\n patch: [],\n },\n httpRequestInfo: {\n errorMessage: '',\n httpStatusCode: 200,\n },\n };\n }\n default:\n unreachable(raceResult);\n }\n } finally {\n pullResponseResolver.reject(\n new ClientError({\n kind: ClientErrorKind.PullTimeout,\n message: 'Pull timed out',\n }),\n );\n this.#pendingPullsByRequestID.delete(requestID);\n }\n }\n\n /**\n * Sets the authentication token on the replicache instance.\n *\n * @param auth - The authentication token to set.\n */\n #setAuth(auth: string | undefined | null): void {\n this.#checkAuthValid(this.userID, auth);\n\n this.#rep.auth = toReplicacheAuthToken(auth);\n\n if (auth) {\n this.#sendIfConnected(['updateAuth', {auth}]);\n }\n }\n\n /**\n * A rough heuristic for whether the client is currently online and\n * authenticated.\n *\n * @deprecated Use `connection` instead, which provides more detailed connection state.\n */\n get online(): boolean {\n return this.#onlineManager.online;\n }\n\n /**\n * Subscribe to online status changes.\n *\n * This is useful when you want to update state based on the online status.\n *\n * @param listener - The listener to subscribe to.\n * @returns A function to unsubscribe the listener.\n *\n * @deprecated Use `connection` instead, which provides more detailed connection state.\n */\n onOnline = (listener: (online: boolean) => void): (() => void) =>\n this.#onlineManager.subscribe(listener);\n\n /**\n * Starts a ping and waits for a pong.\n */\n async #ping(lc: LogContext): Promise<void> {\n lc.debug?.('pinging');\n const {promise, resolve} = resolver();\n this.#onPong = resolve;\n const pingMessage: PingMessage = ['ping', {}];\n const t0 = performance.now();\n assert(this.#socket, 'Expected socket to be connected for ping');\n this.#send(pingMessage);\n\n const raceResult = await promiseRace({\n waitForPong: promise,\n pingTimeout: sleep(this.pingTimeoutMs),\n stateChange: this.#connectionManager.waitForStateChange(),\n });\n\n const delta = performance.now() - t0;\n switch (raceResult.key) {\n case 'waitForPong': {\n lc.debug?.('ping succeeded in', delta, 'ms');\n return;\n }\n\n case 'pingTimeout': {\n lc.info?.('ping failed in', delta, 'ms - disconnecting');\n const pingTimeoutError = new ClientError({\n kind: ClientErrorKind.PingTimeout,\n message: 'Server ping request failed',\n });\n this.#disconnect(lc, pingTimeoutError);\n throw pingTimeoutError;\n }\n\n case 'stateChange': {\n lc.debug?.(\n 'ping aborted due to connection state change',\n raceResult.result,\n );\n throwIfConnectionError(raceResult.result);\n break;\n }\n\n default:\n unreachable(raceResult);\n }\n }\n\n // Sends a set of metrics to the server. Throws unless the server\n // returns 200.\n // TODO: Reenable metrics reporting\n async #reportMetrics(_allSeries: Series[]) {\n // if (this.#server === null) {\n // this.#lc.info?.('Skipping metrics report, socketOrigin is null');\n // return;\n // }\n // const body = JSON.stringify({series: allSeries});\n // const url = new URL('/api/metrics/v0/report', this.#server);\n // url.searchParams.set('clientID', this.clientID);\n // url.searchParams.set('clientGroupID', await this.clientGroupID);\n // url.searchParams.set('userID', this.userID);\n // url.searchParams.set('requestID', nanoid());\n // const res = await fetch(url.toString(), {\n // method: 'POST',\n // body,\n // keepalive: true,\n // });\n // if (!res.ok) {\n // const maybeBody = await res.text();\n // throw new Error(\n // `unexpected response: ${res.status} ${res.statusText} body: ${maybeBody}`,\n // );\n // }\n }\n\n #checkConnectivity(reason: string) {\n this.#checkConnectivityAsync(reason);\n }\n\n #checkConnectivityAsync(_reason: string) {\n // skipping connectivity checks for now - the server doesn't respond to\n // them so it just creates noise.\n // assert(this.#server);\n // if (this.closed) {\n // return;\n // }\n // try {\n // await checkConnectivity(\n // reason,\n // this.#server,\n // this.#lc,\n // this.#closeAbortController.signal,\n // this.#enableAnalytics,\n // );\n // } catch (e) {\n // this.#lc.info?.('Error checking connectivity for', reason, e);\n // }\n }\n\n /**\n * `inspector` is an object that can be used to inspect the state of the\n * queries a Zero instance uses. It is intended for debugging purposes.\n */\n get inspector(): Inspector {\n // We use esbuild dropLabels to strip this code when we build the code for the bundle size dashboard.\n // https://esbuild.github.io/api/#ignore-annotations\n // /packages/zero/tool/build.ts\n\n // oxlint-disable-next-line no-unused-labels\n BUNDLE_SIZE: {\n return (this.#inspector ??= new Inspector(\n this.#rep,\n this.#queryManager,\n this.#zeroContext,\n async () => {\n await this.#connectionReadyResolver.promise;\n return must(this.#socket);\n },\n ));\n }\n }\n\n async delete(): Promise<{deleted: string[]; errors: unknown[]}> {\n await this.close();\n\n const kvStoreProvider = getKVStoreProvider(this.#lc, this.#kvStore);\n const idbDatabasesStore = new IDBDatabasesStore(kvStoreProvider.create);\n try {\n const databases = await idbDatabasesStore.getDatabases();\n const dbNamesToDelete = Object.values(databases)\n .filter(database => database.replicacheName === this.#rep.name)\n .map(database => database.name);\n\n const deleteResults = await Promise.allSettled(\n dbNamesToDelete.map(async dbName => {\n await dropReplicacheDatabase(dbName, {kvStore: this.#kvStore});\n return dbName;\n }),\n );\n\n const deleted: string[] = [];\n const errors: unknown[] = [];\n for (const result of deleteResults) {\n if (result.status === 'fulfilled') {\n deleted.push(result.value);\n } else {\n errors.push(result.reason);\n }\n }\n\n return {deleted, errors};\n } finally {\n await idbDatabasesStore.close();\n }\n }\n\n #addMetric: <K extends keyof MetricMap>(\n metric: K,\n value: number,\n ...args: MetricMap[K]\n ) => void = (metric, value, ...args) => {\n assert(isClientMetric(metric), `Invalid metric: ${metric}`);\n this.#queryManager.addMetric(\n metric as keyof ClientMetricMap,\n value,\n ...(args as ClientMetricMap[keyof ClientMetricMap]),\n );\n };\n\n #checkAuthValid(\n userID: string | undefined,\n auth: string | null | undefined,\n ): void {\n if (userID === undefined && auth) {\n throw new ClientError({\n kind: ClientErrorKind.Internal,\n message: 'ZeroOptions.userID is required when auth is set.',\n });\n }\n }\n}\n\nexport class OnlineManager extends Subscribable<boolean> {\n #online = false;\n\n setOnline(online: boolean): void {\n if (this.#online === online) {\n return;\n }\n this.#online = online;\n this.notify(online);\n }\n\n get online(): boolean {\n return this.#online;\n }\n}\n\nexport async function createSocket(\n rep: ReplicacheImpl,\n queryManager: QueryManager,\n deleteClientsManager: DeleteClientsManager,\n socketOrigin: WSString,\n baseCookie: NullableVersion,\n clientID: string,\n clientGroupID: string,\n clientSchema: ClientSchema,\n userID: string | undefined,\n auth: string | undefined,\n lmid: number,\n wsid: string,\n debugPerf: boolean,\n lc: LogContext,\n userPushURL: string | undefined,\n userPushHeaders: Record<string, string> | undefined,\n userQueryURL: string | undefined,\n userQueryHeaders: Record<string, string> | undefined,\n additionalConnectParams: Record<string, string> | undefined,\n activeClientsManager: Pick<ActiveClientsManager, 'activeClients'>,\n maxHeaderLength = 1024 * 8,\n onEvent?: (event: string) => void,\n): Promise<\n [\n WebSocket,\n Map<string, UpQueriesPatchOp> | undefined,\n DeleteClientsBody | undefined,\n ]\n> {\n onEvent?.('reading the profile ID');\n const url = await createConnectionURL(\n socketOrigin,\n clientID,\n clientGroupID,\n userID,\n baseCookie,\n lmid,\n wsid,\n rep,\n debugPerf,\n additionalConnectParams,\n lc,\n );\n\n // Pass auth to the server via the `Sec-WebSocket-Protocol` header by passing\n // it as a `protocol` to the `WebSocket` constructor. The empty string is an\n // invalid `protocol`, and will result in an exception, so pass undefined\n // instead. encodeURIComponent to ensure it only contains chars allowed\n // for a `protocol`.\n const WS = mustGetBrowserGlobal('WebSocket');\n const queriesPatchP = rep.query(tx => queryManager.getQueriesPatch(tx));\n onEvent?.('reading deleted clients');\n const deletedClientsArray = await deleteClientsManager.getDeletedClients();\n let deletedClients: DeleteClientsBody | undefined =\n convertDeletedClientsToBody(deletedClientsArray, clientGroupID);\n onEvent?.('reading desired queries');\n let queriesPatch: Map<string, UpQueriesPatchOp> | undefined =\n await queriesPatchP;\n const {activeClients} = activeClientsManager;\n\n let secProtocol = encodeSecProtocols(\n [\n 'initConnection',\n {\n desiredQueriesPatch: [...queriesPatch.values()],\n deleted: skipEmptyDeletedClients(deletedClients),\n // The clientSchema only needs to be sent for the very first request.\n // Henceforth it is stored with the CVR and verified automatically.\n ...(baseCookie === null ? {clientSchema} : {}),\n userPushURL,\n userPushHeaders,\n userQueryURL,\n userQueryHeaders,\n activeClients: [...activeClients],\n },\n ],\n auth,\n );\n if (secProtocol.length > maxHeaderLength) {\n secProtocol = encodeSecProtocols(undefined, auth);\n if (secProtocol.length > maxHeaderLength) {\n lc.warn?.(\n `Encoded auth token length (${secProtocol.length}) exceeds ` +\n `ZeroOptions.maxHeaderLength (${maxHeaderLength}). This may ` +\n `cause connection failures.`,\n );\n }\n queriesPatch = undefined;\n } else {\n deletedClients = undefined;\n }\n onEvent?.('creating the WebSocket');\n const socket = new WS(\n // toString() required for RN URL polyfill.\n url.toString(),\n secProtocol,\n );\n socket.binaryType = 'arraybuffer';\n return [socket, queriesPatch, skipEmptyDeletedClients(deletedClients)];\n}\n\nexport async function createConnectionURL(\n socketOrigin: HTTPString | WSString,\n clientID: string,\n clientGroupID: string,\n userID: string | undefined,\n baseCookie: string | null,\n lmid: number,\n wsid: string,\n rep: Pick<ReplicacheImpl<{}>, 'profileID'>,\n debugPerf: boolean,\n additionalConnectParams: Record<string, string> | undefined,\n lc: LogContext<unknown[], unknown[], unknown[], unknown[]>,\n) {\n const url = new URL(\n appendPath(socketOrigin, `/sync/v${PROTOCOL_VERSION}/connect`),\n );\n const {searchParams} = url;\n searchParams.set('clientID', clientID);\n searchParams.set('clientGroupID', clientGroupID);\n if (userID !== undefined) {\n searchParams.set('userID', userID);\n }\n searchParams.set('baseCookie', baseCookie === null ? '' : String(baseCookie));\n searchParams.set('ts', String(performance.now()));\n searchParams.set('lmid', String(lmid));\n searchParams.set('wsid', wsid);\n searchParams.set('profileID', await rep.profileID);\n if (debugPerf) {\n searchParams.set('debugPerf', true.toString());\n }\n if (additionalConnectParams) {\n for (const k in additionalConnectParams) {\n if (searchParams.has(k)) {\n lc.warn?.(`skipping conflicting parameter ${k}`);\n } else {\n searchParams.set(k, additionalConnectParams[k]);\n }\n }\n }\n\n lc.info?.('Connecting to', url.toString());\n return url;\n}\n\nfunction skipEmptyArray<T>(\n arr: readonly T[] | undefined,\n): readonly T[] | undefined {\n return arr && arr.length > 0 ? arr : undefined;\n}\n\nfunction skipEmptyDeletedClients(\n deletedClients: DeleteClientsBody | undefined,\n): DeleteClientsBody | undefined {\n if (!deletedClients) {\n return undefined;\n }\n const {clientIDs, clientGroupIDs} = deletedClients;\n if (\n (!clientIDs || clientIDs.length === 0) &&\n (!clientGroupIDs || clientGroupIDs.length === 0)\n ) {\n return undefined;\n }\n const data: Writable<DeleteClientsBody> = {};\n data.clientIDs = skipEmptyArray(clientIDs);\n data.clientGroupIDs = skipEmptyArray(clientGroupIDs);\n return data;\n}\n\nfunction convertDeletedClientsToBody(\n deletedClients: DeletedClients,\n clientGroupID: ClientGroupID,\n): DeleteClientsBody | undefined {\n if (deletedClients.length === 0) {\n return undefined;\n }\n\n const clientIDs = deletedClients\n .filter(pair => pair.clientID && pair.clientGroupID === clientGroupID)\n .map(pair => pair.clientID);\n if (clientIDs.length === 0) {\n return undefined;\n }\n\n // We no longer send clientGroupIDs\n return {clientIDs};\n}\n\n/**\n * Adds the wsid query parameter to the log context. If the URL does not\n * have a wsid we use a randomID instead.\n */\nfunction addWebSocketIDFromSocketToLogContext(\n {url}: {url: string},\n lc: LogContext,\n): LogContext {\n const wsid = new URL(url).searchParams.get('wsid') ?? nanoid();\n return addWebSocketIDToLogContext(wsid, lc);\n}\n\nfunction addWebSocketIDToLogContext(wsid: string, lc: LogContext): LogContext {\n return lc.withContext('wsid', wsid);\n}\n\nfunction assertValidRunOptions(_options?: RunOptions): void {}\n\nasync function makeActiveClientsManager(\n clientGroupID: Promise<string>,\n clientID: string,\n signal: AbortSignal,\n onDelete: ActiveClientsManager['onDelete'],\n lc: LogContext,\n): Promise<ActiveClientsManager> {\n // Timed from here rather than from the await in #connectAttempt: this runs\n // at construction, in parallel with everything else, so by the time an\n // attempt asks for it the wait is usually already over. Waiting for the\n // client group ID is the database opening, which is timed on its own.\n const groupID = await clientGroupID;\n const start = performance.now();\n const manager = await ActiveClientsManager.create(groupID, clientID, signal);\n const elapsed = performance.now() - start;\n\n // navigator.locks does not exist on React Native, where this falls back to\n // an in-process stand-in that only ever sees this client. That changes both\n // what the timing means and how much the client list can be trusted, so say\n // which one produced the number.\n const locks = getBrowserGlobal('navigator')?.locks ? 'native' : 'fallback';\n if (elapsed > SLOW_ACTIVE_CLIENTS_THRESHOLD_MS) {\n lc.warn?.(`Initializing active clients took ${Math.round(elapsed)}ms`, {\n locks,\n });\n } else {\n lc.debug?.('Initialized active clients in', Math.round(elapsed), 'ms', {\n locks,\n });\n }\n\n manager.onDelete = onDelete;\n return manager;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"zero.js","names":["#rep","#server","#lc","#logOptions","#enableAnalytics","#clientSchema","#pokeHandler","#queryManager","#ivmMain","#clientToServer","#deleteClientsManager","#mutationTracker","#lastMutationIDsSent","#onlineManager","#onUpdateNeeded","#onClientStateNotFound","#zeroContext","#visibilityWatcher","#connectionManager","#connection","#activeClientsManager","#options","#kvStore","#checkAuthValid","#createLogOptions","#sendIfConnected","#disconnect","#pusher","#puller","#closeAbortController","#addMetric","#enableRefresh","#setAuth","#reload","#metrics","#reportMetrics","#socket","#onPokeError","#runLoop","#expose","#connectStart","#socketResolver","#forceEnableRefresh","#send","#recentSentMessages","#unexpose","#messageCount","#handlePokeChunk","#handleConnectedMessage","#handleErrorMessage","#onPong","#handlePokeStart","#handlePokePart","#handlePokeEnd","#handlePullResponse","#currentConnectAttempt","#addConnectEvent","#connectedCount","#checkConnectivity","#connectErrorCount","#connectedAt","#totalToConnectStart","#initConnectionQueries","#deletedClients","#connectCookie","#connectAttempt","#lastMutationIDReceived","#onMessage","#onOpen","#onClose","#armConnectTimeout","#abortPingTimeout","#pendingPullsByRequestID","#connectionReadyResolver","#ping","#checkConnectivityAsync","#inspector","#online"],"sources":["../../../../../zero-client/src/client/zero.ts"],"sourcesContent":["import {LogContext, type LogLevel, type LogSink} from '@rocicorp/logger';\nimport {type Resolver, resolver} from '@rocicorp/resolver';\nimport {type DeletedClients} from '../../../replicache/src/deleted-clients.ts';\nimport {\n ReplicacheImpl,\n type ReplicacheImplOptions,\n} from '../../../replicache/src/impl.ts';\nimport type {Store as KVStore} from '../../../replicache/src/kv/store.ts';\nimport {\n dropDatabase as dropReplicacheDatabase,\n dropMatchingDatabases,\n} from '../../../replicache/src/persist/collect-idb-databases.ts';\nimport type {Puller, PullerResult} from '../../../replicache/src/puller.ts';\nimport type {Pusher, PusherResult} from '../../../replicache/src/pusher.ts';\nimport type {ReplicacheOptions} from '../../../replicache/src/replicache-options.ts';\nimport type {\n ClientGroupID,\n ClientID,\n} from '../../../replicache/src/sync/ids.ts';\nimport type {PullRequest} from '../../../replicache/src/sync/pull.ts';\nimport type {PushRequest} from '../../../replicache/src/sync/push.ts';\nimport type {\n MutatorDefs,\n UpdateNeededReason as ReplicacheUpdateNeededReason,\n} from '../../../replicache/src/types.ts';\nimport {AbortError} from '../../../shared/src/abort-error.ts';\nimport {assert, unreachable} from '../../../shared/src/asserts.ts';\nimport {\n getBrowserGlobal,\n mustGetBrowserGlobal,\n} from '../../../shared/src/browser-env.ts';\nimport {getDocumentVisibilityWatcher} from '../../../shared/src/document-visible.ts';\nimport {getErrorCauses, getErrorMessage} from '../../../shared/src/error.ts';\nimport {h64} from '../../../shared/src/hash.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport {must} from '../../../shared/src/must.ts';\nimport {navigator} from '../../../shared/src/navigator.ts';\nimport {promiseRace} from '../../../shared/src/promise-race.ts';\nimport {emptyFunction} from '../../../shared/src/sentinels.ts';\nimport {sleep, sleepWithAbort} from '../../../shared/src/sleep.ts';\nimport {Subscribable} from '../../../shared/src/subscribable.ts';\nimport {assertTesting, TESTING} from '../../../shared/src/testing.ts';\nimport * as valita from '../../../shared/src/valita.ts';\nimport type {Writable} from '../../../shared/src/writable.ts';\nimport {type ClientSchema} from '../../../zero-protocol/src/client-schema.ts';\nimport type {ConnectedMessage} from '../../../zero-protocol/src/connect.ts';\nimport {\n encodeSecProtocols,\n setFeatureFlags,\n} from '../../../zero-protocol/src/connect.ts';\nimport type {DeleteClientsBody} from '../../../zero-protocol/src/delete-clients.ts';\nimport type {Downstream} from '../../../zero-protocol/src/down.ts';\nimport {downstreamSchema} from '../../../zero-protocol/src/down.ts';\nimport {ErrorKind} from '../../../zero-protocol/src/error-kind.ts';\nimport {\n type ErrorMessage,\n ProtocolError,\n} from '../../../zero-protocol/src/error.ts';\nimport type {MutationID} from '../../../zero-protocol/src/mutation-id.ts';\nimport * as MutationType from '../../../zero-protocol/src/mutation-type-enum.ts';\nimport {\n type CRUDMutation,\n type CRUDMutationArg,\n CRUD_MUTATION_NAME,\n type CustomMutation,\n mapCRUD,\n} from '../../../zero-protocol/src/mutation.ts';\nimport type {PingMessage} from '../../../zero-protocol/src/ping.ts';\nimport {\n POKE_CHUNK_MESSAGE_TYPE,\n type PokeEndMessage,\n type PokePartMessage,\n type PokeStartMessage,\n} from '../../../zero-protocol/src/poke.ts';\nimport {CLIENT_PROTOCOL_VERSION} from '../../../zero-protocol/src/protocol-version.ts';\nimport type {\n PullRequestMessage,\n PullResponseBody,\n PullResponseMessage,\n} from '../../../zero-protocol/src/pull.ts';\nimport type {PushMessage} from '../../../zero-protocol/src/push.ts';\nimport type {UpQueriesPatchOp} from '../../../zero-protocol/src/queries-patch.ts';\nimport type {Upstream} from '../../../zero-protocol/src/up.ts';\nimport type {NullableVersion} from '../../../zero-protocol/src/version.ts';\nimport {nullableVersionSchema} from '../../../zero-protocol/src/version.ts';\nimport {clientSchemaFrom} from '../../../zero-schema/src/builder/schema-builder.ts';\nimport {\n type NameMapper,\n clientToServer,\n} from '../../../zero-schema/src/name-mapper.ts';\nimport type {\n BaseDefaultContext,\n BaseDefaultSchema,\n DefaultContext,\n DefaultSchema,\n} from '../../../zero-types/src/default-types.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport type {ViewFactory} from '../../../zql/src/ivm/view.ts';\nimport {\n isMutatorRegistry,\n iterateMutators,\n} from '../../../zql/src/mutate/mutator-registry.ts';\nimport type {\n AnyMutator,\n MutateRequest,\n} from '../../../zql/src/mutate/mutator.ts';\nimport {createRunnableBuilder} from '../../../zql/src/query/create-builder.ts';\nimport {\n type ClientMetricMap,\n type MetricMap,\n isClientMetric,\n} from '../../../zql/src/query/metrics-delegate.ts';\nimport type {QueryDelegate} from '../../../zql/src/query/query-delegate.ts';\nimport {\n type QueryOrQueryRequest,\n addContextToQuery,\n} from '../../../zql/src/query/query-registry.ts';\nimport {\n type HumanReadable,\n type MaterializeOptions,\n type PreloadOptions,\n type RunOptions,\n} from '../../../zql/src/query/query.ts';\nimport type {ConditionalSchemaQuery} from '../../../zql/src/query/schema-query.ts';\nimport type {TypedView} from '../../../zql/src/query/typed-view.ts';\nimport {nanoid} from '../util/nanoid.ts';\n\nimport {ActiveClientsManager} from './active-clients-manager.ts';\nimport {ClientErrorKind} from './client-error-kind.ts';\nimport {\n ConnectionManager,\n type ConnectionManagerState,\n throwIfConnectionError,\n} from './connection-manager.ts';\nimport {ConnectionStatus} from './connection-status.ts';\nimport {type Connection, ConnectionImpl} from './connection.ts';\nimport {ZeroContext} from './context.ts';\nimport {\n type BatchMutator,\n type WithCRUD,\n addTableCRUDProperties,\n makeCRUDMutateBatch,\n} from './crud.ts';\nimport type {CustomMutatorDefs, MutatorResult} from './custom.ts';\nimport {DeleteClientsManager} from './delete-clients-manager.ts';\nimport {shouldEnableAnalytics} from './enable-analytics.ts';\nimport {\n ClientError,\n NO_STATUS_TRANSITION,\n type ZeroError,\n getBackoffParams,\n getErrorConnectionTransition,\n isAuthError,\n isClientError,\n isServerError,\n isZeroError,\n} from './error.ts';\nimport {\n type HTTPString,\n type WSString,\n appendPath,\n toWSString,\n} from './http-string.ts';\nimport {Inspector} from './inspector/inspector.ts';\nimport {IVMSourceBranch} from './ivm-branch.ts';\nimport {type LogOptions, createLogOptions} from './log-options.ts';\nimport type {MakeMutatePropertyType} from './make-mutate-property.ts';\nimport {addCustomMutatorsProperties} from './make-mutate-property.ts';\nimport {makeReplicacheMutators} from './make-replicache-mutators.ts';\nimport {\n DID_NOT_CONNECT_VALUE,\n MetricManager,\n REPORT_INTERVAL_MS,\n type Series,\n getLastConnectErrorValue,\n shouldReportConnectError,\n} from './metrics.ts';\nimport {MutationTracker} from './mutation-tracker.ts';\nimport {MutatorProxy} from './mutator-proxy.ts';\nimport type {UpdateNeededReason, ZeroOptions} from './options.ts';\nimport {QueryManager} from './query-manager.ts';\nimport {\n reloadScheduled,\n reloadWithReason,\n reportReloadReason,\n resetBackoff,\n} from './reload-error-handler.ts';\nimport {getServer} from './server-option.ts';\nimport {version} from './version.ts';\nimport {PokeHandler} from './zero-poke-handler.ts';\nimport {\n ZeroRep,\n fromReplicacheAuthToken,\n toReplicacheAuthToken,\n} from './zero-rep.ts';\n\nexport type NoRelations = Record<string, never>;\n\nexport type TestingContext = {\n puller: Puller;\n pusher: Pusher;\n setReload: (r: () => void) => void;\n logOptions: LogOptions;\n connectStart: () => number | undefined;\n socketResolver: () => Resolver<WebSocket>;\n connectionManager: () => ConnectionManager;\n queryDelegate: () => QueryDelegate;\n queryManager: () => QueryManager;\n enableRefresh: () => boolean;\n};\n\nexport const exposedToTestingSymbol = Symbol();\nexport const createLogOptionsSymbol = Symbol();\n\ninterface TestZero {\n [exposedToTestingSymbol]?: TestingContext;\n [createLogOptionsSymbol]?: (options: {\n consoleLogLevel: LogLevel;\n server: string | null;\n }) => LogOptions;\n}\n\ntype ConnectAttemptControl = {\n readonly controller: AbortController;\n readonly connected: Resolver<void>;\n readonly events: [date: Date, event: string][];\n\n /**\n * Cancels whichever phase deadline is currently running. Swapped when the\n * attempt stops setting up locally and starts waiting for the server.\n */\n clearTimeout?: (() => void) | undefined;\n\n /**\n * The error this attempt was aborted with. Read this instead of\n * `controller.signal.reason`: on runtimes whose `AbortController` predates\n * the 2021 `signal.reason` spec addition (e.g. React Native's bundled\n * `abort-controller@3` polyfill), `abort(reason)` silently discards the\n * reason and `signal.reason` reads `undefined` — the run loop then wraps\n * that `undefined` as a non-retryable internal error, so every retryable\n * connect failure (e.g. `ConnectTimeout`) permanently pauses the run loop\n * instead of retrying.\n */\n abortReason?: ZeroError | undefined;\n};\n\nfunction connectionReadyResolver(): Resolver<void> {\n const ready = resolver<void>();\n // A connection attempt can fail without any push, pull, or inspector\n // currently waiting on it. The run loop handles the corresponding attempt\n // failure; this handler prevents the optional readiness listener from\n // becoming an unhandled rejection.\n void ready.promise.catch(() => {});\n return ready;\n}\n\nfunction asTestZero<\n S extends BaseDefaultSchema,\n MD extends CustomMutatorDefs | undefined,\n C extends BaseDefaultContext,\n>(z: Zero<S, MD, C>): TestZero {\n return z as TestZero;\n}\n\nexport const RUN_LOOP_INTERVAL_MS = 5_000;\n\n/**\n * Default timeout for ping operations. Controls both:\n * - How long to wait in idle before sending a ping\n * - How long to wait for a pong response\n */\nexport const DEFAULT_PING_TIMEOUT_MS = 5_000;\n\n/**\n * The amount of time we wait for a pull response before we consider a pull\n * request timed out.\n */\nexport const PULL_TIMEOUT_MS = 5_000;\n\nexport const DEFAULT_DISCONNECT_HIDDEN_DELAY_MS = 5 * 60 * 1000;\n\n/**\n * The amount of time we allow for continuous connecting attempts before\n * transitioning to disconnected state.\n */\nexport const DEFAULT_DISCONNECT_TIMEOUT_MS = 60 * 1_000;\n\n/**\n * The amount of time we wait for a connection to be established before we\n * consider it timed out.\n */\nexport const CONNECT_TIMEOUT_MS = 10_000;\n\n/**\n * Setting up active-client tracking blocks the first connect attempt. Above\n * this, say so.\n */\nconst SLOW_ACTIVE_CLIENTS_THRESHOLD_MS = 50;\n\nconst CHECK_CONNECTIVITY_ON_ERROR_FREQUENCY = 6;\n\nconst DEFAULT_QUERY_CHANGE_THROTTLE_MS = 10;\n\nexport const LOGGED_OUT_STORAGE_USER_ID = '__anonymous__';\n\nfunction convertOnUpdateNeededReason(\n reason: ReplicacheUpdateNeededReason,\n): UpdateNeededReason {\n return {type: reason.type};\n}\n\nfunction updateNeededReloadReasonMessage(reason: UpdateNeededReason) {\n const {type} = reason;\n let reasonMsg = '';\n switch (type) {\n case 'NewClientGroup':\n reasonMsg =\n \"This client could not sync with a newer client. This is probably due to another tab loading a newer incompatible version of the app's code.\";\n break;\n case 'VersionNotSupported':\n reasonMsg =\n \"The server no longer supports this client's protocol version.\";\n break;\n case 'SchemaVersionNotSupported':\n reasonMsg = 'Client and server schemas incompatible.';\n break;\n default:\n unreachable(type);\n }\n if (reason.message) {\n reasonMsg += ' ' + reason.message;\n }\n return reasonMsg;\n}\n\nconst serverAheadReloadReason = `Server reported that client is ahead of server. This probably happened because the server is in development mode and restarted. Currently when this happens, the dev server loses its state and on reconnect sees the client as ahead. If you see this in other cases, it may be a bug in Zero.`;\n\nfunction onClientStateNotFoundServerReason(serverErrMsg: string) {\n return `Server could not find state needed to synchronize this client. ${serverErrMsg}`;\n}\nconst ON_CLIENT_STATE_NOT_FOUND_REASON_CLIENT =\n 'The local persistent state needed to synchronize this client has been garbage collected or was found to be corrupt.';\n\n// Keep in sync with packages/replicache/src/replicache-options.ts\nexport interface ReplicacheInternalAPI {\n lastMutationID(): number;\n}\n\nconst internalReplicacheImplMap = new WeakMap<object, ReplicacheImpl>();\n\nexport function getInternalReplicacheImplForTesting(\n z: object,\n): ReplicacheImpl<MutatorDefs> {\n assertTesting();\n return must(internalReplicacheImplMap.get(z));\n}\n\nconst CLOSE_CODE_NORMAL = 1000;\nconst CLOSE_CODE_GOING_AWAY = 1001;\ntype CloseCode = typeof CLOSE_CODE_NORMAL | typeof CLOSE_CODE_GOING_AWAY;\n\nexport type ZeroMutate<\n S extends Schema,\n MD extends CustomMutatorDefs | undefined,\n C,\n> = MakeMutatePropertyType<S, MD, C> &\n // Also callable with MutateRequest: zero.mutate(mr)\n // oxlint-disable-next-line no-explicit-any\n ((mr: MutateRequest<any, S, C, any>) => MutatorResult);\n\nexport class Zero<\n const S extends BaseDefaultSchema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n C extends BaseDefaultContext = DefaultContext,\n> {\n readonly version = version;\n\n readonly #rep: ReplicacheImpl<WithCRUD<MutatorDefs>>;\n readonly #server: HTTPString | null;\n readonly userID: string | undefined;\n readonly storageKey: string;\n\n readonly #lc: LogContext;\n readonly #logOptions: LogOptions;\n readonly #enableAnalytics: boolean;\n readonly #clientSchema: ClientSchema;\n\n readonly #pokeHandler: PokeHandler;\n readonly #queryManager: QueryManager;\n readonly #ivmMain: IVMSourceBranch;\n readonly #clientToServer: NameMapper;\n readonly #deleteClientsManager: DeleteClientsManager;\n readonly #mutationTracker: MutationTracker;\n\n /**\n * The queries we sent when inside the sec-protocol header when establishing a connection.\n * More queries could be registered while we're waiting for the 'connected' message\n * to come back from the server. To understand what queries we need to send\n * to the server, we diff the `initConnectionQueries` with the current set of desired queries.\n *\n * If this is set to `undefined` that means no queries were sent inside the `sec-protocol` header\n * and an `initConnection` message must be sent to the server after receiving the `connected` message.\n */\n #initConnectionQueries: Map<string, UpQueriesPatchOp> | undefined;\n\n /**\n * We try to send the deleted clients and (client groups) as part of the\n * sec-protocol header. If we can't because the header would get too large we\n * keep track of the deleted clients and send them after the connection is\n * established.\n */\n #deletedClients: DeleteClientsBody | undefined;\n\n /**\n * The highest mutation ID we have sent on the current connection, for each\n * client in our client group.\n *\n * The mutations we push are the client group's local commit chain, so they\n * include mutations made by every tab in the group, not just this one. The\n * order of that chain changes from one push to the next: when we persist our\n * own mutations they move to the end of the chain, behind whatever the other\n * tabs persisted in the meantime. So a mutation from another tab can end up\n * in front of one we already sent, which means we cannot decide what to send\n * next by remembering a single position in the chain. Remembering the last ID\n * we sent for each client works no matter how the chain is ordered: we never\n * skip a mutation, and we never leave a hole in a client's run of mutation\n * IDs (the server rejects a hole as an invalid push).\n *\n * Cleared whenever the connection is established or torn down. The server\n * does remember what it has processed, in a last mutation ID per client, and\n * it ignores anything it has already applied. But we don't know which of our\n * sends actually made it across before the socket died, so we start over and\n * let the server drop the duplicates. The only mutations we don't resend are\n * the ones the server has acknowledged in a poke, because those have already\n * been rebased out of the commit chain.\n */\n readonly #lastMutationIDsSent: Map<ClientID, number> = new Map();\n\n #onPong: () => void = () => undefined;\n\n readonly #onlineManager: OnlineManager;\n\n readonly #onUpdateNeeded: (reason: UpdateNeededReason) => void;\n readonly #onClientStateNotFound: (kind: ErrorKind, message: string) => void;\n // Last cookie used to initiate a connection\n #connectCookie: NullableVersion = null;\n // Total number of sockets successfully connected by this client\n #connectedCount = 0;\n // Number of messages received over currently connected socket. Reset\n // on disconnect.\n #messageCount = 0;\n #connectedAt = 0;\n // Reset on successful connection.\n #connectErrorCount = 0;\n\n #abortPingTimeout = () => {\n // intentionally empty\n };\n\n #forceEnableRefresh = false;\n\n // Ring buffer of up to 5 recent outbound messages (excluding pings).\n // Tracks type, serialized size, and a 200-character snippet for diagnostics\n // when a 1009 (Message Too Big) close occurs.\n #recentSentMessages: {type: string; size: number; snippet: string}[] = [];\n\n /**\n * The timeout in milliseconds for ping operations. Controls both:\n * - How long to wait in idle before sending a ping\n * - How long to wait for a pong response\n *\n * Total time to detect a dead connection is 2 × pingTimeoutMs.\n *\n * The new value will take effect on the next ping cycle.\n */\n pingTimeoutMs: number;\n\n readonly #zeroContext: ZeroContext;\n\n #pendingPullsByRequestID: Map<string, Resolver<PullResponseBody>> = new Map();\n #lastMutationIDReceived = 0;\n\n #socket: WebSocket | undefined = undefined;\n #socketResolver = resolver<WebSocket>();\n\n // Resolves when the run loop establishes a usable connection. The run loop\n // replaces it if the attempt fails or the established connection disconnects.\n #connectionReadyResolver = connectionReadyResolver();\n\n // Installed and removed by the run loop so socket events and disconnects can\n // deliver inputs to the active attempt without settling its returned promise.\n #currentConnectAttempt: ConnectAttemptControl | undefined;\n\n #closeAbortController = new AbortController();\n\n readonly #visibilityWatcher;\n\n readonly #connectionManager: ConnectionManager;\n readonly #connection: Connection;\n readonly #activeClientsManager: Promise<ActiveClientsManager>;\n #inspector: Inspector | undefined;\n\n #connectStart: number | undefined = undefined;\n // Set on connect attempt if currently undefined.\n // Reset to undefined when\n // 1. client stops trying to connect because it is hidden\n // 2. client encounters a connect error and canary request indicates\n // the client is offline\n // 2. client successfully connects\n #totalToConnectStart: number | undefined = undefined;\n\n readonly #options: ZeroOptions<S, MD, C>;\n readonly #kvStore: ZeroOptions<S, MD, C>['kvStore'];\n\n /**\n * Query builders for each table in the schema.\n *\n * @deprecated Use {@linkcode createBuilder} to create query builders instead.\n */\n readonly query: ConditionalSchemaQuery<S>;\n\n // TODO: Metrics needs to be rethought entirely as we're not going to\n // send metrics to customer server.\n #metrics: MetricManager;\n\n // Store as field to allow test subclass to override. Web API doesn't allow\n // overwriting location fields for security reasons.\n #reload = () => getBrowserGlobal('location')?.reload();\n\n /**\n * Constructs a new Zero client.\n */\n\n constructor(options: ZeroOptions<S, MD, C>) {\n const {\n userID,\n storageKey,\n onOnlineChange,\n onUpdateNeeded,\n onClientStateNotFound,\n onStorageFailure,\n hiddenTabDisconnectDelay = DEFAULT_DISCONNECT_HIDDEN_DELAY_MS,\n pingTimeoutMs = DEFAULT_PING_TIMEOUT_MS,\n disconnectTimeoutMs = DEFAULT_DISCONNECT_TIMEOUT_MS,\n schema,\n batchViewUpdates = applyViewUpdates => applyViewUpdates(),\n maxRecentQueries = 0,\n slowMaterializeThreshold = 5_000,\n } = options;\n\n if (userID === '') {\n throw new ClientError({\n kind: ClientErrorKind.Internal,\n message:\n 'ZeroOptions.userID should not be empty. Omit it entirely for logged-out clients.',\n });\n }\n\n this.#checkAuthValid(userID ?? undefined, options.auth);\n\n const cacheURL = options.cacheURL ?? options.server;\n const server = getServer(cacheURL);\n this.#enableAnalytics = shouldEnableAnalytics(\n server,\n false /*options.enableAnalytics,*/, // Reenable analytics\n );\n\n let {kvStore = 'idb'} = options;\n if (kvStore === 'idb') {\n if (!getBrowserGlobal('indexedDB')) {\n // oxlint-disable-next-line no-console\n console.warn(\n 'IndexedDB is not supported in this environment. Falling back to memory storage.',\n );\n kvStore = 'mem';\n }\n }\n\n if (hiddenTabDisconnectDelay < 0) {\n throw new ClientError({\n kind: ClientErrorKind.Internal,\n message: 'ZeroOptions.hiddenTabDisconnectDelay must not be negative.',\n });\n }\n\n this.#kvStore = kvStore;\n\n this.pingTimeoutMs = pingTimeoutMs;\n\n this.#onlineManager = new OnlineManager();\n\n if (onOnlineChange) {\n this.#onlineManager.subscribe(onOnlineChange);\n }\n\n this.#options = options;\n\n this.#logOptions = this.#createLogOptions({\n consoleLogLevel: options.logLevel ?? 'warn',\n server: null, //server, // Reenable remote logging\n enableAnalytics: this.#enableAnalytics,\n consoleLogSink: options.logSink,\n });\n const logOptions = this.#logOptions;\n\n this.#connectionManager = new ConnectionManager({\n disconnectTimeout: disconnectTimeoutMs,\n });\n\n const syncConnectionState = (state: ConnectionManagerState) => {\n this.#onlineManager.setOnline(state.name === ConnectionStatus.Connected);\n\n if (state.name === ConnectionStatus.Closed) {\n this.#queryManager.handleClosed(state.reason);\n }\n };\n syncConnectionState(this.#connectionManager.state);\n this.#connectionManager.subscribe(syncConnectionState);\n\n const sink = logOptions.logSink;\n const lc = new LogContext(logOptions.logLevel, {}, sink);\n\n this.#mutationTracker = new MutationTracker(\n lc,\n (upTo: MutationID) =>\n this.#sendIfConnected(['ackMutationResponses', upTo]),\n error => this.#disconnect(lc, error),\n );\n\n this.#ivmMain = new IVMSourceBranch(schema.tables);\n\n const {enableLegacyQueries = false} = schema;\n\n const replicacheMutators = makeReplicacheMutators<S, C>(\n schema,\n options.mutators,\n this.context,\n lc,\n );\n\n this.storageKey = storageKey ?? '';\n\n const {clientSchema, hash} = clientSchemaFrom(schema);\n this.#clientSchema = clientSchema;\n\n // Create a hash that includes storage key, URL configuration, and query parameters\n const nameKey = JSON.stringify({\n storageKey: this.storageKey,\n mutateUrl: options.mutateURL ?? '',\n queryUrl: options.queryURL ?? options.getQueriesURL ?? '',\n });\n const hashedKey = h64(nameKey).toString(36);\n // Logged-out clients still need a stable local storage namespace.\n // This sentinel is only for IDB naming; logged-out connections omit userID on the wire.\n const storageScopedUserID = userID ?? LOGGED_OUT_STORAGE_USER_ID;\n\n const replicacheOptions: ReplicacheOptions<WithCRUD<MutatorDefs>> = {\n // The schema stored in IDB is dependent upon both the ClientSchema\n // and the AST schema (i.e. CLIENT_PROTOCOL_VERSION). Changing either\n // opens a fresh local database.\n schemaVersion: `${CLIENT_PROTOCOL_VERSION}.${hash}`,\n logLevel: logOptions.logLevel,\n logSinks: [logOptions.logSink],\n mutators: replicacheMutators,\n name: `zero-${storageScopedUserID}-${hashedKey}`,\n pusher: (req, reqID) => this.#pusher(req, reqID),\n puller: (req, reqID) => this.#puller(req, reqID),\n pushDelay: 0,\n requestOptions: {\n maxDelayMs: 0,\n minDelayMs: 0,\n },\n licenseKey: 'zero-client-static-key',\n kvStore,\n };\n\n this.#visibilityWatcher = getDocumentVisibilityWatcher(\n getBrowserGlobal('document'),\n hiddenTabDisconnectDelay,\n this.#closeAbortController.signal,\n );\n\n this.#zeroContext = new ZeroContext(\n lc,\n this.#ivmMain,\n (ast, ttl, gotCallback) => {\n if (enableLegacyQueries) {\n return this.#queryManager.addLegacy(ast, ttl, gotCallback);\n }\n // legacy queries are client side only. Do not track with the server\n return emptyFunction;\n },\n (ast, customQueryID, ttl, gotCallback) =>\n this.#queryManager.addCustom(ast, customQueryID, ttl, gotCallback),\n (ast, ttl) => {\n if (enableLegacyQueries) {\n this.#queryManager.updateLegacy(ast, ttl);\n }\n },\n (customQueryID, ttl) =>\n this.#queryManager.updateCustom(customQueryID, ttl),\n () => this.#queryManager.flushBatch(),\n batchViewUpdates,\n this.#addMetric,\n assertValidRunOptions,\n this.#visibilityWatcher,\n );\n\n this.query = createRunnableBuilder(this.#zeroContext, schema);\n\n const replicacheImplOptions: ReplicacheImplOptions = {\n enableClientGroupForking: false,\n enableMutationRecovery: false,\n enablePullAndPushInOpen: false, // Zero calls push in its connection management code\n enableRefresh: () => this.#enableRefresh(),\n onClientsDeleted: deletedClients =>\n this.#deleteClientsManager.onClientsDeleted(deletedClients),\n zero: new ZeroRep(\n this.#zeroContext,\n this.#ivmMain,\n options.mutators !== undefined,\n this.#mutationTracker,\n ),\n };\n\n const rep = new ReplicacheImpl(replicacheOptions, replicacheImplOptions);\n this.#rep = rep;\n\n if (TESTING) {\n internalReplicacheImplMap.set(this, rep);\n }\n this.#server = server;\n this.userID = userID ?? undefined;\n this.#lc = lc.withContext('clientID', rep.clientID);\n\n if (userID === 'anon' && !options.auth) {\n this.#lc.warn?.(\n 'ZeroOptions.userID \"anon\" is deprecated for logged-out clients. Omit it entirely for logged-out clients.',\n );\n }\n\n this.#connection = new ConnectionImpl(\n this.#connectionManager,\n this.#lc,\n auth => this.#setAuth(auth),\n );\n this.#mutationTracker.setClientIDAndWatch(\n rep.clientID,\n rep.experimentalWatch.bind(rep),\n );\n\n this.#activeClientsManager = makeActiveClientsManager(\n rep.clientGroupID,\n this.clientID,\n this.#closeAbortController.signal,\n (clientID: ClientID, clientGroupID: ClientGroupID) =>\n this.#deleteClientsManager.onClientsDeleted([\n {clientGroupID, clientID},\n ]),\n this.#lc,\n );\n\n const onUpdateNeededCallback = (reason: UpdateNeededReason) => {\n if (onUpdateNeeded) {\n onUpdateNeeded(reason);\n } else {\n reloadWithReason(\n this.#lc,\n this.#reload,\n reason.type,\n updateNeededReloadReasonMessage(reason),\n );\n }\n };\n this.#onUpdateNeeded = onUpdateNeededCallback;\n this.#rep.onUpdateNeeded = reason => {\n onUpdateNeededCallback(convertOnUpdateNeededReason(reason));\n };\n\n this.#onClientStateNotFound = (kind: ErrorKind, message: string) => {\n if (onClientStateNotFound) {\n onClientStateNotFound();\n } else {\n reloadWithReason(this.#lc, this.#reload, kind, message);\n }\n };\n this.#rep.onClientStateNotFound = () => {\n this.#onClientStateNotFound(\n ErrorKind.ClientNotFound,\n ON_CLIENT_STATE_NOT_FOUND_REASON_CLIENT,\n );\n };\n this.#rep.onStorageFailure = onStorageFailure ?? null;\n\n const mutatorProxy = new MutatorProxy(\n this.#lc,\n this.#connectionManager,\n this.#mutationTracker,\n );\n\n // Create a callable function that handles zero.mutate(mr) calls.\n // The CRUD table properties (e.g. zero.mutate.issues.insert(args)) are added by makeCRUDMutate.\n const {mutators} = options;\n\n // If mutators is a MutatorRegistry, we store the mutator in a Map so we can quickly check if it was registered.\n const registeredMutators: Set<AnyMutator> = new Set(\n isMutatorRegistry(mutators) ? iterateMutators(mutators) : undefined,\n );\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const callableMutate = (mr: MutateRequest<any, S, C, any>) => {\n if (!registeredMutators.has(mr.mutator)) {\n throw new Error(\n `Mutator \"${mr.mutator.mutatorName}\" is not registered. ` +\n `Mutators must be registered with the Zero constructor before use.`,\n );\n }\n const repMutator = rep.mutate[mr.mutator.mutatorName] as unknown as (\n args?: unknown,\n ) => MutatorResult;\n return mutatorProxy.wrapCustomMutator(\n mr.mutator.mutatorName,\n repMutator,\n )(mr.args);\n };\n\n const mutateBatch = makeCRUDMutateBatch<S>(schema, rep.mutate);\n\n if (schema.enableLegacyMutators) {\n addTableCRUDProperties(schema, callableMutate, rep.mutate);\n }\n\n // This is the legacy mutators. They are added to zero.mutate.<mutatorName>.\n if (mutators && !isMutatorRegistry(mutators)) {\n addCustomMutatorsProperties(\n mutators as CustomMutatorDefs,\n mutatorProxy,\n callableMutate as unknown as Record<string, unknown>,\n rep.mutate,\n );\n }\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n this.mutate = callableMutate as any;\n this.mutateBatch = mutateBatch;\n\n this.#queryManager = new QueryManager(\n this.#lc,\n this.#mutationTracker,\n rep.clientID,\n schema.tables,\n msg => {\n let body = msg[1];\n if (this.#options.getTraceparent) {\n body = {\n ...msg[1],\n traceparent: this.#options.getTraceparent?.(),\n };\n }\n\n this.#sendIfConnected([msg[0], body]);\n },\n rep.experimentalWatch.bind(rep),\n maxRecentQueries,\n options.queryChangeThrottleMs ?? DEFAULT_QUERY_CHANGE_THROTTLE_MS,\n slowMaterializeThreshold,\n error => {\n this.#disconnect(lc, error);\n },\n );\n\n this.#clientToServer = clientToServer(schema.tables);\n\n this.#deleteClientsManager = new DeleteClientsManager(\n msg => this.#sendIfConnected(msg),\n rep.perdag,\n this.#lc,\n this.#rep.clientGroupID,\n rep.clientID,\n );\n\n reportReloadReason(this.#lc);\n\n this.#metrics = new MetricManager({\n reportIntervalMs: REPORT_INTERVAL_MS,\n host: getBrowserGlobal('location')?.host ?? '',\n source: 'client',\n reporter: this.#enableAnalytics\n ? allSeries => this.#reportMetrics(allSeries)\n : () => Promise.resolve(),\n lc: this.#lc,\n });\n this.#metrics.tags.push(`version:${this.version}`);\n\n this.#pokeHandler = new PokeHandler(\n async poke => {\n const socket = this.#socket;\n await this.#rep.poke(poke);\n // poke() fires the got-queries watch synchronously, so `#gotQueries` is\n // up to date and safe to trust now that the server has caught us up.\n // Unless the connection went away while the poke was applied: the\n // disconnect already re-gated trust, and the next connection's first\n // poke must be the one to restore it.\n if (socket !== undefined && this.#socket === socket) {\n this.#queryManager.markGotQueriesAuthoritative();\n }\n },\n e => this.#onPokeError(e),\n rep.clientID,\n schema,\n this.#lc,\n this.#mutationTracker,\n );\n\n void this.#runLoop();\n\n this.#expose();\n\n if (TESTING) {\n asTestZero(this)[exposedToTestingSymbol] = {\n puller: this.#puller,\n pusher: this.#pusher,\n setReload: (r: () => void) => {\n this.#reload = r;\n },\n logOptions: this.#logOptions,\n connectStart: () => this.#connectStart,\n socketResolver: () => this.#socketResolver,\n connectionManager: () => this.#connectionManager,\n queryDelegate: () => this.#zeroContext,\n queryManager: () => this.#queryManager,\n enableRefresh: () => this.#enableRefresh(),\n };\n }\n }\n\n #enableRefresh(): boolean {\n // Don't refresh if connected, connecting, or about to connect, unless\n // #forceEnableRefresh to avoid receiving new snapshots from refresh before\n // receiving the new snapshot via poke from the connection (which results\n // in a \"unexpected base cookie for poke\" error).\n return (\n this.#forceEnableRefresh ||\n (!this.#connectionManager.is(ConnectionStatus.Connected) &&\n !this.#connectionManager.is(ConnectionStatus.Connecting) &&\n !this.#connectionManager.is(ConnectionStatus.Initializing))\n );\n }\n\n #expose() {\n // Expose the Zero instance to the global scope.\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const g = globalThis as any;\n if (g.__zero === undefined) {\n g.__zero = this;\n } else if (g.__zero instanceof Zero) {\n const prev = g.__zero;\n g.__zero = {\n [prev.clientID]: prev,\n [this.clientID]: this,\n };\n } else {\n g.__zero[this.clientID] = this;\n }\n }\n\n #unexpose() {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const g = globalThis as any;\n assert(g.__zero !== undefined, 'No global zero instance found');\n if (g.__zero instanceof Zero) {\n assert(\n g.__zero === this,\n 'Global zero instance does not match this instance',\n );\n delete g.__zero;\n } else {\n delete g.__zero[this.clientID];\n if (Object.entries(g.__zero).length === 1) {\n g.__zero = Object.values(g.__zero)[0];\n }\n }\n }\n\n #sendIfConnected(msg: Upstream): void {\n if (this.#connectionManager.is(ConnectionStatus.Connected)) {\n this.#send(msg);\n }\n }\n\n #send(msg: Upstream): void {\n if (this.#socket) {\n const json = JSON.stringify(msg);\n if (msg[0] !== 'ping') {\n const history = this.#recentSentMessages;\n if (history.length >= 5) {\n history.shift();\n }\n history.push({\n type: msg[0],\n size: json.length,\n snippet: json.slice(0, 200),\n });\n }\n this.#socket.send(json);\n }\n }\n\n #createLogOptions(options: {\n consoleLogLevel: LogLevel;\n server: HTTPString | null;\n enableAnalytics: boolean;\n consoleLogSink?: LogSink | undefined;\n }): LogOptions {\n if (TESTING) {\n const testZero = asTestZero(this);\n if (testZero[createLogOptionsSymbol]) {\n return testZero[createLogOptionsSymbol](options);\n }\n }\n return createLogOptions(options);\n }\n\n /**\n * Preloads data for a query into the cache, without keeping it in memory.\n *\n * This function is useful when you want to populate the cache ahead of time,\n * for example after login, to avoid a flash of loading screen on the next page.\n *\n * Returns an object with three properties:\n * - `complete`: a Promise that resolves when the server has confirmed the\n * data on this connection\n * - `cached`: a Promise that resolves as soon as the store holds a\n * server-confirmed result, from this connection or a previous one\n * - `cleanup`: a function that can be called to cancel the preload\n *\n * @example\n * ```ts\n * const {complete, cleanup} = zero.preload(userQuery);\n * await complete;\n * // Now the data is cached and can be used immediately\n * ```\n */\n preload<\n TTable extends keyof S['tables'] & string,\n TInput extends ReadonlyJSONValue | undefined,\n TOutput extends ReadonlyJSONValue | undefined,\n TReturn,\n >(\n query: QueryOrQueryRequest<TTable, TInput, TOutput, S, TReturn, C>,\n options?: PreloadOptions,\n ) {\n return this.#zeroContext.preload(\n addContextToQuery(query, this.context),\n options,\n );\n }\n\n /**\n * Executes a query once and returns the results.\n *\n * By default, runs immediately with whatever data is available locally.\n * Use `{type: 'complete'}` to wait for fresh results from the server, or\n * `{type: 'cached'}` to accept a result the server confirmed on a previous\n * connection when the store holds one.\n *\n * @param query - The query to execute\n * @param runOptions - Options controlling query execution\n * @returns A Promise resolving to the query results\n *\n * @example\n * ```ts\n * // Run with local data only\n * const users = await zero.run(userQuery);\n *\n * // Wait for server sync\n * const freshUsers = await zero.run(userQuery, {type: 'complete'});\n * ```\n */\n run<\n TTable extends keyof S['tables'] & string,\n TInput extends ReadonlyJSONValue | undefined,\n TOutput extends ReadonlyJSONValue | undefined,\n TReturn,\n >(\n query: QueryOrQueryRequest<TTable, TInput, TOutput, S, TReturn, C>,\n runOptions?: RunOptions,\n ): Promise<HumanReadable<TReturn>> {\n return this.#zeroContext.run(\n addContextToQuery(query, this.context),\n runOptions,\n );\n }\n\n get context(): C {\n return this.#options.context as C;\n }\n\n /**\n * Creates a materialized view of a query that stays synchronized with the database.\n *\n * The materialized view automatically updates when the underlying data changes.\n * When done with the view, call `view.destroy()` to clean up subscriptions.\n *\n * Optionally accepts a factory function to create a custom view implementation.\n *\n * @param query - The query to materialize\n * @param factory - Optional factory function to create a custom view\n * @param options - Options controlling view behavior\n * @returns A TypedView that stays synchronized with the data\n *\n * @example\n * ```ts\n * // Create a standard view\n * const view = zero.materialize(userQuery);\n * console.log(view.data); // Current query results\n * view.destroy(); // Clean up when done\n *\n * // Create a custom view\n * const customView = zero.materialize(userQuery, (query) => new MyCustomView(query));\n * ```\n */\n materialize<\n TTable extends keyof S['tables'] & string,\n TInput extends ReadonlyJSONValue | undefined,\n TOutput extends ReadonlyJSONValue | undefined,\n TReturn,\n >(\n query: QueryOrQueryRequest<TTable, TInput, TOutput, S, TReturn, C>,\n options?: MaterializeOptions,\n ): TypedView<HumanReadable<TReturn>>;\n materialize<\n T,\n TTable extends keyof S['tables'] & string,\n TInput extends ReadonlyJSONValue | undefined,\n TOutput extends ReadonlyJSONValue | undefined,\n TReturn,\n >(\n query: QueryOrQueryRequest<TTable, TInput, TOutput, S, TReturn, C>,\n factory: ViewFactory<TTable, S, TReturn, T>,\n options?: MaterializeOptions,\n ): T;\n materialize<\n T,\n TTable extends keyof S['tables'] & string,\n TInput extends ReadonlyJSONValue | undefined,\n TOutput extends ReadonlyJSONValue | undefined,\n TReturn,\n >(\n query: QueryOrQueryRequest<TTable, TInput, TOutput, S, TReturn, C>,\n factoryOrOptions?: ViewFactory<TTable, S, TReturn, T> | MaterializeOptions,\n maybeOptions?: MaterializeOptions,\n ) {\n const q = addContextToQuery(query, this.context);\n\n let factory;\n let options;\n if (typeof factoryOrOptions === 'function') {\n factory = factoryOrOptions;\n options = maybeOptions;\n } else {\n options = factoryOrOptions;\n }\n return this.#zeroContext.materialize(q, factory, options);\n }\n\n /**\n * The server URL that this Zero instance is configured with.\n */\n get server(): HTTPString | null {\n return this.#server;\n }\n\n /**\n * The name of the IndexedDB database in which the data of this\n * instance of Zero is stored.\n */\n get idbName(): string {\n return this.#rep.idbName;\n }\n\n /**\n * The KV store backing this instance of Zero. Its `kind` is the storage\n * currently in use: `'idb'`, `'mem'`, `'op-sqlite'`, `'expo-sqlite'`, or\n * whatever a custom store reports. An IndexedDB store that fails to open\n * falls back to memory, so `kind` can change from `'idb'` to `'mem'` after\n * the first read or write.\n */\n get kvStore(): KVStore {\n return this.#rep.kvStore;\n }\n\n /**\n * The schema version of the data understood by this application.\n * See [[ZeroOptions.schemaVersion]].\n */\n get schemaVersion(): string {\n return this.#rep.schemaVersion;\n }\n\n /**\n * The schema passed into Zero when it was constructed.\n *\n * This can be paired with the inspector API to explore the client cache for\n * debugging or tooling. The inspector exposes the raw key/value map as well\n * as the per-table rows that back `zero.query[tableName].run()`.\n *\n * ```ts\n * const inspector = __zero.inspector;\n * const client = inspector.client;\n *\n * console.log('client map:', await client.map());\n *\n * for (const tableName of Object.keys(__zero.schema.tables)) {\n * console.table(await client.rows(tableName));\n * }\n * ```\n */\n get schema(): S {\n return this.#options.schema;\n }\n\n /**\n * The client ID for this instance of Zero. Each instance\n * gets a unique client ID.\n */\n get clientID(): ClientID {\n return this.#rep.clientID;\n }\n\n get clientGroupID(): Promise<ClientGroupID> {\n return this.#rep.clientGroupID;\n }\n\n /**\n * Use to execute mutations. The primary flow is to call\n * `zero.mutate(mutationRequest)` with your registered custom mutators:\n *\n * ```ts\n * await zero.mutate(\n * mutators.myMutator({id: '1', title: 'First issue'}),\n * );\n * ```\n *\n * When `schema.enableLegacyMutators` is true, legacy conveniences are added:\n * - Table-scoped CRUD helpers, e.g. `zero.mutate.issue.create` / `set` / `update` / `delete`\n * - Your custom mutators exposed directly on `zero.mutate`\n *\n * ```ts\n * await zero.mutate.issue.create({id: '1', title: 'First issue', priority: 'high'});\n * await zero.mutate.comment.create({id: '1', text: 'First comment', issueID: '1'});\n * await zero.mutate.myMutator({id: '1', title: 'First issue'});\n * ```\n *\n * The `update` methods support partials. Unspecified or `undefined` fields\n * are left unchanged:\n *\n * ```ts\n * // Priority left unchanged.\n * await zero.mutate.issue.update({id: '1', title: 'Updated title'});\n * ```\n */\n readonly mutate: ZeroMutate<S, MD, C>;\n\n /**\n * Provides a way to batch multiple CRUD mutations together:\n *\n * ```ts\n * await zero.mutateBatch(m => {\n * await m.issue.create({id: '1', title: 'First issue'});\n * await m.comment.create({id: '1', text: 'First comment', issueID: '1'});\n * });\n * ```\n *\n * Batch sends all mutations in a single transaction. If one fails, all are\n * rolled back together. Batch can also be more efficient than making many\n * individual mutations.\n *\n * `mutateBatch` is not allowed inside another `mutateBatch` call. Doing so\n * will throw an error.\n *\n * @deprecated Use `zero.mutate(mutationRequest)`\n */\n readonly mutateBatch: BatchMutator<S>;\n\n /**\n * The connection API for managing Zero's connection lifecycle.\n *\n * Use this to monitor connection state and manually control connections.\n *\n * @example\n * ```ts\n * // Subscribe to connection state changes\n * z.connection.state.subscribe(state => {\n * console.log('Connection state:', state.name);\n * });\n *\n * // Manually resume connection from error state\n * await z.connection.connect();\n * ```\n */\n get connection(): Connection {\n return this.#connection;\n }\n\n /**\n * Whether this Zero instance has been closed.\n *\n * Once a Zero instance has been closed it no longer syncs, you can no\n * longer query or mutate data with it, and its query views stop updating.\n */\n get closed(): boolean {\n return this.#connectionManager.is(ConnectionStatus.Closed);\n }\n\n /**\n * Closes this Zero instance.\n *\n * Once a Zero instance has been closed it no longer syncs, you can no\n * longer query or mutate data with it, and its query views stop updating.\n */\n async close(): Promise<void> {\n const lc = this.#lc.withContext('close');\n\n try {\n if (this.closed) {\n lc.debug?.('close() called on already closed instance');\n return;\n }\n\n lc.debug?.('Closing Zero instance. Stack:', new Error().stack);\n\n this.#onlineManager.cleanup();\n\n if (!this.#connectionManager.is(ConnectionStatus.Disconnected)) {\n this.#disconnect(\n lc,\n new ClientError({\n kind: ClientErrorKind.ClientClosed,\n message: 'Zero instance closed by user',\n }),\n CLOSE_CODE_NORMAL,\n );\n }\n lc.debug?.('Aborting closeAbortController due to close()');\n this.#closeAbortController.abort();\n this.#metrics.stop();\n const ret = await this.#rep.close();\n this.#unexpose();\n return ret;\n } catch (e) {\n lc.error?.('Error closing Zero instance', e);\n throw e;\n } finally {\n this.#connectionManager.closed();\n }\n }\n\n #onMessage = (e: MessageEvent<string | ArrayBuffer>) => {\n const lc = this.#lc;\n const {data} = e;\n lc.debug?.(\n 'received message',\n data instanceof ArrayBuffer\n ? {type: 'binary', byteLength: data.byteLength}\n : data,\n );\n if (this.closed) {\n lc.debug?.('ignoring message because already closed');\n return;\n }\n\n let downMessage: Downstream;\n if (data instanceof ArrayBuffer) {\n this.#messageCount++;\n const message = new Uint8Array(data);\n if (message[0] !== POKE_CHUNK_MESSAGE_TYPE) {\n this.#disconnect(\n lc,\n new ClientError({\n kind: ClientErrorKind.InvalidMessage,\n message: `Unknown binary message type: ${String(message[0])}`,\n }),\n );\n return;\n }\n this.#handlePokeChunk(message.subarray(1));\n return;\n }\n if (typeof data !== 'string') {\n this.#disconnect(\n lc,\n new ClientError({\n kind: ClientErrorKind.InvalidMessage,\n message: 'Invalid binary message received from server',\n }),\n );\n return;\n }\n try {\n downMessage = valita.parse(\n JSON.parse(data),\n downstreamSchema,\n 'passthrough',\n );\n } catch (e) {\n const invalidMessageError = new ClientError(\n {\n kind: ClientErrorKind.InvalidMessage,\n message: `Invalid message received from server: ${getErrorMessage(e)}${data}`,\n },\n {cause: e},\n );\n this.#disconnect(lc, invalidMessageError);\n return;\n }\n this.#messageCount++;\n const msgType = downMessage[0];\n try {\n switch (msgType) {\n case 'connected':\n return this.#handleConnectedMessage(lc, downMessage);\n\n case 'error':\n return this.#handleErrorMessage(lc, downMessage);\n\n case 'pong':\n // Receiving a pong means that the connection is healthy, as the\n // initial schema / versioning negotiations would produce an error\n // before a ping-pong timeout.\n resetBackoff();\n return this.#onPong();\n\n case 'pokeStart':\n return this.#handlePokeStart(lc, downMessage);\n\n case 'pokePart':\n if (downMessage[1].rowsPatch) {\n // Receiving row data indicates that the client is in a good state\n // and can reset the reload backoff state.\n resetBackoff();\n }\n return this.#handlePokePart(lc, downMessage);\n\n case 'pokeEnd':\n return this.#handlePokeEnd(lc, downMessage);\n\n case 'pull':\n return this.#handlePullResponse(lc, downMessage);\n\n case 'deleteClients':\n return this.#deleteClientsManager.clientsDeletedOnServer(\n downMessage[1],\n );\n\n case 'pushResponse':\n return this.#mutationTracker.processPushResponse(downMessage[1]);\n\n case 'transformError':\n this.#queryManager.handleTransformErrors(downMessage[1]);\n break;\n\n case 'inspect':\n // ignore at this layer.\n break;\n\n default:\n unreachable(msgType);\n }\n } catch (e) {\n lc.error?.('Unhandled error in onOpen', e);\n this.#disconnect(\n lc,\n new ClientError(\n {\n kind: ClientErrorKind.Internal,\n message: getErrorMessage(e),\n },\n {cause: e},\n ),\n );\n return;\n }\n };\n\n #onOpen = () => {\n let lc = this.#lc;\n try {\n assert(this.#socket, 'Socket is not set before onOpen');\n\n lc = addWebSocketIDFromSocketToLogContext(this.#socket, lc);\n if (this.#connectStart === undefined) {\n throw new Error('Got open event but connect start time is undefined.');\n } else {\n const now = Date.now();\n const timeToOpenMs = now - this.#connectStart;\n lc.info?.('Got socket open event', {\n navigatorOnline: navigator?.onLine,\n timeToOpenMs,\n });\n }\n } catch (e) {\n lc.error?.('Unhandled error in onOpen', e);\n this.#disconnect(\n lc,\n new ClientError(\n {\n kind: ClientErrorKind.Internal,\n message: getErrorMessage(e),\n },\n {cause: e},\n ),\n );\n }\n };\n\n #onClose = async (e: CloseEvent) => {\n let lc = this.#lc;\n try {\n assert(this.#socket, 'Socket is not set before onClose');\n\n lc = addWebSocketIDFromSocketToLogContext(this.#socket, lc);\n const {code, reason, wasClean} = e;\n // 1006 = abnormal closure, generated by the browser when the connection\n // drops (e.g. laptop sleep, network change). expected in practice.\n // 1005 = no status code received, the same event on platforms whose\n // WebSocket reports a dropped connection without a close frame (React\n // Native does). Measured in production: one line per device, never a\n // repeat, so it is routine and not an error.\n if (code <= 1001 || code === 1005 || code === 1006) {\n lc.info?.('Got socket close event', {code, reason, wasClean});\n } else {\n lc.error?.('Got unexpected socket close event', {\n code,\n reason,\n wasClean,\n });\n }\n\n // 1009 = Message Too Big. The server rejected an oversized WebSocket\n // message, most likely a mutation containing a large value (e.g. a\n // base64-encoded image), but possibly a large changeDesiredQueries\n // payload. Because mutations are persisted in IndexedDB, the client\n // would otherwise reconnect and immediately re-send the message,\n // causing an infinite reconnect loop. Disable the client group to\n // abandon the stuck message and reload with a fresh client group.\n //\n // Using InvalidMessage as the error kind transitions the connection\n // to Error state, making it observable via connection.state.subscribe().\n // The reload is routed through onClientStateNotFound so customers can\n // override it (e.g. to show UI, defer reload, or report to Sentry).\n if (code === 1009) {\n const recentMessagesInfo =\n this.#recentSentMessages.length > 0\n ? '\\nRecent sent messages:\\n' +\n JSON.stringify(this.#recentSentMessages, null, 2)\n : '';\n const messageTooLargeError = new ClientError({\n kind: ClientErrorKind.InvalidMessage,\n message:\n 'A WebSocket message exceeded the server message size limit. ' +\n \"This is usually caused by a mutation's args containing a large \" +\n 'value such as a base64-encoded image. Consider uploading ' +\n 'large files to object storage and storing only the URL in Zero.' +\n recentMessagesInfo,\n });\n this.#disconnect(lc, messageTooLargeError);\n\n await this.#rep.disableClientGroup();\n this.#onClientStateNotFound(\n ErrorKind.InvalidMessage,\n messageTooLargeError.message,\n );\n } else {\n const closeError = new ClientError(\n wasClean\n ? {\n kind: ClientErrorKind.CleanClose,\n message: 'WebSocket connection closed cleanly',\n }\n : {\n kind: ClientErrorKind.AbruptClose,\n message: 'WebSocket connection closed abruptly',\n },\n );\n this.#disconnect(lc, closeError);\n }\n } catch (e) {\n lc.error?.('Unhandled error in onClose', e);\n const internalError = new ClientError(\n {\n kind: ClientErrorKind.Internal,\n message: getErrorMessage(e),\n },\n {cause: e},\n );\n this.#disconnect(lc, internalError);\n }\n };\n\n // An error on the connection is fatal for the connection.\n async #handleErrorMessage(\n lc: LogContext,\n downMessage: ErrorMessage,\n ): Promise<void> {\n const [, {kind, message}] = downMessage;\n\n // Rate limit errors are not fatal to the connection.\n // We really don't want to disconnect and reconnect a rate limited user as\n // it'll use more resources on the server\n if (kind === ErrorKind.MutationRateLimited) {\n this.#lastMutationIDsSent.clear();\n lc.error?.(kind, 'Mutation rate limited', {message});\n return;\n }\n\n lc.info?.(`${kind}: ${message}}`);\n const error = new ProtocolError(downMessage[1]);\n // Rehome, Rebalance and ServerOverloaded are the server sending the client\n // to reconnect elsewhere or later: getErrorConnectionTransition keeps the\n // connection status as it is and the run loop reads its backoff off the\n // body. They are routine and logged at warn.\n //\n // A missing client group is an expected outcome rather than a defect: the\n // cache no longer holds it (an instance switch, a purge for inactivity),\n // and the client recovers below through onClientStateNotFound. It is\n // reported at warn so that a fleet-wide occurrence reads as recovery\n // rather than as an error storm.\n //\n // An auth error (including a push or transform that the API server\n // answered with HTTP 401 or 403) moves the connection to needs-auth, and\n // the run loop logs that connect failure at warn. This is the same event\n // and is logged at the same level.\n //\n // Every other kind ends the connection and is logged at error.\n const level: LogLevel =\n getBackoffParams(error) !== undefined ||\n kind === ErrorKind.ClientNotFound ||\n isAuthError(error)\n ? 'warn'\n : 'error';\n lc[level]?.(`${error.kind}:\\n\\n${error.errorBody.message}`, error);\n\n this.#disconnect(lc, error);\n\n if (kind === ErrorKind.VersionNotSupported) {\n this.#onUpdateNeeded({type: kind, message});\n } else if (kind === ErrorKind.SchemaVersionNotSupported) {\n await this.#rep.disableClientGroup();\n this.#onUpdateNeeded({\n type: 'SchemaVersionNotSupported',\n message,\n });\n } else if (kind === ErrorKind.ClientNotFound) {\n await this.#rep.disableClientGroup();\n this.#onClientStateNotFound(\n kind,\n onClientStateNotFoundServerReason(message),\n );\n } else if (\n kind === ErrorKind.InvalidConnectionRequestLastMutationID ||\n kind === ErrorKind.InvalidConnectionRequestBaseCookie\n ) {\n // The database is about to be dropped from under this instance. Stop\n // its store activity first: the run loop refreshes from storage after\n // a connect error, the next scheduled persist is coming, and the\n // background processes are on their intervals — each would run into\n // the dropped store and log the drop's own footprint as an error.\n await Promise.all([this.#rep.stopPersist(), this.#rep.stopRefresh()]);\n await dropReplicacheDatabase(this.#rep.idbName, {\n kvStore: this.#kvStore,\n });\n\n this.#onClientStateNotFound(kind, serverAheadReloadReason);\n }\n }\n\n async #handleConnectedMessage(\n lc: LogContext,\n connectedMessage: ConnectedMessage,\n ): Promise<void> {\n const attempt = must(\n this.#currentConnectAttempt,\n 'Connected message received without an active connection attempt',\n );\n const now = Date.now();\n const [, connectBody] = connectedMessage;\n lc = addWebSocketIDToLogContext(connectBody.wsid, lc);\n this.#addConnectEvent(lc, attempt, 'processing the server acknowledgement');\n\n if (this.#connectedCount === 0) {\n this.#checkConnectivity('firstConnect');\n } else if (this.#connectErrorCount > 0) {\n this.#checkConnectivity('connectAfterError');\n }\n this.#connectedCount++;\n this.#connectedAt = now;\n this.#metrics.lastConnectError.clear();\n const proceedingConnectErrorCount = this.#connectErrorCount;\n this.#connectErrorCount = 0;\n\n let timeToConnectMs: number | undefined;\n let connectMsgLatencyMs: number | undefined;\n if (this.#connectStart === undefined) {\n lc.error?.('Got connected message but connect start time is undefined.');\n } else {\n timeToConnectMs = now - this.#connectStart;\n this.#metrics.timeToConnectMs.set(timeToConnectMs);\n connectMsgLatencyMs =\n connectBody.timestamp !== undefined\n ? now - connectBody.timestamp\n : undefined;\n this.#connectStart = undefined;\n }\n let totalTimeToConnectMs: number | undefined;\n if (this.#totalToConnectStart === undefined) {\n lc.error?.(\n 'Got connected message but total to connect start time is undefined.',\n );\n } else {\n totalTimeToConnectMs = now - this.#totalToConnectStart;\n this.#totalToConnectStart = undefined;\n }\n\n this.#metrics.setConnected(timeToConnectMs ?? 0, totalTimeToConnectMs ?? 0);\n\n lc.info?.('Connected', {\n navigatorOnline: navigator?.onLine,\n timeToConnectMs,\n totalTimeToConnectMs,\n connectMsgLatencyMs,\n connectedCount: this.#connectedCount,\n proceedingConnectErrorCount,\n });\n this.#lastMutationIDsSent.clear();\n\n lc.debug?.('Resolving connect resolver');\n must(this.#socket);\n const queriesPatch = await this.#rep.query(tx =>\n this.#queryManager.getQueriesPatch(tx, this.#initConnectionQueries),\n );\n\n const hasDeletedClients = () =>\n skipEmptyArray(this.#deletedClients?.clientIDs) ||\n skipEmptyArray(this.#deletedClients?.clientGroupIDs);\n\n const maybeSendDeletedClients = () => {\n if (hasDeletedClients()) {\n this.#send(['deleteClients', this.#deletedClients!]);\n this.#deletedClients = undefined;\n }\n };\n\n if (queriesPatch.size > 0 && this.#initConnectionQueries !== undefined) {\n maybeSendDeletedClients();\n this.#send([\n 'changeDesiredQueries',\n {\n desiredQueriesPatch: [...queriesPatch.values()],\n traceparent: this.#options.getTraceparent?.(),\n },\n ]);\n } else if (this.#initConnectionQueries === undefined) {\n // if #initConnectionQueries was undefined that means we never\n // sent `initConnection` to the server inside the sec-protocol header.\n const clientSchema = this.#clientSchema;\n this.#send([\n 'initConnection',\n {\n desiredQueriesPatch: [...queriesPatch.values()],\n deleted: skipEmptyDeletedClients(this.#deletedClients),\n // The clientSchema only needs to be sent for the very first request.\n // Henceforth it is stored with the CVR and verified automatically.\n ...(this.#connectCookie === null ? {clientSchema} : {}),\n userPushURL: this.#options.mutateURL,\n userPushHeaders: this.#options.mutateHeaders,\n userQueryURL: this.#options.queryURL ?? this.#options.getQueriesURL,\n userQueryHeaders: this.#options.queryHeaders,\n traceparent: this.#options.getTraceparent?.(),\n },\n ]);\n this.#deletedClients = undefined;\n }\n this.#initConnectionQueries = undefined;\n\n maybeSendDeletedClients();\n\n this.#connectionManager.connected();\n attempt.connected.resolve();\n }\n\n /**\n * Starts a new connection. This will create the WebSocket that does the HTTP\n * request to the server.\n *\n * {@link #connectAttempt} will throw an assertion error if the\n * {@link #connectionManager} status is not {@link ConnectionManagerState.Disconnected}\n * or {@link ConnectionManagerState.Connecting}.\n * Callers MUST check the connection status before calling this method and log\n * an error as needed.\n *\n * The returned promise resolves after receiving the {@link ConnectedMessage}\n * and rejects if setup, the socket, or the connection handshake fails.\n */\n async #connectAttempt(\n lc: LogContext,\n additionalConnectParams: Record<string, string> | undefined,\n attempt: ConnectAttemptControl,\n ): Promise<void> {\n if (this.closed) {\n return;\n }\n\n assert(this.#server, 'No server provided');\n const socketOrigin = toWSString(this.#server);\n\n // can be called from both disconnected and connecting states.\n // connecting() handles incrementing attempt counter if already connecting.\n assert(\n this.#connectionManager.is(ConnectionStatus.Disconnected) ||\n this.#connectionManager.is(ConnectionStatus.Connecting),\n 'connectAttempt() called from invalid state: ' +\n this.#connectionManager.state.name,\n );\n\n const wsid = nanoid();\n lc = addWebSocketIDToLogContext(wsid, lc);\n lc.info?.('Connecting...', {navigatorOnline: navigator?.onLine});\n\n this.#connectionManager.connecting();\n\n // connectAttempt() called but connect start time is defined. This should not\n // happen.\n assert(this.#connectStart === undefined, 'connect start time is defined');\n\n const now = Date.now();\n this.#connectStart = now;\n if (this.#totalToConnectStart === undefined) {\n this.#totalToConnectStart = now;\n }\n\n const {signal} = attempt.controller;\n this.#addConnectEvent(lc, attempt, 'reading the cookie');\n const connectCookie = valita.parse(\n await this.#rep.cookie,\n nullableVersionSchema,\n 'passthrough',\n );\n this.#addConnectEvent(lc, attempt, 'reading the client group ID');\n const clientGroupID = await this.clientGroupID;\n this.#addConnectEvent(lc, attempt, 'initializing active clients');\n const activeClientsManager = await this.#activeClientsManager;\n\n // The run loop has already stopped waiting for this attempt if it was\n // canceled. Do not let setup that completed late create a socket.\n if (signal.aborted) {\n throw attempt.abortReason;\n }\n\n const [ws, initConnectionQueries, deletedClients] = await createSocket(\n this.#rep,\n this.#queryManager,\n this.#deleteClientsManager,\n socketOrigin,\n connectCookie,\n this.clientID,\n clientGroupID,\n this.#clientSchema,\n this.userID,\n fromReplicacheAuthToken(this.#rep.auth),\n this.#lastMutationIDReceived,\n wsid,\n this.#options.logLevel === 'debug',\n lc,\n this.#options.mutateURL,\n this.#options.mutateHeaders,\n this.#options.queryURL ?? this.#options.getQueriesURL,\n this.#options.queryHeaders,\n additionalConnectParams,\n activeClientsManager,\n this.#options.maxHeaderLength,\n event => this.#addConnectEvent(lc, attempt, event),\n );\n\n // createSocket performs asynchronous preparation before constructing the\n // WebSocket. If the attempt was canceled during that work, the late socket\n // still belongs to this attempt and must be closed.\n if (signal.aborted) {\n ws.close();\n throw attempt.abortReason;\n }\n\n if (this.closed) {\n ws.close();\n return;\n }\n\n this.#connectCookie = connectCookie;\n this.#initConnectionQueries = initConnectionQueries;\n this.#deletedClients = deletedClients;\n ws.addEventListener('message', this.#onMessage);\n ws.addEventListener('open', this.#onOpen);\n ws.addEventListener('close', this.#onClose);\n this.#socket = ws;\n this.#socketResolver.resolve(ws);\n\n this.#addConnectEvent(\n lc,\n attempt,\n 'waiting for the server acknowledgement',\n );\n lc.debug?.('Waiting for connection to be acknowledged');\n // Local setup is done; the rest of the wait is the server's, and gets its\n // own budget rather than whatever the setup left over.\n attempt.clearTimeout?.();\n attempt.clearTimeout = this.#armConnectTimeout(lc, attempt, 'ack');\n await attempt.connected.promise;\n if (signal.aborted) {\n throw attempt.abortReason;\n }\n this.#mutationTracker.onConnected(this.#lastMutationIDReceived);\n // push any outstanding mutations on reconnect.\n this.#rep.push().catch(() => {});\n }\n\n /**\n * Starts the deadline for one phase of a connection attempt, and returns a\n * function that cancels it.\n *\n * The two phases are measured separately because they fail for unrelated\n * reasons. `setup` covers local work — reading the cookie, the client group\n * ID and the active clients from IDB, then preparing and opening the socket\n * — whose duration says nothing about whether the server is reachable.\n * `ack` covers the wait for the server's response. Running them on one\n * budget meant a slow cold boot spent the server's time before the socket\n * existed, and reported a healthy server as unreachable.\n */\n #armConnectTimeout(\n lc: LogContext,\n attempt: ConnectAttemptControl,\n phase: 'setup' | 'ack',\n ): () => void {\n const {signal} = attempt.controller;\n\n // A deadline outlives the caller that armed it. The run loop stops waiting\n // on a canceled attempt and clears whatever deadline was running, but\n // #connectAttempt keeps going — its in-flight awaits do not all honor the\n // abort — so it can reach the setup-to-ack handover afterwards. A timer\n // armed at that point would have no owner left to clear it, and would\n // disconnect whichever attempt came next. Tying it to the signal means it\n // is cleared by any abort, whenever it happens and whoever holds it.\n if (signal.aborted) {\n return () => {};\n }\n\n const timeoutID = setTimeout(() => {\n lc.debug?.('Connection attempt timed out');\n this.#disconnect(\n lc,\n new ClientError({\n kind: ClientErrorKind.ConnectTimeout,\n message:\n (phase === 'setup'\n ? `Connection setup timed out after ${CONNECT_TIMEOUT_MS / 1000} seconds. `\n : `Server did not acknowledge the connection within ${CONNECT_TIMEOUT_MS / 1000} seconds. `) +\n `Connect events: ${JSON.stringify(attempt.events)}`,\n }),\n );\n }, CONNECT_TIMEOUT_MS);\n\n const clear = () => {\n clearTimeout(timeoutID);\n signal.removeEventListener('abort', clear);\n };\n signal.addEventListener('abort', clear, {once: true});\n return clear;\n }\n\n #addConnectEvent(\n lc: LogContext,\n attempt: ConnectAttemptControl,\n event: string,\n ): void {\n attempt.events.push([new Date(), event]);\n lc.debug?.('Connect event', event);\n }\n\n #disconnect(lc: LogContext, reason: ZeroError, closeCode?: CloseCode): void {\n const attempt = this.#currentConnectAttempt;\n if (attempt) {\n // Record the reason before aborting so legacy runtimes can read it from\n // ConnectAttemptControl.abortReason when signal.reason is unavailable.\n attempt.abortReason = reason;\n attempt.controller.abort();\n }\n\n if (shouldReportConnectError(reason)) {\n this.#connectErrorCount++;\n this.#metrics.lastConnectError.set(getLastConnectErrorValue(reason));\n this.#metrics.timeToConnectMs.set(DID_NOT_CONNECT_VALUE);\n this.#metrics.setConnectError(reason);\n if (\n this.#connectErrorCount % CHECK_CONNECTIVITY_ON_ERROR_FREQUENCY ===\n 1\n ) {\n this.#checkConnectivity(`connectErrorCount=${this.#connectErrorCount}`);\n }\n }\n\n lc.info?.('disconnecting', {\n navigatorOnline: navigator?.onLine,\n reason: reason.kind,\n connectStart: this.#connectStart,\n totalToConnectStart: this.#totalToConnectStart,\n connectedAt: this.#connectedAt,\n connectionDuration: this.#connectedAt\n ? Date.now() - this.#connectedAt\n : 0,\n messageCount: this.#messageCount,\n connectionState: this.#connectionManager.state,\n connectErrorCount: this.#connectErrorCount,\n });\n\n const connectionStatus = this.#connectionManager.state.name;\n switch (connectionStatus) {\n case ConnectionStatus.Connected: {\n if (this.#connectStart !== undefined) {\n lc.error?.(\n 'disconnect() called while connected but connect start time is defined.',\n );\n // this._connectStart reset below.\n }\n break;\n }\n case ConnectionStatus.Closed:\n lc.debug?.('disconnect() called while closed');\n return;\n\n case ConnectionStatus.Initializing:\n case ConnectionStatus.Disconnected:\n case ConnectionStatus.Connecting:\n case ConnectionStatus.NeedsAuth:\n case ConnectionStatus.Error:\n break;\n\n default:\n unreachable(connectionStatus);\n }\n\n this.#socketResolver = resolver();\n this.#messageCount = 0;\n this.#connectStart = undefined; // don't reset this._totalToConnectStart\n this.#connectedAt = 0;\n this.#socket?.removeEventListener('message', this.#onMessage);\n this.#socket?.removeEventListener('open', this.#onOpen);\n this.#socket?.removeEventListener('close', this.#onClose);\n this.#socket?.close(closeCode);\n this.#socket = undefined;\n this.#lastMutationIDsSent.clear();\n this.#pokeHandler.handleDisconnect();\n this.#queryManager.clearGotQueriesAuthoritative();\n\n const transition = getErrorConnectionTransition(reason);\n\n switch (transition.status) {\n case ConnectionStatus.NeedsAuth:\n this.#connectionManager.needsAuth(transition.reason);\n break;\n case ConnectionStatus.Error:\n this.#connectionManager.error(transition.reason);\n break;\n case ConnectionStatus.Disconnected:\n this.#connectionManager.disconnected(transition.reason);\n break;\n case ConnectionStatus.Closed:\n this.#connectionManager.closed();\n break;\n case NO_STATUS_TRANSITION:\n if (!this.#connectionManager.isInTerminalState()) {\n this.#connectionManager.connecting(transition.reason);\n }\n break;\n default:\n unreachable(transition);\n }\n }\n\n #handlePokeStart(_lc: LogContext, pokeMessage: PokeStartMessage): void {\n this.#abortPingTimeout();\n this.#pokeHandler.handlePokeStart(pokeMessage[1]);\n }\n\n #handlePokePart(_lc: LogContext, pokeMessage: PokePartMessage): void {\n this.#abortPingTimeout();\n const lastMutationIDChangeForSelf = this.#pokeHandler.handlePokePart(\n pokeMessage[1],\n );\n if (lastMutationIDChangeForSelf !== undefined) {\n this.#lastMutationIDReceived = lastMutationIDChangeForSelf;\n }\n }\n\n #handlePokeChunk(chunk: Uint8Array): void {\n this.#abortPingTimeout();\n this.#pokeHandler.handlePokeChunk(chunk);\n }\n\n #handlePokeEnd(_lc: LogContext, pokeMessage: PokeEndMessage): void {\n this.#abortPingTimeout();\n const result = this.#pokeHandler.handlePokeEnd(pokeMessage[1]);\n if (result?.hasRows) {\n // Receiving row data indicates that the client is in a good state and\n // can reset the reload backoff state.\n resetBackoff();\n }\n if (result?.lastMutationIDChangeForSelf !== undefined) {\n this.#lastMutationIDReceived = result.lastMutationIDChangeForSelf;\n }\n }\n\n #onPokeError(error: unknown): void {\n const lc = this.#lc;\n lc.info?.(\n 'poke error, disconnecting?',\n !this.#connectionManager.is(ConnectionStatus.Disconnected),\n );\n\n // It is theoretically possible that we get disconnected during the\n // async poke above. Only disconnect if we are not already\n // disconnected.\n if (!this.#connectionManager.is(ConnectionStatus.Disconnected)) {\n const errorStr = String(error);\n const isBaseCookieError = errorStr.includes('unexpected base cookie');\n this.#disconnect(\n lc,\n new ClientError({\n kind: isBaseCookieError\n ? ClientErrorKind.UnexpectedBaseCookie\n : ClientErrorKind.Internal,\n message: isBaseCookieError\n ? 'Server returned unexpected base cookie during sync'\n : `Poke processing error: ${errorStr}`,\n }),\n );\n }\n }\n\n #handlePullResponse(\n lc: LogContext,\n pullResponseMessage: PullResponseMessage,\n ): void {\n this.#abortPingTimeout();\n const body = pullResponseMessage[1];\n lc = lc.withContext('requestID', body.requestID);\n lc.debug?.('Handling pull response', body);\n const resolver = this.#pendingPullsByRequestID.get(body.requestID);\n if (!resolver) {\n // This can happen because resolvers are deleted\n // from this._pendingPullsByRequestID when pulls timeout.\n lc.debug?.('No resolver found');\n return;\n }\n resolver.resolve(pullResponseMessage[1]);\n }\n\n async #pusher(req: PushRequest, requestID: string): Promise<PusherResult> {\n // The deprecation of pushVersion 0 predates zero-client\n assert(req.pushVersion === 1, 'Expected pushVersion 1');\n // If we are connecting we wait until we are connected.\n await this.#connectionReadyResolver.promise;\n const lc = this.#lc.withContext('requestID', requestID);\n lc.debug?.(`pushing ${req.mutations.length} mutations`);\n assert(this.#socket, 'Expected socket to be connected for push');\n\n const isMutationRecoveryPush =\n req.clientGroupID !== (await this.clientGroupID);\n // A recovery push is for a different client group, so nothing has been sent\n // for it on this connection.\n const toSend = isMutationRecoveryPush\n ? req.mutations\n : req.mutations.filter(\n m => m.id > (this.#lastMutationIDsSent.get(m.clientID) ?? 0),\n );\n lc.debug?.(\n isMutationRecoveryPush ? 'pushing for recovery' : 'pushing',\n toSend.length,\n 'mutations of',\n req.mutations.length,\n 'mutations.',\n );\n const now = Date.now();\n for (const m of toSend) {\n const timestamp = now - Math.round(performance.now() - m.timestamp);\n const zeroM =\n m.name === CRUD_MUTATION_NAME\n ? ({\n type: MutationType.CRUD,\n timestamp,\n id: m.id,\n clientID: m.clientID,\n name: m.name,\n args: [mapCRUD(m.args as CRUDMutationArg, this.#clientToServer)],\n } satisfies CRUDMutation)\n : ({\n type: MutationType.Custom,\n timestamp,\n id: m.id,\n clientID: m.clientID,\n name: m.name,\n args: [m.args],\n } satisfies CustomMutation);\n const msg: PushMessage = [\n 'push',\n {\n timestamp: now,\n clientGroupID: req.clientGroupID,\n mutations: [zeroM],\n pushVersion: req.pushVersion,\n requestID,\n traceparent: this.#options.getTraceparent?.(),\n },\n ];\n this.#send(msg);\n if (!isMutationRecoveryPush) {\n this.#lastMutationIDsSent.set(m.clientID, m.id);\n }\n }\n return {\n httpRequestInfo: {\n errorMessage: '',\n httpStatusCode: 200,\n },\n };\n }\n\n async #runLoop() {\n this.#lc.info?.(`Starting Zero version: ${this.version}`);\n\n if (this.#server === null) {\n this.#lc.info?.('No socket origin provided, not starting connect loop.');\n this.#connectionManager.disconnected(\n new ClientError({\n kind: ClientErrorKind.NoSocketOrigin,\n message: 'No server socket origin provided',\n }),\n );\n return;\n }\n\n let runLoopCounter = 0;\n const bareLogContext = this.#lc;\n const getLogContext = () => {\n let lc = bareLogContext;\n if (this.#socket) {\n lc = addWebSocketIDFromSocketToLogContext(this.#socket, lc);\n }\n return lc.withContext('runLoopCounter', runLoopCounter);\n };\n\n // Set initial auth from options\n const {auth} = this.#options;\n this.#setAuth(auth);\n\n // Wait for the local work every connect attempt starts with: the replica\n // loaded (the cookie is read once it is), the client group ID and the\n // active clients. On a slow device with a large replica this takes tens of\n // seconds, and none of it depends on the server, so it happens in\n // `initializing` instead of spending the connecting window and the setup\n // deadline of the first attempts.\n // A local store that never finishes loading must not keep the run loop\n // alive past close().\n const {signal: closeSignal} = this.#closeAbortController;\n const closed = resolver<void>();\n const onClose = () => closed.resolve();\n closeSignal.addEventListener('abort', onClose, {once: true});\n try {\n const result = await promiseRace({\n initialized: Promise.all([\n this.#rep.cookie,\n this.clientGroupID,\n this.#activeClientsManager,\n ]),\n closed: closed.promise,\n });\n if (result.key === 'closed') {\n this.#lc.debug?.('Closed while initializing, not connecting');\n return;\n }\n } catch {\n // The first connect attempt awaits the same promises and reports the\n // failure through the usual disconnect path.\n } finally {\n closeSignal.removeEventListener('abort', onClose);\n }\n this.#connectionManager.initialized();\n\n let backoffMs: number | undefined;\n let additionalConnectParams: Record<string, string> | undefined;\n\n while (this.#connectionManager.shouldContinueRunLoop()) {\n runLoopCounter++;\n let lc = getLogContext();\n backoffMs = RUN_LOOP_INTERVAL_MS;\n\n try {\n const currentState = this.#connectionManager.state;\n\n switch (currentState.name) {\n case ConnectionStatus.Connecting:\n case ConnectionStatus.Disconnected: {\n if (this.#visibilityWatcher.visibilityState === 'hidden') {\n this.#metrics.setDisconnectedWaitingForVisible();\n // reset this._totalToConnectStart since this client\n // is no longer trying to connect due to being hidden.\n this.#totalToConnectStart = undefined;\n }\n\n // If hidden, we wait for the tab to become visible before trying again.\n // or for a state change (e.g. an error)\n const visibilityResult = await promiseRace({\n visible: this.#visibilityWatcher.waitForVisible(),\n stateChange: this.#connectionManager.waitForStateChange(),\n });\n\n if (visibilityResult.key === 'stateChange') {\n throwIfConnectionError(visibilityResult.result);\n break;\n }\n\n // If a reload is pending, do not try to reconnect.\n if (reloadScheduled()) {\n break;\n }\n\n const ready = this.#connectionReadyResolver;\n assert(\n this.#currentConnectAttempt === undefined,\n 'Connection attempt already active',\n );\n const attempt: ConnectAttemptControl = {\n controller: new AbortController(),\n connected: resolver(),\n events: [],\n };\n this.#currentConnectAttempt = attempt;\n this.#addConnectEvent(lc, attempt, 'starting the connection');\n attempt.clearTimeout = this.#armConnectTimeout(\n lc,\n attempt,\n 'setup',\n );\n const canceled = resolver<never>();\n const abortHandler = () => canceled.reject(attempt.abortReason);\n attempt.controller.signal.addEventListener('abort', abortHandler, {\n once: true,\n });\n try {\n try {\n await Promise.race([\n this.#connectAttempt(lc, additionalConnectParams, attempt),\n canceled.promise,\n ]);\n } catch (ex) {\n const error = isZeroError(ex)\n ? ex\n : new ClientError(\n {\n kind: ClientErrorKind.Internal,\n message: getErrorMessage(ex),\n },\n {cause: ex},\n );\n if (!attempt.controller.signal.aborted) {\n this.#disconnect(lc, error);\n }\n ready.reject(error);\n if (this.#connectionReadyResolver === ready) {\n this.#connectionReadyResolver = connectionReadyResolver();\n }\n throw error;\n }\n ready.resolve();\n additionalConnectParams = undefined;\n } finally {\n attempt.clearTimeout?.();\n attempt.controller.signal.removeEventListener(\n 'abort',\n abortHandler,\n );\n if (this.#currentConnectAttempt === attempt) {\n this.#currentConnectAttempt = undefined;\n }\n }\n\n throwIfConnectionError(this.#connectionManager.state);\n\n // Now we have a new socket, update lc with the new wsid.\n assert(this.#socket, 'Expected socket after reconnection');\n lc = getLogContext();\n\n lc.debug?.('Connected successfully');\n break;\n }\n\n case ConnectionStatus.Connected: {\n const ready = this.#connectionReadyResolver;\n // When connected we wait for whatever happens first out of:\n // - After pingTimeoutMs we send a ping\n // - We get a message\n // - The tab becomes hidden (with a delay)\n // - We get a state change (e.g. an error or disconnect)\n\n const controller = new AbortController();\n this.#abortPingTimeout = () => controller.abort();\n const [pingTimeoutPromise, pingTimeoutAborted] = sleepWithAbort(\n this.pingTimeoutMs,\n controller.signal,\n );\n\n try {\n const raceResult = await promiseRace({\n waitForPing: pingTimeoutPromise,\n waitForPingAborted: pingTimeoutAborted,\n tabHidden: this.#visibilityWatcher.waitForHidden(),\n stateChange: this.#connectionManager.waitForStateChange(),\n });\n\n switch (raceResult.key) {\n case 'waitForPing': {\n await this.#ping(lc);\n break;\n }\n\n case 'waitForPingAborted':\n break;\n\n case 'tabHidden': {\n const hiddenError = new ClientError({\n kind: ClientErrorKind.Hidden,\n message: 'Connection closed because tab was hidden',\n });\n this.#disconnect(lc, hiddenError);\n break;\n }\n\n case 'stateChange': {\n throwIfConnectionError(raceResult.result);\n break;\n }\n\n default:\n unreachable(raceResult);\n }\n } finally {\n if (\n !this.#connectionManager.is(ConnectionStatus.Connected) &&\n this.#connectionReadyResolver === ready\n ) {\n this.#connectionReadyResolver = connectionReadyResolver();\n }\n }\n\n break;\n }\n\n case ConnectionStatus.NeedsAuth: {\n // we pause the run loop and wait for connect() to be called with new credentials\n lc.info?.(\n `Run loop paused in needs-auth state. Call zero.connection.connect({auth}) to resume.`,\n currentState.reason,\n );\n const resumeResult = await promiseRace({\n connectRequest: this.#connectionManager.waitForConnectRequest(),\n stateChange: this.#connectionManager.waitForStateChange(),\n });\n if (resumeResult.key === 'connectRequest') {\n this.#connectionManager.resumeFromConnectRequest();\n }\n break;\n }\n\n case ConnectionStatus.Error: {\n // we pause the run loop and wait for a state change\n lc.info?.(\n `Run loop paused in error state. Call zero.connection.connect() to resume.`,\n currentState.reason,\n ...getErrorCauses(currentState.reason),\n );\n const resumeResult = await promiseRace({\n connectRequest: this.#connectionManager.waitForConnectRequest(),\n stateChange: this.#connectionManager.waitForStateChange(),\n });\n if (resumeResult.key === 'connectRequest') {\n this.#connectionManager.resumeFromConnectRequest();\n }\n break;\n }\n\n case ConnectionStatus.Closed:\n // run loop will terminate\n break;\n\n case ConnectionStatus.Initializing:\n // initialized() is called before the loop starts.\n unreachable();\n\n default:\n unreachable(currentState);\n }\n } catch (ex) {\n const isClientClosedError =\n isClientError(ex) && ex.kind === ClientErrorKind.ClientClosed;\n\n const transition = getErrorConnectionTransition(ex);\n\n if (\n !this.#connectionManager.is(ConnectionStatus.Connected) &&\n !isClientClosedError\n ) {\n // Only errors that stop the run loop are logged at error. Routine\n // reconnects (dropped sockets, timeouts, rebalances) and auth\n // failures are expected in practice.\n let level: LogLevel;\n switch (transition.status) {\n case ConnectionStatus.Error:\n level = 'error';\n break;\n case ConnectionStatus.Disconnected:\n case ConnectionStatus.Closed:\n level = 'info';\n break;\n default:\n level = 'warn';\n }\n const kind = isServerError(ex) ? ex.kind : 'Unknown Error';\n // Same reasoning as in #handleErrorMessage: a rejected client group\n // is recovered, so its connect failure is not an error either.\n if (kind === ErrorKind.ClientNotFound) {\n level = 'warn';\n }\n lc[level]?.('Failed to connect', ex, ...getErrorCauses(ex), kind, {\n lmid: this.#lastMutationIDReceived,\n baseCookie: this.#connectCookie,\n });\n }\n\n lc.debug?.(\n 'Got an exception in the run loop',\n 'state:',\n this.#connectionManager.state,\n 'exception:',\n ex,\n );\n\n let sleepMs: number | undefined = undefined;\n switch (transition.status) {\n case NO_STATUS_TRANSITION: {\n // We continue the loop because the error does not indicate\n // a need to transition to a new state and we should continue retrying\n\n const backoffParams = getBackoffParams(transition.reason);\n if (backoffParams) {\n if (backoffParams.minBackoffMs !== undefined) {\n backoffMs = Math.max(backoffMs, backoffParams.minBackoffMs);\n }\n if (backoffParams.maxBackoffMs !== undefined) {\n backoffMs = Math.min(backoffMs, backoffParams.maxBackoffMs);\n }\n additionalConnectParams = backoffParams.reconnectParams;\n }\n\n lc.debug?.(\n 'Sleeping',\n backoffMs,\n 'ms before reconnecting due to error, state:',\n this.#connectionManager.state,\n );\n sleepMs = backoffMs;\n break;\n }\n case ConnectionStatus.NeedsAuth: {\n lc.debug?.(\n 'Auth error encountered, transitioning to needs-auth state',\n );\n this.#connectionManager.needsAuth(transition.reason);\n // run loop will enter the needs-auth state case and await a state change\n break;\n }\n case ConnectionStatus.Error: {\n lc.debug?.('Fatal error encountered, transitioning to error state');\n\n this.#connectionManager.error(transition.reason);\n // run loop will enter the error state case and await a state change\n break;\n }\n case ConnectionStatus.Disconnected: {\n this.#connectionManager.disconnected(transition.reason);\n break;\n }\n case ConnectionStatus.Closed: {\n break;\n }\n default:\n unreachable(transition);\n }\n\n // refresh to ensure any persisted snapshots that we're not refreshed\n // becasue refreshes are disabled while connecting and connected and\n // were not received via poke from the server, are picked up.\n // Do this before back off sleep.\n if (transition.status !== ConnectionStatus.Closed) {\n try {\n this.#forceEnableRefresh = true;\n await this.#rep.runRefresh();\n } catch (ex) {\n if (ex instanceof AbortError) {\n this.#lc.debug?.(\n `Refresh from storage did not complete before close.`,\n );\n } else {\n this.#lc.error?.(`Error during refresh from storage`, ex);\n }\n } finally {\n this.#forceEnableRefresh = false;\n }\n }\n\n if (sleepMs) {\n await sleep(sleepMs);\n }\n }\n }\n }\n\n async #puller(req: PullRequest, requestID: string): Promise<PullerResult> {\n // The deprecation of pushVersion 0 predates zero-client\n assert(req.pullVersion === 1, 'Expected pullVersion 1');\n const lc = this.#lc.withContext('requestID', requestID);\n lc.debug?.('Pull', req);\n // Pull request for this instance's client group. A no-op response is\n // returned as pulls for this client group are handled via poke over the\n // socket.\n if (req.clientGroupID === (await this.clientGroupID)) {\n return {\n httpRequestInfo: {\n errorMessage: '',\n httpStatusCode: 200,\n },\n };\n }\n\n // If we are connecting we wait until we are connected.\n await this.#connectionReadyResolver.promise;\n assert(\n this.#socket,\n 'Expected socket to be connected for mutation recovery pull',\n );\n // Mutation recovery pull.\n lc.debug?.('Pull is for mutation recovery');\n const cookie = valita.parse(\n req.cookie,\n nullableVersionSchema,\n 'passthrough',\n );\n const pullRequestMessage: PullRequestMessage = [\n 'pull',\n {\n clientGroupID: req.clientGroupID,\n cookie,\n requestID,\n },\n ];\n this.#send(pullRequestMessage);\n const pullResponseResolver: Resolver<PullResponseBody> = resolver();\n this.#pendingPullsByRequestID.set(requestID, pullResponseResolver);\n try {\n const raceResult = await promiseRace({\n timeout: sleep(PULL_TIMEOUT_MS),\n success: pullResponseResolver.promise,\n });\n switch (raceResult.key) {\n case 'timeout':\n lc.debug?.('Mutation recovery pull timed out');\n throw new ClientError({\n kind: ClientErrorKind.PullTimeout,\n message: 'Pull timed out',\n });\n case 'success': {\n lc.debug?.('Returning mutation recovery pull response');\n const response = await pullResponseResolver.promise;\n return {\n response: {\n cookie: response.cookie,\n lastMutationIDChanges: response.lastMutationIDChanges,\n patch: [],\n },\n httpRequestInfo: {\n errorMessage: '',\n httpStatusCode: 200,\n },\n };\n }\n default:\n unreachable(raceResult);\n }\n } finally {\n pullResponseResolver.reject(\n new ClientError({\n kind: ClientErrorKind.PullTimeout,\n message: 'Pull timed out',\n }),\n );\n this.#pendingPullsByRequestID.delete(requestID);\n }\n }\n\n /**\n * Sets the authentication token on the replicache instance.\n *\n * @param auth - The authentication token to set.\n */\n #setAuth(auth: string | undefined | null): void {\n this.#checkAuthValid(this.userID, auth);\n\n this.#rep.auth = toReplicacheAuthToken(auth);\n\n if (auth) {\n this.#sendIfConnected(['updateAuth', {auth}]);\n }\n }\n\n /**\n * A rough heuristic for whether the client is currently online and\n * authenticated.\n *\n * @deprecated Use `connection` instead, which provides more detailed connection state.\n */\n get online(): boolean {\n return this.#onlineManager.online;\n }\n\n /**\n * Subscribe to online status changes.\n *\n * This is useful when you want to update state based on the online status.\n *\n * @param listener - The listener to subscribe to.\n * @returns A function to unsubscribe the listener.\n *\n * @deprecated Use `connection` instead, which provides more detailed connection state.\n */\n onOnline = (listener: (online: boolean) => void): (() => void) =>\n this.#onlineManager.subscribe(listener);\n\n /**\n * Starts a ping and waits for a pong.\n */\n async #ping(lc: LogContext): Promise<void> {\n lc.debug?.('pinging');\n const {promise, resolve} = resolver();\n this.#onPong = resolve;\n const pingMessage: PingMessage = ['ping', {}];\n const t0 = performance.now();\n assert(this.#socket, 'Expected socket to be connected for ping');\n this.#send(pingMessage);\n\n const raceResult = await promiseRace({\n waitForPong: promise,\n pingTimeout: sleep(this.pingTimeoutMs),\n stateChange: this.#connectionManager.waitForStateChange(),\n });\n\n const delta = performance.now() - t0;\n switch (raceResult.key) {\n case 'waitForPong': {\n lc.debug?.('ping succeeded in', delta, 'ms');\n return;\n }\n\n case 'pingTimeout': {\n lc.info?.('ping failed in', delta, 'ms - disconnecting');\n const pingTimeoutError = new ClientError({\n kind: ClientErrorKind.PingTimeout,\n message: 'Server ping request failed',\n });\n this.#disconnect(lc, pingTimeoutError);\n throw pingTimeoutError;\n }\n\n case 'stateChange': {\n lc.debug?.(\n 'ping aborted due to connection state change',\n raceResult.result,\n );\n throwIfConnectionError(raceResult.result);\n break;\n }\n\n default:\n unreachable(raceResult);\n }\n }\n\n // Sends a set of metrics to the server. Throws unless the server\n // returns 200.\n // TODO: Reenable metrics reporting\n async #reportMetrics(_allSeries: Series[]) {\n // if (this.#server === null) {\n // this.#lc.info?.('Skipping metrics report, socketOrigin is null');\n // return;\n // }\n // const body = JSON.stringify({series: allSeries});\n // const url = new URL('/api/metrics/v0/report', this.#server);\n // url.searchParams.set('clientID', this.clientID);\n // url.searchParams.set('clientGroupID', await this.clientGroupID);\n // url.searchParams.set('userID', this.userID);\n // url.searchParams.set('requestID', nanoid());\n // const res = await fetch(url.toString(), {\n // method: 'POST',\n // body,\n // keepalive: true,\n // });\n // if (!res.ok) {\n // const maybeBody = await res.text();\n // throw new Error(\n // `unexpected response: ${res.status} ${res.statusText} body: ${maybeBody}`,\n // );\n // }\n }\n\n #checkConnectivity(reason: string) {\n this.#checkConnectivityAsync(reason);\n }\n\n #checkConnectivityAsync(_reason: string) {\n // skipping connectivity checks for now - the server doesn't respond to\n // them so it just creates noise.\n // assert(this.#server);\n // if (this.closed) {\n // return;\n // }\n // try {\n // await checkConnectivity(\n // reason,\n // this.#server,\n // this.#lc,\n // this.#closeAbortController.signal,\n // this.#enableAnalytics,\n // );\n // } catch (e) {\n // this.#lc.info?.('Error checking connectivity for', reason, e);\n // }\n }\n\n /**\n * `inspector` is an object that can be used to inspect the state of the\n * queries a Zero instance uses. It is intended for debugging purposes.\n */\n get inspector(): Inspector {\n // We use esbuild dropLabels to strip this code when we build the code for the bundle size dashboard.\n // https://esbuild.github.io/api/#ignore-annotations\n // /packages/zero/tool/build.ts\n\n // oxlint-disable-next-line no-unused-labels\n BUNDLE_SIZE: {\n return (this.#inspector ??= new Inspector(\n this.#rep,\n this.#queryManager,\n this.#zeroContext,\n async () => {\n await this.#connectionReadyResolver.promise;\n return must(this.#socket);\n },\n ));\n }\n }\n\n async delete(): Promise<{deleted: string[]; errors: unknown[]}> {\n await this.close();\n const {dropped, errors} = await dropMatchingDatabases(\n database => database.replicacheName === this.#rep.name,\n {kvStore: this.#kvStore},\n );\n return {deleted: dropped, errors};\n }\n\n #addMetric: <K extends keyof MetricMap>(\n metric: K,\n value: number,\n ...args: MetricMap[K]\n ) => void = (metric, value, ...args) => {\n assert(isClientMetric(metric), `Invalid metric: ${metric}`);\n this.#queryManager.addMetric(\n metric as keyof ClientMetricMap,\n value,\n ...(args as ClientMetricMap[keyof ClientMetricMap]),\n );\n };\n\n #checkAuthValid(\n userID: string | undefined,\n auth: string | null | undefined,\n ): void {\n if (userID === undefined && auth) {\n throw new ClientError({\n kind: ClientErrorKind.Internal,\n message: 'ZeroOptions.userID is required when auth is set.',\n });\n }\n }\n}\n\nexport class OnlineManager extends Subscribable<boolean> {\n #online = false;\n\n setOnline(online: boolean): void {\n if (this.#online === online) {\n return;\n }\n this.#online = online;\n this.notify(online);\n }\n\n get online(): boolean {\n return this.#online;\n }\n}\n\nexport async function createSocket(\n rep: ReplicacheImpl,\n queryManager: QueryManager,\n deleteClientsManager: DeleteClientsManager,\n socketOrigin: WSString,\n baseCookie: NullableVersion,\n clientID: string,\n clientGroupID: string,\n clientSchema: ClientSchema,\n userID: string | undefined,\n auth: string | undefined,\n lmid: number,\n wsid: string,\n debugPerf: boolean,\n lc: LogContext,\n userPushURL: string | undefined,\n userPushHeaders: Record<string, string> | undefined,\n userQueryURL: string | undefined,\n userQueryHeaders: Record<string, string> | undefined,\n additionalConnectParams: Record<string, string> | undefined,\n activeClientsManager: Pick<ActiveClientsManager, 'activeClients'>,\n maxHeaderLength = 1024 * 8,\n onEvent?: (event: string) => void,\n): Promise<\n [\n WebSocket,\n Map<string, UpQueriesPatchOp> | undefined,\n DeleteClientsBody | undefined,\n ]\n> {\n onEvent?.('reading the profile ID');\n const url = await createConnectionURL(\n socketOrigin,\n clientID,\n clientGroupID,\n userID,\n baseCookie,\n lmid,\n wsid,\n rep,\n debugPerf,\n additionalConnectParams,\n lc,\n );\n\n // Pass auth to the server via the `Sec-WebSocket-Protocol` header by passing\n // it as a `protocol` to the `WebSocket` constructor. The empty string is an\n // invalid `protocol`, and will result in an exception, so pass undefined\n // instead. encodeURIComponent to ensure it only contains chars allowed\n // for a `protocol`.\n const WS = mustGetBrowserGlobal('WebSocket');\n const queriesPatchP = rep.query(tx => queryManager.getQueriesPatch(tx));\n onEvent?.('reading deleted clients');\n const deletedClientsArray = await deleteClientsManager.getDeletedClients();\n let deletedClients: DeleteClientsBody | undefined =\n convertDeletedClientsToBody(deletedClientsArray, clientGroupID);\n onEvent?.('reading desired queries');\n let queriesPatch: Map<string, UpQueriesPatchOp> | undefined =\n await queriesPatchP;\n const {activeClients} = activeClientsManager;\n\n let secProtocol = encodeSecProtocols(\n [\n 'initConnection',\n {\n desiredQueriesPatch: [...queriesPatch.values()],\n deleted: skipEmptyDeletedClients(deletedClients),\n // The clientSchema only needs to be sent for the very first request.\n // Henceforth it is stored with the CVR and verified automatically.\n ...(baseCookie === null ? {clientSchema} : {}),\n userPushURL,\n userPushHeaders,\n userQueryURL,\n userQueryHeaders,\n activeClients: [...activeClients],\n },\n ],\n auth,\n );\n if (secProtocol.length > maxHeaderLength) {\n secProtocol = encodeSecProtocols(undefined, auth);\n if (secProtocol.length > maxHeaderLength) {\n lc.warn?.(\n `Encoded auth token length (${secProtocol.length}) exceeds ` +\n `ZeroOptions.maxHeaderLength (${maxHeaderLength}). This may ` +\n `cause connection failures.`,\n );\n }\n queriesPatch = undefined;\n } else {\n deletedClients = undefined;\n }\n onEvent?.('creating the WebSocket');\n const socket = new WS(\n // toString() required for RN URL polyfill.\n url.toString(),\n secProtocol,\n );\n socket.binaryType = 'arraybuffer';\n return [socket, queriesPatch, skipEmptyDeletedClients(deletedClients)];\n}\n\nexport async function createConnectionURL(\n socketOrigin: HTTPString | WSString,\n clientID: string,\n clientGroupID: string,\n userID: string | undefined,\n baseCookie: string | null,\n lmid: number,\n wsid: string,\n rep: Pick<ReplicacheImpl<{}>, 'profileID'>,\n debugPerf: boolean,\n additionalConnectParams: Record<string, string> | undefined,\n lc: LogContext<unknown[], unknown[], unknown[], unknown[]>,\n) {\n const url = new URL(\n appendPath(socketOrigin, `/sync/v${CLIENT_PROTOCOL_VERSION}/connect`),\n );\n const {searchParams} = url;\n searchParams.set('clientID', clientID);\n searchParams.set('clientGroupID', clientGroupID);\n if (userID !== undefined) {\n searchParams.set('userID', userID);\n }\n searchParams.set('baseCookie', baseCookie === null ? '' : String(baseCookie));\n searchParams.set('ts', String(performance.now()));\n searchParams.set('lmid', String(lmid));\n searchParams.set('wsid', wsid);\n searchParams.set('profileID', await rep.profileID);\n if (debugPerf) {\n searchParams.set('debugPerf', true.toString());\n }\n setFeatureFlags(searchParams);\n if (additionalConnectParams) {\n for (const k in additionalConnectParams) {\n if (searchParams.has(k)) {\n lc.warn?.(`skipping conflicting parameter ${k}`);\n } else {\n searchParams.set(k, additionalConnectParams[k]);\n }\n }\n }\n\n lc.info?.('Connecting to', url.toString());\n return url;\n}\n\nfunction skipEmptyArray<T>(\n arr: readonly T[] | undefined,\n): readonly T[] | undefined {\n return arr && arr.length > 0 ? arr : undefined;\n}\n\nfunction skipEmptyDeletedClients(\n deletedClients: DeleteClientsBody | undefined,\n): DeleteClientsBody | undefined {\n if (!deletedClients) {\n return undefined;\n }\n const {clientIDs, clientGroupIDs} = deletedClients;\n if (\n (!clientIDs || clientIDs.length === 0) &&\n (!clientGroupIDs || clientGroupIDs.length === 0)\n ) {\n return undefined;\n }\n const data: Writable<DeleteClientsBody> = {};\n data.clientIDs = skipEmptyArray(clientIDs);\n data.clientGroupIDs = skipEmptyArray(clientGroupIDs);\n return data;\n}\n\nfunction convertDeletedClientsToBody(\n deletedClients: DeletedClients,\n clientGroupID: ClientGroupID,\n): DeleteClientsBody | undefined {\n if (deletedClients.length === 0) {\n return undefined;\n }\n\n const clientIDs = deletedClients\n .filter(pair => pair.clientID && pair.clientGroupID === clientGroupID)\n .map(pair => pair.clientID);\n if (clientIDs.length === 0) {\n return undefined;\n }\n\n // We no longer send clientGroupIDs\n return {clientIDs};\n}\n\n/**\n * Adds the wsid query parameter to the log context. If the URL does not\n * have a wsid we use a randomID instead.\n */\nfunction addWebSocketIDFromSocketToLogContext(\n {url}: {url: string},\n lc: LogContext,\n): LogContext {\n const wsid = new URL(url).searchParams.get('wsid') ?? nanoid();\n return addWebSocketIDToLogContext(wsid, lc);\n}\n\nfunction addWebSocketIDToLogContext(wsid: string, lc: LogContext): LogContext {\n return lc.withContext('wsid', wsid);\n}\n\nfunction assertValidRunOptions(_options?: RunOptions): void {}\n\nasync function makeActiveClientsManager(\n clientGroupID: Promise<string>,\n clientID: string,\n signal: AbortSignal,\n onDelete: ActiveClientsManager['onDelete'],\n lc: LogContext,\n): Promise<ActiveClientsManager> {\n // Timed from here rather than from the await in #connectAttempt: this runs\n // at construction, in parallel with everything else, so by the time an\n // attempt asks for it the wait is usually already over. Waiting for the\n // client group ID is the database opening, which is timed on its own.\n const groupID = await clientGroupID;\n const start = performance.now();\n const manager = await ActiveClientsManager.create(groupID, clientID, signal);\n const elapsed = performance.now() - start;\n\n // navigator.locks does not exist on React Native, where this falls back to\n // an in-process stand-in that only ever sees this client. That changes both\n // what the timing means and how much the client list can be trusted, so say\n // which one produced the number.\n const locks = getBrowserGlobal('navigator')?.locks ? 'native' : 'fallback';\n if (elapsed > SLOW_ACTIVE_CLIENTS_THRESHOLD_MS) {\n lc.warn?.(`Initializing active clients took ${Math.round(elapsed)}ms`, {\n locks,\n });\n } else {\n lc.debug?.('Initialized active clients in', Math.round(elapsed), 'ms', {\n locks,\n });\n }\n\n manager.onDelete = onDelete;\n return manager;\n}\n"],"mappings":"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"}