@rocicorp/zero 0.2.2024101101 → 0.3.2024102500

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 (632) hide show
  1. package/out/react.js +91 -39
  2. package/out/react.js.map +2 -2
  3. package/out/replicache/src/async-iterable-to-array.js +8 -0
  4. package/out/replicache/src/async-iterable-to-array.js.map +1 -0
  5. package/out/replicache/src/bg-interval.js +38 -0
  6. package/out/replicache/src/bg-interval.js.map +1 -0
  7. package/out/replicache/src/binary-search.js +31 -0
  8. package/out/replicache/src/binary-search.js.map +1 -0
  9. package/out/replicache/src/broadcast-channel.js +29 -0
  10. package/out/replicache/src/broadcast-channel.js.map +1 -0
  11. package/out/replicache/src/btree/diff.js +6 -0
  12. package/out/replicache/src/btree/diff.js.map +1 -0
  13. package/out/replicache/src/btree/node.js +392 -0
  14. package/out/replicache/src/btree/node.js.map +1 -0
  15. package/out/replicache/src/btree/read.js +227 -0
  16. package/out/replicache/src/btree/read.js.map +1 -0
  17. package/out/replicache/src/btree/splice.js +79 -0
  18. package/out/replicache/src/btree/splice.js.map +1 -0
  19. package/out/replicache/src/btree/write.js +154 -0
  20. package/out/replicache/src/btree/write.js.map +1 -0
  21. package/out/replicache/src/call-default-fetch.js +37 -0
  22. package/out/replicache/src/call-default-fetch.js.map +1 -0
  23. package/out/replicache/src/config.js +13 -0
  24. package/out/replicache/src/config.js.map +1 -0
  25. package/out/replicache/src/connection-loop-delegates.js +30 -0
  26. package/out/replicache/src/connection-loop-delegates.js.map +1 -0
  27. package/out/replicache/src/connection-loop.js +268 -0
  28. package/out/replicache/src/connection-loop.js.map +1 -0
  29. package/out/replicache/src/cookies.js +41 -0
  30. package/out/replicache/src/cookies.js.map +1 -0
  31. package/out/replicache/src/dag/chunk.js +60 -0
  32. package/out/replicache/src/dag/chunk.js.map +1 -0
  33. package/out/replicache/src/dag/gc.js +126 -0
  34. package/out/replicache/src/dag/gc.js.map +1 -0
  35. package/out/replicache/src/dag/key-type-enum.js +6 -0
  36. package/out/replicache/src/dag/key-type-enum.js.map +1 -0
  37. package/out/replicache/src/dag/key.js +54 -0
  38. package/out/replicache/src/dag/key.js.map +1 -0
  39. package/out/replicache/src/dag/lazy-store.js +532 -0
  40. package/out/replicache/src/dag/lazy-store.js.map +1 -0
  41. package/out/replicache/src/dag/store-impl.js +175 -0
  42. package/out/replicache/src/dag/store-impl.js.map +1 -0
  43. package/out/replicache/src/dag/store.js +22 -0
  44. package/out/replicache/src/dag/store.js.map +1 -0
  45. package/out/replicache/src/dag/visitor.js +22 -0
  46. package/out/replicache/src/dag/visitor.js.map +1 -0
  47. package/out/replicache/src/db/commit.js +443 -0
  48. package/out/replicache/src/db/commit.js.map +1 -0
  49. package/out/replicache/src/db/index-operation-enum.js +4 -0
  50. package/out/replicache/src/db/index-operation-enum.js.map +1 -0
  51. package/out/replicache/src/db/index.js +170 -0
  52. package/out/replicache/src/db/index.js.map +1 -0
  53. package/out/replicache/src/db/meta-type-enum.js +7 -0
  54. package/out/replicache/src/db/meta-type-enum.js.map +1 -0
  55. package/out/replicache/src/db/read.js +59 -0
  56. package/out/replicache/src/db/read.js.map +1 -0
  57. package/out/replicache/src/db/rebase.js +56 -0
  58. package/out/replicache/src/db/rebase.js.map +1 -0
  59. package/out/replicache/src/db/scan.js +2 -0
  60. package/out/replicache/src/db/scan.js.map +1 -0
  61. package/out/replicache/src/db/write.js +260 -0
  62. package/out/replicache/src/db/write.js.map +1 -0
  63. package/out/replicache/src/error-responses.js +30 -0
  64. package/out/replicache/src/error-responses.js.map +1 -0
  65. package/out/replicache/src/filter-async-iterable.js +15 -0
  66. package/out/replicache/src/filter-async-iterable.js.map +1 -0
  67. package/out/replicache/src/format-version-enum.js +9 -0
  68. package/out/replicache/src/format-version-enum.js.map +1 -0
  69. package/out/replicache/src/format-version.js +8 -0
  70. package/out/replicache/src/format-version.js.map +1 -0
  71. package/out/replicache/src/frozen-json.js +151 -0
  72. package/out/replicache/src/frozen-json.js.map +1 -0
  73. package/out/replicache/src/get-default-puller.js +74 -0
  74. package/out/replicache/src/get-default-puller.js.map +1 -0
  75. package/out/replicache/src/get-default-pusher.js +36 -0
  76. package/out/replicache/src/get-default-pusher.js.map +1 -0
  77. package/out/replicache/src/hash.js +73 -0
  78. package/out/replicache/src/hash.js.map +1 -0
  79. package/out/replicache/src/http-request-info.js +7 -0
  80. package/out/replicache/src/http-request-info.js.map +1 -0
  81. package/out/replicache/src/impl.js +2 -0
  82. package/out/replicache/src/impl.js.map +1 -0
  83. package/out/replicache/src/index-defs.js +28 -0
  84. package/out/replicache/src/index-defs.js.map +1 -0
  85. package/out/replicache/src/invoke-kind-enum.js +4 -0
  86. package/out/replicache/src/invoke-kind-enum.js.map +1 -0
  87. package/out/replicache/src/iterable-union.js +5 -0
  88. package/out/replicache/src/iterable-union.js.map +1 -0
  89. package/out/replicache/src/kv/idb-store-with-mem-fallback.js +93 -0
  90. package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +1 -0
  91. package/out/replicache/src/kv/idb-store.js +179 -0
  92. package/out/replicache/src/kv/idb-store.js.map +1 -0
  93. package/out/replicache/src/kv/mem-store.js +61 -0
  94. package/out/replicache/src/kv/mem-store.js.map +1 -0
  95. package/out/replicache/src/kv/read-impl.js +23 -0
  96. package/out/replicache/src/kv/read-impl.js.map +1 -0
  97. package/out/replicache/src/kv/store.js +2 -0
  98. package/out/replicache/src/kv/store.js.map +1 -0
  99. package/out/replicache/src/kv/write-impl-base.js +48 -0
  100. package/out/replicache/src/kv/write-impl-base.js.map +1 -0
  101. package/out/replicache/src/kv/write-impl.js +25 -0
  102. package/out/replicache/src/kv/write-impl.js.map +1 -0
  103. package/out/replicache/src/lazy.js +10 -0
  104. package/out/replicache/src/lazy.js.map +1 -0
  105. package/out/replicache/src/log-options.js +13 -0
  106. package/out/replicache/src/log-options.js.map +1 -0
  107. package/out/replicache/src/merge-async-iterables.js +61 -0
  108. package/out/replicache/src/merge-async-iterables.js.map +1 -0
  109. package/out/replicache/src/mod.js +14 -0
  110. package/out/replicache/src/mod.js.map +1 -0
  111. package/out/replicache/src/mutation-recovery.js +439 -0
  112. package/out/replicache/src/mutation-recovery.js.map +1 -0
  113. package/out/replicache/src/new-client-channel.js +77 -0
  114. package/out/replicache/src/new-client-channel.js.map +1 -0
  115. package/out/replicache/src/on-persist-channel.js +33 -0
  116. package/out/replicache/src/on-persist-channel.js.map +1 -0
  117. package/out/replicache/src/patch-operation.js +37 -0
  118. package/out/replicache/src/patch-operation.js.map +1 -0
  119. package/out/replicache/src/pending-mutations.js +18 -0
  120. package/out/replicache/src/pending-mutations.js.map +1 -0
  121. package/out/replicache/src/persist/client-gc.js +38 -0
  122. package/out/replicache/src/persist/client-gc.js.map +1 -0
  123. package/out/replicache/src/persist/client-group-gc.js +38 -0
  124. package/out/replicache/src/persist/client-group-gc.js.map +1 -0
  125. package/out/replicache/src/persist/client-groups.js +180 -0
  126. package/out/replicache/src/persist/client-groups.js.map +1 -0
  127. package/out/replicache/src/persist/clients.js +390 -0
  128. package/out/replicache/src/persist/clients.js.map +1 -0
  129. package/out/replicache/src/persist/collect-idb-databases.js +174 -0
  130. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -0
  131. package/out/replicache/src/persist/gather-mem-only-visitor.js +25 -0
  132. package/out/replicache/src/persist/gather-mem-only-visitor.js.map +1 -0
  133. package/out/replicache/src/persist/gather-not-cached-visitor.js +35 -0
  134. package/out/replicache/src/persist/gather-not-cached-visitor.js.map +1 -0
  135. package/out/replicache/src/persist/heartbeat.js +37 -0
  136. package/out/replicache/src/persist/heartbeat.js.map +1 -0
  137. package/out/replicache/src/persist/idb-databases-store-db-name.js +18 -0
  138. package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -0
  139. package/out/replicache/src/persist/idb-databases-store.js +90 -0
  140. package/out/replicache/src/persist/idb-databases-store.js.map +1 -0
  141. package/out/replicache/src/persist/make-client-id.js +13 -0
  142. package/out/replicache/src/persist/make-client-id.js.map +1 -0
  143. package/out/replicache/src/persist/persist.js +132 -0
  144. package/out/replicache/src/persist/persist.js.map +1 -0
  145. package/out/replicache/src/persist/refresh.js +147 -0
  146. package/out/replicache/src/persist/refresh.js.map +1 -0
  147. package/out/replicache/src/process-scheduler.js +93 -0
  148. package/out/replicache/src/process-scheduler.js.map +1 -0
  149. package/out/replicache/src/puller.js +2 -0
  150. package/out/replicache/src/puller.js.map +1 -0
  151. package/out/replicache/src/pusher.js +32 -0
  152. package/out/replicache/src/pusher.js.map +1 -0
  153. package/out/replicache/src/replicache-impl.js +1007 -0
  154. package/out/replicache/src/replicache-impl.js.map +1 -0
  155. package/out/replicache/src/replicache-options.js +2 -0
  156. package/out/replicache/src/replicache-options.js.map +1 -0
  157. package/out/replicache/src/replicache.js +387 -0
  158. package/out/replicache/src/replicache.js.map +1 -0
  159. package/out/replicache/src/request-idle.js +15 -0
  160. package/out/replicache/src/request-idle.js.map +1 -0
  161. package/out/replicache/src/scan-iterator.js +202 -0
  162. package/out/replicache/src/scan-iterator.js.map +1 -0
  163. package/out/replicache/src/scan-options.js +45 -0
  164. package/out/replicache/src/scan-options.js.map +1 -0
  165. package/out/replicache/src/set-interval-with-signal.js +7 -0
  166. package/out/replicache/src/set-interval-with-signal.js.map +1 -0
  167. package/out/replicache/src/size-of-value.js +77 -0
  168. package/out/replicache/src/size-of-value.js.map +1 -0
  169. package/out/replicache/src/subscriptions.js +357 -0
  170. package/out/replicache/src/subscriptions.js.map +1 -0
  171. package/out/replicache/src/sync/diff.js +75 -0
  172. package/out/replicache/src/sync/diff.js.map +1 -0
  173. package/out/replicache/src/sync/handle-pull-response-result-type-enum.js +5 -0
  174. package/out/replicache/src/sync/handle-pull-response-result-type-enum.js.map +1 -0
  175. package/out/replicache/src/sync/ids.js +4 -0
  176. package/out/replicache/src/sync/ids.js.map +1 -0
  177. package/out/replicache/src/sync/patch.js +41 -0
  178. package/out/replicache/src/sync/patch.js.map +1 -0
  179. package/out/replicache/src/sync/pull-error.js +16 -0
  180. package/out/replicache/src/sync/pull-error.js.map +1 -0
  181. package/out/replicache/src/sync/pull.js +375 -0
  182. package/out/replicache/src/sync/pull.js.map +1 -0
  183. package/out/replicache/src/sync/push.js +141 -0
  184. package/out/replicache/src/sync/push.js.map +1 -0
  185. package/out/replicache/src/sync/request-id.js +31 -0
  186. package/out/replicache/src/sync/request-id.js.map +1 -0
  187. package/out/replicache/src/sync/sync-head-name.js +2 -0
  188. package/out/replicache/src/sync/sync-head-name.js.map +1 -0
  189. package/out/replicache/src/test-license-key.js +3 -0
  190. package/out/replicache/src/test-license-key.js.map +1 -0
  191. package/out/replicache/src/to-error.js +7 -0
  192. package/out/replicache/src/to-error.js.map +1 -0
  193. package/out/replicache/src/transaction-closed-error.js +17 -0
  194. package/out/replicache/src/transaction-closed-error.js.map +1 -0
  195. package/out/replicache/src/transactions.js +144 -0
  196. package/out/replicache/src/transactions.js.map +1 -0
  197. package/out/replicache/src/types.js +2 -0
  198. package/out/replicache/src/types.js.map +1 -0
  199. package/out/replicache/src/version.js +5 -0
  200. package/out/replicache/src/version.js.map +1 -0
  201. package/out/replicache/src/with-transactions.js +28 -0
  202. package/out/replicache/src/with-transactions.js.map +1 -0
  203. package/out/shared/src/browser-env.js +14 -0
  204. package/out/shared/src/browser-env.js.map +1 -0
  205. package/out/shared/src/document-visible.js +76 -0
  206. package/out/shared/src/document-visible.js.map +1 -0
  207. package/out/shared/src/immutable.js +2 -0
  208. package/out/shared/src/immutable.js.map +1 -0
  209. package/out/shared/src/iterables.d.ts +2 -2
  210. package/out/shared/src/iterables.d.ts.map +1 -1
  211. package/out/shared/src/iterables.js +40 -0
  212. package/out/shared/src/iterables.js.map +1 -0
  213. package/out/shared/src/navigator.js +3 -0
  214. package/out/shared/src/navigator.js.map +1 -0
  215. package/out/shared/src/random-uint64.js +8 -0
  216. package/out/shared/src/random-uint64.js.map +1 -0
  217. package/out/shared/src/random-values.d.ts +1 -0
  218. package/out/shared/src/random-values.d.ts.map +1 -1
  219. package/out/shared/src/random-values.js +22 -0
  220. package/out/shared/src/random-values.js.map +1 -0
  221. package/out/shared/src/set-utils.d.ts +1 -1
  222. package/out/shared/src/set-utils.d.ts.map +1 -1
  223. package/out/shared/src/set-utils.js +6 -4
  224. package/out/shared/src/set-utils.js.map +1 -1
  225. package/out/shared/src/sorted-entries.d.ts +2 -0
  226. package/out/shared/src/sorted-entries.d.ts.map +1 -0
  227. package/out/shared/src/sorted-entries.js +6 -0
  228. package/out/shared/src/sorted-entries.js.map +1 -0
  229. package/out/shared/src/types.js +2 -0
  230. package/out/shared/src/types.js.map +1 -0
  231. package/out/shared/src/valita.d.ts +1 -1
  232. package/out/shared/src/valita.d.ts.map +1 -1
  233. package/out/shared/src/valita.js.map +1 -1
  234. package/out/shared/src/writable.d.ts +4 -0
  235. package/out/shared/src/writable.d.ts.map +1 -0
  236. package/out/shared/src/writable.js +2 -0
  237. package/out/shared/src/writable.js.map +1 -0
  238. package/out/zero/src/config.d.ts +2 -0
  239. package/out/zero/src/config.d.ts.map +1 -0
  240. package/out/zero/src/config.js +2 -0
  241. package/out/zero/src/config.js.map +1 -0
  242. package/out/zero-cache/src/config/config-query.d.ts +18 -0
  243. package/out/zero-cache/src/config/config-query.d.ts.map +1 -0
  244. package/out/zero-cache/src/config/config-query.js +19 -0
  245. package/out/zero-cache/src/config/config-query.js.map +1 -0
  246. package/out/zero-cache/src/config/define-config.d.ts +43 -0
  247. package/out/zero-cache/src/config/define-config.d.ts.map +1 -0
  248. package/out/zero-cache/src/config/define-config.js +120 -0
  249. package/out/zero-cache/src/config/define-config.js.map +1 -0
  250. package/out/zero-cache/src/config/refs.d.ts +3 -0
  251. package/out/zero-cache/src/config/refs.d.ts.map +1 -0
  252. package/out/zero-cache/src/config/refs.js +14 -0
  253. package/out/zero-cache/src/config/refs.js.map +1 -0
  254. package/out/zero-cache/src/config/zero-config.d.ts +126 -686
  255. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  256. package/out/zero-cache/src/config/zero-config.js +43 -161
  257. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  258. package/out/zero-cache/src/db/create.d.ts +8 -0
  259. package/out/zero-cache/src/db/create.d.ts.map +1 -0
  260. package/out/zero-cache/src/db/create.js +39 -0
  261. package/out/zero-cache/src/db/create.js.map +1 -0
  262. package/out/zero-cache/src/db/lite-tables.d.ts +3 -3
  263. package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
  264. package/out/zero-cache/src/db/lite-tables.js +29 -20
  265. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  266. package/out/zero-cache/src/db/migration-lite.d.ts +60 -20
  267. package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
  268. package/out/zero-cache/src/db/migration-lite.js +89 -69
  269. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  270. package/out/zero-cache/src/db/migration.d.ts +61 -20
  271. package/out/zero-cache/src/db/migration.d.ts.map +1 -1
  272. package/out/zero-cache/src/db/migration.js +92 -75
  273. package/out/zero-cache/src/db/migration.js.map +1 -1
  274. package/out/zero-cache/src/db/pg-to-lite.d.ts +11 -0
  275. package/out/zero-cache/src/db/pg-to-lite.d.ts.map +1 -0
  276. package/out/zero-cache/src/{services/change-streamer/pg/schema/lite.js → db/pg-to-lite.js} +27 -15
  277. package/out/zero-cache/src/db/pg-to-lite.js.map +1 -0
  278. package/out/zero-cache/src/db/specs.d.ts +73 -0
  279. package/out/zero-cache/src/db/specs.d.ts.map +1 -0
  280. package/out/zero-cache/src/db/specs.js +30 -0
  281. package/out/zero-cache/src/db/specs.js.map +1 -0
  282. package/out/zero-cache/src/db/statements.d.ts +1 -1
  283. package/out/zero-cache/src/db/statements.d.ts.map +1 -1
  284. package/out/zero-cache/src/server/life-cycle.d.ts.map +1 -1
  285. package/out/zero-cache/src/server/life-cycle.js +9 -5
  286. package/out/zero-cache/src/server/life-cycle.js.map +1 -1
  287. package/out/zero-cache/src/server/main.js +3 -3
  288. package/out/zero-cache/src/server/main.js.map +1 -1
  289. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  290. package/out/zero-cache/src/server/syncer.js +2 -1
  291. package/out/zero-cache/src/server/syncer.js.map +1 -1
  292. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +1 -1
  293. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  294. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +1 -4
  295. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  296. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +455 -13
  297. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
  298. package/out/zero-cache/src/services/change-streamer/change-streamer.js +16 -0
  299. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  300. package/out/zero-cache/src/services/change-streamer/pg/change-source.d.ts.map +1 -1
  301. package/out/zero-cache/src/services/change-streamer/pg/change-source.js +313 -88
  302. package/out/zero-cache/src/services/change-streamer/pg/change-source.js.map +1 -1
  303. package/out/zero-cache/src/services/change-streamer/pg/initial-sync.d.ts.map +1 -1
  304. package/out/zero-cache/src/services/change-streamer/pg/initial-sync.js +13 -54
  305. package/out/zero-cache/src/services/change-streamer/pg/initial-sync.js.map +1 -1
  306. package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.d.ts +239 -59
  307. package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.d.ts.map +1 -1
  308. package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.js +291 -183
  309. package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.js.map +1 -1
  310. package/out/zero-cache/src/services/change-streamer/pg/schema/init.d.ts +5 -0
  311. package/out/zero-cache/src/services/change-streamer/pg/schema/init.d.ts.map +1 -0
  312. package/out/zero-cache/src/services/change-streamer/pg/schema/init.js +18 -0
  313. package/out/zero-cache/src/services/change-streamer/pg/schema/init.js.map +1 -0
  314. package/out/zero-cache/src/services/change-streamer/pg/schema/published.d.ts +4 -4
  315. package/out/zero-cache/src/services/change-streamer/pg/schema/published.d.ts.map +1 -1
  316. package/out/zero-cache/src/services/change-streamer/pg/schema/published.js +14 -19
  317. package/out/zero-cache/src/services/change-streamer/pg/schema/published.js.map +1 -1
  318. package/out/zero-cache/src/services/change-streamer/pg/schema/shard.d.ts +17 -0
  319. package/out/zero-cache/src/services/change-streamer/pg/schema/shard.d.ts.map +1 -0
  320. package/out/zero-cache/src/services/change-streamer/pg/schema/shard.js +150 -0
  321. package/out/zero-cache/src/services/change-streamer/pg/schema/shard.js.map +1 -0
  322. package/out/zero-cache/src/services/change-streamer/pg/sync-schema.d.ts.map +1 -1
  323. package/out/zero-cache/src/services/change-streamer/pg/sync-schema.js +11 -5
  324. package/out/zero-cache/src/services/change-streamer/pg/sync-schema.js.map +1 -1
  325. package/out/zero-cache/src/services/change-streamer/schema/change.d.ts +325 -26
  326. package/out/zero-cache/src/services/change-streamer/schema/change.d.ts.map +1 -1
  327. package/out/zero-cache/src/services/change-streamer/schema/change.js +84 -1
  328. package/out/zero-cache/src/services/change-streamer/schema/change.js.map +1 -1
  329. package/out/zero-cache/src/services/change-streamer/schema/init.d.ts +2 -2
  330. package/out/zero-cache/src/services/change-streamer/schema/init.d.ts.map +1 -1
  331. package/out/zero-cache/src/services/change-streamer/schema/init.js +13 -5
  332. package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
  333. package/out/zero-cache/src/services/change-streamer/schema/tables.js +6 -6
  334. package/out/zero-cache/src/services/change-streamer/storer.js +4 -4
  335. package/out/zero-cache/src/services/dispatcher/connect-params.d.ts +1 -0
  336. package/out/zero-cache/src/services/dispatcher/connect-params.d.ts.map +1 -1
  337. package/out/zero-cache/src/services/dispatcher/connect-params.js +5 -2
  338. package/out/zero-cache/src/services/dispatcher/connect-params.js.map +1 -1
  339. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  340. package/out/zero-cache/src/services/mutagen/mutagen.js +21 -22
  341. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  342. package/out/zero-cache/src/services/mutagen/write-authorizer.d.ts.map +1 -1
  343. package/out/zero-cache/src/services/mutagen/write-authorizer.js +18 -9
  344. package/out/zero-cache/src/services/mutagen/write-authorizer.js.map +1 -1
  345. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  346. package/out/zero-cache/src/services/replicator/incremental-sync.js +131 -16
  347. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  348. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts +20 -3
  349. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts.map +1 -1
  350. package/out/zero-cache/src/services/replicator/schema/change-log.js +46 -14
  351. package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -1
  352. package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts +1 -1
  353. package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts.map +1 -1
  354. package/out/zero-cache/src/services/replicator/schema/replication-state.js +9 -9
  355. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
  356. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +4 -3
  357. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
  358. package/out/zero-cache/src/services/view-syncer/client-handler.js +27 -21
  359. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  360. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +6 -4
  361. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  362. package/out/zero-cache/src/services/view-syncer/cvr-store.js +63 -18
  363. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  364. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +11 -8
  365. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  366. package/out/zero-cache/src/services/view-syncer/cvr.js +22 -13
  367. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  368. package/out/zero-cache/src/services/view-syncer/database-storage.js +1 -1
  369. package/out/zero-cache/src/services/view-syncer/database-storage.js.map +1 -1
  370. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts +31 -0
  371. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts.map +1 -0
  372. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +53 -0
  373. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -0
  374. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +13 -5
  375. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  376. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +27 -0
  377. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  378. package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts +2 -1
  379. package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts.map +1 -1
  380. package/out/zero-cache/src/services/view-syncer/schema/cvr.js +5 -4
  381. package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
  382. package/out/zero-cache/src/services/view-syncer/schema/init.d.ts +4 -0
  383. package/out/zero-cache/src/services/view-syncer/schema/init.d.ts.map +1 -0
  384. package/out/zero-cache/src/services/view-syncer/schema/init.js +16 -0
  385. package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -0
  386. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +8 -216
  387. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +1 -1
  388. package/out/zero-cache/src/services/view-syncer/schema/types.js +2 -4
  389. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  390. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +12 -4
  391. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  392. package/out/zero-cache/src/services/view-syncer/snapshotter.js +59 -49
  393. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  394. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +3 -4
  395. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  396. package/out/zero-cache/src/services/view-syncer/view-syncer.js +105 -44
  397. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  398. package/out/zero-cache/src/types/lite.d.ts.map +1 -1
  399. package/out/zero-cache/src/types/lite.js +8 -9
  400. package/out/zero-cache/src/types/lite.js.map +1 -1
  401. package/out/zero-cache/src/types/pg.d.ts +10 -4
  402. package/out/zero-cache/src/types/pg.d.ts.map +1 -1
  403. package/out/zero-cache/src/types/pg.js +37 -15
  404. package/out/zero-cache/src/types/pg.js.map +1 -1
  405. package/out/zero-cache/src/workers/connection.d.ts +4 -2
  406. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  407. package/out/zero-cache/src/workers/connection.js +21 -2
  408. package/out/zero-cache/src/workers/connection.js.map +1 -1
  409. package/out/zero-cache/src/workers/syncer.d.ts +2 -1
  410. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  411. package/out/zero-cache/src/workers/syncer.js +20 -9
  412. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  413. package/out/zero-client/src/client/context.d.ts +1 -1
  414. package/out/zero-client/src/client/context.d.ts.map +1 -1
  415. package/out/zero-client/src/client/context.js +99 -0
  416. package/out/zero-client/src/client/context.js.map +1 -0
  417. package/out/zero-client/src/client/crud.d.ts +8 -10
  418. package/out/zero-client/src/client/crud.d.ts.map +1 -1
  419. package/out/zero-client/src/client/crud.js +181 -0
  420. package/out/zero-client/src/client/crud.js.map +1 -0
  421. package/out/zero-client/src/client/enable-analytics.js +21 -0
  422. package/out/zero-client/src/client/enable-analytics.js.map +1 -0
  423. package/out/zero-client/src/client/http-string.js +14 -0
  424. package/out/zero-client/src/client/http-string.js.map +1 -0
  425. package/out/zero-client/src/client/keys.d.ts +3 -2
  426. package/out/zero-client/src/client/keys.d.ts.map +1 -1
  427. package/out/zero-client/src/client/keys.js +32 -0
  428. package/out/zero-client/src/client/keys.js.map +1 -0
  429. package/out/zero-client/src/client/log-options.js +57 -0
  430. package/out/zero-client/src/client/log-options.js.map +1 -0
  431. package/out/zero-client/src/client/metrics.js +268 -0
  432. package/out/zero-client/src/client/metrics.js.map +1 -0
  433. package/out/zero-client/src/client/normalized-schema.d.ts +17 -0
  434. package/out/zero-client/src/client/normalized-schema.d.ts.map +1 -0
  435. package/out/zero-client/src/client/normalized-schema.js +31 -0
  436. package/out/zero-client/src/client/normalized-schema.js.map +1 -0
  437. package/out/zero-client/src/client/options.js +2 -0
  438. package/out/zero-client/src/client/options.js.map +1 -0
  439. package/out/zero-client/src/client/query-manager.d.ts +18 -3
  440. package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
  441. package/out/zero-client/src/client/query-manager.js +149 -0
  442. package/out/zero-client/src/client/query-manager.js.map +1 -0
  443. package/out/zero-client/src/client/reload-error-handler.js +23 -0
  444. package/out/zero-client/src/client/reload-error-handler.js.map +1 -0
  445. package/out/zero-client/src/client/replicache-types.js +2 -0
  446. package/out/zero-client/src/client/replicache-types.js.map +1 -0
  447. package/out/zero-client/src/client/server-error.js +22 -0
  448. package/out/zero-client/src/client/server-error.js.map +1 -0
  449. package/out/zero-client/src/client/server-option.js +37 -0
  450. package/out/zero-client/src/client/server-option.js.map +1 -0
  451. package/out/zero-client/src/client/version.js +5 -0
  452. package/out/zero-client/src/client/version.js.map +1 -0
  453. package/out/zero-client/src/client/zero-poke-handler.d.ts +3 -3
  454. package/out/zero-client/src/client/zero-poke-handler.d.ts.map +1 -1
  455. package/out/zero-client/src/client/zero-poke-handler.js +240 -0
  456. package/out/zero-client/src/client/zero-poke-handler.js.map +1 -0
  457. package/out/zero-client/src/client/zero.d.ts +3 -2
  458. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  459. package/out/zero-client/src/client/zero.js +1212 -0
  460. package/out/zero-client/src/client/zero.js.map +1 -0
  461. package/out/zero-client/src/mod.d.ts +1 -0
  462. package/out/zero-client/src/mod.d.ts.map +1 -1
  463. package/out/zero-client/src/mod.js +5 -0
  464. package/out/zero-client/src/mod.js.map +1 -0
  465. package/out/zero-client/src/util/nanoid.js +34 -0
  466. package/out/zero-client/src/util/nanoid.js.map +1 -0
  467. package/out/zero-client/src/util/socket.js +4 -0
  468. package/out/zero-client/src/util/socket.js.map +1 -0
  469. package/out/zero-protocol/src/ast.d.ts +87 -1
  470. package/out/zero-protocol/src/ast.d.ts.map +1 -1
  471. package/out/zero-protocol/src/ast.js +53 -0
  472. package/out/zero-protocol/src/ast.js.map +1 -1
  473. package/out/zero-protocol/src/change-desired-queries.d.ts +6 -6
  474. package/out/zero-protocol/src/change-desired-queries.d.ts.map +1 -1
  475. package/out/zero-protocol/src/clients-patch.d.ts +1 -1
  476. package/out/zero-protocol/src/connect.d.ts +15 -8
  477. package/out/zero-protocol/src/connect.d.ts.map +1 -1
  478. package/out/zero-protocol/src/connect.js +21 -0
  479. package/out/zero-protocol/src/connect.js.map +1 -1
  480. package/out/zero-protocol/src/data.d.ts +36 -0
  481. package/out/zero-protocol/src/data.d.ts.map +1 -0
  482. package/out/zero-protocol/src/data.js +4 -0
  483. package/out/zero-protocol/src/data.js.map +1 -0
  484. package/out/zero-protocol/src/delete-clients.d.ts +4 -4
  485. package/out/zero-protocol/src/delete-clients.d.ts.map +1 -1
  486. package/out/zero-protocol/src/down.d.ts +18 -16
  487. package/out/zero-protocol/src/down.d.ts.map +1 -1
  488. package/out/zero-protocol/src/down.js +2 -1
  489. package/out/zero-protocol/src/down.js.map +1 -1
  490. package/out/zero-protocol/src/mod.d.ts +1 -2
  491. package/out/zero-protocol/src/mod.d.ts.map +1 -1
  492. package/out/zero-protocol/src/mod.js +2 -2
  493. package/out/zero-protocol/src/mod.js.map +1 -1
  494. package/out/zero-protocol/src/ping.d.ts +1 -1
  495. package/out/zero-protocol/src/ping.d.ts.map +1 -1
  496. package/out/zero-protocol/src/poke.d.ts +26 -26
  497. package/out/zero-protocol/src/poke.d.ts.map +1 -1
  498. package/out/zero-protocol/src/poke.js +8 -5
  499. package/out/zero-protocol/src/poke.js.map +1 -1
  500. package/out/zero-protocol/src/pong.d.ts +1 -1
  501. package/out/zero-protocol/src/pong.d.ts.map +1 -1
  502. package/out/zero-protocol/src/primary-key.d.ts +2 -3
  503. package/out/zero-protocol/src/primary-key.d.ts.map +1 -1
  504. package/out/zero-protocol/src/primary-key.js +1 -3
  505. package/out/zero-protocol/src/primary-key.js.map +1 -1
  506. package/out/zero-protocol/src/pull.d.ts +4 -4
  507. package/out/zero-protocol/src/pull.d.ts.map +1 -1
  508. package/out/zero-protocol/src/push.d.ts +105 -98
  509. package/out/zero-protocol/src/push.d.ts.map +1 -1
  510. package/out/zero-protocol/src/push.js +17 -13
  511. package/out/zero-protocol/src/push.js.map +1 -1
  512. package/out/zero-protocol/src/queries-patch.d.ts +4 -4
  513. package/out/zero-protocol/src/row-patch.d.ts +38 -0
  514. package/out/zero-protocol/src/row-patch.d.ts.map +1 -0
  515. package/out/zero-protocol/src/{entities-patch.js → row-patch.js} +10 -11
  516. package/out/zero-protocol/src/row-patch.js.map +1 -0
  517. package/out/zero-protocol/src/up.d.ts +28 -27
  518. package/out/zero-protocol/src/up.d.ts.map +1 -1
  519. package/out/zero-protocol/src/warm.d.ts +10 -0
  520. package/out/zero-protocol/src/warm.d.ts.map +1 -0
  521. package/out/zero-protocol/src/warm.js +6 -0
  522. package/out/zero-protocol/src/warm.js.map +1 -0
  523. package/out/zero-react/src/use-query.d.ts.map +1 -1
  524. package/out/zero.js +522 -217
  525. package/out/zero.js.map +4 -4
  526. package/out/zql/src/zql/builder/builder.d.ts +3 -4
  527. package/out/zql/src/zql/builder/builder.d.ts.map +1 -1
  528. package/out/zql/src/zql/builder/builder.js +1 -2
  529. package/out/zql/src/zql/builder/builder.js.map +1 -1
  530. package/out/zql/src/zql/builder/filter.d.ts +2 -2
  531. package/out/zql/src/zql/builder/filter.d.ts.map +1 -1
  532. package/out/zql/src/zql/builder/filter.js.map +1 -1
  533. package/out/zql/src/zql/ivm/array-view.d.ts +5 -12
  534. package/out/zql/src/zql/ivm/array-view.d.ts.map +1 -1
  535. package/out/zql/src/zql/ivm/array-view.js +226 -0
  536. package/out/zql/src/zql/ivm/array-view.js.map +1 -0
  537. package/out/zql/src/zql/ivm/change.d.ts +2 -1
  538. package/out/zql/src/zql/ivm/change.d.ts.map +1 -1
  539. package/out/zql/src/zql/ivm/data.d.ts +2 -33
  540. package/out/zql/src/zql/ivm/data.d.ts.map +1 -1
  541. package/out/zql/src/zql/ivm/data.js.map +1 -1
  542. package/out/zql/src/zql/ivm/filter.d.ts +2 -1
  543. package/out/zql/src/zql/ivm/filter.d.ts.map +1 -1
  544. package/out/zql/src/zql/ivm/filter.js.map +1 -1
  545. package/out/zql/src/zql/ivm/join.d.ts +1 -1
  546. package/out/zql/src/zql/ivm/join.d.ts.map +1 -1
  547. package/out/zql/src/zql/ivm/join.js +68 -24
  548. package/out/zql/src/zql/ivm/join.js.map +1 -1
  549. package/out/zql/src/zql/ivm/maybe-split-and-push-edit-change.d.ts +1 -1
  550. package/out/zql/src/zql/ivm/maybe-split-and-push-edit-change.d.ts.map +1 -1
  551. package/out/zql/src/zql/ivm/memory-source.d.ts +8 -6
  552. package/out/zql/src/zql/ivm/memory-source.d.ts.map +1 -1
  553. package/out/zql/src/zql/ivm/memory-source.js +2 -0
  554. package/out/zql/src/zql/ivm/memory-source.js.map +1 -1
  555. package/out/zql/src/zql/ivm/memory-storage.js +33 -0
  556. package/out/zql/src/zql/ivm/memory-storage.js.map +1 -0
  557. package/out/zql/src/zql/ivm/operator.d.ts +2 -1
  558. package/out/zql/src/zql/ivm/operator.d.ts.map +1 -1
  559. package/out/zql/src/zql/ivm/schema.d.ts +3 -3
  560. package/out/zql/src/zql/ivm/schema.d.ts.map +1 -1
  561. package/out/zql/src/zql/ivm/schema.js.map +1 -1
  562. package/out/zql/src/zql/ivm/skip.d.ts +2 -1
  563. package/out/zql/src/zql/ivm/skip.d.ts.map +1 -1
  564. package/out/zql/src/zql/ivm/skip.js.map +1 -1
  565. package/out/zql/src/zql/ivm/source.d.ts +2 -2
  566. package/out/zql/src/zql/ivm/source.d.ts.map +1 -1
  567. package/out/zql/src/zql/ivm/take.d.ts.map +1 -1
  568. package/out/zql/src/zql/ivm/take.js.map +1 -1
  569. package/out/zql/src/zql/query/like.d.ts +2 -0
  570. package/out/zql/src/zql/query/like.d.ts.map +1 -0
  571. package/out/zql/src/zql/query/like.js +18 -0
  572. package/out/zql/src/zql/query/like.js.map +1 -0
  573. package/out/zql/src/zql/query/normalize-table-schema.d.ts +48 -0
  574. package/out/zql/src/zql/query/normalize-table-schema.d.ts.map +1 -0
  575. package/out/zql/src/zql/query/normalize-table-schema.js +116 -0
  576. package/out/zql/src/zql/query/normalize-table-schema.js.map +1 -0
  577. package/out/zql/src/zql/query/query-impl.d.ts +6 -5
  578. package/out/zql/src/zql/query/query-impl.d.ts.map +1 -1
  579. package/out/zql/src/zql/query/query-impl.js +263 -0
  580. package/out/zql/src/zql/query/query-impl.js.map +1 -0
  581. package/out/zql/src/zql/query/query.d.ts +1 -1
  582. package/out/zql/src/zql/query/query.d.ts.map +1 -1
  583. package/out/zql/src/zql/query/query.js +3 -0
  584. package/out/zql/src/zql/query/query.js.map +1 -0
  585. package/out/zql/src/zql/query/schema.d.ts +13 -4
  586. package/out/zql/src/zql/query/schema.d.ts.map +1 -1
  587. package/out/zql/src/zql/query/schema.js +7 -0
  588. package/out/zql/src/zql/query/schema.js.map +1 -0
  589. package/out/zql/src/zql/query/typed-view.d.ts +5 -2
  590. package/out/zql/src/zql/query/typed-view.d.ts.map +1 -1
  591. package/out/zql/src/zql/query/typed-view.js +2 -0
  592. package/out/zql/src/zql/query/typed-view.js.map +1 -0
  593. package/out/zqlite/src/db.d.ts +1 -1
  594. package/out/zqlite/src/db.d.ts.map +1 -1
  595. package/out/zqlite/src/db.js +1 -1
  596. package/out/zqlite/src/db.js.map +1 -1
  597. package/out/zqlite/src/table-source.d.ts +2 -2
  598. package/out/zqlite/src/table-source.d.ts.map +1 -1
  599. package/out/zqlite/src/table-source.js.map +1 -1
  600. package/package.json +10 -8
  601. package/deps/sqlite3/sqlite3.c +0 -260574
  602. package/deps/sqlite3/sqlite3.h +0 -13572
  603. package/deps/sqlite3/sqlite3ext.h +0 -719
  604. package/out/zero-cache/src/services/change-streamer/pg/schema/create.d.ts +0 -6
  605. package/out/zero-cache/src/services/change-streamer/pg/schema/create.d.ts.map +0 -1
  606. package/out/zero-cache/src/services/change-streamer/pg/schema/create.js +0 -29
  607. package/out/zero-cache/src/services/change-streamer/pg/schema/create.js.map +0 -1
  608. package/out/zero-cache/src/services/change-streamer/pg/schema/lite.d.ts +0 -6
  609. package/out/zero-cache/src/services/change-streamer/pg/schema/lite.d.ts.map +0 -1
  610. package/out/zero-cache/src/services/change-streamer/pg/schema/lite.js.map +0 -1
  611. package/out/zero-cache/src/services/change-streamer/pg/schema/zero.d.ts +0 -11
  612. package/out/zero-cache/src/services/change-streamer/pg/schema/zero.d.ts.map +0 -1
  613. package/out/zero-cache/src/services/change-streamer/pg/schema/zero.js +0 -86
  614. package/out/zero-cache/src/services/change-streamer/pg/schema/zero.js.map +0 -1
  615. package/out/zero-cache/src/services/view-syncer/schema/pg-migrations.d.ts +0 -4
  616. package/out/zero-cache/src/services/view-syncer/schema/pg-migrations.d.ts.map +0 -1
  617. package/out/zero-cache/src/services/view-syncer/schema/pg-migrations.js +0 -12
  618. package/out/zero-cache/src/services/view-syncer/schema/pg-migrations.js.map +0 -1
  619. package/out/zero-cache/src/types/specs.d.ts +0 -29
  620. package/out/zero-cache/src/types/specs.d.ts.map +0 -1
  621. package/out/zero-cache/src/types/specs.js +0 -2
  622. package/out/zero-cache/src/types/specs.js.map +0 -1
  623. package/out/zero-client/src/client/make-id-from-primary-key.d.ts +0 -5
  624. package/out/zero-client/src/client/make-id-from-primary-key.d.ts.map +0 -1
  625. package/out/zero-protocol/src/entities-patch.d.ts +0 -66
  626. package/out/zero-protocol/src/entities-patch.d.ts.map +0 -1
  627. package/out/zero-protocol/src/entities-patch.js.map +0 -1
  628. package/out/zql/src/zql/ast/ast.d.ts +0 -84
  629. package/out/zql/src/zql/ast/ast.d.ts.map +0 -1
  630. package/out/zql/src/zql/ast/ast.js +0 -54
  631. package/out/zql/src/zql/ast/ast.js.map +0 -1
  632. package/tool/install-sqlite3.js +0 -37
