@rocicorp/zero 0.0.0-202410031711

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 (831) hide show
  1. package/deps/sqlite3/sqlite3.c +260574 -0
  2. package/deps/sqlite3/sqlite3.h +13572 -0
  3. package/deps/sqlite3/sqlite3ext.h +719 -0
  4. package/out/btree/b+tree.d.ts +471 -0
  5. package/out/btree/b+tree.d.ts.map +1 -0
  6. package/out/btree/b+tree.js +1708 -0
  7. package/out/btree/b+tree.js.map +1 -0
  8. package/out/btree/interfaces.d.ts +270 -0
  9. package/out/btree/interfaces.d.ts.map +1 -0
  10. package/out/btree/interfaces.js +3 -0
  11. package/out/btree/interfaces.js.map +1 -0
  12. package/out/chunk-2RUT5EQV.js +28 -0
  13. package/out/chunk-2RUT5EQV.js.map +7 -0
  14. package/out/datadog/src/datadog-log-sink.d.ts +20 -0
  15. package/out/datadog/src/datadog-log-sink.d.ts.map +1 -0
  16. package/out/datadog/src/datadog-log-sink.js +231 -0
  17. package/out/datadog/src/datadog-log-sink.js.map +1 -0
  18. package/out/datadog/src/mod.d.ts +2 -0
  19. package/out/datadog/src/mod.d.ts.map +1 -0
  20. package/out/react.js +108 -0
  21. package/out/react.js.map +7 -0
  22. package/out/replicache/src/async-iterable-to-array.d.ts +2 -0
  23. package/out/replicache/src/async-iterable-to-array.d.ts.map +1 -0
  24. package/out/replicache/src/bg-interval.d.ts +3 -0
  25. package/out/replicache/src/bg-interval.d.ts.map +1 -0
  26. package/out/replicache/src/binary-search.d.ts +15 -0
  27. package/out/replicache/src/binary-search.d.ts.map +1 -0
  28. package/out/replicache/src/broadcast-channel.d.ts +3 -0
  29. package/out/replicache/src/broadcast-channel.d.ts.map +1 -0
  30. package/out/replicache/src/btree/diff.d.ts +4 -0
  31. package/out/replicache/src/btree/diff.d.ts.map +1 -0
  32. package/out/replicache/src/btree/node.d.ts +125 -0
  33. package/out/replicache/src/btree/node.d.ts.map +1 -0
  34. package/out/replicache/src/btree/read.d.ts +32 -0
  35. package/out/replicache/src/btree/read.d.ts.map +1 -0
  36. package/out/replicache/src/btree/splice.d.ts +9 -0
  37. package/out/replicache/src/btree/splice.d.ts.map +1 -0
  38. package/out/replicache/src/btree/write.d.ts +24 -0
  39. package/out/replicache/src/btree/write.d.ts.map +1 -0
  40. package/out/replicache/src/call-default-fetch.d.ts +6 -0
  41. package/out/replicache/src/call-default-fetch.d.ts.map +1 -0
  42. package/out/replicache/src/config.d.ts +13 -0
  43. package/out/replicache/src/config.d.ts.map +1 -0
  44. package/out/replicache/src/connection-loop-delegates.d.ts +20 -0
  45. package/out/replicache/src/connection-loop-delegates.d.ts.map +1 -0
  46. package/out/replicache/src/connection-loop.d.ts +28 -0
  47. package/out/replicache/src/connection-loop.d.ts.map +1 -0
  48. package/out/replicache/src/cookies.d.ts +29 -0
  49. package/out/replicache/src/cookies.d.ts.map +1 -0
  50. package/out/replicache/src/dag/chunk.d.ts +35 -0
  51. package/out/replicache/src/dag/chunk.d.ts.map +1 -0
  52. package/out/replicache/src/dag/gc.d.ts +42 -0
  53. package/out/replicache/src/dag/gc.d.ts.map +1 -0
  54. package/out/replicache/src/dag/key.d.ts +26 -0
  55. package/out/replicache/src/dag/key.d.ts.map +1 -0
  56. package/out/replicache/src/dag/lazy-store.d.ts +181 -0
  57. package/out/replicache/src/dag/lazy-store.d.ts.map +1 -0
  58. package/out/replicache/src/dag/store-impl.d.ts +38 -0
  59. package/out/replicache/src/dag/store-impl.d.ts.map +1 -0
  60. package/out/replicache/src/dag/store.d.ts +36 -0
  61. package/out/replicache/src/dag/store.d.ts.map +1 -0
  62. package/out/replicache/src/dag/visitor.d.ts +13 -0
  63. package/out/replicache/src/dag/visitor.d.ts.map +1 -0
  64. package/out/replicache/src/db/commit.d.ts +133 -0
  65. package/out/replicache/src/db/commit.d.ts.map +1 -0
  66. package/out/replicache/src/db/index.d.ts +33 -0
  67. package/out/replicache/src/db/index.d.ts.map +1 -0
  68. package/out/replicache/src/db/read.d.ts +24 -0
  69. package/out/replicache/src/db/read.d.ts.map +1 -0
  70. package/out/replicache/src/db/rebase.d.ts +10 -0
  71. package/out/replicache/src/db/rebase.d.ts.map +1 -0
  72. package/out/replicache/src/db/scan.d.ts +15 -0
  73. package/out/replicache/src/db/scan.d.ts.map +1 -0
  74. package/out/replicache/src/db/write.d.ts +39 -0
  75. package/out/replicache/src/db/write.d.ts.map +1 -0
  76. package/out/replicache/src/error-responses.d.ts +26 -0
  77. package/out/replicache/src/error-responses.d.ts.map +1 -0
  78. package/out/replicache/src/filter-async-iterable.d.ts +10 -0
  79. package/out/replicache/src/filter-async-iterable.d.ts.map +1 -0
  80. package/out/replicache/src/format-version.d.ts +9 -0
  81. package/out/replicache/src/format-version.d.ts.map +1 -0
  82. package/out/replicache/src/frozen-json.d.ts +35 -0
  83. package/out/replicache/src/frozen-json.d.ts.map +1 -0
  84. package/out/replicache/src/get-default-puller.d.ts +14 -0
  85. package/out/replicache/src/get-default-puller.d.ts.map +1 -0
  86. package/out/replicache/src/get-default-pusher.d.ts +10 -0
  87. package/out/replicache/src/get-default-pusher.d.ts.map +1 -0
  88. package/out/replicache/src/hash.d.ts +29 -0
  89. package/out/replicache/src/hash.d.ts.map +1 -0
  90. package/out/replicache/src/http-request-info.d.ts +6 -0
  91. package/out/replicache/src/http-request-info.d.ts.map +1 -0
  92. package/out/replicache/src/impl.d.ts +4 -0
  93. package/out/replicache/src/impl.d.ts.map +1 -0
  94. package/out/replicache/src/index-defs.d.ts +36 -0
  95. package/out/replicache/src/index-defs.d.ts.map +1 -0
  96. package/out/replicache/src/iterable-union.d.ts +5 -0
  97. package/out/replicache/src/iterable-union.d.ts.map +1 -0
  98. package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts +25 -0
  99. package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts.map +1 -0
  100. package/out/replicache/src/kv/idb-store.d.ts +18 -0
  101. package/out/replicache/src/kv/idb-store.d.ts.map +1 -0
  102. package/out/replicache/src/kv/mem-store.d.ts +23 -0
  103. package/out/replicache/src/kv/mem-store.d.ts.map +1 -0
  104. package/out/replicache/src/kv/read-impl.d.ts +11 -0
  105. package/out/replicache/src/kv/read-impl.d.ts.map +1 -0
  106. package/out/replicache/src/kv/store.d.ts +76 -0
  107. package/out/replicache/src/kv/store.d.ts.map +1 -0
  108. package/out/replicache/src/kv/write-impl-base.d.ts +18 -0
  109. package/out/replicache/src/kv/write-impl-base.d.ts.map +1 -0
  110. package/out/replicache/src/kv/write-impl.d.ts +9 -0
  111. package/out/replicache/src/kv/write-impl.d.ts.map +1 -0
  112. package/out/replicache/src/lazy.d.ts +2 -0
  113. package/out/replicache/src/lazy.d.ts.map +1 -0
  114. package/out/replicache/src/log-options.d.ts +10 -0
  115. package/out/replicache/src/log-options.d.ts.map +1 -0
  116. package/out/replicache/src/merge-async-iterables.d.ts +16 -0
  117. package/out/replicache/src/merge-async-iterables.d.ts.map +1 -0
  118. package/out/replicache/src/mod.d.ts +38 -0
  119. package/out/replicache/src/mod.d.ts.map +1 -0
  120. package/out/replicache/src/mutation-recovery.d.ts +43 -0
  121. package/out/replicache/src/mutation-recovery.d.ts.map +1 -0
  122. package/out/replicache/src/new-client-channel.d.ts +6 -0
  123. package/out/replicache/src/new-client-channel.d.ts.map +1 -0
  124. package/out/replicache/src/on-persist-channel.d.ts +10 -0
  125. package/out/replicache/src/on-persist-channel.d.ts.map +1 -0
  126. package/out/replicache/src/patch-operation.d.ts +32 -0
  127. package/out/replicache/src/patch-operation.d.ts.map +1 -0
  128. package/out/replicache/src/pending-mutations.d.ts +14 -0
  129. package/out/replicache/src/pending-mutations.d.ts.map +1 -0
  130. package/out/replicache/src/persist/client-gc.d.ts +17 -0
  131. package/out/replicache/src/persist/client-gc.d.ts.map +1 -0
  132. package/out/replicache/src/persist/client-group-gc.d.ts +10 -0
  133. package/out/replicache/src/persist/client-group-gc.d.ts.map +1 -0
  134. package/out/replicache/src/persist/client-groups.d.ts +72 -0
  135. package/out/replicache/src/persist/client-groups.d.ts.map +1 -0
  136. package/out/replicache/src/persist/clients.d.ts +155 -0
  137. package/out/replicache/src/persist/clients.d.ts.map +1 -0
  138. package/out/replicache/src/persist/collect-idb-databases.d.ts +91 -0
  139. package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -0
  140. package/out/replicache/src/persist/gather-mem-only-visitor.d.ts +12 -0
  141. package/out/replicache/src/persist/gather-mem-only-visitor.d.ts.map +1 -0
  142. package/out/replicache/src/persist/gather-not-cached-visitor.d.ts +17 -0
  143. package/out/replicache/src/persist/gather-not-cached-visitor.d.ts.map +1 -0
  144. package/out/replicache/src/persist/heartbeat.d.ts +9 -0
  145. package/out/replicache/src/persist/heartbeat.d.ts.map +1 -0
  146. package/out/replicache/src/persist/idb-databases-store-db-name.d.ts +5 -0
  147. package/out/replicache/src/persist/idb-databases-store-db-name.d.ts.map +1 -0
  148. package/out/replicache/src/persist/idb-databases-store.d.ts +24 -0
  149. package/out/replicache/src/persist/idb-databases-store.d.ts.map +1 -0
  150. package/out/replicache/src/persist/make-client-id.d.ts +6 -0
  151. package/out/replicache/src/persist/make-client-id.d.ts.map +1 -0
  152. package/out/replicache/src/persist/persist.d.ts +26 -0
  153. package/out/replicache/src/persist/persist.d.ts.map +1 -0
  154. package/out/replicache/src/persist/refresh.d.ts +13 -0
  155. package/out/replicache/src/persist/refresh.d.ts.map +1 -0
  156. package/out/replicache/src/process-scheduler.d.ts +20 -0
  157. package/out/replicache/src/process-scheduler.d.ts.map +1 -0
  158. package/out/replicache/src/puller.d.ts +61 -0
  159. package/out/replicache/src/puller.d.ts.map +1 -0
  160. package/out/replicache/src/pusher.d.ts +33 -0
  161. package/out/replicache/src/pusher.d.ts.map +1 -0
  162. package/out/replicache/src/replicache-impl.d.ts +321 -0
  163. package/out/replicache/src/replicache-impl.d.ts.map +1 -0
  164. package/out/replicache/src/replicache-options.d.ts +209 -0
  165. package/out/replicache/src/replicache-options.d.ts.map +1 -0
  166. package/out/replicache/src/replicache.d.ts +298 -0
  167. package/out/replicache/src/replicache.d.ts.map +1 -0
  168. package/out/replicache/src/request-idle.d.ts +6 -0
  169. package/out/replicache/src/request-idle.d.ts.map +1 -0
  170. package/out/replicache/src/scan-iterator.d.ts +127 -0
  171. package/out/replicache/src/scan-iterator.d.ts.map +1 -0
  172. package/out/replicache/src/scan-options.d.ts +67 -0
  173. package/out/replicache/src/scan-options.d.ts.map +1 -0
  174. package/out/replicache/src/set-interval-with-signal.d.ts +2 -0
  175. package/out/replicache/src/set-interval-with-signal.d.ts.map +1 -0
  176. package/out/replicache/src/size-of-value.d.ts +19 -0
  177. package/out/replicache/src/size-of-value.d.ts.map +1 -0
  178. package/out/replicache/src/subscriptions.d.ts +140 -0
  179. package/out/replicache/src/subscriptions.d.ts.map +1 -0
  180. package/out/replicache/src/sync/diff.d.ts +31 -0
  181. package/out/replicache/src/sync/diff.d.ts.map +1 -0
  182. package/out/replicache/src/sync/ids.d.ts +13 -0
  183. package/out/replicache/src/sync/ids.d.ts.map +1 -0
  184. package/out/replicache/src/sync/patch.d.ts +5 -0
  185. package/out/replicache/src/sync/patch.d.ts.map +1 -0
  186. package/out/replicache/src/sync/pull-error.d.ts +9 -0
  187. package/out/replicache/src/sync/pull-error.d.ts.map +1 -0
  188. package/out/replicache/src/sync/pull.d.ts +82 -0
  189. package/out/replicache/src/sync/pull.d.ts.map +1 -0
  190. package/out/replicache/src/sync/push.d.ts +65 -0
  191. package/out/replicache/src/sync/push.d.ts.map +1 -0
  192. package/out/replicache/src/sync/request-id.d.ts +10 -0
  193. package/out/replicache/src/sync/request-id.d.ts.map +1 -0
  194. package/out/replicache/src/sync/sync-head-name.d.ts +2 -0
  195. package/out/replicache/src/sync/sync-head-name.d.ts.map +1 -0
  196. package/out/replicache/src/test-license-key.d.ts +3 -0
  197. package/out/replicache/src/test-license-key.d.ts.map +1 -0
  198. package/out/replicache/src/to-error.d.ts +2 -0
  199. package/out/replicache/src/to-error.d.ts.map +1 -0
  200. package/out/replicache/src/transaction-closed-error.d.ts +12 -0
  201. package/out/replicache/src/transaction-closed-error.d.ts.map +1 -0
  202. package/out/replicache/src/transactions.d.ts +156 -0
  203. package/out/replicache/src/transactions.d.ts.map +1 -0
  204. package/out/replicache/src/types.d.ts +57 -0
  205. package/out/replicache/src/types.d.ts.map +1 -0
  206. package/out/replicache/src/version.d.ts +5 -0
  207. package/out/replicache/src/version.d.ts.map +1 -0
  208. package/out/replicache/src/with-transactions.d.ts +23 -0
  209. package/out/replicache/src/with-transactions.d.ts.map +1 -0
  210. package/out/shared/src/abort-error.d.ts +4 -0
  211. package/out/shared/src/abort-error.d.ts.map +1 -0
  212. package/out/shared/src/abort-error.js +4 -0
  213. package/out/shared/src/abort-error.js.map +1 -0
  214. package/out/shared/src/asserts.d.ts +17 -0
  215. package/out/shared/src/asserts.d.ts.map +1 -0
  216. package/out/shared/src/asserts.js +73 -0
  217. package/out/shared/src/asserts.js.map +1 -0
  218. package/out/shared/src/browser-env.d.ts +3 -0
  219. package/out/shared/src/browser-env.d.ts.map +1 -0
  220. package/out/shared/src/config.d.ts +3 -0
  221. package/out/shared/src/config.d.ts.map +1 -0
  222. package/out/shared/src/config.js +3 -0
  223. package/out/shared/src/config.js.map +1 -0
  224. package/out/shared/src/custom-key-map.d.ts +26 -0
  225. package/out/shared/src/custom-key-map.d.ts.map +1 -0
  226. package/out/shared/src/custom-key-map.js +65 -0
  227. package/out/shared/src/custom-key-map.js.map +1 -0
  228. package/out/shared/src/deep-clone.d.ts +4 -0
  229. package/out/shared/src/deep-clone.d.ts.map +1 -0
  230. package/out/shared/src/document-visible.d.ts +9 -0
  231. package/out/shared/src/document-visible.d.ts.map +1 -0
  232. package/out/shared/src/has-own.d.ts +5 -0
  233. package/out/shared/src/has-own.d.ts.map +1 -0
  234. package/out/shared/src/has-own.js +8 -0
  235. package/out/shared/src/has-own.js.map +1 -0
  236. package/out/shared/src/immutable.d.ts +11 -0
  237. package/out/shared/src/immutable.d.ts.map +1 -0
  238. package/out/shared/src/iterables.d.ts +11 -0
  239. package/out/shared/src/iterables.d.ts.map +1 -0
  240. package/out/shared/src/json-schema.d.ts +5 -0
  241. package/out/shared/src/json-schema.d.ts.map +1 -0
  242. package/out/shared/src/json-schema.js +36 -0
  243. package/out/shared/src/json-schema.js.map +1 -0
  244. package/out/shared/src/json.d.ts +55 -0
  245. package/out/shared/src/json.d.ts.map +1 -0
  246. package/out/shared/src/json.js +164 -0
  247. package/out/shared/src/json.js.map +1 -0
  248. package/out/shared/src/must.d.ts +2 -0
  249. package/out/shared/src/must.d.ts.map +1 -0
  250. package/out/shared/src/must.js +8 -0
  251. package/out/shared/src/must.js.map +1 -0
  252. package/out/shared/src/navigator.d.ts +7 -0
  253. package/out/shared/src/navigator.d.ts.map +1 -0
  254. package/out/shared/src/parse-big-int.d.ts +2 -0
  255. package/out/shared/src/parse-big-int.d.ts.map +1 -0
  256. package/out/shared/src/parse-big-int.js +11 -0
  257. package/out/shared/src/parse-big-int.js.map +1 -0
  258. package/out/shared/src/queue.d.ts +40 -0
  259. package/out/shared/src/queue.d.ts.map +1 -0
  260. package/out/shared/src/queue.js +118 -0
  261. package/out/shared/src/queue.js.map +1 -0
  262. package/out/shared/src/rand.d.ts +7 -0
  263. package/out/shared/src/rand.d.ts.map +1 -0
  264. package/out/shared/src/rand.js +11 -0
  265. package/out/shared/src/rand.js.map +1 -0
  266. package/out/shared/src/random-uint64.d.ts +2 -0
  267. package/out/shared/src/random-uint64.d.ts.map +1 -0
  268. package/out/shared/src/random-values.d.ts +2 -0
  269. package/out/shared/src/random-values.d.ts.map +1 -0
  270. package/out/shared/src/resolved-promises.d.ts +5 -0
  271. package/out/shared/src/resolved-promises.d.ts.map +1 -0
  272. package/out/shared/src/resolved-promises.js +5 -0
  273. package/out/shared/src/resolved-promises.js.map +1 -0
  274. package/out/shared/src/set-utils.d.ts +9 -0
  275. package/out/shared/src/set-utils.d.ts.map +1 -0
  276. package/out/shared/src/set-utils.js +60 -0
  277. package/out/shared/src/set-utils.js.map +1 -0
  278. package/out/shared/src/sleep.d.ts +15 -0
  279. package/out/shared/src/sleep.d.ts.map +1 -0
  280. package/out/shared/src/sleep.js +54 -0
  281. package/out/shared/src/sleep.js.map +1 -0
  282. package/out/shared/src/string-compare.d.ts +2 -0
  283. package/out/shared/src/string-compare.d.ts.map +1 -0
  284. package/out/shared/src/string-compare.js +10 -0
  285. package/out/shared/src/string-compare.js.map +1 -0
  286. package/out/shared/src/types.d.ts +2 -0
  287. package/out/shared/src/types.d.ts.map +1 -0
  288. package/out/shared/src/valita.d.ts +27 -0
  289. package/out/shared/src/valita.d.ts.map +1 -0
  290. package/out/shared/src/valita.js +118 -0
  291. package/out/shared/src/valita.js.map +1 -0
  292. package/out/shared/src/xxhash.d.ts +3 -0
  293. package/out/shared/src/xxhash.d.ts.map +1 -0
  294. package/out/shared/src/xxhash.js +4 -0
  295. package/out/shared/src/xxhash.js.map +1 -0
  296. package/out/zero/src/cli.d.ts +3 -0
  297. package/out/zero/src/cli.d.ts.map +1 -0
  298. package/out/zero/src/cli.js +3 -0
  299. package/out/zero/src/cli.js.map +1 -0
  300. package/out/zero/src/react.d.ts +2 -0
  301. package/out/zero/src/react.d.ts.map +1 -0
  302. package/out/zero/src/server/change-streamer.d.ts +2 -0
  303. package/out/zero/src/server/change-streamer.d.ts.map +1 -0
  304. package/out/zero/src/server/change-streamer.js +2 -0
  305. package/out/zero/src/server/change-streamer.js.map +1 -0
  306. package/out/zero/src/server/main.d.ts +2 -0
  307. package/out/zero/src/server/main.d.ts.map +1 -0
  308. package/out/zero/src/server/main.js +2 -0
  309. package/out/zero/src/server/main.js.map +1 -0
  310. package/out/zero/src/server/replicator.d.ts +2 -0
  311. package/out/zero/src/server/replicator.d.ts.map +1 -0
  312. package/out/zero/src/server/replicator.js +2 -0
  313. package/out/zero/src/server/replicator.js.map +1 -0
  314. package/out/zero/src/server/syncer.d.ts +2 -0
  315. package/out/zero/src/server/syncer.d.ts.map +1 -0
  316. package/out/zero/src/server/syncer.js +2 -0
  317. package/out/zero/src/server/syncer.js.map +1 -0
  318. package/out/zero/src/zero.d.ts +2 -0
  319. package/out/zero/src/zero.d.ts.map +1 -0
  320. package/out/zero-cache/src/config/zero-config.d.ts +1509 -0
  321. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -0
  322. package/out/zero-cache/src/config/zero-config.js +227 -0
  323. package/out/zero-cache/src/config/zero-config.js.map +1 -0
  324. package/out/zero-cache/src/db/lite-tables.d.ts +5 -0
  325. package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -0
  326. package/out/zero-cache/src/db/lite-tables.js +75 -0
  327. package/out/zero-cache/src/db/lite-tables.js.map +1 -0
  328. package/out/zero-cache/src/db/migration-lite.d.ts +38 -0
  329. package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -0
  330. package/out/zero-cache/src/db/migration-lite.js +161 -0
  331. package/out/zero-cache/src/db/migration-lite.js.map +1 -0
  332. package/out/zero-cache/src/db/migration.d.ts +38 -0
  333. package/out/zero-cache/src/db/migration.d.ts.map +1 -0
  334. package/out/zero-cache/src/db/migration.js +139 -0
  335. package/out/zero-cache/src/db/migration.js.map +1 -0
  336. package/out/zero-cache/src/db/statements.d.ts +31 -0
  337. package/out/zero-cache/src/db/statements.d.ts.map +1 -0
  338. package/out/zero-cache/src/db/statements.js +48 -0
  339. package/out/zero-cache/src/db/statements.js.map +1 -0
  340. package/out/zero-cache/src/db/transaction-pool.d.ts +187 -0
  341. package/out/zero-cache/src/db/transaction-pool.d.ts.map +1 -0
  342. package/out/zero-cache/src/db/transaction-pool.js +445 -0
  343. package/out/zero-cache/src/db/transaction-pool.js.map +1 -0
  344. package/out/zero-cache/src/server/change-streamer.d.ts +3 -0
  345. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -0
  346. package/out/zero-cache/src/server/change-streamer.js +30 -0
  347. package/out/zero-cache/src/server/change-streamer.js.map +1 -0
  348. package/out/zero-cache/src/server/logging.d.ts +6 -0
  349. package/out/zero-cache/src/server/logging.d.ts.map +1 -0
  350. package/out/zero-cache/src/server/logging.js +23 -0
  351. package/out/zero-cache/src/server/logging.js.map +1 -0
  352. package/out/zero-cache/src/server/main.d.ts +2 -0
  353. package/out/zero-cache/src/server/main.d.ts.map +1 -0
  354. package/out/zero-cache/src/server/main.js +92 -0
  355. package/out/zero-cache/src/server/main.js.map +1 -0
  356. package/out/zero-cache/src/server/replicator.d.ts +3 -0
  357. package/out/zero-cache/src/server/replicator.d.ts.map +1 -0
  358. package/out/zero-cache/src/server/replicator.js +35 -0
  359. package/out/zero-cache/src/server/replicator.js.map +1 -0
  360. package/out/zero-cache/src/server/syncer.d.ts +3 -0
  361. package/out/zero-cache/src/server/syncer.d.ts.map +1 -0
  362. package/out/zero-cache/src/server/syncer.js +45 -0
  363. package/out/zero-cache/src/server/syncer.js.map +1 -0
  364. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +23 -0
  365. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -0
  366. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +98 -0
  367. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -0
  368. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +39 -0
  369. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -0
  370. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +212 -0
  371. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -0
  372. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +110 -0
  373. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -0
  374. package/out/zero-cache/src/services/change-streamer/change-streamer.js +7 -0
  375. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -0
  376. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts +19 -0
  377. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -0
  378. package/out/zero-cache/src/services/change-streamer/forwarder.js +56 -0
  379. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -0
  380. package/out/zero-cache/src/services/change-streamer/pg/change-source.d.ts +14 -0
  381. package/out/zero-cache/src/services/change-streamer/pg/change-source.d.ts.map +1 -0
  382. package/out/zero-cache/src/services/change-streamer/pg/change-source.js +206 -0
  383. package/out/zero-cache/src/services/change-streamer/pg/change-source.js.map +1 -0
  384. package/out/zero-cache/src/services/change-streamer/pg/initial-sync.d.ts +6 -0
  385. package/out/zero-cache/src/services/change-streamer/pg/initial-sync.d.ts.map +1 -0
  386. package/out/zero-cache/src/services/change-streamer/pg/initial-sync.js +192 -0
  387. package/out/zero-cache/src/services/change-streamer/pg/initial-sync.js.map +1 -0
  388. package/out/zero-cache/src/services/change-streamer/pg/lsn.d.ts +17 -0
  389. package/out/zero-cache/src/services/change-streamer/pg/lsn.d.ts.map +1 -0
  390. package/out/zero-cache/src/services/change-streamer/pg/lsn.js +17 -0
  391. package/out/zero-cache/src/services/change-streamer/pg/lsn.js.map +1 -0
  392. package/out/zero-cache/src/services/change-streamer/pg/schema/create.d.ts +6 -0
  393. package/out/zero-cache/src/services/change-streamer/pg/schema/create.d.ts.map +1 -0
  394. package/out/zero-cache/src/services/change-streamer/pg/schema/create.js +29 -0
  395. package/out/zero-cache/src/services/change-streamer/pg/schema/create.js.map +1 -0
  396. package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.d.ts +79 -0
  397. package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.d.ts.map +1 -0
  398. package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.js +237 -0
  399. package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.js.map +1 -0
  400. package/out/zero-cache/src/services/change-streamer/pg/schema/lite.d.ts +5 -0
  401. package/out/zero-cache/src/services/change-streamer/pg/schema/lite.d.ts.map +1 -0
  402. package/out/zero-cache/src/services/change-streamer/pg/schema/lite.js +111 -0
  403. package/out/zero-cache/src/services/change-streamer/pg/schema/lite.js.map +1 -0
  404. package/out/zero-cache/src/services/change-streamer/pg/schema/published.d.ts +26 -0
  405. package/out/zero-cache/src/services/change-streamer/pg/schema/published.d.ts.map +1 -0
  406. package/out/zero-cache/src/services/change-streamer/pg/schema/published.js +185 -0
  407. package/out/zero-cache/src/services/change-streamer/pg/schema/published.js.map +1 -0
  408. package/out/zero-cache/src/services/change-streamer/pg/schema/zero.d.ts +11 -0
  409. package/out/zero-cache/src/services/change-streamer/pg/schema/zero.d.ts.map +1 -0
  410. package/out/zero-cache/src/services/change-streamer/pg/schema/zero.js +86 -0
  411. package/out/zero-cache/src/services/change-streamer/pg/schema/zero.js.map +1 -0
  412. package/out/zero-cache/src/services/change-streamer/pg/shard-config.d.ts +19 -0
  413. package/out/zero-cache/src/services/change-streamer/pg/shard-config.d.ts.map +1 -0
  414. package/out/zero-cache/src/services/change-streamer/pg/shard-config.js +2 -0
  415. package/out/zero-cache/src/services/change-streamer/pg/shard-config.js.map +1 -0
  416. package/out/zero-cache/src/services/change-streamer/pg/sync-schema.d.ts +4 -0
  417. package/out/zero-cache/src/services/change-streamer/pg/sync-schema.d.ts.map +1 -0
  418. package/out/zero-cache/src/services/change-streamer/pg/sync-schema.js +12 -0
  419. package/out/zero-cache/src/services/change-streamer/pg/sync-schema.js.map +1 -0
  420. package/out/zero-cache/src/services/change-streamer/schema/change.d.ts +31 -0
  421. package/out/zero-cache/src/services/change-streamer/schema/change.d.ts.map +1 -0
  422. package/out/zero-cache/src/services/change-streamer/schema/change.js +2 -0
  423. package/out/zero-cache/src/services/change-streamer/schema/change.js.map +1 -0
  424. package/out/zero-cache/src/services/change-streamer/schema/init.d.ts +4 -0
  425. package/out/zero-cache/src/services/change-streamer/schema/init.d.ts.map +1 -0
  426. package/out/zero-cache/src/services/change-streamer/schema/init.js +10 -0
  427. package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -0
  428. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +22 -0
  429. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -0
  430. package/out/zero-cache/src/services/change-streamer/schema/tables.js +49 -0
  431. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -0
  432. package/out/zero-cache/src/services/change-streamer/storer.d.ts +22 -0
  433. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -0
  434. package/out/zero-cache/src/services/change-streamer/storer.js +157 -0
  435. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -0
  436. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +27 -0
  437. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -0
  438. package/out/zero-cache/src/services/change-streamer/subscriber.js +70 -0
  439. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -0
  440. package/out/zero-cache/src/services/dispatcher/connect-params.d.ts +20 -0
  441. package/out/zero-cache/src/services/dispatcher/connect-params.d.ts.map +1 -0
  442. package/out/zero-cache/src/services/dispatcher/connect-params.js +36 -0
  443. package/out/zero-cache/src/services/dispatcher/connect-params.js.map +1 -0
  444. package/out/zero-cache/src/services/dispatcher/dispatcher.d.ts +19 -0
  445. package/out/zero-cache/src/services/dispatcher/dispatcher.d.ts.map +1 -0
  446. package/out/zero-cache/src/services/dispatcher/dispatcher.js +55 -0
  447. package/out/zero-cache/src/services/dispatcher/dispatcher.js.map +1 -0
  448. package/out/zero-cache/src/services/dispatcher/websocket-handoff.d.ts +11 -0
  449. package/out/zero-cache/src/services/dispatcher/websocket-handoff.d.ts.map +1 -0
  450. package/out/zero-cache/src/services/dispatcher/websocket-handoff.js +33 -0
  451. package/out/zero-cache/src/services/dispatcher/websocket-handoff.js.map +1 -0
  452. package/out/zero-cache/src/services/limiter/sliding-window-limiter.d.ts +57 -0
  453. package/out/zero-cache/src/services/limiter/sliding-window-limiter.d.ts.map +1 -0
  454. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js +130 -0
  455. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js.map +1 -0
  456. package/out/zero-cache/src/services/mutagen/mutagen.d.ts +24 -0
  457. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -0
  458. package/out/zero-cache/src/services/mutagen/mutagen.js +247 -0
  459. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -0
  460. package/out/zero-cache/src/services/mutagen/write-authorizer.d.ts +20 -0
  461. package/out/zero-cache/src/services/mutagen/write-authorizer.d.ts.map +1 -0
  462. package/out/zero-cache/src/services/mutagen/write-authorizer.js +187 -0
  463. package/out/zero-cache/src/services/mutagen/write-authorizer.js.map +1 -0
  464. package/out/zero-cache/src/services/replicator/checkpointer.d.ts +79 -0
  465. package/out/zero-cache/src/services/replicator/checkpointer.d.ts.map +1 -0
  466. package/out/zero-cache/src/services/replicator/checkpointer.js +124 -0
  467. package/out/zero-cache/src/services/replicator/checkpointer.js.map +1 -0
  468. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +39 -0
  469. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -0
  470. package/out/zero-cache/src/services/replicator/incremental-sync.js +342 -0
  471. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -0
  472. package/out/zero-cache/src/services/replicator/notifier.d.ts +30 -0
  473. package/out/zero-cache/src/services/replicator/notifier.d.ts.map +1 -0
  474. package/out/zero-cache/src/services/replicator/notifier.js +54 -0
  475. package/out/zero-cache/src/services/replicator/notifier.js.map +1 -0
  476. package/out/zero-cache/src/services/replicator/replicator.d.ts +65 -0
  477. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -0
  478. package/out/zero-cache/src/services/replicator/replicator.js +27 -0
  479. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -0
  480. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts +35 -0
  481. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts.map +1 -0
  482. package/out/zero-cache/src/services/replicator/schema/change-log.js +78 -0
  483. package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -0
  484. package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts +25 -0
  485. package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts.map +1 -0
  486. package/out/zero-cache/src/services/replicator/schema/replication-state.js +90 -0
  487. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -0
  488. package/out/zero-cache/src/services/runner.d.ts +21 -0
  489. package/out/zero-cache/src/services/runner.d.ts.map +1 -0
  490. package/out/zero-cache/src/services/runner.js +63 -0
  491. package/out/zero-cache/src/services/runner.js.map +1 -0
  492. package/out/zero-cache/src/services/running-state.d.ts +56 -0
  493. package/out/zero-cache/src/services/running-state.d.ts.map +1 -0
  494. package/out/zero-cache/src/services/running-state.js +106 -0
  495. package/out/zero-cache/src/services/running-state.js.map +1 -0
  496. package/out/zero-cache/src/services/service.d.ts +29 -0
  497. package/out/zero-cache/src/services/service.d.ts.map +1 -0
  498. package/out/zero-cache/src/services/service.js +2 -0
  499. package/out/zero-cache/src/services/service.js.map +1 -0
  500. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +53 -0
  501. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -0
  502. package/out/zero-cache/src/services/view-syncer/client-handler.js +184 -0
  503. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -0
  504. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +44 -0
  505. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -0
  506. package/out/zero-cache/src/services/view-syncer/cvr-store.js +386 -0
  507. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -0
  508. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +146 -0
  509. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -0
  510. package/out/zero-cache/src/services/view-syncer/cvr.js +446 -0
  511. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -0
  512. package/out/zero-cache/src/services/view-syncer/database-storage.d.ts +22 -0
  513. package/out/zero-cache/src/services/view-syncer/database-storage.d.ts.map +1 -0
  514. package/out/zero-cache/src/services/view-syncer/database-storage.js +129 -0
  515. package/out/zero-cache/src/services/view-syncer/database-storage.js.map +1 -0
  516. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +103 -0
  517. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -0
  518. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +290 -0
  519. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -0
  520. package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts +54 -0
  521. package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts.map +1 -0
  522. package/out/zero-cache/src/services/view-syncer/schema/cvr.js +181 -0
  523. package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -0
  524. package/out/zero-cache/src/services/view-syncer/schema/pg-migrations.d.ts +4 -0
  525. package/out/zero-cache/src/services/view-syncer/schema/pg-migrations.d.ts.map +1 -0
  526. package/out/zero-cache/src/services/view-syncer/schema/pg-migrations.js +12 -0
  527. package/out/zero-cache/src/services/view-syncer/schema/pg-migrations.js.map +1 -0
  528. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +783 -0
  529. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +1 -0
  530. package/out/zero-cache/src/services/view-syncer/schema/types.js +213 -0
  531. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -0
  532. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +166 -0
  533. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -0
  534. package/out/zero-cache/src/services/view-syncer/snapshotter.js +374 -0
  535. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -0
  536. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +37 -0
  537. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -0
  538. package/out/zero-cache/src/services/view-syncer/view-syncer.js +522 -0
  539. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -0
  540. package/out/zero-cache/src/types/bigint-json.d.ts +26 -0
  541. package/out/zero-cache/src/types/bigint-json.d.ts.map +1 -0
  542. package/out/zero-cache/src/types/bigint-json.js +49 -0
  543. package/out/zero-cache/src/types/bigint-json.js.map +1 -0
  544. package/out/zero-cache/src/types/error-for-client.d.ts +7 -0
  545. package/out/zero-cache/src/types/error-for-client.d.ts.map +1 -0
  546. package/out/zero-cache/src/types/error-for-client.js +17 -0
  547. package/out/zero-cache/src/types/error-for-client.js.map +1 -0
  548. package/out/zero-cache/src/types/lexi-version.d.ts +29 -0
  549. package/out/zero-cache/src/types/lexi-version.d.ts.map +1 -0
  550. package/out/zero-cache/src/types/lexi-version.js +36 -0
  551. package/out/zero-cache/src/types/lexi-version.js.map +1 -0
  552. package/out/zero-cache/src/types/lite.d.ts +11 -0
  553. package/out/zero-cache/src/types/lite.d.ts.map +1 -0
  554. package/out/zero-cache/src/types/lite.js +26 -0
  555. package/out/zero-cache/src/types/lite.js.map +1 -0
  556. package/out/zero-cache/src/types/names.d.ts +5 -0
  557. package/out/zero-cache/src/types/names.d.ts.map +1 -0
  558. package/out/zero-cache/src/types/names.js +4 -0
  559. package/out/zero-cache/src/types/names.js.map +1 -0
  560. package/out/zero-cache/src/types/pg.d.ts +31 -0
  561. package/out/zero-cache/src/types/pg.d.ts.map +1 -0
  562. package/out/zero-cache/src/types/pg.js +60 -0
  563. package/out/zero-cache/src/types/pg.js.map +1 -0
  564. package/out/zero-cache/src/types/processes.d.ts +57 -0
  565. package/out/zero-cache/src/types/processes.d.ts.map +1 -0
  566. package/out/zero-cache/src/types/processes.js +121 -0
  567. package/out/zero-cache/src/types/processes.js.map +1 -0
  568. package/out/zero-cache/src/types/row-key.d.ts +37 -0
  569. package/out/zero-cache/src/types/row-key.d.ts.map +1 -0
  570. package/out/zero-cache/src/types/row-key.js +64 -0
  571. package/out/zero-cache/src/types/row-key.js.map +1 -0
  572. package/out/zero-cache/src/types/satisfies.d.ts +14 -0
  573. package/out/zero-cache/src/types/satisfies.d.ts.map +1 -0
  574. package/out/zero-cache/src/types/satisfies.js +2 -0
  575. package/out/zero-cache/src/types/satisfies.js.map +1 -0
  576. package/out/zero-cache/src/types/specs.d.ts +29 -0
  577. package/out/zero-cache/src/types/specs.d.ts.map +1 -0
  578. package/out/zero-cache/src/types/specs.js +2 -0
  579. package/out/zero-cache/src/types/specs.js.map +1 -0
  580. package/out/zero-cache/src/types/sql.d.ts +11 -0
  581. package/out/zero-cache/src/types/sql.d.ts.map +1 -0
  582. package/out/zero-cache/src/types/sql.js +15 -0
  583. package/out/zero-cache/src/types/sql.js.map +1 -0
  584. package/out/zero-cache/src/types/streams.d.ts +33 -0
  585. package/out/zero-cache/src/types/streams.d.ts.map +1 -0
  586. package/out/zero-cache/src/types/streams.js +141 -0
  587. package/out/zero-cache/src/types/streams.js.map +1 -0
  588. package/out/zero-cache/src/types/subscription.d.ts +158 -0
  589. package/out/zero-cache/src/types/subscription.d.ts.map +1 -0
  590. package/out/zero-cache/src/types/subscription.js +233 -0
  591. package/out/zero-cache/src/types/subscription.js.map +1 -0
  592. package/out/zero-cache/src/types/timeout.d.ts +11 -0
  593. package/out/zero-cache/src/types/timeout.d.ts.map +1 -0
  594. package/out/zero-cache/src/types/timeout.js +23 -0
  595. package/out/zero-cache/src/types/timeout.js.map +1 -0
  596. package/out/zero-cache/src/types/url-params.d.ts +10 -0
  597. package/out/zero-cache/src/types/url-params.d.ts.map +1 -0
  598. package/out/zero-cache/src/types/url-params.js +35 -0
  599. package/out/zero-cache/src/types/url-params.js.map +1 -0
  600. package/out/zero-cache/src/workers/connection.d.ts +25 -0
  601. package/out/zero-cache/src/workers/connection.d.ts.map +1 -0
  602. package/out/zero-cache/src/workers/connection.js +189 -0
  603. package/out/zero-cache/src/workers/connection.js.map +1 -0
  604. package/out/zero-cache/src/workers/replicator.d.ts +17 -0
  605. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -0
  606. package/out/zero-cache/src/workers/replicator.js +105 -0
  607. package/out/zero-cache/src/workers/replicator.js.map +1 -0
  608. package/out/zero-cache/src/workers/syncer.d.ts +28 -0
  609. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -0
  610. package/out/zero-cache/src/workers/syncer.js +72 -0
  611. package/out/zero-cache/src/workers/syncer.js.map +1 -0
  612. package/out/zero-client/src/client/context.d.ts +23 -0
  613. package/out/zero-client/src/client/context.d.ts.map +1 -0
  614. package/out/zero-client/src/client/crud.d.ts +52 -0
  615. package/out/zero-client/src/client/crud.d.ts.map +1 -0
  616. package/out/zero-client/src/client/enable-analytics.d.ts +3 -0
  617. package/out/zero-client/src/client/enable-analytics.d.ts.map +1 -0
  618. package/out/zero-client/src/client/http-string.d.ts +7 -0
  619. package/out/zero-client/src/client/http-string.d.ts.map +1 -0
  620. package/out/zero-client/src/client/keys.d.ts +11 -0
  621. package/out/zero-client/src/client/keys.d.ts.map +1 -0
  622. package/out/zero-client/src/client/log-options.d.ts +12 -0
  623. package/out/zero-client/src/client/log-options.d.ts.map +1 -0
  624. package/out/zero-client/src/client/metrics.d.ts +115 -0
  625. package/out/zero-client/src/client/metrics.d.ts.map +1 -0
  626. package/out/zero-client/src/client/options.d.ts +94 -0
  627. package/out/zero-client/src/client/options.d.ts.map +1 -0
  628. package/out/zero-client/src/client/query-manager.d.ts +16 -0
  629. package/out/zero-client/src/client/query-manager.d.ts.map +1 -0
  630. package/out/zero-client/src/client/reload-error-handler.d.ts +5 -0
  631. package/out/zero-client/src/client/reload-error-handler.d.ts.map +1 -0
  632. package/out/zero-client/src/client/replicache-types.d.ts +48 -0
  633. package/out/zero-client/src/client/replicache-types.d.ts.map +1 -0
  634. package/out/zero-client/src/client/server-error.d.ts +12 -0
  635. package/out/zero-client/src/client/server-error.d.ts.map +1 -0
  636. package/out/zero-client/src/client/server-option.d.ts +3 -0
  637. package/out/zero-client/src/client/server-option.d.ts.map +1 -0
  638. package/out/zero-client/src/client/version.d.ts +5 -0
  639. package/out/zero-client/src/client/version.d.ts.map +1 -0
  640. package/out/zero-client/src/client/zero-poke-handler.d.ts +28 -0
  641. package/out/zero-client/src/client/zero-poke-handler.d.ts.map +1 -0
  642. package/out/zero-client/src/client/zero.d.ts +183 -0
  643. package/out/zero-client/src/client/zero.d.ts.map +1 -0
  644. package/out/zero-client/src/mod.d.ts +9 -0
  645. package/out/zero-client/src/mod.d.ts.map +1 -0
  646. package/out/zero-client/src/util/nanoid.d.ts +2 -0
  647. package/out/zero-client/src/util/nanoid.d.ts.map +1 -0
  648. package/out/zero-client/src/util/socket.d.ts +3 -0
  649. package/out/zero-client/src/util/socket.d.ts.map +1 -0
  650. package/out/zero-protocol/src/ast.d.ts +69 -0
  651. package/out/zero-protocol/src/ast.d.ts.map +1 -0
  652. package/out/zero-protocol/src/ast.js +64 -0
  653. package/out/zero-protocol/src/ast.js.map +1 -0
  654. package/out/zero-protocol/src/change-desired-queries.d.ts +71 -0
  655. package/out/zero-protocol/src/change-desired-queries.d.ts.map +1 -0
  656. package/out/zero-protocol/src/change-desired-queries.js +10 -0
  657. package/out/zero-protocol/src/change-desired-queries.js.map +1 -0
  658. package/out/zero-protocol/src/clients-patch.d.ts +37 -0
  659. package/out/zero-protocol/src/clients-patch.d.ts.map +1 -0
  660. package/out/zero-protocol/src/clients-patch.js +15 -0
  661. package/out/zero-protocol/src/clients-patch.js.map +1 -0
  662. package/out/zero-protocol/src/connect.d.ts +88 -0
  663. package/out/zero-protocol/src/connect.d.ts.map +1 -0
  664. package/out/zero-protocol/src/connect.js +25 -0
  665. package/out/zero-protocol/src/connect.js.map +1 -0
  666. package/out/zero-protocol/src/delete-clients.d.ts +11 -0
  667. package/out/zero-protocol/src/delete-clients.d.ts.map +1 -0
  668. package/out/zero-protocol/src/delete-clients.js +9 -0
  669. package/out/zero-protocol/src/delete-clients.js.map +1 -0
  670. package/out/zero-protocol/src/down.d.ts +110 -0
  671. package/out/zero-protocol/src/down.d.ts.map +1 -0
  672. package/out/zero-protocol/src/down.js +8 -0
  673. package/out/zero-protocol/src/down.js.map +1 -0
  674. package/out/zero-protocol/src/entities-patch.d.ts +66 -0
  675. package/out/zero-protocol/src/entities-patch.d.ts.map +1 -0
  676. package/out/zero-protocol/src/entities-patch.js +27 -0
  677. package/out/zero-protocol/src/entities-patch.js.map +1 -0
  678. package/out/zero-protocol/src/entity.d.ts +9 -0
  679. package/out/zero-protocol/src/entity.d.ts.map +1 -0
  680. package/out/zero-protocol/src/entity.js +8 -0
  681. package/out/zero-protocol/src/entity.js.map +1 -0
  682. package/out/zero-protocol/src/error.d.ts +19 -0
  683. package/out/zero-protocol/src/error.d.ts.map +1 -0
  684. package/out/zero-protocol/src/error.js +26 -0
  685. package/out/zero-protocol/src/error.js.map +1 -0
  686. package/out/zero-protocol/src/mod.d.ts +16 -0
  687. package/out/zero-protocol/src/mod.d.ts.map +1 -0
  688. package/out/zero-protocol/src/mod.js +16 -0
  689. package/out/zero-protocol/src/mod.js.map +1 -0
  690. package/out/zero-protocol/src/ping.d.ts +6 -0
  691. package/out/zero-protocol/src/ping.d.ts.map +1 -0
  692. package/out/zero-protocol/src/ping.js +4 -0
  693. package/out/zero-protocol/src/ping.js.map +1 -0
  694. package/out/zero-protocol/src/poke.d.ts +236 -0
  695. package/out/zero-protocol/src/poke.d.ts.map +1 -0
  696. package/out/zero-protocol/src/poke.js +69 -0
  697. package/out/zero-protocol/src/poke.js.map +1 -0
  698. package/out/zero-protocol/src/pong.d.ts +6 -0
  699. package/out/zero-protocol/src/pong.d.ts.map +1 -0
  700. package/out/zero-protocol/src/pong.js +4 -0
  701. package/out/zero-protocol/src/pong.js.map +1 -0
  702. package/out/zero-protocol/src/pull.d.ts +26 -0
  703. package/out/zero-protocol/src/pull.d.ts.map +1 -0
  704. package/out/zero-protocol/src/pull.js +24 -0
  705. package/out/zero-protocol/src/pull.js.map +1 -0
  706. package/out/zero-protocol/src/push.d.ts +257 -0
  707. package/out/zero-protocol/src/push.d.ts.map +1 -0
  708. package/out/zero-protocol/src/push.js +77 -0
  709. package/out/zero-protocol/src/push.js.map +1 -0
  710. package/out/zero-protocol/src/queries-patch.d.ts +103 -0
  711. package/out/zero-protocol/src/queries-patch.d.ts.map +1 -0
  712. package/out/zero-protocol/src/queries-patch.js +17 -0
  713. package/out/zero-protocol/src/queries-patch.js.map +1 -0
  714. package/out/zero-protocol/src/up.d.ts +116 -0
  715. package/out/zero-protocol/src/up.d.ts.map +1 -0
  716. package/out/zero-protocol/src/up.js +9 -0
  717. package/out/zero-protocol/src/up.js.map +1 -0
  718. package/out/zero-protocol/src/version.d.ts +6 -0
  719. package/out/zero-protocol/src/version.d.ts.map +1 -0
  720. package/out/zero-protocol/src/version.js +4 -0
  721. package/out/zero-protocol/src/version.js.map +1 -0
  722. package/out/zero-react/src/mod.d.ts +3 -0
  723. package/out/zero-react/src/mod.d.ts.map +1 -0
  724. package/out/zero-react/src/use-query.d.ts +3 -0
  725. package/out/zero-react/src/use-query.d.ts.map +1 -0
  726. package/out/zero-react/src/use-zero.d.ts +8 -0
  727. package/out/zero-react/src/use-zero.d.ts.map +1 -0
  728. package/out/zero.js +7000 -0
  729. package/out/zero.js.map +7 -0
  730. package/out/zql/src/zql/ast/ast.d.ts +84 -0
  731. package/out/zql/src/zql/ast/ast.d.ts.map +1 -0
  732. package/out/zql/src/zql/ast/ast.js +54 -0
  733. package/out/zql/src/zql/ast/ast.js.map +1 -0
  734. package/out/zql/src/zql/builder/builder.d.ts +56 -0
  735. package/out/zql/src/zql/builder/builder.d.ts.map +1 -0
  736. package/out/zql/src/zql/builder/builder.js +112 -0
  737. package/out/zql/src/zql/builder/builder.js.map +1 -0
  738. package/out/zql/src/zql/builder/error.d.ts +3 -0
  739. package/out/zql/src/zql/builder/error.d.ts.map +1 -0
  740. package/out/zql/src/zql/builder/error.js +3 -0
  741. package/out/zql/src/zql/builder/error.js.map +1 -0
  742. package/out/zql/src/zql/builder/filter.d.ts +6 -0
  743. package/out/zql/src/zql/builder/filter.d.ts.map +1 -0
  744. package/out/zql/src/zql/builder/filter.js +53 -0
  745. package/out/zql/src/zql/builder/filter.js.map +1 -0
  746. package/out/zql/src/zql/builder/like.d.ts +3 -0
  747. package/out/zql/src/zql/builder/like.d.ts.map +1 -0
  748. package/out/zql/src/zql/builder/like.js +60 -0
  749. package/out/zql/src/zql/builder/like.js.map +1 -0
  750. package/out/zql/src/zql/ivm/array-view.d.ts +42 -0
  751. package/out/zql/src/zql/ivm/array-view.d.ts.map +1 -0
  752. package/out/zql/src/zql/ivm/change.d.ts +44 -0
  753. package/out/zql/src/zql/ivm/change.d.ts.map +1 -0
  754. package/out/zql/src/zql/ivm/change.js +2 -0
  755. package/out/zql/src/zql/ivm/change.js.map +1 -0
  756. package/out/zql/src/zql/ivm/data.d.ts +72 -0
  757. package/out/zql/src/zql/ivm/data.d.ts.map +1 -0
  758. package/out/zql/src/zql/ivm/data.js +84 -0
  759. package/out/zql/src/zql/ivm/data.js.map +1 -0
  760. package/out/zql/src/zql/ivm/filter.d.ts +27 -0
  761. package/out/zql/src/zql/ivm/filter.d.ts.map +1 -0
  762. package/out/zql/src/zql/ivm/filter.js +60 -0
  763. package/out/zql/src/zql/ivm/filter.js.map +1 -0
  764. package/out/zql/src/zql/ivm/join.d.ts +37 -0
  765. package/out/zql/src/zql/ivm/join.d.ts.map +1 -0
  766. package/out/zql/src/zql/ivm/join.js +228 -0
  767. package/out/zql/src/zql/ivm/join.js.map +1 -0
  768. package/out/zql/src/zql/ivm/lookahead-iterator.d.ts +13 -0
  769. package/out/zql/src/zql/ivm/lookahead-iterator.d.ts.map +1 -0
  770. package/out/zql/src/zql/ivm/lookahead-iterator.js +45 -0
  771. package/out/zql/src/zql/ivm/lookahead-iterator.js.map +1 -0
  772. package/out/zql/src/zql/ivm/maybe-split-and-push-edit-change.d.ts +10 -0
  773. package/out/zql/src/zql/ivm/maybe-split-and-push-edit-change.d.ts.map +1 -0
  774. package/out/zql/src/zql/ivm/maybe-split-and-push-edit-change.js +34 -0
  775. package/out/zql/src/zql/ivm/maybe-split-and-push-edit-change.js.map +1 -0
  776. package/out/zql/src/zql/ivm/memory-source.d.ts +65 -0
  777. package/out/zql/src/zql/ivm/memory-source.d.ts.map +1 -0
  778. package/out/zql/src/zql/ivm/memory-source.js +508 -0
  779. package/out/zql/src/zql/ivm/memory-source.js.map +1 -0
  780. package/out/zql/src/zql/ivm/memory-storage.d.ts +18 -0
  781. package/out/zql/src/zql/ivm/memory-storage.d.ts.map +1 -0
  782. package/out/zql/src/zql/ivm/operator.d.ts +89 -0
  783. package/out/zql/src/zql/ivm/operator.d.ts.map +1 -0
  784. package/out/zql/src/zql/ivm/operator.js +2 -0
  785. package/out/zql/src/zql/ivm/operator.js.map +1 -0
  786. package/out/zql/src/zql/ivm/schema.d.ts +29 -0
  787. package/out/zql/src/zql/ivm/schema.d.ts.map +1 -0
  788. package/out/zql/src/zql/ivm/schema.js +3 -0
  789. package/out/zql/src/zql/ivm/schema.js.map +1 -0
  790. package/out/zql/src/zql/ivm/skip.d.ts +24 -0
  791. package/out/zql/src/zql/ivm/skip.d.ts.map +1 -0
  792. package/out/zql/src/zql/ivm/skip.js +113 -0
  793. package/out/zql/src/zql/ivm/skip.js.map +1 -0
  794. package/out/zql/src/zql/ivm/source.d.ts +57 -0
  795. package/out/zql/src/zql/ivm/source.d.ts.map +1 -0
  796. package/out/zql/src/zql/ivm/source.js +2 -0
  797. package/out/zql/src/zql/ivm/source.js.map +1 -0
  798. package/out/zql/src/zql/ivm/stream.d.ts +11 -0
  799. package/out/zql/src/zql/ivm/stream.d.ts.map +1 -0
  800. package/out/zql/src/zql/ivm/stream.js +19 -0
  801. package/out/zql/src/zql/ivm/stream.js.map +1 -0
  802. package/out/zql/src/zql/ivm/take.d.ts +24 -0
  803. package/out/zql/src/zql/ivm/take.d.ts.map +1 -0
  804. package/out/zql/src/zql/ivm/take.js +453 -0
  805. package/out/zql/src/zql/ivm/take.js.map +1 -0
  806. package/out/zql/src/zql/query/query-impl.d.ts +45 -0
  807. package/out/zql/src/zql/query/query-impl.d.ts.map +1 -0
  808. package/out/zql/src/zql/query/query.d.ts +130 -0
  809. package/out/zql/src/zql/query/query.d.ts.map +1 -0
  810. package/out/zql/src/zql/query/schema.d.ts +53 -0
  811. package/out/zql/src/zql/query/schema.d.ts.map +1 -0
  812. package/out/zql/src/zql/query/typed-view.d.ts +10 -0
  813. package/out/zql/src/zql/query/typed-view.d.ts.map +1 -0
  814. package/out/zqlite/src/db.d.ts +23 -0
  815. package/out/zqlite/src/db.d.ts.map +1 -0
  816. package/out/zqlite/src/db.js +117 -0
  817. package/out/zqlite/src/db.js.map +1 -0
  818. package/out/zqlite/src/internal/sql.d.ts +9 -0
  819. package/out/zqlite/src/internal/sql.d.ts.map +1 -0
  820. package/out/zqlite/src/internal/sql.js +14 -0
  821. package/out/zqlite/src/internal/sql.js.map +1 -0
  822. package/out/zqlite/src/internal/statement-cache.d.ts +67 -0
  823. package/out/zqlite/src/internal/statement-cache.d.ts.map +1 -0
  824. package/out/zqlite/src/internal/statement-cache.js +119 -0
  825. package/out/zqlite/src/internal/statement-cache.js.map +1 -0
  826. package/out/zqlite/src/table-source.d.ts +43 -0
  827. package/out/zqlite/src/table-source.d.ts.map +1 -0
  828. package/out/zqlite/src/table-source.js +393 -0
  829. package/out/zqlite/src/table-source.js.map +1 -0
  830. package/package.json +79 -0
  831. package/tool/install-sqlite3.js +37 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../zero-client/src/mod.ts", "../../shared/src/asserts.ts", "../../shared/src/must.ts", "../../zql/src/zql/ivm/maybe-split-and-push-edit-change.ts", "../../zql/src/zql/ivm/filter.ts", "../../zql/src/zql/ivm/data.ts", "../../zql/src/zql/ivm/stream.ts", "../../zql/src/zql/ivm/join.ts", "../../zql/src/zql/ivm/skip.ts", "../../zql/src/zql/ivm/take.ts", "../../zql/src/zql/builder/like.ts", "../../zql/src/zql/builder/filter.ts", "../../zql/src/zql/builder/error.ts", "../../zql/src/zql/builder/builder.ts", "../../zql/src/zql/ivm/array-view.ts", "../../zql/src/zql/query/schema.ts", "../../zql/src/zql/query/query-impl.ts", "../../zero-client/src/client/zero.ts", "../../shared/src/browser-env.ts", "../../shared/src/document-visible.ts", "../../shared/src/navigator.ts", "../../shared/src/sleep.ts", "../../shared/src/abort-error.ts", "../../shared/src/valita.ts", "../../zero-protocol/src/ast.ts", "../../zero-protocol/src/queries-patch.ts", "../../zero-protocol/src/change-desired-queries.ts", "../../zero-protocol/src/clients-patch.ts", "../../zero-protocol/src/connect.ts", "../../zero-protocol/src/error.ts", "../../zero-protocol/src/version.ts", "../../shared/src/json-schema.ts", "../../shared/src/config.ts", "../../shared/src/json.ts", "../../zero-protocol/src/entity.ts", "../../zero-protocol/src/entities-patch.ts", "../../zero-protocol/src/poke.ts", "../../zero-protocol/src/pong.ts", "../../zero-protocol/src/pull.ts", "../../zero-protocol/src/down.ts", "../../zero-protocol/src/ping.ts", "../../zero-protocol/src/push.ts", "../../zero-protocol/src/delete-clients.ts", "../../zero-protocol/src/up.ts", "../../shared/src/random-values.ts", "../../zero-client/src/util/nanoid.ts", "../../zero-client/src/util/socket.ts", "../../btree/b+tree.ts", "../../zql/src/zql/ivm/lookahead-iterator.ts", "../../zql/src/zql/ivm/memory-source.ts", "../../zql/src/zql/ivm/memory-storage.ts", "../../zero-client/src/client/keys.ts", "../../zero-client/src/client/context.ts", "../../shared/src/resolved-promises.ts", "../../zero-client/src/client/crud.ts", "../../zero-client/src/client/enable-analytics.ts", "../../zero-client/src/client/http-string.ts", "../../zero-client/src/client/log-options.ts", "../../datadog/src/datadog-log-sink.ts", "../../zero-client/src/client/version.ts", "../../zero-client/src/client/metrics.ts", "../../shared/src/xxhash.ts", "../../zql/src/zql/ast/ast.ts", "../../zero-client/src/client/query-manager.ts", "../../zero-client/src/client/reload-error-handler.ts", "../../zero-client/src/client/server-error.ts", "../../zero-client/src/client/server-option.ts", "../../zero-client/src/client/zero-poke-handler.ts"],
4
+ "sourcesContent": ["export {\n IDBNotFoundError,\n TransactionClosedError,\n dropAllDatabases,\n dropDatabase,\n getDefaultPuller,\n makeIDBName,\n} from 'replicache';\nexport type {\n AsyncIterableIteratorToArray,\n ClientGroupID,\n ClientID,\n CreateKVStore,\n ExperimentalDiff,\n ExperimentalDiffOperation,\n ExperimentalDiffOperationAdd,\n ExperimentalDiffOperationChange,\n ExperimentalDiffOperationDel,\n ExperimentalIndexDiff,\n ExperimentalNoIndexDiff,\n ExperimentalWatchCallbackForOptions,\n ExperimentalWatchIndexCallback,\n ExperimentalWatchIndexOptions,\n ExperimentalWatchNoIndexCallback,\n ExperimentalWatchNoIndexOptions,\n ExperimentalWatchOptions,\n GetIndexScanIterator,\n GetScanIterator,\n HTTPRequestInfo,\n IndexDefinition,\n IndexDefinitions,\n IndexKey,\n IterableUnion,\n JSONObject,\n JSONValue,\n KVRead,\n KVStore,\n KVWrite,\n KeyTypeForScanOptions,\n MaybePromise,\n MutatorDefs,\n MutatorReturn,\n PatchOperation,\n ReadTransaction,\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n ScanIndexOptions,\n ScanNoIndexOptions,\n ScanOptionIndexedStartKey,\n ScanOptions,\n ScanResult,\n SubscribeOptions,\n TransactionEnvironment,\n TransactionLocation,\n TransactionReason,\n UpdateNeededReason,\n VersionNotSupportedResponse,\n WriteTransaction,\n} from 'replicache';\nexport {QueryImpl} from 'zql/src/zql/query/query-impl.js';\nexport type {\n DefaultQueryResultRow as EmptyQueryResultRow,\n Query,\n QueryReturnType,\n QueryRowType,\n QueryType,\n SchemaToRow,\n Smash,\n} from 'zql/src/zql/query/query.js';\nexport type {TableSchema} from 'zql/src/zql/query/schema.js';\nexport type {TypedView} from 'zql/src/zql/query/typed-view.js';\nexport type {ZeroOptions} from './client/options.js';\nexport {Zero, type Schema} from './client/zero.js';\n", "export function assert(b: unknown, msg = 'Assertion failed'): asserts b {\n if (!b) {\n throw new Error(msg);\n }\n}\n\nexport function assertString(v: unknown): asserts v is string {\n assertType(v, 'string');\n}\n\nexport function assertNumber(v: unknown): asserts v is number {\n assertType(v, 'number');\n}\n\nexport function assertBoolean(v: unknown): asserts v is boolean {\n assertType(v, 'boolean');\n}\n\nfunction assertType(v: unknown, t: string) {\n if (typeof v !== t) {\n throwInvalidType(v, t);\n }\n}\n\nexport function assertObject(v: unknown): asserts v is Record<string, unknown> {\n if (v === null) {\n throwInvalidType(v, 'object');\n }\n assertType(v, 'object');\n}\n\nexport function assertArray(v: unknown): asserts v is unknown[] {\n if (!Array.isArray(v)) {\n throwInvalidType(v, 'array');\n }\n}\n\nexport function invalidType(v: unknown, t: string): string {\n let s = 'Invalid type: ';\n if (v === null || v === undefined) {\n s += v;\n } else {\n s += `${typeof v} \\`${v}\\``;\n }\n return s + `, expected ${t}`;\n}\n\nexport function throwInvalidType(v: unknown, t: string): never {\n throw new Error(invalidType(v, t));\n}\n\nexport function assertNotNull<T>(v: T | null): asserts v is T {\n if (v === null) {\n throw new Error('Expected non-null value');\n }\n}\n\nexport function assertUndefined<T>(\n v: T | undefined,\n msg = 'Expected undefined value',\n): asserts v is T {\n if (v !== undefined) {\n throw new Error(msg);\n }\n}\n\nexport function assertNotUndefined<T>(\n v: T | undefined,\n msg = 'Expected non undefined value',\n): asserts v is T {\n if (v === undefined) {\n throw new Error(msg);\n }\n}\n\nexport function assertInstanceof<T>(\n v: unknown,\n t: new (...args: unknown[]) => T,\n): asserts v is T {\n if (!(v instanceof t)) {\n throw new Error(`Expected instanceof ${t.name}`);\n }\n}\n\nexport function assertUint8Array(v: unknown): asserts v is Uint8Array {\n assertInstanceof(v, Uint8Array);\n}\n\nexport function unreachable(): never;\nexport function unreachable(v: never): never;\nexport function unreachable(_?: never): never {\n throw new Error('Unreachable');\n}\n\nexport function notImplemented(): never {\n throw new Error('Not implemented');\n}\n", "export function must<T>(v: T | undefined | null, msg?: string): T {\n // eslint-disable-next-line eqeqeq\n if (v == null) {\n throw new Error(msg ?? `Unexpected ${v} value`);\n }\n return v;\n}\n", "import type {EditChange} from './change.js';\nimport type {Row} from './data.js';\nimport type {Output} from './operator.js';\n\n/**\n * This takes an {@linkcode EditChange} and a predicate that determines if a row\n * should be present based on the row's data. It then splits the change and\n * pushes the appropriate changes to the output based on the predicate.\n */\nexport function maybeSplitAndPushEditChange(\n change: EditChange,\n predicate: (row: Row) => boolean,\n output: Output,\n) {\n const oldWasPresent = predicate(change.oldRow);\n const newIsPresent = predicate(change.row);\n\n if (oldWasPresent && newIsPresent) {\n output.push(change);\n } else if (oldWasPresent && !newIsPresent) {\n // The relationships are empty at this point and that is fine since\n // splitAndPushEditChange is only used by operators that are before the Join\n // operator.\n output.push({\n type: 'remove',\n node: {\n row: change.oldRow,\n relationships: {},\n },\n });\n } else if (!oldWasPresent && newIsPresent) {\n output.push({\n type: 'add',\n node: {\n row: change.row,\n relationships: {},\n },\n });\n }\n}\n", "import {assert, unreachable} from 'shared/src/asserts.js';\nimport type {Change} from './change.js';\nimport type {Node, Row} from './data.js';\nimport {maybeSplitAndPushEditChange} from './maybe-split-and-push-edit-change.js';\nimport type {FetchRequest, Input, Operator, Output} from './operator.js';\nimport type {TableSchema} from './schema.js';\nimport type {Stream} from './stream.js';\n\n/**\n * Apply filter to all data flowing through, or just pushes. Pipeline builder\n * can hoist some filters up to source, so it will tell Filter to apply only to\n * pushes in that case.\n */\nexport type Mode = 'all' | 'push-only';\n\n/**\n * The Filter operator filters data through a predicate. It is stateless.\n *\n * The predicate must be pure.\n */\nexport class Filter implements Operator {\n readonly #input: Input;\n readonly #mode: Mode;\n readonly #predicate: (row: Row) => boolean;\n\n #output: Output | undefined;\n\n constructor(input: Input, mode: Mode, predicate: (row: Row) => boolean) {\n this.#input = input;\n this.#mode = mode;\n this.#predicate = predicate;\n this.#input.setOutput(this);\n }\n\n setOutput(output: Output) {\n this.#output = output;\n }\n\n destroy(): void {\n this.#input.destroy();\n }\n\n getSchema(): TableSchema {\n return this.#input.getSchema();\n }\n\n *fetch(req: FetchRequest) {\n for (const node of this.#input.fetch(req)) {\n if (this.#mode === 'push-only' || this.#predicate(node.row)) {\n yield node;\n }\n }\n }\n\n cleanup(req: FetchRequest): Stream<Node> {\n return this.fetch(req);\n }\n\n push(change: Change) {\n assert(this.#output, 'Output not set');\n\n switch (change.type) {\n case 'add':\n case 'remove':\n if (this.#predicate(change.node.row)) {\n this.#output.push(change);\n }\n break;\n case 'child':\n if (this.#predicate(change.row)) {\n this.#output.push(change);\n }\n break;\n case 'edit':\n maybeSplitAndPushEditChange(change, this.#predicate, this.#output);\n break;\n default:\n unreachable(change);\n }\n }\n}\n", "import {compareUTF8} from 'compare-utf8';\nimport {assertBoolean, assertNumber, assertString} from 'shared/src/asserts.js';\nimport type {Ordering} from '../ast/ast.js';\nimport type {Stream} from './stream.js';\n\n/**\n * The data types that Zero can represent are limited by two things:\n *\n * 1. The underlying Replicache sync layer currently can only represent JSON\n * types. This could possibly be expanded in the future, but we do want to be\n * careful of adding encoding overhead. By using JSON, we are taking\n * advantage of IndexedDB\u2019s fast native JSValue [de]serialization which has\n * historically been a perf advantage for us.\n *\n * 2. IDs in Zero need to be comparable because we use them for sorting and row\n * identity. We could expand the set of allowed value types (to include,\n * i.e., Objects) but we would then need to restrict IDs to only comparable\n * types.\n *\n * These two facts leave us with the following allowed types. Zero's replication\n * layer must convert other types into these for tables to be used with Zero.\n *\n * For developer convenience we also allow `undefined`, which we treat\n * equivalently to `null`.\n */\nexport type Value = undefined | null | boolean | number | string;\n\n/**\n * A Row is represented as a JS Object.\n *\n * We do everything in IVM as loosely typed values because these pipelines are\n * going to be constructed at runtime by other code, so type-safety can't buy us\n * anything.\n *\n * Also since the calling code on the client ultimately wants objects to work\n * with we end up with a lot less copies by using objects throughout.\n */\nexport type Row = Record<string, Value>;\n\n/**\n * A row flowing through the pipeline, plus its relationships.\n * Relationships are generated lazily as read.\n */\nexport type Node = {\n row: Row;\n relationships: Record<string, Stream<Node>>;\n};\n\n/**\n * Compare two values. The values must be of the same type. This function\n * throws at runtime if the types differ.\n *\n * Note, this function considers `null === null` and\n * `undefined === undefined`. This is different than SQL. In join code,\n * null must be treated separately.\n *\n * See: https://github.com/rocicorp/mono/pull/2116/files#r1704811479\n *\n * @returns < 0 if a < b, 0 if a === b, > 0 if a > b\n */\nexport function compareValues(a: Value, b: Value): number {\n a = normalizeUndefined(a);\n b = normalizeUndefined(b);\n\n if (a === b) {\n return 0;\n }\n if (a === null) {\n return -1;\n }\n if (b === null) {\n return 1;\n }\n if (typeof a === 'boolean') {\n assertBoolean(b);\n return a ? 1 : -1;\n }\n if (typeof a === 'number') {\n assertNumber(b);\n return a - b;\n }\n if (typeof a === 'string') {\n assertString(b);\n // We compare all strings in Zero as UTF-8. This is the default on SQLite\n // and we need to match it. See:\n // https://blog.replicache.dev/blog/replicache-11-adventures-in-text-encoding.\n //\n // TODO: We could change this since SQLite supports UTF-16. Microbenchmark\n // to see if there's a big win.\n //\n // https://www.sqlite.org/c3ref/create_collation.html\n return compareUTF8(a, b);\n }\n throw new Error(`Unsupported type: ${a}`);\n}\n\nexport type NormalizedValue = Exclude<Value, undefined>;\n\n/**\n * We allow undefined to be passed for the convenience of developers, but we\n * treat it equivalently to null. It's better for perf to not create an copy\n * of input values, so we just normalize at use when necessary.\n */\nexport function normalizeUndefined(v: Value): NormalizedValue {\n return v ?? null;\n}\n\nexport type Comparator = (r1: Row, r2: Row) => number;\n\nexport function makeComparator(order: Ordering): Comparator {\n return (a, b) => {\n // Skip destructuring here since it is hot code.\n for (const ord of order) {\n const field = ord[0];\n const comp = compareValues(a[field], b[field]);\n if (comp !== 0) {\n return ord[1] === 'asc' ? comp : -comp;\n }\n }\n return 0;\n };\n}\n\n/**\n * Determine if two values are equal. Note that unlike compareValues() above,\n * this function treats `null` as unequal to itself (and same for `undefined`).\n * This is required to make joins work correctly, but may not be the right\n * semantic for your application.\n */\nexport function valuesEqual(a: Value, b: Value): boolean {\n a = normalizeUndefined(a);\n b = normalizeUndefined(b);\n if (a === null || b === null) {\n return false;\n }\n return a === b;\n}\n", "/**\n * streams are lazy forward-only iterables.\n * Once a stream reaches the end it can't be restarted.\n * They are iterable, not iterator, so that they can be used in for-each,\n * and so that we know when consumer has stopped iterating the stream. This allows us\n * to clean up resources like sql statements.\n */\nexport type Stream<T> = Iterable<T>;\n\nexport function* take<T>(stream: Stream<T>, limit: number): Stream<T> {\n if (limit < 1) {\n return;\n }\n let count = 0;\n for (const v of stream) {\n yield v;\n if (++count === limit) {\n break;\n }\n }\n}\n\nexport function first<T>(stream: Stream<T>): T | undefined {\n const it = stream[Symbol.iterator]();\n const {value} = it.next();\n it.return?.();\n return value;\n}\n", "import {assert, unreachable} from 'shared/src/asserts.js';\nimport {must} from 'shared/src/must.js';\nimport type {Change, ChildChange} from './change.js';\nimport {\n normalizeUndefined,\n type Node,\n type NormalizedValue,\n type Row,\n} from './data.js';\nimport type {FetchRequest, Input, Output, Storage} from './operator.js';\nimport type {TableSchema} from './schema.js';\nimport {first, take, type Stream} from './stream.js';\n\ntype Args = {\n parent: Input;\n child: Input;\n storage: Storage;\n parentKey: string;\n childKey: string;\n relationshipName: string;\n hidden: boolean;\n};\n/**\n * The Join operator joins the output from two upstream inputs. Zero's join\n * is a little different from SQL's join in that we output hierarchical data,\n * not a flat table. This makes it a lot more useful for UI programming and\n * avoids duplicating tons of data like left join would.\n *\n * The Nodes output from Join have a new relationship added to them, which has\n * the name #relationshipName. The value of the relationship is a stream of\n * child nodes which are the corresponding values from the child source.\n */\nexport class Join implements Input {\n readonly #parent: Input;\n readonly #child: Input;\n readonly #storage: Storage;\n readonly #parentKey: string;\n readonly #childKey: string;\n readonly #relationshipName: string;\n readonly #schema: TableSchema;\n\n #output: Output | null = null;\n\n constructor({\n parent,\n child,\n storage,\n parentKey,\n childKey,\n relationshipName,\n hidden,\n }: Args) {\n assert(parent !== child, 'Parent and child must be different operators');\n\n this.#parent = parent;\n this.#child = child;\n this.#storage = storage;\n this.#parentKey = parentKey;\n this.#childKey = childKey;\n this.#relationshipName = relationshipName;\n\n const parentSchema = parent.getSchema();\n const childSchema = child.getSchema();\n this.#schema = {\n ...parentSchema,\n isHidden: hidden,\n relationships: {\n ...parentSchema.relationships,\n [relationshipName]: childSchema,\n },\n };\n\n parent.setOutput({\n push: (change: Change) => this.#pushParent(change),\n });\n child.setOutput({\n push: (change: Change) => this.#pushChild(change),\n });\n }\n\n destroy(): void {\n this.#parent.destroy();\n this.#child.destroy();\n }\n\n setOutput(output: Output): void {\n this.#output = output;\n }\n\n getSchema(): TableSchema {\n return this.#schema;\n }\n\n *fetch(req: FetchRequest): Stream<Node> {\n for (const parentNode of this.#parent.fetch(req)) {\n yield this.#processParentNode(\n parentNode.row,\n parentNode.relationships,\n 'fetch',\n );\n }\n }\n\n *cleanup(req: FetchRequest): Stream<Node> {\n for (const parentNode of this.#parent.cleanup(req)) {\n yield this.#processParentNode(\n parentNode.row,\n parentNode.relationships,\n 'cleanup',\n );\n }\n }\n\n #pushParent(change: Change): void {\n assert(this.#output, 'Output not set');\n\n switch (change.type) {\n case 'add':\n this.#output.push({\n type: 'add',\n node: this.#processParentNode(\n change.node.row,\n change.node.relationships,\n 'fetch',\n ),\n });\n break;\n case 'remove':\n this.#output.push({\n type: 'remove',\n node: this.#processParentNode(\n change.node.row,\n change.node.relationships,\n 'cleanup',\n ),\n });\n break;\n case 'child':\n this.#output.push(change);\n break;\n case 'edit':\n // If the join key value didn't change we push the change down\n if (\n normalizeUndefined(change.row[this.#parentKey]) ===\n normalizeUndefined(change.oldRow[this.#parentKey])\n ) {\n this.#output.push(change);\n } else {\n // The join key value changed so we treat this as a remove followed by\n // an add.\n this.#output.push({\n type: 'remove',\n node: this.#processParentNode(change.oldRow, {}, 'cleanup'),\n });\n this.#output.push({\n type: 'add',\n node: this.#processParentNode(change.row, {}, 'fetch'),\n });\n }\n break;\n default:\n unreachable(change);\n }\n }\n\n #pushChild(change: Change): void {\n const pushChildChange = (childRow: Row, change: Change) => {\n assert(this.#output, 'Output not set');\n\n const parentNodes = this.#parent.fetch({\n constraint: {\n key: this.#parentKey,\n value: childRow[this.#childKey],\n },\n });\n\n for (const parentNode of parentNodes) {\n const childChange: ChildChange = {\n type: 'child',\n row: parentNode.row,\n child: {\n relationshipName: this.#relationshipName,\n change,\n },\n };\n this.#output.push(childChange);\n }\n };\n\n switch (change.type) {\n case 'add':\n case 'remove':\n pushChildChange(change.node.row, change);\n break;\n case 'child':\n pushChildChange(change.row, change);\n break;\n case 'edit': {\n const childRow = change.row;\n const oldChildRow = change.oldRow;\n if (\n normalizeUndefined(oldChildRow[this.#childKey]) ===\n normalizeUndefined(childRow[this.#childKey])\n ) {\n // The child row was edited in a way that does not change the relationship.\n // We can therefore just push the change down (wrapped in a child change).\n pushChildChange(childRow, change);\n } else {\n // The child row was edited in a way that changes the relationship. We\n // therefore treat this as a remove from the old row followed by an\n // add to the new row.\n\n const {relationships} = must(\n first(\n this.#child.fetch({\n constraint: {\n key: this.#childKey,\n value: oldChildRow[this.#childKey],\n },\n }),\n ),\n );\n\n pushChildChange(oldChildRow, {\n type: 'remove',\n node: {\n row: oldChildRow,\n relationships,\n },\n });\n pushChildChange(childRow, {\n type: 'add',\n node: {\n row: childRow,\n relationships,\n },\n });\n }\n break;\n }\n\n default:\n unreachable(change);\n }\n }\n\n #processParentNode(\n parentNodeRow: Row,\n parentNodeRelations: Record<string, Stream<Node>>,\n mode: ProcessParentMode,\n ): Node {\n const parentKeyValue = normalizeUndefined(parentNodeRow[this.#parentKey]);\n const parentPrimaryKey: NormalizedValue[] = [];\n for (const key of this.#parent.getSchema().primaryKey) {\n parentPrimaryKey.push(normalizeUndefined(parentNodeRow[key]));\n }\n\n // This storage key tracks the primary keys seen for each unique\n // value joined on. This is used to know when to cleanup a child's state.\n const storageKey: string = createPrimaryKeySetStorageKey([\n parentKeyValue,\n ...parentPrimaryKey,\n ]);\n\n let method: ProcessParentMode = mode;\n if (mode === 'cleanup') {\n const [, second] = take(\n this.#storage.scan({\n prefix: createPrimaryKeySetStorageKeyPrefix(parentKeyValue),\n }),\n 2,\n );\n method = second ? 'fetch' : 'cleanup';\n }\n\n const childStream = this.#child[method]({\n constraint: {\n key: this.#childKey,\n value: parentKeyValue,\n },\n });\n\n if (mode === 'fetch') {\n this.#storage.set(storageKey, true);\n } else {\n mode satisfies 'cleanup';\n this.#storage.del(storageKey);\n }\n\n return {\n row: parentNodeRow,\n relationships: {\n ...parentNodeRelations,\n [this.#relationshipName]: childStream,\n },\n };\n }\n}\n\ntype ProcessParentMode = 'fetch' | 'cleanup';\n\n/** Exported for testing. */\nexport function createPrimaryKeySetStorageKey(\n values: NormalizedValue[],\n): string {\n const json = JSON.stringify(['pKeySet', ...values]);\n return json.substring(1, json.length - 1) + ',';\n}\n\nexport function createPrimaryKeySetStorageKeyPrefix(\n value: NormalizedValue,\n): string {\n return createPrimaryKeySetStorageKey([value]);\n}\n", "import {assert} from 'shared/src/asserts.js';\nimport type {AddChange, Change, ChildChange, RemoveChange} from './change.js';\nimport type {Comparator, Node, Row} from './data.js';\nimport {maybeSplitAndPushEditChange} from './maybe-split-and-push-edit-change.js';\nimport type {FetchRequest, Input, Operator, Output, Start} from './operator.js';\nimport type {TableSchema} from './schema.js';\nimport type {Stream} from './stream.js';\n\nexport type Bound = {\n row: Row;\n exclusive: boolean;\n};\n\n/**\n * Skip sets the start position for the pipeline. No rows before the bound will\n * be output.\n */\nexport class Skip implements Operator {\n readonly #input: Input;\n readonly #bound: Bound;\n readonly #comparator: Comparator;\n\n #output: Output | undefined;\n\n constructor(input: Input, bound: Bound) {\n this.#input = input;\n this.#bound = bound;\n this.#comparator = input.getSchema().compareRows;\n this.#input.setOutput(this);\n }\n\n getSchema(): TableSchema {\n return this.#input.getSchema();\n }\n\n fetch(req: FetchRequest): Stream<Node> {\n return this.#input.fetch({...req, start: this.#getStart(req)});\n }\n\n cleanup(req: FetchRequest): Stream<Node> {\n return this.#input.cleanup({...req, start: this.#getStart(req)});\n }\n\n setOutput(output: Output): void {\n this.#output = output;\n }\n\n destroy(): void {\n this.#input.destroy();\n }\n\n push(change: Change): void {\n assert(this.#output, 'Output not set');\n\n const shouldBePresent = (row: Row) => {\n const cmp = this.#comparator(this.#bound.row, row);\n return cmp < 0 || (cmp === 0 && !this.#bound.exclusive);\n };\n\n if (change.type === 'edit') {\n maybeSplitAndPushEditChange(change, shouldBePresent, this.#output);\n return;\n }\n\n change satisfies AddChange | RemoveChange | ChildChange;\n\n const changeRow = change.type === 'child' ? change.row : change.node.row;\n if (shouldBePresent(changeRow)) {\n this.#output.push(change);\n }\n }\n\n #getStart(req: FetchRequest): Start | undefined {\n const boundStart = {\n row: this.#bound.row,\n basis: this.#bound.exclusive ? 'after' : 'at',\n } as const;\n\n if (!req.start) {\n return boundStart;\n }\n\n const cmp = this.#comparator(this.#bound.row, req.start.row);\n\n // The skip bound is after the requested bound. The requested bound cannot\n // be relevant because even if it was basis: 'after', the skip bound is\n // itself after the requested bound. Return the skip bound.\n if (cmp > 0) {\n return boundStart;\n }\n\n // The skip bound and requested bound are equal. If either is exclusive,\n // return that bound with exclusive. Otherwise, return the skip bound.\n // There is the case where the requested bound is basis: 'before', but\n // that cannot be relevant.\n if (cmp === 0) {\n if (this.#bound.exclusive || req.start.basis === 'after') {\n return {\n row: this.#bound.row,\n basis: 'after',\n };\n }\n return boundStart;\n }\n\n assert(cmp < 0);\n\n // The skip bound is before the requested bound. If the requested bound is\n // either 'at' or 'after', the skip bound cannot be relevant. Return the\n // requested bound.\n if (req.start.basis === 'at' || req.start.basis === 'after') {\n return req.start;\n }\n\n // That leaves the one interesting case: the skip bound is before the\n // requested bound, but the requested bound is basis: 'before'. It is\n // possible that the first element before the requested bound is itself the\n // skip bound, or there could be some other element between. We'll have to\n // fetch to find out.\n req.start.basis satisfies 'before';\n\n const [node] = this.#input.fetch(req) as Array<Node | undefined>;\n\n // There's no element at all before the requested bound, not even the skip\n // bound. In this case we may as well return the requested bound with 'at'\n // to simplify work for the source.\n if (!node) {\n return {\n row: req.start.row,\n basis: 'at',\n };\n }\n\n // If there's an element before the requested bound, but it's before the\n // skip bound, then we'll use the skip bound afterall.\n if (this.#comparator(node.row, this.#bound.row) <= 0) {\n return boundStart;\n }\n\n // Finally, if there's an element before the requested bound, and it's after\n // the skip bound, then that's the element we should start at.\n return {\n row: node.row,\n basis: 'at',\n };\n }\n}\n", "import {assert, unreachable} from 'shared/src/asserts.js';\nimport {must} from 'shared/src/must.js';\nimport {assertOrderingIncludesPK} from '../builder/builder.js';\nimport type {Change, EditChange, RemoveChange} from './change.js';\nimport {normalizeUndefined, type Node, type Row, type Value} from './data.js';\nimport type {\n Constraint,\n FetchRequest,\n Input,\n Operator,\n Output,\n Storage,\n} from './operator.js';\nimport type {TableSchema} from './schema.js';\nimport {first, take, type Stream} from './stream.js';\n\nconst MAX_BOUND_KEY = 'maxBound';\n\ntype TakeState = {\n size: number;\n bound: Row | undefined;\n};\n\ninterface TakeStorage extends Storage {\n get(key: typeof MAX_BOUND_KEY): Row | undefined;\n get(key: string): TakeState | undefined;\n set(key: typeof MAX_BOUND_KEY, value: Row): void;\n set(key: string, value: TakeState): void;\n}\n\n/**\n * The Take operator is for implementing limit queries. It takes the first n\n * nodes of its input as determined by the input\u2019s comparator. It then keeps\n * a *bound* of the last item it has accepted so that it can evaluate whether\n * new incoming pushes should be accepted or rejected.\n *\n * Take can count rows globally or by unique value of some field.\n */\nexport class Take implements Operator {\n readonly #input: Input;\n readonly #storage: TakeStorage;\n readonly #limit: number;\n readonly #partitionKey: string | undefined;\n\n #output: Output | null = null;\n\n constructor(\n input: Input,\n storage: Storage,\n limit: number,\n partitionKey?: string | undefined,\n ) {\n this.#input = input;\n this.#storage = storage as TakeStorage;\n this.#limit = limit;\n this.#partitionKey = partitionKey;\n assert(limit >= 0);\n assertOrderingIncludesPK(\n this.#input.getSchema().sort,\n this.#input.getSchema().primaryKey,\n );\n this.#input.setOutput(this);\n }\n\n setOutput(output: Output): void {\n this.#output = output;\n }\n\n getSchema(): TableSchema {\n return this.#input.getSchema();\n }\n\n *fetch(req: FetchRequest): Stream<Node> {\n if (\n this.#partitionKey === undefined ||\n req.constraint?.key === this.#partitionKey\n ) {\n const partitionValue =\n this.#partitionKey === undefined ? undefined : req.constraint?.value;\n const takeStateKey = getTakeStateKey(partitionValue);\n const takeState = this.#storage.get(takeStateKey);\n if (!takeState) {\n yield* this.#initialFetch(req);\n return;\n }\n if (takeState.bound === undefined) {\n return;\n }\n for (const inputNode of this.#input.fetch(req)) {\n if (this.getSchema().compareRows(takeState.bound, inputNode.row) < 0) {\n return;\n }\n yield inputNode;\n }\n return;\n }\n // There is a partition key, but the fetch is not constrained or constrained\n // on a different key. Thus we don't have a single take state to bound by.\n // This currently only happens with nested sub-queries\n // e.g. issues include issuelabels include label. We could remove this\n // case if we added a translation layer (powered by some state) in join.\n // Specifically we need joinKeyValue => parent constraint key\n const maxBound = this.#storage.get(MAX_BOUND_KEY);\n if (maxBound === undefined) {\n return;\n }\n for (const inputNode of this.#input.fetch(req)) {\n if (this.getSchema().compareRows(inputNode.row, maxBound) > 0) {\n return;\n }\n const partitionValue = inputNode.row[this.#partitionKey];\n const takeStateKey = getTakeStateKey(partitionValue);\n const takeState = this.#storage.get(takeStateKey);\n if (\n takeState?.bound !== undefined &&\n this.getSchema().compareRows(takeState.bound, inputNode.row) >= 0\n ) {\n yield inputNode;\n }\n }\n }\n\n *#initialFetch(req: FetchRequest): Stream<Node> {\n assert(req.start === undefined);\n assert(\n this.#partitionKey === undefined ||\n (req.constraint !== undefined &&\n req.constraint.key === this.#partitionKey),\n );\n\n if (this.#limit === 0) {\n return;\n }\n\n const partitionValue =\n this.#partitionKey === undefined ? undefined : req.constraint?.value;\n const takeStateKey = getTakeStateKey(partitionValue);\n assert(this.#storage.get(takeStateKey) === undefined);\n\n let size = 0;\n let bound: Row | undefined;\n let downstreamEarlyReturn = true;\n try {\n for (const inputNode of this.#input.fetch(req)) {\n yield inputNode;\n bound = inputNode.row;\n size++;\n if (size === this.#limit) {\n break;\n }\n }\n downstreamEarlyReturn = false;\n } finally {\n this.#setTakeState(\n takeStateKey,\n size,\n bound,\n this.#storage.get(MAX_BOUND_KEY),\n );\n // If it becomes necessary to support downstream early return, this\n // assert should be removed, and replaced with code that consumes\n // the input stream until limit is reached or the input stream is\n // exhausted so that takeState is properly hydrated.\n assert(\n !downstreamEarlyReturn,\n 'Unexpected early return prevented full hydration',\n );\n }\n }\n\n *cleanup(req: FetchRequest): Stream<Node> {\n assert(req.start === undefined);\n assert(\n this.#partitionKey === undefined ||\n (req.constraint !== undefined &&\n req.constraint.key === this.#partitionKey),\n );\n\n let takeState: TakeState | undefined;\n if (this.#limit > 0) {\n const partitionValue =\n this.#partitionKey === undefined ? undefined : req.constraint?.value;\n const takeStateKey = getTakeStateKey(partitionValue);\n takeState = this.#storage.get(takeStateKey);\n assert(takeState !== undefined);\n this.#storage.del(takeStateKey);\n }\n for (const inputNode of this.#input.cleanup(req)) {\n if (\n takeState?.bound === undefined ||\n this.getSchema().compareRows(takeState.bound, inputNode.row) < 0\n ) {\n return;\n }\n yield inputNode;\n }\n }\n\n #getStateAndConstraint(row: Row) {\n const partitionValue =\n this.#partitionKey === undefined ? undefined : row[this.#partitionKey];\n const takeStateKey = getTakeStateKey(partitionValue);\n const takeState = this.#storage.get(takeStateKey);\n let maxBound: Row | undefined;\n let constraint: Constraint | undefined;\n // The partition key was never fetched, so this push can be discarded.\n if (takeState) {\n maxBound = this.#storage.get(MAX_BOUND_KEY);\n constraint = this.#partitionKey\n ? {\n key: this.#partitionKey,\n value: partitionValue,\n }\n : undefined;\n }\n\n return {takeState, takeStateKey, maxBound, constraint} as\n | {\n takeState: undefined;\n takeStateKey: string;\n maxBound: undefined;\n constraint: undefined;\n }\n | {\n takeState: TakeState;\n takeStateKey: string;\n maxBound: Row | undefined;\n constraint: Constraint | undefined;\n };\n }\n\n push(change: Change): void {\n if (change.type === 'edit') {\n this.#pushEditChange(change);\n return;\n }\n\n assert(this.#output, 'Output not set');\n // When take below join is supported, this assert should be removed\n // and a 'child' change should be pushed to output if its row\n // is <= bound.\n assert(change.type !== 'child', 'child changes are not supported');\n\n const {takeState, takeStateKey, maxBound, constraint} =\n this.#getStateAndConstraint(change.node.row);\n if (!takeState) {\n return;\n }\n const {compareRows} = this.getSchema();\n\n if (change.type === 'add') {\n if (takeState.size < this.#limit) {\n this.#setTakeState(\n takeStateKey,\n takeState.size + 1,\n takeState.bound === undefined ||\n compareRows(takeState.bound, change.node.row) < 0\n ? change.node.row\n : takeState.bound,\n maxBound,\n );\n this.#output.push(change);\n return;\n }\n // size === limit\n if (\n takeState.bound === undefined ||\n compareRows(change.node.row, takeState.bound) >= 0\n ) {\n return;\n }\n // added row < bound\n let beforeBoundNode: Node | undefined;\n let boundNode: Node;\n if (this.#limit === 1) {\n boundNode = must(\n first(\n this.#input.fetch({\n start: {\n row: takeState.bound,\n basis: 'at',\n },\n constraint,\n }),\n ),\n );\n } else {\n [beforeBoundNode, boundNode] = take(\n this.#input.fetch({\n start: {\n row: takeState.bound,\n basis: 'before',\n },\n constraint,\n }),\n 2,\n );\n }\n const removeChange: RemoveChange = {\n type: 'remove',\n node: boundNode,\n };\n this.#setTakeState(\n takeStateKey,\n takeState.size,\n beforeBoundNode === undefined ||\n compareRows(change.node.row, beforeBoundNode.row) > 0\n ? change.node.row\n : beforeBoundNode.row,\n maxBound,\n );\n this.#output.push(removeChange);\n this.#output.push(change);\n } else if (change.type === 'remove') {\n if (takeState.bound === undefined) {\n // change is after bound\n return;\n }\n const compToBound = compareRows(change.node.row, takeState.bound);\n if (compToBound > 0) {\n // change is after bound\n return;\n }\n if (takeState.size === 1) {\n this.#storage.set(takeStateKey, {\n size: 0,\n bound: undefined,\n });\n this.#output.push(change);\n return;\n }\n // The bound is removed\n let beforeBoundNode: Node | undefined;\n let afterBoundNode: Node | undefined;\n if (compToBound === 0) {\n [beforeBoundNode, afterBoundNode] = take(\n this.#input.fetch({\n start: {\n row: takeState.bound,\n basis: 'before',\n },\n constraint,\n }),\n 2,\n );\n } else {\n [beforeBoundNode, , afterBoundNode] = take(\n this.#input.fetch({\n start: {\n row: takeState.bound,\n basis: 'before',\n },\n constraint,\n }),\n 3,\n );\n }\n\n if (afterBoundNode) {\n this.#setTakeState(\n takeStateKey,\n takeState.size,\n afterBoundNode.row,\n maxBound,\n );\n this.#output.push(change);\n this.#output.push({\n type: 'add',\n node: afterBoundNode,\n });\n return;\n }\n this.#setTakeState(\n takeStateKey,\n takeState.size - 1,\n compToBound === 0 ? beforeBoundNode.row : takeState.bound,\n maxBound,\n );\n this.#output.push(change);\n }\n }\n\n #pushEditChange(change: EditChange): void {\n assert(this.#output, 'Output not set');\n\n if (\n this.#partitionKey !== undefined &&\n change.oldRow[this.#partitionKey] !== change.row[this.#partitionKey]\n ) {\n // different partition key so fall back to remove/add.\n\n // TODO: So in some cases these don't need to be transformed into a remove\n // + add.\n //\n // If the oldRow was <= the bound of the old partition value, and the\n // newRow is <= the bound of the new partition value, this can be sent as\n // an edit, as the row is present in the output of this operator before\n // and after applying this push.\n\n // We do not need the relationships because Take comes before Join\n this.push({\n type: 'remove',\n node: {\n row: change.oldRow,\n relationships: {},\n },\n });\n this.push({\n type: 'add',\n node: {\n row: change.row,\n relationships: {},\n },\n });\n return;\n }\n\n const {takeState, takeStateKey, maxBound, constraint} =\n this.#getStateAndConstraint(change.oldRow);\n if (!takeState) {\n return;\n }\n\n assert(takeState.bound, 'Bound should be set');\n const {compareRows} = this.getSchema();\n const oldCmp = compareRows(change.oldRow, takeState.bound);\n const newCmp = compareRows(change.row, takeState.bound);\n\n const replaceBoundAndForwardChange = () => {\n this.#setTakeState(takeStateKey, takeState.size, change.row, maxBound);\n this.#output!.push(change);\n };\n\n // The bounds row was changed.\n if (oldCmp === 0) {\n // The new row is the new bound.\n if (newCmp === 0) {\n // no need to update the state since we are keeping the bounds\n this.#output.push(change);\n return;\n }\n\n if (newCmp < 0) {\n if (this.#limit === 1) {\n replaceBoundAndForwardChange();\n return;\n }\n\n // New row will be in the result but it might not be the bounds any\n // more. We need to find the row before the bounds to determine the new\n // bounds.\n\n const beforeBoundNode = must(\n first(\n this.#input.fetch({\n start: {\n row: takeState.bound,\n basis: 'before',\n },\n constraint,\n }),\n ),\n );\n\n this.#setTakeState(\n takeStateKey,\n takeState.size,\n beforeBoundNode.row,\n maxBound,\n );\n this.#output.push(change);\n return;\n }\n\n assert(newCmp > 0);\n // Find the first item at the old bounds. This will be the new bounds.\n const newBoundNode = must(\n first(\n this.#input.fetch({\n start: {\n row: takeState.bound,\n basis: 'at',\n },\n constraint,\n }),\n ),\n );\n\n // The next row is the new row. We can replace the bounds and keep the\n // edit change.\n if (compareRows(newBoundNode.row, change.row) === 0) {\n replaceBoundAndForwardChange();\n return;\n }\n\n // The new row is now outside the bounds, so we need to remove the old\n // row and add the new bounds row.\n this.#setTakeState(\n takeStateKey,\n takeState.size,\n newBoundNode.row,\n maxBound,\n );\n this.#output.push({\n type: 'remove',\n node: {\n row: change.oldRow,\n relationships: {},\n },\n });\n this.#output.push({\n type: 'add',\n node: newBoundNode,\n });\n return;\n }\n\n if (oldCmp > 0) {\n assert(newCmp !== 0, 'Invalid state. Row has duplicate primary key');\n\n // Both old and new outside of bounds\n if (newCmp > 0) {\n return;\n }\n\n // old was outside, new is inside. Pushing out the old bounds\n assert(newCmp < 0);\n\n const [newBoundNode, oldBoundNode] = take(\n this.#input.fetch({\n start: {\n row: takeState.bound,\n basis: 'before',\n },\n constraint,\n }),\n 2,\n );\n\n this.#setTakeState(\n takeStateKey,\n takeState.size,\n newBoundNode.row,\n maxBound,\n );\n\n this.#output.push({\n type: 'remove',\n node: oldBoundNode,\n });\n\n // We do not need the relationships because Take comes before Join\n this.#output.push({\n type: 'add',\n node: {\n row: change.row,\n relationships: {},\n },\n });\n\n return;\n }\n\n if (oldCmp < 0) {\n assert(newCmp !== 0, 'Invalid state. Row has duplicate primary key');\n\n // Both old and new inside of bounds\n if (newCmp < 0) {\n this.#output.push(change);\n return;\n }\n\n // old was inside, new is larger than old bound\n\n assert(newCmp > 0);\n\n // at this point we need to find the row after the bound and use that or\n // the newRow as the new bound.\n const afterBoundNode = must(\n first(\n this.#input.fetch({\n start: {\n row: takeState.bound,\n basis: 'after',\n },\n constraint,\n }),\n ),\n );\n\n // The new row is the new bound. Use an edit change.\n if (compareRows(afterBoundNode.row, change.row) === 0) {\n replaceBoundAndForwardChange();\n return;\n }\n\n this.#setTakeState(\n takeStateKey,\n takeState.size,\n afterBoundNode.row,\n maxBound,\n );\n\n // We do not need the relationships because Take comes before Join\n this.#output.push({\n type: 'remove',\n node: {\n row: change.oldRow,\n relationships: {},\n },\n });\n this.#output.push({\n type: 'add',\n node: afterBoundNode,\n });\n return;\n }\n\n unreachable();\n }\n\n #setTakeState(\n takeStateKey: string,\n size: number,\n bound: Row | undefined,\n maxBound: Row | undefined,\n ) {\n this.#storage.set(takeStateKey, {\n size,\n bound,\n });\n if (\n bound !== undefined &&\n (maxBound === undefined ||\n this.getSchema().compareRows(bound, maxBound) > 0)\n ) {\n this.#storage.set(MAX_BOUND_KEY, bound);\n }\n }\n\n destroy(): void {\n this.#input.destroy();\n }\n}\n\nfunction getTakeStateKey(partitionValue: Value): string {\n return JSON.stringify(['take', normalizeUndefined(partitionValue)]);\n}\n", "import {assertString} from 'shared/src/asserts.js';\nimport type {NonNullValue, SimplePredicate} from './filter.js';\n\nexport function getLikePredicate(\n pattern: NonNullValue,\n flags: 'i' | '',\n): SimplePredicate {\n const op = getLikeOp(String(pattern), flags);\n return (lhs: NonNullValue) => {\n assertString(lhs);\n return op(String(lhs));\n };\n}\n\nfunction getLikeOp(pattern: string, flags: 'i' | ''): (lhs: string) => boolean {\n // if lhs does not contain '%' or '_' then it is a simple string comparison.\n // if it does contain '%' or '_' then it is a regex comparison.\n // '%' is a wildcard for any number of characters\n // '_' is a wildcard for a single character\n // Postgres SQL allows escaping using `\\`.\n\n if (!/_|%|\\\\/.test(pattern)) {\n if (flags === 'i') {\n const rhsLower = pattern.toLowerCase();\n return (lhs: string) => lhs.toLowerCase() === rhsLower;\n }\n return (lhs: string) => lhs === pattern;\n }\n const re = patternToRegExp(pattern, flags);\n return (lhs: string) => re.test(lhs);\n}\n\nconst specialCharsRe = /[$()*+.?[\\]\\\\^{|}]/;\n\nfunction patternToRegExp(source: string, flags: '' | 'i' = ''): RegExp {\n // There are a few cases:\n // % => .*\n // _ => .\n // \\x => \\x for any x except special regexp chars\n // special regexp chars => \\special regexp chars\n let pattern = '^';\n for (let i = 0; i < source.length; i++) {\n let c = source[i];\n switch (c) {\n case '%':\n pattern += '.*';\n break;\n case '_':\n pattern += '.';\n break;\n\n // @ts-expect-error fallthrough\n case '\\\\':\n if (i === source.length - 1) {\n throw new Error('LIKE pattern must not end with escape character');\n }\n i++;\n c = source[i];\n\n // fall through\n default:\n if (specialCharsRe.test(c)) {\n pattern += '\\\\';\n }\n pattern += c;\n\n break;\n }\n }\n return new RegExp(pattern + '$', flags);\n}\n", "import {assert} from 'shared/src/asserts.js';\nimport type {Condition, LiteralValue, SimpleOperator} from '../ast/ast.js';\nimport type {Row, Value} from '../ivm/data.js';\nimport {getLikePredicate} from './like.js';\n\nexport type NonNullValue = Exclude<Value, null | undefined>;\nexport type SimplePredicate = (rhs: NonNullValue) => boolean;\n\nexport function createPredicate(condition: Condition) {\n const impl = createPredicateImpl(\n condition.value as LiteralValue,\n condition.op,\n );\n return (row: Row) => {\n const lhs = row[condition.field];\n if (lhs === null || lhs === undefined) {\n return false;\n }\n return impl(lhs);\n };\n}\n\nfunction createPredicateImpl(\n rhs: NonNullValue | readonly NonNullValue[],\n operator: SimpleOperator,\n): SimplePredicate {\n switch (operator) {\n case '=':\n return lhs => lhs === rhs;\n case '!=':\n return lhs => lhs !== rhs;\n case '<':\n return lhs => lhs < rhs;\n case '<=':\n return lhs => lhs <= rhs;\n case '>':\n return lhs => lhs > rhs;\n case '>=':\n return lhs => lhs >= rhs;\n case 'LIKE':\n return getLikePredicate(rhs as NonNullValue, '');\n case 'NOT LIKE':\n return not(getLikePredicate(rhs as NonNullValue, ''));\n case 'ILIKE':\n return getLikePredicate(rhs as NonNullValue, 'i');\n case 'NOT ILIKE':\n return not(getLikePredicate(rhs as NonNullValue, 'i'));\n case 'IN': {\n assert(Array.isArray(rhs));\n const set = new Set(rhs);\n return lhs => set.has(lhs);\n }\n case 'NOT IN': {\n assert(Array.isArray(rhs));\n const set = new Set(rhs);\n return lhs => !set.has(lhs);\n }\n default:\n operator satisfies never;\n throw new Error(`Unexpected operator: ${operator}`);\n }\n}\n\nfunction not<T>(f: (lhs: T) => boolean) {\n return (lhs: T) => !f(lhs);\n}\n", "export class MissingParameterError extends Error {}\n", "import {assert} from 'shared/src/asserts.js';\nimport type {JSONValue} from 'shared/src/json.js';\nimport {must} from 'shared/src/must.js';\nimport type {\n AST,\n LiteralValue,\n Ordering,\n Parameter,\n ValuePosition,\n} from '../ast/ast.js';\nimport type {Row} from '../ivm/data.js';\nimport {Filter} from '../ivm/filter.js';\nimport {Join} from '../ivm/join.js';\nimport type {Input, Storage} from '../ivm/operator.js';\nimport type {PrimaryKey} from '../ivm/schema.js';\nimport {Skip} from '../ivm/skip.js';\nimport type {Source} from '../ivm/source.js';\nimport {Take} from '../ivm/take.js';\nimport {createPredicate} from './filter.js';\nimport {MissingParameterError} from './error.js';\n\nexport type StaticQueryParameters = {\n authData: Record<string, JSONValue>;\n preMutationRow: Row | undefined;\n};\n\n/**\n * Interface required of caller to buildPipeline. Connects to constructed\n * pipeline to delegate environment to provide sources and storage.\n */\nexport interface BuilderDelegate {\n /**\n * Called once for each source needed by the AST.\n * Might be called multiple times with same tableName. It is OK to return\n * same storage instance in that case.\n */\n getSource(tableName: string): Source;\n\n /**\n * Called once for each operator that requires storage. Should return a new\n * unique storage object for each call.\n */\n createStorage(): Storage;\n}\n\n/**\n * Builds a pipeline from an AST. Caller must provide a delegate to create source\n * and storage interfaces as necessary.\n *\n * Usage:\n *\n * ```ts\n * class MySink implements Output {\n * readonly #input: Input;\n *\n * constructor(input: Input) {\n * this.#input = input;\n * this.#input.setOutput(this);\n * console.log([...this.#input.hydrate()]);\n * }\n *\n * push(change: Change, _: Operator) {\n * console.log(change);\n * }\n * }\n *\n * const input = buildPipeline(ast, myDelegate);\n * const sink = new MySink(input);\n * ```\n */\nexport function buildPipeline(\n ast: AST,\n delegate: BuilderDelegate,\n staticQueryParameters: StaticQueryParameters | undefined,\n): Input {\n return buildPipelineInternal(\n bindStaticParameters(ast, staticQueryParameters),\n delegate,\n staticQueryParameters,\n );\n}\n\nexport function bindStaticParameters(\n ast: AST,\n staticQueryParameters: StaticQueryParameters | undefined,\n) {\n const visit = (node: AST): AST => {\n if (node.where) {\n return {\n ...node,\n where: node.where.map(condition => ({\n ...condition,\n value: bindValue(condition.value),\n })),\n related: node.related?.map(sq => ({\n ...sq,\n subquery: visit(sq.subquery),\n })),\n };\n }\n return node;\n };\n\n const bindValue = (value: ValuePosition): LiteralValue => {\n if (isParameter(value)) {\n const anchor = must(\n staticQueryParameters,\n 'Static query params do not exist',\n )[value.anchor];\n assert(anchor !== undefined, `Missing parameter: ${value.anchor}`);\n const resolvedValue = anchor[value.field];\n // eslint-disable-next-line eqeqeq\n if (resolvedValue == null) {\n throw new MissingParameterError();\n }\n return resolvedValue as LiteralValue;\n }\n return value;\n };\n\n return visit(ast);\n}\n\nfunction isParameter(value: unknown): value is Parameter {\n return typeof value === 'object' && value !== null && 'type' in value;\n}\n\nfunction buildPipelineInternal(\n ast: AST,\n delegate: BuilderDelegate,\n staticQueryParameters: StaticQueryParameters | undefined,\n partitionKey?: string | undefined,\n): Input {\n const source = delegate.getSource(ast.table);\n const conn = source.connect(must(ast.orderBy), ast.where ?? []);\n let end: Input = conn;\n const {appliedFilters} = conn;\n\n if (ast.start) {\n end = new Skip(end, ast.start);\n }\n\n if (ast.where) {\n for (const condition of ast.where) {\n end = new Filter(\n end,\n appliedFilters ? 'push-only' : 'all',\n createPredicate(condition),\n );\n }\n }\n\n if (ast.limit) {\n end = new Take(end, delegate.createStorage(), ast.limit, partitionKey);\n }\n\n if (ast.related) {\n for (const sq of ast.related) {\n assert(sq.subquery.alias, 'Subquery must have an alias');\n const child = buildPipelineInternal(\n sq.subquery,\n delegate,\n staticQueryParameters,\n sq.correlation.childField,\n );\n end = new Join({\n parent: end,\n child,\n storage: delegate.createStorage(),\n parentKey: sq.correlation.parentField,\n childKey: sq.correlation.childField,\n relationshipName: sq.subquery.alias,\n hidden: sq.hidden ?? false,\n });\n }\n }\n\n return end;\n}\n\nexport function assertOrderingIncludesPK(\n ordering: Ordering,\n pk: PrimaryKey,\n): void {\n const orderingFields = ordering.map(([field]) => field);\n const missingFields = pk.filter(pkField => !orderingFields.includes(pkField));\n\n if (missingFields.length > 0) {\n throw new Error(\n `Ordering must include all primary key fields. Missing: ${missingFields.join(\n ', ',\n )}`,\n );\n }\n}\n", "import {\n assert,\n assertArray,\n assertObject,\n assertUndefined,\n unreachable,\n} from 'shared/src/asserts.js';\nimport type {Immutable} from 'shared/src/immutable.js';\nimport {must} from 'shared/src/must.js';\nimport {assertOrderingIncludesPK} from '../builder/builder.js';\nimport type {Change} from './change.js';\nimport type {Comparator, Row, Value} from './data.js';\nimport type {Input, Output} from './operator.js';\nimport type {TableSchema} from './schema.js';\n\n/**\n * Called when the view changes. The received data should be considered\n * immutable. Caller must not modify it. Passed data is valid until next\n * time listener is called.\n */\nexport type Listener = (entries: Immutable<View>) => void;\n\nexport type Format = {\n singular: boolean;\n relationships: Record<string, Format>;\n};\n\n/**\n * Implements a materialized view of the output of an operator.\n *\n * It might seem more efficient to use an immutable b-tree for the\n * materialization, but it's not so clear. Inserts in the middle are\n * asymptotically slower in an array, but can often be done with zero\n * allocations, where changes to the b-tree will often require several allocs.\n *\n * Also the plain array view is more convenient for consumers since you can dump\n * it into console to see what it is, rather than having to iterate it.\n */\nexport class ArrayView implements Output {\n readonly #input: Input;\n readonly #listeners = new Set<Listener>();\n readonly #schema: TableSchema;\n readonly #format: Format;\n\n // Synthetic \"root\" entry that has a single \"\" relationship, so that we can\n // treat all changes, including the root change, generically.\n readonly #root: Entry;\n\n onDestroy: (() => void) | undefined;\n\n #hydrated = false;\n #dirty = false;\n\n constructor(\n input: Input,\n format: Format = {singular: false, relationships: {}},\n ) {\n this.#input = input;\n this.#schema = input.getSchema();\n this.#format = format;\n this.#input.setOutput(this);\n this.#root = {'': format.singular ? undefined : []};\n assertOrderingIncludesPK(this.#schema.sort, this.#schema.primaryKey);\n }\n\n get data() {\n return this.#root[''] as View;\n }\n\n addListener(listener: Listener) {\n assert(!this.#listeners.has(listener), 'Listener already registered');\n this.#listeners.add(listener);\n if (this.#hydrated) {\n listener(this.data);\n }\n\n return () => {\n this.#listeners.delete(listener);\n };\n }\n\n #fireListeners() {\n for (const listener of this.#listeners) {\n listener(this.data);\n }\n }\n\n destroy() {\n this.#input.destroy();\n this.onDestroy?.();\n }\n\n hydrate() {\n if (this.#hydrated) {\n throw new Error(\"Can't hydrate twice\");\n }\n this.#hydrated = true;\n this.#dirty = true;\n for (const node of this.#input.fetch({})) {\n applyChange(\n this.#root,\n {type: 'add', node},\n this.#schema,\n '',\n this.#format,\n );\n }\n this.flush();\n }\n\n push(change: Change): void {\n this.#dirty = true;\n applyChange(this.#root, change, this.#schema, '', this.#format);\n }\n\n flush() {\n if (!this.#dirty) {\n return;\n }\n this.#dirty = false;\n this.#fireListeners();\n }\n}\n\nexport type View = EntryList | Entry | undefined;\nexport type EntryList = Entry[];\nexport type Entry = {[key: string]: Value | View};\n\nfunction applyChange(\n parentEntry: Entry,\n change: Change,\n schema: TableSchema,\n relationship: string,\n format: Format,\n) {\n if (schema.isHidden) {\n switch (change.type) {\n case 'add':\n case 'remove':\n for (const [relationship, children] of Object.entries(\n change.node.relationships,\n )) {\n const childSchema = must(schema.relationships[relationship]);\n for (const node of children) {\n applyChange(\n parentEntry,\n {type: change.type, node},\n childSchema,\n relationship,\n format,\n );\n }\n }\n return;\n case 'edit':\n // If hidden at this level it means that the hidden row was changed. If\n // the row was changed in such a way that it would change the\n // relationships then the edit would have been split into remove and\n // add.\n return;\n case 'child': {\n const childSchema = must(\n schema.relationships[change.child.relationshipName],\n );\n applyChange(\n parentEntry,\n change.child.change,\n childSchema,\n relationship,\n format,\n );\n return;\n }\n default:\n unreachable(change);\n }\n }\n\n const {singular, relationships: childFormats} = format;\n switch (change.type) {\n case 'add': {\n // TODO: Only create a new entry if we need to mutate the existing one.\n const newEntry: Entry = {\n ...change.node.row,\n };\n if (singular) {\n assertUndefined(\n parentEntry[relationship],\n 'single output already exists',\n );\n parentEntry[relationship] = newEntry;\n } else {\n const view = parentEntry[relationship];\n assertArray(view);\n const {pos, found} = binarySearch(view, newEntry, schema.compareRows);\n assert(!found, 'node already exists');\n view.splice(pos, 0, newEntry);\n }\n for (const [relationship, children] of Object.entries(\n change.node.relationships,\n )) {\n // TODO: Is there a flag to make TypeScript complain that dictionary access might be undefined?\n const childSchema = must(schema.relationships[relationship]);\n const childFormat = must(childFormats[relationship]);\n const newView = childFormat.singular ? undefined : ([] as EntryList);\n newEntry[relationship] = newView;\n for (const node of children) {\n applyChange(\n newEntry,\n {type: 'add', node},\n childSchema,\n relationship,\n childFormat,\n );\n }\n }\n break;\n }\n case 'remove': {\n if (singular) {\n assertObject(parentEntry[relationship]);\n parentEntry[relationship] = undefined;\n } else {\n assertArray(parentEntry[relationship]);\n const view = parentEntry[relationship];\n const {pos, found} = binarySearch(\n view,\n change.node.row,\n schema.compareRows,\n );\n assert(found, 'node does not exist');\n view.splice(pos, 1);\n }\n break;\n }\n case 'child': {\n let existing: Entry;\n if (singular) {\n assertObject(parentEntry[relationship]);\n existing = parentEntry[relationship];\n } else {\n assertArray(parentEntry[relationship]);\n const list = parentEntry[relationship];\n const {pos, found} = binarySearch(list, change.row, schema.compareRows);\n assert(found, 'node does not exist');\n existing = list[pos];\n }\n\n const childSchema = must(\n schema.relationships[change.child.relationshipName],\n );\n const childFormat = must(\n format.relationships[change.child.relationshipName],\n );\n applyChange(\n existing,\n change.child.change,\n childSchema,\n change.child.relationshipName,\n childFormat,\n );\n break;\n }\n case 'edit': {\n if (singular) {\n assertObject(parentEntry[relationship]);\n parentEntry[relationship] = {\n ...parentEntry[relationship],\n ...change.row,\n };\n } else {\n assertArray(parentEntry[relationship]);\n const view = parentEntry[relationship];\n // If the order changed due to the edit, we need to remove and reinsert.\n if (schema.compareRows(change.oldRow, change.row) === 0) {\n const {pos, found} = binarySearch(\n view,\n change.oldRow,\n schema.compareRows,\n );\n assert(found, 'node does not exists');\n view[pos] = makeEntryPreserveRelationships(\n change.row,\n view[pos],\n schema.relationships,\n );\n } else {\n // Remove\n const {pos, found} = binarySearch(\n view,\n change.oldRow,\n schema.compareRows,\n );\n assert(found, 'node does not exists');\n const oldEntry = view[pos];\n view.splice(pos, 1);\n\n // Insert\n {\n const {pos, found} = binarySearch(\n view,\n change.row,\n schema.compareRows,\n );\n assert(!found, 'node already exists');\n view.splice(\n pos,\n 0,\n makeEntryPreserveRelationships(\n change.row,\n oldEntry,\n schema.relationships,\n ),\n );\n }\n }\n }\n break;\n }\n default:\n unreachable(change);\n }\n}\n\n// TODO: Do not return an object. It puts unnecessary pressure on the GC.\nfunction binarySearch(view: EntryList, target: Entry, comparator: Comparator) {\n let low = 0;\n let high = view.length - 1;\n while (low <= high) {\n const mid = (low + high) >>> 1;\n const comparison = comparator(view[mid] as Row, target as Row);\n if (comparison < 0) {\n low = mid + 1;\n } else if (comparison > 0) {\n high = mid - 1;\n } else {\n return {pos: mid, found: true};\n }\n }\n return {pos: low, found: false};\n}\n\nfunction makeEntryPreserveRelationships(\n row: Row,\n entry: Entry,\n relationships: {[key: string]: TableSchema},\n): Entry {\n const result: Entry = {...row};\n for (const relationship in relationships) {\n assert(!(relationship in row), 'Relationship already exists');\n result[relationship] = entry[relationship];\n }\n return result;\n}\n", "import type {TableSchemaBase} from '../ivm/schema.js';\n\nexport type TableSchema = TableSchemaBase & {\n readonly relationships: {readonly [name: string]: Relationship};\n};\n\n/**\n * A schema might have a relationship to itself.\n * Given we cannot reference a variable in the same statement we initialize\n * the variable, we use a function to get around this.\n */\nexport type Lazy<T> = () => T;\n\ntype Relationship =\n | FieldRelationship<TableSchema, TableSchema>\n | JunctionRelationship<TableSchema, TableSchema, TableSchema>;\n\n/**\n * A relationship between two entities where\n * that relationship is defined via fields on both entities.\n */\ntype FieldRelationship<\n TSourceSchema extends TableSchema,\n TDestSchema extends TableSchema,\n> = {\n source: keyof TSourceSchema['columns'];\n dest: {\n field: keyof TDestSchema['columns'];\n schema: TDestSchema | Lazy<TDestSchema>;\n };\n};\n\n/**\n * A relationship between two entities where\n * that relationship is defined via a junction table.\n */\ntype JunctionRelationship<\n TSourceSchema extends TableSchema,\n TJunctionSchema extends TableSchema,\n TDestSchema extends TableSchema,\n> = {\n source: keyof TSourceSchema['columns'];\n junction: {\n sourceField: keyof TJunctionSchema['columns'];\n destField: keyof TJunctionSchema['columns'];\n schema: TDestSchema | Lazy<TJunctionSchema>;\n };\n dest: {\n field: keyof TDestSchema['columns'];\n schema: TDestSchema | Lazy<TJunctionSchema>;\n };\n};\n\nexport function isFieldRelationship(\n relationship: Relationship,\n): relationship is FieldRelationship<TableSchema, TableSchema> {\n return (\n (\n relationship as JunctionRelationship<\n TableSchema,\n TableSchema,\n TableSchema\n >\n ).junction === undefined\n );\n}\n\nexport function isJunctionRelationship(\n relationship: Relationship,\n): relationship is JunctionRelationship<TableSchema, TableSchema, TableSchema> {\n return !isFieldRelationship(relationship);\n}\n\n/**\n * Calling `related` on `Query` returns a new Query\n * since `related` moves through the relationship. This function takes\n * 1. A schema\n * 2. A relationship name\n * and returns the schema of the entity at the other end of the\n * relationship.\n */\nexport type PullSchemaForRelationship<\n TSchema extends TableSchema,\n TRelationship extends keyof TSchema['relationships'],\n> = TSchema['relationships'][TRelationship] extends FieldRelationship<\n TableSchema,\n infer TSchema\n>\n ? TSchema\n : TSchema['relationships'][TRelationship] extends JunctionRelationship<\n TableSchema,\n TableSchema,\n infer TSchema\n >\n ? TSchema\n : never;\n", "/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {assert} from 'shared/src/asserts.js';\nimport type {AST, Ordering} from '../ast/ast.js';\nimport {type BuilderDelegate, buildPipeline} from '../builder/builder.js';\nimport {ArrayView, type Format} from '../ivm/array-view.js';\nimport type {Row} from '../ivm/data.js';\nimport type {\n AddSelections,\n AddSubselect,\n DefaultQueryResultRow,\n GetFieldTypeNoNullOrUndefined,\n MakeSingular,\n Operator,\n Parameter,\n Query,\n QueryType,\n SchemaToRow,\n Selector,\n Smash,\n} from './query.js';\nimport {\n isFieldRelationship,\n isJunctionRelationship,\n type Lazy,\n type PullSchemaForRelationship,\n type TableSchema,\n} from './schema.js';\nimport type {TypedView} from './typed-view.js';\n\nexport function newQuery<\n TSchema extends TableSchema,\n TReturn extends QueryType = DefaultQueryResultRow<TSchema>,\n>(delegate: QueryDelegate, tableSchema: TSchema): Query<TSchema, TReturn> {\n return new QueryImpl(delegate, tableSchema);\n}\n\nfunction newQueryWithDetails<\n TSchema extends TableSchema,\n TReturn extends QueryType,\n>(\n delegate: QueryDelegate,\n schema: TSchema,\n ast: AST,\n format: Format | undefined,\n): Query<TSchema, TReturn> {\n return new QueryImpl(delegate, schema, ast, format);\n}\n\nexport type CommitListener = () => void;\nexport interface QueryDelegate extends BuilderDelegate {\n addServerQuery(ast: AST): () => void;\n onTransactionCommit(cb: CommitListener): () => void;\n}\n\nexport function staticParam<TAnchor, TField extends keyof TAnchor>(\n anchorClass: 'authData' | 'preMutationRow',\n field: TField,\n): Parameter<TAnchor, TField, TAnchor[TField]> {\n return {\n type: 'static',\n anchor: anchorClass,\n field,\n };\n}\n\nexport abstract class AbstractQuery<\n TSchema extends TableSchema,\n TReturn extends QueryType = DefaultQueryResultRow<TSchema>,\n> implements Query<TSchema, TReturn>\n{\n readonly #ast: AST;\n readonly #schema: TSchema;\n readonly #format: Format;\n\n constructor(\n schema: TSchema,\n ast?: AST | undefined,\n format?: Format | undefined,\n ) {\n this.#ast = ast ?? {\n table: schema.tableName,\n };\n this.#format = format ?? {singular: false, relationships: {}};\n this.#schema = schema;\n }\n\n get ast() {\n return this.#ast;\n }\n\n select<TFields extends Selector<TSchema>[]>(\n ..._fields: TFields\n ): Query<TSchema, AddSelections<TSchema, TFields, TReturn>> {\n // we return all columns for now so we ignore the selection set and only use it for type inference\n return this._newQuery(this.#schema, this.#ast, this.#format);\n }\n\n protected abstract _newQuery<\n TSchema extends TableSchema,\n TReturn extends QueryType,\n >(\n schema: TSchema,\n ast: AST,\n format: Format | undefined,\n ): Query<TSchema, TReturn>;\n\n one(): Query<TSchema, MakeSingular<TReturn>> {\n return this._newQuery(\n this.#schema,\n {\n ...this.#ast,\n limit: 1,\n },\n {\n ...this.#format,\n singular: true,\n },\n );\n }\n\n related<TRelationship extends keyof TSchema['relationships']>(\n relationship: TRelationship,\n ): Query<\n TSchema,\n AddSubselect<\n Query<\n PullSchemaForRelationship<TSchema, TRelationship>,\n DefaultQueryResultRow<PullSchemaForRelationship<TSchema, TRelationship>>\n >,\n TReturn,\n TRelationship & string\n >\n >;\n related<\n TRelationship extends keyof TSchema['relationships'],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n TSub extends Query<any, any>,\n >(\n relationship: TRelationship,\n cb: (\n query: Query<\n PullSchemaForRelationship<TSchema, TRelationship>,\n DefaultQueryResultRow<PullSchemaForRelationship<TSchema, TRelationship>>\n >,\n ) => TSub = q => q as any,\n ) {\n const related = this.#schema.relationships[relationship as string];\n assert(related, 'Invalid relationship');\n const related1 = related;\n const related2 = related;\n if (isFieldRelationship(related1)) {\n const destSchema = resolveSchema(related1.dest.schema);\n const sq = cb(\n this._newQuery(\n destSchema,\n {\n table: destSchema.tableName,\n alias: relationship as string,\n },\n undefined,\n ),\n ) as unknown as QueryImpl<any, any>;\n return this._newQuery(\n this.#schema,\n {\n ...this.#ast,\n related: [\n ...(this.#ast.related ?? []),\n {\n correlation: {\n parentField: related1.source,\n childField: related1.dest.field,\n op: '=',\n },\n subquery: addPrimaryKeysToAst(destSchema, sq.ast),\n },\n ],\n },\n {\n ...this.#format,\n relationships: {\n ...this.#format.relationships,\n [relationship as string]: sq.format,\n },\n },\n );\n }\n\n if (isJunctionRelationship(related2)) {\n const destSchema = resolveSchema(related2.dest.schema);\n const junctionSchema = resolveSchema(related2.junction.schema);\n const sq = cb(\n this._newQuery(\n destSchema,\n {\n table: destSchema.tableName,\n alias: relationship as string,\n },\n undefined,\n ),\n ) as unknown as QueryImpl<any, any>;\n return this._newQuery(\n this.#schema,\n {\n ...this.#ast,\n related: [\n ...(this.#ast.related ?? []),\n {\n correlation: {\n parentField: related2.source,\n childField: related2.junction.sourceField,\n op: '=',\n },\n subquery: {\n table: junctionSchema.tableName,\n alias: relationship as string,\n orderBy: addPrimaryKeys(junctionSchema, undefined),\n related: [\n {\n correlation: {\n parentField: related2.junction.destField,\n childField: related2.dest.field,\n op: '=',\n },\n hidden: true,\n subquery: addPrimaryKeysToAst(destSchema, sq.ast),\n },\n ],\n },\n },\n ],\n },\n {\n ...this.#format,\n relationships: {\n ...this.#format.relationships,\n [relationship as string]: sq.format,\n },\n },\n );\n }\n throw new Error(`Invalid relationship ${relationship as string}`);\n }\n\n where(\n field: any,\n opOrValue:\n | Operator\n | GetFieldTypeNoNullOrUndefined<any, any, any>\n | Parameter<any, any, any>,\n value?:\n | GetFieldTypeNoNullOrUndefined<any, any, any>\n | Parameter<any, any, any>,\n ): Query<TSchema, TReturn> {\n let op: Operator;\n if (value === undefined) {\n value = opOrValue;\n op = '=';\n } else {\n op = opOrValue as Operator;\n }\n\n return this._newQuery(\n this.#schema,\n {\n ...this.#ast,\n where: [\n ...(this.#ast.where ?? []),\n {\n type: 'simple',\n op,\n field: field as string,\n value,\n },\n ],\n },\n this.#format,\n );\n }\n\n start(\n row: Partial<SchemaToRow<TSchema>>,\n opts?: {inclusive: boolean} | undefined,\n ): Query<TSchema, TReturn> {\n return this._newQuery(\n this.#schema,\n {\n ...this.#ast,\n start: {\n row,\n exclusive: !opts?.inclusive,\n },\n },\n this.#format,\n );\n }\n\n limit(limit: number): Query<TSchema, TReturn> {\n if (limit < 0) {\n throw new Error('Limit must be non-negative');\n }\n if ((limit | 0) !== limit) {\n throw new Error('Limit must be an integer');\n }\n\n return this._newQuery(\n this.#schema,\n {\n ...this.#ast,\n limit,\n },\n this.#format,\n );\n }\n\n orderBy<TSelector extends keyof TSchema['columns']>(\n field: TSelector,\n direction: 'asc' | 'desc',\n ): Query<TSchema, TReturn> {\n return this._newQuery(\n this.#schema,\n {\n ...this.#ast,\n orderBy: [...(this.#ast.orderBy ?? []), [field as string, direction]],\n },\n this.#format,\n );\n }\n\n protected _completeAst(): AST {\n const finalOrderBy = addPrimaryKeys(this.#schema, this.#ast.orderBy);\n if (this.#ast.start) {\n const {row} = this.#ast.start;\n const narrowedRow: Row = {};\n for (const [field] of finalOrderBy) {\n narrowedRow[field] = row[field];\n }\n return {\n ...this.#ast,\n start: {\n ...this.#ast.start,\n row: narrowedRow,\n },\n orderBy: finalOrderBy,\n };\n }\n return {\n ...this.#ast,\n orderBy: addPrimaryKeys(this.#schema, this.#ast.orderBy),\n };\n }\n\n abstract materialize(): TypedView<Smash<TReturn>>;\n abstract preload(): {\n cleanup: () => void;\n };\n}\n\nexport class QueryImpl<\n TSchema extends TableSchema,\n TReturn extends QueryType = DefaultQueryResultRow<TSchema>,\n> extends AbstractQuery<TSchema, TReturn> {\n readonly #delegate: QueryDelegate;\n readonly #format: Format;\n\n constructor(\n delegate: QueryDelegate,\n schema: TSchema,\n ast?: AST | undefined,\n format?: Format | undefined,\n ) {\n super(schema, ast, format);\n this.#format = format ?? {singular: false, relationships: {}};\n this.#delegate = delegate;\n }\n\n get format() {\n return this.#format;\n }\n\n get singular(): TReturn['singular'] {\n return this.#format.singular;\n }\n\n protected _newQuery<TSchema extends TableSchema, TReturn extends QueryType>(\n schema: TSchema,\n ast: AST,\n format: Format | undefined,\n ): Query<TSchema, TReturn> {\n return newQueryWithDetails(this.#delegate, schema, ast, format);\n }\n\n materialize(): TypedView<Smash<TReturn>> {\n const ast = this._completeAst();\n const removeServerQuery = this.#delegate.addServerQuery(ast);\n const view = new ArrayView(\n buildPipeline(ast, this.#delegate, undefined),\n this.#format,\n );\n const removeCommitObserver = this.#delegate.onTransactionCommit(() => {\n view.flush();\n });\n view.onDestroy = () => {\n removeCommitObserver();\n removeServerQuery();\n };\n return view as unknown as TypedView<Smash<TReturn>>;\n }\n\n preload(): {\n cleanup: () => void;\n } {\n const ast = this._completeAst();\n const unsub = this.#delegate.addServerQuery(ast);\n return {\n cleanup: unsub,\n };\n }\n}\n\nfunction resolveSchema(\n maybeSchema: TableSchema | Lazy<TableSchema>,\n): TableSchema {\n if (typeof maybeSchema === 'function') {\n return maybeSchema();\n }\n\n return maybeSchema;\n}\n\nfunction addPrimaryKeys(\n schema: TableSchema,\n orderBy: Ordering | undefined,\n): Ordering {\n orderBy = orderBy ?? [];\n const {primaryKey} = schema;\n const primaryKeysToAdd = new Set(primaryKey);\n\n for (const [field] of orderBy) {\n primaryKeysToAdd.delete(field);\n }\n\n if (primaryKeysToAdd.size === 0) {\n return orderBy;\n }\n\n return [\n ...orderBy,\n ...[...primaryKeysToAdd].map(key => [key, 'asc'] as [string, 'asc']),\n ];\n}\n\nfunction addPrimaryKeysToAst(schema: TableSchema, ast: AST): AST {\n return {\n ...ast,\n orderBy: addPrimaryKeys(schema, ast.orderBy),\n };\n}\n", "import {LogContext, type LogLevel} from '@rocicorp/logger';\nimport {type Resolver, resolver} from '@rocicorp/resolver';\nimport {\n type ClientGroupID,\n type ClientID,\n type ExperimentalNoIndexDiff,\n type MutatorDefs,\n type PullRequestV0,\n type PullRequestV1,\n type Puller,\n type PullerResultV1,\n type PushRequestV0,\n type PushRequestV1,\n type Pusher,\n type PusherResult,\n type ReplicacheOptions,\n type UpdateNeededReason as ReplicacheUpdateNeededReason,\n dropDatabase,\n} from 'replicache';\nimport {ReplicacheImpl, type ReplicacheImplOptions} from 'replicache/impl';\nimport {assert, unreachable} from 'shared/src/asserts.js';\nimport {getDocument, getLocation} from 'shared/src/browser-env.js';\nimport {getDocumentVisibilityWatcher} from 'shared/src/document-visible.js';\nimport {must} from 'shared/src/must.js';\nimport {navigator} from 'shared/src/navigator.js';\nimport {sleep, sleepWithAbort} from 'shared/src/sleep.js';\nimport type {MaybePromise} from 'shared/src/types.js';\nimport * as valita from 'shared/src/valita.js';\nimport {\n type CRUDMutation,\n type CRUDMutationArg,\n CRUD_MUTATION_NAME,\n type ConnectedMessage,\n type CustomMutation,\n type Downstream,\n ErrorKind,\n type ErrorMessage,\n MutationType,\n type NullableVersion,\n type PingMessage,\n type PokeEndMessage,\n type PokePartMessage,\n type PokeStartMessage,\n type PushMessage,\n downstreamSchema,\n nullableVersionSchema,\n} from 'zero-protocol';\nimport type {ChangeDesiredQueriesMessage} from 'zero-protocol/src/change-desired-queries.js';\nimport type {\n PullRequestMessage,\n PullResponseBody,\n PullResponseMessage,\n} from 'zero-protocol/src/pull.js';\nimport {newQuery} from 'zql/src/zql/query/query-impl.js';\nimport type {Query} from 'zql/src/zql/query/query.js';\nimport type {TableSchema} from 'zql/src/zql/query/schema.js';\nimport {nanoid} from '../util/nanoid.js';\nimport {send} from '../util/socket.js';\nimport {ZeroContext} from './context.js';\nimport {\n type MakeCRUDMutate,\n type WithCRUD,\n makeCRUDMutate,\n makeCRUDMutator,\n} from './crud.js';\nimport {shouldEnableAnalytics} from './enable-analytics.js';\nimport {type HTTPString, type WSString, toWSString} from './http-string.js';\nimport {ENTITIES_KEY_PREFIX} from './keys.js';\nimport {type LogOptions, createLogOptions} from './log-options.js';\nimport {\n DID_NOT_CONNECT_VALUE,\n type DisconnectReason,\n MetricManager,\n REPORT_INTERVAL_MS,\n type Series,\n getLastConnectErrorValue,\n} from './metrics.js';\nimport type {ZeroOptions} from './options.js';\nimport {QueryManager} from './query-manager.js';\nimport {reloadWithReason, reportReloadReason} from './reload-error-handler.js';\nimport {ServerError, isAuthError, isServerError} from './server-error.js';\nimport {getServer} from './server-option.js';\nimport {version} from './version.js';\nimport {PokeHandler} from './zero-poke-handler.js';\n\nexport type Schema = {\n readonly version: number;\n readonly tables: {readonly [table: string]: TableSchema};\n};\n\nexport type NoRelations = Record<string, never>;\n\nexport type MakeEntityQueriesFromSchema<S extends Schema> = {\n readonly [K in keyof S['tables']]: Query<S['tables'][K]>;\n};\n\ndeclare const TESTING: boolean;\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 connectionState: () => ConnectionState;\n};\n\nexport const onSetConnectionStateSymbol = Symbol();\nexport const exposedToTestingSymbol = Symbol();\nexport const createLogOptionsSymbol = Symbol();\n\ninterface TestZero {\n [exposedToTestingSymbol]?: TestingContext;\n [onSetConnectionStateSymbol]?: (state: ConnectionState) => void;\n [createLogOptionsSymbol]?: (options: {\n consoleLogLevel: LogLevel;\n server: string | null;\n }) => LogOptions;\n}\n\nfunction asTestZero<S extends Schema>(z: Zero<S>): TestZero {\n return z as TestZero;\n}\n\nexport const enum ConnectionState {\n Disconnected,\n Connecting,\n Connected,\n}\n\nexport const RUN_LOOP_INTERVAL_MS = 5_000;\n\n/**\n * How frequently we should ping the server to keep the connection alive.\n */\nexport const PING_INTERVAL_MS = 5_000;\n\n/**\n * The amount of time we wait for a pong before we consider the ping timed out.\n */\nexport const 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_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\nconst CHECK_CONNECTIVITY_ON_ERROR_FREQUENCY = 6;\n\nconst NULL_LAST_MUTATION_ID_SENT = {clientID: '', id: -1} as const;\n\n// When the protocol changes (pull, push, poke,...) we need to bump this.\nconst REFLECT_VERSION = 1;\n\n/**\n * The reason {@link onUpdateNeeded} was called.\n */\nexport type UpdateNeededReason =\n // There is a new client group due to a new tab loading new code with\n // different mutators, indexes, schema version, or format version.\n // This tab cannot sync locally with this new tab until it updates to\n // the new code.\n | {type: 'NewClientGroup'}\n // This is used when Zero tries to connect with a version that the server\n // does not support\n | {type: 'VersionNotSupported'};\n\nfunction convertOnUpdateNeededReason(\n reason: ReplicacheUpdateNeededReason,\n): UpdateNeededReason {\n return {type: reason.type};\n}\n\nexport function updateNeededReloadReason(reason: UpdateNeededReason) {\n const {type} = reason;\n switch (type) {\n case 'NewClientGroup':\n return \"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 return \"The server no longer supports this client's protocol version.\";\n break;\n default:\n unreachable(type);\n }\n}\n\nexport function serverAheadReloadReason(kind: string) {\n return `Server reported that client is ahead of server (${kind}). 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}\n\nexport function 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\nconst enum PingResult {\n TimedOut = 0,\n Success = 1,\n}\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 MD extends MutatorDefs,\n S extends Schema,\n>(z: Zero<S>): ReplicacheImpl<MD> {\n return must(internalReplicacheImplMap.get(z)) as ReplicacheImpl<MD>;\n}\n\nexport class Zero<S extends Schema> {\n readonly version = version;\n\n readonly #rep: ReplicacheImpl<WithCRUD<MutatorDefs>>;\n readonly #server: HTTPString | null;\n readonly userID: string;\n\n readonly #lc: LogContext;\n readonly #logOptions: LogOptions;\n readonly #enableAnalytics: boolean;\n\n readonly #pokeHandler: PokeHandler;\n readonly #queryManager: QueryManager;\n\n #lastMutationIDSent: {clientID: string; id: number} =\n NULL_LAST_MUTATION_ID_SENT;\n\n #onPong: () => void = () => undefined;\n\n #online = false;\n\n /**\n * `onOnlineChange` is called when the Zero instance's online status\n * changes.\n */\n onOnlineChange: ((online: boolean) => void) | null | undefined = null;\n\n #onUpdateNeeded: ((reason: UpdateNeededReason) => void) | null = null;\n #onClientStateNotFound: ((reason?: string) => void) | null = null;\n readonly #jurisdiction: 'eu' | undefined;\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 readonly #zeroContext: ZeroContext;\n\n /**\n * `onUpdateNeeded` is called when a code update is needed.\n *\n * A code update can be needed because:\n * - the server no longer supports the protocol version of the current code,\n * - a new Zero client has created a new client group, because its code\n * has different mutators, indexes, schema version and/or format version\n * from this Zero client. This is likely due to the new client having\n * newer code. A code update is needed to be able to locally sync with this\n * new Zero client (i.e. to sync while offline, the clients can can\n * still sync with each other via the server).\n *\n * The default behavior is to reload the page (using `location.reload()`). Set\n * this to `null` or provide your own function to prevent the page from\n * reloading automatically. You may want to provide your own function to\n * display a toast to inform the end user there is a new version of your app\n * available and prompting them to refresh.\n */\n get onUpdateNeeded(): ((reason: UpdateNeededReason) => void) | null {\n return this.#onUpdateNeeded;\n }\n set onUpdateNeeded(callback: ((reason: UpdateNeededReason) => void) | null) {\n this.#onUpdateNeeded = callback;\n this.#rep.onUpdateNeeded =\n callback &&\n (reason => {\n callback(convertOnUpdateNeededReason(reason));\n });\n }\n\n /**\n * `onClientStateNotFound` is called when this client will no longer be able\n * to sync due to missing synchronization state. This can be because:\n * - the local persistent synchronization state has been garbage collected.\n * This can happen if the client has no pending mutations and has not been\n * used for a while.\n * - the zero-cache fails to find the synchronization state of this client.\n *\n * The default behavior is to reload the page (using `location.reload()`). Set\n * this to `null` or provide your own function to prevent the page from\n * reloading automatically.\n */\n get onClientStateNotFound(): (() => void) | null {\n return this.#onClientStateNotFound;\n }\n set onClientStateNotFound(value: (() => void) | null) {\n this.#onClientStateNotFound = value;\n this.#rep.onClientStateNotFound = value;\n }\n\n #connectResolver = resolver<void>();\n #pendingPullsByRequestID: Map<string, Resolver<PullResponseBody>> = new Map();\n #lastMutationIDReceived = 0;\n\n #socket: WebSocket | undefined = undefined;\n #socketResolver = resolver<WebSocket>();\n\n #connectionStateChangeResolver = resolver<ConnectionState>();\n\n /**\n * This resolver is only used for rejections. It is awaited in the connected\n * state (including when waiting for a pong). It is rejected when we get an\n * invalid message or an 'error' message.\n */\n #rejectMessageError: Resolver<never> | undefined = undefined;\n\n #closeAbortController = new AbortController();\n\n readonly #visibilityWatcher;\n\n // We use an accessor pair to allow the subclass to override the setter.\n #connectionState: ConnectionState = ConnectionState.Disconnected;\n\n #setConnectionState(state: ConnectionState) {\n if (state === this.#connectionState) {\n return;\n }\n\n this.#connectionState = state;\n this.#connectionStateChangeResolver.resolve(state);\n this.#connectionStateChangeResolver = resolver();\n\n if (TESTING) {\n asTestZero(this)[onSetConnectionStateSymbol]?.(state);\n }\n }\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>;\n\n readonly query: MakeEntityQueriesFromSchema<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 = () => getLocation()?.reload();\n\n /**\n * Constructs a new Zero client.\n */\n constructor(options: ZeroOptions<S>) {\n const {\n userID,\n onOnlineChange,\n jurisdiction,\n hiddenTabDisconnectDelay = DEFAULT_DISCONNECT_HIDDEN_DELAY_MS,\n kvStore = 'idb',\n schema,\n } = options;\n if (!userID) {\n throw new Error('ZeroOptions.userID must not be empty.');\n }\n const server = getServer(options.server);\n this.#enableAnalytics = shouldEnableAnalytics(\n server,\n options.enableAnalytics,\n );\n\n if (jurisdiction !== undefined && jurisdiction !== 'eu') {\n throw new Error('ZeroOptions.jurisdiction must be \"eu\" if present.');\n }\n if (hiddenTabDisconnectDelay < 0) {\n throw new Error(\n 'ZeroOptions.hiddenTabDisconnectDelay must not be negative.',\n );\n }\n\n this.onOnlineChange = onOnlineChange;\n this.#options = options;\n\n this.#logOptions = this.#createLogOptions({\n consoleLogLevel: options.logLevel ?? 'error',\n server: null, //server, // Reenable remote logging\n enableAnalytics: this.#enableAnalytics,\n });\n const logOptions = this.#logOptions;\n\n const replicacheMutators = {\n ['_zero_crud']: makeCRUDMutator(schema),\n };\n\n const replicacheOptions: ReplicacheOptions<WithCRUD<MutatorDefs>> = {\n schemaVersion: schema.version.toString(),\n logLevel: logOptions.logLevel,\n logSinks: [logOptions.logSink],\n mutators: replicacheMutators,\n name: `zero-${userID}`,\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 const replicacheImplOptions: ReplicacheImplOptions = {\n enableClientGroupForking: false,\n };\n\n const rep = new ReplicacheImpl(replicacheOptions, replicacheImplOptions);\n this.#rep = rep;\n\n if (TESTING) {\n internalReplicacheImplMap.set(this, rep);\n }\n\n rep.getAuth = this.#getAuthToken;\n this.#server = server;\n this.userID = userID;\n this.#jurisdiction = jurisdiction;\n this.#lc = new LogContext(\n logOptions.logLevel,\n {clientID: rep.clientID},\n logOptions.logSink,\n );\n this.onUpdateNeeded = (reason: UpdateNeededReason) => {\n reloadWithReason(\n this.#lc,\n this.#reload,\n updateNeededReloadReason(reason),\n );\n };\n this.onClientStateNotFound = (reason?: string) => {\n reloadWithReason(\n this.#lc,\n this.#reload,\n reason ?? ON_CLIENT_STATE_NOT_FOUND_REASON_CLIENT,\n );\n };\n\n this.mutate = makeCRUDMutate<S>(schema, rep.mutate);\n\n this.#queryManager = new QueryManager(rep.clientID, msg =>\n this.#sendChangeDesiredQueries(msg),\n );\n\n this.#zeroContext = new ZeroContext(schema.tables, ast =>\n this.#queryManager.add(ast),\n );\n\n rep.experimentalWatch(\n diff => this.#zeroContext.processChanges(diff as ExperimentalNoIndexDiff),\n {\n prefix: ENTITIES_KEY_PREFIX,\n initialValuesInFirstDiff: true,\n },\n );\n\n this.query = this.#registerQueries(schema);\n\n reportReloadReason(this.#lc);\n\n this.#metrics = new MetricManager({\n reportIntervalMs: REPORT_INTERVAL_MS,\n host: getLocation()?.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 poke => this.#rep.poke(poke),\n () => this.#onPokeError(),\n rep.clientID,\n this.#lc,\n );\n\n this.#visibilityWatcher = getDocumentVisibilityWatcher(\n getDocument(),\n hiddenTabDisconnectDelay,\n this.#closeAbortController.signal,\n );\n\n void this.#runLoop();\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 connectionState: () => this.#connectionState,\n };\n }\n }\n\n #sendChangeDesiredQueries(msg: ChangeDesiredQueriesMessage): void {\n if (this.#socket && this.#connectionState === ConnectionState.Connected) {\n send(this.#socket, msg);\n }\n }\n\n #createLogOptions(options: {\n consoleLogLevel: LogLevel;\n server: string | null;\n enableAnalytics: boolean;\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 * 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 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 * Provides facilities to write data to Zero.\n *\n * `mutate` is a function as well as a \"namespace\" object for doing CRUD style\n * mutations. When used as a function it is used to batch multiple mutations.\n *\n * ```ts\n * await zero.mutate.issue.create({id: '1', title: 'First issue'});\n * await zero.mutate.comment.create({id: '1', text: 'First comment', issueID: '1'});\n *\n * // or as a function:\n * await zero.mutate(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 * The benefit of using the function form is that it allows you to batch\n * multiple mutations together. This can be more efficient than making\n * individual calls to `create`, `update`, `set`, and `delete`.\n *\n * The function form of `mutate` is not allowed to be called inside another\n * `mutate` function. Doing so will throw an error.\n */\n readonly mutate: MakeCRUDMutate<S>;\n\n /**\n * Whether this Zero instance has been closed. Once a Zero instance has\n * been closed it no longer syncs and you can no longer read or write data out\n * of it. After it has been closed it is pretty much useless and should not be\n * used any more.\n */\n get closed(): boolean {\n return this.#rep.closed;\n }\n\n /**\n * Closes this Zero instance.\n *\n * When closed all subscriptions end and no more read or writes are allowed.\n */\n close(): Promise<void> {\n const lc = this.#lc.withContext('close');\n\n if (this.#connectionState !== ConnectionState.Disconnected) {\n this.#disconnect(lc, {\n client: 'ClientClosed',\n });\n }\n lc.debug?.('Aborting closeAbortController due to close()');\n this.#closeAbortController.abort();\n this.#metrics.stop();\n return this.#rep.close();\n }\n\n #onMessage = (e: MessageEvent<string>) => {\n const lc = this.#lc;\n lc.debug?.('received message', e.data);\n if (this.closed) {\n lc.debug?.('ignoring message because already closed');\n return;\n }\n\n const rejectInvalidMessage = (e?: unknown) =>\n this.#rejectMessageError?.reject(\n new Error(\n `Invalid message received from server: ${\n e instanceof Error ? e.message + '. ' : ''\n }${data}`,\n ),\n );\n\n let downMessage: Downstream;\n const {data} = e;\n try {\n downMessage = valita.parse(JSON.parse(data), downstreamSchema);\n } catch (e) {\n rejectInvalidMessage(e);\n return;\n }\n this.#messageCount++;\n switch (downMessage[0]) {\n case 'connected':\n return this.#handleConnectedMessage(lc, downMessage);\n\n case 'error':\n return this.#handleErrorMessage(lc, downMessage);\n\n case 'pong':\n return this.#onPong();\n\n case 'pokeStart':\n return this.#handlePokeStart(lc, downMessage);\n\n case 'pokePart':\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 default:\n rejectInvalidMessage();\n }\n };\n\n #onOpen = (e: Event) => {\n const l = addWebSocketIDFromSocketToLogContext(\n e.target as WebSocket,\n this.#lc,\n );\n if (this.#connectStart === undefined) {\n l.error?.(\n 'Got open event but connect start time is undefined. This should not happen.',\n );\n } else {\n const now = Date.now();\n const timeToOpenMs = now - this.#connectStart;\n l.info?.('Got socket open event', {\n navigatorOnline: navigator?.onLine,\n timeToOpenMs,\n });\n }\n };\n\n #onClose = (e: CloseEvent) => {\n const l = addWebSocketIDFromSocketToLogContext(\n e.target as WebSocket,\n this.#lc,\n );\n const {code, reason, wasClean} = e;\n l.info?.('Got socket close event', {code, reason, wasClean});\n\n const closeKind = wasClean ? 'CleanClose' : 'AbruptClose';\n this.#connectResolver.reject(new CloseError(closeKind));\n this.#disconnect(l, {client: closeKind});\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 lc.info?.(`${kind}: ${message}}`);\n\n const error = new ServerError(kind, message);\n\n this.#rejectMessageError?.reject(error);\n lc.debug?.('Rejecting connect resolver due to error', error);\n this.#connectResolver.reject(error);\n this.#disconnect(lc, {server: kind});\n\n if (kind === ErrorKind.VersionNotSupported) {\n this.onUpdateNeeded?.({type: kind});\n } else if (kind === ErrorKind.ClientNotFound) {\n await this.#rep.disableClientGroup();\n this.#onClientStateNotFound?.(onClientStateNotFoundServerReason(message));\n } else if (\n kind === ErrorKind.InvalidConnectionRequestLastMutationID ||\n kind === ErrorKind.InvalidConnectionRequestBaseCookie\n ) {\n await dropDatabase(this.#rep.idbName);\n reloadWithReason(lc, this.#reload, serverAheadReloadReason(kind));\n }\n }\n\n async #handleConnectedMessage(\n lc: LogContext,\n connectedMessage: ConnectedMessage,\n ) {\n const now = Date.now();\n const [, connectBody] = connectedMessage;\n lc = addWebSocketIDToLogContext(connectBody.wsid, lc);\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 = undefined;\n let connectMsgLatencyMs = undefined;\n if (this.#connectStart === undefined) {\n lc.error?.(\n 'Got connected message but connect start time is undefined. This should not happen.',\n );\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 = undefined;\n if (this.#totalToConnectStart === undefined) {\n lc.error?.(\n 'Got connected message but total to connect start time is undefined. This should not happen.',\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.#lastMutationIDSent = NULL_LAST_MUTATION_ID_SENT;\n\n lc.debug?.('Resolving connect resolver');\n const queriesPatch = await this.#rep.query(tx =>\n this.#queryManager.getQueriesPatch(tx),\n );\n assert(this.#socket);\n send(this.#socket, [\n 'initConnection',\n {\n desiredQueriesPatch: queriesPatch,\n },\n ]);\n this.#setConnectionState(ConnectionState.Connected);\n this.#connectResolver.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 #connect} will throw an assertion error if the\n * {@link #connectionState} is not {@link ConnectionState.Disconnected}.\n * Callers MUST check the connection state before calling this method and log\n * an error as needed.\n *\n * The function will resolve once the socket is connected. If you need to know\n * when a connection has been established, as in we have received the\n * {@link ConnectedMessage}, you should await the {@link #connectResolver}\n * promise. The {@link #connectResolver} promise rejects if an error message\n * is received before the connected message is received or if the connection\n * attempt times out.\n */\n async #connect(l: LogContext): Promise<void> {\n assert(this.#server);\n\n // All the callers check this state already.\n assert(this.#connectionState === ConnectionState.Disconnected);\n\n const wsid = nanoid();\n l = addWebSocketIDToLogContext(wsid, l);\n l.info?.('Connecting...', {navigatorOnline: navigator?.onLine});\n\n this.#setConnectionState(ConnectionState.Connecting);\n\n // connect() called but connect start time is defined. This should not\n // happen.\n assert(this.#connectStart === undefined);\n\n const now = Date.now();\n this.#connectStart = now;\n if (this.#totalToConnectStart === undefined) {\n this.#totalToConnectStart = now;\n }\n\n if (this.closed) {\n return;\n }\n this.#connectCookie = valita.parse(\n await this.#rep.cookie,\n nullableVersionSchema,\n );\n if (this.closed) {\n return;\n }\n // Reject connect after a timeout.\n const timeoutID = setTimeout(() => {\n l.debug?.('Rejecting connect resolver due to timeout');\n this.#connectResolver.reject(new TimedOutError('Connect'));\n this.#disconnect(l, {\n client: 'ConnectTimeout',\n });\n }, CONNECT_TIMEOUT_MS);\n const abortHandler = () => {\n clearTimeout(timeoutID);\n };\n this.#closeAbortController.signal.addEventListener('abort', abortHandler);\n\n const ws = createSocket(\n toWSString(this.#server),\n this.#connectCookie,\n this.clientID,\n await this.clientGroupID,\n this.#options.schema.version,\n this.userID,\n this.#rep.auth,\n this.#jurisdiction,\n this.#lastMutationIDReceived,\n wsid,\n this.#options.logLevel === 'debug',\n l,\n );\n\n if (this.closed) {\n return;\n }\n\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 try {\n l.debug?.('Waiting for connection to be acknowledged');\n await this.#connectResolver.promise;\n } finally {\n clearTimeout(timeoutID);\n this.#closeAbortController.signal.removeEventListener(\n 'abort',\n abortHandler,\n );\n }\n }\n\n #disconnect(l: LogContext, reason: DisconnectReason): void {\n if (this.#connectionState === ConnectionState.Connecting) {\n this.#connectErrorCount++;\n }\n l.info?.('disconnecting', {\n navigatorOnline: navigator?.onLine,\n reason,\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.#connectionState,\n connectErrorCount: this.#connectErrorCount,\n });\n\n switch (this.#connectionState) {\n case ConnectionState.Connected: {\n if (this.#connectStart !== undefined) {\n l.error?.(\n 'disconnect() called while connected but connect start time is defined. This should not happen.',\n );\n // this._connectStart reset below.\n }\n\n break;\n }\n case ConnectionState.Connecting: {\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(\n `connectErrorCount=${this.#connectErrorCount}`,\n );\n }\n // this._connectStart reset below.\n if (this.#connectStart === undefined) {\n l.error?.(\n 'disconnect() called while connecting but connect start time is undefined. This should not happen.',\n );\n }\n\n break;\n }\n case ConnectionState.Disconnected:\n l.error?.('disconnect() called while disconnected');\n break;\n }\n\n this.#socketResolver = resolver();\n l.debug?.('Creating new connect resolver');\n this.#connectResolver = resolver();\n this.#setConnectionState(ConnectionState.Disconnected);\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();\n this.#socket = undefined;\n this.#lastMutationIDSent = NULL_LAST_MUTATION_ID_SENT;\n this.#pokeHandler.handleDisconnect();\n }\n\n async #handlePokeStart(_lc: LogContext, pokeMessage: PokeStartMessage) {\n this.#abortPingTimeout();\n await this.#pokeHandler.handlePokeStart(pokeMessage[1]);\n }\n\n async #handlePokePart(_lc: LogContext, pokeMessage: PokePartMessage) {\n this.#abortPingTimeout();\n const lastMutationIDChangeForSelf = await this.#pokeHandler.handlePokePart(\n pokeMessage[1],\n );\n if (lastMutationIDChangeForSelf !== undefined) {\n this.#lastMutationIDReceived = lastMutationIDChangeForSelf;\n }\n }\n\n async #handlePokeEnd(_lc: LogContext, pokeMessage: PokeEndMessage) {\n this.#abortPingTimeout();\n await this.#pokeHandler.handlePokeEnd(pokeMessage[1]);\n }\n\n #onPokeError() {\n const lc = this.#lc;\n lc.info?.(\n 'poke error, disconnecting?',\n this.#connectionState !== ConnectionState.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.#connectionState !== ConnectionState.Disconnected) {\n this.#disconnect(lc, {\n client: 'UnexpectedBaseCookie',\n });\n }\n }\n\n #handlePullResponse(\n lc: LogContext,\n pullResponseMessage: PullResponseMessage,\n ) {\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(\n req: PushRequestV0 | PushRequestV1,\n requestID: string,\n ): Promise<PusherResult> {\n // The deprecation of pushVersion 0 predates zero-client\n assert(req.pushVersion === 1);\n // If we are connecting we wait until we are connected.\n await this.#connectResolver.promise;\n const lc = this.#lc.withContext('requestID', requestID);\n lc.debug?.(`pushing ${req.mutations.length} mutations`);\n const socket = this.#socket;\n assert(socket);\n\n const isMutationRecoveryPush =\n req.clientGroupID !== (await this.clientGroupID);\n const start = isMutationRecoveryPush\n ? 0\n : req.mutations.findIndex(\n m =>\n m.clientID === this.#lastMutationIDSent.clientID &&\n m.id === this.#lastMutationIDSent.id,\n ) + 1;\n lc.debug?.(\n isMutationRecoveryPush ? 'pushing for recovery' : 'pushing',\n req.mutations.length - start,\n 'mutations of',\n req.mutations.length,\n 'mutations.',\n );\n const now = Date.now();\n for (let i = start; i < req.mutations.length; i++) {\n const m = req.mutations[i];\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: [m.args as CRUDMutationArg],\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 // Zero schema versions are always numbers.\n schemaVersion: parseInt(req.schemaVersion),\n requestID,\n },\n ];\n send(socket, msg);\n if (!isMutationRecoveryPush) {\n this.#lastMutationIDSent = {clientID: m.clientID, id: m.id};\n }\n }\n return {\n httpRequestInfo: {\n errorMessage: '',\n httpStatusCode: 200,\n },\n };\n }\n\n #getAuthToken = (): MaybePromise<string> | undefined => {\n const {auth} = this.#options;\n return typeof auth === 'function' ? auth() : auth;\n };\n\n async #updateAuthToken(lc: LogContext): Promise<void> {\n const auth = await this.#getAuthToken();\n if (auth) {\n lc.debug?.('Got auth token');\n this.#rep.auth = auth;\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 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 await this.#updateAuthToken(bareLogContext);\n\n let needsReauth = false;\n let gotError = false;\n\n while (!this.closed) {\n runLoopCounter++;\n let lc = getLogContext();\n\n try {\n switch (this.#connectionState) {\n case ConnectionState.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 // If hidden, we wait for the tab to become visible before trying again.\n await this.#visibilityWatcher.waitForVisible();\n\n // If we got an auth error we try to get a new auth token before reconnecting.\n if (needsReauth) {\n await this.#updateAuthToken(lc);\n }\n\n await this.#connect(lc);\n if (this.closed) {\n break;\n }\n\n // Now we have a new socket, update lc with the new wsid.\n assert(this.#socket);\n lc = getLogContext();\n\n lc.debug?.('Connected successfully');\n gotError = false;\n needsReauth = false;\n this.#setOnline(true);\n break;\n }\n\n case ConnectionState.Connecting:\n // Can't get here because Disconnected waits for Connected or\n // rejection.\n lc.error?.('unreachable');\n gotError = true;\n break;\n\n case ConnectionState.Connected: {\n // When connected we wait for whatever happens first out of:\n // - After PING_INTERVAL_MS we send a ping\n // - We get disconnected\n // - We get a message\n // - We get an error (rejectMessageError rejects)\n // - The tab becomes hidden (with a delay)\n\n const controller = new AbortController();\n this.#abortPingTimeout = () => controller.abort();\n const [pingTimeoutPromise, pingTimeoutAborted] = sleepWithAbort(\n PING_INTERVAL_MS,\n controller.signal,\n );\n\n this.#rejectMessageError = resolver();\n\n const enum RaceCases {\n Ping = 0,\n Hidden = 2,\n }\n\n const raceResult = await promiseRace([\n pingTimeoutPromise,\n pingTimeoutAborted,\n this.#visibilityWatcher.waitForHidden(),\n this.#connectionStateChangeResolver.promise,\n this.#rejectMessageError.promise,\n ]);\n\n if (this.closed) {\n this.#rejectMessageError = undefined;\n break;\n }\n\n switch (raceResult) {\n case RaceCases.Ping: {\n const pingResult = await this.#ping(\n lc,\n this.#rejectMessageError.promise,\n );\n if (pingResult === PingResult.TimedOut) {\n gotError = true;\n }\n break;\n }\n case RaceCases.Hidden:\n this.#disconnect(lc, {\n client: 'Hidden',\n });\n this.#setOnline(false);\n break;\n }\n\n this.#rejectMessageError = undefined;\n }\n }\n } catch (ex) {\n if (this.#connectionState !== ConnectionState.Connected) {\n lc.error?.('Failed to connect', ex, {\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.#connectionState,\n 'exception:',\n ex,\n );\n\n if (isAuthError(ex)) {\n if (!needsReauth) {\n needsReauth = true;\n // First auth error, try right away without waiting.\n continue;\n }\n needsReauth = true;\n }\n\n if (\n isServerError(ex) ||\n ex instanceof TimedOutError ||\n ex instanceof CloseError\n ) {\n gotError = true;\n }\n }\n\n // Only authentication errors are retried immediately the first time they\n // occur. All other errors wait a few seconds before retrying the first\n // time. We specifically do not use a backoff for consecutive errors\n // because it's a bad experience to wait many seconds for reconnection.\n\n if (gotError) {\n this.#setOnline(false);\n let cfGetCheckSucceeded = false;\n const cfGetCheckURL = new URL(this.#server);\n cfGetCheckURL.pathname = '/api/canary/v0/get';\n cfGetCheckURL.searchParams.set('id', nanoid());\n const cfGetCheckController = new AbortController();\n fetch(cfGetCheckURL, {signal: cfGetCheckController.signal})\n .then(_ => {\n cfGetCheckSucceeded = true;\n })\n .catch(_ => {\n cfGetCheckSucceeded = false;\n });\n\n lc.debug?.(\n 'Sleeping',\n RUN_LOOP_INTERVAL_MS,\n 'ms before reconnecting due to error, state:',\n this.#connectionState,\n );\n await sleep(RUN_LOOP_INTERVAL_MS);\n cfGetCheckController.abort();\n if (!cfGetCheckSucceeded) {\n lc.info?.(\n 'Canary request failed, resetting total time to connect start time.',\n );\n this.#totalToConnectStart = undefined;\n }\n }\n }\n }\n\n async #puller(\n req: PullRequestV0 | PullRequestV1,\n requestID: string,\n ): Promise<PullerResultV1> {\n // The deprecation of pushVersion 0 predates zero-client\n assert(req.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.#connectResolver.promise;\n const socket = this.#socket;\n assert(socket);\n // Mutation recovery pull.\n lc.debug?.('Pull is for mutation recovery');\n const cookie = valita.parse(req.cookie, nullableVersionSchema);\n const pullRequestMessage: PullRequestMessage = [\n 'pull',\n {\n clientGroupID: req.clientGroupID,\n cookie,\n requestID,\n },\n ];\n send(socket, pullRequestMessage);\n const pullResponseResolver: Resolver<PullResponseBody> = resolver();\n this.#pendingPullsByRequestID.set(requestID, pullResponseResolver);\n try {\n const enum RaceCases {\n Timeout = 0,\n Response = 1,\n }\n const raceResult = await promiseRace([\n sleep(PULL_TIMEOUT_MS),\n pullResponseResolver.promise,\n ]);\n switch (raceResult) {\n case RaceCases.Timeout:\n lc.debug?.('Mutation recovery pull timed out');\n throw new Error('Pull timed out');\n case RaceCases.Response: {\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 assert(false, 'unreachable');\n }\n } finally {\n pullResponseResolver.reject('timed out');\n this.#pendingPullsByRequestID.delete(requestID);\n }\n }\n\n #setOnline(online: boolean): void {\n if (this.#online === online) {\n return;\n }\n\n this.#online = online;\n this.onOnlineChange?.(online);\n }\n\n /**\n * A rough heuristic for whether the client is currently online and\n * authenticated.\n */\n get online(): boolean {\n return this.#online;\n }\n\n /**\n * Starts a a ping and waits for a pong.\n *\n * If it takes too long to get a pong we disconnect and this returns\n * {@code PingResult.TimedOut}.\n */\n async #ping(\n l: LogContext,\n messageErrorRejectionPromise: Promise<never>,\n ): Promise<PingResult> {\n l.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);\n send(this.#socket, pingMessage);\n\n const connected =\n (await promiseRace([\n promise,\n sleep(PING_TIMEOUT_MS),\n messageErrorRejectionPromise,\n ])) === 0;\n\n const delta = performance.now() - t0;\n if (!connected) {\n l.info?.('ping failed in', delta, 'ms - disconnecting');\n this.#disconnect(l, {\n client: 'PingTimeout',\n });\n return PingResult.TimedOut;\n }\n\n l.debug?.('ping succeeded in', delta, 'ms');\n return PingResult.Success;\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 void 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 #registerQueries(schema: S): MakeEntityQueriesFromSchema<S> {\n const rv = {} as Record<string, Query<TableSchema>>;\n const context = this.#zeroContext;\n // Not using parse yet\n for (const [name, table] of Object.entries(schema.tables)) {\n rv[name] = newQuery(context, table);\n }\n\n return rv as MakeEntityQueriesFromSchema<S>;\n }\n}\n\nexport function createSocket(\n socketOrigin: WSString,\n baseCookie: NullableVersion,\n clientID: string,\n clientGroupID: string,\n schemaVersion: number,\n userID: string,\n auth: string | undefined,\n jurisdiction: 'eu' | undefined,\n lmid: number,\n wsid: string,\n debugPerf: boolean,\n lc: LogContext,\n): WebSocket {\n const url = new URL(socketOrigin);\n // Keep this in sync with the server.\n url.pathname = `/api/sync/v${REFLECT_VERSION}/connect`;\n const {searchParams} = url;\n searchParams.set('clientID', clientID);\n searchParams.set('clientGroupID', clientGroupID);\n searchParams.set('schemaVersion', schemaVersion.toString());\n searchParams.set('userID', userID);\n if (jurisdiction !== undefined) {\n searchParams.set('jurisdiction', jurisdiction);\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 if (debugPerf) {\n searchParams.set('debugPerf', true.toString());\n }\n\n lc.info?.('Connecting to', url.toString());\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 return new WebSocket(\n // toString() required for RN URL polyfill.\n url.toString(),\n auth === '' || auth === undefined ? undefined : encodeURIComponent(auth),\n );\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\n/**\n * Like Promise.race but returns the index of the first promise that resolved.\n */\nfunction promiseRace(ps: Promise<unknown>[]): Promise<number> {\n return Promise.race(ps.map((p, i) => p.then(() => i)));\n}\n\nclass TimedOutError extends Error {\n constructor(m: string) {\n super(`${m} timed out`);\n }\n}\n\nclass CloseError extends Error {}\n", "// Helpers for some objects from the browser environment. These are wrapped in\n// functions because Replicache runs in environments that do not have these\n// objects (such as Web Workers, Deno etc).\n\nexport function getDocument(): Document | undefined {\n return typeof document !== 'undefined' ? document : undefined;\n}\n\nexport function getLocation(): Location | undefined {\n return typeof location !== 'undefined' ? location : undefined;\n}\n", "import {resolver} from '@rocicorp/resolver';\n\ntype PartialDocument = Pick<\n Document,\n 'visibilityState' | 'addEventListener' | 'removeEventListener'\n>;\n\nexport function getDocumentVisibilityWatcher(\n doc: PartialDocument | undefined,\n hiddenIntervalMS: number,\n signal: AbortSignal,\n): DocumentVisibilityWatcher {\n return doc\n ? new DocumentVisibilityWatcherImpl(doc, hiddenIntervalMS, signal)\n : new DocumentVisibilityWatcherNoDoc();\n}\n\nexport interface DocumentVisibilityWatcher {\n readonly visibilityState: DocumentVisibilityState;\n waitForVisible(): Promise<unknown>;\n waitForHidden(): Promise<unknown>;\n}\n\nclass DocumentVisibilityWatcherImpl implements DocumentVisibilityWatcher {\n readonly #doc: PartialDocument;\n readonly #hiddenIntervalMS: number;\n #timeoutID: ReturnType<typeof setTimeout> | 0 = 0;\n\n // This trails doc.visibilityState by hiddenIntervalMS when being hidden. This\n // is because we want to wait for the tab to be hidden for a while before\n // considering as hidden.\n visibilityState: DocumentVisibilityState;\n\n readonly #promises = new Set<{\n resolve: () => void;\n state: DocumentVisibilityState;\n }>();\n\n constructor(\n doc: PartialDocument,\n hiddenIntervalMS: number,\n signal: AbortSignal,\n ) {\n this.#doc = doc;\n this.#hiddenIntervalMS = hiddenIntervalMS;\n this.visibilityState = doc.visibilityState;\n // Safari got support for abort signal in addEventListener in version\n // 15 (Released 2021-09-20)\n this.#doc.addEventListener('visibilitychange', this.#onVisibilityChange, {\n signal,\n });\n }\n\n #onVisibilityChange = () => {\n if (this.#doc.visibilityState === 'visible') {\n clearTimeout(this.#timeoutID);\n this.#setVisibilityState('visible');\n } else {\n this.#timeoutID = setTimeout(() => {\n this.#setVisibilityState('hidden');\n }, this.#hiddenIntervalMS);\n }\n };\n\n #setVisibilityState(visibilityState: DocumentVisibilityState) {\n if (visibilityState === this.visibilityState) {\n return;\n }\n this.visibilityState = visibilityState;\n for (const entry of this.#promises) {\n const {resolve, state} = entry;\n if (state === visibilityState) {\n resolve();\n this.#promises.delete(entry);\n }\n }\n }\n\n waitForVisible(): Promise<unknown> {\n return this.#waitFor('visible');\n }\n\n waitForHidden(): Promise<unknown> {\n return this.#waitFor('hidden');\n }\n\n #waitFor(state: DocumentVisibilityState): Promise<unknown> {\n if (this.visibilityState === state) {\n return Promise.resolve();\n }\n\n const {promise, resolve} = resolver();\n this.#promises.add({resolve, state});\n return promise;\n }\n}\n\nconst resolvedPromise = Promise.resolve();\nconst promiseThatNeverResolves = new Promise(() => undefined);\n\nclass DocumentVisibilityWatcherNoDoc implements DocumentVisibilityWatcher {\n readonly visibilityState: DocumentVisibilityState = 'visible';\n waitForVisible(): Promise<unknown> {\n return resolvedPromise;\n }\n\n waitForHidden(): Promise<unknown> {\n return promiseThatNeverResolves;\n }\n}\n", "type Navigator = {\n onLine: boolean;\n userAgent: string;\n // add more as needed\n};\n\nconst localNavigator: Navigator | undefined =\n typeof navigator !== 'undefined' ? navigator : undefined;\n\nexport {localNavigator as navigator};\n", "import {resolver} from '@rocicorp/resolver';\nimport {AbortError} from './abort-error.js';\n\nconst promiseVoid = Promise.resolve();\nconst promiseNever = new Promise<void>(() => undefined);\n\n/**\n * Creates a promise that resolves after `ms` milliseconds. Note that if you\n * pass in `0` no `setTimeout` is used and the promise resolves immediately. In\n * other words no macro task is used in that case.\n *\n * Pass in an AbortSignal to clear the timeout.\n */\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms === 0) {\n return promiseVoid;\n }\n\n return new Promise((resolve, reject) => {\n let handleAbort: () => void;\n if (signal) {\n handleAbort = () => {\n clearTimeout(id);\n reject(new AbortError('Aborted'));\n };\n signal.addEventListener('abort', handleAbort, {once: true});\n }\n\n const id = setTimeout(() => {\n resolve();\n signal?.removeEventListener('abort', handleAbort);\n }, ms);\n });\n}\n\n/**\n * Returns a pair of promises. The first promise resolves after `ms` milliseconds\n * unless the AbortSignal is aborted. The second promise resolves when the AbortSignal\n * is aborted.\n */\nexport function sleepWithAbort(\n ms: number,\n signal: AbortSignal,\n): [ok: Promise<void>, aborted: Promise<void>] {\n if (ms === 0) {\n return [promiseVoid, promiseNever];\n }\n\n const {promise: abortedPromise, resolve: abortedResolve} = resolver<void>();\n\n const sleepPromise = new Promise<void>(resolve => {\n const handleAbort = () => {\n clearTimeout(id);\n abortedResolve();\n };\n\n const id = setTimeout(() => {\n resolve();\n signal.removeEventListener('abort', handleAbort);\n }, ms);\n\n signal.addEventListener('abort', handleAbort, {once: true});\n });\n\n return [sleepPromise, abortedPromise];\n}\n", "export class AbortError extends Error {\n name = 'AbortError';\n}\n", "import * as v from '@badrap/valita';\n\nexport * from '@badrap/valita';\n\nfunction toDisplay(value: unknown): string {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n return JSON.stringify(value);\n case 'undefined':\n return 'undefined';\n case 'bigint':\n return value.toString() + 'n';\n default:\n if (value === null) {\n return 'null';\n }\n if (Array.isArray(value)) {\n return 'array';\n }\n return typeof value;\n }\n}\n\ntype Key = string | number;\n\nfunction toDisplayAtPath(v: unknown, path: Key[] | undefined): string {\n if (!path?.length) {\n return toDisplay(v);\n }\n\n let cur = v;\n for (const p of path) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cur = (cur as any)[p];\n }\n return toDisplay(cur);\n}\n\nfunction displayList<T>(\n word: string,\n expected: T[],\n toDisplay: (x: T) => string | number = x => String(x),\n): string | number {\n if (expected.length === 1) {\n return toDisplay(expected[0]);\n }\n\n const suffix = `${toDisplay(\n expected[expected.length - 2],\n )} ${word} ${toDisplay(expected[expected.length - 1])}`;\n if (expected.length === 2) {\n return suffix;\n }\n return `${expected.slice(0, -2).map(toDisplay).join(', ')}, ${suffix}`;\n}\n\nfunction getMessage(err: v.Err, v: unknown): string {\n const firstIssue = err.issues[0];\n const {path} = firstIssue;\n const atPath = path?.length ? ` at ${path.join('.')}` : '';\n\n switch (firstIssue.code) {\n case 'invalid_type':\n return `Expected ${displayList(\n 'or',\n firstIssue.expected,\n )}${atPath}. Got ${toDisplayAtPath(v, path)}`;\n case 'missing_value': {\n const atPath =\n path && path.length > 1 ? ` at ${path.slice(0, -1).join('.')}` : '';\n\n if (firstIssue.path?.length) {\n return `Missing property ${firstIssue.path.at(-1)}${atPath}`;\n }\n return `TODO Unknown missing property${atPath}`;\n }\n\n case 'invalid_literal':\n return `Expected literal value ${displayList(\n 'or',\n firstIssue.expected,\n toDisplay,\n )}${atPath} Got ${toDisplayAtPath(v, path)}`;\n\n case 'invalid_length': {\n return `Expected array with length ${\n firstIssue.minLength === firstIssue.maxLength\n ? firstIssue.minLength\n : `between ${firstIssue.minLength} and ${firstIssue.maxLength}`\n }${atPath}. Got array with length ${(v as {length: number}).length}`;\n }\n\n case 'unrecognized_keys':\n if (firstIssue.keys.length === 1) {\n return `Unexpected property ${firstIssue.keys[0]}${atPath}`;\n }\n return `Unexpected properties ${displayList(\n 'and',\n firstIssue.keys,\n )}${atPath}`;\n\n case 'invalid_union':\n return `Invalid union value${atPath}`;\n\n case 'custom_error': {\n const {error} = firstIssue;\n const message = !error\n ? 'unknown'\n : typeof error === 'string'\n ? error\n : error.message ?? 'unknown';\n return `${message}${atPath}. Got ${toDisplayAtPath(v, path)}`;\n }\n }\n}\n\n/**\n * 'strip' allows unknown properties and removes unknown properties.\n * 'strict' errors if there are unknown properties.\n * 'passthrough' allows unknown properties.\n */\nexport type ParseOptionsMode = 'passthrough' | 'strict' | 'strip';\n\nexport function parse<T>(\n value: unknown,\n schema: v.Type<T>,\n mode?: ParseOptionsMode,\n): T {\n const res = test(value, schema, mode);\n if (!res.ok) {\n throw new TypeError(res.error);\n }\n return res.value;\n}\n\nexport function is<T>(\n value: unknown,\n schema: v.Type<T>,\n mode?: ParseOptionsMode,\n): value is T {\n return test(value, schema, mode).ok;\n}\n\nexport function assert<T>(\n value: unknown,\n schema: v.Type<T>,\n mode?: ParseOptionsMode,\n): asserts value is T {\n parse(value, schema, mode);\n}\n\ntype Result<T> = {ok: true; value: T} | {ok: false; error: string};\n\nexport function test<T>(\n value: unknown,\n schema: v.Type<T>,\n mode?: ParseOptionsMode,\n): Result<T> {\n const res = (schema as v.Type<T>).try(value, mode ? {mode} : undefined);\n if (!res.ok) {\n return {ok: false, error: getMessage(res, value)};\n }\n return res;\n}\n\n/**\n * Shallowly marks the schema as readonly.\n */\nexport function readonly<T extends v.Type>(t: T): v.Type<Readonly<v.Infer<T>>> {\n return t as v.Type<Readonly<v.Infer<T>>>;\n}\n\nexport function readonlyObject<T extends Record<string, v.Type | v.Optional>>(\n t: T,\n): v.ObjectType<Readonly<T>, undefined> {\n return v.object(t);\n}\n\nexport function readonlyArray<T extends v.Type>(\n t: T,\n): v.Type<\n readonly [...Readonly<T extends v.Type<unknown> ? v.Infer<T>[] : []>]\n> {\n return v.array(t);\n}\n\nexport function readonlyRecord<T extends v.Type>(\n t: T,\n): v.Type<Readonly<Record<string, v.Infer<T>>>> {\n return v.record(t);\n}\n", "/**\n * Wire-format representation of the zql AST interface.\n *\n * `v.Type<...>` types are explicitly declared to facilitate Typescript verification\n * that the schemas satisfy the zql type definitions. (Incidentally, explicit types\n * are also required for recursive schema definitions.)\n */\n\nimport * as v from 'shared/src/valita.js';\nimport type {CorrelatedSubQuery} from 'zql/src/zql/ast/ast.js';\n\nfunction readonly<T>(t: v.Type<T>): v.Type<Readonly<T>> {\n return t as v.Type<Readonly<T>>;\n}\n\nexport const selectorSchema = v.string();\n\nconst orderingElementSchema = readonly(\n v.tuple([selectorSchema, v.union(v.literal('asc'), v.literal('desc'))]),\n);\n\nexport const orderingSchema = readonly(v.array(orderingElementSchema));\n\nexport const primitiveSchema = v.union(\n v.string(),\n v.number(),\n v.boolean(),\n v.null(),\n);\n\nexport const equalityOpsSchema = v.union(v.literal('='), v.literal('!='));\n\nexport const orderOpsSchema = v.union(\n v.literal('<'),\n v.literal('>'),\n v.literal('<='),\n v.literal('>='),\n);\n\nexport const likeOpsSchema = v.union(\n v.literal('LIKE'),\n v.literal('NOT LIKE'),\n v.literal('ILIKE'),\n v.literal('NOT ILIKE'),\n);\n\nexport const inOpsSchema = v.union(v.literal('IN'), v.literal('NOT IN'));\n\nexport const simpleOperatorSchema = v.union(\n equalityOpsSchema,\n orderOpsSchema,\n likeOpsSchema,\n inOpsSchema,\n);\n\nexport const simpleConditionSchema = v.object({\n type: v.literal('simple'),\n op: simpleOperatorSchema,\n field: selectorSchema,\n value: v.union(\n v.string(),\n v.number(),\n v.boolean(),\n readonly(v.array(v.union(v.string(), v.number(), v.boolean()))),\n v.object({\n type: v.literal('static'),\n anchor: v.union(v.literal('authData'), v.literal('preMutationRow')),\n field: v.string(),\n }),\n ),\n});\n\nexport const conditionSchema = simpleConditionSchema;\n\n// Split out so that its inferred type can be checked against\n// Omit<CorrelatedSubQuery, 'correlation'> in ast-type-test.ts.\n// The mutually-recursive reference of the 'other' field to astSchema\n// is the only thing added in v.lazy. The v.lazy is necessary due to the\n// mutually-recursive types, but v.lazy prevents inference of the resulting\n// type.\nexport const correlatedSubquerySchemaOmitSubquery = v.object({\n correlation: v.object({\n parentField: v.string(),\n childField: v.string(),\n op: v.literal('='),\n }),\n hidden: v.boolean().optional(),\n});\n\nexport const correlatedSubquerySchema: v.Type<CorrelatedSubQuery> =\n correlatedSubquerySchemaOmitSubquery.extend({\n subquery: v.lazy(() => astSchema),\n });\n\nexport const astSchema = v.object({\n schema: v.string().optional(),\n table: v.string(),\n alias: v.string().optional(),\n where: readonly(v.array(conditionSchema)).optional(),\n related: readonly(v.array(correlatedSubquerySchema)).optional(),\n limit: v.number().optional(),\n orderBy: orderingSchema.optional(),\n start: v\n .object({\n row: v.record(\n v.union(v.string(), v.number(), v.boolean(), v.null(), v.undefined()),\n ),\n exclusive: v.boolean(),\n })\n .optional(),\n});\n", "import * as v from 'shared/src/valita.js';\nimport {astSchema} from './ast.js';\n\nconst putOpSchema = v.object({\n op: v.literal('put'),\n hash: v.string(),\n ast: astSchema,\n});\n\nconst delOpSchema = v.object({\n op: v.literal('del'),\n hash: v.string(),\n});\n\nconst clearOpSchema = v.object({\n op: v.literal('clear'),\n});\n\nconst patchOpSchema = v.union(putOpSchema, delOpSchema, clearOpSchema);\n\nexport const queriesPatchSchema = v.array(patchOpSchema);\n\nexport type QueriesPutOp = v.Infer<typeof putOpSchema>;\nexport type QueriesDelOp = v.Infer<typeof delOpSchema>;\nexport type QueriesClearOp = v.Infer<typeof clearOpSchema>;\nexport type QueriesPatchOp = v.Infer<typeof patchOpSchema>;\nexport type QueriesPatch = v.Infer<typeof queriesPatchSchema>;\n", "import * as v from 'shared/src/valita.js';\nimport {queriesPatchSchema} from './queries-patch.js';\n\nconst changeDesiredQueriesBodySchema = v.object({\n desiredQueriesPatch: queriesPatchSchema,\n});\n\nexport const changeDesiredQueriesMessageSchema = v.tuple([\n v.literal('changeDesiredQueries'),\n changeDesiredQueriesBodySchema,\n]);\n\nexport type ChangeDesiredQueriesBody = v.Infer<\n typeof changeDesiredQueriesBodySchema\n>;\nexport type ChangeDesiredQueriesMessage = v.Infer<\n typeof changeDesiredQueriesMessageSchema\n>;\n", "import * as v from 'shared/src/valita.js';\n\nconst putOpSchema = v.object({\n op: v.literal('put'),\n clientID: v.string(),\n});\n\nconst delOpSchema = v.object({\n op: v.literal('del'),\n clientID: v.string(),\n});\n\nconst clearOpSchema = v.object({\n op: v.literal('clear'),\n});\n\nconst patchOpSchema = v.union(putOpSchema, delOpSchema, clearOpSchema);\n\nexport const clientsPatchSchema = v.array(patchOpSchema);\n\nexport type ClientsPutOp = v.Infer<typeof putOpSchema>;\nexport type ClientsDelOp = v.Infer<typeof delOpSchema>;\nexport type ClientsClearOp = v.Infer<typeof clearOpSchema>;\nexport type ClientsPatchOp = v.Infer<typeof patchOpSchema>;\nexport type ClientsPatch = v.Infer<typeof clientsPatchSchema>;\n", "import * as v from 'shared/src/valita.js';\nimport {queriesPatchSchema} from './queries-patch.js';\n\n/**\n * After opening a websocket the client waits for a `connected` message\n * from the server. It then sends an `initConnection` message to the\n * server. The server waits for the `initConnection` message before\n * beginning to send pokes to the newly connected client, so as to avoid\n * syncing lots of queries which are no longer desired by the client.\n */\n\nexport const connectedBodySchema = v.object({\n wsid: v.string(),\n timestamp: v.number().optional(),\n});\n\nexport const connectedMessageSchema = v.tuple([\n v.literal('connected'),\n connectedBodySchema,\n]);\n\nconst initConnectionBodySchema = v.object({\n desiredQueriesPatch: queriesPatchSchema,\n});\n\nexport const initConnectionMessageSchema = v.tuple([\n v.literal('initConnection'),\n initConnectionBodySchema,\n]);\n\nexport type ConnectedBody = v.Infer<typeof connectedBodySchema>;\nexport type ConnectedMessage = v.Infer<typeof connectedMessageSchema>;\n\nexport type InitConnectionBody = v.Infer<typeof initConnectionBodySchema>;\nexport type InitConnectionMessage = v.Infer<typeof initConnectionMessageSchema>;\n", "import * as v from 'shared/src/valita.js';\n\n// Note: Metric names depend on these values,\n// so if you add or change on here a corresponding dashboard\n// change will likely be needed.\n\nexport enum ErrorKind {\n AuthInvalidated = 'AuthInvalidated',\n ClientNotFound = 'ClientNotFound',\n InvalidConnectionRequest = 'InvalidConnectionRequest',\n InvalidConnectionRequestBaseCookie = 'InvalidConnectionRequestBaseCookie',\n InvalidConnectionRequestLastMutationID = 'InvalidConnectionRequestLastMutationID',\n InvalidConnectionRequestClientDeleted = 'InvalidConnectionRequestClientDeleted',\n InvalidMessage = 'InvalidMessage',\n InvalidPush = 'InvalidPush',\n MutationFailed = 'MutationFailed',\n Unauthorized = 'Unauthorized',\n VersionNotSupported = 'VersionNotSupported',\n Internal = 'Internal',\n}\n\nexport const errorKindSchema = v.union(\n v.literal(ErrorKind.AuthInvalidated),\n v.literal(ErrorKind.ClientNotFound),\n v.literal(ErrorKind.InvalidConnectionRequest),\n v.literal(ErrorKind.InvalidConnectionRequestBaseCookie),\n v.literal(ErrorKind.InvalidConnectionRequestLastMutationID),\n v.literal(ErrorKind.InvalidConnectionRequestClientDeleted),\n v.literal(ErrorKind.InvalidMessage),\n v.literal(ErrorKind.InvalidPush),\n v.literal(ErrorKind.MutationFailed),\n v.literal(ErrorKind.Unauthorized),\n v.literal(ErrorKind.VersionNotSupported),\n v.literal(ErrorKind.Internal),\n);\n\nexport const errorMessageSchema: v.Type<ErrorMessage> = v.tuple([\n v.literal('error'),\n errorKindSchema,\n v.string(),\n]);\n\nexport type ErrorMessage = ['error', ErrorKind, string];\n", "import * as v from 'shared/src/valita.js';\n\nexport const versionSchema = v.string();\nexport const nullableVersionSchema = v.union(versionSchema, v.null());\n\nexport type Version = v.Infer<typeof versionSchema>;\nexport type NullableVersion = v.Infer<typeof nullableVersionSchema>;\n", "import * as valita from '@badrap/valita';\nimport {skipAssertJSONValue} from './config.js';\nimport type {ReadonlyJSONObject, ReadonlyJSONValue} from './json.js';\nimport {isJSONObject, isJSONValue} from './json.js';\nimport * as v from './valita.js';\n\nconst path: (string | number)[] = [];\n\nexport const jsonSchema: valita.Type<ReadonlyJSONValue> = v\n .unknown()\n .chain(v => {\n if (skipAssertJSONValue) {\n return valita.ok(v as ReadonlyJSONValue);\n }\n const rv = isJSONValue(v, path)\n ? valita.ok(v)\n : valita.err({\n message: `Not a JSON value`,\n path: path.slice(),\n });\n path.length = 0;\n return rv;\n });\n\nexport const jsonObjectSchema: valita.Type<ReadonlyJSONObject> = v\n .unknown()\n .chain(v => {\n if (skipAssertJSONValue) {\n return valita.ok(v as ReadonlyJSONObject);\n }\n const rv = isJSONObject(v, path)\n ? valita.ok(v)\n : valita.err({\n message: `Not a JSON object`,\n path: path.slice(),\n });\n path.length = 0;\n return rv;\n });\n", "declare const process: {\n env: {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n NODE_ENV?: string;\n };\n};\n\nexport const isProd = process.env.NODE_ENV === 'production';\n\nexport {isProd as skipAssertJSONValue};\n", "import {assertObject, throwInvalidType} from './asserts.js';\nimport {skipAssertJSONValue} from './config.js';\nimport {hasOwn} from './has-own.js';\n\n/** The values that can be represented in JSON */\nexport type JSONValue =\n | null\n | string\n | boolean\n | number\n | Array<JSONValue>\n | JSONObject;\n\n/**\n * A JSON object. This is a map from strings to JSON values or `undefined`. We\n * allow `undefined` values as a convenience... but beware that the `undefined`\n * values do not round trip to the server. For example:\n *\n * ```\n * // Time t1\n * await tx.set('a', {a: undefined});\n *\n * // time passes, in a new transaction\n * const v = await tx.get('a');\n * console.log(v); // either {a: undefined} or {}\n * ```\n */\nexport type JSONObject = {[key: string]: JSONValue | undefined};\n\n/** Like {@link JSONValue} but deeply readonly */\nexport type ReadonlyJSONValue =\n | null\n | string\n | boolean\n | number\n | ReadonlyArray<ReadonlyJSONValue>\n | ReadonlyJSONObject;\n\n/** Like {@link JSONObject} but deeply readonly */\nexport type ReadonlyJSONObject = {\n readonly [key: string]: ReadonlyJSONValue | undefined;\n};\n\n/**\n * Checks deep equality of two JSON value with (almost) same semantics as\n * `JSON.stringify`. The only difference is that with `JSON.stringify` the\n * ordering of the properties in an object/map/dictionary matters. In\n * {@link deepEqual} the following two values are consider equal, even though the\n * strings JSON.stringify would produce is different:\n *\n * ```js\n * assert(deepEqual(t({a: 1, b: 2}, {b: 2, a: 1}))\n * ```\n */\nexport function deepEqual(\n a: ReadonlyJSONValue | undefined,\n b: ReadonlyJSONValue | undefined,\n): boolean {\n if (a === b) {\n return true;\n }\n\n if (typeof a !== typeof b) {\n return false;\n }\n\n switch (typeof a) {\n case 'boolean':\n case 'number':\n case 'string':\n return false;\n }\n\n // a cannot be undefined here because either a and b are undefined or their\n // types are different.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n a = a!;\n\n // 'object'\n if (Array.isArray(a)) {\n if (!Array.isArray(b)) {\n return false;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n\n if (a === null || b === null) {\n return false;\n }\n\n if (Array.isArray(b)) {\n return false;\n }\n\n // We know a and b are objects here but type inference is not smart enough.\n a = a as ReadonlyJSONObject;\n b = b as ReadonlyJSONObject;\n\n // We use for-in loops instead of for of Object.keys() to make sure deepEquals\n // does not allocate any objects.\n\n let aSize = 0;\n for (const key in a) {\n if (hasOwn(a, key)) {\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n aSize++;\n }\n }\n\n let bSize = 0;\n for (const key in b) {\n if (hasOwn(b, key)) {\n bSize++;\n }\n }\n\n return aSize === bSize;\n}\n\nexport function assertJSONValue(v: unknown): asserts v is JSONValue {\n if (skipAssertJSONValue) {\n return;\n }\n switch (typeof v) {\n case 'boolean':\n case 'number':\n case 'string':\n return;\n case 'object':\n if (v === null) {\n return;\n }\n if (Array.isArray(v)) {\n return assertJSONArray(v);\n }\n return assertObjectIsJSONObject(v as Record<string, unknown>);\n }\n throwInvalidType(v, 'JSON value');\n}\n\nexport function assertJSONObject(v: unknown): asserts v is JSONObject {\n assertObject(v);\n assertObjectIsJSONObject(v);\n}\n\nfunction assertObjectIsJSONObject(\n v: Record<string, unknown>,\n): asserts v is JSONObject {\n for (const k in v) {\n if (hasOwn(v, k)) {\n const value = v[k];\n if (value !== undefined) {\n assertJSONValue(value);\n }\n }\n }\n}\n\nfunction assertJSONArray(v: unknown[]): asserts v is JSONValue[] {\n for (const item of v) {\n assertJSONValue(item);\n }\n}\n\ninterface Path {\n push(key: string | number): void;\n pop(): void;\n}\n\n/**\n * Checks if a value is a JSON value. If there is a value that is not a JSON\n * value, the path parameter is updated to the path of the invalid value.\n */\nexport function isJSONValue(v: unknown, path: Path): v is JSONValue {\n switch (typeof v) {\n case 'boolean':\n case 'number':\n case 'string':\n return true;\n case 'object':\n if (v === null) {\n return true;\n }\n if (Array.isArray(v)) {\n return isJSONArray(v, path);\n }\n return objectIsJSONObject(v as Record<string, unknown>, path);\n }\n return false;\n}\n\nexport function isJSONObject(v: unknown, path: Path): v is JSONObject {\n if (typeof v !== 'object' || v === null) {\n return false;\n }\n return objectIsJSONObject(v as Record<string, unknown>, path);\n}\n\nfunction objectIsJSONObject(\n v: Record<string, unknown>,\n path: Path,\n): v is JSONObject {\n for (const k in v) {\n if (hasOwn(v, k)) {\n path.push(k);\n const value = v[k];\n if (value !== undefined && !isJSONValue(value, path)) {\n return false;\n }\n path.pop();\n }\n }\n return true;\n}\n\nfunction isJSONArray(v: unknown[], path: Path): v is JSONValue[] {\n for (let i = 0; i < v.length; i++) {\n path.push(i);\n if (!isJSONValue(v[i], path)) {\n return false;\n }\n path.pop();\n }\n return true;\n}\n\n/** Basic deep readonly type. It works for {@link JSONValue} types. */\nexport type DeepReadonly<T> = T extends\n | null\n | boolean\n | string\n | number\n | undefined\n ? T\n : {readonly [K in keyof T]: DeepReadonly<T[K]>};\n", "import * as v from 'shared/src/valita.js';\n\n/**\n * attribute name => value\n * Single entry models simple primary keys.\n * Multiple entries models composite primary keys.\n */\nexport const entityIDSchema = v.record(v.string());\n\nexport type EntityID = v.Infer<typeof entityIDSchema>;\n", "import {jsonObjectSchema} from 'shared/src/json-schema.js';\nimport * as v from 'shared/src/valita.js';\nimport {entityIDSchema} from './entity.js';\n\nconst putOpSchema = v.object({\n op: v.literal('put'),\n entityType: v.string(),\n entityID: entityIDSchema,\n value: jsonObjectSchema,\n});\n\nconst updateOpSchema = v.object({\n op: v.literal('update'),\n entityType: v.string(),\n entityID: entityIDSchema,\n merge: jsonObjectSchema.optional(),\n constrain: v.array(v.string()).optional(),\n});\n\nconst delOpSchema = v.object({\n op: v.literal('del'),\n entityType: v.string(),\n entityID: entityIDSchema,\n});\n\nconst clearOpSchema = v.object({\n op: v.literal('clear'),\n});\n\nconst entityPatchOpSchema = v.union(\n putOpSchema,\n updateOpSchema,\n delOpSchema,\n clearOpSchema,\n);\n\nexport const entitiesPatchSchema = v.array(entityPatchOpSchema);\nexport type EntitiesPutOp = v.Infer<typeof putOpSchema>;\nexport type EntitiesUpdateOp = v.Infer<typeof updateOpSchema>;\nexport type EntitiesDelOp = v.Infer<typeof delOpSchema>;\nexport type EntitiesClearOp = v.Infer<typeof clearOpSchema>;\nexport type EntitiesPatchOp = v.Infer<typeof entityPatchOpSchema>;\nexport type EntitiesPatch = v.Infer<typeof entitiesPatchSchema>;\n", "import * as v from 'shared/src/valita.js';\nimport {nullableVersionSchema, versionSchema} from './version.js';\nimport {clientsPatchSchema} from './clients-patch.js';\nimport {queriesPatchSchema} from './queries-patch.js';\nimport {entitiesPatchSchema} from './entities-patch.js';\n\n/**\n * Pokes use a multi-part format. Pokes send entity data to the client and can\n * be multiple mega-bytes in size. Using a multi-part format allows the server\n * to avoid having to have the full poke in memory at one time.\n *\n * Each poke is assigned a `pokeID`, a unique id (within the context of the\n * connection) for identifying the poke. All messages for a poke will have the\n * same `pokeID`.\n *\n * A poke begins with a `poke-start` message which contains the `baseCookie`\n * the poke is updating from and the `cookie` the poke is updating to.\n *\n * The poke continues with zero to many `poke-part` messages, each of which\n * can contain patch parts. These patch parts should be merged in the order\n * received.\n *\n * Finally, the poke ends with a `poke-end` message. The merged `poke-parts`\n * can now be applied as a whole to update from `baseCookie` to `cookie`.\n *\n * Poke messages can be intermingled with other `down` messages, but cannot be\n * intermingled with poke messages for a different `pokeID`. If this is\n * observed it is an unexpected error; the client should ignore both pokes,\n * disconnect, and reconnect.\n */\n\nexport const pokeStartBodySchema = v.object({\n pokeID: v.string(),\n // We always specify a Version as our cookie, but Replicache starts clients\n // with initial cookie `null`, before the first request. So we have to be\n // able to send a base cookie with value `null` to match that state.\n baseCookie: nullableVersionSchema,\n cookie: versionSchema,\n timestamp: v.number().optional(),\n});\n\nexport const pokePartBodySchema = v.object({\n pokeID: v.string(),\n // Changes to last mutation id by client id.\n lastMutationIDChanges: v.record(v.number()).optional(),\n // Patches to the set of \"alive\" clients (according to server) belonging to\n // this client group.\n clientsPatch: clientsPatchSchema.optional(),\n // Patches to the desired query sets by client id.\n desiredQueriesPatches: v.record(queriesPatchSchema).optional(),\n // Patches to the set of queries for which entities are sync'd in\n // entitiesPatch.\n gotQueriesPatch: queriesPatchSchema.optional(),\n // Patches to the entities set.\n entitiesPatch: entitiesPatchSchema.optional(),\n});\n\nexport const pokeEndBodySchema = v.object({\n pokeID: v.string(),\n});\n\nexport const pokeStartMessageSchema = v.tuple([\n v.literal('pokeStart'),\n pokeStartBodySchema,\n]);\nexport const pokePartMessageSchema = v.tuple([\n v.literal('pokePart'),\n pokePartBodySchema,\n]);\nexport const pokeEndMessageSchema = v.tuple([\n v.literal('pokeEnd'),\n pokeEndBodySchema,\n]);\n\nexport type PokeStartBody = v.Infer<typeof pokeStartBodySchema>;\nexport type PokePartBody = v.Infer<typeof pokePartBodySchema>;\nexport type PokeEndBody = v.Infer<typeof pokeEndBodySchema>;\n\nexport type PokeStartMessage = v.Infer<typeof pokeStartMessageSchema>;\nexport type PokePartMessage = v.Infer<typeof pokePartMessageSchema>;\nexport type PokeEndMessage = v.Infer<typeof pokeEndMessageSchema>;\n", "import * as v from 'shared/src/valita.js';\n\nexport const pongBodySchema = v.object({});\nexport const pongMessageSchema = v.tuple([v.literal('pong'), pongBodySchema]);\n\nexport type PongBody = v.Infer<typeof pongBodySchema>;\nexport type PongMessage = v.Infer<typeof pongMessageSchema>;\n", "import * as v from 'shared/src/valita.js';\nimport {nullableVersionSchema, versionSchema} from './version.js';\n\nexport const pullRequestBodySchema = v.object({\n clientGroupID: v.string(),\n cookie: nullableVersionSchema,\n requestID: v.string(),\n});\n\nexport const pullResponseBodySchema = v.object({\n cookie: versionSchema,\n // Matches pullRequestBodySchema requestID that initiated this response\n requestID: v.string(),\n lastMutationIDChanges: v.record(v.number()),\n // Pull is currently only used for mutation recovery which does not use\n // the patch so we save work by not computing the patch.\n});\n\nexport const pullRequestMessageSchema = v.tuple([\n v.literal('pull'),\n pullRequestBodySchema,\n]);\n\nexport const pullResponseMessageSchema = v.tuple([\n v.literal('pull'),\n pullResponseBodySchema,\n]);\n\nexport type PullRequestBody = v.Infer<typeof pullRequestBodySchema>;\nexport type PullResponseBody = v.Infer<typeof pullResponseBodySchema>;\n\nexport type PullRequestMessage = v.Infer<typeof pullRequestMessageSchema>;\nexport type PullResponseMessage = v.Infer<typeof pullResponseMessageSchema>;\n", "import * as v from 'shared/src/valita.js';\nimport {connectedMessageSchema} from './connect.js';\nimport {errorMessageSchema} from './error.js';\nimport {\n pokeEndMessageSchema,\n pokePartMessageSchema,\n pokeStartMessageSchema,\n} from './poke.js';\nimport {pongMessageSchema} from './pong.js';\nimport {pullResponseMessageSchema} from './pull.js';\n\nexport const downstreamSchema = v.union(\n connectedMessageSchema,\n errorMessageSchema,\n pongMessageSchema,\n pokeStartMessageSchema,\n pokePartMessageSchema,\n pokeEndMessageSchema,\n pullResponseMessageSchema,\n);\n\nexport type Downstream = v.Infer<typeof downstreamSchema>;\n", "import * as v from 'shared/src/valita.js';\n\nexport const pingBodySchema = v.object({});\nexport const pingMessageSchema = v.tuple([v.literal('ping'), pingBodySchema]);\n\nexport type PingBody = v.Infer<typeof pingBodySchema>;\nexport type PingMessage = v.Infer<typeof pingMessageSchema>;\n", "import {jsonObjectSchema, jsonSchema} from 'shared/src/json-schema.js';\nimport * as v from 'shared/src/valita.js';\nimport {entityIDSchema} from './entity.js';\n\nexport const CRUD_MUTATION_NAME = '_zero_crud';\nexport enum MutationType {\n CRUD = 'crud',\n Custom = 'custom',\n}\n\n/**\n * Inserts if entity with id does not already exist.\n */\nconst createOpSchema = v.object({\n op: v.literal('create'),\n entityType: v.string(),\n id: entityIDSchema,\n value: jsonObjectSchema,\n});\n\n/**\n * Upsert semantics. Inserts if entity with id does not already exist,\n * otherwise updates existing entity with id.\n */\nconst setOpSchema = v.object({\n op: v.literal('set'),\n entityType: v.string(),\n id: entityIDSchema,\n value: jsonObjectSchema,\n});\n\n/**\n * Updates if entity with id exists, otherwise does nothing.\n */\nconst updateOpSchema = v.object({\n op: v.literal('update'),\n entityType: v.string(),\n id: entityIDSchema,\n partialValue: jsonObjectSchema,\n});\n\n/**\n * Deletes entity with id if it exists, otherwise does nothing.\n */\nconst deleteOpSchema = v.object({\n op: v.literal('delete'),\n entityType: v.string(),\n id: entityIDSchema,\n});\n\nconst crudOpSchema = v.union(\n createOpSchema,\n setOpSchema,\n updateOpSchema,\n deleteOpSchema,\n);\n\nconst crudArgSchema = v.object({\n ops: v.array(crudOpSchema),\n});\n\nconst crudArgsSchema = v.tuple([crudArgSchema]);\n\nexport const crudMutationSchema = v.object({\n type: v.literal(MutationType.CRUD),\n id: v.number(),\n clientID: v.string(),\n name: v.literal(CRUD_MUTATION_NAME),\n args: crudArgsSchema,\n timestamp: v.number(),\n});\n\nexport const customMutationSchema = v.object({\n type: v.literal(MutationType.Custom),\n id: v.number(),\n clientID: v.string(),\n name: v.string(),\n args: v.array(jsonSchema),\n timestamp: v.number(),\n});\n\nexport const mutationSchema = v.union(crudMutationSchema, customMutationSchema);\n\nexport const pushBodySchema = v.object({\n clientGroupID: v.string(),\n mutations: v.array(mutationSchema),\n pushVersion: v.number(),\n schemaVersion: v.number(),\n timestamp: v.number(),\n requestID: v.string(),\n});\n\nexport const pushMessageSchema = v.tuple([v.literal('push'), pushBodySchema]);\n\nexport type CreateOp = v.Infer<typeof createOpSchema>;\nexport type SetOp = v.Infer<typeof setOpSchema>;\nexport type UpdateOp = v.Infer<typeof updateOpSchema>;\nexport type DeleteOp = v.Infer<typeof deleteOpSchema>;\nexport type CRUDOp = v.Infer<typeof crudOpSchema>;\nexport type CRUDOpKind = CRUDOp['op'];\nexport type CRUDMutationArg = v.Infer<typeof crudArgSchema>;\nexport type CRUDMutation = v.Infer<typeof crudMutationSchema>;\nexport type CustomMutation = v.Infer<typeof customMutationSchema>;\nexport type Mutation = v.Infer<typeof mutationSchema>;\nexport type PushBody = v.Infer<typeof pushBodySchema>;\nexport type PushMessage = v.Infer<typeof pushMessageSchema>;\n", "import * as v from 'shared/src/valita.js';\n\nconst deleteClientsBodySchema = v.object({\n clientIDs: v.array(v.string()),\n});\n\nexport const deleteClientsMessageSchema = v.tuple([\n v.literal('deleteClients'),\n deleteClientsBodySchema,\n]);\n\nexport type DeleteClientsBody = v.Infer<typeof deleteClientsBodySchema>;\nexport type DeleteClientsMessage = v.Infer<typeof deleteClientsMessageSchema>;\n", "import * as v from 'shared/src/valita.js';\nimport {pingMessageSchema} from './ping.js';\nimport {deleteClientsMessageSchema} from './delete-clients.js';\nimport {initConnectionMessageSchema} from './connect.js';\nimport {pullRequestMessageSchema} from './pull.js';\nimport {pushMessageSchema} from './push.js';\nimport {changeDesiredQueriesMessageSchema} from './change-desired-queries.js';\n\nexport const upstreamSchema = v.union(\n initConnectionMessageSchema,\n pingMessageSchema,\n deleteClientsMessageSchema,\n changeDesiredQueriesMessageSchema,\n pullRequestMessageSchema,\n pushMessageSchema,\n);\n\nexport type Upstream = v.Infer<typeof upstreamSchema>;\n", "export function getNonCryptoRandomValues(array: Uint8Array) {\n if (array === null) {\n throw new TypeError('array cannot be null');\n }\n\n // Fill the array with random values\n for (let i = 0; i < array.length; i++) {\n array[i] = Math.floor(Math.random() * 256); // Random byte (0-255)\n }\n\n return array;\n}\n", "// This is taken from https://github.com/ai/nanoid/blob/main/index.browser.js We\n// copy this because we want to use `--platform=neutral` which doesn't work with\n// the npm package.\n// Also we changed the random number generator to use Math.random() for compat\n// with React Native.\n\nimport {getNonCryptoRandomValues} from 'shared/src/random-values.js';\n\nexport function nanoid(size = 21): string {\n // Use our custom getRandomValues function to fill a Uint8Array with random values.\n const randomBytes = getNonCryptoRandomValues(new Uint8Array(size));\n\n return randomBytes.reduce((id, byte) => {\n // It is incorrect to use bytes exceeding the alphabet size.\n // The following mask reduces the random byte in the 0-255 value\n // range to the 0-63 value range. Therefore, adding hacks, such\n // as empty string fallback or magic numbers, is unneccessary because\n // the bitmask trims bytes down to the alphabet size.\n byte &= 63;\n if (byte < 36) {\n // `0-9a-z`\n id += byte.toString(36);\n } else if (byte < 62) {\n // `A-Z`\n id += (byte - 26).toString(36).toUpperCase();\n } else if (byte > 62) {\n id += '-';\n } else {\n id += '_';\n }\n return id;\n }, '');\n}\n", "import type {Upstream} from 'zero-protocol/src/up.js';\n\nexport function send(ws: WebSocket, data: Upstream) {\n ws.send(JSON.stringify(data));\n}\n", "/* eslint-disable */\n// B+ tree by David Piepgrass. License: MIT\nimport type {ISortedMap, ISortedMapF, ISortedSet} from './interfaces.js';\n\nexport type {\n ISetSource,\n ISetSink,\n ISet,\n ISetF,\n ISortedSetSource,\n ISortedSet,\n ISortedSetF,\n IMapSource,\n IMapSink,\n IMap,\n IMapF,\n ISortedMapSource,\n ISortedMap,\n ISortedMapF,\n} from './interfaces.js';\n\nexport type EditRangeResult<V, R = number> = {\n value?: V;\n break?: R;\n delete?: boolean;\n};\n\ntype index = number;\n\n// Informative microbenchmarks & stuff:\n// http://www.jayconrod.com/posts/52/a-tour-of-v8-object-representation (very educational)\n// https://blog.mozilla.org/luke/2012/10/02/optimizing-javascript-variable-access/ (local vars are faster than properties)\n// http://benediktmeurer.de/2017/12/13/an-introduction-to-speculative-optimization-in-v8/ (other stuff)\n// https://jsperf.com/js-in-operator-vs-alternatives (avoid 'in' operator; `.p!==undefined` faster than `hasOwnProperty('p')` in all browsers)\n// https://jsperf.com/instanceof-vs-typeof-vs-constructor-vs-member (speed of type tests varies wildly across browsers)\n// https://jsperf.com/detecting-arrays-new (a.constructor===Array is best across browsers, assuming a is an object)\n// https://jsperf.com/shallow-cloning-methods (a constructor is faster than Object.create; hand-written clone faster than Object.assign)\n// https://jsperf.com/ways-to-fill-an-array (slice-and-replace is fastest)\n// https://jsperf.com/math-min-max-vs-ternary-vs-if (Math.min/max is slow on Edge)\n// https://jsperf.com/array-vs-property-access-speed (v.x/v.y is faster than a[0]/a[1] in major browsers IF hidden class is constant)\n// https://jsperf.com/detect-not-null-or-undefined (`x==null` slightly slower than `x===null||x===undefined` on all browsers)\n// Overall, microbenchmarks suggest Firefox is the fastest browser for JavaScript and Edge is the slowest.\n// Lessons from https://v8project.blogspot.com/2017/09/elements-kinds-in-v8.html:\n// - Avoid holes in arrays. Avoid `new Array(N)`, it will be \"holey\" permanently.\n// - Don't read outside bounds of an array (it scans prototype chain).\n// - Small integer arrays are stored differently from doubles\n// - Adding non-numbers to an array deoptimizes it permanently into a general array\n// - Objects can be used like arrays (e.g. have length property) but are slower\n// - V8 source (NewElementsCapacity in src/objects.h): arrays grow by 50% + 16 elements\n\n/**\n * Types that BTree supports by default\n */\nexport type DefaultComparable =\n | number\n | string\n | Date\n | boolean\n | null\n | undefined\n | (number | string)[]\n | {\n valueOf: () =>\n | number\n | string\n | Date\n | boolean\n | null\n | undefined\n | (number | string)[];\n };\n\n/**\n * Compares DefaultComparables to form a strict partial ordering.\n *\n * Handles +/-0 and NaN like Map: NaN is equal to NaN, and -0 is equal to +0.\n *\n * Arrays are compared using '<' and '>', which may cause unexpected equality:\n * for example [1] will be considered equal to ['1'].\n *\n * Two objects with equal valueOf compare the same, but compare unequal to\n * primitives that have the same value.\n */\nexport function defaultComparator(\n a: DefaultComparable,\n b: DefaultComparable,\n): number {\n // Special case finite numbers first for performance.\n // Note that the trick of using 'a - b' and checking for NaN to detect non-numbers\n // does not work if the strings are numeric (ex: \"5\"). This would leading most\n // comparison functions using that approach to fail to have transitivity.\n if (Number.isFinite(a as any) && Number.isFinite(b as any)) {\n return (a as number) - (b as number);\n }\n\n // The default < and > operators are not totally ordered. To allow types to be mixed\n // in a single collection, compare types and order values of different types by type.\n let ta = typeof a;\n let tb = typeof b;\n if (ta !== tb) {\n return ta < tb ? -1 : 1;\n }\n\n if (ta === 'object') {\n // standardized JavaScript bug: null is not an object, but typeof says it is\n if (a === null) return b === null ? 0 : -1;\n else if (b === null) return 1;\n\n a = a!.valueOf() as DefaultComparable;\n b = b!.valueOf() as DefaultComparable;\n ta = typeof a;\n tb = typeof b;\n // Deal with the two valueOf()s producing different types\n if (ta !== tb) {\n return ta < tb ? -1 : 1;\n }\n }\n\n // a and b are now the same type, and will be a number, string or array\n // (which we assume holds numbers or strings), or something unsupported.\n if (a! < b!) return -1;\n if (a! > b!) return 1;\n if (a === b) return 0;\n\n // Order NaN less than other numbers\n if (Number.isNaN(a as any)) return Number.isNaN(b as any) ? 0 : -1;\n else if (Number.isNaN(b as any)) return 1;\n // This could be two objects (e.g. [7] and ['7']) that aren't ordered\n return Array.isArray(a) ? 0 : Number.NaN;\n}\n\n/**\n * Compares items using the < and > operators. This function is probably slightly\n * faster than the defaultComparator for Dates and strings, but has not been benchmarked.\n * Unlike defaultComparator, this comparator doesn't support mixed types correctly,\n * i.e. use it with `BTree<string>` or `BTree<number>` but not `BTree<string|number>`.\n *\n * NaN is not supported.\n *\n * Note: null is treated like 0 when compared with numbers or Date, but in general\n * null is not ordered with respect to strings (neither greater nor less), and\n * undefined is not ordered with other types.\n */\nexport function simpleComparator(a: string, b: string): number;\nexport function simpleComparator(a: number | null, b: number | null): number;\nexport function simpleComparator(a: Date | null, b: Date | null): number;\nexport function simpleComparator(\n a: (number | string)[],\n b: (number | string)[],\n): number;\nexport function simpleComparator(a: any, b: any): number {\n return a > b ? 1 : a < b ? -1 : 0;\n}\n\n/**\n * A reasonably fast collection of key-value pairs with a powerful API.\n * Largely compatible with the standard Map. BTree is a B+ tree data structure,\n * so the collection is sorted by key.\n *\n * B+ trees tend to use memory more efficiently than hashtables such as the\n * standard Map, especially when the collection contains a large number of\n * items. However, maintaining the sort order makes them modestly slower:\n * O(log size) rather than O(1). This B+ tree implementation supports O(1)\n * fast cloning. It also supports freeze(), which can be used to ensure that\n * a BTree is not changed accidentally.\n *\n * Confusingly, the ES6 Map.forEach(c) method calls c(value,key) instead of\n * c(key,value), in contrast to other methods such as set() and entries()\n * which put the key first. I can only assume that the order was reversed on\n * the theory that users would usually want to examine values and ignore keys.\n * BTree's forEach() therefore works the same way, but a second method\n * `.forEachPair((key,value)=>{...})` is provided which sends you the key\n * first and the value second; this method is slightly faster because it is\n * the \"native\" for-each method for this class.\n *\n * Out of the box, BTree supports keys that are numbers, strings, arrays of\n * numbers/strings, Date, and objects that have a valueOf() method returning a\n * number or string. Other data types, such as arrays of Date or custom\n * objects, require a custom comparator, which you must pass as the second\n * argument to the constructor (the first argument is an optional list of\n * initial items). Symbols cannot be used as keys because they are unordered\n * (one Symbol is never \"greater\" or \"less\" than another).\n *\n * @example\n * Given a {name: string, age: number} object, you can create a tree sorted by\n * name and then by age like this:\n *\n * var tree = new BTree(undefined, (a, b) => {\n * if (a.name > b.name)\n * return 1; // Return a number >0 when a > b\n * else if (a.name < b.name)\n * return -1; // Return a number <0 when a < b\n * else // names are equal (or incomparable)\n * return a.age - b.age; // Return >0 when a.age > b.age\n * });\n *\n * tree.set({name:\"Bill\", age:17}, \"happy\");\n * tree.set({name:\"Fran\", age:40}, \"busy & stressed\");\n * tree.set({name:\"Bill\", age:55}, \"recently laid off\");\n * tree.forEachPair((k, v) => {\n * console.log(`Name: ${k.name} Age: ${k.age} Status: ${v}`);\n * });\n *\n * @description\n * The \"range\" methods (`forEach, forRange, editRange`) will return the number\n * of elements that were scanned. In addition, the callback can return {break:R}\n * to stop early and return R from the outer function.\n *\n * - TODO: Test performance of preallocating values array at max size\n * - TODO: Add fast initialization when a sorted array is provided to constructor\n *\n * For more documentation see https://github.com/qwertie/btree-typescript\n *\n * Are you a C# developer? You might like the similar data structures I made for C#:\n * BDictionary, BList, etc. See http://core.loyc.net/collections/\n *\n * @author David Piepgrass\n */\nexport default class BTree<K = any, V = any>\n implements ISortedMapF<K, V>, ISortedMap<K, V>\n{\n private _root: BNode<K, V> = EmptyLeaf as BNode<K, V>;\n _size: number = 0;\n _maxNodeSize: number;\n\n /**\n * provides a total order over keys (and a strict partial order over the type K)\n * @returns a negative value if a < b, 0 if a === b and a positive value if a > b\n */\n _compare: (a: K, b: K) => number;\n\n /**\n * Initializes an empty B+ tree.\n * @param compare Custom function to compare pairs of elements in the tree.\n * If not specified, defaultComparator will be used which is valid as long as K extends DefaultComparable.\n * @param entries A set of key-value pairs to initialize the tree\n * @param maxNodeSize Branching factor (maximum items or children per node)\n * Must be in range 4..256. If undefined or <4 then default is used; if >256 then 256.\n */\n public constructor(\n entries?: [K, V][],\n compare?: (a: K, b: K) => number,\n maxNodeSize?: number,\n ) {\n this._maxNodeSize = maxNodeSize! >= 4 ? Math.min(maxNodeSize!, 256) : 32;\n this._compare =\n compare || (defaultComparator as any as (a: K, b: K) => number);\n if (entries) this.setPairs(entries);\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // ES6 Map<K,V> methods /////////////////////////////////////////////////////\n\n /** Gets the number of key-value pairs in the tree. */\n get size() {\n return this._size;\n }\n /** Gets the number of key-value pairs in the tree. */\n get length() {\n return this._size;\n }\n /** Returns true iff the tree contains no key-value pairs. */\n get isEmpty() {\n return this._size === 0;\n }\n\n /** Releases the tree so that its size is 0. */\n clear() {\n this._root = EmptyLeaf as BNode<K, V>;\n this._size = 0;\n }\n\n forEach(\n callback: (v: V, k: K, tree: BTree<K, V>) => void,\n thisArg?: any,\n ): number;\n\n /** Runs a function for each key-value pair, in order from smallest to\n * largest key. For compatibility with ES6 Map, the argument order to\n * the callback is backwards: value first, then key. Call forEachPair\n * instead to receive the key as the first argument.\n * @param thisArg If provided, this parameter is assigned as the `this`\n * value for each callback.\n * @returns the number of values that were sent to the callback,\n * or the R value if the callback returned {break:R}. */\n forEach<R = number>(\n callback: (v: V, k: K, tree: BTree<K, V>) => {break?: R} | void,\n thisArg?: any,\n ): R | number {\n if (thisArg !== undefined) callback = callback.bind(thisArg);\n return this.forEachPair((k, v) => callback(v, k, this));\n }\n\n /** Runs a function for each key-value pair, in order from smallest to\n * largest key. The callback can return {break:R} (where R is any value\n * except undefined) to stop immediately and return R from forEachPair.\n * @param onFound A function that is called for each key-value pair. This\n * function can return {break:R} to stop early with result R.\n * The reason that you must return {break:R} instead of simply R\n * itself is for consistency with editRange(), which allows\n * multiple actions, not just breaking.\n * @param initialCounter This is the value of the third argument of\n * `onFound` the first time it is called. The counter increases\n * by one each time `onFound` is called. Default value: 0\n * @returns the number of pairs sent to the callback (plus initialCounter,\n * if you provided one). If the callback returned {break:R} then\n * the R value is returned instead. */\n forEachPair<R = number>(\n callback: (k: K, v: V, counter: number) => {break?: R} | void,\n initialCounter?: number,\n ): R | number {\n var low = this.minKey(),\n high = this.maxKey();\n return this.forRange(low!, high!, true, callback, initialCounter);\n }\n\n /**\n * Finds a pair in the tree and returns the associated value.\n * @param defaultValue a value to return if the key was not found.\n * @returns the value, or defaultValue if the key was not found.\n * @description Computational complexity: O(log size)\n */\n get(key: K, defaultValue?: V): V | undefined {\n return this._root.get(key, defaultValue, this);\n }\n\n /**\n * Adds or overwrites a key-value pair in the B+ tree.\n * @param key the key is used to determine the sort order of\n * data in the tree.\n * @param value data to associate with the key (optional)\n * @param overwrite Whether to overwrite an existing key-value pair\n * (default: true). If this is false and there is an existing\n * key-value pair then this method has no effect.\n * @returns true if a new key-value pair was added.\n * @description Computational complexity: O(log size)\n * Note: when overwriting a previous entry, the key is updated\n * as well as the value. This has no effect unless the new key\n * has data that does not affect its sort order.\n */\n set(key: K, value: V, overwrite?: boolean): boolean {\n if (this._root.isShared) this._root = this._root.clone();\n var result = this._root.set(key, value, overwrite, this);\n if (result === true || result === false) return result;\n // Root node has split, so create a new root node.\n this._root = new BNodeInternal<K, V>([this._root, result]);\n return true;\n }\n\n /**\n * Returns true if the key exists in the B+ tree, false if not.\n * Use get() for best performance; use has() if you need to\n * distinguish between \"undefined value\" and \"key not present\".\n * @param key Key to detect\n * @description Computational complexity: O(log size)\n */\n has(key: K): boolean {\n return this.forRange(key, key, true, undefined) !== 0;\n }\n\n /**\n * Removes a single key-value pair from the B+ tree.\n * @param key Key to find\n * @returns true if a pair was found and removed, false otherwise.\n * @description Computational complexity: O(log size)\n */\n delete(key: K): boolean {\n return this.editRange(key, key, true, DeleteRange) !== 0;\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // Clone-mutators ///////////////////////////////////////////////////////////\n\n /** Returns a copy of the tree with the specified key set (the value is undefined). */\n with(key: K): BTree<K, V | undefined>;\n /** Returns a copy of the tree with the specified key-value pair set. */\n with<V2>(key: K, value: V2, overwrite?: boolean): BTree<K, V | V2>;\n with<V2>(\n key: K,\n value?: V2,\n overwrite?: boolean,\n ): BTree<K, V | V2 | undefined> {\n let nu = this.clone() as BTree<K, V | V2 | undefined>;\n return nu.set(key, value, overwrite) || overwrite ? nu : this;\n }\n\n /** Returns a copy of the tree with the specified key-value pairs set. */\n withPairs<V2>(pairs: [K, V | V2][], overwrite: boolean): BTree<K, V | V2> {\n let nu = this.clone() as BTree<K, V | V2>;\n return nu.setPairs(pairs, overwrite) !== 0 || overwrite ? nu : this;\n }\n\n /** Returns a copy of the tree with the specified keys present.\n * @param keys The keys to add. If a key is already present in the tree,\n * neither the existing key nor the existing value is modified.\n * @param returnThisIfUnchanged if true, returns this if all keys already\n * existed. Performance note: due to the architecture of this class, all\n * node(s) leading to existing keys are cloned even if the collection is\n * ultimately unchanged.\n */\n withKeys(\n keys: K[],\n returnThisIfUnchanged?: boolean,\n ): BTree<K, V | undefined> {\n let nu = this.clone() as BTree<K, V | undefined>,\n changed = false;\n for (var i = 0; i < keys.length; i++)\n changed = nu.set(keys[i], undefined, false) || changed;\n return returnThisIfUnchanged && !changed ? this : nu;\n }\n\n /** Returns a copy of the tree with the specified key removed.\n * @param returnThisIfUnchanged if true, returns this if the key didn't exist.\n * Performance note: due to the architecture of this class, node(s) leading\n * to where the key would have been stored are cloned even when the key\n * turns out not to exist and the collection is unchanged.\n */\n without(key: K, returnThisIfUnchanged?: boolean): BTree<K, V> {\n return this.withoutRange(key, key, true, returnThisIfUnchanged);\n }\n\n /** Returns a copy of the tree with the specified keys removed.\n * @param returnThisIfUnchanged if true, returns this if none of the keys\n * existed. Performance note: due to the architecture of this class,\n * node(s) leading to where the key would have been stored are cloned\n * even when the key turns out not to exist.\n */\n withoutKeys(keys: K[], returnThisIfUnchanged?: boolean): BTree<K, V> {\n let nu = this.clone();\n return nu.deleteKeys(keys) || !returnThisIfUnchanged ? nu : this;\n }\n\n /** Returns a copy of the tree with the specified range of keys removed. */\n withoutRange(\n low: K,\n high: K,\n includeHigh: boolean,\n returnThisIfUnchanged?: boolean,\n ): BTree<K, V> {\n let nu = this.clone();\n if (nu.deleteRange(low, high, includeHigh) === 0 && returnThisIfUnchanged)\n return this;\n return nu;\n }\n\n /** Returns a copy of the tree with pairs removed whenever the callback\n * function returns false. `where()` is a synonym for this method. */\n filter(\n callback: (k: K, v: V, counter: number) => boolean,\n returnThisIfUnchanged?: boolean,\n ): BTree<K, V> {\n var nu = this.greedyClone();\n var del: any;\n nu.editAll((k, v, i) => {\n if (!callback(k, v, i)) return (del = Delete);\n return undefined;\n });\n if (!del && returnThisIfUnchanged) return this;\n return nu;\n }\n\n /** Returns a copy of the tree with all values altered by a callback function. */\n mapValues<R>(callback: (v: V, k: K, counter: number) => R): BTree<K, R> {\n var tmp = {} as {value: R};\n var nu = this.greedyClone();\n nu.editAll((k, v, i) => {\n return (tmp.value = callback(v, k, i)), tmp as any;\n });\n return nu as any as BTree<K, R>;\n }\n\n /** Performs a reduce operation like the `reduce` method of `Array`.\n * It is used to combine all pairs into a single value, or perform\n * conversions. `reduce` is best understood by example. For example,\n * `tree.reduce((P, pair) => P * pair[0], 1)` multiplies all keys\n * together. It means \"start with P=1, and for each pair multiply\n * it by the key in pair[0]\". Another example would be converting\n * the tree to a Map (in this example, note that M.set returns M):\n *\n * var M = tree.reduce((M, pair) => M.set(pair[0],pair[1]), new Map())\n *\n * **Note**: the same array is sent to the callback on every iteration.\n */\n reduce<R>(\n callback: (\n previous: R,\n currentPair: [K, V],\n counter: number,\n tree: BTree<K, V>,\n ) => R,\n initialValue: R,\n ): R;\n reduce<R>(\n callback: (\n previous: R | undefined,\n currentPair: [K, V],\n counter: number,\n tree: BTree<K, V>,\n ) => R,\n ): R | undefined;\n reduce<R>(\n callback: (\n previous: R | undefined,\n currentPair: [K, V],\n counter: number,\n tree: BTree<K, V>,\n ) => R,\n initialValue?: R,\n ): R | undefined {\n let i = 0,\n p = initialValue;\n var it = this.entries(this.minKey(), ReusedArray),\n next;\n while (!(next = it.next()).done) p = callback(p, next.value, i++, this);\n return p;\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // Iterator methods /////////////////////////////////////////////////////////\n\n /** Returns an iterator that provides items in order (ascending order if\n * the collection's comparator uses ascending order, as is the default.)\n * @param lowestKey First key to be iterated, or undefined to start at\n * minKey(). If the specified key doesn't exist then iteration\n * starts at the next higher key (according to the comparator).\n * @param reusedArray Optional array used repeatedly to store key-value\n * pairs, to avoid creating a new array on every iteration.\n */\n entries(lowestKey?: K, reusedArray?: (K | V)[]): IterableIterator<[K, V]> {\n var info = this.findPath(lowestKey);\n if (info === undefined) return iterator<[K, V]>();\n var {nodequeue, nodeindex, leaf} = info;\n var state = reusedArray !== undefined ? 1 : 0;\n var i =\n lowestKey === undefined\n ? -1\n : leaf.indexOf(lowestKey, 0, this._compare) - 1;\n\n return iterator<[K, V]>(() => {\n jump: for (;;) {\n switch (state) {\n case 0:\n if (++i < leaf.keys.length)\n return {done: false, value: [leaf.keys[i], leaf.values[i]]};\n state = 2;\n continue;\n // @ts-ignore\n case 1:\n if (++i < leaf.keys.length) {\n (reusedArray![0] = leaf.keys[i]),\n (reusedArray![1] = leaf.values[i]);\n return {done: false, value: reusedArray as [K, V]};\n }\n state = 2;\n case 2:\n // Advance to the next leaf node\n for (var level = -1; ; ) {\n if (++level >= nodequeue.length) {\n state = 3;\n continue jump;\n }\n if (++nodeindex[level] < nodequeue[level].length) break;\n }\n for (; level > 0; level--) {\n nodequeue[level - 1] = (\n nodequeue[level][nodeindex[level]] as BNodeInternal<K, V>\n ).children;\n nodeindex[level - 1] = 0;\n }\n leaf = nodequeue[0][nodeindex[0]];\n i = -1;\n state = reusedArray !== undefined ? 1 : 0;\n continue;\n case 3:\n return {done: true, value: undefined};\n }\n }\n });\n }\n\n /** Returns an iterator that provides items in reversed order.\n * @param highestKey Key at which to start iterating, or undefined to\n * start at maxKey(). If the specified key doesn't exist then iteration\n * starts at the next lower key (according to the comparator).\n * @param reusedArray Optional array used repeatedly to store key-value\n * pairs, to avoid creating a new array on every iteration.\n * @param skipHighest Iff this flag is true and the highestKey exists in the\n * collection, the pair matching highestKey is skipped, not iterated.\n */\n entriesReversed(\n highestKey?: K,\n reusedArray?: (K | V)[],\n skipHighest?: boolean,\n ): IterableIterator<[K, V]> {\n if (highestKey === undefined) {\n highestKey = this.maxKey();\n skipHighest = undefined;\n if (highestKey === undefined) return iterator<[K, V]>(); // collection is empty\n }\n var {nodequeue, nodeindex, leaf} =\n this.findPath(highestKey) || this.findPath(this.maxKey())!;\n check(!nodequeue[0] || leaf === nodequeue[0][nodeindex[0]], 'wat!');\n var i = leaf.indexOf(highestKey, 0, this._compare);\n if (\n !skipHighest &&\n i < leaf.keys.length &&\n this._compare(leaf.keys[i], highestKey) <= 0\n )\n i++;\n var state = reusedArray !== undefined ? 1 : 0;\n\n return iterator<[K, V]>(() => {\n jump: for (;;) {\n switch (state) {\n case 0:\n if (--i >= 0)\n return {done: false, value: [leaf.keys[i], leaf.values[i]]};\n state = 2;\n continue;\n // @ts-ignore\n case 1:\n if (--i >= 0) {\n (reusedArray![0] = leaf.keys[i]),\n (reusedArray![1] = leaf.values[i]);\n return {done: false, value: reusedArray as [K, V]};\n }\n state = 2;\n case 2:\n // Advance to the next leaf node\n for (var level = -1; ; ) {\n if (++level >= nodequeue.length) {\n state = 3;\n continue jump;\n }\n if (--nodeindex[level] >= 0) break;\n }\n for (; level > 0; level--) {\n nodequeue[level - 1] = (\n nodequeue[level][nodeindex[level]] as BNodeInternal<K, V>\n ).children;\n nodeindex[level - 1] = nodequeue[level - 1].length - 1;\n }\n leaf = nodequeue[0][nodeindex[0]];\n i = leaf.keys.length;\n state = reusedArray !== undefined ? 1 : 0;\n continue;\n case 3:\n return {done: true, value: undefined};\n }\n }\n });\n }\n\n /* Used by entries() and entriesReversed() to prepare to start iterating.\n * It develops a \"node queue\" for each non-leaf level of the tree.\n * Levels are numbered \"bottom-up\" so that level 0 is a list of leaf\n * nodes from a low-level non-leaf node. The queue at a given level L\n * consists of nodequeue[L] which is the children of a BNodeInternal,\n * and nodeindex[L], the current index within that child list, such\n * such that nodequeue[L-1] === nodequeue[L][nodeindex[L]].children.\n * (However inside this function the order is reversed.)\n */\n private findPath(\n key?: K,\n ):\n | {nodequeue: BNode<K, V>[][]; nodeindex: number[]; leaf: BNode<K, V>}\n | undefined {\n var nextnode = this._root;\n var nodequeue: BNode<K, V>[][], nodeindex: number[];\n\n if (nextnode.isLeaf) {\n (nodequeue = EmptyArray), (nodeindex = EmptyArray); // avoid allocations\n } else {\n (nodequeue = []), (nodeindex = []);\n for (var d = 0; !nextnode.isLeaf; d++) {\n nodequeue[d] = (nextnode as BNodeInternal<K, V>).children;\n nodeindex[d] =\n key === undefined ? 0 : nextnode.indexOf(key, 0, this._compare);\n if (nodeindex[d] >= nodequeue[d].length) return; // first key > maxKey()\n nextnode = nodequeue[d][nodeindex[d]];\n }\n nodequeue.reverse();\n nodeindex.reverse();\n }\n return {nodequeue, nodeindex, leaf: nextnode};\n }\n\n /**\n * Computes the differences between `this` and `other`.\n * For efficiency, the diff is returned via invocations of supplied handlers.\n * The computation is optimized for the case in which the two trees have large amounts\n * of shared data (obtained by calling the `clone` or `with` APIs) and will avoid\n * any iteration of shared state.\n * The handlers can cause computation to early exit by returning {break: R}.\n * Neither of the collections should be changed during the comparison process (in your callbacks), as this method assumes they will not be mutated.\n * @param other The tree to compute a diff against.\n * @param onlyThis Callback invoked for all keys only present in `this`.\n * @param onlyOther Callback invoked for all keys only present in `other`.\n * @param different Callback invoked for all keys with differing values.\n */\n diffAgainst<R>(\n other: BTree<K, V>,\n onlyThis?: (k: K, v: V) => {break?: R} | void,\n onlyOther?: (k: K, v: V) => {break?: R} | void,\n different?: (k: K, vThis: V, vOther: V) => {break?: R} | void,\n ): R | undefined {\n if (other._compare !== this._compare) {\n throw new Error('Tree comparators are not the same.');\n }\n\n if (this.isEmpty || other.isEmpty) {\n if (this.isEmpty && other.isEmpty) return undefined;\n // If one tree is empty, everything will be an onlyThis/onlyOther.\n if (this.isEmpty)\n return onlyOther === undefined\n ? undefined\n : BTree.stepToEnd(BTree.makeDiffCursor(other), onlyOther);\n return onlyThis === undefined\n ? undefined\n : BTree.stepToEnd(BTree.makeDiffCursor(this), onlyThis);\n }\n\n // Cursor-based diff algorithm is as follows:\n // - Until neither cursor has navigated to the end of the tree, do the following:\n // - If the `this` cursor is \"behind\" the `other` cursor (strictly <, via compare), advance it.\n // - Otherwise, advance the `other` cursor.\n // - Any time a cursor is stepped, perform the following:\n // - If either cursor points to a key/value pair:\n // - If thisCursor === otherCursor and the values differ, it is a Different.\n // - If thisCursor > otherCursor and otherCursor is at a key/value pair, it is an OnlyOther.\n // - If thisCursor < otherCursor and thisCursor is at a key/value pair, it is an OnlyThis as long as the most recent\n // cursor step was *not* otherCursor advancing from a tie. The extra condition avoids erroneous OnlyOther calls\n // that would occur due to otherCursor being the \"leader\".\n // - Otherwise, if both cursors point to nodes, compare them. If they are equal by reference (shared), skip\n // both cursors to the next node in the walk.\n // - Once one cursor has finished stepping, any remaining steps (if any) are taken and key/value pairs are logged\n // as OnlyOther (if otherCursor is stepping) or OnlyThis (if thisCursor is stepping).\n // This algorithm gives the critical guarantee that all locations (both nodes and key/value pairs) in both trees that\n // are identical by value (and possibly by reference) will be visited *at the same time* by the cursors.\n // This removes the possibility of emitting incorrect diffs, as well as allowing for skipping shared nodes.\n const {_compare} = this;\n const thisCursor = BTree.makeDiffCursor(this);\n const otherCursor = BTree.makeDiffCursor(other);\n // It doesn't matter how thisSteppedLast is initialized.\n // Step order is only used when either cursor is at a leaf, and cursors always start at a node.\n let thisSuccess = true,\n otherSuccess = true,\n prevCursorOrder = BTree.compare(thisCursor, otherCursor, _compare);\n while (thisSuccess && otherSuccess) {\n const cursorOrder = BTree.compare(thisCursor, otherCursor, _compare);\n const {\n leaf: thisLeaf,\n internalSpine: thisInternalSpine,\n levelIndices: thisLevelIndices,\n } = thisCursor;\n const {\n leaf: otherLeaf,\n internalSpine: otherInternalSpine,\n levelIndices: otherLevelIndices,\n } = otherCursor;\n if (thisLeaf || otherLeaf) {\n // If the cursors were at the same location last step, then there is no work to be done.\n if (prevCursorOrder !== 0) {\n if (cursorOrder === 0) {\n if (thisLeaf && otherLeaf && different) {\n // Equal keys, check for modifications\n const valThis =\n thisLeaf.values[thisLevelIndices[thisLevelIndices.length - 1]];\n const valOther =\n otherLeaf.values[\n otherLevelIndices[otherLevelIndices.length - 1]\n ];\n if (!Object.is(valThis, valOther)) {\n const result = different(\n thisCursor.currentKey,\n valThis,\n valOther,\n );\n if (result && result.break) return result.break;\n }\n }\n } else if (cursorOrder > 0) {\n // If this is the case, we know that either:\n // 1. otherCursor stepped last from a starting position that trailed thisCursor, and is still behind, or\n // 2. thisCursor stepped last and leapfrogged otherCursor\n // Either of these cases is an \"only other\"\n if (otherLeaf && onlyOther) {\n const otherVal =\n otherLeaf.values[\n otherLevelIndices[otherLevelIndices.length - 1]\n ];\n const result = onlyOther(otherCursor.currentKey, otherVal);\n if (result && result.break) return result.break;\n }\n } else if (onlyThis) {\n if (thisLeaf && prevCursorOrder !== 0) {\n const valThis =\n thisLeaf.values[thisLevelIndices[thisLevelIndices.length - 1]];\n const result = onlyThis(thisCursor.currentKey, valThis);\n if (result && result.break) return result.break;\n }\n }\n }\n } else if (!thisLeaf && !otherLeaf && cursorOrder === 0) {\n const lastThis = thisInternalSpine.length - 1;\n const lastOther = otherInternalSpine.length - 1;\n const nodeThis =\n thisInternalSpine[lastThis][thisLevelIndices[lastThis]];\n const nodeOther =\n otherInternalSpine[lastOther][otherLevelIndices[lastOther]];\n if (nodeOther === nodeThis) {\n prevCursorOrder = 0;\n thisSuccess = BTree.step(thisCursor, true);\n otherSuccess = BTree.step(otherCursor, true);\n continue;\n }\n }\n prevCursorOrder = cursorOrder;\n if (cursorOrder < 0) {\n thisSuccess = BTree.step(thisCursor);\n } else {\n otherSuccess = BTree.step(otherCursor);\n }\n }\n\n if (thisSuccess && onlyThis)\n return BTree.finishCursorWalk(\n thisCursor,\n otherCursor,\n _compare,\n onlyThis,\n );\n if (otherSuccess && onlyOther)\n return BTree.finishCursorWalk(\n otherCursor,\n thisCursor,\n _compare,\n onlyOther,\n );\n\n return undefined;\n }\n\n ///////////////////////////////////////////////////////////////////////////\n // Helper methods for diffAgainst /////////////////////////////////////////\n\n private static finishCursorWalk<K, V, R>(\n cursor: DiffCursor<K, V>,\n cursorFinished: DiffCursor<K, V>,\n compareKeys: (a: K, b: K) => number,\n callback: (k: K, v: V) => {break?: R} | void,\n ): R | undefined {\n const compared = BTree.compare(cursor, cursorFinished, compareKeys);\n if (compared === 0) {\n if (!BTree.step(cursor)) return undefined;\n } else if (compared < 0) {\n check(false, 'cursor walk terminated early');\n }\n return BTree.stepToEnd(cursor, callback);\n }\n\n private static stepToEnd<K, V, R>(\n cursor: DiffCursor<K, V>,\n callback: (k: K, v: V) => {break?: R} | void,\n ): R | undefined {\n let canStep: boolean = true;\n while (canStep) {\n const {leaf, levelIndices, currentKey} = cursor;\n if (leaf) {\n const value = leaf.values[levelIndices[levelIndices.length - 1]];\n const result = callback(currentKey, value);\n if (result && result.break) return result.break;\n }\n canStep = BTree.step(cursor);\n }\n return undefined;\n }\n\n private static makeDiffCursor<K, V>(tree: BTree<K, V>): DiffCursor<K, V> {\n const {_root, height} = tree;\n return {\n height: height,\n internalSpine: [[_root]],\n levelIndices: [0],\n leaf: undefined,\n currentKey: _root.maxKey(),\n };\n }\n\n /**\n * Advances the cursor to the next step in the walk of its tree.\n * Cursors are walked backwards in sort order, as this allows them to leverage maxKey() in order to be compared in O(1).\n * @param cursor The cursor to step\n * @param stepToNode If true, the cursor will be advanced to the next node (skipping values)\n * @returns true if the step was completed and false if the step would have caused the cursor to move beyond the end of the tree.\n */\n private static step<K, V>(\n cursor: DiffCursor<K, V>,\n stepToNode?: boolean,\n ): boolean {\n const {internalSpine, levelIndices, leaf} = cursor;\n if (stepToNode === true || leaf) {\n const levelsLength = levelIndices.length;\n // Step to the next node only if:\n // - We are explicitly directed to via stepToNode, or\n // - There are no key/value pairs left to step to in this leaf\n if (stepToNode === true || levelIndices[levelsLength - 1] === 0) {\n const spineLength = internalSpine.length;\n // Root is leaf\n if (spineLength === 0) return false;\n // Walk back up the tree until we find a new subtree to descend into\n const nodeLevelIndex = spineLength - 1;\n let levelIndexWalkBack = nodeLevelIndex;\n while (levelIndexWalkBack >= 0) {\n if (levelIndices[levelIndexWalkBack] > 0) {\n if (levelIndexWalkBack < levelsLength - 1) {\n // Remove leaf state from cursor\n cursor.leaf = undefined;\n levelIndices.pop();\n }\n // If we walked upwards past any internal node, slice them out\n if (levelIndexWalkBack < nodeLevelIndex)\n cursor.internalSpine = internalSpine.slice(\n 0,\n levelIndexWalkBack + 1,\n );\n // Move to new internal node\n cursor.currentKey =\n internalSpine[levelIndexWalkBack][\n --levelIndices[levelIndexWalkBack]\n ].maxKey();\n return true;\n }\n levelIndexWalkBack--;\n }\n // Cursor is in the far left leaf of the tree, no more nodes to enumerate\n return false;\n } else {\n // Move to new leaf value\n const valueIndex = --levelIndices[levelsLength - 1];\n cursor.currentKey = (leaf as unknown as BNode<K, V>).keys[valueIndex];\n return true;\n }\n } else {\n // Cursor does not point to a value in a leaf, so move downwards\n const nextLevel = internalSpine.length;\n const currentLevel = nextLevel - 1;\n const node = internalSpine[currentLevel][levelIndices[currentLevel]];\n if (node.isLeaf) {\n // Entering into a leaf. Set the cursor to point at the last key/value pair.\n cursor.leaf = node;\n const valueIndex = (levelIndices[nextLevel] = node.values.length - 1);\n cursor.currentKey = node.keys[valueIndex];\n } else {\n const children = (node as BNodeInternal<K, V>).children;\n internalSpine[nextLevel] = children;\n const childIndex = children.length - 1;\n levelIndices[nextLevel] = childIndex;\n cursor.currentKey = children[childIndex].maxKey();\n }\n return true;\n }\n }\n\n /**\n * Compares the two cursors. Returns a value indicating which cursor is ahead in a walk.\n * Note that cursors are advanced in reverse sorting order.\n */\n private static compare<K, V>(\n cursorA: DiffCursor<K, V>,\n cursorB: DiffCursor<K, V>,\n compareKeys: (a: K, b: K) => number,\n ): number {\n const {\n height: heightA,\n currentKey: currentKeyA,\n levelIndices: levelIndicesA,\n } = cursorA;\n const {\n height: heightB,\n currentKey: currentKeyB,\n levelIndices: levelIndicesB,\n } = cursorB;\n // Reverse the comparison order, as cursors are advanced in reverse sorting order\n const keyComparison = compareKeys(currentKeyB, currentKeyA);\n if (keyComparison !== 0) {\n return keyComparison;\n }\n\n // Normalize depth values relative to the shortest tree.\n // This ensures that concurrent cursor walks of trees of differing heights can reliably land on shared nodes at the same time.\n // To accomplish this, a cursor that is on an internal node at depth D1 with maxKey X is considered \"behind\" a cursor on an\n // internal node at depth D2 with maxKey Y, when D1 < D2. Thus, always walking the cursor that is \"behind\" will allow the cursor\n // at shallower depth (but equal maxKey) to \"catch up\" and land on shared nodes.\n const heightMin = heightA < heightB ? heightA : heightB;\n const depthANormalized = levelIndicesA.length - (heightA - heightMin);\n const depthBNormalized = levelIndicesB.length - (heightB - heightMin);\n return depthANormalized - depthBNormalized;\n }\n\n // End of helper methods for diffAgainst //////////////////////////////////\n ///////////////////////////////////////////////////////////////////////////\n\n /** Returns a new iterator for iterating the keys of each pair in ascending order.\n * @param firstKey: Minimum key to include in the output. */\n keys(firstKey?: K): IterableIterator<K> {\n var it = this.entries(firstKey, ReusedArray);\n return iterator<K>(() => {\n var n: IteratorResult<any> = it.next();\n if (n.value) n.value = n.value[0];\n return n;\n });\n }\n\n /** Returns a new iterator for iterating the values of each pair in order by key.\n * @param firstKey: Minimum key whose associated value is included in the output. */\n values(firstKey?: K): IterableIterator<V> {\n var it = this.entries(firstKey, ReusedArray);\n return iterator<V>(() => {\n var n: IteratorResult<any> = it.next();\n if (n.value) n.value = n.value[1];\n return n;\n });\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // Additional methods ///////////////////////////////////////////////////////\n\n /** Returns the maximum number of children/values before nodes will split. */\n get maxNodeSize() {\n return this._maxNodeSize;\n }\n\n /** Gets the lowest key in the tree. Complexity: O(log size) */\n minKey(): K | undefined {\n return this._root.minKey();\n }\n\n /** Gets the highest key in the tree. Complexity: O(1) */\n maxKey(): K | undefined {\n return this._root.maxKey();\n }\n\n /** Quickly clones the tree by marking the root node as shared.\n * Both copies remain editable. When you modify either copy, any\n * nodes that are shared (or potentially shared) between the two\n * copies are cloned so that the changes do not affect other copies.\n * This is known as copy-on-write behavior, or \"lazy copying\". */\n clone(): BTree<K, V> {\n this._root.isShared = true;\n var result = new BTree<K, V>(undefined, this._compare, this._maxNodeSize);\n result._root = this._root;\n result._size = this._size;\n return result;\n }\n\n /** Performs a greedy clone, immediately duplicating any nodes that are\n * not currently marked as shared, in order to avoid marking any\n * additional nodes as shared.\n * @param force Clone all nodes, even shared ones.\n */\n greedyClone(force?: boolean): BTree<K, V> {\n var result = new BTree<K, V>(undefined, this._compare, this._maxNodeSize);\n result._root = this._root.greedyClone(force);\n result._size = this._size;\n return result;\n }\n\n /** Gets an array filled with the contents of the tree, sorted by key */\n toArray(maxLength: number = 0x7fffffff): [K, V][] {\n let min = this.minKey(),\n max = this.maxKey();\n if (min !== undefined) return this.getRange(min, max!, true, maxLength);\n return [];\n }\n\n /** Gets an array of all keys, sorted */\n keysArray() {\n var results: K[] = [];\n this._root.forRange(\n this.minKey()!,\n this.maxKey()!,\n true,\n false,\n this,\n 0,\n (k, _v) => {\n results.push(k);\n },\n );\n return results;\n }\n\n /** Gets an array of all values, sorted by key */\n valuesArray() {\n var results: V[] = [];\n this._root.forRange(\n this.minKey()!,\n this.maxKey()!,\n true,\n false,\n this,\n 0,\n (_k, v) => {\n results.push(v);\n },\n );\n return results;\n }\n\n /** Gets a string representing the tree's data based on toArray(). */\n toString() {\n return this.toArray().toString();\n }\n\n /** Stores a key-value pair only if the key doesn't already exist in the tree.\n * @returns true if a new key was added\n */\n setIfNotPresent(key: K, value: V): boolean {\n return this.set(key, value, false);\n }\n\n /** Returns the next pair whose key is larger than the specified key (or undefined if there is none).\n * If key === undefined, this function returns the lowest pair.\n * @param key The key to search for.\n * @param reusedArray Optional array used repeatedly to store key-value pairs, to\n * avoid creating a new array on every iteration.\n */\n nextHigherPair(key: K | undefined, reusedArray?: [K, V]): [K, V] | undefined {\n reusedArray = reusedArray || ([] as unknown as [K, V]);\n if (key === undefined) {\n return this._root.minPair(reusedArray);\n }\n return this._root.getPairOrNextHigher(\n key,\n this._compare,\n false,\n reusedArray,\n );\n }\n\n /** Returns the next key larger than the specified key, or undefined if there is none.\n * Also, nextHigherKey(undefined) returns the lowest key.\n */\n nextHigherKey(key: K | undefined): K | undefined {\n var p = this.nextHigherPair(key, ReusedArray as [K, V]);\n return p && p[0];\n }\n\n /** Returns the next pair whose key is smaller than the specified key (or undefined if there is none).\n * If key === undefined, this function returns the highest pair.\n * @param key The key to search for.\n * @param reusedArray Optional array used repeatedly to store key-value pairs, to\n * avoid creating a new array each time you call this method.\n */\n nextLowerPair(key: K | undefined, reusedArray?: [K, V]): [K, V] | undefined {\n reusedArray = reusedArray || ([] as unknown as [K, V]);\n if (key === undefined) {\n return this._root.maxPair(reusedArray);\n }\n return this._root.getPairOrNextLower(\n key,\n this._compare,\n false,\n reusedArray,\n );\n }\n\n /** Returns the next key smaller than the specified key, or undefined if there is none.\n * Also, nextLowerKey(undefined) returns the highest key.\n */\n nextLowerKey(key: K | undefined): K | undefined {\n var p = this.nextLowerPair(key, ReusedArray as [K, V]);\n return p && p[0];\n }\n\n /** Returns the key-value pair associated with the supplied key if it exists\n * or the pair associated with the next lower pair otherwise. If there is no\n * next lower pair, undefined is returned.\n * @param key The key to search for.\n * @param reusedArray Optional array used repeatedly to store key-value pairs, to\n * avoid creating a new array each time you call this method.\n * */\n getPairOrNextLower(key: K, reusedArray?: [K, V]): [K, V] | undefined {\n return this._root.getPairOrNextLower(\n key,\n this._compare,\n true,\n reusedArray || ([] as unknown as [K, V]),\n );\n }\n\n /** Returns the key-value pair associated with the supplied key if it exists\n * or the pair associated with the next lower pair otherwise. If there is no\n * next lower pair, undefined is returned.\n * @param key The key to search for.\n * @param reusedArray Optional array used repeatedly to store key-value pairs, to\n * avoid creating a new array each time you call this method.\n * */\n getPairOrNextHigher(key: K, reusedArray?: [K, V]): [K, V] | undefined {\n return this._root.getPairOrNextHigher(\n key,\n this._compare,\n true,\n reusedArray || ([] as unknown as [K, V]),\n );\n }\n\n /** Edits the value associated with a key in the tree, if it already exists.\n * @returns true if the key existed, false if not.\n */\n changeIfPresent(key: K, value: V): boolean {\n return this.editRange(key, key, true, (_k, _v) => ({value})) !== 0;\n }\n\n /**\n * Builds an array of pairs from the specified range of keys, sorted by key.\n * Each returned pair is also an array: pair[0] is the key, pair[1] is the value.\n * @param low The first key in the array will be greater than or equal to `low`.\n * @param high This method returns when a key larger than this is reached.\n * @param includeHigh If the `high` key is present, its pair will be included\n * in the output if and only if this parameter is true. Note: if the\n * `low` key is present, it is always included in the output.\n * @param maxLength Length limit. getRange will stop scanning the tree when\n * the array reaches this size.\n * @description Computational complexity: O(result.length + log size)\n */\n getRange(\n low: K,\n high: K,\n includeHigh?: boolean,\n maxLength: number = 0x3ffffff,\n ): [K, V][] {\n var results: [K, V][] = [];\n this._root.forRange(low, high, includeHigh, false, this, 0, (k, v) => {\n results.push([k, v]);\n return results.length > maxLength ? Break : undefined;\n });\n return results;\n }\n\n /** Adds all pairs from a list of key-value pairs.\n * @param pairs Pairs to add to this tree. If there are duplicate keys,\n * later pairs currently overwrite earlier ones (e.g. [[0,1],[0,7]]\n * associates 0 with 7.)\n * @param overwrite Whether to overwrite pairs that already exist (if false,\n * pairs[i] is ignored when the key pairs[i][0] already exists.)\n * @returns The number of pairs added to the collection.\n * @description Computational complexity: O(pairs.length * log(size + pairs.length))\n */\n setPairs(pairs: [K, V][], overwrite?: boolean): number {\n var added = 0;\n for (var i = 0; i < pairs.length; i++)\n if (this.set(pairs[i][0], pairs[i][1], overwrite)) added++;\n return added;\n }\n\n forRange(\n low: K,\n high: K,\n includeHigh: boolean,\n onFound?: (k: K, v: V, counter: number) => void,\n initialCounter?: number,\n ): number;\n\n /**\n * Scans the specified range of keys, in ascending order by key.\n * Note: the callback `onFound` must not insert or remove items in the\n * collection. Doing so may cause incorrect data to be sent to the\n * callback afterward.\n * @param low The first key scanned will be greater than or equal to `low`.\n * @param high Scanning stops when a key larger than this is reached.\n * @param includeHigh If the `high` key is present, `onFound` is called for\n * that final pair if and only if this parameter is true.\n * @param onFound A function that is called for each key-value pair. This\n * function can return {break:R} to stop early with result R.\n * @param initialCounter Initial third argument of onFound. This value\n * increases by one each time `onFound` is called. Default: 0\n * @returns The number of values found, or R if the callback returned\n * `{break:R}` to stop early.\n * @description Computational complexity: O(number of items scanned + log size)\n */\n forRange<R = number>(\n low: K,\n high: K,\n includeHigh: boolean,\n onFound?: (k: K, v: V, counter: number) => {break?: R} | void,\n initialCounter?: number,\n ): R | number {\n var r = this._root.forRange(\n low,\n high,\n includeHigh,\n false,\n this,\n initialCounter || 0,\n onFound,\n );\n return typeof r === 'number' ? r : r.break!;\n }\n\n /**\n * Scans and potentially modifies values for a subsequence of keys.\n * Note: the callback `onFound` should ideally be a pure function.\n * Specfically, it must not insert items, call clone(), or change\n * the collection except via return value; out-of-band editing may\n * cause an exception or may cause incorrect data to be sent to\n * the callback (duplicate or missed items). It must not cause a\n * clone() of the collection, otherwise the clone could be modified\n * by changes requested by the callback.\n * @param low The first key scanned will be greater than or equal to `low`.\n * @param high Scanning stops when a key larger than this is reached.\n * @param includeHigh If the `high` key is present, `onFound` is called for\n * that final pair if and only if this parameter is true.\n * @param onFound A function that is called for each key-value pair. This\n * function can return `{value:v}` to change the value associated\n * with the current key, `{delete:true}` to delete the current pair,\n * `{break:R}` to stop early with result R, or it can return nothing\n * (undefined or {}) to cause no effect and continue iterating.\n * `{break:R}` can be combined with one of the other two commands.\n * The third argument `counter` is the number of items iterated\n * previously; it equals 0 when `onFound` is called the first time.\n * @returns The number of values scanned, or R if the callback returned\n * `{break:R}` to stop early.\n * @description\n * Computational complexity: O(number of items scanned + log size)\n * Note: if the tree has been cloned with clone(), any shared\n * nodes are copied before `onFound` is called. This takes O(n) time\n * where n is proportional to the amount of shared data scanned.\n */\n editRange<R = V>(\n low: K,\n high: K,\n includeHigh: boolean,\n onFound: (k: K, v: V, counter: number) => EditRangeResult<V, R> | void,\n initialCounter?: number,\n ): R | number {\n var root = this._root;\n if (root.isShared) this._root = root = root.clone();\n try {\n var r = root.forRange(\n low,\n high,\n includeHigh,\n true,\n this,\n initialCounter || 0,\n onFound,\n );\n return typeof r === 'number' ? r : r.break!;\n } finally {\n let isShared;\n while (root.keys.length <= 1 && !root.isLeaf) {\n isShared ||= root.isShared;\n this._root = root =\n root.keys.length === 0\n ? EmptyLeaf\n : (root as any as BNodeInternal<K, V>).children[0];\n }\n // If any ancestor of the new root was shared, the new root must also be shared\n if (isShared) {\n root.isShared = true;\n }\n }\n }\n\n /** Same as `editRange` except that the callback is called for all pairs. */\n editAll<R = V>(\n onFound: (k: K, v: V, counter: number) => EditRangeResult<V, R> | void,\n initialCounter?: number,\n ): R | number {\n return this.editRange(\n this.minKey()!,\n this.maxKey()!,\n true,\n onFound,\n initialCounter,\n );\n }\n\n /**\n * Removes a range of key-value pairs from the B+ tree.\n * @param low The first key scanned will be greater than or equal to `low`.\n * @param high Scanning stops when a key larger than this is reached.\n * @param includeHigh Specifies whether the `high` key, if present, is deleted.\n * @returns The number of key-value pairs that were deleted.\n * @description Computational complexity: O(log size + number of items deleted)\n */\n deleteRange(low: K, high: K, includeHigh: boolean): number {\n return this.editRange(low, high, includeHigh, DeleteRange);\n }\n\n /** Deletes a series of keys from the collection. */\n deleteKeys(keys: K[]): number {\n for (var i = 0, r = 0; i < keys.length; i++) if (this.delete(keys[i])) r++;\n return r;\n }\n\n /** Gets the height of the tree: the number of internal nodes between the\n * BTree object and its leaf nodes (zero if there are no internal nodes). */\n get height(): number {\n let node: BNode<K, V> | undefined = this._root;\n let height = -1;\n while (node) {\n height++;\n node = node.isLeaf\n ? undefined\n : (node as unknown as BNodeInternal<K, V>).children[0];\n }\n return height;\n }\n\n /** Makes the object read-only to ensure it is not accidentally modified.\n * Freezing does not have to be permanent; unfreeze() reverses the effect.\n * This is accomplished by replacing mutator functions with a function\n * that throws an Error. Compared to using a property (e.g. this.isFrozen)\n * this implementation gives better performance in non-frozen BTrees.\n */\n freeze() {\n var t = this as any;\n // Note: all other mutators ultimately call set() or editRange()\n // so we don't need to override those others.\n t.clear =\n t.set =\n t.editRange =\n function () {\n throw new Error('Attempted to modify a frozen BTree');\n };\n }\n\n /** Ensures mutations are allowed, reversing the effect of freeze(). */\n unfreeze() {\n // @ts-ignore \"The operand of a 'delete' operator must be optional.\"\n // (wrong: delete does not affect the prototype.)\n delete this.clear;\n // @ts-ignore\n delete this.set;\n // @ts-ignore\n delete this.editRange;\n }\n\n /** Returns true if the tree appears to be frozen. */\n get isFrozen() {\n return this.hasOwnProperty('editRange');\n }\n\n /** Scans the tree for signs of serious bugs (e.g. this.size doesn't match\n * number of elements, internal nodes not caching max element properly...)\n * Computational complexity: O(number of nodes), i.e. O(size). This method\n * skips the most expensive test - whether all keys are sorted - but it\n * does check that maxKey() of the children of internal nodes are sorted. */\n checkValid() {\n var size = this._root.checkValid(0, this, 0);\n check(\n size === this.size,\n 'size mismatch: counted ',\n size,\n 'but stored',\n this.size,\n );\n }\n\n [Symbol.iterator] = this.entries.bind(this);\n where = this.filter.bind(this);\n setRange = this.setPairs.bind(this);\n add = this.set.bind(this); // for compatibility with ISetSink<K>\n}\n\n/** A TypeScript helper function that simply returns its argument, typed as\n * `ISortedSet<K>` if the BTree implements it, as it does if `V extends undefined`.\n * If `V` cannot be `undefined`, it returns `unknown` instead. Or at least, that\n * was the intention, but TypeScript is acting weird and may return `ISortedSet<K>`\n * even if `V` can't be `undefined` (discussion: btree-typescript issue #14) */\nexport function asSet<K, V>(\n btree: BTree<K, V>,\n): undefined extends V ? ISortedSet<K> : unknown {\n return btree as any;\n}\n\nfunction iterator<T>(\n next: () => IteratorResult<T> = () => ({done: true, value: undefined}),\n): IterableIterator<T> {\n var result: any = {next};\n if (Symbol && Symbol.iterator)\n result[Symbol.iterator] = function () {\n return this;\n };\n return result;\n}\n\n/** Leaf node / base class. **************************************************/\nclass BNode<K, V> {\n // If this is an internal node, _keys[i] is the highest key in children[i].\n keys: K[];\n values: V[];\n // True if this node might be within multiple `BTree`s (or have multiple parents).\n // If so, it must be cloned before being mutated to avoid changing an unrelated tree.\n // This is transitive: if it's true, children are also shared even if `isShared!=true`\n // in those children. (Certain operations will propagate isShared=true to children.)\n isShared: true | undefined;\n get isLeaf() {\n return (this as any).children === undefined;\n }\n\n constructor(keys: K[] = [], values?: V[]) {\n this.keys = keys;\n this.values = values || (undefVals as any[]);\n this.isShared = undefined;\n }\n\n ///////////////////////////////////////////////////////////////////////////\n // Shared methods /////////////////////////////////////////////////////////\n\n maxKey() {\n return this.keys[this.keys.length - 1];\n }\n\n // If key not found, returns i^failXor where i is the insertion index.\n // Callers that don't care whether there was a match will set failXor=0.\n indexOf(key: K, failXor: number, cmp: (a: K, b: K) => number): index {\n const keys = this.keys;\n var lo = 0,\n hi = keys.length,\n mid = hi >> 1;\n while (lo < hi) {\n var c = cmp(keys[mid], key);\n if (c < 0) lo = mid + 1;\n else if (c > 0)\n // key < keys[mid]\n hi = mid;\n else if (c === 0) return mid;\n else {\n // c is NaN or otherwise invalid\n if (key === key)\n // at least the search key is not NaN\n return keys.length;\n else throw new Error('BTree: NaN was used as a key');\n }\n mid = (lo + hi) >> 1;\n }\n return mid ^ failXor;\n\n // Unrolled version: benchmarks show same speed, not worth using\n /*var i = 1, c: number = 0, sum = 0;\n if (keys.length >= 4) {\n i = 3;\n if (keys.length >= 8) {\n i = 7;\n if (keys.length >= 16) {\n i = 15;\n if (keys.length >= 32) {\n i = 31;\n if (keys.length >= 64) {\n i = 127;\n i += (c = i < keys.length ? cmp(keys[i], key) : 1) < 0 ? 64 : -64;\n sum += c;\n i += (c = i < keys.length ? cmp(keys[i], key) : 1) < 0 ? 32 : -32;\n sum += c;\n }\n i += (c = i < keys.length ? cmp(keys[i], key) : 1) < 0 ? 16 : -16;\n sum += c;\n }\n i += (c = i < keys.length ? cmp(keys[i], key) : 1) < 0 ? 8 : -8;\n sum += c;\n }\n i += (c = i < keys.length ? cmp(keys[i], key) : 1) < 0 ? 4 : -4;\n sum += c;\n }\n i += (c = i < keys.length ? cmp(keys[i], key) : 1) < 0 ? 2 : -2;\n sum += c;\n }\n i += (c = i < keys.length ? cmp(keys[i], key) : 1) < 0 ? 1 : -1;\n c = i < keys.length ? cmp(keys[i], key) : 1;\n sum += c;\n if (c < 0) {\n ++i;\n c = i < keys.length ? cmp(keys[i], key) : 1;\n sum += c;\n }\n if (sum !== sum) {\n if (key === key) // at least the search key is not NaN\n return keys.length ^ failXor;\n else\n throw new Error(\"BTree: NaN was used as a key\");\n }\n return c === 0 ? i : i ^ failXor;*/\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // Leaf Node: misc //////////////////////////////////////////////////////////\n\n minKey(): K | undefined {\n return this.keys[0];\n }\n\n minPair(reusedArray: [K, V]): [K, V] | undefined {\n if (this.keys.length === 0) return undefined;\n reusedArray[0] = this.keys[0];\n reusedArray[1] = this.values[0];\n return reusedArray;\n }\n\n maxPair(reusedArray: [K, V]): [K, V] | undefined {\n if (this.keys.length === 0) return undefined;\n const lastIndex = this.keys.length - 1;\n reusedArray[0] = this.keys[lastIndex];\n reusedArray[1] = this.values[lastIndex];\n return reusedArray;\n }\n\n clone(): BNode<K, V> {\n var v = this.values;\n return new BNode<K, V>(\n this.keys.slice(0),\n v === undefVals ? v : v.slice(0),\n );\n }\n\n greedyClone(force?: boolean): BNode<K, V> {\n return this.isShared && !force ? this : this.clone();\n }\n\n get(key: K, defaultValue: V | undefined, tree: BTree<K, V>): V | undefined {\n var i = this.indexOf(key, -1, tree._compare);\n return i < 0 ? defaultValue : this.values[i];\n }\n\n getPairOrNextLower(\n key: K,\n compare: (a: K, b: K) => number,\n inclusive: boolean,\n reusedArray: [K, V],\n ): [K, V] | undefined {\n var i = this.indexOf(key, -1, compare);\n const indexOrLower = i < 0 ? ~i - 1 : inclusive ? i : i - 1;\n if (indexOrLower >= 0) {\n reusedArray[0] = this.keys[indexOrLower];\n reusedArray[1] = this.values[indexOrLower];\n return reusedArray;\n }\n return undefined;\n }\n\n getPairOrNextHigher(\n key: K,\n compare: (a: K, b: K) => number,\n inclusive: boolean,\n reusedArray: [K, V],\n ): [K, V] | undefined {\n var i = this.indexOf(key, -1, compare);\n const indexOrLower = i < 0 ? ~i : inclusive ? i : i + 1;\n const keys = this.keys;\n if (indexOrLower < keys.length) {\n reusedArray[0] = keys[indexOrLower];\n reusedArray[1] = this.values[indexOrLower];\n return reusedArray;\n }\n return undefined;\n }\n\n checkValid(depth: number, _tree: BTree<K, V>, baseIndex: number): number {\n var kL = this.keys.length,\n vL = this.values.length;\n check(\n this.values === undefVals ? kL <= vL : kL === vL,\n 'keys/values length mismatch: depth',\n depth,\n 'with lengths',\n kL,\n vL,\n 'and baseIndex',\n baseIndex,\n );\n // Note: we don't check for \"node too small\" because sometimes a node\n // can legitimately have size 1. This occurs if there is a batch\n // deletion, leaving a node of size 1, and the siblings are full so\n // it can't be merged with adjacent nodes. However, the parent will\n // verify that the average node size is at least half of the maximum.\n check(\n depth == 0 || kL > 0,\n 'empty leaf at depth',\n depth,\n 'and baseIndex',\n baseIndex,\n );\n return kL;\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // Leaf Node: set & node splitting //////////////////////////////////////////\n\n set(\n key: K,\n value: V,\n overwrite: boolean | undefined,\n tree: BTree<K, V>,\n ): boolean | BNode<K, V> {\n var i = this.indexOf(key, -1, tree._compare);\n if (i < 0) {\n // key does not exist yet\n i = ~i;\n tree._size++;\n\n if (this.keys.length < tree._maxNodeSize) {\n return this.insertInLeaf(i, key, value, tree);\n } else {\n // This leaf node is full and must split\n var newRightSibling = this.splitOffRightSide(),\n target: BNode<K, V> = this;\n if (i > this.keys.length) {\n i -= this.keys.length;\n target = newRightSibling;\n }\n target.insertInLeaf(i, key, value, tree);\n return newRightSibling;\n }\n } else {\n // Key already exists\n if (overwrite !== false) {\n if (value !== undefined) this.reifyValues();\n // usually this is a no-op, but some users may wish to edit the key\n this.keys[i] = key;\n this.values[i] = value;\n }\n return false;\n }\n }\n\n reifyValues() {\n if (this.values === undefVals)\n return (this.values = this.values.slice(0, this.keys.length));\n return this.values;\n }\n\n insertInLeaf(i: index, key: K, value: V, tree: BTree<K, V>) {\n this.keys.splice(i, 0, key);\n if (this.values === undefVals) {\n while (undefVals.length < tree._maxNodeSize) undefVals.push(undefined);\n if (value === undefined) {\n return true;\n } else {\n this.values = undefVals.slice(0, this.keys.length - 1);\n }\n }\n this.values.splice(i, 0, value);\n return true;\n }\n\n takeFromRight(rhs: BNode<K, V>) {\n // Reminder: parent node must update its copy of key for this node\n // assert: neither node is shared\n // assert rhs.keys.length > (maxNodeSize/2 && this.keys.length<maxNodeSize)\n var v = this.values;\n if (rhs.values === undefVals) {\n if (v !== undefVals) v.push(undefined as any);\n } else {\n v = this.reifyValues();\n v.push(rhs.values.shift()!);\n }\n this.keys.push(rhs.keys.shift()!);\n }\n\n takeFromLeft(lhs: BNode<K, V>) {\n // Reminder: parent node must update its copy of key for this node\n // assert: neither node is shared\n // assert rhs.keys.length > (maxNodeSize/2 && this.keys.length<maxNodeSize)\n var v = this.values;\n if (lhs.values === undefVals) {\n if (v !== undefVals) v.unshift(undefined as any);\n } else {\n v = this.reifyValues();\n v.unshift(lhs.values.pop()!);\n }\n this.keys.unshift(lhs.keys.pop()!);\n }\n\n splitOffRightSide(): BNode<K, V> {\n // Reminder: parent node must update its copy of key for this node\n var half = this.keys.length >> 1,\n keys = this.keys.splice(half);\n var values =\n this.values === undefVals ? undefVals : this.values.splice(half);\n return new BNode<K, V>(keys, values);\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // Leaf Node: scanning & deletions //////////////////////////////////////////\n\n forRange<R>(\n low: K,\n high: K,\n includeHigh: boolean | undefined,\n editMode: boolean,\n tree: BTree<K, V>,\n count: number,\n onFound?: (k: K, v: V, counter: number) => EditRangeResult<V, R> | void,\n ): EditRangeResult<V, R> | number {\n var cmp = tree._compare;\n var iLow, iHigh;\n if (high === low) {\n if (!includeHigh) return count;\n iHigh = (iLow = this.indexOf(low, -1, cmp)) + 1;\n if (iLow < 0) return count;\n } else {\n iLow = this.indexOf(low, 0, cmp);\n iHigh = this.indexOf(high, -1, cmp);\n if (iHigh < 0) iHigh = ~iHigh;\n else if (includeHigh === true) iHigh++;\n }\n var keys = this.keys,\n values = this.values;\n if (onFound !== undefined) {\n for (var i = iLow; i < iHigh; i++) {\n var key = keys[i];\n var result = onFound(key, values[i], count++);\n if (result !== undefined) {\n if (editMode === true) {\n if (key !== keys[i] || this.isShared === true)\n throw new Error('BTree illegally changed or cloned in editRange');\n if (result.delete) {\n this.keys.splice(i, 1);\n if (this.values !== undefVals) this.values.splice(i, 1);\n tree._size--;\n i--;\n iHigh--;\n } else if (result.hasOwnProperty('value')) {\n values![i] = result.value!;\n }\n }\n if (result.break !== undefined) return result;\n }\n }\n } else count += iHigh - iLow;\n return count;\n }\n\n /** Adds entire contents of right-hand sibling (rhs is left unchanged) */\n mergeSibling(rhs: BNode<K, V>, _: number) {\n this.keys.push.apply(this.keys, rhs.keys);\n if (this.values === undefVals) {\n if (rhs.values === undefVals) return;\n this.values = this.values.slice(0, this.keys.length);\n }\n this.values.push.apply(this.values, rhs.reifyValues());\n }\n}\n\n/** Internal node (non-leaf node) ********************************************/\nclass BNodeInternal<K, V> extends BNode<K, V> {\n // Note: conventionally B+ trees have one fewer key than the number of\n // children, but I find it easier to keep the array lengths equal: each\n // keys[i] caches the value of children[i].maxKey().\n children: BNode<K, V>[];\n\n /**\n * This does not mark `children` as shared, so it is the responsibility of the caller\n * to ensure children are either marked shared, or aren't included in another tree.\n */\n constructor(children: BNode<K, V>[], keys?: K[]) {\n if (!keys) {\n keys = [];\n for (var i = 0; i < children.length; i++) keys[i] = children[i].maxKey();\n }\n super(keys);\n this.children = children;\n }\n\n clone(): BNode<K, V> {\n var children = this.children.slice(0);\n for (var i = 0; i < children.length; i++) children[i].isShared = true;\n return new BNodeInternal<K, V>(children, this.keys.slice(0));\n }\n\n greedyClone(force?: boolean): BNode<K, V> {\n if (this.isShared && !force) return this;\n var nu = new BNodeInternal<K, V>(\n this.children.slice(0),\n this.keys.slice(0),\n );\n for (var i = 0; i < nu.children.length; i++)\n nu.children[i] = nu.children[i].greedyClone(force);\n return nu;\n }\n\n minKey() {\n return this.children[0].minKey();\n }\n\n minPair(reusedArray: [K, V]): [K, V] | undefined {\n return this.children[0].minPair(reusedArray);\n }\n\n maxPair(reusedArray: [K, V]): [K, V] | undefined {\n return this.children[this.children.length - 1].maxPair(reusedArray);\n }\n\n get(key: K, defaultValue: V | undefined, tree: BTree<K, V>): V | undefined {\n var i = this.indexOf(key, 0, tree._compare),\n children = this.children;\n return i < children.length\n ? children[i].get(key, defaultValue, tree)\n : undefined;\n }\n\n getPairOrNextLower(\n key: K,\n compare: (a: K, b: K) => number,\n inclusive: boolean,\n reusedArray: [K, V],\n ): [K, V] | undefined {\n var i = this.indexOf(key, 0, compare),\n children = this.children;\n if (i >= children.length) return this.maxPair(reusedArray);\n const result = children[i].getPairOrNextLower(\n key,\n compare,\n inclusive,\n reusedArray,\n );\n if (result === undefined && i > 0) {\n return children[i - 1].maxPair(reusedArray);\n }\n return result;\n }\n\n getPairOrNextHigher(\n key: K,\n compare: (a: K, b: K) => number,\n inclusive: boolean,\n reusedArray: [K, V],\n ): [K, V] | undefined {\n var i = this.indexOf(key, 0, compare),\n children = this.children,\n length = children.length;\n if (i >= length) return undefined;\n const result = children[i].getPairOrNextHigher(\n key,\n compare,\n inclusive,\n reusedArray,\n );\n if (result === undefined && i < length - 1) {\n return children[i + 1].minPair(reusedArray);\n }\n return result;\n }\n\n checkValid(depth: number, tree: BTree<K, V>, baseIndex: number): number {\n let kL = this.keys.length,\n cL = this.children.length;\n check(\n kL === cL,\n 'keys/children length mismatch: depth',\n depth,\n 'lengths',\n kL,\n cL,\n 'baseIndex',\n baseIndex,\n );\n check(\n kL > 1 || depth > 0,\n 'internal node has length',\n kL,\n 'at depth',\n depth,\n 'baseIndex',\n baseIndex,\n );\n let size = 0,\n c = this.children,\n k = this.keys,\n childSize = 0;\n for (var i = 0; i < cL; i++) {\n size += c[i].checkValid(depth + 1, tree, baseIndex + size);\n childSize += c[i].keys.length;\n check(size >= childSize, 'wtf', baseIndex); // no way this will ever fail\n check(\n i === 0 || c[i - 1].constructor === c[i].constructor,\n 'type mismatch, baseIndex:',\n baseIndex,\n );\n if (c[i].maxKey() != k[i])\n check(\n false,\n 'keys[',\n i,\n '] =',\n k[i],\n 'is wrong, should be ',\n c[i].maxKey(),\n 'at depth',\n depth,\n 'baseIndex',\n baseIndex,\n );\n if (!(i === 0 || tree._compare(k[i - 1], k[i]) < 0))\n check(\n false,\n 'sort violation at depth',\n depth,\n 'index',\n i,\n 'keys',\n k[i - 1],\n k[i],\n );\n }\n // 2020/08: BTree doesn't always avoid grossly undersized nodes,\n // but AFAIK such nodes are pretty harmless, so accept them.\n let toofew = childSize === 0; // childSize < (tree.maxNodeSize >> 1)*cL;\n if (toofew || childSize > tree.maxNodeSize * cL)\n check(\n false,\n toofew ? 'too few' : 'too many',\n 'children (',\n childSize,\n size,\n ') at depth',\n depth,\n 'maxNodeSize:',\n tree.maxNodeSize,\n 'children.length:',\n cL,\n 'baseIndex:',\n baseIndex,\n );\n return size;\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // Internal Node: set & node splitting //////////////////////////////////////\n\n set(\n key: K,\n value: V,\n overwrite: boolean | undefined,\n tree: BTree<K, V>,\n ): boolean | BNodeInternal<K, V> {\n var c = this.children,\n max = tree._maxNodeSize,\n cmp = tree._compare;\n var i = Math.min(this.indexOf(key, 0, cmp), c.length - 1),\n child = c[i];\n\n if (child.isShared) c[i] = child = child.clone();\n if (child.keys.length >= max) {\n // child is full; inserting anything else will cause a split.\n // Shifting an item to the left or right sibling may avoid a split.\n // We can do a shift if the adjacent node is not full and if the\n // current key can still be placed in the same node after the shift.\n var other: BNode<K, V>;\n if (\n i > 0 &&\n (other = c[i - 1]).keys.length < max &&\n cmp(child.keys[0], key) < 0\n ) {\n if (other.isShared) c[i - 1] = other = other.clone();\n other.takeFromRight(child);\n this.keys[i - 1] = other.maxKey();\n } else if (\n (other = c[i + 1]) !== undefined &&\n other.keys.length < max &&\n cmp(child.maxKey(), key) < 0\n ) {\n if (other.isShared) c[i + 1] = other = other.clone();\n other.takeFromLeft(child);\n this.keys[i] = c[i].maxKey();\n }\n }\n\n var result = child.set(key, value, overwrite, tree);\n if (result === false) return false;\n this.keys[i] = child.maxKey();\n if (result === true) return true;\n\n // The child has split and `result` is a new right child... does it fit?\n if (this.keys.length < max) {\n // yes\n this.insert(i + 1, result);\n return true;\n } else {\n // no, we must split also\n var newRightSibling = this.splitOffRightSide(),\n target: BNodeInternal<K, V> = this;\n if (cmp(result.maxKey(), this.maxKey()) > 0) {\n target = newRightSibling;\n i -= this.keys.length;\n }\n target.insert(i + 1, result);\n return newRightSibling;\n }\n }\n\n /**\n * Inserts `child` at index `i`.\n * This does not mark `child` as shared, so it is the responsibility of the caller\n * to ensure that either child is marked shared, or it is not included in another tree.\n */\n insert(i: index, child: BNode<K, V>) {\n this.children.splice(i, 0, child);\n this.keys.splice(i, 0, child.maxKey());\n }\n\n /**\n * Split this node.\n * Modifies this to remove the second half of the items, returning a separate node containing them.\n */\n splitOffRightSide() {\n // assert !this.isShared;\n var half = this.children.length >> 1;\n return new BNodeInternal<K, V>(\n this.children.splice(half),\n this.keys.splice(half),\n );\n }\n\n takeFromRight(rhs: BNode<K, V>) {\n // Reminder: parent node must update its copy of key for this node\n // assert: neither node is shared\n // assert rhs.keys.length > (maxNodeSize/2 && this.keys.length<maxNodeSize)\n this.keys.push(rhs.keys.shift()!);\n this.children.push((rhs as BNodeInternal<K, V>).children.shift()!);\n }\n\n takeFromLeft(lhs: BNode<K, V>) {\n // Reminder: parent node must update its copy of key for this node\n // assert: neither node is shared\n // assert rhs.keys.length > (maxNodeSize/2 && this.keys.length<maxNodeSize)\n this.keys.unshift(lhs.keys.pop()!);\n this.children.unshift((lhs as BNodeInternal<K, V>).children.pop()!);\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // Internal Node: scanning & deletions //////////////////////////////////////\n\n // Note: `count` is the next value of the third argument to `onFound`.\n // A leaf node's `forRange` function returns a new value for this counter,\n // unless the operation is to stop early.\n forRange<R>(\n low: K,\n high: K,\n includeHigh: boolean | undefined,\n editMode: boolean,\n tree: BTree<K, V>,\n count: number,\n onFound?: (k: K, v: V, counter: number) => EditRangeResult<V, R> | void,\n ): EditRangeResult<V, R> | number {\n var cmp = tree._compare;\n var keys = this.keys,\n children = this.children;\n var iLow = this.indexOf(low, 0, cmp),\n i = iLow;\n var iHigh = Math.min(\n high === low ? iLow : this.indexOf(high, 0, cmp),\n keys.length - 1,\n );\n if (!editMode) {\n // Simple case\n for (; i <= iHigh; i++) {\n var result = children[i].forRange(\n low,\n high,\n includeHigh,\n editMode,\n tree,\n count,\n onFound,\n );\n if (typeof result !== 'number') return result;\n count = result;\n }\n } else if (i <= iHigh) {\n try {\n for (; i <= iHigh; i++) {\n if (children[i].isShared) children[i] = children[i].clone();\n var result = children[i].forRange(\n low,\n high,\n includeHigh,\n editMode,\n tree,\n count,\n onFound,\n );\n // Note: if children[i] is empty then keys[i]=undefined.\n // This is an invalid state, but it is fixed below.\n keys[i] = children[i].maxKey();\n if (typeof result !== 'number') return result;\n count = result;\n }\n } finally {\n // Deletions may have occurred, so look for opportunities to merge nodes.\n var half = tree._maxNodeSize >> 1;\n if (iLow > 0) iLow--;\n for (i = iHigh; i >= iLow; i--) {\n if (children[i].keys.length <= half) {\n if (children[i].keys.length !== 0) {\n this.tryMerge(i, tree._maxNodeSize);\n } else {\n // child is empty! delete it!\n keys.splice(i, 1);\n children.splice(i, 1);\n }\n }\n }\n if (children.length !== 0 && children[0].keys.length === 0)\n check(false, 'emptiness bug');\n }\n }\n return count;\n }\n\n /** Merges child i with child i+1 if their combined size is not too large */\n tryMerge(i: index, maxSize: number): boolean {\n var children = this.children;\n if (i >= 0 && i + 1 < children.length) {\n if (children[i].keys.length + children[i + 1].keys.length <= maxSize) {\n if (children[i].isShared)\n // cloned already UNLESS i is outside scan range\n children[i] = children[i].clone();\n children[i].mergeSibling(children[i + 1], maxSize);\n children.splice(i + 1, 1);\n this.keys.splice(i + 1, 1);\n this.keys[i] = children[i].maxKey();\n return true;\n }\n }\n return false;\n }\n\n /**\n * Move children from `rhs` into this.\n * `rhs` must be part of this tree, and be removed from it after this call\n * (otherwise isShared for its children could be incorrect).\n */\n mergeSibling(rhs: BNode<K, V>, maxNodeSize: number) {\n // assert !this.isShared;\n var oldLength = this.keys.length;\n this.keys.push.apply(this.keys, rhs.keys);\n const rhsChildren = (rhs as any as BNodeInternal<K, V>).children;\n this.children.push.apply(this.children, rhsChildren);\n\n if (rhs.isShared && !this.isShared) {\n // All children of a shared node are implicitly shared, and since their new\n // parent is not shared, they must now be explicitly marked as shared.\n for (var i = 0; i < rhsChildren.length; i++)\n rhsChildren[i].isShared = true;\n }\n\n // If our children are themselves almost empty due to a mass-delete,\n // they may need to be merged too (but only the oldLength-1 and its\n // right sibling should need this).\n this.tryMerge(oldLength - 1, maxNodeSize);\n }\n}\n\n/**\n * A walkable pointer into a BTree for computing efficient diffs between trees with shared data.\n * - A cursor points to either a key/value pair (KVP) or a node (which can be either a leaf or an internal node).\n * As a consequence, a cursor cannot be created for an empty tree.\n * - A cursor can be walked forwards using `step`. A cursor can be compared to another cursor to\n * determine which is ahead in advancement.\n * - A cursor is valid only for the tree it was created from, and only until the first edit made to\n * that tree since the cursor's creation.\n * - A cursor contains a key for the current location, which is the maxKey when the cursor points to a node\n * and a key corresponding to a value when pointing to a leaf.\n * - Leaf is only populated if the cursor points to a KVP. If this is the case, levelIndices.length === internalSpine.length + 1\n * and levelIndices[levelIndices.length - 1] is the index of the value.\n */\ntype DiffCursor<K, V> = {\n height: number;\n internalSpine: BNode<K, V>[][];\n levelIndices: number[];\n leaf: BNode<K, V> | undefined;\n currentKey: K;\n};\n\n// Optimization: this array of `undefined`s is used instead of a normal\n// array of values in nodes where `undefined` is the only value.\n// Its length is extended to max node size on first use; since it can\n// be shared between trees with different maximums, its length can only\n// increase, never decrease. Its type should be undefined[] but strangely\n// TypeScript won't allow the comparison V[] === undefined[]. To prevent\n// users from making this array too large, BTree has a maximum node size.\n//\n// FAQ: undefVals[i] is already undefined, so why increase the array size?\n// Reading outside the bounds of an array is relatively slow because it\n// has the side effect of scanning the prototype chain.\nvar undefVals: any[] = [];\n\nconst Delete = {delete: true},\n DeleteRange = () => Delete;\nconst Break = {break: true};\nconst EmptyLeaf = (function () {\n var n = new BNode<any, any>();\n n.isShared = true;\n return n;\n})();\nconst EmptyArray: any[] = [];\nconst ReusedArray: any[] = []; // assumed thread-local\n\nfunction check(fact: boolean, ...args: any[]) {\n if (!fact) {\n args.unshift('B+ tree'); // at beginning of message\n throw new Error(args.join(' '));\n }\n}\n\n/** A BTree frozen in the empty state. */\nexport const EmptyBTree = (() => {\n let t = new BTree();\n t.freeze();\n return t;\n})();\n", "/**\n * A LookaheadIterator is an iterator that reads ahead one value eagerly and\n * provides access to both the current and next value without having to advance.\n */\nexport class LookaheadIterator<T>\n implements Iterator<[T, ...Array<T | undefined>]>\n{\n readonly #iter: Iterator<T>;\n readonly #buffer: Array<T | undefined>;\n\n #initialized = false;\n\n constructor(iter: Iterator<T>, size: number = 2) {\n this.#iter = iter;\n this.#buffer = new Array(size);\n }\n\n [Symbol.iterator](): Iterator<[T, ...Array<T | undefined>]> {\n return this;\n }\n\n next(): IteratorResult<[T, ...Array<T | undefined>]> {\n if (!this.#initialized) {\n for (let i = 0; i < this.#buffer.length; i++) {\n const r = this.#iter.next();\n this.#buffer[i] = r.done ? undefined : r.value;\n }\n this.#initialized = true;\n } else {\n for (let i = 0; i < this.#buffer.length - 1; i++) {\n this.#buffer[i] = this.#buffer[i + 1];\n }\n const r = this.#iter.next();\n this.#buffer[this.#buffer.length - 1] = r.done ? undefined : r.value;\n }\n\n if (this.#buffer[0] === undefined) {\n return {done: true, value: undefined};\n }\n return {done: false, value: this.#buffer} as IteratorResult<\n [T, ...Array<T | undefined>]\n >;\n }\n\n return(value?: unknown): IteratorResult<[T, ...(T | undefined)[]], unknown> {\n this.#iter.return?.(value);\n return {done: true, value: undefined};\n }\n\n throw(e?: unknown): IteratorResult<[T, ...(T | undefined)[]], unknown> {\n this.#iter.throw?.(e);\n return {done: true, value: undefined};\n }\n}\n", "import BTree from 'btree';\nimport {assert, unreachable} from 'shared/src/asserts.js';\nimport type {Ordering, OrderPart, SimpleCondition} from '../ast/ast.js';\nimport {assertOrderingIncludesPK} from '../builder/builder.js';\nimport {createPredicate} from '../builder/filter.js';\nimport type {Change} from './change.js';\nimport {\n type Comparator,\n compareValues,\n makeComparator,\n type Node,\n type Row,\n type Value,\n valuesEqual,\n} from './data.js';\nimport {LookaheadIterator} from './lookahead-iterator.js';\nimport type {Constraint, FetchRequest, Input, Output} from './operator.js';\nimport type {PrimaryKey, TableSchema, SchemaValue} from './schema.js';\nimport type {\n Source,\n SourceChange,\n SourceChangeEdit,\n SourceInput,\n} from './source.js';\nimport type {Stream} from './stream.js';\n\nexport type Overlay = {\n outputIndex: number;\n change: SourceChange;\n};\n\ntype Index = {\n comparator: Comparator;\n data: BTree<Row, undefined>;\n usedBy: Set<Connection>;\n};\n\ntype Connection = {\n input: Input;\n output: Output | undefined;\n sort: Ordering;\n compareRows: Comparator;\n optionalFilters: ((row: Row) => boolean)[];\n};\n\n/**\n * A `MemorySource` is a source that provides data to the pipeline from an\n * in-memory data source.\n *\n * This data is kept in sorted order as downstream pipelines will always expect\n * the data they receive from `pull` to be in sorted order.\n */\nexport class MemorySource implements Source {\n readonly #tableName: string;\n readonly #columns: Record<string, SchemaValue>;\n readonly #primaryKey: PrimaryKey;\n readonly #primaryIndexSort: Ordering;\n readonly #indexes: Map<string, Index> = new Map();\n readonly #connections: Connection[] = [];\n\n #overlay: Overlay | undefined;\n\n constructor(\n tableName: string,\n columns: Record<string, SchemaValue>,\n primaryKey: PrimaryKey,\n ) {\n this.#tableName = tableName;\n this.#columns = columns;\n this.#primaryKey = primaryKey;\n this.#primaryIndexSort = primaryKey.map(k => [k, 'asc']);\n const comparator = makeBoundComparator(this.#primaryIndexSort);\n this.#indexes.set(JSON.stringify(this.#primaryIndexSort), {\n comparator,\n data: new BTree<Row, undefined>([], comparator),\n usedBy: new Set(),\n });\n assertOrderingIncludesPK(this.#primaryIndexSort, this.#primaryKey);\n }\n\n // Mainly for tests.\n getSchemaInfo() {\n return {\n tableName: this.#tableName,\n columns: this.#columns,\n primaryKey: this.#primaryKey,\n };\n }\n\n #getSchema(connection: Connection): TableSchema {\n return {\n tableName: this.#tableName,\n columns: this.#columns,\n primaryKey: this.#primaryKey,\n sort: connection.sort,\n relationships: {},\n isHidden: false,\n compareRows: connection.compareRows,\n };\n }\n\n connect(\n sort: Ordering,\n optionalFilters?: SimpleCondition[] | undefined,\n ): SourceInput {\n const input: SourceInput = {\n getSchema: () => this.#getSchema(connection),\n fetch: req => this.#fetch(req, connection),\n cleanup: req => this.#cleanup(req, connection),\n setOutput: output => {\n connection.output = output;\n },\n destroy: () => {\n this.#disconnect(input);\n },\n appliedFilters: false,\n };\n\n const connection: Connection = {\n input,\n output: undefined,\n sort,\n compareRows: makeComparator(sort),\n optionalFilters: (optionalFilters ?? []).map(f => createPredicate(f)),\n };\n assertOrderingIncludesPK(sort, this.#primaryKey);\n this.#connections.push(connection);\n return input;\n }\n\n #disconnect(input: Input): void {\n const idx = this.#connections.findIndex(c => c.input === input);\n assert(idx !== -1, 'Connection not found');\n const connection = this.#connections[idx];\n this.#connections.splice(idx, 1);\n\n const primaryIndexKey = JSON.stringify(this.#primaryIndexSort);\n\n for (const [key, index] of this.#indexes) {\n if (key === primaryIndexKey) {\n continue;\n }\n index.usedBy.delete(connection);\n if (index.usedBy.size === 0) {\n this.#indexes.delete(key);\n }\n }\n }\n\n #getPrimaryIndex(): Index {\n const index = this.#indexes.get(JSON.stringify(this.#primaryIndexSort));\n assert(index, 'Primary index not found');\n return index;\n }\n\n #getOrCreateIndex(sort: Ordering, usedBy: Connection): Index {\n const key = JSON.stringify(sort);\n const index = this.#indexes.get(key);\n // Future optimization could use existing index if it's the same just sorted\n // in reverse of needed.\n if (index) {\n index.usedBy.add(usedBy);\n return index;\n }\n\n const comparator = makeBoundComparator(sort);\n\n // When creating these synchronously becomes a problem, a few options:\n // 1. Allow users to specify needed indexes up front\n // 2. Create indexes in a different thread asynchronously (this would require\n // modifying the BTree to be able to be passed over structured-clone, or using\n // a different library.)\n // 3. We could even theoretically do (2) on multiple threads and then merge the\n // results!\n const data = new BTree<Row, undefined>([], comparator);\n\n // I checked, there's no special path for adding data in bulk faster.\n // The constructor takes an array, but it just calls add/set over and over.\n for (const row of this.#getPrimaryIndex().data.keys()) {\n data.add(row, undefined);\n }\n\n const newIndex = {comparator, data, usedBy: new Set([usedBy])};\n this.#indexes.set(key, newIndex);\n return newIndex;\n }\n\n // For unit testing that we correctly clean up indexes.\n getIndexKeys(): string[] {\n return [...this.#indexes.keys()];\n }\n\n *#fetch(req: FetchRequest, from: Connection): Stream<Node> {\n let overlay: Overlay | undefined;\n\n const callingConnectionNum = this.#connections.indexOf(from);\n assert(callingConnectionNum !== -1, 'Output not found');\n const conn = this.#connections[callingConnectionNum];\n const {sort: requestedSort} = conn;\n\n // If there is a constraint, we need an index sorted by it first.\n const indexSort: OrderPart[] = [];\n if (req.constraint) {\n indexSort.push([req.constraint.key, 'asc']);\n }\n\n // For the special case of constraining by PK, we don't need to worry about\n // any requested sort since there can only be one result. Otherwise we also\n // need the index sorted by the requested sort.\n if (\n this.#primaryKey.length > 1 ||\n req.constraint?.key !== this.#primaryKey[0]\n ) {\n indexSort.push(...requestedSort);\n }\n\n const index = this.#getOrCreateIndex(indexSort, from);\n const {data, comparator} = index;\n\n // When we receive a push, we send it to each output one at a time. Once the\n // push is sent to an output, it should keep being sent until all datastores\n // have received it and the change has been made to the datastore.\n if (this.#overlay) {\n if (callingConnectionNum <= this.#overlay.outputIndex) {\n overlay = this.#overlay;\n }\n }\n\n const matchesConstraint = (row: Row) => {\n if (!req.constraint) {\n return true;\n }\n const {key, value} = req.constraint;\n return valuesEqual(row[key], value);\n };\n\n const matchesFilters = (row: Row) =>\n conn.optionalFilters.every(f => f(row));\n\n const matchesConstraintAndFilters = (row: Row) =>\n matchesConstraint(row) && matchesFilters(row);\n // If there is an overlay for this output, does it match the requested\n // constraints and filters?\n if (overlay) {\n // TODO: This looks wrong given that we can have edit changes in the overlay.\n if (!matchesConstraintAndFilters(overlay.change.row)) {\n overlay = undefined;\n }\n }\n const nextLowerKey = (row: Row | undefined) => {\n if (!row) {\n return undefined;\n }\n let o = overlay;\n if (o) {\n if (comparator(o.change.row, row) >= 0) {\n o = undefined;\n }\n }\n while (row !== undefined) {\n row = data.nextLowerKey(row);\n if (row && matchesConstraintAndFilters(row)) {\n if (o && comparator(o.change.row, row) >= 0) {\n return o.change.row;\n }\n return row;\n }\n }\n return o?.change.row;\n };\n let startAt = req.start?.row;\n if (startAt) {\n if (req.constraint) {\n // There's no problem supporting startAt outside of constraints, but I\n // don't think we have a use case for this \u2013 if we see it, it's probably\n // a bug.\n if (!matchesConstraint(startAt)) {\n assert(false, 'Start row must match constraint');\n }\n }\n if (req.start!.basis === 'before') {\n startAt = nextLowerKey(startAt);\n }\n }\n\n // If there is a constraint, we want to start our scan at the first row that\n // matches the constraint. But because the next OrderPart can be `desc`,\n // it's not true that {[constraintKey]: constraintValue} is the first\n // matching row. Because in that case, the other fields will all be\n // `undefined`, and in Zero `undefined` is always less than any other value.\n // So if the second OrderPart is descending then `undefined` values will\n // actually be the *last* row. We need a way to stay \"start at the first row\n // with this constraint value\". RowBound with the corresponding compareBound\n // comparator accomplishes this. The right thing is probably to teach the\n // btree library to support this concept.\n let scanStart: RowBound | undefined;\n if (req.constraint) {\n scanStart = {};\n for (const [key, dir] of indexSort) {\n if (key === req.constraint.key) {\n scanStart[key] = req.constraint.value;\n } else {\n scanStart[key] = dir === 'asc' ? minValue : maxValue;\n }\n }\n } else {\n scanStart = startAt;\n }\n\n const withOverlay = generateWithOverlay(\n startAt,\n // \uD83D\uDE2C - btree library doesn't support ideas like start \"before\" this\n // key.\n data.keys(scanStart as Row),\n req.constraint,\n overlay,\n comparator,\n );\n\n const withFilters = conn.optionalFilters.length\n ? generateWithFilter(withOverlay, matchesFilters)\n : withOverlay;\n\n yield* generateWithConstraint(\n generateWithStart(withFilters, req, comparator),\n req.constraint,\n );\n }\n\n #cleanup(req: FetchRequest, connection: Connection): Stream<Node> {\n return this.#fetch(req, connection);\n }\n\n push(change: SourceChange): void {\n const primaryIndex = this.#getPrimaryIndex();\n const {data} = primaryIndex;\n\n switch (change.type) {\n case 'add':\n if (data.has(change.row)) {\n throw new Error(`Row already exists: ` + JSON.stringify(change));\n }\n break;\n case 'remove':\n if (!data.has(change.row)) {\n throw new Error(`Row not found: ` + JSON.stringify(change));\n }\n break;\n case 'edit':\n if (!data.has(change.oldRow)) {\n throw new Error(`Row not found: ` + JSON.stringify(change));\n }\n break;\n default:\n unreachable(change);\n }\n\n const outputChange: Change =\n change.type === 'edit'\n ? change\n : {\n type: change.type,\n node: {\n row: change.row,\n relationships: {},\n },\n };\n for (const [outputIndex, {output}] of this.#connections.entries()) {\n if (output) {\n this.#overlay = {outputIndex, change};\n output.push(outputChange);\n }\n }\n this.#overlay = undefined;\n for (const {data} of this.#indexes.values()) {\n switch (change.type) {\n case 'add': {\n const added = data.add(change.row, undefined);\n // must succeed since we checked has() above.\n assert(added);\n break;\n }\n case 'remove': {\n const removed = data.delete(change.row);\n // must succeed since we checked has() above.\n assert(removed);\n break;\n }\n case 'edit': {\n // We cannot just do `set` with the new value since the `oldRow` might\n // not map to the same entry as the new `row` in the index btree.\n const removed = data.delete(change.oldRow);\n // must succeed since we checked has() above.\n assert(removed);\n data.add(change.row, undefined);\n break;\n }\n default:\n unreachable(change);\n }\n }\n }\n}\n\nfunction* generateWithConstraint(\n it: Stream<Node>,\n constraint: Constraint | undefined,\n) {\n for (const node of it) {\n if (\n constraint &&\n !valuesEqual(node.row[constraint.key], constraint.value)\n ) {\n break;\n }\n yield node;\n }\n}\n\nfunction* generateWithFilter(it: Stream<Node>, filter: (row: Row) => boolean) {\n for (const node of it) {\n if (filter(node.row)) {\n yield node;\n }\n }\n}\n\n/**\n * If the request basis was `before` then the overlay might be the starting point of the stream.\n *\n * This can happen in a case like the following:\n * Store = [1,2,3, 5,6,7]\n * Overlay = [4]\n * Request = fetch starting before 5\n *\n * In this case, the overlay value of `4` should be the starting point of the stream, not `3`.\n */\nexport function* generateWithStart(\n it: Iterator<Node>,\n req: FetchRequest,\n compare: (r1: Row, r2: Row) => number,\n): Stream<Node> {\n // Figure out the start row.\n const cursor = new LookaheadIterator(it, 2);\n\n let started = req.start === undefined ? true : false;\n for (const [curr, next] of cursor) {\n if (!started) {\n assert(req.start);\n if (req.start.basis === 'before') {\n if (next === undefined || compare(next.row, req.start.row) >= 0) {\n started = true;\n }\n } else if (req.start.basis === 'at') {\n if (compare(curr.row, req.start.row) >= 0) {\n started = true;\n }\n } else if (req.start.basis === 'after') {\n if (compare(curr.row, req.start.row) > 0) {\n started = true;\n }\n }\n }\n if (started) {\n yield curr;\n }\n }\n}\n\n/**\n * Takes an iterator and overlay.\n * Splices the overlay into the iterator at the correct position.\n *\n * @param startAt - if there is a lower bound to the stream. If the lower bound of the stream\n * is above the overlay, the overlay will be skipped.\n * @param rows - the stream into which the overlay should be spliced\n * @param constraint - constraint that was applied to the rowIterator and should\n * also be applied to the overlay.\n * @param overlay - the overlay values to splice in\n * @param compare - the comparator to use to find the position for the overlay\n */\nexport function* generateWithOverlay(\n startAt: Row | undefined,\n rows: Iterable<Row>,\n constraint: Constraint | undefined,\n overlay: Overlay | undefined,\n compare: Comparator,\n) {\n const overlays = computeOverlays(startAt, constraint, overlay, compare);\n yield* generateWithOverlayInner(rows, overlays, compare);\n}\n\nfunction computeOverlays(\n startAt: Row | undefined,\n constraint: Constraint | undefined,\n overlay: Overlay | undefined,\n compare: Comparator,\n): [Overlay | undefined, Overlay | undefined] {\n let secondOverlay: Overlay | undefined;\n\n if (\n overlay?.change.type === 'edit' &&\n compare(overlay.change.row, overlay.change.oldRow) !== 0\n ) {\n // Different PK so we split the edit change into a remove and add.\n [overlay, secondOverlay] = splitEditChange(overlay, compare);\n }\n\n if (startAt) {\n overlay = overlayForStartAt(overlay, startAt, compare);\n secondOverlay = overlayForStartAt(secondOverlay, startAt, compare);\n }\n\n if (constraint) {\n overlay = overlayForConstraint(overlay, constraint);\n secondOverlay = overlayForConstraint(secondOverlay, constraint);\n }\n\n if (secondOverlay !== undefined && overlay === undefined) {\n overlay = secondOverlay;\n secondOverlay = undefined;\n }\n\n return [overlay, secondOverlay];\n}\n\nexport {overlayForStartAt as overlayForStartAtForTest};\n\nfunction overlayForStartAt(\n overlay: Overlay | undefined,\n startAt: Row,\n compare: Comparator,\n): Overlay | undefined {\n if (!overlay) {\n return undefined;\n }\n if (compare(overlay.change.row, startAt) < 0) {\n return undefined;\n }\n return overlay;\n}\n\nexport {overlayForConstraint as overlayForConstraintForTest};\n\nfunction overlayForConstraint(\n overlay: Overlay | undefined,\n constraint: Constraint,\n): Overlay | undefined {\n if (!overlay) {\n return undefined;\n }\n\n if (!valuesEqual(overlay.change.row[constraint.key], constraint.value)) {\n return undefined;\n }\n return overlay;\n}\n\nfunction splitEditChange(\n overlay: Overlay,\n compare: Comparator,\n): [Overlay, Overlay] {\n const {oldRow, row} = overlay.change as SourceChangeEdit;\n\n const removeOverlay: Overlay = {\n outputIndex: overlay.outputIndex,\n change: {type: 'remove', row: oldRow},\n };\n const addOverlay: Overlay = {\n outputIndex: overlay.outputIndex,\n change: {type: 'add', row},\n };\n\n const cmp = compare(oldRow, row);\n assert(cmp !== 0, 'We should not split edit change with same PK');\n if (cmp < 0) {\n return [removeOverlay, addOverlay];\n }\n return [addOverlay, removeOverlay];\n}\n\nexport function* generateWithOverlayInner(\n rowIterator: Iterable<Row>,\n overlays: [Overlay | undefined, Overlay | undefined],\n compare: (r1: Row, r2: Row) => number,\n) {\n let [overlay, secondOverlay] = overlays;\n for (const row of rowIterator) {\n if (overlay) {\n if (overlay.change.type === 'add' || overlay.change.type === 'edit') {\n // For edit changes we can only get here if the edit change was not\n // split an the row and the oldRow have the same PK.\n const cmp = compare(overlay.change.row, row);\n if (cmp < 0) {\n yield {row: overlay.change.row, relationships: {}};\n overlay = secondOverlay;\n secondOverlay = undefined;\n }\n }\n\n if (overlay?.change.type === 'remove') {\n const cmp = compare(overlay.change.row, row);\n if (cmp < 0) {\n overlay = secondOverlay;\n secondOverlay = undefined;\n } else if (cmp === 0) {\n overlay = secondOverlay;\n secondOverlay = undefined;\n continue;\n }\n }\n }\n yield {row, relationships: {}};\n }\n\n if (overlay && overlay.change.type === 'add') {\n yield {row: overlay.change.row, relationships: {}};\n }\n}\n\n/**\n * A location to begin scanning an index from. Can either be a specific value\n * or the min or max possible value for the type. This is used to start a scan\n * at the beginning of the rows matching a constraint.\n */\ntype Bound = Value | MinValue | MaxValue;\ntype RowBound = Record<string, Bound>;\nconst minValue = Symbol('min-value');\ntype MinValue = typeof minValue;\nconst maxValue = Symbol('max-value');\ntype MaxValue = typeof maxValue;\n\nfunction makeBoundComparator(sort: Ordering) {\n return (a: RowBound, b: RowBound) => {\n // Hot! Do not use destructuring\n for (const entry of sort) {\n const key = entry[0];\n const cmp = compareBounds(a[key], b[key]);\n if (cmp !== 0) {\n return entry[1] === 'asc' ? cmp : -cmp;\n }\n }\n return 0;\n };\n}\n\nfunction compareBounds(a: Bound, b: Bound): number {\n if (a === b) {\n return 0;\n }\n if (a === minValue) {\n return -1;\n }\n if (b === minValue) {\n return 1;\n }\n if (a === maxValue) {\n return 1;\n }\n if (b === maxValue) {\n return -1;\n }\n return compareValues(a, b);\n}\n", "import type {JSONValue} from 'shared/src/json.js';\nimport type {Storage} from './operator.js';\nimport BTree from 'btree';\nimport type {Stream} from './stream.js';\n\n/**\n * MemoryStorage is a simple in-memory implementation of `Storage` for use\n * on the client and in tests.\n */\nexport class MemoryStorage implements Storage {\n #data: BTree<string, JSONValue> = new BTree();\n\n set(key: string, value: JSONValue) {\n this.#data.add(key, value);\n }\n\n get(key: string, def?: JSONValue): JSONValue | undefined {\n const r = this.#data.get(key);\n if (r !== undefined) {\n return r;\n }\n return def;\n }\n\n del(key: string) {\n this.#data.delete(key);\n }\n\n *scan(options?: {prefix: string}): Stream<[string, JSONValue]> {\n for (const [key, value] of this.#data.entries(options?.prefix)) {\n if (options && !key.startsWith(options.prefix)) {\n return;\n }\n yield [key, value];\n }\n }\n\n cloneData(): Record<string, JSONValue> {\n return structuredClone(Object.fromEntries(this.#data.entries()));\n }\n}\n", "import {assert} from 'shared/src/asserts.js';\nimport type {EntityID} from 'zero-protocol/src/entity.js';\n\nexport const CLIENTS_KEY_PREFIX = 'c/';\nexport const DESIRED_QUERIES_KEY_PREFIX = 'd/';\nexport const GOT_QUERIES_KEY_PREFIX = 'g/';\nexport const ENTITIES_KEY_PREFIX = 'e/';\n\nexport function toClientsKey(clientID: string): string {\n return CLIENTS_KEY_PREFIX + clientID;\n}\n\nexport function toDesiredQueriesKey(clientID: string, hash: string): string {\n return DESIRED_QUERIES_KEY_PREFIX + clientID + '/' + hash;\n}\n\nexport function desiredQueriesPrefixForClient(clientID: string): string {\n return DESIRED_QUERIES_KEY_PREFIX + clientID + '/';\n}\n\nexport function toGotQueriesKey(hash: string): string {\n return GOT_QUERIES_KEY_PREFIX + hash;\n}\n\nexport function toEntitiesKey(entityType: string, entityID: EntityID): string {\n const idKeys = Object.keys(entityID);\n assert(idKeys.length > 0);\n // The common case of a non-composite primary key (i.e.\n // single entry entityID) is optimized to just use the single\n // id value.\n const idSegment =\n idKeys.length === 1\n ? entityID[idKeys[0]]\n : JSON.stringify(entityID, idKeys.sort());\n return ENTITIES_KEY_PREFIX + entityType + '/' + idSegment;\n}\n", "import type {ExperimentalNoIndexDiff} from 'replicache';\nimport {assert, unreachable} from 'shared/src/asserts.js';\nimport type {AST} from 'zql/src/zql/ast/ast.js';\nimport type {Row} from 'zql/src/zql/ivm/data.js';\nimport {MemorySource} from 'zql/src/zql/ivm/memory-source.js';\nimport {MemoryStorage} from 'zql/src/zql/ivm/memory-storage.js';\nimport type {Storage} from 'zql/src/zql/ivm/operator.js';\nimport type {Source} from 'zql/src/zql/ivm/source.js';\nimport type {\n CommitListener,\n QueryDelegate,\n} from 'zql/src/zql/query/query-impl.js';\nimport type {TableSchema} from 'zql/src/zql/query/schema.js';\nimport {ENTITIES_KEY_PREFIX} from './keys.js';\n\nexport type AddQuery = (ast: AST) => () => void;\n\n/**\n * ZeroContext glues together zql and Replicache. It listens to changes in\n * Replicache data and pushes them into IVM and on tells the server about new\n * queries.\n */\nexport class ZeroContext implements QueryDelegate {\n // It is a bummer to have to maintain separate MemorySources here and copy the\n // data in from the Replicache db. But we want the data to be accessible via\n // pipelines *synchronously* and the core Replicache infra is all async. So\n // that needs to be fixed.\n readonly #sources = new Map<string, MemorySource>();\n readonly #tables: Record<string, TableSchema>;\n readonly #addQuery: AddQuery;\n readonly #commitListeners: Set<CommitListener> = new Set();\n\n readonly staticQueryParameters = undefined;\n\n constructor(tables: Record<string, TableSchema>, addQuery: AddQuery) {\n this.#tables = tables;\n this.#addQuery = addQuery;\n }\n\n getSource(name: string): Source {\n let source = this.#sources.get(name);\n if (source !== undefined) {\n return source;\n }\n const schema = this.#tables[name] as TableSchema | undefined;\n if (!schema) {\n throw new Error(`No schema found for table ${name}`);\n }\n source = new MemorySource(name, schema.columns, schema.primaryKey);\n this.#sources.set(name, source);\n return source;\n }\n\n addServerQuery(ast: AST) {\n return this.#addQuery(ast);\n }\n\n createStorage(): Storage {\n return new MemoryStorage();\n }\n\n onTransactionCommit(cb: CommitListener): () => void {\n this.#commitListeners.add(cb);\n return () => {\n this.#commitListeners.delete(cb);\n };\n }\n\n processChanges(changes: ExperimentalNoIndexDiff) {\n try {\n for (const diff of changes) {\n const {key} = diff;\n assert(key.startsWith(ENTITIES_KEY_PREFIX));\n const slash = key.indexOf('/', ENTITIES_KEY_PREFIX.length);\n const name = key.slice(ENTITIES_KEY_PREFIX.length, slash);\n const source = this.getSource(name);\n\n switch (diff.op) {\n case 'del':\n assert(typeof diff.oldValue === 'object');\n source.push({\n type: 'remove',\n row: diff.oldValue as Row,\n });\n break;\n case 'add':\n assert(typeof diff.newValue === 'object');\n source.push({\n type: 'add',\n row: diff.newValue as Row,\n });\n break;\n case 'change':\n assert(typeof diff.newValue === 'object');\n assert(typeof diff.oldValue === 'object');\n\n // Edit changes are not yet supported everywhere. For now we only\n // generate them in tests.\n source.push({\n type: 'edit',\n row: diff.newValue as Row,\n oldRow: diff.oldValue as Row,\n });\n\n break;\n default:\n unreachable(diff);\n }\n }\n } finally {\n this.#endTransaction();\n }\n }\n\n #endTransaction() {\n for (const listener of this.#commitListeners) {\n listener();\n }\n }\n}\n", "export const promiseTrue = Promise.resolve(true);\nexport const promiseFalse = Promise.resolve(false);\nexport const promiseUndefined = Promise.resolve(undefined);\nexport const promiseVoid = Promise.resolve();\n", "import type {ReadonlyJSONObject} from 'shared/src/json.js';\nimport {promiseVoid} from 'shared/src/resolved-promises.js';\nimport type {MaybePromise} from 'shared/src/types.js';\nimport type {EntityID} from 'zero-protocol/src/entity.js';\nimport {\n type CRUDMutationArg,\n type CRUDOp,\n type CRUDOpKind,\n CRUD_MUTATION_NAME,\n type CreateOp,\n type DeleteOp,\n type SetOp,\n type UpdateOp,\n} from 'zero-protocol/src/push.js';\nimport type {Row} from 'zql/src/zql/ivm/data.js';\nimport type {SchemaToRow} from 'zql/src/zql/query/query.js';\nimport {toEntitiesKey} from './keys.js';\nimport type {MutatorDefs, WriteTransaction} from './replicache-types.js';\nimport type {Schema} from './zero.js';\n\nexport type Parse<E extends Row> = (v: ReadonlyJSONObject) => E;\n\nexport type Update<E extends Row> = Partial<E>;\n\n/**\n * This is the type of the generated mutate.<name>.<verb> function.\n */\nexport type EntityCRUDMutate<E extends Row> = {\n create: (value: E) => Promise<void>;\n set: (value: E) => Promise<void>;\n update: (value: Update<E>) => Promise<void>;\n delete: (id: EntityID) => Promise<void>;\n};\n\n/**\n * This is the type of the generated mutate.<name> object.\n */\nexport type MakeCRUDMutate<S extends Schema> = BaseCRUDMutate<S> & CRUDBatch<S>;\n\nexport type BaseCRUDMutate<S extends Schema> = {\n [K in keyof S['tables']]: EntityCRUDMutate<SchemaToRow<S['tables'][K]>>;\n};\n\nexport type CRUDBatch<S extends Schema> = <R>(\n body: (m: BaseCRUDMutate<S>) => MaybePromise<R>,\n) => Promise<R>;\n\ntype ZeroCRUDMutate = {\n [CRUD_MUTATION_NAME]: CRUDMutate;\n};\n\n/**\n * This is the zero.mutate object part representing the CRUD operations. If the\n * queries are `issue` and `label`, then this object will have `issue` and\n * `label` properties.\n */\nexport function makeCRUDMutate<S extends Schema>(\n schema: S,\n repMutate: ZeroCRUDMutate,\n): MakeCRUDMutate<S> {\n const {[CRUD_MUTATION_NAME]: zeroCRUD} = repMutate;\n let inBatch = false;\n\n const mutate = async <R>(body: (m: BaseCRUDMutate<S>) => R): Promise<R> => {\n if (inBatch) {\n throw new Error('Cannot call mutate inside a batch');\n }\n inBatch = true;\n\n try {\n const ops: CRUDOp[] = [];\n const m = {} as Record<string, unknown>;\n for (const name of Object.keys(schema.tables)) {\n m[name] = makeBatchCRUDMutate(name, ops);\n }\n\n const rv = await body(m as BaseCRUDMutate<S>);\n await zeroCRUD({ops});\n return rv;\n } finally {\n inBatch = false;\n }\n };\n\n const assertNotInBatch = (entityType: string, op: CRUDOpKind) => {\n if (inBatch) {\n throw new Error(`Cannot call mutate.${entityType}.${op} inside a batch`);\n }\n };\n\n for (const name of Object.keys(schema.tables)) {\n (mutate as unknown as Record<string, EntityCRUDMutate<Row>>)[name] =\n makeEntityCRUDMutate(name, zeroCRUD, assertNotInBatch);\n }\n return mutate as MakeCRUDMutate<S>;\n}\n\n/**\n * Creates the `{create, set, update, delete}` object for use outside a batch.\n */\nfunction makeEntityCRUDMutate<E extends Row>(\n entityType: string,\n zeroCRUD: CRUDMutate,\n assertNotInBatch: (entityType: string, op: CRUDOpKind) => void,\n): EntityCRUDMutate<E> {\n return {\n create: (value: E) => {\n assertNotInBatch(entityType, 'create');\n const {id} = value;\n const op: CreateOp = {\n op: 'create',\n entityType,\n // TODO: Current crud mutators expect id to always exist\n id: {id: id as string},\n value,\n };\n return zeroCRUD({ops: [op]});\n },\n set: (value: E) => {\n assertNotInBatch(entityType, 'set');\n const {id} = value;\n const op: SetOp = {op: 'set', entityType, id: {id: id as string}, value};\n return zeroCRUD({ops: [op]});\n },\n update: (value: Update<E>) => {\n assertNotInBatch(entityType, 'update');\n const {id} = value;\n const op: UpdateOp = {\n op: 'update',\n entityType,\n id: {id: id as string},\n partialValue: value,\n };\n return zeroCRUD({ops: [op]});\n },\n delete: (id: EntityID) => {\n assertNotInBatch(entityType, 'delete');\n const op: DeleteOp = {op: 'delete', entityType, id};\n return zeroCRUD({ops: [op]});\n },\n };\n}\n\n/**\n * Creates the `{create, set, update, delete}` object for use inside a batch.\n */\nexport function makeBatchCRUDMutate<E extends Row>(\n entityType: string,\n ops: CRUDOp[],\n): EntityCRUDMutate<E> {\n return {\n create: (value: E) => {\n const {id} = value;\n const op: CreateOp = {\n op: 'create',\n entityType,\n id: {id: id as string},\n value,\n };\n ops.push(op);\n return promiseVoid;\n },\n set: (value: E) => {\n const {id} = value;\n const op: SetOp = {op: 'set', entityType, id: {id: id as string}, value};\n ops.push(op);\n return promiseVoid;\n },\n update: (value: Update<E>) => {\n const {id} = value;\n const op: UpdateOp = {\n op: 'update',\n entityType,\n id: {id: id as string},\n partialValue: value,\n };\n ops.push(op);\n return promiseVoid;\n },\n delete: (id: EntityID) => {\n const op: DeleteOp = {op: 'delete', entityType, id};\n ops.push(op);\n return promiseVoid;\n },\n };\n}\n\nexport type WithCRUD<MD extends MutatorDefs> = MD & {\n [CRUD_MUTATION_NAME]: CRUDMutator;\n};\n\nexport type CRUDMutate = (crudArg: CRUDMutationArg) => Promise<void>;\n\nexport type CRUDMutator = (\n tx: WriteTransaction,\n crudArg: CRUDMutationArg,\n) => Promise<void>;\n\nexport function makeCRUDMutator<S extends Schema>(_schemas: S): CRUDMutator {\n return async function zeroCRUDMutator(\n tx: WriteTransaction,\n crudArg: CRUDMutationArg,\n ): Promise<void> {\n for (const op of crudArg.ops) {\n switch (op.op) {\n case 'create':\n await createImpl(tx, op);\n break;\n case 'set':\n await setImpl(tx, op);\n break;\n case 'update':\n await updateImpl(tx, op);\n break;\n case 'delete':\n await deleteImpl(tx, op);\n break;\n }\n }\n };\n}\n\nexport async function createImpl(\n tx: WriteTransaction,\n arg: CreateOp,\n): Promise<void> {\n const key = toEntitiesKey(arg.entityType, arg.id);\n if (!(await tx.has(key))) {\n await tx.set(key, arg.value);\n }\n}\n\nexport async function setImpl(tx: WriteTransaction, arg: SetOp): Promise<void> {\n const key = toEntitiesKey(arg.entityType, arg.id);\n await tx.set(key, arg.value);\n}\n\nexport async function updateImpl(\n tx: WriteTransaction,\n arg: UpdateOp,\n): Promise<void> {\n const key = toEntitiesKey(arg.entityType, arg.id);\n const prev = await tx.get(key);\n if (prev === undefined) {\n return;\n }\n const update = arg.partialValue;\n const next = {...(prev as object), ...(update as object)};\n await tx.set(key, next);\n}\n\nexport async function deleteImpl(\n tx: WriteTransaction,\n arg: DeleteOp,\n): Promise<void> {\n const key = toEntitiesKey(arg.entityType, arg.id);\n await tx.del(key);\n}\n", "// https://www.oreilly.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html\nconst IPV4_ADDRESS_REGEX =\n /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n// This doesn't ensure a valid ipv6, but any ipv6 hostname will\n// match this regex, and no domain based hostnames will.\nconst IPV6_ADDRESS_HOSTNAME_REGEX = /^\\[[a-fA-F0-9:]*:[a-fA-F0-9:]*\\]$/;\n\nexport const IP_ADDRESS_HOSTNAME_REGEX = new RegExp(\n `(${IPV4_ADDRESS_REGEX.source}|${IPV6_ADDRESS_HOSTNAME_REGEX.source})`,\n);\n\nexport function shouldEnableAnalytics(\n server: string | null,\n enableAnalytics = true,\n): boolean {\n if (!enableAnalytics) {\n return false;\n }\n const serverURL = server === null ? null : new URL(server);\n const socketHostname = serverURL?.hostname;\n // If the hostname is undefined, localhost, or an ip address, then\n // this is most likely a test or local development, in which case we\n // do not want to enable analytics.\n return (\n server !== null &&\n socketHostname !== undefined &&\n socketHostname !== 'localhost' &&\n !IP_ADDRESS_HOSTNAME_REGEX.test(socketHostname)\n );\n}\n", "import {assert} from 'shared/src/asserts.js';\n\nexport type HTTPString = `http${'' | 's'}://${string}`;\n\nexport type WSString = `ws${'' | 's'}://${string}`;\n\nexport function toWSString(url: HTTPString): WSString {\n return ('ws' + url.slice(4)) as WSString;\n}\n\nexport function toHTTPString(url: WSString): HTTPString {\n return ('http' + url.slice(2)) as HTTPString;\n}\n\nexport function assertHTTPString(url: string): asserts url is HTTPString {\n assert(/^https?:\\/\\//.test(url));\n}\n\nexport function assertWSString(url: string): asserts url is WSString {\n assert(/^wss?:\\/\\//.test(url));\n}\n", "import {\n TeeLogSink,\n consoleLogSink,\n type Context,\n type LogLevel,\n type LogSink,\n} from '@rocicorp/logger';\nimport {DatadogLogSink, type DatadogLogSinkOptions} from 'datadog';\nimport {version} from './version.js';\n\nclass LevelFilterLogSink implements LogSink {\n readonly #wrappedLogSink: LogSink;\n readonly #level: LogLevel;\n\n constructor(wrappedLogSink: LogSink, level: LogLevel) {\n this.#wrappedLogSink = wrappedLogSink;\n this.#level = level;\n }\n\n log(level: LogLevel, context: Context | undefined, ...args: unknown[]): void {\n if (this.#level === 'error' && level !== 'error') {\n return;\n }\n if (this.#level === 'info' && level === 'debug') {\n return;\n }\n this.#wrappedLogSink.log(level, context, ...args);\n }\n\n async flush() {\n await consoleLogSink.flush?.();\n }\n}\n\nconst DATADOG_LOG_LEVEL = 'info';\nconst ZERO_SASS_DOMAIN = '.reflect-server.net';\n\nexport type LogOptions = {\n readonly logLevel: LogLevel;\n readonly logSink: LogSink;\n};\n\nexport function createLogOptions(\n options: {\n consoleLogLevel: LogLevel;\n server: string | null;\n enableAnalytics: boolean;\n },\n createDatadogLogSink: (options: DatadogLogSinkOptions) => LogSink = (\n options: DatadogLogSinkOptions,\n ) => new DatadogLogSink(options),\n): LogOptions {\n const {consoleLogLevel, server, enableAnalytics} = options;\n\n if (!enableAnalytics || server === null) {\n return {\n logLevel: consoleLogLevel,\n logSink: consoleLogSink,\n };\n }\n\n const serverURL = new URL(server);\n const socketHostname = serverURL.hostname;\n const datadogServiceLabel = socketHostname.endsWith(ZERO_SASS_DOMAIN)\n ? socketHostname\n .substring(0, socketHostname.length - ZERO_SASS_DOMAIN.length)\n .toLowerCase()\n : socketHostname;\n const baseURL = new URL('/api/logs/v0/log', server);\n const logLevel = consoleLogLevel === 'debug' ? 'debug' : 'info';\n const logSink = new TeeLogSink([\n new LevelFilterLogSink(consoleLogSink, consoleLogLevel),\n new LevelFilterLogSink(\n createDatadogLogSink({\n service: datadogServiceLabel,\n host: location.host,\n version,\n baseURL,\n }),\n DATADOG_LOG_LEVEL,\n ),\n ]);\n return {\n logLevel,\n logSink,\n };\n}\n", "import {Lock} from '@rocicorp/lock';\nimport type {Context, LogLevel, LogSink} from '@rocicorp/logger';\n\nexport interface DatadogLogSinkOptions {\n apiKey?: string | undefined;\n source?: string | undefined;\n service?: string | undefined;\n host?: string | undefined;\n version?: string | undefined;\n interval?: number | undefined;\n baseURL?: URL | undefined;\n}\n\nconst DD_BASE_URL = new URL(\n 'https://http-intake.logs.datadoghq.com/api/v2/logs',\n);\n\n// https://docs.datadoghq.com/api/latest/logs/\nexport const MAX_LOG_ENTRIES_PER_FLUSH = 1000;\nexport const FORCE_FLUSH_THRESHOLD = 250;\nconst MAX_ENTRY_BYTES = 5 * 1024 * 1024;\nconst MAX_MESSAGE_RETRIES = 2;\n\n// Conservative limit that assumes all chars are encoded as 4 UTF-8 bytes.\n// This makes the actual limit somewhere closer to 1.25 MB, which is still\n// a reasonable amount of log data to send per request.\nexport const MAX_ENTRY_CHARS = MAX_ENTRY_BYTES / 4;\n\nexport class DatadogLogSink implements LogSink {\n #messages: Message[] = [];\n readonly #apiKey: string | undefined;\n readonly #source: string | undefined;\n readonly #service: string | undefined;\n readonly #host: string | undefined;\n readonly #version: string | undefined;\n readonly #interval: number;\n readonly #baseURL: string;\n #timerID: ReturnType<typeof setTimeout> | 0 = 0;\n #flushLock = new Lock();\n\n constructor(options: DatadogLogSinkOptions) {\n const {\n apiKey,\n source,\n service,\n host,\n version,\n interval = 5_000,\n baseURL: baseUrl = DD_BASE_URL,\n } = options;\n\n this.#apiKey = apiKey;\n this.#source = source;\n this.#service = service;\n this.#host = host;\n this.#version = version;\n this.#interval = interval;\n this.#baseURL = baseUrl.toString();\n }\n\n log(level: LogLevel, context: Context | undefined, ...args: unknown[]): void {\n this.#messages.push(makeMessage(args, context, level));\n if (level === 'error' || this.#messages.length === FORCE_FLUSH_THRESHOLD) {\n // Do not await. Later calls to flush will await as needed.\n void this.flush();\n } else {\n this.#startTimer();\n }\n }\n #startTimer() {\n if (this.#timerID) {\n return;\n }\n\n this.#timerID = setTimeout(() => {\n this.#timerID = 0;\n\n void this.flush();\n }, this.#interval);\n }\n\n flush(): Promise<void> {\n return this.#flushLock.withLock(async () => {\n const {length} = this.#messages;\n if (length === 0) {\n return;\n }\n do {\n const flushTime = Date.now();\n const stringified = [];\n let totalBytes = 0;\n\n for (const m of this.#messages) {\n // As a small perf optimization, we directly mutate\n // the message rather than making a shallow copy.\n // The LOG_SINK_FLUSH_DELAY_ATTRIBUTE will be clobbered by\n // the next flush if this flush fails (which is the desired behavior).\n m.flushDelayMs = flushTime - m.date;\n\n let str = JSON.stringify(m);\n if (str.length > MAX_ENTRY_CHARS) {\n // A single message above the total payload limit will otherwise halt\n // log flushing progress. Drop and replace with a message indicating so.\n m.message = `[Dropped message of length ${str.length}]`;\n str = JSON.stringify(m);\n }\n // Calculate the totalBytes with the newline characters between messages.\n if (str.length + totalBytes + stringified.length > MAX_ENTRY_CHARS) {\n break;\n }\n totalBytes += str.length;\n stringified.push(str);\n\n if (stringified.length === MAX_LOG_ENTRIES_PER_FLUSH) {\n break;\n }\n }\n\n const body = stringified.join('\\n');\n const url = new URL(this.#baseURL);\n if (this.#apiKey !== undefined) {\n url.searchParams.set('dd-api-key', this.#apiKey);\n }\n\n if (this.#source) {\n // Both need to be set for server to treat us as the browser SDK for\n // value 'browser'.\n url.searchParams.set('ddsource', this.#source);\n url.searchParams.set('dd-evp-origin', this.#source);\n }\n\n if (this.#service) {\n url.searchParams.set('service', this.#service);\n }\n\n if (this.#host) {\n url.searchParams.set('host', this.#host);\n }\n\n if (this.#version) {\n url.searchParams.set('ddtags', `version:${this.#version}`);\n }\n\n let ok = false;\n try {\n const response = await fetch(url.toString(), {\n method: 'POST',\n body,\n keepalive: true,\n } as RequestInit);\n\n ok = response.ok;\n if (!ok) {\n // Log to console so that we might catch this in `wrangler tail`.\n console.error(\n 'response',\n response.status,\n response.statusText,\n await response.text,\n );\n }\n } catch (e) {\n // Log to console so that we might catch this in `wrangler tail`.\n console.error('Log flush to datadog failed', e);\n }\n\n if (ok) {\n // Remove messages that were successfully flushed.\n this.#messages.splice(0, stringified.length);\n } else {\n let numWithTooManyRetries = 0;\n for (let i = 0; i < stringified.length; i++) {\n const m = this.#messages[i];\n m.flushRetryCount = (m.flushRetryCount ?? 0) + 1;\n if (m.flushRetryCount > MAX_MESSAGE_RETRIES) {\n numWithTooManyRetries++;\n }\n }\n if (numWithTooManyRetries > 0) {\n console.error(\n `Dropping ${numWithTooManyRetries} datadog log messages which failed to send ${\n MAX_MESSAGE_RETRIES + 1\n } times.`,\n );\n // Remove messages that have failed too many times.\n this.#messages.splice(0, numWithTooManyRetries);\n }\n }\n } while (this.#messages.length >= FORCE_FLUSH_THRESHOLD);\n // If any messages left at this point schedule another flush.\n if (this.#messages.length) {\n this.#startTimer();\n }\n });\n }\n}\n\ntype Message = Context & {\n status: LogLevel;\n date: number;\n message: unknown;\n error?: {origin: 'logger'};\n flushDelayMs?: number;\n flushRetryCount?: number;\n};\n\nfunction flattenMessage(message: unknown): unknown {\n if (Array.isArray(message) && message.length === 1) {\n return flattenMessage(message[0]);\n }\n return message;\n}\n\nfunction convertError(e: Error): {\n name: string;\n message: string;\n stack: string | undefined;\n} {\n return {\n name: e.name,\n message: e.message,\n stack: e.stack,\n };\n}\n\nfunction convertErrors(message: unknown): unknown {\n if (message instanceof Error) {\n return convertError(message);\n }\n if (message instanceof Array) {\n const convertedMessage: unknown[] = [];\n for (const item of message) {\n if (item instanceof Error) {\n convertedMessage.push(convertError(item));\n } else {\n convertedMessage.push(item);\n }\n }\n return convertedMessage;\n }\n return message;\n}\n\nconst LOG_SINK_FLUSH_RETRY_COUNT = 'flushRetryCount';\nconst LOG_SINK_FLUSH_DELAY_ATTRIBUTE = 'flushDelayMs';\n// This code assumes that no context keys will start with\n// @DATADOG_RESERVED_ (a fairly safe assumption).\nconst RESERVED_KEY_PREFIX = '@DATADOG_RESERVED_';\n// See https://docs.datadoghq.com/logs/log_configuration/attributes_naming_convention/#reserved-attributes\n// Note 'msg' and 'date' are not documented.\n// We should avoid using these as context keys. We escape them here\n// because otherwise the impact on the data dog log UI is very confusing\n// (e.g. using 'msg' as a context key results, in the context value\n// replacing the log message.)\nconst RESERVED_KEYS: ReadonlyArray<string> = [\n 'host',\n 'source',\n 'status',\n 'service',\n 'version',\n 'trace_id',\n 'message',\n 'msg', // alias for message\n 'date',\n // The following are attributes reserved by the DataDogLogSink\n // itself (as opposed to DataDog), to report on its own behavior.\n LOG_SINK_FLUSH_DELAY_ATTRIBUTE,\n LOG_SINK_FLUSH_RETRY_COUNT,\n];\n\nfunction makeMessage(\n message: unknown,\n context: Context | undefined,\n logLevel: LogLevel,\n): Message {\n let safeContext = undefined;\n if (context !== undefined) {\n for (const reservedKey of RESERVED_KEYS) {\n if (Object.hasOwn(context, reservedKey)) {\n if (safeContext === undefined) {\n safeContext = {...context};\n }\n safeContext[RESERVED_KEY_PREFIX + reservedKey] =\n safeContext[reservedKey];\n delete safeContext[reservedKey];\n }\n }\n }\n const msg: Message = {\n ...(safeContext ?? context),\n date: Date.now(),\n message: convertErrors(flattenMessage(message)),\n status: logLevel,\n };\n if (logLevel === 'error') {\n msg.error = {origin: 'logger'};\n }\n return msg;\n}\n", "declare const ZERO_VERSION: string;\n\n/**\n * The current version of Zero.\n */\nexport const version = ZERO_VERSION;\n", "import type {LogContext} from '@rocicorp/logger';\nimport type {MaybePromise} from 'shared/src/types.js';\nimport type {ErrorKind as ServerErrorKind} from 'zero-protocol';\n\nexport enum MetricName {\n TimeToConnectMs = 'time_to_connect_ms',\n LastConnectError = 'last_connect_error',\n TimeToConnectMsV2 = 'time_to_connect_ms_v2',\n LastConnectErrorV2 = 'last_connect_error_v2',\n TotalTimeToConnectMs = 'total_time_to_connect_ms',\n NotConnected = 'not_connected',\n}\n\n// This value is used to indicate that the client's last connection attempt\n// failed. We don't make this -1 because we want to stack this never connected\n// state in a graph on top of actual connection times, so it should be greater\n// than any other value.\nexport const DID_NOT_CONNECT_VALUE = 100 * 1000;\n\nexport const REPORT_INTERVAL_MS = 5_000;\n\ntype ClientDisconnectReason =\n | 'AbruptClose'\n | 'CleanClose'\n | 'ClientClosed'\n | 'ConnectTimeout'\n | 'UnexpectedBaseCookie'\n | 'PingTimeout'\n | 'Hidden';\n\ntype NotConnectedReason =\n | 'init'\n | 'error'\n | 'hidden'\n | 'hidden_was_init'\n | 'hidden_was_error';\n\nexport type DisconnectReason =\n | {\n server: ServerErrorKind;\n }\n | {\n client: ClientDisconnectReason;\n };\n\nexport function getLastConnectErrorValue(reason: DisconnectReason): string {\n if ('server' in reason) {\n return `server_${camelToSnake(reason.server)}`;\n }\n return `client_${camelToSnake(reason.client)}`;\n}\n\n// camelToSnake is used to convert a protocol ErrorKind into a suitable\n// metric name, eg AuthInvalidated => auth_invalidated. It converts\n// both PascalCase and camelCase to snake_case.\nfunction camelToSnake(s: string): string {\n return s\n .split(/\\.?(?=[A-Z])/)\n .join('_')\n .toLowerCase();\n}\n\ntype MetricsReporter = (metrics: Series[]) => MaybePromise<void>;\n\nexport type MetricManagerOptions = {\n reportIntervalMs: number;\n host: string;\n source: string;\n reporter: MetricsReporter;\n lc: LogContext;\n};\n\n/**\n * MetricManager keeps track of the set of metrics in use and flushes them\n * to a format suitable for reporting.\n */\nexport class MetricManager {\n #reportIntervalMs: number;\n #host: string;\n #reporter: MetricsReporter;\n #lc: LogContext;\n #timerID: ReturnType<typeof setInterval> | null;\n\n constructor(opts: MetricManagerOptions) {\n this.#reportIntervalMs = opts.reportIntervalMs;\n this.#host = opts.host;\n this.#reporter = opts.reporter;\n this.#lc = opts.lc;\n\n this.tags.push(`source:${opts.source}`);\n\n this.timeToConnectMs.set(DID_NOT_CONNECT_VALUE);\n this.#setNotConnectedReason('init');\n\n this.#timerID = setInterval(() => {\n void this.flush();\n }, this.#reportIntervalMs);\n }\n\n #metrics: Flushable[] = [];\n\n // timeToConnectMs measures the time from the call to connect() to receiving\n // the 'connected' ws message. We record the DID_NOT_CONNECT_VALUE if the previous\n // connection attempt failed for any reason.\n //\n // We set the gauge using #connectStart as follows:\n // - #connectStart is undefined if we are disconnected or connected; it is\n // defined only in the Connecting state, as a number representing the timestamp\n // at which we started connecting.\n // - #connectStart is set to the current time when connect() is called.\n // - When we receive the 'connected' message we record the time to connect and\n // set #connectStart to undefined.\n // - If disconnect() is called with a defined #connectStart then we record\n // DID_NOT_CONNECT_VALUE and set #connectStart to undefined.\n //\n // TODO It's clear after playing with the connection code we should encapsulate\n // the ConnectionState along with its state transitions and possibly behavior.\n // In that world the metric gauge(s) and bookkeeping like #connectStart would\n // be encapsulated with the ConnectionState. This will probably happen as part\n // of https://github.com/rocicorp/reflect-server/issues/255.\n readonly timeToConnectMs = this.#register(\n new Gauge(MetricName.TimeToConnectMs),\n );\n\n // lastConnectError records the last error that occurred when connecting,\n // if any. It is cleared when connecting successfully or when reported, so this\n // state only gets reported if there was a failure during the reporting period and\n // we are still not connected.\n readonly lastConnectError = this.#register(\n new State(\n MetricName.LastConnectError,\n true, // clearOnFlush\n ),\n );\n\n // notConnected records the reason why the client is not currently connected.\n // It is cleared when the client successfully connects.\n readonly #notConnected = this.#register(new State(MetricName.NotConnected));\n\n // The time from the call to connect() to receiving the 'connected' ws message\n // for the current connection. Cleared when the client is not connected.\n // TODO: Not actually currently cleared on disconnect untill there is a\n // connect error, or client reports disconnected and waiting for visible.\n // Should have a value iff _notConnected has no value.\n readonly #timeToConnectMsV2 = this.#register(\n new Gauge(MetricName.TimeToConnectMsV2),\n );\n\n // lastConnectErrorV2 records the last error that occurred when connecting,\n // if any. It is cleared when the client successfully connects or\n // stops trying to connect due to being hidden.\n // Should have a value iff notConnected state is NotConnectedReason.Error.\n readonly #lastConnectErrorV2 = this.#register(\n new State(MetricName.LastConnectErrorV2),\n );\n\n // The total time it took to connect across retries for the current\n // connection. Cleared when the client is not connected.\n // TODO: Not actually currently cleared on disconnect until there is a\n // connect error, or client reports disconnected and waiting for visible.\n // See Zero.#totalToConnectStart for details of how this total is computed.\n // Should have a value iff _notConnected has no value.\n readonly #totalTimeToConnectMs = this.#register(\n new Gauge(MetricName.TotalTimeToConnectMs),\n );\n\n #setNotConnectedReason(reason: NotConnectedReason) {\n this.#notConnected.set(reason);\n }\n\n setConnected(timeToConnectMs: number, totalTimeToConnectMs: number) {\n this.#notConnected.clear();\n this.#lastConnectErrorV2.clear();\n this.#timeToConnectMsV2.set(timeToConnectMs);\n this.#totalTimeToConnectMs.set(totalTimeToConnectMs);\n }\n\n setDisconnectedWaitingForVisible() {\n this.#timeToConnectMsV2.clear();\n this.#totalTimeToConnectMs.clear();\n this.#lastConnectErrorV2.clear();\n let notConnectedReason: NotConnectedReason;\n switch (this.#notConnected.get()) {\n case 'init':\n notConnectedReason = 'hidden_was_init';\n break;\n case 'error':\n notConnectedReason = 'hidden_was_error';\n break;\n default:\n notConnectedReason = 'hidden';\n break;\n }\n this.#setNotConnectedReason(notConnectedReason);\n }\n\n setConnectError(reason: DisconnectReason) {\n this.#timeToConnectMsV2.clear();\n this.#totalTimeToConnectMs.clear();\n this.#setNotConnectedReason('error');\n this.#lastConnectErrorV2.set(getLastConnectErrorValue(reason));\n }\n\n /**\n * Tags to include in all metrics.\n */\n readonly tags: string[] = [];\n\n // Flushes all metrics to an array of time series (plural), one Series\n // per metric.\n async flush() {\n const lc = this.#lc;\n if (this.#timerID === null) {\n lc.error?.('MetricManager.flush() called but already stopped');\n return;\n }\n const allSeries: Series[] = [];\n for (const metric of this.#metrics) {\n const series = metric.flush();\n if (series !== undefined) {\n allSeries.push({\n ...series,\n host: this.#host,\n tags: this.tags,\n });\n }\n }\n if (allSeries.length === 0) {\n lc?.debug?.('No metrics to report');\n return;\n }\n try {\n await this.#reporter(allSeries);\n } catch (e) {\n lc?.error?.(`Error reporting metrics: ${e}`);\n }\n }\n\n stop() {\n if (this.#timerID === null) {\n this.#lc.error?.('MetricManager.stop() called but already stopped');\n return;\n }\n clearInterval(this.#timerID);\n this.#timerID = null;\n }\n\n #register<M extends Flushable>(metric: M) {\n this.#metrics.push(metric);\n return metric;\n }\n}\n\n// These two types are influenced by Datadog's API's needs. We could change what\n// we use internally if necessary, but we'd just have to convert to/from before\n// sending to DD. So for convenience we go with their format.\n\n/** Series is a time series of points for a single metric. */\nexport type Series = {\n host: string;\n metric: string; // We call this 'name' bc 'metric' is overloaded in code.\n points: Point[];\n tags?: string[];\n};\n/**\n * A point is a second-resolution timestamp and a set of values for that\n * timestamp. A point represents exactly one second in time and the values\n * are those recorded for that second. The first element of this array\n * is the timestamp and the second element is an array of values.\n */\nexport type Point = [number, number[]];\n\nfunction makePoint(ts: number, value: number): Point {\n return [ts, [value]];\n}\n\ntype Flushable = {\n flush(): Pick<Series, 'metric' | 'points'> | undefined;\n};\n\n/**\n * Gauge is a metric type that represents a single value that can go up and\n * down. It's typically used to track discrete values or counts eg the number\n * of active users, number of connections, cpu load, etc. A gauge retains\n * its value when flushed.\n *\n * We use a Gauge to sample at the client. If we are interested in tracking\n * a metric value *per client*, the client can note the latest value in\n * a Gauge metric. The metric is periodically reported via Reporter. On the\n * server, we graph the value of the metric rolled up over the periodic\n * reporting period, that is, counted over a span of time equal to the\n * reporting period. The result is ~one point per client per reporting\n * period.\n */\nexport class Gauge implements Flushable {\n readonly #name: string;\n #value: number | undefined = undefined;\n\n constructor(name: string) {\n this.#name = name;\n }\n\n set(value: number) {\n this.#value = value;\n }\n\n get() {\n return this.#value;\n }\n\n clear() {\n this.#value = undefined;\n }\n\n flush() {\n if (this.#value === undefined) {\n return undefined;\n }\n // Gauge reports the timestamp at flush time, not at the point the value was\n // recorded.\n const points = [makePoint(t(), this.#value)];\n return {metric: this.#name, points};\n }\n}\n\nfunction t() {\n return Math.round(Date.now() / 1000);\n}\n\n/**\n * State is a metric type that represents a specific state that the system is\n * in, for example the state of a connection which may be 'open' or 'closed'.\n * The state is given a name/prefix at construction time (eg 'connection') and\n * then can be set to a specific state (eg 'open'). The prefix is prepended to\n * the set state (eg, 'connection_open') and a value of 1 is reported.\n * Unset/cleared states are not reported.\n *\n * Example:\n * const s = new State('connection');\n * s.set('open');\n * s.flush(); // returns {metric: 'connection_open', points: [[now(), [1]]]}\n */\nexport class State implements Flushable {\n readonly #prefix: string;\n readonly #clearOnFlush: boolean;\n #current: string | undefined = undefined;\n\n constructor(prefix: string, clearOnFlush = false) {\n this.#prefix = prefix;\n this.#clearOnFlush = clearOnFlush;\n }\n\n set(state: string) {\n this.#current = state;\n }\n\n get() {\n return this.#current;\n }\n\n clear() {\n this.#current = undefined;\n }\n\n flush() {\n if (this.#current === undefined) {\n return undefined;\n }\n const gauge = new Gauge([this.#prefix, this.#current].join('_'));\n gauge.set(1);\n const series = gauge.flush();\n if (this.#clearOnFlush) {\n this.clear();\n }\n return series;\n }\n}\n", "import xxhash from 'xxhash-wasm';\n\nconst {create64, h32, h64} = await xxhash();\n\nexport {create64, h32, h64};\n", "import {compareUTF8} from 'compare-utf8';\nimport {must} from 'shared/src/must.js';\nimport type {Bound} from '../ivm/skip.js';\n\n/**\n * As in SQL you can have multiple orderings. We don't currently\n * support ordering on anything other than the root query.\n */\nexport type OrderPart = readonly [field: string, direction: 'asc' | 'desc'];\nexport type Ordering = readonly OrderPart[];\n\nexport type SimpleOperator = EqualityOps | OrderOps | LikeOps | InOps;\nexport type EqualityOps = '=' | '!=';\nexport type OrderOps = '<' | '>' | '<=' | '>=';\nexport type LikeOps = 'LIKE' | 'NOT LIKE' | 'ILIKE' | 'NOT ILIKE';\nexport type InOps = 'IN' | 'NOT IN';\n\nexport type AST = {\n readonly schema?: string | undefined;\n readonly table: string;\n\n // A query would be aliased if the AST is a subquery.\n // e.g., when two subqueries select from the same table\n // they need an alias to differentiate them.\n // `SELECT\n // [SELECT * FROM issue WHERE issue.id = outer.parentId] AS parent\n // [SELECT * FROM issue WHERE issue.parentId = outer.id] AS children\n // FROM issue as outer`\n readonly alias?: string | undefined;\n\n // `select` is missing given we return all columns for now.\n\n // The PipelineBuilder will pick what to use to correlate\n // a subquery with a parent query. It can choose something from the\n // where conditions or choose the _first_ `related` entry.\n // Choosing the first `related` entry is almost always the best choice if\n // one exists.\n readonly where?: readonly Condition[] | undefined;\n\n readonly related?: readonly CorrelatedSubQuery[] | undefined;\n readonly start?: Bound | undefined;\n readonly limit?: number | undefined;\n readonly orderBy?: Ordering | undefined;\n};\n\nexport type CorrelatedSubQuery = {\n /**\n * Only equality correlations are supported for now.\n * E.g., direct foreign key relationships.\n */\n readonly correlation: {\n readonly parentField: string;\n readonly childField: string;\n readonly op: '=';\n };\n readonly subquery: AST;\n // If a hop in the subquery chain should be hidden from the output view.\n // A common example is junction edges. The query API provides the illusion\n // that they don't exist: `issue.related('labels')` instead of `issue.related('issue_labels').related('labels')`.\n // To maintain this illusion, the junction edge should be hidden.\n // When `hidden` is set to true, this hop will not be included in the output view\n // but its children will be.\n readonly hidden?: boolean | undefined;\n};\n\nexport type ValuePosition = LiteralValue | Parameter;\n\nexport type LiteralValue =\n | string\n | number\n | boolean\n | ReadonlyArray<string | number | boolean>;\n\n/**\n * Starting only with SimpleCondition for now.\n * ivm1 supports Conjunctions and Disjunctions.\n * We'll support them in the future.\n */\nexport type Condition = SimpleCondition;\nexport type SimpleCondition = {\n type: 'simple';\n op: SimpleOperator;\n\n /**\n * Not a path yet as we're currently not allowing\n * comparisons across tables. This will need to\n * be a path through the tree in the near future.\n */\n field: string;\n\n /**\n * `null` is absent since we do not have an `IS` or `IS NOT`\n * operator defined and `null != null` in SQL.\n */\n value: ValuePosition;\n};\n/**\n * A parameter is a value that is not known at the time the query is written\n * and is resolved at runtime.\n *\n * StaticParameters refer to something provided by the caller.\n * StaticParameters are injected when the query pipeline is built from the AST\n * and do not change for the life of that pipeline.\n *\n * An example StaticParameter is the current authentication data.\n * When a user is authenticated, queries on the server have access\n * to the user's authentication data in order to evaluate authorization rules.\n * Authentication data doesn't change over the life of a query as a change\n * in auth data would represent a log-in / log-out of the user.\n *\n * AncestorParameters refer to rows encountered while running the query.\n * They are used by subqueries to refer to rows emitted by parent queries.\n */\nexport type Parameter = StaticParameter;\ntype StaticParameter = {\n type: 'static';\n // The \"namespace\" of the injected parameter.\n // Write authorization will send the value of a row\n // prior to the mutation being run (preMutationRow).\n // Read and write authorization will both send the\n // current authentication data (authData).\n anchor: 'authData' | 'preMutationRow';\n field: string;\n};\n\nexport function normalizeAST(ast: AST): Required<AST> {\n return {\n schema: ast.schema,\n table: ast.table,\n alias: ast.alias,\n where: ast.where ? sortedWhere(ast.where) : undefined,\n related: ast.related\n ? sortedRelated(\n ast.related.map(\n r =>\n ({\n correlation: {\n parentField: r.correlation.parentField,\n childField: r.correlation.childField,\n op: r.correlation.op,\n },\n hidden: r.hidden,\n subquery: normalizeAST(r.subquery),\n }) satisfies Required<CorrelatedSubQuery>,\n ),\n )\n : undefined,\n start: ast.start,\n limit: ast.limit,\n orderBy: ast.orderBy,\n };\n}\n\nfunction sortedWhere(where: readonly Condition[]): readonly Condition[] {\n return [...where].sort(cmpCondition);\n}\n\nfunction sortedRelated(\n related: CorrelatedSubQuery[],\n): readonly CorrelatedSubQuery[] {\n return related.sort(cmpRelated);\n}\n\nfunction cmpCondition(a: Condition, b: Condition): number {\n return (\n compareUTF8MaybeNull(a.field, b.field) ||\n compareUTF8MaybeNull(a.op, b.op) ||\n // Comparing the same field with the same op more than once doesn't make logical\n // sense, but is technically possible. Assume the values are of the same type and\n // sort by their String forms.\n compareUTF8MaybeNull(String(a.value), String(b.value))\n );\n}\n\nfunction cmpRelated(a: CorrelatedSubQuery, b: CorrelatedSubQuery): number {\n return compareUTF8(must(a.subquery.alias), must(b.subquery.alias));\n}\n\nfunction compareUTF8MaybeNull(a: string | null, b: string | null): number {\n if (a !== null && b !== null) {\n return compareUTF8(a, b);\n }\n if (b !== null) {\n return -1;\n }\n if (a !== null) {\n return 1;\n }\n return 0;\n}\n", "import type {ClientID} from 'replicache';\nimport {must} from 'shared/src/must.js';\nimport {h64} from 'shared/src/xxhash.js';\nimport type {ChangeDesiredQueriesMessage, QueriesPatch} from 'zero-protocol';\nimport {normalizeAST, type AST} from 'zql/src/zql/ast/ast.js';\nimport type {ReadTransaction} from '../mod.js';\nimport {desiredQueriesPrefixForClient} from './keys.js';\n\n/**\n * Tracks what queries the client is currently subscribed to on the server.\n * Sends `changeDesiredQueries` message to server when this changes.\n * Deduplicates requests so that we only listen to a given unique query once.\n */\nexport class QueryManager {\n readonly #clientID: ClientID;\n readonly #send: (change: ChangeDesiredQueriesMessage) => void;\n readonly #queries: Map<QueryHash, {normalized: AST; count: number}> =\n new Map();\n\n constructor(\n clientID: ClientID,\n send: (change: ChangeDesiredQueriesMessage) => void,\n ) {\n this.#clientID = clientID;\n this.#send = send;\n }\n\n async getQueriesPatch(tx: ReadTransaction): Promise<QueriesPatch> {\n const existingQueryHashes = new Set<string>();\n const prefix = desiredQueriesPrefixForClient(this.#clientID);\n for await (const key of tx.scan({prefix}).keys()) {\n existingQueryHashes.add(key.substring(prefix.length, key.length));\n }\n const patch: QueriesPatch = [];\n for (const hash of existingQueryHashes) {\n if (!this.#queries.has(hash)) {\n patch.push({op: 'del', hash});\n }\n }\n for (const [hash, {normalized}] of this.#queries) {\n if (!existingQueryHashes.has(hash)) {\n patch.push({op: 'put', hash, ast: normalized});\n }\n }\n return patch;\n }\n\n add(ast: AST): () => void {\n const normalized = normalizeAST(ast);\n const astHash = hash(normalized);\n let entry = this.#queries.get(astHash);\n if (!entry) {\n entry = {normalized, count: 1};\n this.#queries.set(astHash, entry);\n this.#send([\n 'changeDesiredQueries',\n {\n desiredQueriesPatch: [{op: 'put', hash: astHash, ast: normalized}],\n },\n ]);\n } else {\n ++entry.count;\n }\n\n let removed = false;\n return () => {\n if (removed) {\n return;\n }\n removed = true;\n this.#remove(astHash);\n };\n }\n\n #remove(astHash: string) {\n const entry = must(this.#queries.get(astHash));\n --entry.count;\n if (entry.count === 0) {\n this.#queries.delete(astHash);\n this.#send([\n 'changeDesiredQueries',\n {\n desiredQueriesPatch: [{op: 'del', hash: astHash}],\n },\n ]);\n }\n return true;\n }\n}\n\ntype QueryHash = string;\n\nfunction hash(normalized: AST): QueryHash {\n return h64(JSON.stringify(normalized)).toString(36);\n}\n", "import type {LogContext} from '@rocicorp/logger';\n\nexport const RELOAD_REASON_STORAGE_KEY = '_zeroReloadReason';\n\n// TODO: This should get pushed down into Replicache and used for reloads we\n// do there.\nexport function reloadWithReason(\n lc: LogContext,\n reload: () => void,\n reason: string,\n) {\n if (typeof localStorage === 'undefined') {\n lc.error?.('Zero reloaded the page.', reason);\n } else {\n localStorage[RELOAD_REASON_STORAGE_KEY] = reason;\n }\n reload();\n}\n\nexport function reportReloadReason(lc: LogContext) {\n if (typeof localStorage === 'undefined') {\n return;\n }\n const reason = localStorage[RELOAD_REASON_STORAGE_KEY];\n if (reason) {\n delete localStorage[RELOAD_REASON_STORAGE_KEY];\n lc.error?.('Zero reloaded the page.', reason);\n }\n}\n", "import {ErrorKind} from 'zero-protocol';\n\n/**\n * Represents an error sent by server as part of Zero protocol.\n */\nexport class ServerError<K extends ErrorKind = ErrorKind> extends Error {\n readonly kind: K;\n readonly name = 'ServerError';\n constructor(kind: K, message: string) {\n super(kind + ': ' + message);\n this.kind = kind;\n }\n}\n\nexport function isServerError(ex: unknown): ex is ServerError {\n return ex instanceof ServerError;\n}\n\nexport function isAuthError(\n ex: unknown,\n): ex is\n | ServerError<ErrorKind.AuthInvalidated>\n | ServerError<ErrorKind.Unauthorized> {\n return isServerError(ex) && isAuthErrorKind(ex.kind);\n}\n\nfunction isAuthErrorKind(\n kind: ErrorKind,\n): kind is ErrorKind.AuthInvalidated | ErrorKind.Unauthorized {\n return kind === ErrorKind.AuthInvalidated || kind === ErrorKind.Unauthorized;\n}\n", "import type {HTTPString} from './http-string.js';\n\nfunction validateServerParam(paramName: string, server: string): HTTPString {\n const expectedProtocol = 'http';\n const forExample = () =>\n ` For example: \"${expectedProtocol}s://myapp-myteam.zero.ms/\".`;\n\n if (\n !server.startsWith(`${expectedProtocol}://`) &&\n !server.startsWith(`${expectedProtocol}s://`)\n ) {\n throw new Error(\n `ZeroOptions.${paramName} must use the \"${expectedProtocol}\" or \"${expectedProtocol}s\" scheme.`,\n );\n }\n let url;\n try {\n url = new URL(server);\n } catch {\n throw new Error(\n `ZeroOptions.${paramName} must be a valid URL.${forExample()}`,\n );\n }\n\n const urlString = url.toString();\n\n if (url.pathname !== '/') {\n throw new Error(\n `ZeroOptions.${paramName} must not contain a path component (other than \"/\").${forExample()}`,\n );\n }\n\n for (const [property, invalidEndsWith] of [\n ['search', '?'],\n ['hash', '#'],\n ] as const) {\n if (url[property] || urlString.endsWith(invalidEndsWith)) {\n throw new Error(\n `ZeroOptions.${paramName} must not contain a ${property} component.${forExample()}`,\n );\n }\n }\n\n return urlString as HTTPString;\n}\n\nexport function getServer(\n server: string | undefined | null,\n): HTTPString | null {\n if (server === undefined || server === null) {\n return null;\n }\n return validateServerParam('server', server);\n}\n", "import {Lock} from '@rocicorp/lock';\nimport type {LogContext} from '@rocicorp/logger';\nimport type {ClientID, PatchOperation} from 'replicache';\nimport type {PatchOperationInternal, PokeInternal} from 'replicache/impl';\nimport type {\n ClientsPatchOp,\n EntitiesPatchOp,\n PokeEndBody,\n PokePartBody,\n PokeStartBody,\n QueriesPatchOp,\n} from 'zero-protocol';\nimport {\n toClientsKey,\n toDesiredQueriesKey,\n toEntitiesKey,\n toGotQueriesKey,\n} from './keys.js';\n\ntype PokeAccumulator = {\n readonly pokeStart: PokeStartBody;\n readonly parts: PokePartBody[];\n};\n\n/**\n * Handles the multi-part format of zero pokes.\n * As an optimization it also debounces pokes, only poking Replicache with a\n * merged poke at most once per frame (as determined by requestAnimationFrame).\n * The client cannot control how fast the server sends pokes, and it can only\n * update the UI once per frame. This debouncing avoids wastefully\n * computing separate diffs and IVM updates for intermediate states that will\n * never been displayed to the UI.\n */\nexport class PokeHandler {\n readonly #replicachePoke: (poke: PokeInternal) => Promise<void>;\n readonly #onPokeError: () => void;\n readonly #clientID: ClientID;\n readonly #lc: LogContext;\n #receivingPoke: PokeAccumulator | undefined = undefined;\n readonly #pokeBuffer: PokeAccumulator[] = [];\n #pokePlaybackLoopRunning = false;\n #lastRafPerfTimestamp = 0;\n // Serializes calls to this.#replicachePoke otherwise we can cause out of\n // order poke errors.\n readonly #pokeLock = new Lock();\n\n constructor(\n replicachePoke: (poke: PokeInternal) => Promise<void>,\n onPokeError: () => void,\n clientID: ClientID,\n lc: LogContext,\n ) {\n this.#replicachePoke = replicachePoke;\n this.#onPokeError = onPokeError;\n this.#clientID = clientID;\n this.#lc = lc.withContext('PokeHandler');\n }\n\n handlePokeStart(pokeStart: PokeStartBody) {\n if (this.#receivingPoke) {\n this.#handlePokeError(\n `pokeStart ${JSON.stringify(\n pokeStart,\n )} while still receiving ${JSON.stringify(\n this.#receivingPoke.pokeStart,\n )} `,\n );\n return;\n }\n this.#receivingPoke = {\n pokeStart,\n parts: [],\n };\n }\n\n handlePokePart(pokePart: PokePartBody): number | undefined {\n if (pokePart.pokeID !== this.#receivingPoke?.pokeStart.pokeID) {\n this.#handlePokeError(\n `pokePart for ${pokePart.pokeID}, when receiving ${this.#receivingPoke\n ?.pokeStart.pokeID}`,\n );\n return;\n }\n this.#receivingPoke.parts.push(pokePart);\n return pokePart.lastMutationIDChanges?.[this.#clientID];\n }\n\n handlePokeEnd(pokeEnd: PokeEndBody) {\n if (pokeEnd.pokeID !== this.#receivingPoke?.pokeStart.pokeID) {\n this.#handlePokeError(\n `pokeEnd for ${pokeEnd.pokeID}, when receiving ${this.#receivingPoke\n ?.pokeStart.pokeID}`,\n );\n return;\n }\n this.#pokeBuffer.push(this.#receivingPoke);\n this.#receivingPoke = undefined;\n if (!this.#pokePlaybackLoopRunning) {\n this.#startPlaybackLoop();\n }\n }\n\n handleDisconnect(): void {\n this.#lc.debug?.('clearing due to disconnect');\n this.#clear();\n }\n\n #startPlaybackLoop() {\n this.#lc.debug?.('starting playback loop');\n this.#pokePlaybackLoopRunning = true;\n requestAnimationFrame(this.#rafCallback);\n }\n\n #rafCallback = async () => {\n const rafLC = this.#lc.withContext('rafAt', Math.floor(performance.now()));\n if (this.#pokeBuffer.length === 0) {\n rafLC.debug?.('stopping playback loop');\n this.#pokePlaybackLoopRunning = false;\n return;\n }\n requestAnimationFrame(this.#rafCallback);\n const start = performance.now();\n rafLC.debug?.(\n 'raf fired, processing pokes. Since last raf',\n start - this.#lastRafPerfTimestamp,\n );\n this.#lastRafPerfTimestamp = start;\n await this.#processPokesForFrame(rafLC);\n rafLC.debug?.('processing pokes took', performance.now() - start);\n };\n\n #processPokesForFrame(lc: LogContext): Promise<void> {\n return this.#pokeLock.withLock(async () => {\n const now = Date.now();\n lc.debug?.('got poke lock at', now);\n lc.debug?.('merging', this.#pokeBuffer.length);\n try {\n const merged = mergePokes(this.#pokeBuffer);\n this.#pokeBuffer.length = 0;\n if (merged === undefined) {\n lc.debug?.('frame is empty');\n return;\n }\n const start = performance.now();\n lc.debug?.('poking replicache');\n await this.#replicachePoke(merged);\n lc.debug?.('poking replicache took', performance.now() - start);\n } catch (e) {\n this.#handlePokeError(e);\n }\n });\n }\n\n #handlePokeError(e: unknown) {\n if (String(e).includes('unexpected base cookie for poke')) {\n // This can happen if cookie changes due to refresh from idb due\n // to an update arriving to different tabs in the same\n // client group at very different times. Unusual but possible.\n this.#lc.debug?.('clearing due to', e);\n } else {\n this.#lc.error?.('clearing due to unexpected poke error', e);\n }\n this.#clear();\n this.#onPokeError();\n }\n\n #clear() {\n this.#receivingPoke = undefined;\n this.#pokeBuffer.length = 0;\n }\n}\n\nexport function mergePokes(\n pokeBuffer: PokeAccumulator[],\n): PokeInternal | undefined {\n if (pokeBuffer.length === 0) {\n return undefined;\n }\n const {baseCookie} = pokeBuffer[0].pokeStart;\n const {cookie} = pokeBuffer[pokeBuffer.length - 1].pokeStart;\n const mergedPatch: PatchOperationInternal[] = [];\n const mergedLastMutationIDChanges: Record<string, number> = {};\n\n let prevPokeStart = undefined;\n for (const pokeAccumulator of pokeBuffer) {\n if (\n prevPokeStart &&\n pokeAccumulator.pokeStart.baseCookie &&\n pokeAccumulator.pokeStart.baseCookie > prevPokeStart.cookie\n ) {\n throw Error(\n `unexpected cookie gap ${JSON.stringify(\n prevPokeStart,\n )} ${JSON.stringify(pokeAccumulator.pokeStart)}`,\n );\n }\n prevPokeStart = pokeAccumulator.pokeStart;\n for (const pokePart of pokeAccumulator.parts) {\n if (pokePart.lastMutationIDChanges) {\n for (const [clientID, lastMutationID] of Object.entries(\n pokePart.lastMutationIDChanges,\n )) {\n mergedLastMutationIDChanges[clientID] = lastMutationID;\n }\n }\n if (pokePart.clientsPatch) {\n mergedPatch.push(\n ...pokePart.clientsPatch.map(clientsPatchOpToReplicachePatchOp),\n );\n }\n if (pokePart.desiredQueriesPatches) {\n for (const [clientID, queriesPatch] of Object.entries(\n pokePart.desiredQueriesPatches,\n )) {\n mergedPatch.push(\n ...queriesPatch.map(op =>\n queryPatchOpToReplicachePatchOp(op, hash =>\n toDesiredQueriesKey(clientID, hash),\n ),\n ),\n );\n }\n }\n if (pokePart.gotQueriesPatch) {\n mergedPatch.push(\n ...pokePart.gotQueriesPatch.map(op =>\n queryPatchOpToReplicachePatchOp(op, toGotQueriesKey),\n ),\n );\n }\n if (pokePart.entitiesPatch) {\n mergedPatch.push(\n ...pokePart.entitiesPatch.map(entitiesPatchOpToReplicachePatchOp),\n );\n }\n }\n }\n return {\n baseCookie,\n pullResponse: {\n lastMutationIDChanges: mergedLastMutationIDChanges,\n patch: mergedPatch,\n cookie,\n },\n };\n}\n\nfunction clientsPatchOpToReplicachePatchOp(op: ClientsPatchOp): PatchOperation {\n switch (op.op) {\n case 'clear':\n return op;\n case 'del':\n return {\n op: 'del',\n key: toClientsKey(op.clientID),\n };\n case 'put':\n default:\n return {\n op: 'put',\n key: toClientsKey(op.clientID),\n value: true,\n };\n }\n}\n\nfunction queryPatchOpToReplicachePatchOp(\n op: QueriesPatchOp,\n toKey: (hash: string) => string,\n): PatchOperation {\n switch (op.op) {\n case 'clear':\n return op;\n case 'del':\n return {\n op: 'del',\n key: toKey(op.hash),\n };\n case 'put':\n default:\n return {\n op: 'put',\n key: toKey(op.hash),\n value: op.ast,\n };\n }\n}\n\nfunction entitiesPatchOpToReplicachePatchOp(\n op: EntitiesPatchOp,\n): PatchOperationInternal {\n switch (op.op) {\n case 'clear':\n return op;\n case 'del':\n return {\n op: 'del',\n key: toEntitiesKey(op.entityType, op.entityID),\n };\n case 'put':\n return {\n op: 'put',\n key: toEntitiesKey(op.entityType, op.entityID),\n value: op.value,\n };\n case 'update':\n return {\n op: 'update',\n key: toEntitiesKey(op.entityType, op.entityID),\n merge: op.merge,\n constrain: op.constrain,\n };\n default:\n throw new Error('to be implemented');\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["dropDatabase", "v", "t", "v", "v", "v", "v", "change", "relationship", "pos", "found", "resolver", "resolver", "resolver", "assert", "v", "path", "toDisplay", "err", "atPath", "t", "readonly", "t", "putOpSchema", "delOpSchema", "clearOpSchema", "patchOpSchema", "v", "path", "v", "putOpSchema", "delOpSchema", "clearOpSchema", "updateOpSchema", "array", "v", "t", "v", "t", "data", "hash", "promiseVoid", "promiseVoid", "version", "ok", "options", "compareUTF8", "compareUTF8", "send", "hash", "Lock", "Lock", "hash", "resolver", "e", "RaceCases"]
7
+ }