@@ -0,0 +1,38 @@
1
+ import { initBgIntervalProcess } from '../bg-interval.js';
2
+ import { withWrite } from '../with-transactions.js';
3
+ import { getClients, setClients } from './clients.js';
4
+ /**
5
+ * The maximum time a client can be inactive before it is garbage collected.
6
+ * This means that this is the maximum time a tab can be in the background
7
+ * (frozen) and still be able to sync when it comes back to the foreground.
8
+ */
9
+ export const CLIENT_MAX_INACTIVE_TIME = 24 * 60 * 60 * 1000; // 24 hours
10
+ /**
11
+ * How frequently to try to garbage collect clients.
12
+ */
13
+ export const GC_INTERVAL = 5 * 60 * 1000; // 5 minutes
14
+ let latestGCUpdate;
15
+ export function getLatestGCUpdate() {
16
+ return latestGCUpdate;
17
+ }
18
+ export function initClientGC(clientID, dagStore, clientMaxInactiveTime, gcInterval, lc, signal) {
19
+ initBgIntervalProcess('ClientGC', () => {
20
+ latestGCUpdate = gcClients(clientID, dagStore, clientMaxInactiveTime);
21
+ return latestGCUpdate;
22
+ }, () => gcInterval, lc, signal);
23
+ }
24
+ function gcClients(clientID, dagStore, clientMaxInactiveTime) {
25
+ return withWrite(dagStore, async (dagWrite) => {
26
+ const now = Date.now();
27
+ const clients = await getClients(dagWrite);
28
+ const clientsAfterGC = Array.from(clients).filter(([id, client]) => id === clientID /* never collect ourself */ ||
29
+ now - client.heartbeatTimestampMs <= clientMaxInactiveTime);
30
+ if (clientsAfterGC.length === clients.size) {
31
+ return clients;
32
+ }
33
+ const newClients = new Map(clientsAfterGC);
34
+ await setClients(newClients, dagWrite);
35
+ return newClients;
36
+ });
37
+ }
38
+ //# sourceMappingURL=client-gc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-gc.js","sourceRoot":"","sources":["../../../../../replicache/src/persist/client-gc.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AAGxD,OAAO,EAAC,SAAS,EAAC,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAiB,UAAU,EAAE,UAAU,EAAC,MAAM,cAAc,CAAC;AAEpE;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;AAExE;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAEtD,IAAI,cAA8C,CAAC;AACnD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAAkB,EAClB,QAAe,EACf,qBAA6B,EAC7B,UAAkB,EAClB,EAAc,EACd,MAAmB;IAEnB,qBAAqB,CACnB,UAAU,EACV,GAAG,EAAE;QACH,cAAc,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;QACtE,OAAO,cAAc,CAAC;IACxB,CAAC,EACD,GAAG,EAAE,CAAC,UAAU,EAChB,EAAE,EACF,MAAM,CACP,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAChB,QAAkB,EAClB,QAAe,EACf,qBAA6B;IAE7B,OAAO,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAC,QAAQ,EAAC,EAAE;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAC/C,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CACf,EAAE,KAAK,QAAQ,CAAC,2BAA2B;YAC3C,GAAG,GAAG,MAAM,CAAC,oBAAoB,IAAI,qBAAqB,CAC7D,CAAC;QACF,IAAI,cAAc,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC;YAC3C,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACvC,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { initBgIntervalProcess } from '../bg-interval.js';
2
+ import { withWrite } from '../with-transactions.js';
3
+ import { clientGroupHasPendingMutations, getClientGroups, setClientGroups, } from './client-groups.js';
4
+ import { assertClientV6, getClients } from './clients.js';
5
+ const GC_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
6
+ let latestGCUpdate;
7
+ export function getLatestGCUpdate() {
8
+ return latestGCUpdate;
9
+ }
10
+ export function initClientGroupGC(dagStore, lc, signal) {
11
+ initBgIntervalProcess('ClientGroupGC', () => {
12
+ latestGCUpdate = gcClientGroups(dagStore);
13
+ return latestGCUpdate;
14
+ }, () => GC_INTERVAL_MS, lc, signal);
15
+ }
16
+ /**
17
+ * This removes client groups that have no clients and no pending mutations.
18
+ */
19
+ export function gcClientGroups(dagStore) {
20
+ return withWrite(dagStore, async (tx) => {
21
+ const clients = await getClients(tx);
22
+ const clientGroupIDs = new Set();
23
+ for (const client of clients.values()) {
24
+ assertClientV6(client);
25
+ clientGroupIDs.add(client.clientGroupID);
26
+ }
27
+ const clientGroups = new Map();
28
+ for (const [clientGroupID, clientGroup] of await getClientGroups(tx)) {
29
+ if (clientGroupIDs.has(clientGroupID) ||
30
+ clientGroupHasPendingMutations(clientGroup)) {
31
+ clientGroups.set(clientGroupID, clientGroup);
32
+ }
33
+ }
34
+ await setClientGroups(clientGroups, tx);
35
+ return clientGroups;
36
+ });
37
+ }
38
+ //# sourceMappingURL=client-group-gc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-group-gc.js","sourceRoot":"","sources":["../../../../../replicache/src/persist/client-group-gc.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAC,SAAS,EAAC,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAEL,8BAA8B,EAC9B,eAAe,EACf,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,cAAc,EAAE,UAAU,EAAC,MAAM,cAAc,CAAC;AAExD,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAElD,IAAI,cAAmD,CAAC;AACxD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAAe,EACf,EAAc,EACd,MAAmB;IAEnB,qBAAqB,CACnB,eAAe,EACf,GAAG,EAAE;QACH,cAAc,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,cAAc,CAAC;IACxB,CAAC,EACD,GAAG,EAAE,CAAC,cAAc,EACpB,EAAE,EACF,MAAM,CACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAe;IAC5C,OAAO,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAC,EAAE,EAAC,EAAE;QACpC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;QACjC,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,cAAc,CAAC,MAAM,CAAC,CAAC;YACvB,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,IAAI,MAAM,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC;YACrE,IACE,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC;gBACjC,8BAA8B,CAAC,WAAW,CAAC,EAC3C,CAAC;gBACD,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QACD,MAAM,eAAe,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACxC,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,180 @@
1
+ import { assert, assertObject } from '../../../shared/src/asserts.js';
2
+ import * as valita from '../../../shared/src/valita.js';
3
+ import { toRefs } from '../dag/chunk.js';
4
+ import { deepFreeze } from '../frozen-json.js';
5
+ import { hashSchema } from '../hash.js';
6
+ import { indexDefinitionsEqual, indexDefinitionsSchema } from '../index-defs.js';
7
+ const clientGroupSchema = valita.readonlyObject({
8
+ /**
9
+ * The hash of the commit in the perdag last persisted to this client group.
10
+ * Should only be updated by clients assigned to this client group.
11
+ */
12
+ headHash: hashSchema,
13
+ /**
14
+ * Set of mutator names common to all clients assigned to this client group.
15
+ */
16
+ mutatorNames: valita.readonlyArray(valita.string()),
17
+ /**
18
+ * Index definitions common to all clients assigned to this client group.
19
+ */
20
+ indexes: indexDefinitionsSchema,
21
+ /**
22
+ * The highest mutation ID of every client assigned to this client group.
23
+ * Should only be updated by clients assigned to this client group. Read by
24
+ * other clients to determine if there are unacknowledged pending mutations
25
+ * for them to try to recover. This is redundant with information in the
26
+ * commit graph at `headHash`, but allows other clients to determine if there
27
+ * are unacknowledged pending mutations without having to load the commit
28
+ * graph.
29
+ */
30
+ mutationIDs: valita.readonlyRecord(valita.number()),
31
+ /**
32
+ * The highest lastMutationID received from the server for every client
33
+ * assigned to this client group.
34
+ *
35
+ * Should be updated by the clients assigned to this client group whenever
36
+ * they persist to this client group. Read by other clients to determine if
37
+ * there are unacknowledged pending mutations for them to recover and
38
+ * *updated* by other clients upon successfully recovering pending mutations
39
+ * to avoid redundant pushes of pending mutations.
40
+ *
41
+ * Note: This will be the same as the `lastMutationIDs` of the base snapshot
42
+ * of the client group's commit graph when written by clients assigned to this
43
+ * client group. However, when written by another client recovering mutations
44
+ * it may be different because the other client does not update the commit
45
+ * graph.
46
+ */
47
+ lastServerAckdMutationIDs: valita.record(valita.number()),
48
+ /**
49
+ * If the server deletes this client group it can signal that the client group
50
+ * was deleted. If that happens we mark this client group as disabled so that
51
+ * we do not use it again when creating new clients.
52
+ */
53
+ disabled: valita.boolean(),
54
+ });
55
+ export const CLIENT_GROUPS_HEAD_NAME = 'client-groups';
56
+ function assertClientGroup(value) {
57
+ valita.assert(value, clientGroupSchema);
58
+ }
59
+ function chunkDataToClientGroupMap(chunkData) {
60
+ assertObject(chunkData);
61
+ const clientGroups = new Map();
62
+ for (const [key, value] of Object.entries(chunkData)) {
63
+ if (value !== undefined) {
64
+ assertClientGroup(value);
65
+ clientGroups.set(key, value);
66
+ }
67
+ }
68
+ return clientGroups;
69
+ }
70
+ function clientGroupMapToChunkData(clientGroups, dagWrite) {
71
+ const chunkData = {};
72
+ for (const [clientGroupID, clientGroup] of clientGroups.entries()) {
73
+ dagWrite.assertValidHash(clientGroup.headHash);
74
+ chunkData[clientGroupID] = {
75
+ ...clientGroup,
76
+ mutatorNames: [...clientGroup.mutatorNames.values()],
77
+ };
78
+ }
79
+ return deepFreeze(chunkData);
80
+ }
81
+ async function getClientGroupsAtHash(hash, dagRead) {
82
+ const chunk = await dagRead.getChunk(hash);
83
+ return chunkDataToClientGroupMap(chunk?.data);
84
+ }
85
+ export async function getClientGroups(dagRead) {
86
+ const hash = await dagRead.getHead(CLIENT_GROUPS_HEAD_NAME);
87
+ if (!hash) {
88
+ return new Map();
89
+ }
90
+ return getClientGroupsAtHash(hash, dagRead);
91
+ }
92
+ export async function setClientGroups(clientGroups, dagWrite) {
93
+ const currClientGroups = await getClientGroups(dagWrite);
94
+ for (const [clientGroupID, clientGroup] of clientGroups) {
95
+ const currClientGroup = currClientGroups.get(clientGroupID);
96
+ validateClientGroupUpdate(clientGroup, currClientGroup);
97
+ }
98
+ return setValidatedClientGroups(clientGroups, dagWrite);
99
+ }
100
+ export async function setClientGroup(clientGroupID, clientGroup, dagWrite) {
101
+ const currClientGroups = await getClientGroups(dagWrite);
102
+ const currClientGroup = currClientGroups.get(clientGroupID);
103
+ validateClientGroupUpdate(clientGroup, currClientGroup);
104
+ const newClientGroups = new Map(currClientGroups);
105
+ newClientGroups.set(clientGroupID, clientGroup);
106
+ return setValidatedClientGroups(newClientGroups, dagWrite);
107
+ }
108
+ export async function deleteClientGroup(clientGroupID, dagWrite) {
109
+ const currClientGroups = await getClientGroups(dagWrite);
110
+ if (!currClientGroups.has(clientGroupID)) {
111
+ return currClientGroups;
112
+ }
113
+ const newClientGroups = new Map(currClientGroups.entries());
114
+ newClientGroups.delete(clientGroupID);
115
+ return setValidatedClientGroups(newClientGroups, dagWrite);
116
+ }
117
+ function validateClientGroupUpdate(clientGroup, currClientGroup) {
118
+ const mutatorNamesSet = new Set(clientGroup.mutatorNames);
119
+ assert(mutatorNamesSet.size === clientGroup.mutatorNames.length, "A client group's mutatorNames must be a set.");
120
+ if (currClientGroup !== undefined) {
121
+ assert(indexDefinitionsEqual(currClientGroup.indexes, clientGroup.indexes), "A client group's index definitions must never change.");
122
+ assert(mutatorNamesEqual(mutatorNamesSet, currClientGroup.mutatorNames), "A client group's mutatorNames must never change.");
123
+ }
124
+ }
125
+ async function setValidatedClientGroups(clientGroups, dagWrite) {
126
+ const chunkData = clientGroupMapToChunkData(clientGroups, dagWrite);
127
+ const refs = new Set();
128
+ for (const clientGroup of clientGroups.values()) {
129
+ refs.add(clientGroup.headHash);
130
+ }
131
+ const chunk = dagWrite.createChunk(chunkData, toRefs(refs));
132
+ await dagWrite.putChunk(chunk);
133
+ await dagWrite.setHead(CLIENT_GROUPS_HEAD_NAME, chunk.hash);
134
+ return clientGroups;
135
+ }
136
+ export function mutatorNamesEqual(mutatorNamesSet, mutatorNames) {
137
+ if (mutatorNames.length !== mutatorNamesSet.size) {
138
+ return false;
139
+ }
140
+ for (const mutatorName of mutatorNames) {
141
+ if (!mutatorNamesSet.has(mutatorName)) {
142
+ return false;
143
+ }
144
+ }
145
+ return true;
146
+ }
147
+ export async function getClientGroup(id, dagRead) {
148
+ const clientGroups = await getClientGroups(dagRead);
149
+ return clientGroups.get(id);
150
+ }
151
+ export function clientGroupHasPendingMutations(clientGroup) {
152
+ for (const [clientID, mutationID] of Object.entries(clientGroup.mutationIDs)) {
153
+ const lastServerAckdMutationID = clientGroup.lastServerAckdMutationIDs[clientID];
154
+ if ((lastServerAckdMutationID === undefined && mutationID !== 0) ||
155
+ lastServerAckdMutationID < mutationID) {
156
+ return true;
157
+ }
158
+ }
159
+ return false;
160
+ }
161
+ /**
162
+ * Marks a client group as disabled. This can happen if the server deletes the
163
+ * client group (servers should not delete clients or client groups but it often
164
+ * happens in practice when developing).
165
+ *
166
+ * A disabled client group prevents pulls and pushes from happening.
167
+ */
168
+ export async function disableClientGroup(clientGroupID, dagWrite) {
169
+ const clientGroup = await getClientGroup(clientGroupID, dagWrite);
170
+ if (!clientGroup) {
171
+ // No client group matching in the database, so nothing to do.
172
+ return;
173
+ }
174
+ const disabledClientGroup = {
175
+ ...clientGroup,
176
+ disabled: true,
177
+ };
178
+ await setClientGroup(clientGroupID, disabledClientGroup, dagWrite);
179
+ }
180
+ //# sourceMappingURL=client-groups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-groups.js","sourceRoot":"","sources":["../../../../../replicache/src/persist/client-groups.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,390 @@
1
+ import { assert, assertObject } from '../../../shared/src/asserts.js';
2
+ import { hasOwn } from '../../../shared/src/has-own.js';
3
+ import * as valita from '../../../shared/src/valita.js';
4
+ import { emptyDataNode } from '../btree/node.js';
5
+ import { BTreeRead } from '../btree/read.js';
6
+ import { compareCookies } from '../cookies.js';
7
+ import { toRefs } from '../dag/chunk.js';
8
+ import { Commit, assertSnapshotCommitDD31, baseSnapshotFromHash, chunkIndexDefinitionEqualIgnoreName, getRefs, newSnapshotCommitDataDD31, toChunkIndexDefinition, } from '../db/commit.js';
9
+ import { createIndexBTree } from '../db/write.js';
10
+ import { deepFreeze } from '../frozen-json.js';
11
+ import { hashSchema } from '../hash.js';
12
+ import { indexDefinitionsEqual } from '../index-defs.js';
13
+ import { clientGroupIDSchema, } from '../sync/ids.js';
14
+ import { withWriteNoImplicitCommit } from '../with-transactions.js';
15
+ import { getClientGroup, getClientGroups, mutatorNamesEqual, setClientGroup, } from './client-groups.js';
16
+ import { makeClientID } from './make-client-id.js';
17
+ const clientV4Schema = valita.readonlyObject({
18
+ /**
19
+ * A UNIX timestamp in milliseconds updated by the client once a minute
20
+ * while it is active and every time the client persists its state to
21
+ * the perdag.
22
+ * Should only be updated by the client represented by this structure.
23
+ */
24
+ heartbeatTimestampMs: valita.number(),
25
+ /**
26
+ * The hash of the commit in the perdag this client last persisted.
27
+ * Should only be updated by the client represented by this structure.
28
+ */
29
+ headHash: hashSchema,
30
+ /**
31
+ * The mutationID of the commit at headHash (mutationID if it is a
32
+ * local commit, lastMutationID if it is an index change or snapshot commit).
33
+ * Should only be updated by the client represented by this structure.
34
+ * Read by other clients to determine if there are unacknowledged pending
35
+ * mutations for them to push on behalf of the client represented by this
36
+ * structure.
37
+ * This is redundant with information in the commit graph at headHash,
38
+ * but allows other clients to determine if there are unacknowledged pending
39
+ * mutations without having to load the commit graph at headHash.
40
+ */
41
+ mutationID: valita.number(),
42
+ /**
43
+ * The highest lastMutationID received from the server for this client.
44
+ *
45
+ * Should be updated by the client represented by this structure whenever
46
+ * it persists its state to the perdag.
47
+ * Read by other clients to determine if there are unacknowledged pending
48
+ * mutations for them to push on behalf of the client represented by this
49
+ * structure, and *updated* by other clients upon successfully pushing
50
+ * pending mutations to avoid redundant pushes of those mutations.
51
+ *
52
+ * Note: This will be the same as the lastMutationID of the base snapshot of
53
+ * the commit graph at headHash when written by the client represented by this
54
+ * structure. However, when written by another client pushing pending
55
+ * mutations on this client's behalf it will be different. This is because
56
+ * the other client does not update the commit graph (it is unsafe to update
57
+ * another client's commit graph).
58
+ */
59
+ lastServerAckdMutationID: valita.number(),
60
+ });
61
+ const clientV5Schema = valita.readonlyObject({
62
+ heartbeatTimestampMs: valita.number(),
63
+ headHash: hashSchema,
64
+ /**
65
+ * The hash of a commit we are in the middle of refreshing into this client's
66
+ * memdag.
67
+ */
68
+ tempRefreshHash: hashSchema.nullable(),
69
+ /**
70
+ * ID of this client's perdag client group. This needs to be sent in pull
71
+ * request (to enable syncing all last mutation ids in the client group).
72
+ */
73
+ clientGroupID: clientGroupIDSchema,
74
+ });
75
+ const clientV6Schema = valita.readonlyObject({
76
+ heartbeatTimestampMs: valita.number(),
77
+ /**
78
+ * A set of hashes, which contains:
79
+ * 1. The hash of the last commit this client refreshed from its client group
80
+ * (this is the commit it bootstrapped from until it completes its first
81
+ * refresh).
82
+ * 2. One or more hashes that were added to retain chunks of a commit while it
83
+ * was being refreshed into this client's memdag. (This can be one or more
84
+ * because refresh's cleanup step is a separate transaction and can fail).
85
+ * Upon refresh completing and successfully running its clean up step, this
86
+ * set will contain a single hash: the hash of the last commit this client
87
+ * refreshed.
88
+ */
89
+ refreshHashes: valita.readonlyArray(hashSchema),
90
+ /**
91
+ * The hash of the last snapshot commit persisted by this client to this
92
+ * client's client group, or null if has never persisted a snapshot.
93
+ */
94
+ persistHash: hashSchema.nullable(),
95
+ /**
96
+ * ID of this client's perdag client group. This needs to be sent in pull
97
+ * request (to enable syncing all last mutation ids in the client group).
98
+ */
99
+ clientGroupID: clientGroupIDSchema,
100
+ });
101
+ function isClientV6(client) {
102
+ return client.refreshHashes !== undefined;
103
+ }
104
+ function isClientV5(client) {
105
+ return client.clientGroupID !== undefined;
106
+ }
107
+ export function isClientV4(client) {
108
+ return client.lastServerAckdMutationID !== undefined;
109
+ }
110
+ export const CLIENTS_HEAD_NAME = 'clients';
111
+ const clientSchema = valita.union(clientV4Schema, clientV5Schema, clientV6Schema);
112
+ function assertClient(value) {
113
+ valita.assert(value, clientSchema);
114
+ }
115
+ export function assertClientV4(value) {
116
+ valita.assert(value, clientV4Schema);
117
+ }
118
+ export function assertClientV5(value) {
119
+ valita.assert(value, clientV5Schema);
120
+ }
121
+ export function assertClientV6(value) {
122
+ valita.assert(value, clientV6Schema);
123
+ }
124
+ function chunkDataToClientMap(chunkData) {
125
+ assertObject(chunkData);
126
+ const clients = new Map();
127
+ for (const key in chunkData) {
128
+ if (hasOwn(chunkData, key)) {
129
+ const value = chunkData[key];
130
+ if (value !== undefined) {
131
+ assertClient(value);
132
+ clients.set(key, value);
133
+ }
134
+ }
135
+ }
136
+ return clients;
137
+ }
138
+ function clientMapToChunkData(clients, dagWrite) {
139
+ for (const client of clients.values()) {
140
+ if (isClientV6(client)) {
141
+ client.refreshHashes.forEach(dagWrite.assertValidHash);
142
+ if (client.persistHash) {
143
+ dagWrite.assertValidHash(client.persistHash);
144
+ }
145
+ }
146
+ else {
147
+ dagWrite.assertValidHash(client.headHash);
148
+ if (isClientV5(client) && client.tempRefreshHash) {
149
+ dagWrite.assertValidHash(client.tempRefreshHash);
150
+ }
151
+ }
152
+ }
153
+ return deepFreeze(Object.fromEntries(clients));
154
+ }
155
+ export async function getClients(dagRead) {
156
+ const hash = await dagRead.getHead(CLIENTS_HEAD_NAME);
157
+ return getClientsAtHash(hash, dagRead);
158
+ }
159
+ async function getClientsAtHash(hash, dagRead) {
160
+ if (!hash) {
161
+ return new Map();
162
+ }
163
+ const chunk = await dagRead.getChunk(hash);
164
+ return chunkDataToClientMap(chunk?.data);
165
+ }
166
+ /**
167
+ * Used to signal that a client does not exist. Maybe it was garbage collected?
168
+ */
169
+ export class ClientStateNotFoundError extends Error {
170
+ name = 'ClientStateNotFoundError';
171
+ id;
172
+ constructor(id) {
173
+ super(`Client state not found, id: ${id}`);
174
+ this.id = id;
175
+ }
176
+ }
177
+ /**
178
+ * Throws a `ClientStateNotFoundError` if the client does not exist.
179
+ */
180
+ export async function assertHasClientState(id, dagRead) {
181
+ if (!(await hasClientState(id, dagRead))) {
182
+ throw new ClientStateNotFoundError(id);
183
+ }
184
+ }
185
+ export async function hasClientState(id, dagRead) {
186
+ return !!(await getClient(id, dagRead));
187
+ }
188
+ export async function getClient(id, dagRead) {
189
+ const clients = await getClients(dagRead);
190
+ return clients.get(id);
191
+ }
192
+ export async function mustGetClient(id, dagRead) {
193
+ const client = await getClient(id, dagRead);
194
+ if (!client) {
195
+ throw new ClientStateNotFoundError(id);
196
+ }
197
+ return client;
198
+ }
199
+ export function initClientV6(newClientID, lc, perdag, mutatorNames, indexes, formatVersion, enableClientGroupForking) {
200
+ return withWriteNoImplicitCommit(perdag, async (dagWrite) => {
201
+ async function setClientsAndClientGroupAndCommit(basisHash, cookieJSON, valueHash, indexRecords) {
202
+ const newSnapshotData = newSnapshotCommitDataDD31(basisHash, {}, cookieJSON, valueHash, indexRecords);
203
+ const chunk = dagWrite.createChunk(newSnapshotData, getRefs(newSnapshotData));
204
+ const newClientGroupID = makeClientID();
205
+ const newClient = {
206
+ heartbeatTimestampMs: Date.now(),
207
+ refreshHashes: [chunk.hash],
208
+ persistHash: null,
209
+ clientGroupID: newClientGroupID,
210
+ };
211
+ const newClients = new Map(clients).set(newClientID, newClient);
212
+ const clientGroup = {
213
+ headHash: chunk.hash,
214
+ mutatorNames,
215
+ indexes,
216
+ mutationIDs: {},
217
+ lastServerAckdMutationIDs: {},
218
+ disabled: false,
219
+ };
220
+ await Promise.all([
221
+ dagWrite.putChunk(chunk),
222
+ setClients(newClients, dagWrite),
223
+ setClientGroup(newClientGroupID, clientGroup, dagWrite),
224
+ ]);
225
+ await dagWrite.commit();
226
+ return [newClient, chunk.hash, newClients, true];
227
+ }
228
+ const clients = await getClients(dagWrite);
229
+ const res = await findMatchingClient(dagWrite, mutatorNames, indexes);
230
+ if (res.type === FIND_MATCHING_CLIENT_TYPE_HEAD) {
231
+ // We found a client group with matching mutators and indexes. We can
232
+ // reuse it.
233
+ const { clientGroupID, headHash } = res;
234
+ const newClient = {
235
+ clientGroupID,
236
+ refreshHashes: [headHash],
237
+ heartbeatTimestampMs: Date.now(),
238
+ persistHash: null,
239
+ };
240
+ const newClients = new Map(clients).set(newClientID, newClient);
241
+ await setClients(newClients, dagWrite);
242
+ await dagWrite.commit();
243
+ return [newClient, headHash, newClients, false];
244
+ }
245
+ if (!enableClientGroupForking ||
246
+ res.type === FIND_MATCHING_CLIENT_TYPE_NEW) {
247
+ // No client group to fork from. Create empty snapshot.
248
+ const emptyBTreeChunk = dagWrite.createChunk(emptyDataNode, []);
249
+ await dagWrite.putChunk(emptyBTreeChunk);
250
+ // Create indexes
251
+ const indexRecords = [];
252
+ // At this point the value of replicache is the empty tree so all index
253
+ // maps will also be the empty tree.
254
+ for (const [name, indexDefinition] of Object.entries(indexes)) {
255
+ const chunkIndexDefinition = toChunkIndexDefinition(name, indexDefinition);
256
+ indexRecords.push({
257
+ definition: chunkIndexDefinition,
258
+ valueHash: emptyBTreeChunk.hash,
259
+ });
260
+ }
261
+ return setClientsAndClientGroupAndCommit(null, null, emptyBTreeChunk.hash, indexRecords);
262
+ }
263
+ // Now we create a new client and client group that we fork from the found
264
+ // snapshot.
265
+ assert(res.type === FIND_MATCHING_CLIENT_TYPE_FORK);
266
+ const { snapshot } = res;
267
+ // Create indexes
268
+ const indexRecords = [];
269
+ const { valueHash, indexes: oldIndexes } = snapshot;
270
+ const map = new BTreeRead(dagWrite, formatVersion, valueHash);
271
+ for (const [name, indexDefinition] of Object.entries(indexes)) {
272
+ const { prefix = '', jsonPointer, allowEmpty = false } = indexDefinition;
273
+ const chunkIndexDefinition = {
274
+ name,
275
+ keyPrefix: prefix,
276
+ jsonPointer,
277
+ allowEmpty,
278
+ };
279
+ const oldIndex = findMatchingOldIndex(oldIndexes, chunkIndexDefinition);
280
+ if (oldIndex) {
281
+ indexRecords.push({
282
+ definition: chunkIndexDefinition,
283
+ valueHash: oldIndex.valueHash,
284
+ });
285
+ }
286
+ else {
287
+ const indexBTree = await createIndexBTree(lc, dagWrite, map, prefix, jsonPointer, allowEmpty, formatVersion);
288
+ indexRecords.push({
289
+ definition: chunkIndexDefinition,
290
+ valueHash: await indexBTree.flush(),
291
+ });
292
+ }
293
+ }
294
+ return setClientsAndClientGroupAndCommit(snapshot.meta.basisHash, snapshot.meta.cookieJSON, snapshot.valueHash, indexRecords);
295
+ });
296
+ }
297
+ function findMatchingOldIndex(oldIndexes, chunkIndexDefinition) {
298
+ return oldIndexes.find(index => chunkIndexDefinitionEqualIgnoreName(index.definition, chunkIndexDefinition));
299
+ }
300
+ export const FIND_MATCHING_CLIENT_TYPE_NEW = 0;
301
+ export const FIND_MATCHING_CLIENT_TYPE_FORK = 1;
302
+ export const FIND_MATCHING_CLIENT_TYPE_HEAD = 2;
303
+ export async function findMatchingClient(dagRead, mutatorNames, indexes) {
304
+ let newestCookie;
305
+ let bestSnapshot;
306
+ const mutatorNamesSet = new Set(mutatorNames);
307
+ const clientGroups = await getClientGroups(dagRead);
308
+ for (const [clientGroupID, clientGroup] of clientGroups) {
309
+ if (!clientGroup.disabled &&
310
+ mutatorNamesEqual(mutatorNamesSet, clientGroup.mutatorNames) &&
311
+ indexDefinitionsEqual(indexes, clientGroup.indexes)) {
312
+ // exact match
313
+ return {
314
+ type: FIND_MATCHING_CLIENT_TYPE_HEAD,
315
+ clientGroupID,
316
+ headHash: clientGroup.headHash,
317
+ };
318
+ }
319
+ const clientGroupSnapshotCommit = await baseSnapshotFromHash(clientGroup.headHash, dagRead);
320
+ assertSnapshotCommitDD31(clientGroupSnapshotCommit);
321
+ const { cookieJSON } = clientGroupSnapshotCommit.meta;
322
+ if (newestCookie === undefined ||
323
+ compareCookies(cookieJSON, newestCookie) > 0) {
324
+ newestCookie = cookieJSON;
325
+ bestSnapshot = clientGroupSnapshotCommit;
326
+ }
327
+ }
328
+ if (bestSnapshot) {
329
+ return {
330
+ type: FIND_MATCHING_CLIENT_TYPE_FORK,
331
+ snapshot: bestSnapshot,
332
+ };
333
+ }
334
+ return { type: FIND_MATCHING_CLIENT_TYPE_NEW };
335
+ }
336
+ function getRefsForClients(clients) {
337
+ const refs = new Set();
338
+ for (const client of clients.values()) {
339
+ if (isClientV6(client)) {
340
+ for (const hash of client.refreshHashes) {
341
+ refs.add(hash);
342
+ }
343
+ if (client.persistHash) {
344
+ refs.add(client.persistHash);
345
+ }
346
+ }
347
+ else {
348
+ refs.add(client.headHash);
349
+ if (isClientV5(client) && client.tempRefreshHash) {
350
+ refs.add(client.tempRefreshHash);
351
+ }
352
+ }
353
+ }
354
+ return toRefs(refs);
355
+ }
356
+ export async function getClientGroupForClient(clientID, read) {
357
+ const clientGroupID = await getClientGroupIDForClient(clientID, read);
358
+ if (!clientGroupID) {
359
+ return undefined;
360
+ }
361
+ return getClientGroup(clientGroupID, read);
362
+ }
363
+ export async function getClientGroupIDForClient(clientID, read) {
364
+ const client = await getClient(clientID, read);
365
+ if (!client || !isClientV5(client)) {
366
+ return undefined;
367
+ }
368
+ return client.clientGroupID;
369
+ }
370
+ /**
371
+ * Adds a Client to the ClientMap and updates the 'clients' head to point at
372
+ * the updated clients.
373
+ */
374
+ export async function setClient(clientID, client, dagWrite) {
375
+ const clients = await getClients(dagWrite);
376
+ const newClients = new Map(clients).set(clientID, client);
377
+ return setClients(newClients, dagWrite);
378
+ }
379
+ /**
380
+ * Sets the ClientMap and updates the 'clients' head top point at the new
381
+ * clients.
382
+ */
383
+ export async function setClients(clients, dagWrite) {
384
+ const chunkData = clientMapToChunkData(clients, dagWrite);
385
+ const chunk = dagWrite.createChunk(chunkData, getRefsForClients(clients));
386
+ await dagWrite.putChunk(chunk);
387
+ await dagWrite.setHead(CLIENTS_HEAD_NAME, chunk.hash);
388
+ return chunk.hash;
389
+ }
390
+ //# sourceMappingURL=clients.js.map