@rocicorp/zero 1.6.0-canary.10 → 1.6.0-canary.12

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 (1655) hide show
  1. package/out/_virtual/_rolldown/runtime.js +1 -12
  2. package/out/analyze-query/src/analyze-cli.js +288 -0
  3. package/out/analyze-query/src/analyze-cli.js.map +1 -0
  4. package/out/analyze-query/src/bin-analyze.js.map +1 -0
  5. package/out/analyze-query/src/bin-transform.js.map +1 -0
  6. package/out/ast-to-zql/src/ast-to-zql.js.map +1 -0
  7. package/out/ast-to-zql/src/bin.js.map +1 -0
  8. package/out/ast-to-zql/src/format.js.map +1 -0
  9. package/out/datadog/src/datadog-log-sink.js.map +1 -0
  10. package/out/otel/src/enabled.js.map +1 -0
  11. package/out/otel/src/log-options.js.map +1 -0
  12. package/out/otel/src/maybe-time.js.map +1 -0
  13. package/out/otel/src/span.js.map +1 -0
  14. package/out/otel/src/version.js.map +1 -0
  15. package/out/replicache/src/async-iterable-to-array.js.map +1 -0
  16. package/out/replicache/src/bg-interval.js.map +1 -0
  17. package/out/replicache/src/btree/diff.js.map +1 -0
  18. package/out/replicache/src/btree/node.js.map +1 -0
  19. package/out/replicache/src/btree/read.js.map +1 -0
  20. package/out/replicache/src/btree/splice.js.map +1 -0
  21. package/out/replicache/src/btree/write.js.map +1 -0
  22. package/out/replicache/src/call-default-fetch.js.map +1 -0
  23. package/out/replicache/src/connection-loop-delegates.js.map +1 -0
  24. package/out/replicache/src/connection-loop.js.map +1 -0
  25. package/out/replicache/src/cookies.js.map +1 -0
  26. package/out/replicache/src/dag/chunk.js.map +1 -0
  27. package/out/replicache/src/dag/gc.js.map +1 -0
  28. package/out/replicache/src/dag/key.js.map +1 -0
  29. package/out/replicache/src/dag/lazy-store.js.map +1 -0
  30. package/out/replicache/src/dag/store-impl.js.map +1 -0
  31. package/out/replicache/src/dag/store.js.map +1 -0
  32. package/out/replicache/src/dag/visitor.js.map +1 -0
  33. package/out/replicache/src/db/commit.js.map +1 -0
  34. package/out/replicache/src/db/index.js.map +1 -0
  35. package/out/replicache/src/db/read.js.map +1 -0
  36. package/out/replicache/src/db/rebase.js.map +1 -0
  37. package/out/replicache/src/db/write.js.map +1 -0
  38. package/out/replicache/src/deleted-clients.js.map +1 -0
  39. package/out/replicache/src/error-responses.js.map +1 -0
  40. package/out/replicache/src/frozen-json.js.map +1 -0
  41. package/out/replicache/src/get-default-puller.js.map +1 -0
  42. package/out/replicache/src/get-default-pusher.js.map +1 -0
  43. package/out/replicache/src/get-kv-store-provider.js.map +1 -0
  44. package/out/replicache/src/hash.js.map +1 -0
  45. package/out/replicache/src/http-request-info.js.map +1 -0
  46. package/out/replicache/src/index-defs.js.map +1 -0
  47. package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -0
  48. package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +1 -0
  49. package/out/replicache/src/kv/idb-store.js.map +1 -0
  50. package/out/replicache/src/kv/mem-store.js.map +1 -0
  51. package/out/replicache/src/kv/op-sqlite/store.js.map +1 -0
  52. package/out/replicache/src/kv/op-sqlite/types.js.map +1 -0
  53. package/out/replicache/src/kv/read-impl.js.map +1 -0
  54. package/out/replicache/src/kv/sqlite-store.js.map +1 -0
  55. package/out/replicache/src/kv/throw-if-closed.js.map +1 -0
  56. package/out/replicache/src/kv/write-impl-base.js.map +1 -0
  57. package/out/replicache/src/kv/write-impl.js.map +1 -0
  58. package/out/replicache/src/lazy.js.map +1 -0
  59. package/out/replicache/src/log-options.js.map +1 -0
  60. package/out/replicache/src/make-idb-name.js.map +1 -0
  61. package/out/replicache/src/new-client-channel.js.map +1 -0
  62. package/out/replicache/src/on-persist-channel.js.map +1 -0
  63. package/out/replicache/src/patch-operation.js.map +1 -0
  64. package/out/replicache/src/pending-mutations.js.map +1 -0
  65. package/out/replicache/src/persist/client-gc.js.map +1 -0
  66. package/out/replicache/src/persist/client-group-gc.js.map +1 -0
  67. package/out/replicache/src/persist/client-groups.js.map +1 -0
  68. package/out/replicache/src/persist/clients.js.map +1 -0
  69. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -0
  70. package/out/replicache/src/persist/gather-mem-only-visitor.js.map +1 -0
  71. package/out/replicache/src/persist/gather-not-cached-visitor.js.map +1 -0
  72. package/out/replicache/src/persist/heartbeat.js.map +1 -0
  73. package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -0
  74. package/out/replicache/src/persist/idb-databases-store.js.map +1 -0
  75. package/out/replicache/src/persist/make-client-id.js.map +1 -0
  76. package/out/replicache/src/persist/persist.js.map +1 -0
  77. package/out/replicache/src/persist/refresh.js.map +1 -0
  78. package/out/replicache/src/process-scheduler.js.map +1 -0
  79. package/out/replicache/src/pusher.js.map +1 -0
  80. package/out/replicache/src/replicache-impl.js.map +1 -0
  81. package/out/replicache/src/report-error.js.map +1 -0
  82. package/out/replicache/src/request-idle.js.map +1 -0
  83. package/out/replicache/src/scan-iterator.js.map +1 -0
  84. package/out/replicache/src/scan-options.js.map +1 -0
  85. package/out/replicache/src/set-interval-with-signal.js.map +1 -0
  86. package/out/replicache/src/subscriptions.js.map +1 -0
  87. package/out/replicache/src/sync/diff.js.map +1 -0
  88. package/out/replicache/src/sync/ids.js.map +1 -0
  89. package/out/replicache/src/sync/patch.js.map +1 -0
  90. package/out/replicache/src/sync/pull-error.js.map +1 -0
  91. package/out/replicache/src/sync/pull.js.map +1 -0
  92. package/out/replicache/src/sync/push.js.map +1 -0
  93. package/out/replicache/src/sync/request-id.js.map +1 -0
  94. package/out/replicache/src/sync/sync-head-name.js.map +1 -0
  95. package/out/replicache/src/to-error.js.map +1 -0
  96. package/out/replicache/src/transaction-closed-error.js.map +1 -0
  97. package/out/replicache/src/transactions.js.map +1 -0
  98. package/out/replicache/src/version.js.map +1 -0
  99. package/out/replicache/src/with-transactions.js.map +1 -0
  100. package/out/shared/src/abort-error.js.map +1 -0
  101. package/out/shared/src/arrays.js.map +1 -0
  102. package/out/shared/src/asserts.js.map +1 -0
  103. package/out/shared/src/bigint-json.js.map +1 -0
  104. package/out/shared/src/binary-search.js.map +1 -0
  105. package/out/shared/src/broadcast-channel.js.map +1 -0
  106. package/out/shared/src/browser-env.js.map +1 -0
  107. package/out/shared/src/btree-set.js.map +1 -0
  108. package/out/shared/src/cache.js.map +1 -0
  109. package/out/shared/src/centroid.js.map +1 -0
  110. package/out/shared/src/config.js.map +1 -0
  111. package/out/shared/src/custom-key-map.js.map +1 -0
  112. package/out/shared/src/custom-key-set.js.map +1 -0
  113. package/out/shared/src/deep-clone.js.map +1 -0
  114. package/out/shared/src/deep-merge.js.map +1 -0
  115. package/out/shared/src/document-visible.js.map +1 -0
  116. package/out/shared/src/dotenv.js.map +1 -0
  117. package/out/shared/src/error.js.map +1 -0
  118. package/out/shared/src/has-own.js.map +1 -0
  119. package/out/shared/src/hash.js.map +1 -0
  120. package/out/shared/src/iterables.d.ts +2 -0
  121. package/out/shared/src/iterables.d.ts.map +1 -1
  122. package/out/shared/src/iterables.js +61 -0
  123. package/out/shared/src/iterables.js.map +1 -0
  124. package/out/shared/src/json-schema.js.map +1 -0
  125. package/out/shared/src/json.js.map +1 -0
  126. package/out/shared/src/logging-test-utils.js.map +1 -0
  127. package/out/shared/src/logging.js.map +1 -0
  128. package/out/shared/src/map.js.map +1 -0
  129. package/out/shared/src/must.js.map +1 -0
  130. package/out/shared/src/navigator.js.map +1 -0
  131. package/out/shared/src/object-traversal.js.map +1 -0
  132. package/out/shared/src/objects.js.map +1 -0
  133. package/out/shared/src/options.js.map +1 -0
  134. package/out/shared/src/parse-big-int.js.map +1 -0
  135. package/out/shared/src/promise-race.js.map +1 -0
  136. package/out/shared/src/queue.js.map +1 -0
  137. package/out/shared/src/rand.js.map +1 -0
  138. package/out/shared/src/random-uint64.js.map +1 -0
  139. package/out/shared/src/random-values.js.map +1 -0
  140. package/out/shared/src/record-proxy.js.map +1 -0
  141. package/out/shared/src/resolved-promises.js.map +1 -0
  142. package/out/shared/src/ring-buffer.js.map +1 -0
  143. package/out/shared/src/sentinels.js.map +1 -0
  144. package/out/shared/src/set-utils.js.map +1 -0
  145. package/out/shared/src/size-of-value.js.map +1 -0
  146. package/out/shared/src/sleep.js.map +1 -0
  147. package/out/shared/src/sorted-entries.js.map +1 -0
  148. package/out/shared/src/string-compare.js.map +1 -0
  149. package/out/shared/src/subscribable.js.map +1 -0
  150. package/out/shared/src/tdigest-schema.js.map +1 -0
  151. package/out/shared/src/tdigest.js.map +1 -0
  152. package/out/shared/src/valita.js +172 -0
  153. package/out/shared/src/valita.js.map +1 -0
  154. package/out/z2s/src/compiler.js.map +1 -0
  155. package/out/z2s/src/sql.js.map +1 -0
  156. package/out/zero/package.js +213 -0
  157. package/out/zero/package.js.map +1 -0
  158. package/out/zero/src/adapters/drizzle.js +1 -1
  159. package/out/zero/src/adapters/kysely.js +1 -1
  160. package/out/zero/src/adapters/pg.js +1 -1
  161. package/out/zero/src/adapters/postgresjs.js +1 -1
  162. package/out/zero/src/adapters/prisma.js +1 -1
  163. package/out/zero/src/analyze-query.js +1 -1
  164. package/out/zero/src/analyze.js +1 -1
  165. package/out/zero/src/ast-to-zql.js +1 -1
  166. package/out/zero/src/bindings.js +11 -11
  167. package/out/zero/src/change-protocol/v0.js +2 -2
  168. package/out/zero/src/cli.js +1 -1
  169. package/out/zero/src/deploy-permissions.js +1 -1
  170. package/out/zero/src/expo-sqlite.js +2 -2
  171. package/out/zero/src/op-sqlite.js +2 -2
  172. package/out/zero/src/pg.js +9 -9
  173. package/out/zero/src/react-native.js +2 -2
  174. package/out/zero/src/react.js +5 -5
  175. package/out/zero/src/server.js +8 -8
  176. package/out/zero/src/solid.js +5 -5
  177. package/out/zero/src/sqlite.js +2 -2
  178. package/out/zero/src/transform-query.js +1 -1
  179. package/out/zero/src/zero-cache-dev.js +6 -6
  180. package/out/zero/src/zero-out.js +5 -5
  181. package/out/zero/src/zero.js +22 -22
  182. package/out/zero/src/zqlite.js +5 -5
  183. package/out/zero-cache/src/auth/auth.js.map +1 -0
  184. package/out/zero-cache/src/auth/jwt.js.map +1 -0
  185. package/out/zero-cache/src/auth/load-permissions.js.map +1 -0
  186. package/out/zero-cache/src/auth/read-authorizer.js.map +1 -0
  187. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -0
  188. package/out/zero-cache/src/config/network.js.map +1 -0
  189. package/out/zero-cache/src/config/normalize.js.map +1 -0
  190. package/out/zero-cache/src/config/server-context.js.map +1 -0
  191. package/out/zero-cache/src/config/zero-config.js.map +1 -0
  192. package/out/zero-cache/src/custom/fetch.js.map +1 -0
  193. package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -0
  194. package/out/zero-cache/src/db/create.js.map +1 -0
  195. package/out/zero-cache/src/db/delete-lite-db.js.map +1 -0
  196. package/out/zero-cache/src/db/lite-tables.js.map +1 -0
  197. package/out/zero-cache/src/db/migration-lite.js.map +1 -0
  198. package/out/zero-cache/src/db/migration.js.map +1 -0
  199. package/out/zero-cache/src/db/mode-enum.js.map +1 -0
  200. package/out/zero-cache/src/db/pg-copy-binary.js.map +1 -0
  201. package/out/zero-cache/src/db/pg-copy.js.map +1 -0
  202. package/out/zero-cache/src/db/pg-to-lite.js.map +1 -0
  203. package/out/zero-cache/src/db/pg-type-parser.js.map +1 -0
  204. package/out/zero-cache/src/db/run-transaction.js.map +1 -0
  205. package/out/zero-cache/src/db/specs.js.map +1 -0
  206. package/out/zero-cache/src/db/statements.js.map +1 -0
  207. package/out/zero-cache/src/db/transaction-pool.js.map +1 -0
  208. package/out/zero-cache/src/db/warmup.js.map +1 -0
  209. package/out/zero-cache/src/observability/events.js.map +1 -0
  210. package/out/zero-cache/src/observability/metrics.js.map +1 -0
  211. package/out/zero-cache/src/scripts/decommission.js.map +1 -0
  212. package/out/zero-cache/src/scripts/deploy-permissions.js.map +1 -0
  213. package/out/zero-cache/src/scripts/permissions.d.ts.map +1 -1
  214. package/out/zero-cache/src/scripts/permissions.js +92 -0
  215. package/out/zero-cache/src/scripts/permissions.js.map +1 -0
  216. package/out/zero-cache/src/server/anonymous-otel-start.js +306 -0
  217. package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -0
  218. package/out/zero-cache/src/server/change-streamer.js +26 -26
  219. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -0
  220. package/out/zero-cache/src/server/logging.js.map +1 -0
  221. package/out/zero-cache/src/server/main.js +11 -11
  222. package/out/zero-cache/src/server/mutator.js +8 -8
  223. package/out/zero-cache/src/server/otel-diag-logger.js.map +1 -0
  224. package/out/zero-cache/src/server/otel-log-sink.js.map +1 -0
  225. package/out/zero-cache/src/server/otel-start.js +53 -0
  226. package/out/zero-cache/src/server/otel-start.js.map +1 -0
  227. package/out/zero-cache/src/server/priority-op.js.map +1 -0
  228. package/out/zero-cache/src/server/reaper.js +13 -13
  229. package/out/zero-cache/src/server/replicator.js +16 -16
  230. package/out/zero-cache/src/server/runner/main.js.map +1 -0
  231. package/out/zero-cache/src/server/runner/run-worker.js.map +1 -0
  232. package/out/zero-cache/src/server/runner/runtime.js.map +1 -0
  233. package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -0
  234. package/out/zero-cache/src/server/shadow-syncer.js +10 -10
  235. package/out/zero-cache/src/server/syncer.js +29 -29
  236. package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -0
  237. package/out/zero-cache/src/server/worker-urls.js.map +1 -0
  238. package/out/zero-cache/src/server/write-worker.js +1 -1
  239. package/out/zero-cache/src/services/analyze.js +72 -0
  240. package/out/zero-cache/src/services/analyze.js.map +1 -0
  241. package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -0
  242. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -0
  243. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -0
  244. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -0
  245. package/out/zero-cache/src/services/change-source/pg/backfill-metadata.js.map +1 -0
  246. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -0
  247. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -0
  248. package/out/zero-cache/src/services/change-source/pg/decommission.js.map +1 -0
  249. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -0
  250. package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js.map +1 -0
  251. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js.map +1 -0
  252. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -0
  253. package/out/zero-cache/src/services/change-source/pg/lsn.js.map +1 -0
  254. package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -0
  255. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -0
  256. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -0
  257. package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -0
  258. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -0
  259. package/out/zero-cache/src/services/change-source/pg/schema/validation.js.map +1 -0
  260. package/out/zero-cache/src/services/change-source/protocol/current/control.js.map +1 -0
  261. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -0
  262. package/out/zero-cache/src/services/change-source/protocol/current/downstream.js.map +1 -0
  263. package/out/zero-cache/src/services/change-source/protocol/current/json.js.map +1 -0
  264. package/out/zero-cache/src/services/change-source/protocol/current/path.js.map +1 -0
  265. package/out/zero-cache/src/services/change-source/protocol/current/status.js.map +1 -0
  266. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -0
  267. package/out/zero-cache/src/services/change-source/protocol/current.js +56 -0
  268. package/out/zero-cache/src/services/change-source/protocol/current.js.map +1 -0
  269. package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -0
  270. package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -0
  271. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -0
  272. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -0
  273. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -0
  274. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -0
  275. package/out/zero-cache/src/services/change-streamer/replica-monitor.js.map +1 -0
  276. package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -0
  277. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -0
  278. package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -0
  279. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -0
  280. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -0
  281. package/out/zero-cache/src/services/heapz.js.map +1 -0
  282. package/out/zero-cache/src/services/http-service.js.map +1 -0
  283. package/out/zero-cache/src/services/life-cycle.js.map +1 -0
  284. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js.map +1 -0
  285. package/out/zero-cache/src/services/litestream/commands.js.map +1 -0
  286. package/out/zero-cache/src/services/mutagen/error.js.map +1 -0
  287. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -0
  288. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -0
  289. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -0
  290. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -0
  291. package/out/zero-cache/src/services/replicator/notifier.js.map +1 -0
  292. package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -0
  293. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -0
  294. package/out/zero-cache/src/services/replicator/reporter/recorder.js.map +1 -0
  295. package/out/zero-cache/src/services/replicator/reporter/report-schema.js.map +1 -0
  296. package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -0
  297. package/out/zero-cache/src/services/replicator/schema/column-metadata.js.map +1 -0
  298. package/out/zero-cache/src/services/replicator/schema/constants.js.map +1 -0
  299. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -0
  300. package/out/zero-cache/src/services/replicator/schema/table-metadata.js.map +1 -0
  301. package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -0
  302. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -0
  303. package/out/zero-cache/src/services/run-ast.js.map +1 -0
  304. package/out/zero-cache/src/services/runner.js.map +1 -0
  305. package/out/zero-cache/src/services/running-state.js.map +1 -0
  306. package/out/zero-cache/src/services/shadow-sync/shadow-sync-service.js.map +1 -0
  307. package/out/zero-cache/src/services/statz.js.map +1 -0
  308. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js.map +1 -0
  309. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -0
  310. package/out/zero-cache/src/services/view-syncer/client-schema.js.map +1 -0
  311. package/out/zero-cache/src/services/view-syncer/connection-context-manager.js.map +1 -0
  312. package/out/zero-cache/src/services/view-syncer/cvr-purger.js.map +1 -0
  313. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  314. package/out/zero-cache/src/services/view-syncer/cvr-store.js +870 -0
  315. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -0
  316. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -0
  317. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -0
  318. package/out/zero-cache/src/services/view-syncer/inspect-handler.js +102 -0
  319. package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -0
  320. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -0
  321. package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -0
  322. package/out/zero-cache/src/services/view-syncer/row-set-signature.js.map +1 -0
  323. package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -0
  324. package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -0
  325. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -0
  326. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -0
  327. package/out/zero-cache/src/services/view-syncer/tracer.js.map +1 -0
  328. package/out/zero-cache/src/services/view-syncer/ttl-clock.js.map +1 -0
  329. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -0
  330. package/out/zero-cache/src/types/configuration-error.js.map +1 -0
  331. package/out/zero-cache/src/types/error-with-level.js.map +1 -0
  332. package/out/zero-cache/src/types/http.js.map +1 -0
  333. package/out/zero-cache/src/types/lexi-version.js.map +1 -0
  334. package/out/zero-cache/src/types/lite.js.map +1 -0
  335. package/out/zero-cache/src/types/names.js.map +1 -0
  336. package/out/zero-cache/src/types/pg-data-type.js.map +1 -0
  337. package/out/zero-cache/src/types/pg-types.js.map +1 -0
  338. package/out/zero-cache/src/types/pg-versions.js.map +1 -0
  339. package/out/zero-cache/src/types/pg.js.map +1 -0
  340. package/out/zero-cache/src/types/processes.js.map +1 -0
  341. package/out/zero-cache/src/types/profiler.js.map +1 -0
  342. package/out/zero-cache/src/types/row-key.js.map +1 -0
  343. package/out/zero-cache/src/types/shards.js.map +1 -0
  344. package/out/zero-cache/src/types/sql.js.map +1 -0
  345. package/out/zero-cache/src/types/state-version.js.map +1 -0
  346. package/out/zero-cache/src/types/streams.js.map +1 -0
  347. package/out/zero-cache/src/types/strings.js.map +1 -0
  348. package/out/zero-cache/src/types/subscription.js.map +1 -0
  349. package/out/zero-cache/src/types/timeout.js.map +1 -0
  350. package/out/zero-cache/src/types/url-params.js.map +1 -0
  351. package/out/zero-cache/src/types/websocket-handoff.js.map +1 -0
  352. package/out/zero-cache/src/types/ws.js.map +1 -0
  353. package/out/zero-cache/src/workers/connect-params.js.map +1 -0
  354. package/out/zero-cache/src/workers/connection.js.map +1 -0
  355. package/out/zero-cache/src/workers/mutator.js.map +1 -0
  356. package/out/zero-cache/src/workers/replicator.js.map +1 -0
  357. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -0
  358. package/out/zero-cache/src/workers/syncer.js.map +1 -0
  359. package/out/zero-client/src/client/active-clients-manager.js.map +1 -0
  360. package/out/zero-client/src/client/client-error-kind-enum.js.map +1 -0
  361. package/out/zero-client/src/client/connection-manager.js.map +1 -0
  362. package/out/zero-client/src/client/connection-status-enum.js +20 -0
  363. package/out/zero-client/src/client/connection-status-enum.js.map +1 -0
  364. package/out/zero-client/src/client/connection.js.map +1 -0
  365. package/out/zero-client/src/client/context.js.map +1 -0
  366. package/out/zero-client/src/client/crud-impl.js +61 -0
  367. package/out/zero-client/src/client/crud-impl.js.map +1 -0
  368. package/out/zero-client/src/client/crud.js.map +1 -0
  369. package/out/zero-client/src/client/custom.js.map +1 -0
  370. package/out/zero-client/src/client/delete-clients-manager.js.map +1 -0
  371. package/out/zero-client/src/client/enable-analytics.js.map +1 -0
  372. package/out/zero-client/src/client/error.js.map +1 -0
  373. package/out/zero-client/src/client/http-string.js.map +1 -0
  374. package/out/zero-client/src/client/inspector/client-group.js.map +1 -0
  375. package/out/zero-client/src/client/inspector/client.js.map +1 -0
  376. package/out/zero-client/src/client/inspector/html-dialog-prompt.js.map +1 -0
  377. package/out/zero-client/src/client/inspector/inspector.js.map +1 -0
  378. package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -0
  379. package/out/zero-client/src/client/inspector/query.js.map +1 -0
  380. package/out/zero-client/src/client/ivm-branch.js.map +1 -0
  381. package/out/zero-client/src/client/keys.js.map +1 -0
  382. package/out/zero-client/src/client/log-options.js.map +1 -0
  383. package/out/zero-client/src/client/make-mutate-property.js.map +1 -0
  384. package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -0
  385. package/out/zero-client/src/client/metric-name-enum.js.map +1 -0
  386. package/out/zero-client/src/client/metrics.js.map +1 -0
  387. package/out/zero-client/src/client/mutation-tracker.js.map +1 -0
  388. package/out/zero-client/src/client/mutator-proxy.js.map +1 -0
  389. package/out/zero-client/src/client/options.js.map +1 -0
  390. package/out/zero-client/src/client/query-manager.js.map +1 -0
  391. package/out/zero-client/src/client/reload-error-handler.js.map +1 -0
  392. package/out/zero-client/src/client/server-option.js.map +1 -0
  393. package/out/zero-client/src/client/update-needed-reason-type-enum.js +27 -0
  394. package/out/zero-client/src/client/update-needed-reason-type-enum.js.map +1 -0
  395. package/out/zero-client/src/client/version.js +9 -0
  396. package/out/zero-client/src/client/version.js.map +1 -0
  397. package/out/zero-client/src/client/zero-poke-handler.js.map +1 -0
  398. package/out/zero-client/src/client/zero-rep.js.map +1 -0
  399. package/out/zero-client/src/client/zero.js.map +1 -0
  400. package/out/zero-client/src/util/nanoid.js.map +1 -0
  401. package/out/zero-protocol/src/analyze-query-result.js.map +1 -0
  402. package/out/zero-protocol/src/application-error.js.map +1 -0
  403. package/out/zero-protocol/src/ast.js.map +1 -0
  404. package/out/zero-protocol/src/change-desired-queries.js.map +1 -0
  405. package/out/zero-protocol/src/client-schema.js.map +1 -0
  406. package/out/zero-protocol/src/close-connection.js.map +1 -0
  407. package/out/zero-protocol/src/connect.js.map +1 -0
  408. package/out/zero-protocol/src/custom-queries.js.map +1 -0
  409. package/out/zero-protocol/src/data.js.map +1 -0
  410. package/out/zero-protocol/src/delete-clients.js.map +1 -0
  411. package/out/zero-protocol/src/down.js.map +1 -0
  412. package/out/zero-protocol/src/error-kind-enum.js.map +1 -0
  413. package/out/zero-protocol/src/error-origin-enum.js.map +1 -0
  414. package/out/zero-protocol/src/error-reason-enum.js.map +1 -0
  415. package/out/zero-protocol/src/error.js.map +1 -0
  416. package/out/zero-protocol/src/inspect-down.js.map +1 -0
  417. package/out/zero-protocol/src/inspect-up.js.map +1 -0
  418. package/out/zero-protocol/src/mutate-server.js.map +1 -0
  419. package/out/zero-protocol/src/mutation-id.js.map +1 -0
  420. package/out/zero-protocol/src/mutation-type-enum.js.map +1 -0
  421. package/out/zero-protocol/src/mutation.js.map +1 -0
  422. package/out/zero-protocol/src/mutations-patch.js.map +1 -0
  423. package/out/zero-protocol/src/ping.js.map +1 -0
  424. package/out/zero-protocol/src/poke.js.map +1 -0
  425. package/out/zero-protocol/src/pong.js.map +1 -0
  426. package/out/zero-protocol/src/primary-key.js.map +1 -0
  427. package/out/zero-protocol/src/protocol-version.js.map +1 -0
  428. package/out/zero-protocol/src/pull.js.map +1 -0
  429. package/out/zero-protocol/src/push.js.map +1 -0
  430. package/out/zero-protocol/src/queries-patch.js.map +1 -0
  431. package/out/zero-protocol/src/query-hash.js.map +1 -0
  432. package/out/zero-protocol/src/query-server.js.map +1 -0
  433. package/out/zero-protocol/src/row-patch.js.map +1 -0
  434. package/out/zero-protocol/src/up.js.map +1 -0
  435. package/out/zero-protocol/src/update-auth.js.map +1 -0
  436. package/out/zero-protocol/src/version.js.map +1 -0
  437. package/out/zero-react/src/use-connection-state.js +17 -0
  438. package/out/zero-react/src/use-connection-state.js.map +1 -0
  439. package/out/zero-react/src/use-query.js +299 -0
  440. package/out/zero-react/src/use-query.js.map +1 -0
  441. package/out/zero-react/src/use-zero-online.js +20 -0
  442. package/out/zero-react/src/use-zero-online.js.map +1 -0
  443. package/out/zero-react/src/zero-provider.js +87 -0
  444. package/out/zero-react/src/zero-provider.js.map +1 -0
  445. package/out/zero-schema/src/builder/relationship-builder.js.map +1 -0
  446. package/out/zero-schema/src/builder/schema-builder.js.map +1 -0
  447. package/out/zero-schema/src/builder/table-builder.js.map +1 -0
  448. package/out/zero-schema/src/compiled-permissions.js.map +1 -0
  449. package/out/zero-schema/src/name-mapper.js.map +1 -0
  450. package/out/zero-schema/src/permissions.js.map +1 -0
  451. package/out/zero-schema/src/schema-config.js.map +1 -0
  452. package/out/zero-server/src/adapters/drizzle.js.map +1 -0
  453. package/out/zero-server/src/adapters/kysely.js.map +1 -0
  454. package/out/zero-server/src/adapters/pg.js +83 -0
  455. package/out/zero-server/src/adapters/pg.js.map +1 -0
  456. package/out/zero-server/src/adapters/postgresjs.js.map +1 -0
  457. package/out/zero-server/src/adapters/prisma.js.map +1 -0
  458. package/out/zero-server/src/custom.js.map +1 -0
  459. package/out/zero-server/src/logging.js.map +1 -0
  460. package/out/zero-server/src/pg-query-executor.js.map +1 -0
  461. package/out/zero-server/src/process-mutations.js.map +1 -0
  462. package/out/zero-server/src/push-processor.js.map +1 -0
  463. package/out/zero-server/src/queries/process-queries.js.map +1 -0
  464. package/out/zero-server/src/schema.js.map +1 -0
  465. package/out/zero-server/src/zql-database.js.map +1 -0
  466. package/out/zero-solid/src/solid-view.js +145 -0
  467. package/out/zero-solid/src/solid-view.js.map +1 -0
  468. package/out/zero-solid/src/use-connection-state.js +21 -0
  469. package/out/zero-solid/src/use-connection-state.js.map +1 -0
  470. package/out/zero-solid/src/use-query.js +64 -0
  471. package/out/zero-solid/src/use-query.js.map +1 -0
  472. package/out/zero-solid/src/use-zero-online.js +21 -0
  473. package/out/zero-solid/src/use-zero-online.js.map +1 -0
  474. package/out/zero-solid/src/use-zero.js +93 -0
  475. package/out/zero-solid/src/use-zero.js.map +1 -0
  476. package/out/zero-types/src/format.js.map +1 -0
  477. package/out/zero-types/src/name-mapper.js.map +1 -0
  478. package/out/zql/src/builder/builder.js.map +1 -0
  479. package/out/zql/src/builder/debug-delegate.js.map +1 -0
  480. package/out/zql/src/builder/filter.js.map +1 -0
  481. package/out/zql/src/builder/like.js.map +1 -0
  482. package/out/zql/src/error.js.map +1 -0
  483. package/out/zql/src/ivm/array-view.js.map +1 -0
  484. package/out/zql/src/ivm/cap.js.map +1 -0
  485. package/out/zql/src/ivm/change.js.map +1 -0
  486. package/out/zql/src/ivm/constraint.js.map +1 -0
  487. package/out/zql/src/ivm/data.js.map +1 -0
  488. package/out/zql/src/ivm/exists.js.map +1 -0
  489. package/out/zql/src/ivm/fan-in.js.map +1 -0
  490. package/out/zql/src/ivm/fan-out.js.map +1 -0
  491. package/out/zql/src/ivm/filter-operators.js.map +1 -0
  492. package/out/zql/src/ivm/filter-push.js.map +1 -0
  493. package/out/zql/src/ivm/filter.js.map +1 -0
  494. package/out/zql/src/ivm/flipped-join.js.map +1 -0
  495. package/out/zql/src/ivm/join-utils.js.map +1 -0
  496. package/out/zql/src/ivm/join.js.map +1 -0
  497. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -0
  498. package/out/zql/src/ivm/memory-source.js.map +1 -0
  499. package/out/zql/src/ivm/memory-storage.js.map +1 -0
  500. package/out/zql/src/ivm/operator.js.map +1 -0
  501. package/out/zql/src/ivm/push-accumulated.js.map +1 -0
  502. package/out/zql/src/ivm/skip-yields.js.map +1 -0
  503. package/out/zql/src/ivm/skip.js.map +1 -0
  504. package/out/zql/src/ivm/source.js.map +1 -0
  505. package/out/zql/src/ivm/stream.js.map +1 -0
  506. package/out/zql/src/ivm/take.js.map +1 -0
  507. package/out/zql/src/ivm/union-fan-in.js.map +1 -0
  508. package/out/zql/src/ivm/union-fan-out.js.map +1 -0
  509. package/out/zql/src/ivm/view-apply-change.js.map +1 -0
  510. package/out/zql/src/mutate/crud.js.map +1 -0
  511. package/out/zql/src/mutate/custom.js.map +1 -0
  512. package/out/zql/src/mutate/mutator-registry.js.map +1 -0
  513. package/out/zql/src/mutate/mutator.js.map +1 -0
  514. package/out/zql/src/planner/planner-builder.js.map +1 -0
  515. package/out/zql/src/planner/planner-connection.js.map +1 -0
  516. package/out/zql/src/planner/planner-constraint.js.map +1 -0
  517. package/out/zql/src/planner/planner-debug.js.map +1 -0
  518. package/out/zql/src/planner/planner-fan-in.js.map +1 -0
  519. package/out/zql/src/planner/planner-fan-out.js.map +1 -0
  520. package/out/zql/src/planner/planner-graph.js.map +1 -0
  521. package/out/zql/src/planner/planner-join.js.map +1 -0
  522. package/out/zql/src/planner/planner-node.js.map +1 -0
  523. package/out/zql/src/planner/planner-source.js.map +1 -0
  524. package/out/zql/src/planner/planner-terminus.js.map +1 -0
  525. package/out/zql/src/query/complete-ordering.js.map +1 -0
  526. package/out/zql/src/query/create-builder.js.map +1 -0
  527. package/out/zql/src/query/error.js.map +1 -0
  528. package/out/zql/src/query/escape-like.js.map +1 -0
  529. package/out/zql/src/query/expression.js.map +1 -0
  530. package/out/zql/src/query/measure-push-operator.js.map +1 -0
  531. package/out/zql/src/query/metrics-delegate.js.map +1 -0
  532. package/out/zql/src/query/named.js.map +1 -0
  533. package/out/zql/src/query/query-delegate-base.js.map +1 -0
  534. package/out/zql/src/query/query-impl.js.map +1 -0
  535. package/out/zql/src/query/query-internals.js.map +1 -0
  536. package/out/zql/src/query/query-registry.js.map +1 -0
  537. package/out/zql/src/query/runnable-query-impl.js.map +1 -0
  538. package/out/zql/src/query/static-query.js.map +1 -0
  539. package/out/zql/src/query/ttl.js.map +1 -0
  540. package/out/zql/src/query/validate-input.js.map +1 -0
  541. package/out/zqlite/src/database-storage.js.map +1 -0
  542. package/out/zqlite/src/db.js.map +1 -0
  543. package/out/zqlite/src/explain-queries.js.map +1 -0
  544. package/out/zqlite/src/internal/sql-inline.js.map +1 -0
  545. package/out/zqlite/src/internal/sql.js.map +1 -0
  546. package/out/zqlite/src/internal/statement-cache.js.map +1 -0
  547. package/out/zqlite/src/query-builder.js.map +1 -0
  548. package/out/zqlite/src/query-delegate.js.map +1 -0
  549. package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -0
  550. package/out/zqlite/src/sqlite-cost-model.js.map +1 -0
  551. package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -0
  552. package/out/zqlite/src/table-source.js.map +1 -0
  553. package/package.json +21 -5
  554. package/out/_virtual/__vite-optional-peer-dep_pg-native_pg.js +0 -13
  555. package/out/_virtual/__vite-optional-peer-dep_pg-native_pg.js.map +0 -1
  556. package/out/node_modules/.pnpm/@opentelemetry_semantic-conventions@1.41.1/node_modules/@opentelemetry/semantic-conventions/build/esm/stable_attributes.js +0 -12
  557. package/out/node_modules/.pnpm/@opentelemetry_semantic-conventions@1.41.1/node_modules/@opentelemetry/semantic-conventions/build/esm/stable_attributes.js.map +0 -1
  558. package/out/node_modules/.pnpm/pg-cloudflare@1.3.0/node_modules/pg-cloudflare/dist/empty.js +0 -11
  559. package/out/node_modules/.pnpm/pg-cloudflare@1.3.0/node_modules/pg-cloudflare/dist/empty.js.map +0 -1
  560. package/out/node_modules/.pnpm/pg-connection-string@2.12.0/node_modules/pg-connection-string/index.js +0 -130
  561. package/out/node_modules/.pnpm/pg-connection-string@2.12.0/node_modules/pg-connection-string/index.js.map +0 -1
  562. package/out/node_modules/.pnpm/pg-int8@1.0.1/node_modules/pg-int8/index.js +0 -62
  563. package/out/node_modules/.pnpm/pg-int8@1.0.1/node_modules/pg-int8/index.js.map +0 -1
  564. package/out/node_modules/.pnpm/pg-pool@3.13.0_pg@8.20.0/node_modules/pg-pool/index.js +0 -353
  565. package/out/node_modules/.pnpm/pg-pool@3.13.0_pg@8.20.0/node_modules/pg-pool/index.js.map +0 -1
  566. package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/buffer-reader.js +0 -60
  567. package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/buffer-reader.js.map +0 -1
  568. package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/buffer-writer.js +0 -81
  569. package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/buffer-writer.js.map +0 -1
  570. package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/index.js +0 -35
  571. package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/index.js.map +0 -1
  572. package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/messages.js +0 -167
  573. package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/messages.js.map +0 -1
  574. package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/parser.js +0 -288
  575. package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/parser.js.map +0 -1
  576. package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/serializer.js +0 -177
  577. package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/serializer.js.map +0 -1
  578. package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/index.js +0 -46
  579. package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/index.js.map +0 -1
  580. package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/arrayParser.js +0 -16
  581. package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/arrayParser.js.map +0 -1
  582. package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/binaryParsers.js +0 -165
  583. package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/binaryParsers.js.map +0 -1
  584. package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/builtins.js +0 -81
  585. package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/builtins.js.map +0 -1
  586. package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/textParsers.js +0 -167
  587. package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/textParsers.js.map +0 -1
  588. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/esm/index.js +0 -19
  589. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/esm/index.js.map +0 -1
  590. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/client.js +0 -508
  591. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/client.js.map +0 -1
  592. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/connection-parameters.js +0 -104
  593. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/connection-parameters.js.map +0 -1
  594. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/connection.js +0 -160
  595. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/connection.js.map +0 -1
  596. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/cert-signatures.js +0 -97
  597. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/cert-signatures.js.map +0 -1
  598. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/sasl.js +0 -131
  599. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/sasl.js.map +0 -1
  600. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils-legacy.js +0 -39
  601. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils-legacy.js.map +0 -1
  602. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils-webcrypto.js +0 -89
  603. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils-webcrypto.js.map +0 -1
  604. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils.js +0 -13
  605. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils.js.map +0 -1
  606. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/defaults.js +0 -46
  607. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/defaults.js.map +0 -1
  608. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/index.js +0 -71
  609. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/index.js.map +0 -1
  610. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/client.js +0 -226
  611. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/client.js.map +0 -1
  612. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/index.js +0 -11
  613. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/index.js.map +0 -1
  614. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/query.js +0 -117
  615. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/query.js.map +0 -1
  616. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/query.js +0 -151
  617. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/query.js.map +0 -1
  618. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/result.js +0 -76
  619. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/result.js.map +0 -1
  620. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/stream.js +0 -73
  621. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/stream.js.map +0 -1
  622. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/type-overrides.js +0 -35
  623. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/type-overrides.js.map +0 -1
  624. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/utils.js +0 -118
  625. package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/utils.js.map +0 -1
  626. package/out/node_modules/.pnpm/pgpass@1.0.5/node_modules/pgpass/lib/helper.js +0 -147
  627. package/out/node_modules/.pnpm/pgpass@1.0.5/node_modules/pgpass/lib/helper.js.map +0 -1
  628. package/out/node_modules/.pnpm/pgpass@1.0.5/node_modules/pgpass/lib/index.js +0 -21
  629. package/out/node_modules/.pnpm/pgpass@1.0.5/node_modules/pgpass/lib/index.js.map +0 -1
  630. package/out/node_modules/.pnpm/postgres-array@2.0.0/node_modules/postgres-array/index.js +0 -84
  631. package/out/node_modules/.pnpm/postgres-array@2.0.0/node_modules/postgres-array/index.js.map +0 -1
  632. package/out/node_modules/.pnpm/postgres-bytea@1.0.1/node_modules/postgres-bytea/index.js +0 -28
  633. package/out/node_modules/.pnpm/postgres-bytea@1.0.1/node_modules/postgres-bytea/index.js.map +0 -1
  634. package/out/node_modules/.pnpm/postgres-date@1.0.7/node_modules/postgres-date/index.js +0 -65
  635. package/out/node_modules/.pnpm/postgres-date@1.0.7/node_modules/postgres-date/index.js.map +0 -1
  636. package/out/node_modules/.pnpm/postgres-interval@1.2.0/node_modules/postgres-interval/index.js +0 -107
  637. package/out/node_modules/.pnpm/postgres-interval@1.2.0/node_modules/postgres-interval/index.js.map +0 -1
  638. package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react-jsx-runtime.development.js +0 -696
  639. package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react-jsx-runtime.development.js.map +0 -1
  640. package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react-jsx-runtime.production.min.js +0 -44
  641. package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react-jsx-runtime.production.min.js.map +0 -1
  642. package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.development.js +0 -1585
  643. package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.development.js.map +0 -1
  644. package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js +0 -329
  645. package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js.map +0 -1
  646. package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/index.js +0 -13
  647. package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/index.js.map +0 -1
  648. package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/jsx-runtime.js +0 -13
  649. package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/jsx-runtime.js.map +0 -1
  650. package/out/node_modules/.pnpm/solid-js@1.9.13/node_modules/solid-js/dist/server.js +0 -131
  651. package/out/node_modules/.pnpm/solid-js@1.9.13/node_modules/solid-js/dist/server.js.map +0 -1
  652. package/out/node_modules/.pnpm/solid-js@1.9.13/node_modules/solid-js/store/dist/server.js +0 -96
  653. package/out/node_modules/.pnpm/solid-js@1.9.13/node_modules/solid-js/store/dist/server.js.map +0 -1
  654. package/out/node_modules/.pnpm/split2@4.2.0/node_modules/split2/index.js +0 -95
  655. package/out/node_modules/.pnpm/split2@4.2.0/node_modules/split2/index.js.map +0 -1
  656. package/out/node_modules/.pnpm/xtend@4.0.2/node_modules/xtend/mutable.js +0 -18
  657. package/out/node_modules/.pnpm/xtend@4.0.2/node_modules/xtend/mutable.js.map +0 -1
  658. package/out/packages/analyze-query/src/analyze-cli.js +0 -288
  659. package/out/packages/analyze-query/src/analyze-cli.js.map +0 -1
  660. package/out/packages/analyze-query/src/bin-analyze.js.map +0 -1
  661. package/out/packages/analyze-query/src/bin-transform.js.map +0 -1
  662. package/out/packages/ast-to-zql/src/ast-to-zql.js.map +0 -1
  663. package/out/packages/ast-to-zql/src/bin.js.map +0 -1
  664. package/out/packages/ast-to-zql/src/format.js.map +0 -1
  665. package/out/packages/datadog/src/datadog-log-sink.js.map +0 -1
  666. package/out/packages/otel/src/enabled.js.map +0 -1
  667. package/out/packages/otel/src/log-options.js.map +0 -1
  668. package/out/packages/otel/src/maybe-time.js.map +0 -1
  669. package/out/packages/otel/src/span.js.map +0 -1
  670. package/out/packages/otel/src/version.js.map +0 -1
  671. package/out/packages/replicache/src/async-iterable-to-array.js.map +0 -1
  672. package/out/packages/replicache/src/bg-interval.js.map +0 -1
  673. package/out/packages/replicache/src/btree/diff.js.map +0 -1
  674. package/out/packages/replicache/src/btree/node.js.map +0 -1
  675. package/out/packages/replicache/src/btree/read.js.map +0 -1
  676. package/out/packages/replicache/src/btree/splice.js.map +0 -1
  677. package/out/packages/replicache/src/btree/write.js.map +0 -1
  678. package/out/packages/replicache/src/call-default-fetch.js.map +0 -1
  679. package/out/packages/replicache/src/connection-loop-delegates.js.map +0 -1
  680. package/out/packages/replicache/src/connection-loop.js.map +0 -1
  681. package/out/packages/replicache/src/cookies.js.map +0 -1
  682. package/out/packages/replicache/src/dag/chunk.js.map +0 -1
  683. package/out/packages/replicache/src/dag/gc.js.map +0 -1
  684. package/out/packages/replicache/src/dag/key.js.map +0 -1
  685. package/out/packages/replicache/src/dag/lazy-store.js.map +0 -1
  686. package/out/packages/replicache/src/dag/store-impl.js.map +0 -1
  687. package/out/packages/replicache/src/dag/store.js.map +0 -1
  688. package/out/packages/replicache/src/dag/visitor.js.map +0 -1
  689. package/out/packages/replicache/src/db/commit.js.map +0 -1
  690. package/out/packages/replicache/src/db/index.js.map +0 -1
  691. package/out/packages/replicache/src/db/read.js.map +0 -1
  692. package/out/packages/replicache/src/db/rebase.js.map +0 -1
  693. package/out/packages/replicache/src/db/write.js.map +0 -1
  694. package/out/packages/replicache/src/deleted-clients.js.map +0 -1
  695. package/out/packages/replicache/src/error-responses.js.map +0 -1
  696. package/out/packages/replicache/src/frozen-json.js.map +0 -1
  697. package/out/packages/replicache/src/get-default-puller.js.map +0 -1
  698. package/out/packages/replicache/src/get-default-pusher.js.map +0 -1
  699. package/out/packages/replicache/src/get-kv-store-provider.js.map +0 -1
  700. package/out/packages/replicache/src/hash.js.map +0 -1
  701. package/out/packages/replicache/src/http-request-info.js.map +0 -1
  702. package/out/packages/replicache/src/index-defs.js.map +0 -1
  703. package/out/packages/replicache/src/kv/expo-sqlite/store.js.map +0 -1
  704. package/out/packages/replicache/src/kv/idb-store-with-mem-fallback.js.map +0 -1
  705. package/out/packages/replicache/src/kv/idb-store.js.map +0 -1
  706. package/out/packages/replicache/src/kv/mem-store.js.map +0 -1
  707. package/out/packages/replicache/src/kv/op-sqlite/store.js.map +0 -1
  708. package/out/packages/replicache/src/kv/op-sqlite/types.js.map +0 -1
  709. package/out/packages/replicache/src/kv/read-impl.js.map +0 -1
  710. package/out/packages/replicache/src/kv/sqlite-store.js.map +0 -1
  711. package/out/packages/replicache/src/kv/throw-if-closed.js.map +0 -1
  712. package/out/packages/replicache/src/kv/write-impl-base.js.map +0 -1
  713. package/out/packages/replicache/src/kv/write-impl.js.map +0 -1
  714. package/out/packages/replicache/src/lazy.js.map +0 -1
  715. package/out/packages/replicache/src/log-options.js.map +0 -1
  716. package/out/packages/replicache/src/make-idb-name.js.map +0 -1
  717. package/out/packages/replicache/src/new-client-channel.js.map +0 -1
  718. package/out/packages/replicache/src/on-persist-channel.js.map +0 -1
  719. package/out/packages/replicache/src/patch-operation.js.map +0 -1
  720. package/out/packages/replicache/src/pending-mutations.js.map +0 -1
  721. package/out/packages/replicache/src/persist/client-gc.js.map +0 -1
  722. package/out/packages/replicache/src/persist/client-group-gc.js.map +0 -1
  723. package/out/packages/replicache/src/persist/client-groups.js.map +0 -1
  724. package/out/packages/replicache/src/persist/clients.js.map +0 -1
  725. package/out/packages/replicache/src/persist/collect-idb-databases.js.map +0 -1
  726. package/out/packages/replicache/src/persist/gather-mem-only-visitor.js.map +0 -1
  727. package/out/packages/replicache/src/persist/gather-not-cached-visitor.js.map +0 -1
  728. package/out/packages/replicache/src/persist/heartbeat.js.map +0 -1
  729. package/out/packages/replicache/src/persist/idb-databases-store-db-name.js.map +0 -1
  730. package/out/packages/replicache/src/persist/idb-databases-store.js.map +0 -1
  731. package/out/packages/replicache/src/persist/make-client-id.js.map +0 -1
  732. package/out/packages/replicache/src/persist/persist.js.map +0 -1
  733. package/out/packages/replicache/src/persist/refresh.js.map +0 -1
  734. package/out/packages/replicache/src/process-scheduler.js.map +0 -1
  735. package/out/packages/replicache/src/pusher.js.map +0 -1
  736. package/out/packages/replicache/src/replicache-impl.js.map +0 -1
  737. package/out/packages/replicache/src/report-error.js.map +0 -1
  738. package/out/packages/replicache/src/request-idle.js.map +0 -1
  739. package/out/packages/replicache/src/scan-iterator.js.map +0 -1
  740. package/out/packages/replicache/src/scan-options.js.map +0 -1
  741. package/out/packages/replicache/src/set-interval-with-signal.js.map +0 -1
  742. package/out/packages/replicache/src/subscriptions.js.map +0 -1
  743. package/out/packages/replicache/src/sync/diff.js.map +0 -1
  744. package/out/packages/replicache/src/sync/ids.js.map +0 -1
  745. package/out/packages/replicache/src/sync/patch.js.map +0 -1
  746. package/out/packages/replicache/src/sync/pull-error.js.map +0 -1
  747. package/out/packages/replicache/src/sync/pull.js.map +0 -1
  748. package/out/packages/replicache/src/sync/push.js.map +0 -1
  749. package/out/packages/replicache/src/sync/request-id.js.map +0 -1
  750. package/out/packages/replicache/src/sync/sync-head-name.js.map +0 -1
  751. package/out/packages/replicache/src/to-error.js.map +0 -1
  752. package/out/packages/replicache/src/transaction-closed-error.js.map +0 -1
  753. package/out/packages/replicache/src/transactions.js.map +0 -1
  754. package/out/packages/replicache/src/version.js.map +0 -1
  755. package/out/packages/replicache/src/with-transactions.js.map +0 -1
  756. package/out/packages/shared/src/abort-error.js.map +0 -1
  757. package/out/packages/shared/src/arrays.js.map +0 -1
  758. package/out/packages/shared/src/asserts.js.map +0 -1
  759. package/out/packages/shared/src/bigint-json.js.map +0 -1
  760. package/out/packages/shared/src/binary-search.js.map +0 -1
  761. package/out/packages/shared/src/broadcast-channel.js.map +0 -1
  762. package/out/packages/shared/src/browser-env.js.map +0 -1
  763. package/out/packages/shared/src/btree-set.js.map +0 -1
  764. package/out/packages/shared/src/cache.js.map +0 -1
  765. package/out/packages/shared/src/centroid.js.map +0 -1
  766. package/out/packages/shared/src/config.js.map +0 -1
  767. package/out/packages/shared/src/custom-key-map.js.map +0 -1
  768. package/out/packages/shared/src/custom-key-set.js.map +0 -1
  769. package/out/packages/shared/src/deep-clone.js.map +0 -1
  770. package/out/packages/shared/src/deep-merge.js.map +0 -1
  771. package/out/packages/shared/src/document-visible.js.map +0 -1
  772. package/out/packages/shared/src/dotenv.js.map +0 -1
  773. package/out/packages/shared/src/error.js.map +0 -1
  774. package/out/packages/shared/src/has-own.js.map +0 -1
  775. package/out/packages/shared/src/hash.js.map +0 -1
  776. package/out/packages/shared/src/iterables.js +0 -53
  777. package/out/packages/shared/src/iterables.js.map +0 -1
  778. package/out/packages/shared/src/json-schema.js.map +0 -1
  779. package/out/packages/shared/src/json.js.map +0 -1
  780. package/out/packages/shared/src/logging-test-utils.js.map +0 -1
  781. package/out/packages/shared/src/logging.js.map +0 -1
  782. package/out/packages/shared/src/map.js.map +0 -1
  783. package/out/packages/shared/src/must.js.map +0 -1
  784. package/out/packages/shared/src/navigator.js.map +0 -1
  785. package/out/packages/shared/src/object-traversal.js.map +0 -1
  786. package/out/packages/shared/src/objects.js.map +0 -1
  787. package/out/packages/shared/src/options.js.map +0 -1
  788. package/out/packages/shared/src/parse-big-int.js.map +0 -1
  789. package/out/packages/shared/src/promise-race.js.map +0 -1
  790. package/out/packages/shared/src/queue.js.map +0 -1
  791. package/out/packages/shared/src/rand.js.map +0 -1
  792. package/out/packages/shared/src/random-uint64.js.map +0 -1
  793. package/out/packages/shared/src/random-values.js.map +0 -1
  794. package/out/packages/shared/src/record-proxy.js.map +0 -1
  795. package/out/packages/shared/src/resolved-promises.js.map +0 -1
  796. package/out/packages/shared/src/ring-buffer.js.map +0 -1
  797. package/out/packages/shared/src/sentinels.js.map +0 -1
  798. package/out/packages/shared/src/set-utils.js.map +0 -1
  799. package/out/packages/shared/src/size-of-value.js.map +0 -1
  800. package/out/packages/shared/src/sleep.js.map +0 -1
  801. package/out/packages/shared/src/sorted-entries.js.map +0 -1
  802. package/out/packages/shared/src/string-compare.js.map +0 -1
  803. package/out/packages/shared/src/subscribable.js.map +0 -1
  804. package/out/packages/shared/src/tdigest-schema.js.map +0 -1
  805. package/out/packages/shared/src/tdigest.js.map +0 -1
  806. package/out/packages/shared/src/valita.js +0 -172
  807. package/out/packages/shared/src/valita.js.map +0 -1
  808. package/out/packages/z2s/src/compiler.js.map +0 -1
  809. package/out/packages/z2s/src/sql.js.map +0 -1
  810. package/out/packages/zero/package.js +0 -205
  811. package/out/packages/zero/package.js.map +0 -1
  812. package/out/packages/zero-cache/src/auth/auth.js.map +0 -1
  813. package/out/packages/zero-cache/src/auth/jwt.js.map +0 -1
  814. package/out/packages/zero-cache/src/auth/load-permissions.js.map +0 -1
  815. package/out/packages/zero-cache/src/auth/read-authorizer.js.map +0 -1
  816. package/out/packages/zero-cache/src/auth/write-authorizer.js.map +0 -1
  817. package/out/packages/zero-cache/src/config/network.js.map +0 -1
  818. package/out/packages/zero-cache/src/config/normalize.js.map +0 -1
  819. package/out/packages/zero-cache/src/config/server-context.js.map +0 -1
  820. package/out/packages/zero-cache/src/config/zero-config.js.map +0 -1
  821. package/out/packages/zero-cache/src/custom/fetch.js.map +0 -1
  822. package/out/packages/zero-cache/src/custom-queries/transform-query.js.map +0 -1
  823. package/out/packages/zero-cache/src/db/create.js.map +0 -1
  824. package/out/packages/zero-cache/src/db/delete-lite-db.js.map +0 -1
  825. package/out/packages/zero-cache/src/db/lite-tables.js.map +0 -1
  826. package/out/packages/zero-cache/src/db/migration-lite.js.map +0 -1
  827. package/out/packages/zero-cache/src/db/migration.js.map +0 -1
  828. package/out/packages/zero-cache/src/db/mode-enum.js.map +0 -1
  829. package/out/packages/zero-cache/src/db/pg-copy-binary.js.map +0 -1
  830. package/out/packages/zero-cache/src/db/pg-copy.js.map +0 -1
  831. package/out/packages/zero-cache/src/db/pg-to-lite.js.map +0 -1
  832. package/out/packages/zero-cache/src/db/pg-type-parser.js.map +0 -1
  833. package/out/packages/zero-cache/src/db/run-transaction.js.map +0 -1
  834. package/out/packages/zero-cache/src/db/specs.js.map +0 -1
  835. package/out/packages/zero-cache/src/db/statements.js.map +0 -1
  836. package/out/packages/zero-cache/src/db/transaction-pool.js.map +0 -1
  837. package/out/packages/zero-cache/src/db/warmup.js.map +0 -1
  838. package/out/packages/zero-cache/src/observability/events.js.map +0 -1
  839. package/out/packages/zero-cache/src/observability/metrics.js.map +0 -1
  840. package/out/packages/zero-cache/src/scripts/decommission.js.map +0 -1
  841. package/out/packages/zero-cache/src/scripts/deploy-permissions.js.map +0 -1
  842. package/out/packages/zero-cache/src/scripts/permissions.js +0 -93
  843. package/out/packages/zero-cache/src/scripts/permissions.js.map +0 -1
  844. package/out/packages/zero-cache/src/server/anonymous-otel-start.js +0 -306
  845. package/out/packages/zero-cache/src/server/anonymous-otel-start.js.map +0 -1
  846. package/out/packages/zero-cache/src/server/inspector-delegate.js.map +0 -1
  847. package/out/packages/zero-cache/src/server/logging.js.map +0 -1
  848. package/out/packages/zero-cache/src/server/otel-diag-logger.js.map +0 -1
  849. package/out/packages/zero-cache/src/server/otel-log-sink.js.map +0 -1
  850. package/out/packages/zero-cache/src/server/otel-start.js +0 -53
  851. package/out/packages/zero-cache/src/server/otel-start.js.map +0 -1
  852. package/out/packages/zero-cache/src/server/priority-op.js.map +0 -1
  853. package/out/packages/zero-cache/src/server/runner/main.js.map +0 -1
  854. package/out/packages/zero-cache/src/server/runner/run-worker.js.map +0 -1
  855. package/out/packages/zero-cache/src/server/runner/runtime.js.map +0 -1
  856. package/out/packages/zero-cache/src/server/runner/zero-dispatcher.js.map +0 -1
  857. package/out/packages/zero-cache/src/server/worker-dispatcher.js.map +0 -1
  858. package/out/packages/zero-cache/src/server/worker-urls.js.map +0 -1
  859. package/out/packages/zero-cache/src/services/analyze.js +0 -72
  860. package/out/packages/zero-cache/src/services/analyze.js.map +0 -1
  861. package/out/packages/zero-cache/src/services/change-source/common/backfill-manager.js.map +0 -1
  862. package/out/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +0 -1
  863. package/out/packages/zero-cache/src/services/change-source/common/replica-schema.js.map +0 -1
  864. package/out/packages/zero-cache/src/services/change-source/custom/change-source.js.map +0 -1
  865. package/out/packages/zero-cache/src/services/change-source/pg/backfill-metadata.js.map +0 -1
  866. package/out/packages/zero-cache/src/services/change-source/pg/backfill-stream.js.map +0 -1
  867. package/out/packages/zero-cache/src/services/change-source/pg/change-source.js.map +0 -1
  868. package/out/packages/zero-cache/src/services/change-source/pg/decommission.js.map +0 -1
  869. package/out/packages/zero-cache/src/services/change-source/pg/initial-sync.js.map +0 -1
  870. package/out/packages/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js.map +0 -1
  871. package/out/packages/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js.map +0 -1
  872. package/out/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +0 -1
  873. package/out/packages/zero-cache/src/services/change-source/pg/lsn.js.map +0 -1
  874. package/out/packages/zero-cache/src/services/change-source/pg/replication-slots.js.map +0 -1
  875. package/out/packages/zero-cache/src/services/change-source/pg/schema/ddl.js.map +0 -1
  876. package/out/packages/zero-cache/src/services/change-source/pg/schema/init.js.map +0 -1
  877. package/out/packages/zero-cache/src/services/change-source/pg/schema/published.js.map +0 -1
  878. package/out/packages/zero-cache/src/services/change-source/pg/schema/shard.js.map +0 -1
  879. package/out/packages/zero-cache/src/services/change-source/pg/schema/validation.js.map +0 -1
  880. package/out/packages/zero-cache/src/services/change-source/protocol/current/control.js.map +0 -1
  881. package/out/packages/zero-cache/src/services/change-source/protocol/current/data.js.map +0 -1
  882. package/out/packages/zero-cache/src/services/change-source/protocol/current/downstream.js.map +0 -1
  883. package/out/packages/zero-cache/src/services/change-source/protocol/current/json.js.map +0 -1
  884. package/out/packages/zero-cache/src/services/change-source/protocol/current/path.js.map +0 -1
  885. package/out/packages/zero-cache/src/services/change-source/protocol/current/status.js.map +0 -1
  886. package/out/packages/zero-cache/src/services/change-source/protocol/current/upstream.js.map +0 -1
  887. package/out/packages/zero-cache/src/services/change-source/protocol/current.js +0 -56
  888. package/out/packages/zero-cache/src/services/change-source/protocol/current.js.map +0 -1
  889. package/out/packages/zero-cache/src/services/change-streamer/backup-monitor.js.map +0 -1
  890. package/out/packages/zero-cache/src/services/change-streamer/broadcast.js.map +0 -1
  891. package/out/packages/zero-cache/src/services/change-streamer/change-streamer-http.js.map +0 -1
  892. package/out/packages/zero-cache/src/services/change-streamer/change-streamer-service.js.map +0 -1
  893. package/out/packages/zero-cache/src/services/change-streamer/change-streamer.js.map +0 -1
  894. package/out/packages/zero-cache/src/services/change-streamer/forwarder.js.map +0 -1
  895. package/out/packages/zero-cache/src/services/change-streamer/replica-monitor.js.map +0 -1
  896. package/out/packages/zero-cache/src/services/change-streamer/schema/init.js.map +0 -1
  897. package/out/packages/zero-cache/src/services/change-streamer/schema/tables.js.map +0 -1
  898. package/out/packages/zero-cache/src/services/change-streamer/snapshot.js.map +0 -1
  899. package/out/packages/zero-cache/src/services/change-streamer/storer.js.map +0 -1
  900. package/out/packages/zero-cache/src/services/change-streamer/subscriber.js.map +0 -1
  901. package/out/packages/zero-cache/src/services/heapz.js.map +0 -1
  902. package/out/packages/zero-cache/src/services/http-service.js.map +0 -1
  903. package/out/packages/zero-cache/src/services/life-cycle.js.map +0 -1
  904. package/out/packages/zero-cache/src/services/limiter/sliding-window-limiter.js.map +0 -1
  905. package/out/packages/zero-cache/src/services/litestream/commands.js.map +0 -1
  906. package/out/packages/zero-cache/src/services/mutagen/error.js.map +0 -1
  907. package/out/packages/zero-cache/src/services/mutagen/mutagen.js.map +0 -1
  908. package/out/packages/zero-cache/src/services/mutagen/pusher.js.map +0 -1
  909. package/out/packages/zero-cache/src/services/replicator/change-processor.js.map +0 -1
  910. package/out/packages/zero-cache/src/services/replicator/incremental-sync.js.map +0 -1
  911. package/out/packages/zero-cache/src/services/replicator/notifier.js.map +0 -1
  912. package/out/packages/zero-cache/src/services/replicator/replication-status.js.map +0 -1
  913. package/out/packages/zero-cache/src/services/replicator/replicator.js.map +0 -1
  914. package/out/packages/zero-cache/src/services/replicator/reporter/recorder.js.map +0 -1
  915. package/out/packages/zero-cache/src/services/replicator/reporter/report-schema.js.map +0 -1
  916. package/out/packages/zero-cache/src/services/replicator/schema/change-log.js.map +0 -1
  917. package/out/packages/zero-cache/src/services/replicator/schema/column-metadata.js.map +0 -1
  918. package/out/packages/zero-cache/src/services/replicator/schema/constants.js.map +0 -1
  919. package/out/packages/zero-cache/src/services/replicator/schema/replication-state.js.map +0 -1
  920. package/out/packages/zero-cache/src/services/replicator/schema/table-metadata.js.map +0 -1
  921. package/out/packages/zero-cache/src/services/replicator/write-worker-client.js.map +0 -1
  922. package/out/packages/zero-cache/src/services/replicator/write-worker.js.map +0 -1
  923. package/out/packages/zero-cache/src/services/run-ast.js.map +0 -1
  924. package/out/packages/zero-cache/src/services/runner.js.map +0 -1
  925. package/out/packages/zero-cache/src/services/running-state.js.map +0 -1
  926. package/out/packages/zero-cache/src/services/shadow-sync/shadow-sync-service.js.map +0 -1
  927. package/out/packages/zero-cache/src/services/statz.js.map +0 -1
  928. package/out/packages/zero-cache/src/services/view-syncer/active-users-gauge.js.map +0 -1
  929. package/out/packages/zero-cache/src/services/view-syncer/client-handler.js.map +0 -1
  930. package/out/packages/zero-cache/src/services/view-syncer/client-schema.js.map +0 -1
  931. package/out/packages/zero-cache/src/services/view-syncer/connection-context-manager.js.map +0 -1
  932. package/out/packages/zero-cache/src/services/view-syncer/cvr-purger.js.map +0 -1
  933. package/out/packages/zero-cache/src/services/view-syncer/cvr-store.js +0 -869
  934. package/out/packages/zero-cache/src/services/view-syncer/cvr-store.js.map +0 -1
  935. package/out/packages/zero-cache/src/services/view-syncer/cvr.js.map +0 -1
  936. package/out/packages/zero-cache/src/services/view-syncer/drain-coordinator.js.map +0 -1
  937. package/out/packages/zero-cache/src/services/view-syncer/inspect-handler.js +0 -102
  938. package/out/packages/zero-cache/src/services/view-syncer/inspect-handler.js.map +0 -1
  939. package/out/packages/zero-cache/src/services/view-syncer/pipeline-driver.js.map +0 -1
  940. package/out/packages/zero-cache/src/services/view-syncer/row-record-cache.js.map +0 -1
  941. package/out/packages/zero-cache/src/services/view-syncer/row-set-signature.js.map +0 -1
  942. package/out/packages/zero-cache/src/services/view-syncer/schema/cvr.js.map +0 -1
  943. package/out/packages/zero-cache/src/services/view-syncer/schema/init.js.map +0 -1
  944. package/out/packages/zero-cache/src/services/view-syncer/schema/types.js.map +0 -1
  945. package/out/packages/zero-cache/src/services/view-syncer/snapshotter.js.map +0 -1
  946. package/out/packages/zero-cache/src/services/view-syncer/tracer.js.map +0 -1
  947. package/out/packages/zero-cache/src/services/view-syncer/ttl-clock.js.map +0 -1
  948. package/out/packages/zero-cache/src/services/view-syncer/view-syncer.js.map +0 -1
  949. package/out/packages/zero-cache/src/types/configuration-error.js.map +0 -1
  950. package/out/packages/zero-cache/src/types/error-with-level.js.map +0 -1
  951. package/out/packages/zero-cache/src/types/http.js.map +0 -1
  952. package/out/packages/zero-cache/src/types/lexi-version.js.map +0 -1
  953. package/out/packages/zero-cache/src/types/lite.js.map +0 -1
  954. package/out/packages/zero-cache/src/types/names.js.map +0 -1
  955. package/out/packages/zero-cache/src/types/pg-data-type.js.map +0 -1
  956. package/out/packages/zero-cache/src/types/pg-types.js.map +0 -1
  957. package/out/packages/zero-cache/src/types/pg-versions.js.map +0 -1
  958. package/out/packages/zero-cache/src/types/pg.js.map +0 -1
  959. package/out/packages/zero-cache/src/types/processes.js.map +0 -1
  960. package/out/packages/zero-cache/src/types/profiler.js.map +0 -1
  961. package/out/packages/zero-cache/src/types/row-key.js.map +0 -1
  962. package/out/packages/zero-cache/src/types/shards.js.map +0 -1
  963. package/out/packages/zero-cache/src/types/sql.js.map +0 -1
  964. package/out/packages/zero-cache/src/types/state-version.js.map +0 -1
  965. package/out/packages/zero-cache/src/types/streams.js.map +0 -1
  966. package/out/packages/zero-cache/src/types/strings.js.map +0 -1
  967. package/out/packages/zero-cache/src/types/subscription.js.map +0 -1
  968. package/out/packages/zero-cache/src/types/timeout.js.map +0 -1
  969. package/out/packages/zero-cache/src/types/url-params.js.map +0 -1
  970. package/out/packages/zero-cache/src/types/websocket-handoff.js.map +0 -1
  971. package/out/packages/zero-cache/src/types/ws.js.map +0 -1
  972. package/out/packages/zero-cache/src/workers/connect-params.js.map +0 -1
  973. package/out/packages/zero-cache/src/workers/connection.js.map +0 -1
  974. package/out/packages/zero-cache/src/workers/mutator.js.map +0 -1
  975. package/out/packages/zero-cache/src/workers/replicator.js.map +0 -1
  976. package/out/packages/zero-cache/src/workers/syncer-ws-message-handler.js.map +0 -1
  977. package/out/packages/zero-cache/src/workers/syncer.js.map +0 -1
  978. package/out/packages/zero-client/src/client/active-clients-manager.js.map +0 -1
  979. package/out/packages/zero-client/src/client/client-error-kind-enum.js.map +0 -1
  980. package/out/packages/zero-client/src/client/connection-manager.js.map +0 -1
  981. package/out/packages/zero-client/src/client/connection-status-enum.js +0 -20
  982. package/out/packages/zero-client/src/client/connection-status-enum.js.map +0 -1
  983. package/out/packages/zero-client/src/client/connection.js.map +0 -1
  984. package/out/packages/zero-client/src/client/context.js.map +0 -1
  985. package/out/packages/zero-client/src/client/crud-impl.js +0 -61
  986. package/out/packages/zero-client/src/client/crud-impl.js.map +0 -1
  987. package/out/packages/zero-client/src/client/crud.js.map +0 -1
  988. package/out/packages/zero-client/src/client/custom.js.map +0 -1
  989. package/out/packages/zero-client/src/client/delete-clients-manager.js.map +0 -1
  990. package/out/packages/zero-client/src/client/enable-analytics.js.map +0 -1
  991. package/out/packages/zero-client/src/client/error.js.map +0 -1
  992. package/out/packages/zero-client/src/client/http-string.js.map +0 -1
  993. package/out/packages/zero-client/src/client/inspector/client-group.js.map +0 -1
  994. package/out/packages/zero-client/src/client/inspector/client.js.map +0 -1
  995. package/out/packages/zero-client/src/client/inspector/html-dialog-prompt.js.map +0 -1
  996. package/out/packages/zero-client/src/client/inspector/inspector.js.map +0 -1
  997. package/out/packages/zero-client/src/client/inspector/lazy-inspector.js.map +0 -1
  998. package/out/packages/zero-client/src/client/inspector/query.js.map +0 -1
  999. package/out/packages/zero-client/src/client/ivm-branch.js.map +0 -1
  1000. package/out/packages/zero-client/src/client/keys.js.map +0 -1
  1001. package/out/packages/zero-client/src/client/log-options.js.map +0 -1
  1002. package/out/packages/zero-client/src/client/make-mutate-property.js.map +0 -1
  1003. package/out/packages/zero-client/src/client/make-replicache-mutators.js.map +0 -1
  1004. package/out/packages/zero-client/src/client/metric-name-enum.js.map +0 -1
  1005. package/out/packages/zero-client/src/client/metrics.js.map +0 -1
  1006. package/out/packages/zero-client/src/client/mutation-tracker.js.map +0 -1
  1007. package/out/packages/zero-client/src/client/mutator-proxy.js.map +0 -1
  1008. package/out/packages/zero-client/src/client/options.js.map +0 -1
  1009. package/out/packages/zero-client/src/client/query-manager.js.map +0 -1
  1010. package/out/packages/zero-client/src/client/reload-error-handler.js.map +0 -1
  1011. package/out/packages/zero-client/src/client/server-option.js.map +0 -1
  1012. package/out/packages/zero-client/src/client/update-needed-reason-type-enum.js +0 -27
  1013. package/out/packages/zero-client/src/client/update-needed-reason-type-enum.js.map +0 -1
  1014. package/out/packages/zero-client/src/client/version.js +0 -9
  1015. package/out/packages/zero-client/src/client/version.js.map +0 -1
  1016. package/out/packages/zero-client/src/client/zero-poke-handler.js.map +0 -1
  1017. package/out/packages/zero-client/src/client/zero-rep.js.map +0 -1
  1018. package/out/packages/zero-client/src/client/zero.js.map +0 -1
  1019. package/out/packages/zero-client/src/util/nanoid.js.map +0 -1
  1020. package/out/packages/zero-protocol/src/analyze-query-result.js.map +0 -1
  1021. package/out/packages/zero-protocol/src/application-error.js.map +0 -1
  1022. package/out/packages/zero-protocol/src/ast.js.map +0 -1
  1023. package/out/packages/zero-protocol/src/change-desired-queries.js.map +0 -1
  1024. package/out/packages/zero-protocol/src/client-schema.js.map +0 -1
  1025. package/out/packages/zero-protocol/src/close-connection.js.map +0 -1
  1026. package/out/packages/zero-protocol/src/connect.js.map +0 -1
  1027. package/out/packages/zero-protocol/src/custom-queries.js.map +0 -1
  1028. package/out/packages/zero-protocol/src/data.js.map +0 -1
  1029. package/out/packages/zero-protocol/src/delete-clients.js.map +0 -1
  1030. package/out/packages/zero-protocol/src/down.js.map +0 -1
  1031. package/out/packages/zero-protocol/src/error-kind-enum.js.map +0 -1
  1032. package/out/packages/zero-protocol/src/error-origin-enum.js.map +0 -1
  1033. package/out/packages/zero-protocol/src/error-reason-enum.js.map +0 -1
  1034. package/out/packages/zero-protocol/src/error.js.map +0 -1
  1035. package/out/packages/zero-protocol/src/inspect-down.js.map +0 -1
  1036. package/out/packages/zero-protocol/src/inspect-up.js.map +0 -1
  1037. package/out/packages/zero-protocol/src/mutate-server.js.map +0 -1
  1038. package/out/packages/zero-protocol/src/mutation-id.js.map +0 -1
  1039. package/out/packages/zero-protocol/src/mutation-type-enum.js.map +0 -1
  1040. package/out/packages/zero-protocol/src/mutation.js.map +0 -1
  1041. package/out/packages/zero-protocol/src/mutations-patch.js.map +0 -1
  1042. package/out/packages/zero-protocol/src/ping.js.map +0 -1
  1043. package/out/packages/zero-protocol/src/poke.js.map +0 -1
  1044. package/out/packages/zero-protocol/src/pong.js.map +0 -1
  1045. package/out/packages/zero-protocol/src/primary-key.js.map +0 -1
  1046. package/out/packages/zero-protocol/src/protocol-version.js.map +0 -1
  1047. package/out/packages/zero-protocol/src/pull.js.map +0 -1
  1048. package/out/packages/zero-protocol/src/push.js.map +0 -1
  1049. package/out/packages/zero-protocol/src/queries-patch.js.map +0 -1
  1050. package/out/packages/zero-protocol/src/query-hash.js.map +0 -1
  1051. package/out/packages/zero-protocol/src/query-server.js.map +0 -1
  1052. package/out/packages/zero-protocol/src/row-patch.js.map +0 -1
  1053. package/out/packages/zero-protocol/src/up.js.map +0 -1
  1054. package/out/packages/zero-protocol/src/update-auth.js.map +0 -1
  1055. package/out/packages/zero-protocol/src/version.js.map +0 -1
  1056. package/out/packages/zero-react/src/use-connection-state.js +0 -19
  1057. package/out/packages/zero-react/src/use-connection-state.js.map +0 -1
  1058. package/out/packages/zero-react/src/use-query.js +0 -301
  1059. package/out/packages/zero-react/src/use-query.js.map +0 -1
  1060. package/out/packages/zero-react/src/use-zero-online.js +0 -22
  1061. package/out/packages/zero-react/src/use-zero-online.js.map +0 -1
  1062. package/out/packages/zero-react/src/zero-provider.js +0 -90
  1063. package/out/packages/zero-react/src/zero-provider.js.map +0 -1
  1064. package/out/packages/zero-schema/src/builder/relationship-builder.js.map +0 -1
  1065. package/out/packages/zero-schema/src/builder/schema-builder.js.map +0 -1
  1066. package/out/packages/zero-schema/src/builder/table-builder.js.map +0 -1
  1067. package/out/packages/zero-schema/src/compiled-permissions.js.map +0 -1
  1068. package/out/packages/zero-schema/src/name-mapper.js.map +0 -1
  1069. package/out/packages/zero-schema/src/permissions.js.map +0 -1
  1070. package/out/packages/zero-schema/src/schema-config.js.map +0 -1
  1071. package/out/packages/zero-server/src/adapters/drizzle.js.map +0 -1
  1072. package/out/packages/zero-server/src/adapters/kysely.js.map +0 -1
  1073. package/out/packages/zero-server/src/adapters/pg.js +0 -83
  1074. package/out/packages/zero-server/src/adapters/pg.js.map +0 -1
  1075. package/out/packages/zero-server/src/adapters/postgresjs.js.map +0 -1
  1076. package/out/packages/zero-server/src/adapters/prisma.js.map +0 -1
  1077. package/out/packages/zero-server/src/custom.js.map +0 -1
  1078. package/out/packages/zero-server/src/logging.js.map +0 -1
  1079. package/out/packages/zero-server/src/pg-query-executor.js.map +0 -1
  1080. package/out/packages/zero-server/src/process-mutations.js.map +0 -1
  1081. package/out/packages/zero-server/src/push-processor.js.map +0 -1
  1082. package/out/packages/zero-server/src/queries/process-queries.js.map +0 -1
  1083. package/out/packages/zero-server/src/schema.js.map +0 -1
  1084. package/out/packages/zero-server/src/zql-database.js.map +0 -1
  1085. package/out/packages/zero-solid/src/solid-view.js +0 -145
  1086. package/out/packages/zero-solid/src/solid-view.js.map +0 -1
  1087. package/out/packages/zero-solid/src/use-connection-state.js +0 -21
  1088. package/out/packages/zero-solid/src/use-connection-state.js.map +0 -1
  1089. package/out/packages/zero-solid/src/use-query.js +0 -64
  1090. package/out/packages/zero-solid/src/use-query.js.map +0 -1
  1091. package/out/packages/zero-solid/src/use-zero-online.js +0 -21
  1092. package/out/packages/zero-solid/src/use-zero-online.js.map +0 -1
  1093. package/out/packages/zero-solid/src/use-zero.js +0 -93
  1094. package/out/packages/zero-solid/src/use-zero.js.map +0 -1
  1095. package/out/packages/zero-types/src/format.js.map +0 -1
  1096. package/out/packages/zero-types/src/name-mapper.js.map +0 -1
  1097. package/out/packages/zql/src/builder/builder.js.map +0 -1
  1098. package/out/packages/zql/src/builder/debug-delegate.js.map +0 -1
  1099. package/out/packages/zql/src/builder/filter.js.map +0 -1
  1100. package/out/packages/zql/src/builder/like.js.map +0 -1
  1101. package/out/packages/zql/src/error.js.map +0 -1
  1102. package/out/packages/zql/src/ivm/array-view.js.map +0 -1
  1103. package/out/packages/zql/src/ivm/cap.js.map +0 -1
  1104. package/out/packages/zql/src/ivm/change.js.map +0 -1
  1105. package/out/packages/zql/src/ivm/constraint.js.map +0 -1
  1106. package/out/packages/zql/src/ivm/data.js.map +0 -1
  1107. package/out/packages/zql/src/ivm/exists.js.map +0 -1
  1108. package/out/packages/zql/src/ivm/fan-in.js.map +0 -1
  1109. package/out/packages/zql/src/ivm/fan-out.js.map +0 -1
  1110. package/out/packages/zql/src/ivm/filter-operators.js.map +0 -1
  1111. package/out/packages/zql/src/ivm/filter-push.js.map +0 -1
  1112. package/out/packages/zql/src/ivm/filter.js.map +0 -1
  1113. package/out/packages/zql/src/ivm/flipped-join.js.map +0 -1
  1114. package/out/packages/zql/src/ivm/join-utils.js.map +0 -1
  1115. package/out/packages/zql/src/ivm/join.js.map +0 -1
  1116. package/out/packages/zql/src/ivm/maybe-split-and-push-edit-change.js.map +0 -1
  1117. package/out/packages/zql/src/ivm/memory-source.js.map +0 -1
  1118. package/out/packages/zql/src/ivm/memory-storage.js.map +0 -1
  1119. package/out/packages/zql/src/ivm/operator.js.map +0 -1
  1120. package/out/packages/zql/src/ivm/push-accumulated.js.map +0 -1
  1121. package/out/packages/zql/src/ivm/skip-yields.js.map +0 -1
  1122. package/out/packages/zql/src/ivm/skip.js.map +0 -1
  1123. package/out/packages/zql/src/ivm/source.js.map +0 -1
  1124. package/out/packages/zql/src/ivm/stream.js.map +0 -1
  1125. package/out/packages/zql/src/ivm/take.js.map +0 -1
  1126. package/out/packages/zql/src/ivm/union-fan-in.js.map +0 -1
  1127. package/out/packages/zql/src/ivm/union-fan-out.js.map +0 -1
  1128. package/out/packages/zql/src/ivm/view-apply-change.js.map +0 -1
  1129. package/out/packages/zql/src/mutate/crud.js.map +0 -1
  1130. package/out/packages/zql/src/mutate/custom.js.map +0 -1
  1131. package/out/packages/zql/src/mutate/mutator-registry.js.map +0 -1
  1132. package/out/packages/zql/src/mutate/mutator.js.map +0 -1
  1133. package/out/packages/zql/src/planner/planner-builder.js.map +0 -1
  1134. package/out/packages/zql/src/planner/planner-connection.js.map +0 -1
  1135. package/out/packages/zql/src/planner/planner-constraint.js.map +0 -1
  1136. package/out/packages/zql/src/planner/planner-debug.js.map +0 -1
  1137. package/out/packages/zql/src/planner/planner-fan-in.js.map +0 -1
  1138. package/out/packages/zql/src/planner/planner-fan-out.js.map +0 -1
  1139. package/out/packages/zql/src/planner/planner-graph.js.map +0 -1
  1140. package/out/packages/zql/src/planner/planner-join.js.map +0 -1
  1141. package/out/packages/zql/src/planner/planner-node.js.map +0 -1
  1142. package/out/packages/zql/src/planner/planner-source.js.map +0 -1
  1143. package/out/packages/zql/src/planner/planner-terminus.js.map +0 -1
  1144. package/out/packages/zql/src/query/complete-ordering.js.map +0 -1
  1145. package/out/packages/zql/src/query/create-builder.js.map +0 -1
  1146. package/out/packages/zql/src/query/error.js.map +0 -1
  1147. package/out/packages/zql/src/query/escape-like.js.map +0 -1
  1148. package/out/packages/zql/src/query/expression.js.map +0 -1
  1149. package/out/packages/zql/src/query/measure-push-operator.js.map +0 -1
  1150. package/out/packages/zql/src/query/metrics-delegate.js.map +0 -1
  1151. package/out/packages/zql/src/query/named.js.map +0 -1
  1152. package/out/packages/zql/src/query/query-delegate-base.js.map +0 -1
  1153. package/out/packages/zql/src/query/query-impl.js.map +0 -1
  1154. package/out/packages/zql/src/query/query-internals.js.map +0 -1
  1155. package/out/packages/zql/src/query/query-registry.js.map +0 -1
  1156. package/out/packages/zql/src/query/runnable-query-impl.js.map +0 -1
  1157. package/out/packages/zql/src/query/static-query.js.map +0 -1
  1158. package/out/packages/zql/src/query/ttl.js.map +0 -1
  1159. package/out/packages/zql/src/query/validate-input.js.map +0 -1
  1160. package/out/packages/zqlite/src/database-storage.js.map +0 -1
  1161. package/out/packages/zqlite/src/db.js.map +0 -1
  1162. package/out/packages/zqlite/src/explain-queries.js.map +0 -1
  1163. package/out/packages/zqlite/src/internal/sql-inline.js.map +0 -1
  1164. package/out/packages/zqlite/src/internal/sql.js.map +0 -1
  1165. package/out/packages/zqlite/src/internal/statement-cache.js.map +0 -1
  1166. package/out/packages/zqlite/src/query-builder.js.map +0 -1
  1167. package/out/packages/zqlite/src/query-delegate.js.map +0 -1
  1168. package/out/packages/zqlite/src/resolve-scalar-subqueries.js.map +0 -1
  1169. package/out/packages/zqlite/src/sqlite-cost-model.js.map +0 -1
  1170. package/out/packages/zqlite/src/sqlite-stat-fanout.js.map +0 -1
  1171. package/out/packages/zqlite/src/table-source.js.map +0 -1
  1172. /package/out/{packages/analyze-query → analyze-query}/src/bin-analyze.js +0 -0
  1173. /package/out/{packages/analyze-query → analyze-query}/src/bin-transform.js +0 -0
  1174. /package/out/{packages/ast-to-zql → ast-to-zql}/src/ast-to-zql.js +0 -0
  1175. /package/out/{packages/ast-to-zql → ast-to-zql}/src/bin.js +0 -0
  1176. /package/out/{packages/ast-to-zql → ast-to-zql}/src/format.js +0 -0
  1177. /package/out/{packages/datadog → datadog}/src/datadog-log-sink.js +0 -0
  1178. /package/out/{packages/otel → otel}/src/enabled.js +0 -0
  1179. /package/out/{packages/otel → otel}/src/log-options.js +0 -0
  1180. /package/out/{packages/otel → otel}/src/maybe-time.js +0 -0
  1181. /package/out/{packages/otel → otel}/src/span.js +0 -0
  1182. /package/out/{packages/otel → otel}/src/version.js +0 -0
  1183. /package/out/{packages/replicache → replicache}/src/async-iterable-to-array.js +0 -0
  1184. /package/out/{packages/replicache → replicache}/src/bg-interval.js +0 -0
  1185. /package/out/{packages/replicache → replicache}/src/btree/diff.js +0 -0
  1186. /package/out/{packages/replicache → replicache}/src/btree/node.js +0 -0
  1187. /package/out/{packages/replicache → replicache}/src/btree/read.js +0 -0
  1188. /package/out/{packages/replicache → replicache}/src/btree/splice.js +0 -0
  1189. /package/out/{packages/replicache → replicache}/src/btree/write.js +0 -0
  1190. /package/out/{packages/replicache → replicache}/src/call-default-fetch.js +0 -0
  1191. /package/out/{packages/replicache → replicache}/src/config.js +0 -0
  1192. /package/out/{packages/replicache → replicache}/src/connection-loop-delegates.js +0 -0
  1193. /package/out/{packages/replicache → replicache}/src/connection-loop.js +0 -0
  1194. /package/out/{packages/replicache → replicache}/src/cookies.js +0 -0
  1195. /package/out/{packages/replicache → replicache}/src/dag/chunk.js +0 -0
  1196. /package/out/{packages/replicache → replicache}/src/dag/gc.js +0 -0
  1197. /package/out/{packages/replicache → replicache}/src/dag/key.js +0 -0
  1198. /package/out/{packages/replicache → replicache}/src/dag/lazy-store.js +0 -0
  1199. /package/out/{packages/replicache → replicache}/src/dag/store-impl.js +0 -0
  1200. /package/out/{packages/replicache → replicache}/src/dag/store.js +0 -0
  1201. /package/out/{packages/replicache → replicache}/src/dag/visitor.js +0 -0
  1202. /package/out/{packages/replicache → replicache}/src/db/commit.js +0 -0
  1203. /package/out/{packages/replicache → replicache}/src/db/index.js +0 -0
  1204. /package/out/{packages/replicache → replicache}/src/db/read.js +0 -0
  1205. /package/out/{packages/replicache → replicache}/src/db/rebase.js +0 -0
  1206. /package/out/{packages/replicache → replicache}/src/db/write.js +0 -0
  1207. /package/out/{packages/replicache → replicache}/src/deleted-clients.js +0 -0
  1208. /package/out/{packages/replicache → replicache}/src/error-responses.js +0 -0
  1209. /package/out/{packages/replicache → replicache}/src/expo-sqlite.js +0 -0
  1210. /package/out/{packages/replicache → replicache}/src/frozen-json.js +0 -0
  1211. /package/out/{packages/replicache → replicache}/src/get-default-puller.js +0 -0
  1212. /package/out/{packages/replicache → replicache}/src/get-default-pusher.js +0 -0
  1213. /package/out/{packages/replicache → replicache}/src/get-kv-store-provider.js +0 -0
  1214. /package/out/{packages/replicache → replicache}/src/hash.js +0 -0
  1215. /package/out/{packages/replicache → replicache}/src/http-request-info.js +0 -0
  1216. /package/out/{packages/replicache → replicache}/src/impl.js +0 -0
  1217. /package/out/{packages/replicache → replicache}/src/index-defs.js +0 -0
  1218. /package/out/{packages/replicache → replicache}/src/kv/expo-sqlite/store.js +0 -0
  1219. /package/out/{packages/replicache → replicache}/src/kv/idb-store-with-mem-fallback.js +0 -0
  1220. /package/out/{packages/replicache → replicache}/src/kv/idb-store.js +0 -0
  1221. /package/out/{packages/replicache → replicache}/src/kv/mem-store.js +0 -0
  1222. /package/out/{packages/replicache → replicache}/src/kv/op-sqlite/store.js +0 -0
  1223. /package/out/{packages/replicache → replicache}/src/kv/op-sqlite/types.js +0 -0
  1224. /package/out/{packages/replicache → replicache}/src/kv/read-impl.js +0 -0
  1225. /package/out/{packages/replicache → replicache}/src/kv/sqlite-store.js +0 -0
  1226. /package/out/{packages/replicache → replicache}/src/kv/throw-if-closed.js +0 -0
  1227. /package/out/{packages/replicache → replicache}/src/kv/write-impl-base.js +0 -0
  1228. /package/out/{packages/replicache → replicache}/src/kv/write-impl.js +0 -0
  1229. /package/out/{packages/replicache → replicache}/src/lazy.js +0 -0
  1230. /package/out/{packages/replicache → replicache}/src/log-options.js +0 -0
  1231. /package/out/{packages/replicache → replicache}/src/make-idb-name.js +0 -0
  1232. /package/out/{packages/replicache → replicache}/src/mutation-recovery.js +0 -0
  1233. /package/out/{packages/replicache → replicache}/src/new-client-channel.js +0 -0
  1234. /package/out/{packages/replicache → replicache}/src/on-persist-channel.js +0 -0
  1235. /package/out/{packages/replicache → replicache}/src/op-sqlite.js +0 -0
  1236. /package/out/{packages/replicache → replicache}/src/patch-operation.js +0 -0
  1237. /package/out/{packages/replicache → replicache}/src/pending-mutations.js +0 -0
  1238. /package/out/{packages/replicache → replicache}/src/persist/client-gc.js +0 -0
  1239. /package/out/{packages/replicache → replicache}/src/persist/client-group-gc.js +0 -0
  1240. /package/out/{packages/replicache → replicache}/src/persist/client-groups.js +0 -0
  1241. /package/out/{packages/replicache → replicache}/src/persist/clients.js +0 -0
  1242. /package/out/{packages/replicache → replicache}/src/persist/collect-idb-databases.js +0 -0
  1243. /package/out/{packages/replicache → replicache}/src/persist/gather-mem-only-visitor.js +0 -0
  1244. /package/out/{packages/replicache → replicache}/src/persist/gather-not-cached-visitor.js +0 -0
  1245. /package/out/{packages/replicache → replicache}/src/persist/heartbeat.js +0 -0
  1246. /package/out/{packages/replicache → replicache}/src/persist/idb-databases-store-db-name.js +0 -0
  1247. /package/out/{packages/replicache → replicache}/src/persist/idb-databases-store.js +0 -0
  1248. /package/out/{packages/replicache → replicache}/src/persist/make-client-id.js +0 -0
  1249. /package/out/{packages/replicache → replicache}/src/persist/persist.js +0 -0
  1250. /package/out/{packages/replicache → replicache}/src/persist/refresh.js +0 -0
  1251. /package/out/{packages/replicache → replicache}/src/process-scheduler.js +0 -0
  1252. /package/out/{packages/replicache → replicache}/src/pusher.js +0 -0
  1253. /package/out/{packages/replicache → replicache}/src/replicache-impl.js +0 -0
  1254. /package/out/{packages/replicache → replicache}/src/report-error.js +0 -0
  1255. /package/out/{packages/replicache → replicache}/src/request-idle.js +0 -0
  1256. /package/out/{packages/replicache → replicache}/src/scan-iterator.js +0 -0
  1257. /package/out/{packages/replicache → replicache}/src/scan-options.js +0 -0
  1258. /package/out/{packages/replicache → replicache}/src/set-interval-with-signal.js +0 -0
  1259. /package/out/{packages/replicache → replicache}/src/sqlite.js +0 -0
  1260. /package/out/{packages/replicache → replicache}/src/subscriptions.js +0 -0
  1261. /package/out/{packages/replicache → replicache}/src/sync/diff.js +0 -0
  1262. /package/out/{packages/replicache → replicache}/src/sync/ids.js +0 -0
  1263. /package/out/{packages/replicache → replicache}/src/sync/patch.js +0 -0
  1264. /package/out/{packages/replicache → replicache}/src/sync/pull-error.js +0 -0
  1265. /package/out/{packages/replicache → replicache}/src/sync/pull.js +0 -0
  1266. /package/out/{packages/replicache → replicache}/src/sync/push.js +0 -0
  1267. /package/out/{packages/replicache → replicache}/src/sync/request-id.js +0 -0
  1268. /package/out/{packages/replicache → replicache}/src/sync/sync-head-name.js +0 -0
  1269. /package/out/{packages/replicache → replicache}/src/to-error.js +0 -0
  1270. /package/out/{packages/replicache → replicache}/src/transaction-closed-error.js +0 -0
  1271. /package/out/{packages/replicache → replicache}/src/transactions.js +0 -0
  1272. /package/out/{packages/replicache → replicache}/src/version.js +0 -0
  1273. /package/out/{packages/replicache → replicache}/src/with-transactions.js +0 -0
  1274. /package/out/{packages/shared → shared}/src/abort-error.js +0 -0
  1275. /package/out/{packages/shared → shared}/src/arrays.js +0 -0
  1276. /package/out/{packages/shared → shared}/src/asserts.js +0 -0
  1277. /package/out/{packages/shared → shared}/src/bigint-json.js +0 -0
  1278. /package/out/{packages/shared → shared}/src/binary-search.js +0 -0
  1279. /package/out/{packages/shared → shared}/src/broadcast-channel.js +0 -0
  1280. /package/out/{packages/shared → shared}/src/browser-env.js +0 -0
  1281. /package/out/{packages/shared → shared}/src/btree-set.js +0 -0
  1282. /package/out/{packages/shared → shared}/src/cache.js +0 -0
  1283. /package/out/{packages/shared → shared}/src/centroid.js +0 -0
  1284. /package/out/{packages/shared → shared}/src/config.js +0 -0
  1285. /package/out/{packages/shared → shared}/src/custom-key-map.js +0 -0
  1286. /package/out/{packages/shared → shared}/src/custom-key-set.js +0 -0
  1287. /package/out/{packages/shared → shared}/src/deep-clone.js +0 -0
  1288. /package/out/{packages/shared → shared}/src/deep-merge.js +0 -0
  1289. /package/out/{packages/shared → shared}/src/document-visible.js +0 -0
  1290. /package/out/{packages/shared → shared}/src/dotenv.js +0 -0
  1291. /package/out/{packages/shared → shared}/src/error.js +0 -0
  1292. /package/out/{packages/shared → shared}/src/has-own.js +0 -0
  1293. /package/out/{packages/shared → shared}/src/hash.js +0 -0
  1294. /package/out/{packages/shared → shared}/src/json-schema.js +0 -0
  1295. /package/out/{packages/shared → shared}/src/json.js +0 -0
  1296. /package/out/{packages/shared → shared}/src/logging-test-utils.js +0 -0
  1297. /package/out/{packages/shared → shared}/src/logging.js +0 -0
  1298. /package/out/{packages/shared → shared}/src/map.js +0 -0
  1299. /package/out/{packages/shared → shared}/src/must.js +0 -0
  1300. /package/out/{packages/shared → shared}/src/navigator.js +0 -0
  1301. /package/out/{packages/shared → shared}/src/object-traversal.js +0 -0
  1302. /package/out/{packages/shared → shared}/src/objects.js +0 -0
  1303. /package/out/{packages/shared → shared}/src/options.js +0 -0
  1304. /package/out/{packages/shared → shared}/src/parse-big-int.js +0 -0
  1305. /package/out/{packages/shared → shared}/src/promise-race.js +0 -0
  1306. /package/out/{packages/shared → shared}/src/queue.js +0 -0
  1307. /package/out/{packages/shared → shared}/src/rand.js +0 -0
  1308. /package/out/{packages/shared → shared}/src/random-uint64.js +0 -0
  1309. /package/out/{packages/shared → shared}/src/random-values.js +0 -0
  1310. /package/out/{packages/shared → shared}/src/record-proxy.js +0 -0
  1311. /package/out/{packages/shared → shared}/src/resolved-promises.js +0 -0
  1312. /package/out/{packages/shared → shared}/src/ring-buffer.js +0 -0
  1313. /package/out/{packages/shared → shared}/src/sentinels.js +0 -0
  1314. /package/out/{packages/shared → shared}/src/set-utils.js +0 -0
  1315. /package/out/{packages/shared → shared}/src/size-of-value.js +0 -0
  1316. /package/out/{packages/shared → shared}/src/sleep.js +0 -0
  1317. /package/out/{packages/shared → shared}/src/sorted-entries.js +0 -0
  1318. /package/out/{packages/shared → shared}/src/string-compare.js +0 -0
  1319. /package/out/{packages/shared → shared}/src/subscribable.js +0 -0
  1320. /package/out/{packages/shared → shared}/src/tdigest-schema.js +0 -0
  1321. /package/out/{packages/shared → shared}/src/tdigest.js +0 -0
  1322. /package/out/{packages/z2s → z2s}/src/compiler.js +0 -0
  1323. /package/out/{packages/z2s → z2s}/src/sql.js +0 -0
  1324. /package/out/{packages/zero → zero}/src/server/runner/main.js +0 -0
  1325. /package/out/{packages/zero-cache → zero-cache}/src/auth/auth.js +0 -0
  1326. /package/out/{packages/zero-cache → zero-cache}/src/auth/jwt.js +0 -0
  1327. /package/out/{packages/zero-cache → zero-cache}/src/auth/load-permissions.js +0 -0
  1328. /package/out/{packages/zero-cache → zero-cache}/src/auth/read-authorizer.js +0 -0
  1329. /package/out/{packages/zero-cache → zero-cache}/src/auth/write-authorizer.js +0 -0
  1330. /package/out/{packages/zero-cache → zero-cache}/src/config/network.js +0 -0
  1331. /package/out/{packages/zero-cache → zero-cache}/src/config/normalize.js +0 -0
  1332. /package/out/{packages/zero-cache → zero-cache}/src/config/server-context.js +0 -0
  1333. /package/out/{packages/zero-cache → zero-cache}/src/config/zero-config.js +0 -0
  1334. /package/out/{packages/zero-cache → zero-cache}/src/custom/fetch.js +0 -0
  1335. /package/out/{packages/zero-cache → zero-cache}/src/custom-queries/transform-query.js +0 -0
  1336. /package/out/{packages/zero-cache → zero-cache}/src/db/create.js +0 -0
  1337. /package/out/{packages/zero-cache → zero-cache}/src/db/delete-lite-db.js +0 -0
  1338. /package/out/{packages/zero-cache → zero-cache}/src/db/lite-tables.js +0 -0
  1339. /package/out/{packages/zero-cache → zero-cache}/src/db/migration-lite.js +0 -0
  1340. /package/out/{packages/zero-cache → zero-cache}/src/db/migration.js +0 -0
  1341. /package/out/{packages/zero-cache → zero-cache}/src/db/mode-enum.js +0 -0
  1342. /package/out/{packages/zero-cache → zero-cache}/src/db/pg-copy-binary.js +0 -0
  1343. /package/out/{packages/zero-cache → zero-cache}/src/db/pg-copy.js +0 -0
  1344. /package/out/{packages/zero-cache → zero-cache}/src/db/pg-to-lite.js +0 -0
  1345. /package/out/{packages/zero-cache → zero-cache}/src/db/pg-type-parser.js +0 -0
  1346. /package/out/{packages/zero-cache → zero-cache}/src/db/run-transaction.js +0 -0
  1347. /package/out/{packages/zero-cache → zero-cache}/src/db/specs.js +0 -0
  1348. /package/out/{packages/zero-cache → zero-cache}/src/db/statements.js +0 -0
  1349. /package/out/{packages/zero-cache → zero-cache}/src/db/transaction-pool.js +0 -0
  1350. /package/out/{packages/zero-cache → zero-cache}/src/db/warmup.js +0 -0
  1351. /package/out/{packages/zero-cache → zero-cache}/src/observability/events.js +0 -0
  1352. /package/out/{packages/zero-cache → zero-cache}/src/observability/metrics.js +0 -0
  1353. /package/out/{packages/zero-cache → zero-cache}/src/scripts/decommission.js +0 -0
  1354. /package/out/{packages/zero-cache → zero-cache}/src/scripts/deploy-permissions.js +0 -0
  1355. /package/out/{packages/zero-cache → zero-cache}/src/server/inspector-delegate.js +0 -0
  1356. /package/out/{packages/zero-cache → zero-cache}/src/server/logging.js +0 -0
  1357. /package/out/{packages/zero-cache → zero-cache}/src/server/otel-diag-logger.js +0 -0
  1358. /package/out/{packages/zero-cache → zero-cache}/src/server/otel-log-sink.js +0 -0
  1359. /package/out/{packages/zero-cache → zero-cache}/src/server/priority-op.js +0 -0
  1360. /package/out/{packages/zero-cache → zero-cache}/src/server/runner/main.js +0 -0
  1361. /package/out/{packages/zero-cache → zero-cache}/src/server/runner/run-worker.js +0 -0
  1362. /package/out/{packages/zero-cache → zero-cache}/src/server/runner/runtime.js +0 -0
  1363. /package/out/{packages/zero-cache → zero-cache}/src/server/runner/zero-dispatcher.js +0 -0
  1364. /package/out/{packages/zero-cache → zero-cache}/src/server/worker-dispatcher.js +0 -0
  1365. /package/out/{packages/zero-cache → zero-cache}/src/server/worker-urls.js +0 -0
  1366. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/common/backfill-manager.js +0 -0
  1367. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/common/change-stream-multiplexer.js +0 -0
  1368. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/common/replica-schema.js +0 -0
  1369. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/custom/change-source.js +0 -0
  1370. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/backfill-metadata.js +0 -0
  1371. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/backfill-stream.js +0 -0
  1372. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/change-source.js +0 -0
  1373. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/decommission.js +0 -0
  1374. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/initial-sync.js +0 -0
  1375. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/logical-replication/binary-reader.js +0 -0
  1376. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/logical-replication/pgoutput-parser.js +0 -0
  1377. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/logical-replication/stream.js +0 -0
  1378. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/lsn.js +0 -0
  1379. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/replication-slots.js +0 -0
  1380. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/schema/ddl.js +0 -0
  1381. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/schema/init.js +0 -0
  1382. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/schema/published.js +0 -0
  1383. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/schema/shard.js +0 -0
  1384. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/schema/validation.js +0 -0
  1385. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/protocol/current/control.js +0 -0
  1386. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/protocol/current/data.js +0 -0
  1387. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/protocol/current/downstream.js +0 -0
  1388. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/protocol/current/json.js +0 -0
  1389. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/protocol/current/path.js +0 -0
  1390. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/protocol/current/status.js +0 -0
  1391. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/protocol/current/upstream.js +0 -0
  1392. /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/protocol/mod.js +0 -0
  1393. /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/backup-monitor.js +0 -0
  1394. /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/broadcast.js +0 -0
  1395. /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/change-streamer-http.js +0 -0
  1396. /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/change-streamer-service.js +0 -0
  1397. /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/change-streamer.js +0 -0
  1398. /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/forwarder.js +0 -0
  1399. /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/replica-monitor.js +0 -0
  1400. /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/schema/init.js +0 -0
  1401. /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/schema/tables.js +0 -0
  1402. /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/snapshot.js +0 -0
  1403. /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/storer.js +0 -0
  1404. /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/subscriber.js +0 -0
  1405. /package/out/{packages/zero-cache → zero-cache}/src/services/heapz.js +0 -0
  1406. /package/out/{packages/zero-cache → zero-cache}/src/services/http-service.js +0 -0
  1407. /package/out/{packages/zero-cache → zero-cache}/src/services/life-cycle.js +0 -0
  1408. /package/out/{packages/zero-cache → zero-cache}/src/services/limiter/sliding-window-limiter.js +0 -0
  1409. /package/out/{packages/zero-cache → zero-cache}/src/services/litestream/commands.js +0 -0
  1410. /package/out/{packages/zero-cache → zero-cache}/src/services/mutagen/error.js +0 -0
  1411. /package/out/{packages/zero-cache → zero-cache}/src/services/mutagen/mutagen.js +0 -0
  1412. /package/out/{packages/zero-cache → zero-cache}/src/services/mutagen/pusher.js +0 -0
  1413. /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/change-processor.js +0 -0
  1414. /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/incremental-sync.js +0 -0
  1415. /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/notifier.js +0 -0
  1416. /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/replication-status.js +0 -0
  1417. /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/replicator.js +0 -0
  1418. /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/reporter/recorder.js +0 -0
  1419. /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/reporter/report-schema.js +0 -0
  1420. /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/schema/change-log.js +0 -0
  1421. /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/schema/column-metadata.js +0 -0
  1422. /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/schema/constants.js +0 -0
  1423. /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/schema/replication-state.js +0 -0
  1424. /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/schema/table-metadata.js +0 -0
  1425. /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/write-worker-client.js +0 -0
  1426. /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/write-worker.js +0 -0
  1427. /package/out/{packages/zero-cache → zero-cache}/src/services/run-ast.js +0 -0
  1428. /package/out/{packages/zero-cache → zero-cache}/src/services/runner.js +0 -0
  1429. /package/out/{packages/zero-cache → zero-cache}/src/services/running-state.js +0 -0
  1430. /package/out/{packages/zero-cache → zero-cache}/src/services/shadow-sync/shadow-sync-service.js +0 -0
  1431. /package/out/{packages/zero-cache → zero-cache}/src/services/statz.js +0 -0
  1432. /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/active-users-gauge.js +0 -0
  1433. /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/client-handler.js +0 -0
  1434. /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/client-schema.js +0 -0
  1435. /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/connection-context-manager.js +0 -0
  1436. /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/cvr-purger.js +0 -0
  1437. /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/cvr.js +0 -0
  1438. /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/drain-coordinator.js +0 -0
  1439. /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/pipeline-driver.js +0 -0
  1440. /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/row-record-cache.js +0 -0
  1441. /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/row-set-signature.js +0 -0
  1442. /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/schema/cvr.js +0 -0
  1443. /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/schema/init.js +0 -0
  1444. /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/schema/types.js +0 -0
  1445. /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/snapshotter.js +0 -0
  1446. /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/tracer.js +0 -0
  1447. /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/ttl-clock.js +0 -0
  1448. /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/view-syncer.js +0 -0
  1449. /package/out/{packages/zero-cache → zero-cache}/src/types/configuration-error.js +0 -0
  1450. /package/out/{packages/zero-cache → zero-cache}/src/types/error-with-level.js +0 -0
  1451. /package/out/{packages/zero-cache → zero-cache}/src/types/http.js +0 -0
  1452. /package/out/{packages/zero-cache → zero-cache}/src/types/lexi-version.js +0 -0
  1453. /package/out/{packages/zero-cache → zero-cache}/src/types/lite.js +0 -0
  1454. /package/out/{packages/zero-cache → zero-cache}/src/types/names.js +0 -0
  1455. /package/out/{packages/zero-cache → zero-cache}/src/types/pg-data-type.js +0 -0
  1456. /package/out/{packages/zero-cache → zero-cache}/src/types/pg-types.js +0 -0
  1457. /package/out/{packages/zero-cache → zero-cache}/src/types/pg-versions.js +0 -0
  1458. /package/out/{packages/zero-cache → zero-cache}/src/types/pg.js +0 -0
  1459. /package/out/{packages/zero-cache → zero-cache}/src/types/processes.js +0 -0
  1460. /package/out/{packages/zero-cache → zero-cache}/src/types/profiler.js +0 -0
  1461. /package/out/{packages/zero-cache → zero-cache}/src/types/row-key.js +0 -0
  1462. /package/out/{packages/zero-cache → zero-cache}/src/types/shards.js +0 -0
  1463. /package/out/{packages/zero-cache → zero-cache}/src/types/sql.js +0 -0
  1464. /package/out/{packages/zero-cache → zero-cache}/src/types/state-version.js +0 -0
  1465. /package/out/{packages/zero-cache → zero-cache}/src/types/streams.js +0 -0
  1466. /package/out/{packages/zero-cache → zero-cache}/src/types/strings.js +0 -0
  1467. /package/out/{packages/zero-cache → zero-cache}/src/types/subscription.js +0 -0
  1468. /package/out/{packages/zero-cache → zero-cache}/src/types/timeout.js +0 -0
  1469. /package/out/{packages/zero-cache → zero-cache}/src/types/url-params.js +0 -0
  1470. /package/out/{packages/zero-cache → zero-cache}/src/types/websocket-handoff.js +0 -0
  1471. /package/out/{packages/zero-cache → zero-cache}/src/types/ws.js +0 -0
  1472. /package/out/{packages/zero-cache → zero-cache}/src/workers/connect-params.js +0 -0
  1473. /package/out/{packages/zero-cache → zero-cache}/src/workers/connection.js +0 -0
  1474. /package/out/{packages/zero-cache → zero-cache}/src/workers/mutator.js +0 -0
  1475. /package/out/{packages/zero-cache → zero-cache}/src/workers/replicator.js +0 -0
  1476. /package/out/{packages/zero-cache → zero-cache}/src/workers/syncer-ws-message-handler.js +0 -0
  1477. /package/out/{packages/zero-cache → zero-cache}/src/workers/syncer.js +0 -0
  1478. /package/out/{packages/zero-client → zero-client}/src/client/active-clients-manager.js +0 -0
  1479. /package/out/{packages/zero-client → zero-client}/src/client/bindings.js +0 -0
  1480. /package/out/{packages/zero-client → zero-client}/src/client/client-error-kind-enum.js +0 -0
  1481. /package/out/{packages/zero-client → zero-client}/src/client/connection-manager.js +0 -0
  1482. /package/out/{packages/zero-client → zero-client}/src/client/connection.js +0 -0
  1483. /package/out/{packages/zero-client → zero-client}/src/client/context.js +0 -0
  1484. /package/out/{packages/zero-client → zero-client}/src/client/crud.js +0 -0
  1485. /package/out/{packages/zero-client → zero-client}/src/client/custom.js +0 -0
  1486. /package/out/{packages/zero-client → zero-client}/src/client/delete-clients-manager.js +0 -0
  1487. /package/out/{packages/zero-client → zero-client}/src/client/enable-analytics.js +0 -0
  1488. /package/out/{packages/zero-client → zero-client}/src/client/error.js +0 -0
  1489. /package/out/{packages/zero-client → zero-client}/src/client/http-string.js +0 -0
  1490. /package/out/{packages/zero-client → zero-client}/src/client/inspector/client-group.js +0 -0
  1491. /package/out/{packages/zero-client → zero-client}/src/client/inspector/client.js +0 -0
  1492. /package/out/{packages/zero-client → zero-client}/src/client/inspector/html-dialog-prompt.js +0 -0
  1493. /package/out/{packages/zero-client → zero-client}/src/client/inspector/inspector.js +0 -0
  1494. /package/out/{packages/zero-client → zero-client}/src/client/inspector/lazy-inspector.js +0 -0
  1495. /package/out/{packages/zero-client → zero-client}/src/client/inspector/query.js +0 -0
  1496. /package/out/{packages/zero-client → zero-client}/src/client/ivm-branch.js +0 -0
  1497. /package/out/{packages/zero-client → zero-client}/src/client/keys.js +0 -0
  1498. /package/out/{packages/zero-client → zero-client}/src/client/log-options.js +0 -0
  1499. /package/out/{packages/zero-client → zero-client}/src/client/make-mutate-property.js +0 -0
  1500. /package/out/{packages/zero-client → zero-client}/src/client/make-replicache-mutators.js +0 -0
  1501. /package/out/{packages/zero-client → zero-client}/src/client/metric-name-enum.js +0 -0
  1502. /package/out/{packages/zero-client → zero-client}/src/client/metrics.js +0 -0
  1503. /package/out/{packages/zero-client → zero-client}/src/client/mutation-tracker.js +0 -0
  1504. /package/out/{packages/zero-client → zero-client}/src/client/mutator-proxy.js +0 -0
  1505. /package/out/{packages/zero-client → zero-client}/src/client/options.js +0 -0
  1506. /package/out/{packages/zero-client → zero-client}/src/client/query-manager.js +0 -0
  1507. /package/out/{packages/zero-client → zero-client}/src/client/reload-error-handler.js +0 -0
  1508. /package/out/{packages/zero-client → zero-client}/src/client/server-option.js +0 -0
  1509. /package/out/{packages/zero-client → zero-client}/src/client/zero-poke-handler.js +0 -0
  1510. /package/out/{packages/zero-client → zero-client}/src/client/zero-rep.js +0 -0
  1511. /package/out/{packages/zero-client → zero-client}/src/client/zero.js +0 -0
  1512. /package/out/{packages/zero-client → zero-client}/src/mod.js +0 -0
  1513. /package/out/{packages/zero-client → zero-client}/src/util/nanoid.js +0 -0
  1514. /package/out/{packages/zero-pg → zero-pg}/src/mod.js +0 -0
  1515. /package/out/{packages/zero-protocol → zero-protocol}/src/analyze-query-result.js +0 -0
  1516. /package/out/{packages/zero-protocol → zero-protocol}/src/application-error.js +0 -0
  1517. /package/out/{packages/zero-protocol → zero-protocol}/src/ast.js +0 -0
  1518. /package/out/{packages/zero-protocol → zero-protocol}/src/change-desired-queries.js +0 -0
  1519. /package/out/{packages/zero-protocol → zero-protocol}/src/client-schema.js +0 -0
  1520. /package/out/{packages/zero-protocol → zero-protocol}/src/close-connection.js +0 -0
  1521. /package/out/{packages/zero-protocol → zero-protocol}/src/connect.js +0 -0
  1522. /package/out/{packages/zero-protocol → zero-protocol}/src/custom-queries.js +0 -0
  1523. /package/out/{packages/zero-protocol → zero-protocol}/src/data.js +0 -0
  1524. /package/out/{packages/zero-protocol → zero-protocol}/src/delete-clients.js +0 -0
  1525. /package/out/{packages/zero-protocol → zero-protocol}/src/down.js +0 -0
  1526. /package/out/{packages/zero-protocol → zero-protocol}/src/error-kind-enum.js +0 -0
  1527. /package/out/{packages/zero-protocol → zero-protocol}/src/error-origin-enum.js +0 -0
  1528. /package/out/{packages/zero-protocol → zero-protocol}/src/error-reason-enum.js +0 -0
  1529. /package/out/{packages/zero-protocol → zero-protocol}/src/error.js +0 -0
  1530. /package/out/{packages/zero-protocol → zero-protocol}/src/inspect-down.js +0 -0
  1531. /package/out/{packages/zero-protocol → zero-protocol}/src/inspect-up.js +0 -0
  1532. /package/out/{packages/zero-protocol → zero-protocol}/src/mutate-server.js +0 -0
  1533. /package/out/{packages/zero-protocol → zero-protocol}/src/mutation-id.js +0 -0
  1534. /package/out/{packages/zero-protocol → zero-protocol}/src/mutation-type-enum.js +0 -0
  1535. /package/out/{packages/zero-protocol → zero-protocol}/src/mutation.js +0 -0
  1536. /package/out/{packages/zero-protocol → zero-protocol}/src/mutations-patch.js +0 -0
  1537. /package/out/{packages/zero-protocol → zero-protocol}/src/ping.js +0 -0
  1538. /package/out/{packages/zero-protocol → zero-protocol}/src/poke.js +0 -0
  1539. /package/out/{packages/zero-protocol → zero-protocol}/src/pong.js +0 -0
  1540. /package/out/{packages/zero-protocol → zero-protocol}/src/primary-key.js +0 -0
  1541. /package/out/{packages/zero-protocol → zero-protocol}/src/protocol-version.js +0 -0
  1542. /package/out/{packages/zero-protocol → zero-protocol}/src/pull.js +0 -0
  1543. /package/out/{packages/zero-protocol → zero-protocol}/src/push.js +0 -0
  1544. /package/out/{packages/zero-protocol → zero-protocol}/src/queries-patch.js +0 -0
  1545. /package/out/{packages/zero-protocol → zero-protocol}/src/query-hash.js +0 -0
  1546. /package/out/{packages/zero-protocol → zero-protocol}/src/query-server.js +0 -0
  1547. /package/out/{packages/zero-protocol → zero-protocol}/src/row-patch.js +0 -0
  1548. /package/out/{packages/zero-protocol → zero-protocol}/src/up.js +0 -0
  1549. /package/out/{packages/zero-protocol → zero-protocol}/src/update-auth.js +0 -0
  1550. /package/out/{packages/zero-protocol → zero-protocol}/src/version.js +0 -0
  1551. /package/out/{packages/zero-react → zero-react}/src/bindings.js +0 -0
  1552. /package/out/{packages/zero-react → zero-react}/src/mod.js +0 -0
  1553. /package/out/{packages/zero-react → zero-react}/src/zero.js +0 -0
  1554. /package/out/{packages/zero-schema → zero-schema}/src/builder/relationship-builder.js +0 -0
  1555. /package/out/{packages/zero-schema → zero-schema}/src/builder/schema-builder.js +0 -0
  1556. /package/out/{packages/zero-schema → zero-schema}/src/builder/table-builder.js +0 -0
  1557. /package/out/{packages/zero-schema → zero-schema}/src/compiled-permissions.js +0 -0
  1558. /package/out/{packages/zero-schema → zero-schema}/src/name-mapper.js +0 -0
  1559. /package/out/{packages/zero-schema → zero-schema}/src/permissions.js +0 -0
  1560. /package/out/{packages/zero-schema → zero-schema}/src/schema-config.js +0 -0
  1561. /package/out/{packages/zero-server → zero-server}/src/adapters/drizzle.js +0 -0
  1562. /package/out/{packages/zero-server → zero-server}/src/adapters/kysely.js +0 -0
  1563. /package/out/{packages/zero-server → zero-server}/src/adapters/postgresjs.js +0 -0
  1564. /package/out/{packages/zero-server → zero-server}/src/adapters/prisma.js +0 -0
  1565. /package/out/{packages/zero-server → zero-server}/src/custom.js +0 -0
  1566. /package/out/{packages/zero-server → zero-server}/src/logging.js +0 -0
  1567. /package/out/{packages/zero-server → zero-server}/src/mod.js +0 -0
  1568. /package/out/{packages/zero-server → zero-server}/src/pg-query-executor.js +0 -0
  1569. /package/out/{packages/zero-server → zero-server}/src/process-mutations.js +0 -0
  1570. /package/out/{packages/zero-server → zero-server}/src/push-processor.js +0 -0
  1571. /package/out/{packages/zero-server → zero-server}/src/queries/process-queries.js +0 -0
  1572. /package/out/{packages/zero-server → zero-server}/src/schema.js +0 -0
  1573. /package/out/{packages/zero-server → zero-server}/src/zql-database.js +0 -0
  1574. /package/out/{packages/zero-solid → zero-solid}/src/bindings.js +0 -0
  1575. /package/out/{packages/zero-solid → zero-solid}/src/mod.js +0 -0
  1576. /package/out/{packages/zero-solid → zero-solid}/src/zero.js +0 -0
  1577. /package/out/{packages/zero-types → zero-types}/src/format.js +0 -0
  1578. /package/out/{packages/zero-types → zero-types}/src/name-mapper.js +0 -0
  1579. /package/out/{packages/zql → zql}/src/builder/builder.js +0 -0
  1580. /package/out/{packages/zql → zql}/src/builder/debug-delegate.js +0 -0
  1581. /package/out/{packages/zql → zql}/src/builder/filter.js +0 -0
  1582. /package/out/{packages/zql → zql}/src/builder/like.js +0 -0
  1583. /package/out/{packages/zql → zql}/src/error.js +0 -0
  1584. /package/out/{packages/zql → zql}/src/ivm/array-view.js +0 -0
  1585. /package/out/{packages/zql → zql}/src/ivm/cap.js +0 -0
  1586. /package/out/{packages/zql → zql}/src/ivm/change.js +0 -0
  1587. /package/out/{packages/zql → zql}/src/ivm/constraint.js +0 -0
  1588. /package/out/{packages/zql → zql}/src/ivm/data.js +0 -0
  1589. /package/out/{packages/zql → zql}/src/ivm/exists.js +0 -0
  1590. /package/out/{packages/zql → zql}/src/ivm/fan-in.js +0 -0
  1591. /package/out/{packages/zql → zql}/src/ivm/fan-out.js +0 -0
  1592. /package/out/{packages/zql → zql}/src/ivm/filter-operators.js +0 -0
  1593. /package/out/{packages/zql → zql}/src/ivm/filter-push.js +0 -0
  1594. /package/out/{packages/zql → zql}/src/ivm/filter.js +0 -0
  1595. /package/out/{packages/zql → zql}/src/ivm/flipped-join.js +0 -0
  1596. /package/out/{packages/zql → zql}/src/ivm/join-utils.js +0 -0
  1597. /package/out/{packages/zql → zql}/src/ivm/join.js +0 -0
  1598. /package/out/{packages/zql → zql}/src/ivm/maybe-split-and-push-edit-change.js +0 -0
  1599. /package/out/{packages/zql → zql}/src/ivm/memory-source.js +0 -0
  1600. /package/out/{packages/zql → zql}/src/ivm/memory-storage.js +0 -0
  1601. /package/out/{packages/zql → zql}/src/ivm/operator.js +0 -0
  1602. /package/out/{packages/zql → zql}/src/ivm/push-accumulated.js +0 -0
  1603. /package/out/{packages/zql → zql}/src/ivm/skip-yields.js +0 -0
  1604. /package/out/{packages/zql → zql}/src/ivm/skip.js +0 -0
  1605. /package/out/{packages/zql → zql}/src/ivm/source.js +0 -0
  1606. /package/out/{packages/zql → zql}/src/ivm/stream.js +0 -0
  1607. /package/out/{packages/zql → zql}/src/ivm/take.js +0 -0
  1608. /package/out/{packages/zql → zql}/src/ivm/union-fan-in.js +0 -0
  1609. /package/out/{packages/zql → zql}/src/ivm/union-fan-out.js +0 -0
  1610. /package/out/{packages/zql → zql}/src/ivm/view-apply-change.js +0 -0
  1611. /package/out/{packages/zql → zql}/src/mutate/crud.js +0 -0
  1612. /package/out/{packages/zql → zql}/src/mutate/custom.js +0 -0
  1613. /package/out/{packages/zql → zql}/src/mutate/mutator-registry.js +0 -0
  1614. /package/out/{packages/zql → zql}/src/mutate/mutator.js +0 -0
  1615. /package/out/{packages/zql → zql}/src/planner/planner-builder.js +0 -0
  1616. /package/out/{packages/zql → zql}/src/planner/planner-connection.js +0 -0
  1617. /package/out/{packages/zql → zql}/src/planner/planner-constraint.js +0 -0
  1618. /package/out/{packages/zql → zql}/src/planner/planner-debug.js +0 -0
  1619. /package/out/{packages/zql → zql}/src/planner/planner-fan-in.js +0 -0
  1620. /package/out/{packages/zql → zql}/src/planner/planner-fan-out.js +0 -0
  1621. /package/out/{packages/zql → zql}/src/planner/planner-graph.js +0 -0
  1622. /package/out/{packages/zql → zql}/src/planner/planner-join.js +0 -0
  1623. /package/out/{packages/zql → zql}/src/planner/planner-node.js +0 -0
  1624. /package/out/{packages/zql → zql}/src/planner/planner-source.js +0 -0
  1625. /package/out/{packages/zql → zql}/src/planner/planner-terminus.js +0 -0
  1626. /package/out/{packages/zql → zql}/src/query/complete-ordering.js +0 -0
  1627. /package/out/{packages/zql → zql}/src/query/create-builder.js +0 -0
  1628. /package/out/{packages/zql → zql}/src/query/error.js +0 -0
  1629. /package/out/{packages/zql → zql}/src/query/escape-like.js +0 -0
  1630. /package/out/{packages/zql → zql}/src/query/expression.js +0 -0
  1631. /package/out/{packages/zql → zql}/src/query/measure-push-operator.js +0 -0
  1632. /package/out/{packages/zql → zql}/src/query/metrics-delegate.js +0 -0
  1633. /package/out/{packages/zql → zql}/src/query/named.js +0 -0
  1634. /package/out/{packages/zql → zql}/src/query/query-delegate-base.js +0 -0
  1635. /package/out/{packages/zql → zql}/src/query/query-impl.js +0 -0
  1636. /package/out/{packages/zql → zql}/src/query/query-internals.js +0 -0
  1637. /package/out/{packages/zql → zql}/src/query/query-registry.js +0 -0
  1638. /package/out/{packages/zql → zql}/src/query/query.js +0 -0
  1639. /package/out/{packages/zql → zql}/src/query/runnable-query-impl.js +0 -0
  1640. /package/out/{packages/zql → zql}/src/query/static-query.js +0 -0
  1641. /package/out/{packages/zql → zql}/src/query/ttl.js +0 -0
  1642. /package/out/{packages/zql → zql}/src/query/validate-input.js +0 -0
  1643. /package/out/{packages/zqlite → zqlite}/src/database-storage.js +0 -0
  1644. /package/out/{packages/zqlite → zqlite}/src/db.js +0 -0
  1645. /package/out/{packages/zqlite → zqlite}/src/explain-queries.js +0 -0
  1646. /package/out/{packages/zqlite → zqlite}/src/internal/sql-inline.js +0 -0
  1647. /package/out/{packages/zqlite → zqlite}/src/internal/sql.js +0 -0
  1648. /package/out/{packages/zqlite → zqlite}/src/internal/statement-cache.js +0 -0
  1649. /package/out/{packages/zqlite → zqlite}/src/mod.js +0 -0
  1650. /package/out/{packages/zqlite → zqlite}/src/query-builder.js +0 -0
  1651. /package/out/{packages/zqlite → zqlite}/src/query-delegate.js +0 -0
  1652. /package/out/{packages/zqlite → zqlite}/src/resolve-scalar-subqueries.js +0 -0
  1653. /package/out/{packages/zqlite → zqlite}/src/sqlite-cost-model.js +0 -0
  1654. /package/out/{packages/zqlite → zqlite}/src/sqlite-stat-fanout.js +0 -0
  1655. /package/out/{packages/zqlite → zqlite}/src/table-source.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","names":["#childNodeSize","#splice","#mergeAndPartition","#replaceChild"],"sources":["../../../../../replicache/src/btree/node.ts"],"sourcesContent":["import {compareUTF8} from 'compare-utf8';\nimport {\n assert,\n assertArray,\n assertNumber,\n assertString,\n} from '../../../shared/src/asserts.ts';\nimport {binarySearch as binarySearchWithFunc} from '../../../shared/src/binary-search.ts';\nimport type {Enum} from '../../../shared/src/enum.ts';\nimport {joinIterables} from '../../../shared/src/iterables.ts';\nimport {\n type JSONValue,\n type ReadonlyJSONValue,\n assertJSONValue,\n} from '../../../shared/src/json.ts';\nimport {skipBTreeNodeAsserts} from '../config.ts';\nimport type {IndexKey} from '../db/index.ts';\nimport * as FormatVersion from '../format-version-enum.ts';\nimport {\n type FrozenJSONValue,\n type FrozenTag,\n assertDeepFrozen,\n deepFreeze,\n} from '../frozen-json.ts';\nimport {type Hash, emptyHash, newRandomHash} from '../hash.ts';\nimport type {BTreeRead} from './read.ts';\nimport type {BTreeWrite} from './write.ts';\n\ntype FormatVersion = Enum<typeof FormatVersion>;\n\nexport type Entry<V> = readonly [key: string, value: V, sizeOfEntry: number];\n\nexport const NODE_LEVEL = 0;\nexport const NODE_ENTRIES = 1;\n\n/**\n * The type of B+Tree node chunk data\n */\ntype BaseNode<V> = FrozenTag<\n readonly [level: number, entries: ReadonlyArray<Entry<V>>]\n>;\nexport type InternalNode = BaseNode<Hash>;\n\nexport type DataNode = BaseNode<FrozenJSONValue>;\n\nexport function makeNodeChunkData<V>(\n level: number,\n entries: ReadonlyArray<Entry<V>>,\n formatVersion: FormatVersion,\n): BaseNode<V> {\n return deepFreeze([\n level,\n (formatVersion >= FormatVersion.V7\n ? entries\n : entries.map(e => e.slice(0, 2))) as readonly ReadonlyJSONValue[],\n ]) as BaseNode<V>;\n}\n\nexport type Node = DataNode | InternalNode;\n\n/**\n * Describes the changes that happened to Replicache after a\n * {@link WriteTransaction} was committed.\n *\n * @experimental This type is experimental and may change in the future.\n */\nexport type Diff = IndexDiff | NoIndexDiff;\n\n/**\n * @experimental This type is experimental and may change in the future.\n */\nexport type IndexDiff = readonly DiffOperation<IndexKey>[];\n\n/**\n * @experimental This type is experimental and may change in the future.\n */\nexport type NoIndexDiff = readonly DiffOperation<string>[];\n\n/**\n * InternalDiff uses string keys even for the secondary index maps.\n */\nexport type InternalDiff = readonly InternalDiffOperation[];\n\nexport type DiffOperationAdd<Key, Value = ReadonlyJSONValue> = {\n readonly op: 'add';\n readonly key: Key;\n readonly newValue: Value;\n};\n\nexport type DiffOperationDel<Key, Value = ReadonlyJSONValue> = {\n readonly op: 'del';\n readonly key: Key;\n readonly oldValue: Value;\n};\n\nexport type DiffOperationChange<Key, Value = ReadonlyJSONValue> = {\n readonly op: 'change';\n readonly key: Key;\n readonly oldValue: Value;\n readonly newValue: Value;\n};\n\n/**\n * The individual parts describing the changes that happened to the Replicache\n * data. There are three different kinds of operations:\n * - `add`: A new entry was added.\n * - `del`: An entry was deleted.\n * - `change`: An entry was changed.\n *\n * @experimental This type is experimental and may change in the future.\n */\nexport type DiffOperation<Key> =\n | DiffOperationAdd<Key>\n | DiffOperationDel<Key>\n | DiffOperationChange<Key>;\n\n// Duplicated with DiffOperation to make the docs less confusing.\nexport type InternalDiffOperation<Key = string, Value = FrozenJSONValue> =\n | DiffOperationAdd<Key, Value>\n | DiffOperationDel<Key, Value>\n | DiffOperationChange<Key, Value>;\n\n/**\n * Finds the leaf where a key is (if present) or where it should go if not\n * present.\n */\nexport async function findLeaf(\n key: string,\n hash: Hash,\n source: BTreeRead,\n expectedRootHash: Hash,\n): Promise<DataNodeImpl> {\n const node = await source.getNode(hash);\n // The root changed. Try again\n if (expectedRootHash !== source.rootHash) {\n return findLeaf(key, source.rootHash, source, source.rootHash);\n }\n if (isDataNodeImpl(node)) {\n return node;\n }\n const {entries} = node;\n let i = binarySearch(key, entries);\n if (i === entries.length) {\n i--;\n }\n const entry = entries[i];\n return findLeaf(key, entry[1], source, expectedRootHash);\n}\n\ntype BinarySearchEntries = readonly Entry<unknown>[];\n\n/**\n * Does a binary search over entries\n *\n * If the key found then the return value is the index it was found at.\n *\n * If the key was *not* found then the return value is the index where it should\n * be inserted at\n */\nexport function binarySearch(\n key: string,\n entries: BinarySearchEntries,\n): number {\n return binarySearchFrom(key, entries, 0);\n}\n\n/**\n * Binary search starting from a given index.\n */\nfunction binarySearchFrom(\n key: string,\n entries: BinarySearchEntries,\n start: number,\n): number {\n const result = binarySearchWithFunc(entries.length - start, i =>\n compareUTF8(key, entries[start + i][0]),\n );\n return start + result;\n}\n\nexport function binarySearchFound(\n i: number,\n entries: BinarySearchEntries,\n key: string,\n): boolean {\n return i !== entries.length && entries[i][0] === key;\n}\n\nexport function parseBTreeNode(\n v: unknown,\n formatVersion: FormatVersion,\n getSizeOfEntry: <K, V>(key: K, value: V) => number,\n): InternalNode | DataNode {\n if (skipBTreeNodeAsserts && formatVersion >= FormatVersion.V7) {\n return v as InternalNode | DataNode;\n }\n\n assertArray(v);\n assertDeepFrozen(v);\n // Be relaxed about what we accept.\n assert(v.length >= 2, 'Expected node array to have at least 2 elements');\n const [level, entries] = v;\n assertNumber(level);\n assertArray(entries);\n\n const f = level > 0 ? assertString : assertJSONValue;\n\n // For V7 we do not need to change the entries. Just assert that they are correct.\n if (formatVersion >= FormatVersion.V7) {\n for (const e of entries) {\n assertEntry(e, f);\n }\n return v as unknown as InternalNode | DataNode;\n }\n\n const newEntries = entries.map(e => convertNonV7Entry(e, f, getSizeOfEntry));\n return [level, newEntries] as unknown as InternalNode | DataNode;\n}\n\nfunction assertEntry(\n entry: unknown,\n f:\n | ((v: unknown) => asserts v is Hash)\n | ((v: unknown) => asserts v is JSONValue),\n): asserts entry is Entry<Hash | JSONValue> {\n assertArray(entry);\n // Be relaxed about what we accept.\n assert(entry.length >= 3, 'Expected entry array to have at least 3 elements');\n assertString(entry[0]);\n f(entry[1]);\n assertNumber(entry[2]);\n}\n\n/**\n * Converts an entry that was from a format version before V7 to the format\n * wanted by V7.\n */\nfunction convertNonV7Entry(\n entry: unknown,\n f:\n | ((v: unknown) => asserts v is Hash)\n | ((v: unknown) => asserts v is JSONValue),\n getSizeOfEntry: <K, V>(key: K, value: V) => number,\n): Entry<Hash | JSONValue> {\n assertArray(entry);\n assert(entry.length >= 2, 'Expected entry array to have at least 2 elements');\n assertString(entry[0]);\n f(entry[1]);\n const entrySize = getSizeOfEntry(entry[0], entry[1]);\n return [entry[0], entry[1], entrySize] as Entry<Hash | JSONValue>;\n}\n\nexport function isInternalNode(node: Node): node is InternalNode {\n return node[NODE_LEVEL] > 0;\n}\n\nabstract class NodeImpl<Value> {\n entries: Array<Entry<Value>>;\n hash: Hash;\n abstract readonly level: number;\n readonly isMutable: boolean;\n\n #childNodeSize = -1;\n\n constructor(entries: Array<Entry<Value>>, hash: Hash, isMutable: boolean) {\n this.entries = entries;\n this.hash = hash;\n this.isMutable = isMutable;\n }\n\n abstract set(\n key: string,\n value: FrozenJSONValue,\n entrySize: number,\n tree: BTreeWrite,\n ): Promise<NodeImpl<Value>>;\n\n abstract putMany(\n entries: ReadonlyArray<Entry<FrozenJSONValue>>,\n tree: BTreeWrite,\n ): Promise<NodeImpl<Value>>;\n\n abstract del(\n key: string,\n tree: BTreeWrite,\n ): Promise<NodeImpl<Value> | DataNodeImpl>;\n\n maxKey(): string {\n // oxlint-disable-next-line typescript/no-non-null-assertion\n return this.entries.at(-1)![0];\n }\n\n getChildNodeSize(tree: BTreeRead): number {\n if (this.#childNodeSize !== -1) {\n return this.#childNodeSize;\n }\n\n let sum = tree.chunkHeaderSize;\n for (const entry of this.entries) {\n sum += entry[2];\n }\n return (this.#childNodeSize = sum);\n }\n\n protected _updateNode(tree: BTreeWrite) {\n this.#childNodeSize = -1;\n tree.updateNode(\n this as NodeImpl<unknown> as DataNodeImpl | InternalNodeImpl,\n );\n }\n}\n\nexport function toChunkData<V>(\n node: NodeImpl<V>,\n formatVersion: FormatVersion,\n): BaseNode<V> {\n return makeNodeChunkData(node.level, node.entries, formatVersion);\n}\n\nexport class DataNodeImpl extends NodeImpl<FrozenJSONValue> {\n readonly level = 0;\n\n set(\n key: string,\n value: FrozenJSONValue,\n entrySize: number,\n tree: BTreeWrite,\n ): Promise<DataNodeImpl> {\n let deleteCount: number;\n const i = binarySearch(key, this.entries);\n if (!binarySearchFound(i, this.entries, key)) {\n // Not found, insert.\n deleteCount = 0;\n } else {\n deleteCount = 1;\n }\n\n return Promise.resolve(\n this.#splice(tree, i, deleteCount, [key, value, entrySize]),\n );\n }\n\n putMany(\n entries: ReadonlyArray<Entry<FrozenJSONValue>>,\n tree: BTreeWrite,\n ): Promise<DataNodeImpl> {\n if (entries.length === 0) {\n return Promise.resolve(this);\n }\n\n // Merge sorted entries with existing entries\n const merged: Entry<FrozenJSONValue>[] = [];\n let i = 0; // index in this.entries\n let j = 0; // index in entries\n\n while (i < this.entries.length && j < entries.length) {\n const existingEntry = this.entries[i];\n const newEntry = entries[j];\n const cmp = compareUTF8(existingEntry[0], newEntry[0]);\n\n if (cmp < 0) {\n merged.push(existingEntry);\n i++;\n } else if (cmp > 0) {\n merged.push(newEntry);\n j++;\n } else {\n // Same key, new entry wins (update)\n merged.push(newEntry);\n i++;\n j++;\n }\n }\n\n // Add remaining entries\n while (i < this.entries.length) {\n merged.push(this.entries[i]);\n i++;\n }\n while (j < entries.length) {\n merged.push(entries[j]);\n j++;\n }\n\n if (this.isMutable) {\n this.entries = merged;\n this._updateNode(tree);\n return Promise.resolve(this);\n }\n\n return Promise.resolve(tree.newDataNodeImpl(merged));\n }\n\n #splice(\n tree: BTreeWrite,\n start: number,\n deleteCount: number,\n ...items: Entry<FrozenJSONValue>[]\n ): DataNodeImpl {\n if (this.isMutable) {\n this.entries.splice(start, deleteCount, ...items);\n this._updateNode(tree);\n return this;\n }\n\n const entries = readonlySplice(this.entries, start, deleteCount, ...items);\n return tree.newDataNodeImpl(entries);\n }\n\n del(key: string, tree: BTreeWrite): Promise<DataNodeImpl> {\n const i = binarySearch(key, this.entries);\n if (!binarySearchFound(i, this.entries, key)) {\n // Not found. Return this without changes.\n return Promise.resolve(this);\n }\n\n // Found. Create new node or mutate existing one.\n return Promise.resolve(this.#splice(tree, i, 1));\n }\n\n async *keys(_tree: BTreeRead): AsyncGenerator<string, void> {\n for (const entry of this.entries) {\n yield entry[0];\n }\n }\n\n async *entriesIter(\n _tree: BTreeRead,\n ): AsyncGenerator<Entry<FrozenJSONValue>, void> {\n for (const entry of this.entries) {\n yield entry;\n }\n }\n}\n\nfunction readonlySplice<T>(\n array: ReadonlyArray<T>,\n start: number,\n deleteCount: number,\n ...items: T[]\n): T[] {\n const arr = array.slice(0, start);\n for (let i = 0; i < items.length; i++) {\n arr.push(items[i]);\n }\n for (let i = start + deleteCount; i < array.length; i++) {\n arr.push(array[i]);\n }\n return arr;\n}\n\nexport class InternalNodeImpl extends NodeImpl<Hash> {\n readonly level: number;\n\n constructor(\n entries: Array<Entry<Hash>>,\n hash: Hash,\n level: number,\n isMutable: boolean,\n ) {\n super(entries, hash, isMutable);\n this.level = level;\n }\n\n async set(\n key: string,\n value: FrozenJSONValue,\n entrySize: number,\n tree: BTreeWrite,\n ): Promise<InternalNodeImpl> {\n let i = binarySearch(key, this.entries);\n if (i === this.entries.length) {\n // We are going to insert into last (right most) leaf.\n i--;\n }\n\n const childHash = this.entries[i][1];\n const oldChildNode = await tree.getNode(childHash);\n\n const childNode = await oldChildNode.set(key, value, entrySize, tree);\n\n const childNodeSize = childNode.getChildNodeSize(tree);\n if (childNodeSize > tree.maxSize || childNodeSize < tree.minSize) {\n return this.#mergeAndPartition(tree, i, childNode);\n }\n\n const newEntry = createNewInternalEntryForNode(\n childNode,\n tree.getEntrySize,\n );\n return this.#replaceChild(tree, i, newEntry);\n }\n\n async putMany(\n entries: ReadonlyArray<Entry<FrozenJSONValue>>,\n tree: BTreeWrite,\n ): Promise<InternalNodeImpl> {\n if (entries.length === 0) {\n return this;\n }\n\n // Group entries by child index\n // Since entries are sorted, we can restrict the binary search range\n const childGroups: Map<number, Entry<FrozenJSONValue>[]> = new Map();\n\n let searchStart = 0;\n for (const entry of entries) {\n const key = entry[0];\n // Binary search from searchStart to end (entries are sorted)\n let i = binarySearchFrom(key, this.entries, searchStart);\n if (i === this.entries.length) {\n // Insert into last (right most) leaf.\n i--;\n }\n searchStart = i;\n\n let group = childGroups.get(i);\n if (!group) {\n group = [];\n childGroups.set(i, group);\n }\n group.push(entry);\n }\n\n // Process each affected child\n const newEntries = [...this.entries];\n const childrenToRebalance: Array<{\n index: number;\n node: DataNodeImpl | InternalNodeImpl;\n }> = [];\n\n for (const [childIndex, childEntries] of childGroups) {\n const childHash = this.entries[childIndex][1];\n const oldChildNode = await tree.getNode(childHash);\n const childNode = await oldChildNode.putMany(childEntries, tree);\n\n const childNodeSize = childNode.getChildNodeSize(tree);\n if (childNodeSize > tree.maxSize || childNodeSize < tree.minSize) {\n childrenToRebalance.push({index: childIndex, node: childNode});\n } else {\n const newEntry = createNewInternalEntryForNode(\n childNode,\n tree.getEntrySize,\n );\n newEntries[childIndex] = newEntry;\n }\n }\n\n // Handle rebalancing - merge adjacent children that need rebalancing\n // into contiguous groups and process each group as one unit.\n //\n // BUG FIX: Previously, each child was rebalanced independently R-to-L.\n // When adjacent children (e.g., indices 0 and 1) both needed rebalancing,\n // child[1] would merge with sibling[0] (the ORIGINAL), then child[0]\n // would merge with the rebalanced result at position 1, duplicating\n // child[0]'s data. The fix groups adjacent indices together.\n if (childrenToRebalance.length > 0) {\n childrenToRebalance.sort((a, b) => a.index - b.index);\n\n // Group adjacent indices into contiguous runs, each extended by one\n // sibling on either side for merge context.\n const groups: Array<{\n nodes: Map<number, DataNodeImpl | InternalNodeImpl>;\n minIndex: number;\n maxIndex: number;\n }> = [];\n\n for (const {index, node} of childrenToRebalance) {\n const lastGroup = groups.at(-1);\n // Adjacent to previous group? (within 1 index of the last group's max)\n if (lastGroup && index <= lastGroup.maxIndex + 1) {\n lastGroup.nodes.set(index, node);\n lastGroup.maxIndex = index;\n } else {\n groups.push({\n nodes: new Map([[index, node]]),\n minIndex: index,\n maxIndex: index,\n });\n }\n }\n\n // Process groups from right to left to maintain indices during splices.\n for (let g = groups.length - 1; g >= 0; g--) {\n const group = groups[g];\n\n // Extend range by one sibling on each side for merge context.\n const startIndex = Math.max(0, group.minIndex - 1);\n const endIndex = Math.min(newEntries.length - 1, group.maxIndex + 1);\n const removeCount = endIndex - startIndex + 1;\n\n // Collect all entries from the range: use the putMany result for\n // indices that were rebalanced, the current newEntries node otherwise.\n type IterableHashEntries = Iterable<Entry<Hash>>;\n const allValues: IterableHashEntries[] = [];\n for (let idx = startIndex; idx <= endIndex; idx++) {\n const rebalancedNode = group.nodes.get(idx);\n if (rebalancedNode) {\n allValues.push(rebalancedNode.entries as IterableHashEntries);\n } else {\n const hash = newEntries[idx][1];\n const existingNode = await tree.getNode(hash);\n allValues.push(existingNode.entries as IterableHashEntries);\n }\n }\n\n const level = this.level - 1;\n const merged = joinIterables(...allValues);\n const rebalanced = partition(\n merged,\n e => e[2],\n tree.minSize - tree.chunkHeaderSize,\n tree.maxSize - tree.chunkHeaderSize,\n entries => {\n const node = tree.newNodeImpl(entries, level);\n return createNewInternalEntryForNode(node, tree.getEntrySize);\n },\n );\n\n newEntries.splice(startIndex, removeCount, ...rebalanced);\n }\n }\n\n if (this.isMutable) {\n this.entries = newEntries;\n this._updateNode(tree);\n return this;\n }\n\n return tree.newInternalNodeImpl(newEntries, this.level);\n }\n\n /**\n * This merges the child node entries with previous or next sibling and then\n * partitions the merged entries.\n */\n async #mergeAndPartition(\n tree: BTreeWrite,\n i: number,\n childNode: DataNodeImpl | InternalNodeImpl,\n ): Promise<InternalNodeImpl> {\n const level = this.level - 1;\n const thisEntries = this.entries;\n\n type IterableHashEntries = Iterable<Entry<Hash>>;\n\n let values: IterableHashEntries;\n let startIndex: number;\n let removeCount: number;\n if (i > 0) {\n const hash = thisEntries[i - 1][1];\n const previousSibling = await tree.getNode(hash);\n values = joinIterables(\n previousSibling.entries as IterableHashEntries,\n childNode.entries as IterableHashEntries,\n );\n startIndex = i - 1;\n removeCount = 2;\n } else if (i < thisEntries.length - 1) {\n const hash = thisEntries[i + 1][1];\n const nextSibling = await tree.getNode(hash);\n values = joinIterables(\n childNode.entries as IterableHashEntries,\n nextSibling.entries as IterableHashEntries,\n );\n startIndex = i;\n removeCount = 2;\n } else {\n values = childNode.entries as IterableHashEntries;\n startIndex = i;\n removeCount = 1;\n }\n\n const newEntries = partition(\n values,\n value => value[2],\n tree.minSize - tree.chunkHeaderSize,\n tree.maxSize - tree.chunkHeaderSize,\n entries => {\n const node = tree.newNodeImpl(entries, level);\n return createNewInternalEntryForNode(node, tree.getEntrySize);\n },\n );\n\n if (this.isMutable) {\n this.entries.splice(startIndex, removeCount, ...newEntries);\n this._updateNode(tree);\n return this;\n }\n\n const entries = readonlySplice(\n thisEntries,\n startIndex,\n removeCount,\n ...newEntries,\n );\n\n return tree.newInternalNodeImpl(entries, this.level);\n }\n\n #replaceChild(\n tree: BTreeWrite,\n index: number,\n newEntry: Entry<Hash>,\n ): InternalNodeImpl {\n if (this.isMutable) {\n this.entries.splice(index, 1, newEntry);\n this._updateNode(tree);\n return this;\n }\n const entries = readonlySplice(this.entries, index, 1, newEntry);\n return tree.newInternalNodeImpl(entries, this.level);\n }\n\n async del(\n key: string,\n tree: BTreeWrite,\n ): Promise<InternalNodeImpl | DataNodeImpl> {\n const i = binarySearch(key, this.entries);\n if (i === this.entries.length) {\n // Key is larger than maxKey of rightmost entry so it is not present.\n return this;\n }\n\n const childHash = this.entries[i][1];\n const oldChildNode = await tree.getNode(childHash);\n const oldHash = oldChildNode.hash;\n\n const childNode = await oldChildNode.del(key, tree);\n if (childNode.hash === oldHash) {\n // Not changed so not found.\n return this;\n }\n\n if (childNode.entries.length === 0) {\n // Subtree is now empty. Remove internal node.\n const entries = readonlySplice(this.entries, i, 1);\n return tree.newInternalNodeImpl(entries, this.level);\n }\n\n if (i === 0 && this.entries.length === 1) {\n // There was only one node at this level and it was removed. We can return\n // the modified subtree.\n return childNode;\n }\n\n // The child node is still a good size.\n if (childNode.getChildNodeSize(tree) > tree.minSize) {\n // No merging needed.\n const entry = createNewInternalEntryForNode(childNode, tree.getEntrySize);\n return this.#replaceChild(tree, i, entry);\n }\n\n // Child node size is too small.\n return this.#mergeAndPartition(tree, i, childNode);\n }\n\n async *keys(tree: BTreeRead): AsyncGenerator<string, void> {\n for (const entry of this.entries) {\n const childNode = await tree.getNode(entry[1]);\n yield* childNode.keys(tree);\n }\n }\n\n async *entriesIter(\n tree: BTreeRead,\n ): AsyncGenerator<Entry<FrozenJSONValue>, void> {\n for (const entry of this.entries) {\n const childNode = await tree.getNode(entry[1]);\n yield* childNode.entriesIter(tree);\n }\n }\n\n getChildren(\n start: number,\n length: number,\n tree: BTreeRead,\n ): Promise<Array<InternalNodeImpl | DataNodeImpl>> {\n const ps: Promise<DataNodeImpl | InternalNodeImpl>[] = [];\n for (let i = start; i < length && i < this.entries.length; i++) {\n ps.push(tree.getNode(this.entries[i][1]));\n }\n return Promise.all(ps);\n }\n\n async getCompositeChildren(\n start: number,\n length: number,\n tree: BTreeRead,\n ): Promise<InternalNodeImpl | DataNodeImpl> {\n const {level} = this;\n\n if (length === 0) {\n return new InternalNodeImpl([], newRandomHash(), level - 1, true);\n }\n\n const output = await this.getChildren(start, start + length, tree);\n\n if (level > 1) {\n const entries: Entry<Hash>[] = [];\n for (const child of output as InternalNodeImpl[]) {\n entries.push(...child.entries);\n }\n return new InternalNodeImpl(entries, newRandomHash(), level - 1, true);\n }\n\n assert(level === 1, 'Expected level to be 1');\n const entries: Entry<FrozenJSONValue>[] = [];\n for (const child of output as DataNodeImpl[]) {\n entries.push(...child.entries);\n }\n return new DataNodeImpl(entries, newRandomHash(), true);\n }\n}\n\nexport function newNodeImpl(\n entries: Array<Entry<FrozenJSONValue>>,\n hash: Hash,\n level: number,\n isMutable: boolean,\n): DataNodeImpl;\nexport function newNodeImpl(\n entries: Array<Entry<Hash>>,\n hash: Hash,\n level: number,\n isMutable: boolean,\n): InternalNodeImpl;\nexport function newNodeImpl(\n entries: Array<Entry<FrozenJSONValue>> | Array<Entry<Hash>>,\n hash: Hash,\n level: number,\n isMutable: boolean,\n): DataNodeImpl | InternalNodeImpl;\nexport function newNodeImpl(\n entries: Array<Entry<FrozenJSONValue>> | Array<Entry<Hash>>,\n hash: Hash,\n level: number,\n isMutable: boolean,\n): DataNodeImpl | InternalNodeImpl {\n if (level === 0) {\n return new DataNodeImpl(\n entries as Entry<FrozenJSONValue>[],\n hash,\n isMutable,\n );\n }\n return new InternalNodeImpl(entries as Entry<Hash>[], hash, level, isMutable);\n}\n\nexport function isDataNodeImpl(\n node: DataNodeImpl | InternalNodeImpl,\n): node is DataNodeImpl {\n return node.level === 0;\n}\n\nexport function partition<T, R>(\n values: Iterable<T>,\n // This is the size of each Entry\n getSizeOfEntry: (v: T) => number,\n min: number,\n max: number,\n create: (entries: T[]) => R,\n): R[] {\n const results: R[] = [];\n let sum = 0;\n let accum: T[] = [];\n // The most recently finalized partition, held back until we know it won't be\n // merged with trailing entries.\n let lastPartition: T[] | null = null;\n let lastSize = 0;\n\n function commitLast() {\n if (lastPartition !== null) {\n results.push(create(lastPartition));\n lastPartition = null;\n }\n }\n\n for (const value of values) {\n const size = getSizeOfEntry(value);\n if (size >= max) {\n if (accum.length > 0) {\n commitLast();\n lastPartition = accum;\n lastSize = sum;\n accum = [];\n sum = 0;\n }\n commitLast();\n lastPartition = [value];\n lastSize = size;\n } else if (sum + size >= min) {\n accum.push(value);\n commitLast();\n lastPartition = accum;\n lastSize = sum + size;\n accum = [];\n sum = 0;\n } else {\n sum += size;\n accum.push(value);\n }\n }\n\n if (sum > 0) {\n if (lastPartition !== null && sum + lastSize <= max) {\n lastPartition.push(...accum);\n commitLast();\n } else {\n commitLast();\n results.push(create(accum));\n }\n } else {\n commitLast();\n }\n\n return results;\n}\n\nexport const emptyDataNode = makeNodeChunkData<ReadonlyJSONValue>(\n 0,\n [],\n FormatVersion.Latest,\n);\nexport const emptyDataNodeImpl = new DataNodeImpl([], emptyHash, false);\n\nexport function createNewInternalEntryForNode(\n node: NodeImpl<unknown>,\n getSizeOfEntry: <K, V>(k: K, v: V) => number,\n): [string, Hash, number] {\n const key = node.maxKey();\n const value = node.hash;\n const size = getSizeOfEntry(key, value);\n return [key, value, size];\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","names":[],"sources":["../../../../../replicache/src/btree/read.ts"],"sourcesContent":["import type {Enum} from '../../../shared/src/enum.ts';\nimport {deepEqual} from '../../../shared/src/json.ts';\nimport {getSizeOfEntry} from '../../../shared/src/size-of-value.ts';\nimport type {Read} from '../dag/store.ts';\nimport type * as FormatVersion from '../format-version-enum.ts';\nimport type {FrozenJSONValue} from '../frozen-json.ts';\nimport {type Hash, emptyHash} from '../hash.ts';\nimport type {DataNodeImpl, InternalNodeImpl} from './node.ts';\nimport {\n type Entry,\n type InternalDiff,\n type InternalDiffOperation,\n NODE_ENTRIES,\n NODE_LEVEL,\n binarySearch,\n binarySearchFound,\n emptyDataNodeImpl,\n findLeaf,\n isDataNodeImpl,\n newNodeImpl,\n parseBTreeNode,\n} from './node.ts';\nimport {\n SPLICE_ADDED,\n SPLICE_AT,\n SPLICE_FROM,\n SPLICE_REMOVED,\n computeSplices,\n} from './splice.ts';\n\ntype FormatVersion = Enum<typeof FormatVersion>;\n\n/**\n * The size of the header of a node. (If we had compile time\n * constants we would have used that).\n *\n * There is a test ensuring this is correct.\n */\nexport const NODE_HEADER_SIZE = 11;\n\nexport class BTreeRead implements AsyncIterable<Entry<FrozenJSONValue>> {\n protected readonly _cache: Map<Hash, DataNodeImpl | InternalNodeImpl> =\n new Map();\n\n protected readonly _dagRead: Read;\n protected readonly _formatVersion: FormatVersion;\n rootHash: Hash;\n readonly getEntrySize: <K, V>(k: K, v: V) => number;\n readonly chunkHeaderSize: number;\n\n constructor(\n dagRead: Read,\n formatVersion: FormatVersion,\n root: Hash = emptyHash,\n getEntrySize: <K, V>(k: K, v: V) => number = getSizeOfEntry,\n chunkHeaderSize = NODE_HEADER_SIZE,\n ) {\n this._dagRead = dagRead;\n this._formatVersion = formatVersion;\n this.rootHash = root;\n this.getEntrySize = getEntrySize;\n this.chunkHeaderSize = chunkHeaderSize;\n }\n\n async getNode(hash: Hash): Promise<DataNodeImpl | InternalNodeImpl> {\n if (hash === emptyHash) {\n return emptyDataNodeImpl;\n }\n\n const cached = this._cache.get(hash);\n if (cached) {\n return cached;\n }\n\n const chunk = await this._dagRead.mustGetChunk(hash);\n const data = parseBTreeNode(\n chunk.data,\n this._formatVersion,\n this.getEntrySize,\n );\n const impl = newNodeImpl(\n data[NODE_ENTRIES] as Entry<FrozenJSONValue>[],\n hash,\n data[NODE_LEVEL],\n false,\n );\n this._cache.set(hash, impl);\n return impl;\n }\n\n async get(key: string): Promise<FrozenJSONValue | undefined> {\n const leaf = await findLeaf(key, this.rootHash, this, this.rootHash);\n const index = binarySearch(key, leaf.entries);\n if (!binarySearchFound(index, leaf.entries, key)) {\n return undefined;\n }\n return leaf.entries[index][1];\n }\n\n async has(key: string): Promise<boolean> {\n const leaf = await findLeaf(key, this.rootHash, this, this.rootHash);\n const index = binarySearch(key, leaf.entries);\n return binarySearchFound(index, leaf.entries, key);\n }\n\n async isEmpty(): Promise<boolean> {\n const {rootHash} = this;\n const node = await this.getNode(this.rootHash);\n // The root hash has changed, so the tree has been modified.\n if (this.rootHash !== rootHash) {\n return this.isEmpty();\n }\n return node.entries.length === 0;\n }\n\n // We don't do any encoding of the key in the map, so we have no way of\n // determining from an entry.key alone whether it is a regular key or an\n // encoded IndexKey in an index map. Without encoding regular map keys the\n // caller has to deal with encoding and decoding the keys for the index map.\n scan(fromKey: string): AsyncIterableIterator<Entry<FrozenJSONValue>> {\n return scanForHash(\n this.rootHash,\n () => this.rootHash,\n this.rootHash,\n fromKey,\n async hash => {\n const cached = await this.getNode(hash);\n if (cached) {\n return [\n cached.level,\n cached.isMutable ? cached.entries.slice() : cached.entries,\n ];\n }\n const chunk = await this._dagRead.mustGetChunk(hash);\n return parseBTreeNode(\n chunk.data,\n this._formatVersion,\n this.getEntrySize,\n );\n },\n );\n }\n\n async *keys(): AsyncIterableIterator<string> {\n const node = await this.getNode(this.rootHash);\n yield* node.keys(this);\n }\n\n async *entries(): AsyncIterableIterator<Entry<FrozenJSONValue>> {\n const node = await this.getNode(this.rootHash);\n yield* node.entriesIter(this);\n }\n\n [Symbol.asyncIterator](): AsyncIterableIterator<Entry<FrozenJSONValue>> {\n return this.entries();\n }\n\n async *diff(last: BTreeRead): AsyncIterableIterator<InternalDiffOperation> {\n const [currentNode, lastNode] = await Promise.all([\n this.getNode(this.rootHash),\n last.getNode(last.rootHash),\n ]);\n yield* diffNodes(lastNode, currentNode, last, this);\n }\n}\n\nasync function* diffNodes(\n last: InternalNodeImpl | DataNodeImpl,\n current: InternalNodeImpl | DataNodeImpl,\n lastTree: BTreeRead,\n currentTree: BTreeRead,\n): AsyncIterableIterator<InternalDiffOperation> {\n if (last.level > current.level) {\n // merge all of last's children into a new node\n // We know last is an internal node because level > 0.\n const lastChild = (await (last as InternalNodeImpl).getCompositeChildren(\n 0,\n last.entries.length,\n lastTree,\n )) as InternalNodeImpl;\n yield* diffNodes(lastChild, current, lastTree, currentTree);\n return;\n }\n\n if (current.level > last.level) {\n // We know current is an internal node because level > 0.\n const currentChild = (await (\n current as InternalNodeImpl\n ).getCompositeChildren(\n 0,\n current.entries.length,\n currentTree,\n )) as InternalNodeImpl;\n yield* diffNodes(last, currentChild, lastTree, currentTree);\n return;\n }\n\n if (isDataNodeImpl(last) && isDataNodeImpl(current)) {\n yield* diffEntries(\n (last as DataNodeImpl).entries,\n (current as DataNodeImpl).entries,\n );\n return;\n }\n\n // Now we have two internal nodes with the same level. We compute the diff as\n // splices for the internal node entries. We then flatten these and call diff\n // recursively.\n const initialSplices = computeSplices(\n (last as InternalNodeImpl).entries,\n (current as InternalNodeImpl).entries,\n );\n for (const splice of initialSplices) {\n const [lastChild, currentChild] = await Promise.all([\n (last as InternalNodeImpl).getCompositeChildren(\n splice[SPLICE_AT],\n splice[SPLICE_REMOVED],\n lastTree,\n ),\n (current as InternalNodeImpl).getCompositeChildren(\n splice[SPLICE_FROM],\n splice[SPLICE_ADDED],\n currentTree,\n ),\n ]);\n yield* diffNodes(lastChild, currentChild, lastTree, currentTree);\n }\n}\n\nfunction* diffEntries(\n lastEntries: readonly Entry<FrozenJSONValue>[],\n currentEntries: readonly Entry<FrozenJSONValue>[],\n): IterableIterator<InternalDiffOperation> {\n const lastLength = lastEntries.length;\n const currentLength = currentEntries.length;\n let i = 0;\n let j = 0;\n while (i < lastLength && j < currentLength) {\n const lastKey = lastEntries[i][0];\n const currentKey = currentEntries[j][0];\n if (lastKey === currentKey) {\n if (!deepEqual(lastEntries[i][1], currentEntries[j][1])) {\n yield {\n op: 'change',\n key: lastKey,\n oldValue: lastEntries[i][1],\n newValue: currentEntries[j][1],\n };\n }\n i++;\n j++;\n } else if (lastKey < currentKey) {\n yield {\n op: 'del',\n key: lastKey,\n oldValue: lastEntries[i][1],\n };\n i++;\n } else {\n yield {\n op: 'add',\n key: currentKey,\n newValue: currentEntries[j][1],\n };\n j++;\n }\n }\n for (; i < lastLength; i++) {\n yield {\n op: 'del',\n key: lastEntries[i][0],\n oldValue: lastEntries[i][1],\n };\n }\n for (; j < currentLength; j++) {\n yield {\n op: 'add',\n key: currentEntries[j][0],\n newValue: currentEntries[j][1],\n };\n }\n}\n\n// Redefine the type here to allow the optional size in the tuple.\ntype ReadNodeResult = readonly [\n level: number,\n data: readonly Entry<FrozenJSONValue>[] | readonly Entry<Hash>[],\n];\n\ntype ReadNode = (hash: Hash) => Promise<ReadNodeResult>;\n\nasync function* scanForHash(\n expectedRootHash: Hash,\n getRootHash: () => Hash,\n hash: Hash,\n fromKey: string,\n readNode: ReadNode,\n): AsyncIterableIterator<Entry<FrozenJSONValue>> {\n if (hash === emptyHash) {\n return;\n }\n\n const data = await readNode(hash);\n const entries = data[NODE_ENTRIES];\n let i = 0;\n if (fromKey) {\n i = binarySearch(fromKey, entries);\n }\n if (data[NODE_LEVEL] > 0) {\n for (; i < entries.length; i++) {\n yield* scanForHash(\n expectedRootHash,\n getRootHash,\n (entries[i] as Entry<Hash>)[1],\n fromKey,\n readNode,\n );\n fromKey = '';\n }\n } else {\n for (; i < entries.length; i++) {\n const rootHash = getRootHash();\n // If rootHash changed then we start a new iterator from the key.\n if (expectedRootHash !== rootHash) {\n yield* scanForHash(\n rootHash,\n getRootHash,\n rootHash,\n entries[i][0],\n readNode,\n );\n return;\n }\n yield entries[i] as Entry<FrozenJSONValue>;\n }\n }\n}\n\nexport async function allEntriesAsDiff(\n map: BTreeRead,\n op: 'add' | 'del',\n): Promise<InternalDiff> {\n const diff: InternalDiffOperation[] = [];\n const make: (entry: Entry<FrozenJSONValue>) => InternalDiffOperation =\n op === 'add'\n ? entry => ({\n op: 'add',\n key: entry[0],\n newValue: entry[1],\n })\n : entry => ({\n op: 'del',\n key: entry[0],\n oldValue: entry[1],\n });\n\n for await (const entry of map.entries()) {\n diff.push(make(entry));\n }\n return diff;\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splice.js","names":[],"sources":["../../../../../replicache/src/btree/splice.ts"],"sourcesContent":["import {deepEqual, type ReadonlyJSONValue} from '../../../shared/src/json.ts';\n\nexport type Splice = [at: number, removed: number, added: number, from: number];\n\nconst SPLICE_UNASSIGNED = -1;\nexport const SPLICE_AT = 0;\nexport const SPLICE_REMOVED = 1;\nexport const SPLICE_ADDED = 2;\nexport const SPLICE_FROM = 3;\n\nconst KEY = 0;\nconst VALUE = 1;\n\ntype Entry<V> = readonly [key: string, value: V, ...rest: unknown[]];\n\nexport function* computeSplices<T>(\n previous: readonly Entry<T>[],\n current: readonly Entry<T>[],\n): Generator<Splice, void> {\n let previousIndex = 0;\n let currentIndex = 0;\n let splice: Splice | undefined;\n\n function ensureAssigned(splice: Splice, index: number): void {\n if (splice[SPLICE_FROM] === SPLICE_UNASSIGNED) {\n splice[SPLICE_FROM] = index;\n }\n }\n\n function newSplice(): Splice {\n return [previousIndex, 0, 0, SPLICE_UNASSIGNED];\n }\n\n while (previousIndex < previous.length && currentIndex < current.length) {\n if (previous[previousIndex][KEY] === current[currentIndex][KEY]) {\n if (\n deepEqual(\n // These are really Hash | InternalValue\n previous[previousIndex][VALUE] as ReadonlyJSONValue,\n current[currentIndex][VALUE] as ReadonlyJSONValue,\n )\n ) {\n if (splice) {\n ensureAssigned(splice, 0);\n yield splice;\n splice = undefined;\n }\n } else {\n if (!splice) {\n splice = newSplice();\n }\n splice[SPLICE_ADDED]++;\n splice[SPLICE_REMOVED]++;\n ensureAssigned(splice, currentIndex);\n }\n previousIndex++;\n currentIndex++;\n } else if (previous[previousIndex][KEY] < current[currentIndex][KEY]) {\n // previous was removed\n if (!splice) {\n splice = newSplice();\n }\n splice[SPLICE_REMOVED]++;\n\n previousIndex++;\n } else {\n // current was added\n if (!splice) {\n splice = newSplice();\n }\n splice[SPLICE_ADDED]++;\n ensureAssigned(splice, currentIndex);\n\n currentIndex++;\n }\n }\n\n if (currentIndex < current.length) {\n if (!splice) {\n splice = newSplice();\n }\n splice[SPLICE_ADDED] += current.length - currentIndex;\n ensureAssigned(splice, currentIndex);\n }\n\n if (previousIndex < previous.length) {\n if (!splice) {\n splice = newSplice();\n }\n splice[SPLICE_REMOVED] += previous.length - previousIndex;\n }\n\n if (splice) {\n ensureAssigned(splice, 0);\n yield splice;\n }\n}\n"],"mappings":";;AAIA,IAAM,oBAAoB;AAM1B,IAAM,MAAM;AACZ,IAAM,QAAQ;AAId,UAAiB,eACf,UACA,SACyB;CACzB,IAAI,gBAAgB;CACpB,IAAI,eAAe;CACnB,IAAI;CAEJ,SAAS,eAAe,QAAgB,OAAqB;EAC3D,IAAI,OAAA,OAAwB,mBAC1B,OAAA,KAAsB;CAE1B;CAEA,SAAS,YAAoB;EAC3B,OAAO;GAAC;GAAe;GAAG;GAAG;EAAiB;CAChD;CAEA,OAAO,gBAAgB,SAAS,UAAU,eAAe,QAAQ,QAC/D,IAAI,SAAS,eAAe,SAAS,QAAQ,cAAc,MAAM;EAC/D,IACE,UAEE,SAAS,eAAe,QACxB,QAAQ,cAAc,MACxB;OAEI,QAAQ;IACV,eAAe,QAAQ,CAAC;IACxB,MAAM;IACN,SAAS,KAAA;GACX;SACK;GACL,IAAI,CAAC,QACH,SAAS,UAAU;GAErB,OAAA;GACA,OAAA;GACA,eAAe,QAAQ,YAAY;EACrC;EACA;EACA;CACF,OAAO,IAAI,SAAS,eAAe,OAAO,QAAQ,cAAc,MAAM;EAEpE,IAAI,CAAC,QACH,SAAS,UAAU;EAErB,OAAA;EAEA;CACF,OAAO;EAEL,IAAI,CAAC,QACH,SAAS,UAAU;EAErB,OAAA;EACA,eAAe,QAAQ,YAAY;EAEnC;CACF;CAGF,IAAI,eAAe,QAAQ,QAAQ;EACjC,IAAI,CAAC,QACH,SAAS,UAAU;EAErB,OAAA,MAAwB,QAAQ,SAAS;EACzC,eAAe,QAAQ,YAAY;CACrC;CAEA,IAAI,gBAAgB,SAAS,QAAQ;EACnC,IAAI,CAAC,QACH,SAAS,UAAU;EAErB,OAAA,MAA0B,SAAS,SAAS;CAC9C;CAEA,IAAI,QAAQ;EACV,eAAe,QAAQ,CAAC;EACxB,MAAM;CACR;AACF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","names":["#lock","#modified","#addToModified"],"sources":["../../../../../replicache/src/btree/write.ts"],"sourcesContent":["import {Lock} from '@rocicorp/lock';\nimport {assert} from '../../../shared/src/asserts.ts';\nimport type {Enum} from '../../../shared/src/enum.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport {getSizeOfEntry} from '../../../shared/src/size-of-value.ts';\nimport {type Chunk, type CreateChunk, toRefs} from '../dag/chunk.ts';\nimport type {Write} from '../dag/store.ts';\nimport type * as FormatVersion from '../format-version-enum.ts';\nimport type {FrozenJSONValue} from '../frozen-json.ts';\nimport {type Hash, emptyHash, newRandomHash} from '../hash.ts';\nimport {\n DataNodeImpl,\n type Entry,\n InternalNodeImpl,\n createNewInternalEntryForNode,\n emptyDataNode,\n isDataNodeImpl,\n newNodeImpl,\n partition,\n toChunkData,\n} from './node.ts';\nimport {BTreeRead} from './read.ts';\n\ntype FormatVersion = Enum<typeof FormatVersion>;\n\nexport class BTreeWrite extends BTreeRead {\n /**\n * This rw lock is used to ensure we do not mutate the btree in parallel. It\n * would be a problem if we didn't have the lock in cases like this:\n *\n * ```ts\n * const p1 = tree.put('a', 0);\n * const p2 = tree.put('b', 1);\n * await p1;\n * await p2;\n * ```\n *\n * because both `p1` and `p2` would start from the old root hash but a put\n * changes the root hash so the two concurrent puts would lead to only one of\n * them actually working, and it is not deterministic which one would finish\n * last.\n */\n readonly #lock = new Lock();\n readonly #modified: Map<Hash, DataNodeImpl | InternalNodeImpl> = new Map();\n\n declare protected _dagRead: Write;\n\n readonly minSize: number;\n readonly maxSize: number;\n\n constructor(\n dagWrite: Write,\n formatVersion: FormatVersion,\n root: Hash = emptyHash,\n minSize = 8 * 1024,\n maxSize = 16 * 1024,\n getEntrySize: <K, V>(k: K, v: V) => number = getSizeOfEntry,\n chunkHeaderSize?: number,\n ) {\n super(dagWrite, formatVersion, root, getEntrySize, chunkHeaderSize);\n\n this.minSize = minSize;\n this.maxSize = maxSize;\n }\n\n #addToModified(node: DataNodeImpl | InternalNodeImpl): void {\n assert(node.isMutable, 'Expected node to be mutable');\n this.#modified.set(node.hash, node);\n this._cache.set(node.hash, node);\n }\n\n updateNode(node: DataNodeImpl | InternalNodeImpl): void {\n assert(node.isMutable, 'Expected node to be mutable');\n this.#modified.delete(node.hash);\n node.hash = newRandomHash();\n this.#addToModified(node);\n }\n\n newInternalNodeImpl(\n entries: Array<Entry<Hash>>,\n level: number,\n ): InternalNodeImpl {\n const n = new InternalNodeImpl(entries, newRandomHash(), level, true);\n this.#addToModified(n);\n return n;\n }\n\n newDataNodeImpl(entries: Entry<FrozenJSONValue>[]): DataNodeImpl {\n const n = new DataNodeImpl(entries, newRandomHash(), true);\n this.#addToModified(n);\n return n;\n }\n\n newNodeImpl(entries: Entry<FrozenJSONValue>[], level: number): DataNodeImpl;\n newNodeImpl(entries: Entry<Hash>[], level: number): InternalNodeImpl;\n newNodeImpl(\n entries: Entry<Hash>[] | Entry<FrozenJSONValue>[],\n level: number,\n ): InternalNodeImpl | DataNodeImpl;\n newNodeImpl(\n entries: Entry<Hash>[] | Entry<FrozenJSONValue>[],\n level: number,\n ): InternalNodeImpl | DataNodeImpl {\n const n = newNodeImpl(entries, newRandomHash(), level, true);\n this.#addToModified(n);\n return n;\n }\n\n put(key: string, value: FrozenJSONValue): Promise<void> {\n return this.#lock.withLock(async () => {\n const oldRootNode = await this.getNode(this.rootHash);\n const entrySize = this.getEntrySize(key, value);\n const rootNode = await oldRootNode.set(key, value, entrySize, this);\n\n // We do the rebalancing in the parent so we need to do it here as well.\n if (rootNode.getChildNodeSize(this) > this.maxSize) {\n const headerSize = this.chunkHeaderSize;\n const {level} = rootNode;\n const entries = partition(\n rootNode.entries,\n value => value[2],\n this.minSize - headerSize,\n this.maxSize - headerSize,\n entries => {\n const node = this.newNodeImpl(entries, level);\n return createNewInternalEntryForNode(node, this.getEntrySize);\n },\n );\n const newRoot = this.newInternalNodeImpl(entries, level + 1);\n this.rootHash = newRoot.hash;\n return;\n }\n\n this.rootHash = rootNode.hash;\n });\n }\n\n /**\n * Inserts multiple key-value pairs into the BTree efficiently.\n * The entries array must be sorted by key.\n * @param entries - Array of [key, value] tuples, must be sorted by key\n * @returns Promise that resolves when all entries are inserted\n */\n putMany(\n entries: ReadonlyArray<readonly [string, FrozenJSONValue]>,\n ): Promise<void> {\n return this.#lock.withLock(async () => {\n if (entries.length === 0) {\n return;\n }\n\n // Validate sortedness and convert to sized entries in one pass\n const sizedEntries: Entry<FrozenJSONValue>[] = entries.map(\n ([k, v], i) => {\n if (i > 0) {\n assert(\n entries[i - 1][0] < k,\n `putMany entries must be sorted and unique`,\n );\n }\n return [k, v, this.getEntrySize(k, v)];\n },\n );\n\n // Compute content size constraints\n const headerSize = this.chunkHeaderSize;\n const contentMin = this.minSize - headerSize;\n const contentMax = this.maxSize - headerSize;\n\n // Fast path: if tree is empty, use bulk loading algorithm\n if (this.rootHash === emptyHash) {\n // Build leaf nodes\n const leafPartitions = partition(\n sizedEntries,\n e => e[2],\n contentMin,\n contentMax,\n entries => entries,\n );\n\n if (leafPartitions.length === 0) {\n return;\n }\n\n if (leafPartitions.length === 1) {\n const leaf = this.newDataNodeImpl(leafPartitions[0]);\n this.rootHash = leaf.hash;\n return;\n }\n\n // Build tree bottom-up - reuse array to avoid allocations\n let currentLevel: Array<DataNodeImpl | InternalNodeImpl | Entry<Hash>> =\n leafPartitions.map(entries => this.newDataNodeImpl(entries));\n let level = 0;\n\n while (currentLevel.length > 1) {\n level++;\n\n // Create entries pointing to current level nodes - reuse array\n const parentEntriesLength = currentLevel.length;\n for (let i = 0; i < parentEntriesLength; i++) {\n currentLevel[i] = createNewInternalEntryForNode(\n currentLevel[i] as DataNodeImpl | InternalNodeImpl,\n this.getEntrySize,\n );\n }\n\n // Partition parent entries\n const parentPartitions = partition(\n currentLevel as Entry<Hash>[],\n e => e[2],\n contentMin,\n contentMax,\n entries => entries,\n );\n\n // Create internal nodes\n currentLevel = parentPartitions.map(entries =>\n this.newInternalNodeImpl(entries, level),\n );\n }\n\n this.rootHash = (\n currentLevel[0] as DataNodeImpl | InternalNodeImpl\n ).hash;\n return;\n }\n\n // Slow path: merge with existing tree\n const oldRootNode = await this.getNode(this.rootHash);\n const rootNode = await oldRootNode.putMany(sizedEntries, this);\n\n // We do the rebalancing in the parent so we need to do it here as well.\n if (rootNode.getChildNodeSize(this) > this.maxSize) {\n const {level} = rootNode;\n const entries: Entry<Hash>[] = partition(\n rootNode.entries,\n e => e[2],\n contentMin,\n contentMax,\n partitionEntries => {\n const node = this.newNodeImpl(partitionEntries, level);\n return createNewInternalEntryForNode(node, this.getEntrySize);\n },\n );\n const newRoot = this.newInternalNodeImpl(entries, level + 1);\n this.rootHash = newRoot.hash;\n return;\n }\n\n this.rootHash = rootNode.hash;\n });\n }\n\n del(key: string): Promise<boolean> {\n return this.#lock.withLock(async () => {\n const oldRootNode = await this.getNode(this.rootHash);\n const newRootNode = await oldRootNode.del(key, this);\n\n // No need to rebalance here since if root gets too small there is nothing\n // we can do about that.\n const found = this.rootHash !== newRootNode.hash;\n if (found) {\n // Flatten one layer.\n if (newRootNode.level > 0 && newRootNode.entries.length === 1) {\n this.rootHash = (newRootNode as InternalNodeImpl).entries[0][1];\n } else {\n this.rootHash = newRootNode.hash;\n }\n }\n\n return found;\n });\n }\n\n clear(): Promise<void> {\n return this.#lock.withLock(() => {\n this.#modified.clear();\n this.rootHash = emptyHash;\n });\n }\n\n flush(): Promise<Hash> {\n return this.#lock.withLock(async () => {\n const dagWrite = this._dagRead;\n\n if (this.rootHash === emptyHash) {\n // Write a chunk for the empty tree.\n const chunk = dagWrite.createChunk(emptyDataNode, []);\n await dagWrite.putChunk(chunk as Chunk<ReadonlyJSONValue>);\n return chunk.hash;\n }\n\n const newChunks: Chunk[] = [];\n const newRoot = gatherNewChunks(\n this.rootHash,\n newChunks,\n dagWrite.createChunk,\n this.#modified,\n this._formatVersion,\n );\n await Promise.all(newChunks.map(chunk => dagWrite.putChunk(chunk)));\n this.#modified.clear();\n this.rootHash = newRoot;\n return newRoot;\n });\n }\n}\n\nfunction gatherNewChunks(\n hash: Hash,\n newChunks: Chunk[],\n createChunk: CreateChunk,\n modified: Map<Hash, DataNodeImpl | InternalNodeImpl>,\n formatVersion: FormatVersion,\n): Hash {\n const node = modified.get(hash);\n if (node === undefined) {\n // Not modified, use the original.\n return hash;\n }\n\n if (isDataNodeImpl(node)) {\n const chunk = createChunk(toChunkData(node, formatVersion), []);\n newChunks.push(chunk);\n return chunk.hash;\n }\n\n // The BTree cannot have duplicate keys so the child entry hashes are unique.\n // No need fot a set to dedupe here.\n const refs: Hash[] = [];\n const {entries} = node;\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n const childHash = entry[1];\n const newChildHash = gatherNewChunks(\n childHash,\n newChunks,\n createChunk,\n modified,\n formatVersion,\n );\n if (newChildHash !== childHash) {\n // MUTATES the entries!\n // Hashes do not change the size of the entry because all hashes have the same length\n entries[i] = [entry[0], newChildHash, entry[2]];\n }\n refs.push(newChildHash);\n }\n const chunk = createChunk(toChunkData(node, formatVersion), toRefs(refs));\n newChunks.push(chunk);\n return chunk.hash;\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-default-fetch.js","names":[],"sources":["../../../../replicache/src/call-default-fetch.ts"],"sourcesContent":["import type {HTTPRequestInfo} from './http-request-info.ts';\n\n/**\n * Helper function for {@link getDefaultPuller} and {@link getDefaultPusher}.\n */\nexport async function callDefaultFetch<Body>(\n url: string,\n auth: string,\n requestID: string,\n requestBody: Body,\n): Promise<readonly [Response | undefined, HTTPRequestInfo]> {\n const init = {\n headers: {\n 'Content-type': 'application/json',\n 'Authorization': auth,\n 'X-Replicache-RequestID': requestID,\n },\n body: JSON.stringify(requestBody),\n method: 'POST',\n };\n const request = new Request(url, init);\n const response = await fetch(request);\n const httpStatusCode = response.status;\n if (httpStatusCode !== 200) {\n return [\n undefined,\n {\n httpStatusCode,\n errorMessage: await response.text(),\n },\n ];\n }\n return [\n response,\n {\n httpStatusCode,\n errorMessage: '',\n },\n ];\n}\n"],"mappings":";;;;AAKA,eAAsB,iBACpB,KACA,MACA,WACA,aAC2D;CAC3D,MAAM,OAAO;EACX,SAAS;GACP,gBAAgB;GAChB,iBAAiB;GACjB,0BAA0B;EAC5B;EACA,MAAM,KAAK,UAAU,WAAW;EAChC,QAAQ;CACV;CACA,MAAM,UAAU,IAAI,QAAQ,KAAK,IAAI;CACrC,MAAM,WAAW,MAAM,MAAM,OAAO;CACpC,MAAM,iBAAiB,SAAS;CAChC,IAAI,mBAAmB,KACrB,OAAO,CACL,KAAA,GACA;EACE;EACA,cAAc,MAAM,SAAS,KAAK;CACpC,CACF;CAEF,OAAO,CACL,UACA;EACE;EACA,cAAc;CAChB,CACF;AACF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-loop-delegates.js","names":[],"sources":["../../../../replicache/src/connection-loop-delegates.ts"],"sourcesContent":["import type {ConnectionLoopDelegate} from './connection-loop.ts';\nimport type {ReplicacheImpl} from './replicache-impl.ts';\n\nclass ConnectionLoopDelegateImpl {\n readonly rep: ReplicacheImpl;\n readonly invokeSend: () => Promise<boolean>;\n\n // TODO: Remove the ability to have more than one concurrent connection and update tests.\n // Bug: https://github.com/rocicorp/replicache-internal/issues/303\n readonly maxConnections = 1;\n\n constructor(rep: ReplicacheImpl, invokeSend: () => Promise<boolean>) {\n this.rep = rep;\n this.invokeSend = invokeSend;\n }\n\n get maxDelayMs(): number {\n return this.rep.requestOptions.maxDelayMs;\n }\n\n get minDelayMs(): number {\n return this.rep.requestOptions.minDelayMs;\n }\n}\n\nexport class PullDelegate\n extends ConnectionLoopDelegateImpl\n implements ConnectionLoopDelegate\n{\n readonly debounceDelay = 0;\n\n get watchdogTimer(): number | null {\n return this.rep.pullInterval;\n }\n}\n\nexport class PushDelegate\n extends ConnectionLoopDelegateImpl\n implements ConnectionLoopDelegate\n{\n get debounceDelay(): number {\n return this.rep.pushDelay;\n }\n\n watchdogTimer = null;\n}\n"],"mappings":";AAGA,IAAM,6BAAN,MAAiC;CAC/B;CACA;CAIA,iBAA0B;CAE1B,YAAY,KAAqB,YAAoC;EACnE,KAAK,MAAM;EACX,KAAK,aAAa;CACpB;CAEA,IAAI,aAAqB;EACvB,OAAO,KAAK,IAAI,eAAe;CACjC;CAEA,IAAI,aAAqB;EACvB,OAAO,KAAK,IAAI,eAAe;CACjC;AACF;AAEA,IAAa,eAAb,cACU,2BAEV;CACE,gBAAyB;CAEzB,IAAI,gBAA+B;EACjC,OAAO,KAAK,IAAI;CAClB;AACF;AAEA,IAAa,eAAb,cACU,2BAEV;CACE,IAAI,gBAAwB;EAC1B,OAAO,KAAK,IAAI;CAClB;CAEA,gBAAgB;AAClB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-loop.js","names":["#delegate","#lc","#visibilityWatcher","#closed","#abortSignal","#sendCounter","#sendResolver","#skipSleepsResolver","#pendingResolver","#waitUntilAvailableConnection","#connectionAvailable","#waitingConnectionResolve"],"sources":["../../../../replicache/src/connection-loop.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport {resolver} from '@rocicorp/resolver';\nimport type {DocumentVisibilityWatcher} from '../../shared/src/document-visible.ts';\nimport {sleep} from '../../shared/src/sleep.ts';\n\nexport const DEBOUNCE_DELAY_MS = 10;\n\nexport const MIN_DELAY_MS = 30;\nexport const MAX_DELAY_MS = 60_000;\n\ntype SendRecord = {duration: number; ok: boolean};\n\nexport interface ConnectionLoopDelegate {\n invokeSend(): Promise<boolean>;\n debounceDelay: number;\n // If null, no watchdog timer is used.\n watchdogTimer: number | null;\n maxConnections: number;\n maxDelayMs: number;\n minDelayMs: number;\n}\n\nexport class ConnectionLoop {\n // ConnectionLoop runs a loop sending network requests (either pushes or\n // pulls) to the server. Our goal, generally, is to send requests as fast as\n // we can, but to adjust in case of slowness, network errors, etc. We will\n // send requests in parallel if the server supports it. We also debounce\n // pushes since they frequently happen in series very near to one another\n // (e.g., during drag'n drops).\n //\n // The loop flows through the following states forever, until it is closed:\n //\n // Pending: Wait for event or watchdog\n // |\n // v\n // Debounce: Wait for more events (we debounce pushes)\n // |\n // v\n // Wait for available connection (we limit number of parallel requests\n // allowed)\n // |\n // v\n // Wait to send (if requests are taking too long, we will slow down)\n // |\n // v\n // Send (asynchronously, wrt the loop)\n // |\n // v\n // Back to the pending!\n\n // Controls whether the next iteration of the loop will wait at the pending\n // state.\n #pendingResolver = resolver<void>();\n\n /**\n * This resolver is used to allow us to skip sleeps when we do send(true)\n */\n #skipSleepsResolver = resolver<void>();\n\n /**\n * Resolver for the next send. Never rejects. Returns an error instead since\n * this resolver is used in cases where they might not be someone waiting,\n * and we don't want an unhandled promise rejection in that case.\n */\n #sendResolver = resolver<undefined | {error: unknown}>();\n\n readonly #delegate: ConnectionLoopDelegate;\n #closed = false;\n #abortSignal = new AbortController();\n\n /**\n * Number of pending send calls.\n *\n * We keep track of this because if close happens while we are waiting for the\n * send to resolve we should reject the send promise.\n */\n #sendCounter = 0;\n readonly #lc: LogContext;\n readonly #visibilityWatcher: DocumentVisibilityWatcher | undefined;\n\n constructor(\n lc: LogContext,\n delegate: ConnectionLoopDelegate,\n visibilityWatcher?: DocumentVisibilityWatcher,\n ) {\n this.#lc = lc;\n this.#delegate = delegate;\n this.#visibilityWatcher = visibilityWatcher;\n void this.run();\n }\n\n close(): void {\n this.#closed = true;\n this.#abortSignal.abort();\n if (this.#sendCounter > 0) {\n this.#sendResolver.resolve({error: closeError()});\n }\n }\n\n /**\n *\n * @returns Returns undefined if ok, otherwise it return the error that caused\n * the send to fail.\n */\n async send(now: boolean): Promise<undefined | {error: unknown}> {\n if (this.#closed) {\n return {error: closeError()};\n }\n this.#sendCounter++;\n this.#lc.debug?.('send', now);\n if (now) {\n this.#skipSleepsResolver.resolve();\n } else {\n await this.#visibilityWatcher?.waitForVisible();\n }\n\n this.#pendingResolver.resolve();\n\n const result = await this.#sendResolver.promise;\n this.#sendCounter--;\n return result;\n }\n\n async run(): Promise<void> {\n const sendRecords: SendRecord[] = [];\n\n let recoverResolver = resolver();\n let lastSendTime;\n\n // The number of active connections.\n let counter = 0;\n const delegate = this.#delegate;\n const {debug} = this.#lc;\n let delay = 0;\n\n debug?.('Starting connection loop');\n\n const sleepMaybeSkip: typeof sleep = ms =>\n Promise.race([this.#skipSleepsResolver.promise, sleep(ms)]);\n\n while (!this.#closed) {\n debug?.(\n didLastSendRequestFail(sendRecords)\n ? 'Last request failed. Trying again'\n : 'Waiting for a send',\n );\n\n // Wait until send is called or until the watchdog timer fires.\n const races = [this.#pendingResolver.promise];\n const t = delegate.watchdogTimer;\n if (t !== null) {\n // Wait for the watchdog timer to fire or the abort signal to be triggered.\n races.push(sleep(t, this.#abortSignal.signal).catch(() => {}));\n }\n await Promise.race(races);\n if (this.#closed) break;\n\n debug?.('Waiting for debounce');\n await sleepMaybeSkip(delegate.debounceDelay);\n if (this.#closed) break;\n debug?.('debounced');\n\n // This resolver is used to wait for incoming push calls.\n this.#pendingResolver = resolver();\n\n if (counter >= delegate.maxConnections) {\n debug?.('Too many request in flight. Waiting until one finishes...');\n await this.#waitUntilAvailableConnection();\n if (this.#closed) break;\n debug?.('...finished');\n }\n\n // We need to delay the next request even if there are no active requests\n // in case of error.\n if (counter > 0 || didLastSendRequestFail(sendRecords)) {\n delay = computeDelayAndUpdateDurations(delay, delegate, sendRecords);\n debug?.(\n didLastSendRequestFail(sendRecords)\n ? 'Last connection errored. Sleeping for'\n : 'More than one outstanding connection (' +\n counter +\n '). Sleeping for',\n delay,\n 'ms',\n );\n } else {\n // We set this to 0 here in case minDelayMs is mutated to a lower value\n // than the old delay so that we still get minDelayMs. This can happen\n // if we get an error during a run where minDelayMs is larger than the\n // current value of minDelayMs.\n delay = 0;\n }\n\n const clampedDelay = Math.min(\n delegate.maxDelayMs,\n Math.max(delegate.minDelayMs, delay),\n );\n if (lastSendTime !== undefined) {\n const timeSinceLastSend = Date.now() - lastSendTime;\n if (clampedDelay > timeSinceLastSend) {\n await Promise.race([\n sleepMaybeSkip(clampedDelay - timeSinceLastSend),\n recoverResolver.promise,\n ]);\n if (this.#closed) break;\n }\n }\n\n counter++;\n void (async () => {\n const start = Date.now();\n let ok: boolean;\n let error: unknown;\n try {\n lastSendTime = start;\n debug?.('Sending request');\n this.#skipSleepsResolver = resolver();\n ok = await delegate.invokeSend();\n debug?.('Send returned', ok);\n } catch (e) {\n debug?.('Send failed', e);\n error = e;\n ok = false;\n }\n if (this.#closed) {\n debug?.('Closed after invokeSend');\n return;\n }\n debug?.('Request done', {duration: Date.now() - start, ok});\n sendRecords.push({duration: Date.now() - start, ok});\n if (recovered(sendRecords)) {\n recoverResolver.resolve();\n recoverResolver = resolver();\n }\n counter--;\n this.#connectionAvailable();\n const sendResolver = this.#sendResolver;\n this.#sendResolver = resolver();\n if (error) {\n sendResolver.resolve({error});\n } else {\n sendResolver.resolve(undefined);\n }\n if (!ok) {\n // Keep trying\n this.#pendingResolver.resolve();\n }\n })();\n }\n }\n\n #waitingConnectionResolve: (() => void) | undefined = undefined;\n\n #connectionAvailable() {\n if (this.#waitingConnectionResolve) {\n const resolve = this.#waitingConnectionResolve;\n this.#waitingConnectionResolve = undefined;\n resolve();\n }\n }\n\n #waitUntilAvailableConnection() {\n const {promise, resolve} = resolver();\n this.#waitingConnectionResolve = resolve;\n return promise;\n }\n}\n\n// Number of connections to remember when computing the new delay.\nconst CONNECTION_MEMORY_COUNT = 9;\n\nfunction closeError() {\n return new Error('Closed');\n}\n\n// Computes a new delay based on the previous requests. We use the median of the\n// previous successful request divided by `maxConnections`. When we get errors\n// we do exponential backoff. As soon as we recover from an error we reset back\n// to delegate.minDelayMs.\nfunction computeDelayAndUpdateDurations(\n delay: number,\n delegate: ConnectionLoopDelegate,\n sendRecords: SendRecord[],\n): number {\n const {length} = sendRecords;\n if (length === 0) {\n return delay;\n }\n\n // oxlint-disable-next-line typescript/no-non-null-assertion\n const {ok} = sendRecords.at(-1)!;\n const {maxConnections, minDelayMs} = delegate;\n\n if (!ok) {\n return delay === 0 ? minDelayMs : delay * 2;\n }\n\n if (length > 1) {\n // length > 1\n const previous: SendRecord = sendRecords[sendRecords.length - 2];\n\n // Prune\n while (sendRecords.length > CONNECTION_MEMORY_COUNT) {\n sendRecords.shift();\n }\n\n if (ok && !previous.ok) {\n // Recovered\n return minDelayMs;\n }\n }\n\n const med = median(\n sendRecords.filter(({ok}) => ok).map(({duration}) => duration),\n );\n\n return (med / maxConnections) | 0;\n}\n\nfunction median(values: number[]) {\n values.sort();\n const {length} = values;\n const half = length >> 1;\n if (length % 2 === 1) {\n return values[half];\n }\n return (values[half - 1] + values[half]) / 2;\n}\n\nfunction didLastSendRequestFail(sendRecords: SendRecord[]) {\n // oxlint-disable-next-line typescript/no-non-null-assertion\n return sendRecords.length > 0 && !sendRecords.at(-1)!.ok;\n}\n\nfunction recovered(sendRecords: SendRecord[]) {\n return (\n sendRecords.length > 1 &&\n !sendRecords[sendRecords.length - 2].ok &&\n // oxlint-disable-next-line typescript/no-non-null-assertion\n sendRecords.at(-1)!.ok\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.js","names":[],"sources":["../../../../replicache/src/cookies.ts"],"sourcesContent":["import {\n assertJSONObject,\n type ReadonlyJSONValue,\n} from '../../shared/src/json.ts';\nimport {stringCompare} from '../../shared/src/string-compare.ts';\nimport type {FrozenJSONValue} from './frozen-json.ts';\n\n/**\n * A cookie is a value that is used to determine the order of snapshots. It\n * needs to be comparable. This can be a `string`, `number` or if you want to\n * use a more complex value, you can use an object with an `order` property. The\n * value `null` is considered to be less than any other cookie and it is used\n * for the first pull when no cookie has been set.\n *\n * The order is the natural order of numbers and strings. If one of the cookies\n * is an object then the value of the `order` property is treated as the cookie\n * when doing comparison.\n *\n * If one of the cookies is a string and the other is a number, the number is\n * fist converted to a string (using `toString()`).\n */\nexport type Cookie =\n | null\n | string\n | number\n | (ReadonlyJSONValue & {readonly order: number | string});\n\nexport type FrozenCookie =\n | null\n | string\n | number\n | (FrozenJSONValue & {readonly order: number | string});\n\n/**\n * Compare two cookies.\n * `null` is considered to be less than any other cookie.\n */\nexport function compareCookies(a: Cookie, b: Cookie): number {\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\n const cva = getCompareValue(a);\n const cvb = getCompareValue(b);\n\n // If either a or b is a string. Compare by string.\n if (typeof cva === 'string' || typeof cvb === 'string') {\n return stringCompare(String(cva), String(cvb));\n }\n\n return cva - cvb;\n}\n\ntype NonNull<T> = T extends null ? never : T;\n\nfunction getCompareValue(cookie: NonNull<Cookie>): string | number {\n if (typeof cookie === 'string' || typeof cookie === 'number') {\n return cookie;\n }\n return cookie.order;\n}\n\nexport function assertCookie(v: unknown): asserts v is Cookie {\n if (v === null || typeof v === 'string' || typeof v === 'number') {\n return;\n }\n\n assertJSONObject(v);\n if (typeof v.order === 'string' || typeof v.order === 'number') {\n return;\n }\n\n throw new Error('Invalid cookie');\n}\n"],"mappings":";;;;;;;AAqCA,SAAgB,eAAe,GAAW,GAAmB;CAC3D,IAAI,MAAM,GACR,OAAO;CAET,IAAI,MAAM,MACR,OAAO;CAET,IAAI,MAAM,MACR,OAAO;CAGT,MAAM,MAAM,gBAAgB,CAAC;CAC7B,MAAM,MAAM,gBAAgB,CAAC;CAG7B,IAAI,OAAO,QAAQ,YAAY,OAAO,QAAQ,UAC5C,OAAO,cAAc,OAAO,GAAG,GAAG,OAAO,GAAG,CAAC;CAG/C,OAAO,MAAM;AACf;AAIA,SAAS,gBAAgB,QAA0C;CACjE,IAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAClD,OAAO;CAET,OAAO,OAAO;AAChB;AAEA,SAAgB,aAAa,GAAiC;CAC5D,IAAI,MAAM,QAAQ,OAAO,MAAM,YAAY,OAAO,MAAM,UACtD;CAGF,iBAAiB,CAAC;CAClB,IAAI,OAAO,EAAE,UAAU,YAAY,OAAO,EAAE,UAAU,UACpD;CAGF,MAAM,IAAI,MAAM,gBAAgB;AAClC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk.js","names":[],"sources":["../../../../../replicache/src/dag/chunk.ts"],"sourcesContent":["import {assert, assertString} from '../../../shared/src/asserts.ts';\nimport {assertDeepFrozen} from '../frozen-json.ts';\nimport type {Hash} from '../hash.ts';\n\n// By using declare we tell the type system that there is a unique symbol.\n// However, there is no such symbol but the type system does not care.\ndeclare const refsTag: unique symbol;\n\n/**\n * Opaque type representing a Refs. The reason to use an opaque type here is to\n * make sure that Refs are always sorted and have no duplicates.\n */\nexport type Refs = [] | readonly [Hash] | (readonly Hash[] & {[refsTag]: true});\n\n/**\n * Convert to a Refs when we already know it is sorted and has no duplicates.\n */\nexport function asRefs(sortedRefs: Hash[]): Refs {\n return sortedRefs as unknown as Refs;\n}\n\n/**\n * Sorts and tags as Refs. If an Array is passed in the array is sorted in\n * place, otherwise a copy of the iterable is created. This checks for duplicates.\n */\nexport function toRefs(refs: Hash[] | Set<Hash>): Refs {\n if (Array.isArray(refs)) {\n refs.sort();\n for (let i = 1; i < refs.length; i++) {\n assert(refs[i - 1] !== refs[i], 'Refs must not have duplicates');\n }\n return asRefs(refs);\n }\n\n const refsArray = [...refs];\n refsArray.sort();\n // no need to check for duplicates as Set cannot have duplicates.\n return asRefs(refsArray);\n}\n\nexport class Chunk<V = unknown> {\n readonly hash: Hash;\n readonly data: V;\n\n /**\n * Meta is an array of refs. If there are no refs we do not write a meta\n * chunk.\n */\n readonly meta: Refs;\n\n constructor(hash: Hash, data: V, refs: Refs) {\n assert(\n !(refs as unknown[]).includes(hash),\n 'Chunk cannot reference itself',\n );\n assertDeepFrozen(data);\n this.hash = hash;\n this.data = data;\n this.meta = refs;\n }\n}\n\nexport function assertRefs(v: unknown): asserts v is Refs {\n if (!Array.isArray(v)) {\n throw new Error('Refs must be an array');\n }\n if (v.length > 0) {\n assertString(v[0]);\n for (let i = 1; i < v.length; i++) {\n assertString(v[i]);\n }\n }\n}\n\nexport function createChunk<V>(\n data: V,\n refs: Refs,\n chunkHasher: ChunkHasher,\n): Chunk<V> {\n const hash = chunkHasher();\n return new Chunk(hash, data, refs);\n}\n\nexport type CreateChunk = <V>(data: V, refs: Refs) => Chunk<V>;\n\nexport type ChunkHasher = () => Hash;\n\nexport function throwChunkHasher(): Hash {\n throw new Error('unexpected call to compute chunk hash');\n}\n"],"mappings":";;;;;;AAiBA,SAAgB,OAAO,YAA0B;CAC/C,OAAO;AACT;;;;;AAMA,SAAgB,OAAO,MAAgC;CACrD,IAAI,MAAM,QAAQ,IAAI,GAAG;EACvB,KAAK,KAAK;EACV,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAC/B,OAAO,KAAK,IAAI,OAAO,KAAK,IAAI,+BAA+B;EAEjE,OAAO,OAAO,IAAI;CACpB;CAEA,MAAM,YAAY,CAAC,GAAG,IAAI;CAC1B,UAAU,KAAK;CAEf,OAAO,OAAO,SAAS;AACzB;AAEA,IAAa,QAAb,MAAgC;CAC9B;CACA;;;;;CAMA;CAEA,YAAY,MAAY,MAAS,MAAY;EAC3C,OACE,CAAE,KAAmB,SAAS,IAAI,GAClC,+BACF;EACA,iBAAiB,IAAI;EACrB,KAAK,OAAO;EACZ,KAAK,OAAO;EACZ,KAAK,OAAO;CACd;AACF;AAEA,SAAgB,WAAW,GAA+B;CACxD,IAAI,CAAC,MAAM,QAAQ,CAAC,GAClB,MAAM,IAAI,MAAM,uBAAuB;CAEzC,IAAI,EAAE,SAAS,GAAG;EAChB,aAAa,EAAE,EAAE;EACjB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAC5B,aAAa,EAAE,EAAE;CAErB;AACF;AAEA,SAAgB,YACd,MACA,MACA,aACU;CAEV,OAAO,IAAI,MADE,YACI,GAAM,MAAM,IAAI;AACnC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gc.js","names":["#newHeads","#oldHeads","#putChunks","#delegate","#refsCounted","#refCountUpdates","#loadedRefCountPromises","#isLazyDelegate","#changeRefCount","#ensureRefCountLoaded","#updateRefsCounts","#updateRefCount"],"sources":["../../../../../replicache/src/dag/gc.ts"],"sourcesContent":["import {assert, assertNumber} from '../../../shared/src/asserts.ts';\nimport type {MaybePromise} from '../../../shared/src/types.ts';\nimport {skipGCAsserts} from '../config.ts';\nimport {type Hash, emptyHash} from '../hash.ts';\n\nexport type HeadChange = {\n new: Hash | undefined;\n old: Hash | undefined;\n};\n\ntype LoadedRefCountPromises = Map<Hash, Promise<number>>;\n\nexport interface RefCountUpdatesDelegate {\n getRefCount: (hash: Hash) => MaybePromise<number | undefined>;\n getRefs: (hash: Hash) => MaybePromise<readonly Hash[] | undefined>;\n /**\n * Should be implemented if the store lazily loads refs, returning whether\n * or not the chunks refs have already been counted (i.e. are reflected\n * in `getRefCount`).\n *\n * If defined then:\n * - `getRefs` should return undefined for refs that have not been loaded,\n * but should never return undefined for hashes in `putChunks`.\n * - it is assumed that chunks in `putChunks` may have been reachable before\n * the write, but may not have been counted. This method is used to\n * determine if they have been counted or not. If they have not been\n * counted, and are reachable with the write applied, the returned\n * ref count updates will include updates for counting them.\n *\n * If undefined then:\n * - `getRefs` should never return undefined\n * - it is assumed that the refs of any chunks which were reachable before\n * the write are already counted\n */\n areRefsCounted?: (hash: Hash) => boolean;\n}\n\n/**\n * Computes how ref counts should be updated when a dag write is committed.\n * Does not modify the dag store.\n * @param headChanges Heads that were changed by the dag write.\n * @param putChunks Chunks that were put by the dag write.\n * @param delegate Delegate used for getting ref information from the dag store.\n * @returns Map from chunk Hash to changed ref counts. Chunks with a new ref\n * count of 0 should be deleted. All hashes in `putChunks` will have an entry\n * (which will be zero if the newly put chunk is not reachable from any head).\n */\nexport function computeRefCountUpdates(\n headChanges: Iterable<HeadChange>,\n putChunks: ReadonlySet<Hash>,\n delegate: RefCountUpdatesDelegate,\n): Promise<Map<Hash, number>> {\n return new RefCountUpdates(headChanges, putChunks, delegate).compute();\n}\n\nclass RefCountUpdates {\n readonly #newHeads: Hash[];\n readonly #oldHeads: Hash[];\n readonly #putChunks: ReadonlySet<Hash>;\n readonly #delegate: RefCountUpdatesDelegate;\n readonly #refsCounted: Set<Hash> | null;\n readonly #refCountUpdates: Map<Hash, number>;\n readonly #loadedRefCountPromises: LoadedRefCountPromises;\n readonly #isLazyDelegate: boolean;\n\n constructor(\n headChanges: Iterable<HeadChange>,\n putChunks: ReadonlySet<Hash>,\n delegate: RefCountUpdatesDelegate,\n ) {\n const newHeads: Hash[] = [];\n const oldHeads: Hash[] = [];\n for (const changedHead of headChanges) {\n if (changedHead.old !== changedHead.new) {\n changedHead.old && oldHeads.push(changedHead.old);\n changedHead.new && newHeads.push(changedHead.new);\n }\n }\n this.#newHeads = newHeads;\n this.#oldHeads = oldHeads;\n this.#putChunks = putChunks;\n this.#delegate = delegate;\n this.#refCountUpdates = new Map();\n // This map is used to ensure we do not load the ref count key more than once.\n // Once it is loaded we only operate on a cache of the ref counts.\n this.#loadedRefCountPromises = new Map();\n this.#isLazyDelegate = delegate.areRefsCounted !== undefined;\n this.#refsCounted = this.#isLazyDelegate ? new Set() : null;\n }\n\n async compute(): Promise<Map<Hash, number>> {\n for (const n of this.#newHeads) {\n await this.#changeRefCount(n, 1);\n }\n\n // Now go through the put chunks to ensure each has an entry in\n // refCountUpdates (zero for new chunks which are not reachable from\n // newHeads).\n await Promise.all(\n Array.from(this.#putChunks.values(), hash =>\n this.#ensureRefCountLoaded(hash),\n ),\n );\n\n if (this.#isLazyDelegate) {\n assert(\n this.#delegate.areRefsCounted,\n 'Expected delegate.areRefsCounted to be defined',\n );\n assert(this.#refsCounted, 'Expected refsCounted to be defined');\n let refCountsUpdated;\n do {\n refCountsUpdated = false;\n for (const hash of this.#putChunks.values()) {\n if (\n !this.#delegate.areRefsCounted(hash) &&\n !this.#refsCounted.has(hash) &&\n this.#refCountUpdates.get(hash) !== 0\n ) {\n await this.#updateRefsCounts(hash, 1);\n refCountsUpdated = true;\n break;\n }\n }\n } while (refCountsUpdated);\n }\n\n for (const o of this.#oldHeads) {\n await this.#changeRefCount(o, -1);\n }\n\n if (!skipGCAsserts) {\n for (const [hash, update] of this.#refCountUpdates) {\n assert(\n update >= 0,\n `ref count update must be non-negative. ${hash}:${update}`,\n );\n }\n }\n\n return this.#refCountUpdates;\n }\n\n async #changeRefCount(hash: Hash, delta: number): Promise<void> {\n // First make sure that we have the ref count in the cache. This is async\n // because it might need to load the ref count from the store (via the delegate).\n //\n // Once we have loaded the ref count all the updates to it are sync to\n // prevent race conditions.\n await this.#ensureRefCountLoaded(hash);\n if (this.#updateRefCount(hash, delta)) {\n await this.#updateRefsCounts(hash, delta);\n }\n }\n\n async #updateRefsCounts(hash: Hash, delta: number) {\n if (hash === emptyHash) {\n return;\n }\n const refs = await this.#delegate.getRefs(hash);\n if (!skipGCAsserts) {\n assert(\n refs || (this.#isLazyDelegate && !this.#putChunks.has(hash)),\n 'refs must be defined',\n );\n }\n\n if (refs !== undefined) {\n this.#refsCounted?.add(hash);\n const ps = refs.map(ref => this.#changeRefCount(ref, delta));\n await Promise.all(ps);\n }\n }\n\n #ensureRefCountLoaded(hash: Hash): Promise<number> {\n // Only get the ref count once.\n let p = this.#loadedRefCountPromises.get(hash);\n if (p === undefined) {\n p = (async () => {\n const value = (await this.#delegate.getRefCount(hash)) || 0;\n this.#refCountUpdates.set(hash, value);\n return value;\n })();\n this.#loadedRefCountPromises.set(hash, p);\n }\n return p;\n }\n\n #updateRefCount(hash: Hash, delta: number): boolean {\n const oldCount = this.#refCountUpdates.get(hash);\n assertNumber(oldCount);\n this.#refCountUpdates.set(hash, oldCount + delta);\n return (oldCount === 0 && delta === 1) || (oldCount === 1 && delta === -1);\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.js","names":[],"sources":["../../../../../replicache/src/dag/key.ts"],"sourcesContent":["import {type Hash, parse as parseHash} from '../hash.ts';\nimport * as KeyType from './key-type-enum.ts';\n\nexport function chunkDataKey(hash: Hash): string {\n return `c/${hash}/d`;\n}\n\nexport function chunkMetaKey(hash: Hash): string {\n return `c/${hash}/m`;\n}\n\nexport function chunkRefCountKey(hash: Hash): string {\n return `c/${hash}/r`;\n}\n\nexport function headKey(name: string): string {\n return `h/${name}`;\n}\n\nexport type Key =\n | {\n type: KeyType.ChunkData;\n hash: Hash;\n }\n | {\n type: KeyType.ChunkMeta;\n hash: Hash;\n }\n | {\n type: KeyType.ChunkRefCount;\n hash: Hash;\n }\n | {\n type: KeyType.Head;\n name: string;\n };\n\nexport function parse(key: string): Key {\n const invalidKey = () => new Error(`Invalid key. Got \"${key}\"`);\n const hash = () => parseHash(key.substring(2, key.length - 2));\n\n // '/'\n if (key.charCodeAt(1) === 47) {\n switch (key.charCodeAt(0)) {\n // c\n case 99: {\n if (key.length < 4 || key.charCodeAt(key.length - 2) !== 47) {\n throw invalidKey();\n }\n switch (key.charCodeAt(key.length - 1)) {\n case 100: // d\n return {\n type: KeyType.ChunkData,\n hash: hash(),\n };\n case 109: // m\n return {\n type: KeyType.ChunkMeta,\n hash: hash(),\n };\n case 114: // r\n return {\n type: KeyType.ChunkRefCount,\n hash: hash(),\n };\n }\n break;\n }\n case 104: // h\n return {\n type: KeyType.Head,\n name: key.substring(2),\n };\n }\n }\n throw invalidKey();\n}\n"],"mappings":";;AAGA,SAAgB,aAAa,MAAoB;CAC/C,OAAO,KAAK,KAAK;AACnB;AAEA,SAAgB,aAAa,MAAoB;CAC/C,OAAO,KAAK,KAAK;AACnB;AAEA,SAAgB,iBAAiB,MAAoB;CACnD,OAAO,KAAK,KAAK;AACnB;AAEA,SAAgB,QAAQ,MAAsB;CAC5C,OAAO,KAAK;AACd"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy-store.js","names":["#rwLock","#heads","#sourceStore","#chunkHasher","#assertValidHash","#release","#sourceReadOwnedByCaller","#sourceRead","#closed","#refCounts","#refs","#createdChunks","#setHead","#cacheSizeLimit","#getSizeOfChunk","#suspendedDeletes","#cacheChunk","#ensureCacheSizeLimit","#evictsAndDeletesSuspended","#size","#evict","#deleteEntryByHash"],"sources":["../../../../../replicache/src/dag/lazy-store.ts"],"sourcesContent":["import {RWLock} from '@rocicorp/lock';\nimport {joinIterables} from '../../../shared/src/iterables.ts';\nimport {promiseVoid} from '../../../shared/src/resolved-promises.ts';\nimport {getSizeOfValue} from '../../../shared/src/size-of-value.ts';\nimport type {MaybePromise} from '../../../shared/src/types.ts';\nimport type {Hash} from '../hash.ts';\nimport type {Chunk} from './chunk.ts';\nimport {type ChunkHasher, type Refs, createChunk} from './chunk.ts';\nimport {\n type HeadChange,\n type RefCountUpdatesDelegate,\n computeRefCountUpdates,\n} from './gc.ts';\nimport {type Read, type Store, type Write, mustGetChunk} from './store.ts';\n\n/**\n * Dag Store which lazily loads values from a source store and then caches\n * them in an LRU cache. The memory cache for chunks from the source store\n * size is limited to `sourceCacheSizeLimit` bytes, and values are evicted in an\n * LRU fashion. The purpose of this store is to avoid holding the entire client\n * view (i.e. the source store's content) in each tab's JavaScript heap.\n *\n * This store's heads are independent from the heads of source store, and are\n * only stored in memory.\n *\n * Chunks which are created via this store's {@link Write} transaction's\n * {@link createChunk} method are assumed to not be persisted to the source\n * store and thus are cached separately from the source store chunks. These\n * memory-only chunks will not be evicted, and their sizes are not counted\n * towards the source chunk cache size. A memory-only chunk will be deleted if\n * it is no longer reachable from one of this store's heads.\n *\n * Writes only manipulate the in memory state of this store and do not alter the\n * source store. Thus values must be written to the source store through a\n * separate process (see {@link persist}).\n *\n * Intended use:\n * 1. source store is the 'perdag', a slower persistent store (i.e.\n * dag.StoreImpl using a kv.IDBStore)\n * 2. this store's 'main' head is initialized to the hash of a chunk containing\n * a commit in the source store\n * 3. reads lazily read chunks from the source store and cache them\n * 3. writes are initially made to this store with memory-only chunks\n * 4. writes are asynchronously persisted to the source store through a separate\n * process (see {@link persist}}. This process gathers memory-only chunks\n * from this store and then writes them to the source store. It then informs\n * this store that these chunks are no longer memory-only by calling\n * {@link chunksPersisted}, which move these chunks\n * to this store's LRU cache of source chunks (making them eligible for\n * eviction).\n *\n * @param sourceStore Store to lazy load and cache values from.\n * @param sourceCacheSizeLimit Size limit in bytes for cache of chunks loaded\n * from `sourceStore`. This size of a value is determined using\n * `getSizeOfValue`. Keys do not count towards cache size. Memory-only chunks\n * do not count towards cache size.\n * @param getSizeOfValue Function for measuring the size in bytes of a value.\n */\nexport class LazyStore implements Store {\n /**\n * This lock is used to ensure correct isolation of Reads and Writes.\n * Multiple Reads are allowed in parallel but only a single Write. Reads and\n * Writes see an isolated view of the store (corresponding to the Serializable\n * level of transaction isolation defined in the SQL standard).\n *\n * To ensure these semantics the read lock must be acquired when a Read is\n * created and held til it is closed, and a Write lock must be acquired when a\n * Write is created and held til it is committed or closed.\n *\n * Code must have a read or write lock to\n * - read `_heads`\n * - read `_memOnlyChunks`\n * - read `_sourceStore`\n * - read and write `_sourceChunksCache`\n * - read and write `_refCounts`\n * - read and write `_refs`\n * and must have a write lock to\n * - write `_heads`\n * - write `_memOnlyChunks`\n */\n readonly #rwLock = new RWLock();\n readonly #heads = new Map<string, Hash>();\n readonly #sourceStore: Store;\n readonly #chunkHasher: ChunkHasher;\n readonly #assertValidHash: (hash: Hash) => void;\n\n /** The following are protected so testing subclass can access. */\n protected readonly _memOnlyChunks = new Map<Hash, Chunk>();\n protected readonly _sourceChunksCache: ChunksCache;\n /**\n * Ref counts are maintained so that chunks which are unreachable\n * from this stores heads can be eagerly and deterministically deleted from\n * `this._memOnlyChunks` and `this._sourceChunksCache`.\n *\n * These ref counts are independent from `this._sourceStore`'s ref counts.\n * These ref counts are based on reachability from `this._heads`.\n * A chunk is deleted from `this._memOnlyChunks` or\n * `this._sourceChunksCache` (which ever it is in) when its ref count becomes\n * zero.\n * These ref counts count the refs in `this._heads` and `this._refs`.\n *\n * Not all reachable chunk's refs are included in `this._refs`, because this\n * would require loading all chunks reachable in the source store in a\n * non-lazy manner. `this._refs` contains the refs of all currently reachable\n * chunks that were ever in `this._memOnlyChunks` or\n * `this._sourceChunksCache` (even if they have been evicted). A\n * chunk's ref information is lazily discovered and stored in `this._refs` and\n * counted in `this._refCounts`. A chunk's entries in `this._refs` and\n * `this._refCounts` are only deleted when a chunk is deleted due to it\n * becoming unreachable (it is not deleted if the chunk is evicted from the\n * source-store cache).\n *\n * The major implication of this lazy discovery of source store refs, is that\n * a reachable source store chunk may not be cached when loaded, because it is\n * not known to be reachable because some of the pertinent refs have not been\n * discovered. However, in practice chunks are read by traversing the graph\n * starting from a head, and all pertinent refs are discovered as part of the\n * traversal.\n *\n * These ref counts can be changed in two ways:\n * 1. A LazyRead has a cache miss and loads a chunk from the source store that\n * is reachable from this._heads. If this chunk's refs are not currently\n * counted, it will not have an entry in `this._refs`. In this case, the\n * chunks refs will be put in `this._refs` and `this._refCounts` will be\n * updated to count them.\n * 2. A LazyWrite commit updates a head (which can result in increasing or\n * decreasing ref count) or puts a reachable chunk (either a `memory-only` or\n * `source` chunk) that references this hash (increasing ref count). The\n * computation of these ref count changes is delegated to the\n * `computeRefCountUpdates` shared with dag.StoreImpl. In order to\n * delegate determining reachability to `computeRefCountUpdates` and defer\n * this determination until commit time, LazyWrite treats cache misses\n * as a 'put' of the lazily-loaded chunk.\n *\n * A chunk's hash may have an entry in `this._refCounts` without that\n * chunk have ever been in `this._memOnlyChunks` or `this._sourceChunksCache`.\n * This is the case when a head or a reachable chunk that was ever in\n * `this._memOnlyChunks` or `this._sourceChunksCache` references a chunk\n * which is not currently cached (either because it has not been read, or\n * because it has been evicted).\n */\n protected readonly _refCounts = new Map<Hash, number>();\n protected readonly _refs = new Map<Hash, readonly Hash[]>();\n\n constructor(\n sourceStore: Store,\n sourceCacheSizeLimit: number,\n chunkHasher: ChunkHasher,\n assertValidHash: (hash: Hash) => void,\n getSizeOfChunk: (chunk: Chunk) => number = getSizeOfValue,\n ) {\n this._sourceChunksCache = new ChunksCache(\n sourceCacheSizeLimit,\n getSizeOfChunk,\n this._refCounts,\n this._refs,\n );\n this.#sourceStore = sourceStore;\n this.#chunkHasher = chunkHasher;\n this.#assertValidHash = assertValidHash;\n }\n\n async read(sourceRead?: Read): Promise<LazyRead> {\n const release = await this.#rwLock.read();\n return new LazyRead(\n this.#heads,\n this._memOnlyChunks,\n this._sourceChunksCache,\n this.#sourceStore,\n release,\n this.#assertValidHash,\n sourceRead,\n );\n }\n\n async write(): Promise<LazyWrite> {\n const release = await this.#rwLock.write();\n return new LazyWrite(\n this.#heads,\n this._memOnlyChunks,\n this._sourceChunksCache,\n this.#sourceStore,\n this._refCounts,\n this._refs,\n release,\n this.#chunkHasher,\n this.#assertValidHash,\n );\n }\n\n close(): Promise<void> {\n return promiseVoid;\n }\n\n /**\n * Does not acquire any lock on the store.\n */\n isCached(chunkHash: Hash): boolean {\n return (\n this._sourceChunksCache.getWithoutUpdatingLRU(chunkHash) !== undefined\n );\n }\n\n withSuspendedSourceCacheEvictsAndDeletes<T>(\n fn: () => MaybePromise<T>,\n ): Promise<T> {\n return this._sourceChunksCache.withSuspendedEvictsAndDeletes(fn);\n }\n}\n\nexport class LazyRead implements Read {\n protected readonly _heads: Map<string, Hash>;\n protected readonly _memOnlyChunks: Map<Hash, Chunk>;\n protected readonly _sourceChunksCache: ChunksCache;\n protected readonly _sourceStore: Store;\n #sourceRead: Promise<Read> | undefined = undefined;\n readonly #release: () => void;\n #closed = false;\n readonly assertValidHash: (hash: Hash) => void;\n readonly #sourceReadOwnedByCaller: boolean;\n\n constructor(\n heads: Map<string, Hash>,\n memOnlyChunks: Map<Hash, Chunk>,\n sourceChunksCache: ChunksCache,\n sourceStore: Store,\n release: () => void,\n assertValidHash: (hash: Hash) => void,\n // If the lazyRead is being run in the context of an existing\n // read, or write, from the perdag then we must use _that_\n // transaction's read. Trying to open our own `sourceRead` will\n // cause the outer transaction to auto-commit.\n sourceRead?: Read,\n ) {\n this._heads = heads;\n this._memOnlyChunks = memOnlyChunks;\n this._sourceChunksCache = sourceChunksCache;\n this._sourceStore = sourceStore;\n this.#release = release;\n this.assertValidHash = assertValidHash;\n this.#sourceRead =\n sourceRead !== undefined ? Promise.resolve(sourceRead) : undefined;\n this.#sourceReadOwnedByCaller = sourceRead !== undefined;\n }\n\n isMemOnlyChunkHash(hash: Hash): boolean {\n return this._memOnlyChunks.has(hash);\n }\n\n async hasChunk(hash: Hash): Promise<boolean> {\n return (await this.getChunk(hash)) !== undefined;\n }\n\n async getChunk(hash: Hash): Promise<Chunk | undefined> {\n const memOnlyChunk = this._memOnlyChunks.get(hash);\n if (memOnlyChunk !== undefined) {\n return memOnlyChunk;\n }\n let chunk = this._sourceChunksCache.get(hash);\n if (chunk === undefined) {\n chunk = await (await this._getSourceRead()).getChunk(hash);\n if (chunk !== undefined) {\n this._sourceChunksCache.put(chunk);\n }\n }\n return chunk;\n }\n\n mustGetChunk(hash: Hash): Promise<Chunk> {\n return mustGetChunk(this, hash);\n }\n\n getHead(name: string): Promise<Hash | undefined> {\n return Promise.resolve(this._heads.get(name));\n }\n\n release(): void {\n if (!this.#closed) {\n this.#release();\n if (!this.#sourceReadOwnedByCaller) {\n this.#sourceRead\n ?.then(read => read.release())\n // If creation of the read failed there is nothing to release.\n // Catch to avoid `Uncaught (in promise)` errors being reported.\n .catch(_ => {});\n }\n this.#closed = true;\n }\n }\n\n get closed(): boolean {\n return this.#closed;\n }\n\n protected _getSourceRead(): Promise<Read> {\n if (!this.#sourceRead) {\n this.#sourceRead = this._sourceStore.read();\n }\n return this.#sourceRead;\n }\n}\n\nexport class LazyWrite\n extends LazyRead\n implements Write, RefCountUpdatesDelegate\n{\n readonly #refCounts: Map<Hash, number>;\n readonly #refs: Map<Hash, readonly Hash[]>;\n readonly #chunkHasher: ChunkHasher;\n protected readonly _pendingHeadChanges = new Map<string, HeadChange>();\n protected readonly _pendingMemOnlyChunks = new Map<Hash, Chunk>();\n protected readonly _pendingCachedChunks = new Map<\n Hash,\n {chunk: Chunk; size: number}\n >();\n readonly #createdChunks = new Set<Hash>();\n\n constructor(\n heads: Map<string, Hash>,\n memOnlyChunks: Map<Hash, Chunk>,\n sourceChunksCache: ChunksCache,\n sourceStore: Store,\n refCounts: Map<Hash, number>,\n refs: Map<Hash, readonly Hash[]>,\n release: () => void,\n chunkHasher: ChunkHasher,\n assertValidHash: (hash: Hash) => void,\n ) {\n super(\n heads,\n memOnlyChunks,\n sourceChunksCache,\n sourceStore,\n release,\n assertValidHash,\n );\n this.#refCounts = refCounts;\n this.#refs = refs;\n this.#chunkHasher = chunkHasher;\n }\n\n createChunk = <V>(data: V, refs: Refs): Chunk<V> => {\n const chunk = createChunk(data, refs, this.#chunkHasher);\n this.#createdChunks.add(chunk.hash);\n return chunk;\n };\n\n putChunk<V>(c: Chunk<V>, size?: number): Promise<void> {\n const {hash, meta} = c;\n this.assertValidHash(hash);\n if (meta.length > 0) {\n for (const h of meta) {\n this.assertValidHash(h);\n }\n }\n if (this.#createdChunks.has(hash) || this.isMemOnlyChunkHash(hash)) {\n this._pendingMemOnlyChunks.set(hash, c);\n } else {\n this._pendingCachedChunks.set(hash, {chunk: c, size: size ?? -1});\n }\n return promiseVoid;\n }\n\n async setHead(name: string, hash: Hash): Promise<void> {\n await this.#setHead(name, hash);\n }\n\n async removeHead(name: string): Promise<void> {\n await this.#setHead(name, undefined);\n }\n\n async #setHead(name: string, hash: Hash | undefined): Promise<void> {\n const oldHash = await this.getHead(name);\n const v = this._pendingHeadChanges.get(name);\n if (v === undefined) {\n this._pendingHeadChanges.set(name, {new: hash, old: oldHash});\n } else {\n // Keep old if existing\n v.new = hash;\n }\n }\n\n override isMemOnlyChunkHash(hash: Hash): boolean {\n return (\n this._pendingMemOnlyChunks.has(hash) || super.isMemOnlyChunkHash(hash)\n );\n }\n\n override async getChunk(hash: Hash): Promise<Chunk | undefined> {\n const pendingMemOnlyChunk = this._pendingMemOnlyChunks.get(hash);\n if (pendingMemOnlyChunk !== undefined) {\n return pendingMemOnlyChunk;\n }\n const memOnlyChunk = this._memOnlyChunks.get(hash);\n if (memOnlyChunk !== undefined) {\n return memOnlyChunk;\n }\n // In order to delegate determining reachability to `computeRefCountUpdates`\n // and defer this determination until commit time, treat cache misses\n // as a 'put' of the lazily-loaded chunk.\n const pendingCachedChunk = this._pendingCachedChunks.get(hash);\n if (pendingCachedChunk !== undefined) {\n return pendingCachedChunk.chunk;\n }\n let chunk = this._sourceChunksCache.get(hash);\n if (chunk === undefined) {\n chunk = await (await this._getSourceRead()).getChunk(hash);\n if (chunk !== undefined) {\n this._pendingCachedChunks.set(chunk.hash, {chunk, size: -1});\n }\n }\n return chunk;\n }\n\n override getHead(name: string): Promise<Hash | undefined> {\n const headChange = this._pendingHeadChanges.get(name);\n if (headChange) {\n return Promise.resolve(headChange.new);\n }\n return super.getHead(name);\n }\n\n async commit(): Promise<void> {\n const pendingChunks = new Set(\n joinIterables(\n this._pendingMemOnlyChunks.keys(),\n this._pendingCachedChunks.keys(),\n ),\n );\n const refCountUpdates = await computeRefCountUpdates(\n this._pendingHeadChanges.values(),\n pendingChunks,\n this,\n );\n\n for (const [hash, count] of refCountUpdates) {\n if (this.isMemOnlyChunkHash(hash)) {\n if (count === 0) {\n this.#refCounts.delete(hash);\n this._memOnlyChunks.delete(hash);\n this.#refs.delete(hash);\n } else {\n this.#refCounts.set(hash, count);\n const chunk = this._pendingMemOnlyChunks.get(hash);\n if (chunk) {\n this.#refs.set(hash, chunk.meta);\n this._memOnlyChunks.set(hash, chunk);\n }\n }\n refCountUpdates.delete(hash);\n }\n }\n\n this._sourceChunksCache.updateForCommit(\n this._pendingCachedChunks,\n refCountUpdates,\n );\n\n for (const [name, headChange] of this._pendingHeadChanges) {\n if (headChange.new) {\n this._heads.set(name, headChange.new);\n } else {\n this._heads.delete(name);\n }\n }\n\n this._pendingMemOnlyChunks.clear();\n this._pendingCachedChunks.clear();\n this._pendingHeadChanges.clear();\n this.release();\n }\n\n getRefCount(hash: Hash): number | undefined {\n return this.#refCounts.get(hash);\n }\n\n getRefs(hash: Hash): readonly Hash[] | undefined {\n const pendingMemOnlyChunk = this._pendingMemOnlyChunks.get(hash);\n if (pendingMemOnlyChunk) {\n return pendingMemOnlyChunk.meta;\n }\n const memOnlyChunk = this._memOnlyChunks.get(hash);\n if (memOnlyChunk) {\n return memOnlyChunk.meta;\n }\n const pendingCachedChunk = this._pendingCachedChunks.get(hash);\n if (pendingCachedChunk !== undefined) {\n return pendingCachedChunk.chunk.meta;\n }\n return this.#refs.get(hash);\n }\n\n areRefsCounted(hash: Hash): boolean {\n return this.#refs.has(hash);\n }\n\n chunksPersisted(chunkHashes: readonly Hash[]): void {\n const chunksToCache = [];\n for (const chunkHash of chunkHashes) {\n const chunk = this._memOnlyChunks.get(chunkHash);\n if (chunk) {\n this._memOnlyChunks.delete(chunkHash);\n chunksToCache.push(chunk);\n }\n }\n this._sourceChunksCache.persisted(chunksToCache);\n }\n}\n\ntype CacheEntry = {\n chunk: Chunk;\n size: number;\n};\n\nclass ChunksCache {\n readonly #cacheSizeLimit: number;\n readonly #getSizeOfChunk: (chunk: Chunk) => number;\n readonly #refCounts: Map<Hash, number>;\n readonly #refs: Map<Hash, readonly Hash[]>;\n #size = 0;\n #evictsAndDeletesSuspended = false;\n readonly #suspendedDeletes: Hash[] = [];\n\n /**\n * Iteration order is from least to most recently used.\n *\n * Public so that testing subclass can access.\n */\n readonly cacheEntries = new Map<Hash, CacheEntry>();\n\n constructor(\n cacheSizeLimit: number,\n getSizeOfChunk: (v: Chunk) => number,\n refCounts: Map<Hash, number>,\n refs: Map<Hash, readonly Hash[]>,\n ) {\n this.#cacheSizeLimit = cacheSizeLimit;\n this.#getSizeOfChunk = getSizeOfChunk;\n this.#refCounts = refCounts;\n this.#refs = refs;\n }\n\n get(hash: Hash): Chunk | undefined {\n const cacheEntry = this.cacheEntries.get(hash);\n if (cacheEntry) {\n // Update order in map for LRU tracking.\n this.cacheEntries.delete(hash);\n this.cacheEntries.set(hash, cacheEntry);\n }\n return cacheEntry?.chunk;\n }\n\n getWithoutUpdatingLRU(hash: Hash): Chunk | undefined {\n return this.cacheEntries.get(hash)?.chunk;\n }\n\n put(chunk: Chunk): void {\n const {hash} = chunk;\n // If there is an existing cache entry then the cached value must be\n // equivalent. Update order in map for LRU tracking and early return.\n const oldCacheEntry = this.cacheEntries.get(hash);\n if (oldCacheEntry) {\n this.cacheEntries.delete(hash);\n this.cacheEntries.set(hash, oldCacheEntry);\n return;\n }\n\n // Only cache if there is a ref from a head to this chunk\n const refCount = this.#refCounts.get(hash);\n if (refCount === undefined || refCount < 1) {\n return;\n }\n if (!this.#cacheChunk(chunk)) {\n return;\n }\n if (!this.#refs.has(hash)) {\n for (const refHash of chunk.meta) {\n this.#refCounts.set(refHash, (this.#refCounts.get(refHash) || 0) + 1);\n }\n this.#refs.set(hash, chunk.meta);\n }\n\n this.#ensureCacheSizeLimit();\n }\n\n #ensureCacheSizeLimit() {\n if (this.#evictsAndDeletesSuspended) {\n return;\n }\n for (const entry of this.cacheEntries.values()) {\n if (this.#size <= this.#cacheSizeLimit) {\n break;\n }\n this.#evict(entry);\n }\n }\n\n #cacheChunk(chunk: Chunk, size?: number): boolean {\n const chunkSize = size ?? this.#getSizeOfChunk(chunk);\n if (chunkSize > this.#cacheSizeLimit) {\n // This value cannot be cached due to its size exceeding the\n // cache size limit, don't evict other entries to try to make\n // room for it.\n return false;\n }\n this.#size += chunkSize;\n this.cacheEntries.set(chunk.hash, {chunk, size: chunkSize});\n return true;\n }\n\n #evict(cacheEntry: CacheEntry): void {\n const {hash} = cacheEntry.chunk;\n this.#size -= cacheEntry.size;\n this.cacheEntries.delete(hash);\n }\n\n #deleteEntryByHash(hash: Hash): void {\n this.#refCounts.delete(hash);\n this.#refs.delete(hash);\n const cacheEntry = this.cacheEntries.get(hash);\n if (cacheEntry) {\n this.#size -= cacheEntry.size;\n this.cacheEntries.delete(hash);\n }\n }\n\n updateForCommit(\n chunksToPut: Map<Hash, {chunk: Chunk; size: number}>,\n refCountUpdates: Map<Hash, number>,\n ): void {\n for (const [hash, count] of refCountUpdates) {\n if (count === 0) {\n if (!this.#evictsAndDeletesSuspended) {\n this.#deleteEntryByHash(hash);\n } else {\n this.#refCounts.set(hash, 0);\n this.#suspendedDeletes.push(hash);\n }\n } else {\n this.#refCounts.set(hash, count);\n const chunkAndSize = chunksToPut.get(hash);\n if (chunkAndSize) {\n const {chunk, size} = chunkAndSize;\n const oldCacheEntry = this.cacheEntries.get(hash);\n if (oldCacheEntry) {\n // If there is an existing cache entry then the cached value must be\n // equivalent. Update order in map for LRU tracking but avoid\n // recomputing size and creating a new cache entry.\n this.cacheEntries.delete(hash);\n this.cacheEntries.set(hash, oldCacheEntry);\n } else {\n this.#cacheChunk(chunk, size !== -1 ? size : undefined);\n this.#refs.set(hash, chunk.meta);\n }\n }\n }\n }\n this.#ensureCacheSizeLimit();\n }\n\n persisted(chunks: Iterable<Chunk>) {\n for (const chunk of chunks) {\n this.#cacheChunk(chunk);\n }\n this.#ensureCacheSizeLimit();\n }\n\n async withSuspendedEvictsAndDeletes<T>(\n fn: () => MaybePromise<T>,\n ): Promise<T> {\n this.#evictsAndDeletesSuspended = true;\n try {\n return await fn();\n } finally {\n this.#evictsAndDeletesSuspended = false;\n for (const hash of this.#suspendedDeletes) {\n if (this.#refCounts.get(hash) === 0) {\n this.#deleteEntryByHash(hash);\n }\n }\n this.#ensureCacheSizeLimit();\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-impl.js","names":["#kv","#chunkHasher","#assertValidHash","#putChunks","#changedHeads","#setHead","#applyRefCountUpdates","#removeAllRelatedKeys"],"sources":["../../../../../replicache/src/dag/store-impl.ts"],"sourcesContent":["import {assertNumber} from '../../../shared/src/asserts.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport {type Hash, assertHash} from '../hash.ts';\nimport type {\n Read as KVRead,\n Store as KVStore,\n Write as KVWrite,\n} from '../kv/store.ts';\nimport {\n Chunk,\n type ChunkHasher,\n type Refs,\n assertRefs,\n createChunk,\n} from './chunk.ts';\nimport {type RefCountUpdatesDelegate, computeRefCountUpdates} from './gc.ts';\nimport {chunkDataKey, chunkMetaKey, chunkRefCountKey, headKey} from './key.ts';\nimport {type Read, type Store, type Write, mustGetChunk} from './store.ts';\n\nexport class StoreImpl implements Store {\n readonly #kv: KVStore;\n readonly #chunkHasher: ChunkHasher;\n readonly #assertValidHash: (hash: Hash) => void;\n\n constructor(\n kv: KVStore,\n chunkHasher: ChunkHasher,\n assertValidHash: (hash: Hash) => void,\n ) {\n this.#kv = kv;\n this.#chunkHasher = chunkHasher;\n this.#assertValidHash = assertValidHash;\n }\n\n async read(): Promise<Read> {\n return new ReadImpl(await this.#kv.read(), this.#assertValidHash);\n }\n\n async write(): Promise<Write> {\n return new WriteImpl(\n await this.#kv.write(),\n this.#chunkHasher,\n this.#assertValidHash,\n );\n }\n\n close(): Promise<void> {\n return this.#kv.close();\n }\n}\n\nexport class ReadImpl implements Read {\n protected readonly _tx: KVRead;\n readonly assertValidHash: (hash: Hash) => void;\n\n constructor(kv: KVRead, assertValidHash: (hash: Hash) => void) {\n this._tx = kv;\n this.assertValidHash = assertValidHash;\n }\n\n hasChunk(hash: Hash): Promise<boolean> {\n return this._tx.has(chunkDataKey(hash));\n }\n\n async getChunk(hash: Hash): Promise<Chunk | undefined> {\n const dataPromise = this._tx.get(chunkDataKey(hash));\n const refsPromise = this._tx.get(chunkMetaKey(hash));\n const data = await dataPromise;\n if (data === undefined) {\n refsPromise.catch(() => {\n // Ignore error since we will return undefined anyway.\n });\n return undefined;\n }\n\n const refsVal = await refsPromise;\n let refs: Refs;\n if (refsVal !== undefined) {\n assertRefs(refsVal);\n refs = refsVal;\n } else {\n refs = [];\n }\n return new Chunk(hash, data, refs);\n }\n\n mustGetChunk(hash: Hash): Promise<Chunk> {\n return mustGetChunk(this, hash);\n }\n\n async getHead(name: string): Promise<Hash | undefined> {\n const data = await this._tx.get(headKey(name));\n if (data === undefined) {\n return undefined;\n }\n assertHash(data);\n return data;\n }\n\n release(): void {\n this._tx.release();\n }\n\n get closed(): boolean {\n return this._tx.closed;\n }\n}\n\ntype HeadChange = {\n new: Hash | undefined;\n old: Hash | undefined;\n};\n\nexport class WriteImpl\n extends ReadImpl\n implements Write, RefCountUpdatesDelegate\n{\n declare protected readonly _tx: KVWrite;\n readonly #chunkHasher: ChunkHasher;\n\n readonly #putChunks = new Set<Hash>();\n readonly #changedHeads = new Map<string, HeadChange>();\n\n constructor(\n kvw: KVWrite,\n chunkHasher: ChunkHasher,\n assertValidHash: (hash: Hash) => void,\n ) {\n super(kvw, assertValidHash);\n this.#chunkHasher = chunkHasher;\n }\n\n createChunk = <V>(data: V, refs: Refs): Chunk<V> =>\n createChunk(data, refs, this.#chunkHasher);\n\n get kvWrite(): KVWrite {\n return this._tx;\n }\n\n async putChunk(c: Chunk): Promise<void> {\n const {hash, data, meta} = c;\n // We never want to write temp hashes to the underlying store.\n this.assertValidHash(hash);\n const key = chunkDataKey(hash);\n // Commit contains InternalValue and Hash which are opaque types.\n const p1 = this._tx.put(key, data as ReadonlyJSONValue);\n let p2;\n if (meta.length > 0) {\n for (const h of meta) {\n this.assertValidHash(h);\n }\n p2 = this._tx.put(chunkMetaKey(hash), meta);\n }\n this.#putChunks.add(hash);\n await p1;\n await p2;\n }\n\n setHead(name: string, hash: Hash): Promise<void> {\n return this.#setHead(name, hash);\n }\n\n removeHead(name: string): Promise<void> {\n return this.#setHead(name, undefined);\n }\n\n async #setHead(name: string, hash: Hash | undefined): Promise<void> {\n const oldHash = await this.getHead(name);\n const hk = headKey(name);\n\n let p1: Promise<void>;\n if (hash === undefined) {\n p1 = this._tx.del(hk);\n } else {\n p1 = this._tx.put(hk, hash);\n }\n\n const v = this.#changedHeads.get(name);\n if (v === undefined) {\n this.#changedHeads.set(name, {new: hash, old: oldHash});\n } else {\n // Keep old if existing\n v.new = hash;\n }\n\n await p1;\n }\n\n async commit(): Promise<void> {\n const refCountUpdates = await computeRefCountUpdates(\n this.#changedHeads.values(),\n this.#putChunks,\n this,\n );\n await this.#applyRefCountUpdates(refCountUpdates);\n await this._tx.commit();\n }\n\n async getRefCount(hash: Hash): Promise<number | undefined> {\n const value = await this._tx.get(chunkRefCountKey(hash));\n if (value === undefined) {\n return undefined;\n }\n assertNumber(value);\n if (value < 0 || value > 0xffff || value !== (value | 0)) {\n throw new Error(\n `Invalid ref count ${value}. We expect the value to be a Uint16`,\n );\n }\n return value;\n }\n\n async getRefs(hash: Hash): Promise<readonly Hash[]> {\n const meta = await this._tx.get(chunkMetaKey(hash));\n if (meta === undefined) {\n return [];\n }\n assertRefs(meta);\n return meta;\n }\n\n async #applyRefCountUpdates(refCountCache: Map<Hash, number>): Promise<void> {\n const ps: Promise<void>[] = [];\n for (const [hash, count] of refCountCache) {\n if (count === 0) {\n ps.push(this.#removeAllRelatedKeys(hash));\n } else {\n const refCountKey = chunkRefCountKey(hash);\n ps.push(this._tx.put(refCountKey, count));\n }\n }\n await Promise.all(ps);\n }\n\n async #removeAllRelatedKeys(hash: Hash): Promise<void> {\n await Promise.all([\n this._tx.del(chunkDataKey(hash)),\n this._tx.del(chunkMetaKey(hash)),\n this._tx.del(chunkRefCountKey(hash)),\n ]);\n\n this.#putChunks.delete(hash);\n }\n\n release(): void {\n this._tx.release();\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","names":[],"sources":["../../../../../replicache/src/dag/store.ts"],"sourcesContent":["import {assert} from '../../../shared/src/asserts.ts';\nimport type {Hash} from '../hash.ts';\nimport type {Release} from '../with-transactions.ts';\nimport type {Chunk, Refs} from './chunk.ts';\n\nexport interface Store {\n read(): Promise<Read>;\n write(): Promise<Write>;\n close(): Promise<void>;\n}\n\ninterface GetChunk {\n getChunk(hash: Hash): Promise<Chunk | undefined>;\n}\n\nexport interface MustGetChunk {\n mustGetChunk(hash: Hash): Promise<Chunk>;\n}\n\nexport interface Read extends GetChunk, MustGetChunk, Release {\n hasChunk(hash: Hash): Promise<boolean>;\n getHead(name: string): Promise<Hash | undefined>;\n get closed(): boolean;\n}\n\nexport interface Write extends Read {\n createChunk<V>(data: V, refs: Refs): Chunk<V>;\n putChunk<V>(c: Chunk<V>): Promise<void>;\n setHead(name: string, hash: Hash): Promise<void>;\n removeHead(name: string): Promise<void>;\n assertValidHash(hash: Hash): void;\n commit(): Promise<void>;\n}\n\nexport class ChunkNotFoundError extends Error {\n name = 'ChunkNotFoundError';\n readonly hash: Hash;\n constructor(hash: Hash) {\n super(`Chunk not found ${hash}`);\n this.hash = hash;\n }\n}\n\nexport async function mustGetChunk(\n store: GetChunk,\n hash: Hash,\n): Promise<Chunk> {\n const chunk = await store.getChunk(hash);\n if (chunk) {\n return chunk;\n }\n throw new ChunkNotFoundError(hash);\n}\n\nexport async function mustGetHeadHash(\n name: string,\n store: Read,\n): Promise<Hash> {\n const hash = await store.getHead(name);\n assert(hash, `Missing head ${name}`);\n return hash;\n}\n"],"mappings":";;AAkCA,IAAa,qBAAb,cAAwC,MAAM;CAC5C,OAAO;CACP;CACA,YAAY,MAAY;EACtB,MAAM,mBAAmB,MAAM;EAC/B,KAAK,OAAO;CACd;AACF;AAEA,eAAsB,aACpB,OACA,MACgB;CAChB,MAAM,QAAQ,MAAM,MAAM,SAAS,IAAI;CACvC,IAAI,OACF,OAAO;CAET,MAAM,IAAI,mBAAmB,IAAI;AACnC;AAEA,eAAsB,gBACpB,MACA,OACe;CACf,MAAM,OAAO,MAAM,MAAM,QAAQ,IAAI;CACrC,OAAO,MAAM,gBAAgB,MAAM;CACnC,OAAO;AACT"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visitor.js","names":["#dagRead","#seen"],"sources":["../../../../../replicache/src/dag/visitor.ts"],"sourcesContent":["import type {Hash} from '../hash.ts';\nimport type {Chunk} from './chunk.ts';\nimport type {MustGetChunk} from './store.ts';\n\n/**\n * A visitor walks the DAG starting at a given root and visits each chunk.\n */\nexport class Visitor {\n #seen: Set<Hash> = new Set();\n #dagRead: MustGetChunk;\n\n constructor(dagRead: MustGetChunk) {\n this.#dagRead = dagRead;\n }\n\n async visit(h: Hash) {\n if (this.#seen.has(h)) {\n return;\n }\n this.#seen.add(h);\n const chunk = await this.#dagRead.mustGetChunk(h);\n await this.visitChunk(chunk);\n }\n\n async visitChunk(chunk: Chunk<unknown>) {\n await Promise.all(chunk.meta.map(ref => this.visit(ref)));\n }\n}\n"],"mappings":";;;;AAOA,IAAa,UAAb,MAAqB;CACnB,wBAAmB,IAAI,IAAI;CAC3B;CAEA,YAAY,SAAuB;EACjC,KAAKA,WAAW;CAClB;CAEA,MAAM,MAAM,GAAS;EACnB,IAAI,KAAKC,MAAM,IAAI,CAAC,GAClB;EAEF,KAAKA,MAAM,IAAI,CAAC;EAChB,MAAM,QAAQ,MAAM,KAAKD,SAAS,aAAa,CAAC;EAChD,MAAM,KAAK,WAAW,KAAK;CAC7B;CAEA,MAAM,WAAW,OAAuB;EACtC,MAAM,QAAQ,IAAI,MAAM,KAAK,KAAI,QAAO,KAAK,MAAM,GAAG,CAAC,CAAC;CAC1D;AACF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.js","names":[],"sources":["../../../../../replicache/src/db/commit.ts"],"sourcesContent":["import {\n assert,\n assertArray,\n assertBoolean,\n assertNumber,\n assertObject,\n assertString,\n unreachable,\n} from '../../../shared/src/asserts.ts';\nimport {assertJSONValue} from '../../../shared/src/json.ts';\nimport {skipCommitDataAsserts} from '../config.ts';\nimport {type FrozenCookie, compareCookies} from '../cookies.ts';\nimport {type Chunk, type CreateChunk, type Refs, toRefs} from '../dag/chunk.ts';\nimport {type MustGetChunk, type Read, mustGetHeadHash} from '../dag/store.ts';\nimport {\n type FrozenJSONValue,\n type FrozenTag,\n assertDeepFrozen,\n deepFreeze,\n} from '../frozen-json.ts';\nimport {type Hash, assertHash} from '../hash.ts';\nimport type {IndexDefinition} from '../index-defs.ts';\nimport type {ClientID} from '../sync/ids.ts';\nimport * as MetaType from './meta-type-enum.ts';\n\nexport const DEFAULT_HEAD_NAME = 'main';\n\nexport function commitIsLocalDD31(\n commit: Commit<Meta>,\n): commit is Commit<LocalMetaDD31> {\n return isLocalMetaDD31(commit.meta);\n}\n\nexport function commitIsLocal(\n commit: Commit<Meta>,\n): commit is Commit<LocalMetaDD31> {\n return commitIsLocalDD31(commit);\n}\n\nexport function commitIsSnapshot(\n commit: Commit<Meta>,\n): commit is Commit<SnapshotMetaDD31> {\n return isSnapshotMetaDD31(commit.meta);\n}\n\nexport class Commit<M extends Meta> {\n readonly chunk: Chunk<CommitData<M>>;\n\n constructor(chunk: Chunk<CommitData<M>>) {\n this.chunk = chunk;\n }\n\n get meta(): M {\n return this.chunk.data.meta;\n }\n\n get valueHash(): Hash {\n // Already validated!\n return this.chunk.data.valueHash;\n }\n\n getMutationID(clientID: ClientID, dagRead: MustGetChunk): Promise<number> {\n return getMutationID(clientID, dagRead, this.meta);\n }\n\n async getNextMutationID(\n clientID: ClientID,\n dagRead: MustGetChunk,\n ): Promise<number> {\n return (await this.getMutationID(clientID, dagRead)) + 1;\n }\n\n get indexes(): readonly IndexRecord[] {\n // Already validated!\n return this.chunk.data.indexes;\n }\n}\n\nexport async function getMutationID(\n clientID: ClientID,\n dagRead: MustGetChunk,\n meta: Meta,\n): Promise<number> {\n switch (meta.type) {\n case MetaType.SnapshotDD31:\n return meta.lastMutationIDs[clientID] ?? 0;\n\n case MetaType.LocalDD31: {\n if (meta.clientID === clientID) {\n return meta.mutationID;\n }\n const {basisHash} = meta;\n const basisCommit = await commitFromHash(basisHash, dagRead);\n return getMutationID(clientID, dagRead, basisCommit.meta);\n }\n\n default:\n unreachable(meta);\n }\n}\n\n/**\n * Returns the set of local commits from the given `fromCommitHash` back to but not\n * including its base snapshot. If `fromCommitHash` is a snapshot, the returned vector\n * will be empty. When, as typical, `fromCommitHash` is the head of the default chain\n * then the returned commits are the set of pending commits, ie the set of local commits\n * that have not yet been pushed to the data layer.\n *\n * The vector of commits is returned in reverse chain order, that is, starting\n * with the commit with hash `fromCommitHash` and walking backwards.\n */\nexport async function localMutations(\n fromCommitHash: Hash,\n dagRead: Read,\n): Promise<Commit<LocalMetaDD31>[]> {\n const commits = await commitChain(fromCommitHash, dagRead);\n // Filter does not deal with type narrowing.\n return commits.filter(c => commitIsLocal(c)) as Commit<LocalMetaDD31>[];\n}\n\nexport async function localMutationsDD31(\n fromCommitHash: Hash,\n dagRead: Read,\n): Promise<Commit<LocalMetaDD31>[]> {\n const commits = await commitChain(fromCommitHash, dagRead);\n // Filter does not deal with type narrowing.\n return commits.filter(c => commitIsLocalDD31(c)) as Commit<LocalMetaDD31>[];\n}\n\nexport async function localMutationsGreaterThan(\n commit: Commit<Meta>,\n mutationIDLimits: Record<ClientID, number>,\n dagRead: Read,\n): Promise<Commit<LocalMetaDD31>[]> {\n const commits: Commit<LocalMetaDD31>[] = [];\n const remainingMutationIDLimits = new Map(Object.entries(mutationIDLimits));\n while (!commitIsSnapshot(commit) && remainingMutationIDLimits.size > 0) {\n if (commitIsLocalDD31(commit)) {\n const {meta} = commit;\n const mutationIDLowerLimit = remainingMutationIDLimits.get(meta.clientID);\n if (mutationIDLowerLimit !== undefined) {\n if (meta.mutationID <= mutationIDLowerLimit) {\n remainingMutationIDLimits.delete(meta.clientID);\n } else {\n commits.push(commit as Commit<LocalMetaDD31>);\n }\n }\n }\n const {basisHash} = commit.meta;\n if (basisHash === null) {\n throw new Error(`Commit ${commit.chunk.hash} has no basis`);\n }\n commit = await commitFromHash(basisHash, dagRead);\n }\n return commits;\n}\n\nexport async function baseSnapshotFromHead(\n name: string,\n dagRead: Read,\n): Promise<Commit<SnapshotMetaDD31>> {\n const hash = await dagRead.getHead(name);\n assert(hash, `Missing head ${name}`);\n return baseSnapshotFromHash(hash, dagRead);\n}\n\nexport async function baseSnapshotHashFromHash(\n hash: Hash,\n dagRead: Read,\n): Promise<Hash> {\n return (await baseSnapshotFromHash(hash, dagRead)).chunk.hash;\n}\n\nexport async function baseSnapshotFromHash(\n hash: Hash,\n dagRead: Read,\n): Promise<Commit<SnapshotMetaDD31>> {\n const commit = await commitFromHash(hash, dagRead);\n return baseSnapshotFromCommit(commit, dagRead);\n}\n\nexport async function baseSnapshotFromCommit(\n commit: Commit<Meta>,\n dagRead: Read,\n): Promise<Commit<SnapshotMetaDD31>> {\n while (!commitIsSnapshot(commit)) {\n const {meta} = commit;\n if (isLocalMetaDD31(meta)) {\n commit = await commitFromHash(meta.baseSnapshotHash, dagRead);\n } else {\n const {basisHash} = meta;\n if (basisHash === null) {\n throw new Error(`Commit ${commit.chunk.hash} has no basis`);\n }\n commit = await commitFromHash(basisHash, dagRead);\n }\n }\n return commit;\n}\n\nexport function snapshotMetaParts(\n c: Commit<SnapshotMetaDD31>,\n clientID: ClientID,\n): [lastMutationID: number, cookie: FrozenCookie | FrozenJSONValue] {\n const m = c.meta;\n const lmid = m.lastMutationIDs[clientID] ?? 0;\n return [lmid, m.cookieJSON];\n}\n\nexport function compareCookiesForSnapshots(\n a: Commit<SnapshotMetaDD31>,\n b: Commit<SnapshotMetaDD31>,\n): number {\n return compareCookies(a.meta.cookieJSON, b.meta.cookieJSON);\n}\n\n/**\n * Returns all commits from the commit with fromCommitHash to its base snapshot,\n * inclusive of both. Resulting vector is in chain-head-first order (so snapshot\n * comes last).\n */\nexport async function commitChain(\n fromCommitHash: Hash,\n dagRead: Read,\n): Promise<Commit<Meta>[]> {\n let commit = await commitFromHash(fromCommitHash, dagRead);\n const commits = [];\n while (!commitIsSnapshot(commit)) {\n const {meta} = commit;\n const {basisHash} = meta;\n if (basisHash === null) {\n throw new Error(`Commit ${commit.chunk.hash} has no basis`);\n }\n commits.push(commit);\n commit = await commitFromHash(basisHash, dagRead);\n }\n commits.push(commit);\n return commits;\n}\n\nexport async function commitFromHash(\n hash: Hash,\n dagRead: MustGetChunk,\n): Promise<Commit<Meta>> {\n const chunk = await dagRead.mustGetChunk(hash);\n return fromChunk(chunk);\n}\n\nexport async function commitFromHead(\n name: string,\n dagRead: Read,\n): Promise<Commit<Meta>> {\n const hash = await mustGetHeadHash(name, dagRead);\n return commitFromHash(hash, dagRead);\n}\n\nexport type LocalMetaDD31 = {\n readonly type: MetaType.LocalDD31;\n readonly basisHash: Hash;\n readonly mutationID: number;\n readonly mutatorName: string;\n readonly mutatorArgsJSON: FrozenJSONValue;\n readonly originalHash: Hash | null;\n readonly timestamp: number;\n readonly clientID: ClientID;\n readonly baseSnapshotHash: Hash;\n};\n\nexport type LocalMeta = LocalMetaDD31;\n\nexport function assertLocalMetaDD31(\n v: Record<string, unknown>,\n): asserts v is LocalMetaDD31 {\n // type already asserted\n assertString(v.clientID);\n assertNumber(v.mutationID);\n assertString(v.mutatorName);\n if (!v.mutatorName) {\n throw new Error('Missing mutator name');\n }\n assertJSONValue(v.mutatorArgsJSON);\n if (v.originalHash !== null) {\n assertHash(v.originalHash);\n }\n assertNumber(v.timestamp);\n}\n\nexport function isLocalMetaDD31(meta: Meta): meta is LocalMetaDD31 {\n return meta.type === MetaType.LocalDD31;\n}\n\nexport function assertLocalCommitDD31(\n c: Commit<Meta>,\n): asserts c is Commit<LocalMetaDD31> {\n assertLocalMetaDD31(c.meta);\n}\n\nexport type SnapshotMetaDD31 = {\n readonly type: MetaType.SnapshotDD31;\n readonly basisHash: Hash | null;\n readonly lastMutationIDs: Record<ClientID, number>;\n readonly cookieJSON: FrozenCookie;\n};\n\nexport type SnapshotMeta = SnapshotMetaDD31;\n\nexport function assertSnapshotMetaDD31(\n v: Record<string, unknown>,\n): asserts v is SnapshotMetaDD31 {\n // type already asserted\n if (v.basisHash !== null) {\n assertHash(v.basisHash);\n }\n assertJSONValue(v.cookieJSON);\n assertLastMutationIDs(v.lastMutationIDs);\n}\n\nfunction assertLastMutationIDs(\n v: unknown,\n): asserts v is Record<ClientID, number> {\n assertObject(v);\n for (const e of Object.values(v)) {\n assertNumber(e);\n }\n}\n\nexport type Meta = LocalMetaDD31 | SnapshotMetaDD31;\n\nexport function assertSnapshotCommitDD31(\n c: Commit<Meta>,\n): asserts c is Commit<SnapshotMetaDD31> {\n assertSnapshotMetaDD31(c.meta);\n}\n\nfunction isSnapshotMetaDD31(meta: Meta): meta is SnapshotMetaDD31 {\n return meta.type === MetaType.SnapshotDD31;\n}\n\nfunction assertMeta(v: unknown): asserts v is Meta {\n assertObject(v);\n assertDeepFrozen(v);\n if (v.basisHash !== null) {\n assertString(v.basisHash);\n }\n\n assertNumber(v.type);\n switch (v.type) {\n case MetaType.LocalDD31:\n assertLocalMetaDD31(v);\n break;\n case MetaType.SnapshotDD31:\n assertSnapshotMetaDD31(v);\n break;\n default:\n throw new Error(`Invalid enum value ${v.type}`);\n }\n}\n\n/**\n * This is the type used for index definitions as defined in the Commit chunk data.\n *\n * Changing this requires a REPLICACHE_FORMAT_VERSION bump.\n */\nexport type ChunkIndexDefinition = {\n readonly name: string;\n readonly keyPrefix: string;\n readonly jsonPointer: string;\n // Used to not exist\n readonly allowEmpty?: boolean;\n};\n\nexport function chunkIndexDefinitionEqualIgnoreName(\n a: ChunkIndexDefinition,\n b: ChunkIndexDefinition,\n): boolean {\n return (\n a.jsonPointer === b.jsonPointer &&\n (a.allowEmpty ?? false) === (b.allowEmpty ?? false) &&\n a.keyPrefix === b.keyPrefix\n );\n}\n\nfunction assertChunkIndexDefinition(\n v: unknown,\n): asserts v is ChunkIndexDefinition {\n assertObject(v);\n assertDeepFrozen(v);\n assertString(v.name);\n assertString(v.keyPrefix);\n assertString(v.jsonPointer);\n if (v.allowEmpty !== undefined) {\n assertBoolean(v.allowEmpty);\n }\n}\n\nexport function toChunkIndexDefinition(\n name: string,\n indexDefinition: IndexDefinition,\n): Required<ChunkIndexDefinition> {\n return {\n name,\n keyPrefix: indexDefinition.prefix ?? '',\n jsonPointer: indexDefinition.jsonPointer,\n allowEmpty: indexDefinition.allowEmpty ?? false,\n };\n}\n\nexport type IndexRecord = {\n readonly definition: ChunkIndexDefinition;\n readonly valueHash: Hash;\n};\n\nfunction assertIndexRecord(v: unknown): asserts v is IndexRecord {\n assertObject(v);\n assertDeepFrozen(v);\n assertChunkIndexDefinition(v.definition);\n assertString(v.valueHash);\n}\n\nfunction assertIndexRecords(v: unknown): asserts v is IndexRecord[] {\n assertArray(v);\n assertDeepFrozen(v);\n for (const ir of v) {\n assertIndexRecord(ir);\n }\n}\n\nexport function newLocalDD31(\n createChunk: CreateChunk,\n basisHash: Hash,\n baseSnapshotHash: Hash,\n mutationID: number,\n mutatorName: string,\n mutatorArgsJSON: FrozenJSONValue,\n originalHash: Hash | null,\n valueHash: Hash,\n indexes: readonly IndexRecord[],\n timestamp: number,\n clientID: ClientID,\n): Commit<LocalMetaDD31> {\n const meta: LocalMetaDD31 = {\n type: MetaType.LocalDD31,\n basisHash,\n baseSnapshotHash,\n mutationID,\n mutatorName,\n mutatorArgsJSON,\n originalHash,\n timestamp,\n clientID,\n };\n return commitFromCommitData(\n createChunk,\n makeCommitData(meta, valueHash, indexes),\n );\n}\n\nexport function newSnapshotDD31(\n createChunk: CreateChunk,\n basisHash: Hash | null,\n lastMutationIDs: Record<ClientID, number>,\n cookieJSON: FrozenCookie,\n valueHash: Hash,\n indexes: readonly IndexRecord[],\n): Commit<SnapshotMetaDD31> {\n return commitFromCommitData(\n createChunk,\n newSnapshotCommitDataDD31(\n basisHash,\n lastMutationIDs,\n cookieJSON,\n valueHash,\n indexes,\n ),\n );\n}\n\nexport function newSnapshotCommitDataDD31(\n basisHash: Hash | null,\n lastMutationIDs: Record<ClientID, number>,\n cookieJSON: FrozenCookie,\n valueHash: Hash,\n indexes: readonly IndexRecord[],\n): CommitData<SnapshotMetaDD31> {\n const meta: SnapshotMetaDD31 = {\n type: MetaType.SnapshotDD31,\n basisHash,\n lastMutationIDs,\n cookieJSON,\n };\n return makeCommitData(meta, valueHash, indexes);\n}\n\nexport function fromChunk(chunk: Chunk): Commit<Meta> {\n validateChunk(chunk);\n return new Commit(chunk);\n}\n\nfunction commitFromCommitData<M extends Meta>(\n createChunk: CreateChunk,\n data: CommitData<M>,\n): Commit<M> {\n return new Commit(createChunk(data, getRefs(data)));\n}\n\nexport function getRefs(data: CommitData<Meta>): Refs {\n const refs: Set<Hash> = new Set();\n refs.add(data.valueHash);\n const {meta} = data;\n switch (meta.type) {\n case MetaType.LocalDD31:\n meta.basisHash && refs.add(meta.basisHash);\n // Local has weak originalHash\n break;\n case MetaType.SnapshotDD31:\n // Snapshot has weak basisHash\n break;\n default:\n unreachable(meta);\n }\n\n for (const index of data.indexes) {\n refs.add(index.valueHash);\n }\n\n return toRefs(refs);\n}\n\nexport type CommitData<M extends Meta> = FrozenTag<{\n readonly meta: M;\n readonly valueHash: Hash;\n readonly indexes: readonly IndexRecord[];\n}>;\n\nexport function makeCommitData<M extends Meta>(\n meta: M,\n valueHash: Hash,\n indexes: readonly IndexRecord[],\n): CommitData<M> {\n return deepFreeze({\n meta,\n valueHash,\n indexes,\n }) as unknown as CommitData<M>;\n}\n\nexport function assertCommitData(v: unknown): asserts v is CommitData<Meta> {\n if (skipCommitDataAsserts) {\n return;\n }\n\n assertObject(v);\n assertDeepFrozen(v);\n assertMeta(v.meta);\n assertString(v.valueHash);\n assertIndexRecords(v.indexes);\n}\n\nfunction validateChunk(chunk: Chunk): asserts chunk is Chunk<CommitData<Meta>> {\n const {data} = chunk;\n assertCommitData(data);\n\n const seen = new Set();\n for (const index of data.indexes) {\n const {name} = index.definition;\n if (seen.has(name)) {\n throw new Error(`Duplicate index ${name}`);\n }\n seen.add(name);\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../../replicache/src/db/index.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport type {Enum} from '../../../shared/src/enum.ts';\nimport type {BTreeRead} from '../btree/read.ts';\nimport type {BTreeWrite} from '../btree/write.ts';\nimport type {FrozenJSONObject, FrozenJSONValue} from '../frozen-json.ts';\nimport type {Hash} from '../hash.ts';\nimport type {IndexRecord} from './commit.ts';\nimport * as IndexOperation from './index-operation-enum.ts';\n\ntype IndexOperation = Enum<typeof IndexOperation>;\n\nexport class IndexRead<BTree = BTreeRead> {\n readonly meta: IndexRecord;\n readonly map: BTree;\n\n constructor(meta: IndexRecord, map: BTree) {\n this.meta = meta;\n this.map = map;\n }\n}\n\nexport class IndexWrite extends IndexRead<BTreeWrite> {\n // Note: does not update self.meta.valueHash (doesn't need to at this point as flush\n // is only called during commit.)\n flush(): Promise<Hash> {\n return this.map.flush();\n }\n\n clear(): Promise<void> {\n return this.map.clear();\n }\n}\n\n// Index or de-index a single primary entry.\nexport async function indexValue(\n lc: LogContext,\n index: BTreeWrite,\n op: IndexOperation,\n key: string,\n val: FrozenJSONValue,\n jsonPointer: string,\n allowEmpty: boolean,\n): Promise<void> {\n try {\n for (const entry of getIndexKeys(key, val, jsonPointer, allowEmpty)) {\n switch (op) {\n case IndexOperation.Add:\n await index.put(entry, val);\n break;\n case IndexOperation.Remove:\n await index.del(entry);\n break;\n }\n }\n } catch (e) {\n // Right now all the errors that index_value() returns are customers dev\n // problems: either the value is not json, the pointer is into nowhere, etc.\n // So we ignore them.\n lc.info?.('Not indexing value', val, ':', e);\n }\n}\n\n// Gets the set of index keys for a given primary key and value.\nexport function getIndexKeys(\n primary: string,\n value: FrozenJSONValue,\n jsonPointer: string,\n allowEmpty: boolean,\n): string[] {\n const target = evaluateJSONPointer(value, jsonPointer);\n if (target === undefined) {\n if (allowEmpty) {\n return [];\n }\n throw new Error(`No value at path: ${jsonPointer}`);\n }\n\n const values = Array.isArray(target) ? target : [target];\n\n const indexKeys: string[] = [];\n for (const value of values) {\n if (typeof value === 'string') {\n indexKeys.push(encodeIndexKey([value, primary]));\n } else {\n throw new Error('Unsupported target type');\n }\n }\n\n return indexKeys;\n}\n\nexport const KEY_VERSION_0 = '\\u0000';\nexport const KEY_SEPARATOR = '\\u0000';\n\n/**\n * When using indexes the key is a tuple of the secondary key and the primary\n * key.\n */\nexport type IndexKey = readonly [secondary: string, primary: string];\n\n// An index key is encoded to vec of bytes in the following order:\n// - key version byte(s), followed by\n// - the secondary key bytes (which for now is a UTF8 encoded string), followed by\n// - the key separator, a null byte, followed by\n// - the primary key bytes\n//\n// The null separator byte ensures that if a secondary key A is longer than B then\n// A always sorts after B. Appending the primary key ensures index keys with\n// identical secondary keys sort in primary key order. Secondary keys must not\n// contain a zero (null) byte.\nexport function encodeIndexKey(indexKey: IndexKey): string {\n const secondary = indexKey[0];\n const primary = indexKey[1];\n\n if (secondary.includes('\\u0000')) {\n throw new Error('Secondary key cannot contain null byte');\n }\n return KEY_VERSION_0 + secondary + KEY_SEPARATOR + primary;\n}\n\n// Returns bytes that can be used to scan for the given secondary index value.\n//\n// Consider a scan for start_secondary_key=\"a\" (97). We want to scan with scan\n// key [0, 97]. We could also scan with [0, 97, 0], but then we couldn't use\n// this function for prefix scans, so we lop off the null byte. If we want\n// the scan to be exclusive, we scan with the next greater value, [0, 97, 1]\n// (we disallow zero bytes in secondary keys).\n//\n// Now it gets a little tricky. We also want to be able to scan using the\n// primary key, start_key. When we do this we have to encode the scan key\n// a little differently We essentially have to fix the value of the\n// secondary key so we can vary the start_key. That is, the match on\n// start_secondary_key becomes an exact match.\n//\n// Consider the scan for start_secondary_key=\"a\" and start_key=[2]. We want\n// to scan with [0, 97, 0, 2]. If we want exclusive we want to scan with\n// the next highest value, [0, 97, 0, 2, 0] (zero bytes are allowed in primary\n// keys). So far so good. It is important to notice that we need to\n// be able to distinguish between not wanting use start_key and wanting to\n// use start_key=[]. In the former case we want to scan with the secondary\n// key value, possibly followed by a 1 with no trailing zero byte ([0, 97]\n// or [0, 97, 1]). In the latter case we want to scan by the secondary\n// key value, followed by the zero byte, followed by the primary key value\n// and another zero if it is exclusive ([0, 97, 0] or [0, 97, 0, 0]).\n// This explains why we need the Option around start_key.\nexport function encodeIndexScanKey(\n secondary: string,\n primary: string | undefined,\n): string {\n const k = encodeIndexKey([secondary, primary || '']);\n if (primary === undefined) {\n return k.slice(0, k.length - 1);\n }\n return k;\n}\n\n// Decodes an IndexKey encoded by encode_index_key.\nexport function decodeIndexKey(encodedIndexKey: string): IndexKey {\n if (encodedIndexKey[0] !== KEY_VERSION_0) {\n throw new Error('Invalid version');\n }\n\n const versionLen = KEY_VERSION_0.length;\n const separatorLen = KEY_SEPARATOR.length;\n const separatorOffset = encodedIndexKey.indexOf(KEY_SEPARATOR, versionLen);\n if (separatorOffset === -1) {\n throw new Error('Invalid formatting');\n }\n\n const secondary = encodedIndexKey.slice(versionLen, separatorOffset);\n const primary = encodedIndexKey.slice(separatorOffset + separatorLen);\n return [secondary, primary];\n}\n\nexport function evaluateJSONPointer(\n value: FrozenJSONValue,\n pointer: string,\n): FrozenJSONValue | undefined {\n function parseIndex(s: string): number | undefined {\n if (s.startsWith('+') || (s.startsWith('0') && s.length !== 1)) {\n return undefined;\n }\n return parseInt(s, 10);\n }\n\n if (pointer === '') {\n return value;\n }\n if (!pointer.startsWith('/')) {\n throw new Error(`Invalid JSON pointer: ${pointer}`);\n }\n\n const tokens = pointer\n .split('/')\n .slice(1)\n .map(x => x.replace(/~1/g, '/').replace(/~0/g, '~'));\n\n let target = value;\n for (const token of tokens) {\n let targetOpt;\n if (Array.isArray(target)) {\n const i = parseIndex(token);\n if (i === undefined) {\n return undefined;\n }\n targetOpt = target[i];\n } else if (target === null) {\n return undefined;\n } else if (typeof target === 'object') {\n target = target as FrozenJSONObject;\n targetOpt = target[token];\n }\n if (targetOpt === undefined) {\n return undefined;\n }\n target = targetOpt;\n }\n return target;\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","names":["#dagRead"],"sources":["../../../../../replicache/src/db/read.ts"],"sourcesContent":["import type {Enum} from '../../../shared/src/enum.ts';\nimport {BTreeRead} from '../btree/read.ts';\nimport type {Read as DagRead} from '../dag/store.ts';\nimport type * as FormatVersion from '../format-version-enum.ts';\nimport type {FrozenJSONValue} from '../frozen-json.ts';\nimport type {Hash} from '../hash.ts';\nimport type {Commit} from './commit.ts';\nimport {\n DEFAULT_HEAD_NAME,\n type Meta,\n commitFromHash,\n commitFromHead,\n} from './commit.ts';\nimport {IndexRead} from './index.ts';\n\ntype FormatVersion = Enum<typeof FormatVersion>;\n\nexport class Read {\n readonly #dagRead: DagRead;\n map: BTreeRead;\n readonly indexes: Map<string, IndexRead>;\n\n constructor(\n dagRead: DagRead,\n map: BTreeRead,\n indexes: Map<string, IndexRead>,\n ) {\n this.#dagRead = dagRead;\n this.map = map;\n this.indexes = indexes;\n }\n\n has(key: string): Promise<boolean> {\n return this.map.has(key);\n }\n\n get(key: string): Promise<FrozenJSONValue | undefined> {\n return this.map.get(key);\n }\n\n isEmpty(): Promise<boolean> {\n return this.map.isEmpty();\n }\n\n getMapForIndex(indexName: string): BTreeRead {\n const idx = this.indexes.get(indexName);\n if (idx === undefined) {\n throw new Error(`Unknown index name: ${indexName}`);\n }\n return idx.map;\n }\n\n get closed(): boolean {\n return this.#dagRead.closed;\n }\n\n close(): void {\n this.#dagRead.release();\n }\n}\n\nexport function readFromDefaultHead(\n dagRead: DagRead,\n formatVersion: FormatVersion,\n): Promise<Read> {\n return readFromHead(DEFAULT_HEAD_NAME, dagRead, formatVersion);\n}\n\nexport async function readFromHead(\n name: string,\n dagRead: DagRead,\n formatVersion: FormatVersion,\n): Promise<Read> {\n const commit = await commitFromHead(name, dagRead);\n return readFromCommit(commit, dagRead, formatVersion);\n}\n\nexport async function readFromHash(\n hash: Hash,\n dagRead: DagRead,\n formatVersion: FormatVersion,\n): Promise<Read> {\n const commit = await commitFromHash(hash, dagRead);\n return readFromCommit(commit, dagRead, formatVersion);\n}\n\nfunction readFromCommit(\n commit: Commit<Meta>,\n dagRead: DagRead,\n formatVersion: FormatVersion,\n): Read {\n const indexes = readIndexesForRead(commit, dagRead, formatVersion);\n const map = new BTreeRead(dagRead, formatVersion, commit.valueHash);\n return new Read(dagRead, map, indexes);\n}\n\nexport function readIndexesForRead(\n commit: Commit<Meta>,\n dagRead: DagRead,\n formatVersion: FormatVersion,\n): Map<string, IndexRead> {\n const m = new Map();\n for (const index of commit.indexes) {\n m.set(\n index.definition.name,\n new IndexRead(\n index,\n new BTreeRead(dagRead, formatVersion, index.valueHash),\n ),\n );\n }\n return m;\n}\n"],"mappings":";;;;AAiBA,IAAa,OAAb,MAAkB;CAChB;CACA;CACA;CAEA,YACE,SACA,KACA,SACA;EACA,KAAKA,WAAW;EAChB,KAAK,MAAM;EACX,KAAK,UAAU;CACjB;CAEA,IAAI,KAA+B;EACjC,OAAO,KAAK,IAAI,IAAI,GAAG;CACzB;CAEA,IAAI,KAAmD;EACrD,OAAO,KAAK,IAAI,IAAI,GAAG;CACzB;CAEA,UAA4B;EAC1B,OAAO,KAAK,IAAI,QAAQ;CAC1B;CAEA,eAAe,WAA8B;EAC3C,MAAM,MAAM,KAAK,QAAQ,IAAI,SAAS;EACtC,IAAI,QAAQ,KAAA,GACV,MAAM,IAAI,MAAM,uBAAuB,WAAW;EAEpD,OAAO,IAAI;CACb;CAEA,IAAI,SAAkB;EACpB,OAAO,KAAKA,SAAS;CACvB;CAEA,QAAc;EACZ,KAAKA,SAAS,QAAQ;CACxB;AACF;AAEA,SAAgB,oBACd,SACA,eACe;CACf,OAAO,aAAa,mBAAmB,SAAS,aAAa;AAC/D;AAEA,eAAsB,aACpB,MACA,SACA,eACe;CAEf,OAAO,eAAe,MADD,eAAe,MAAM,OAAO,GACnB,SAAS,aAAa;AACtD;AAEA,eAAsB,aACpB,MACA,SACA,eACe;CAEf,OAAO,eAAe,MADD,eAAe,MAAM,OAAO,GACnB,SAAS,aAAa;AACtD;AAEA,SAAS,eACP,QACA,SACA,eACM;CACN,MAAM,UAAU,mBAAmB,QAAQ,SAAS,aAAa;CAEjE,OAAO,IAAI,KAAK,SAAS,IADT,UAAU,SAAS,eAAe,OAAO,SAChC,GAAK,OAAO;AACvC;AAEA,SAAgB,mBACd,QACA,SACA,eACwB;CACxB,MAAM,oBAAI,IAAI,IAAI;CAClB,KAAK,MAAM,SAAS,OAAO,SACzB,EAAE,IACA,MAAM,WAAW,MACjB,IAAI,UACF,OACA,IAAI,UAAU,SAAS,eAAe,MAAM,SAAS,CACvD,CACF;CAEF,OAAO;AACT"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rebase.js","names":[],"sources":["../../../../../replicache/src/db/rebase.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport {assert} from '../../../shared/src/asserts.ts';\nimport type {Enum} from '../../../shared/src/enum.ts';\nimport type {Write as DagWrite} from '../dag/store.ts';\nimport * as FormatVersion from '../format-version-enum.ts';\nimport type {Hash} from '../hash.ts';\nimport type {ZeroTxData} from '../replicache-options.ts';\nimport type {ClientID} from '../sync/ids.ts';\nimport {WriteTransactionImpl} from '../transactions.ts';\nimport type {MutatorDefs} from '../types.ts';\nimport {\n type Commit,\n type LocalMeta,\n type LocalMetaDD31,\n type Meta,\n assertLocalMetaDD31,\n commitFromHash,\n isLocalMetaDD31,\n} from './commit.ts';\nimport type {Write} from './write.ts';\nimport {newWriteLocal} from './write.ts';\n\ntype FormatVersion = Enum<typeof FormatVersion>;\n\nasync function rebaseMutation(\n mutation: Commit<LocalMetaDD31>,\n dagWrite: DagWrite,\n basisHash: Hash,\n mutators: MutatorDefs,\n lc: LogContext,\n mutationClientID: ClientID,\n formatVersion: FormatVersion,\n zeroData: ZeroTxData | undefined,\n): Promise<Write> {\n const localMeta = mutation.meta;\n const name = localMeta.mutatorName;\n if (isLocalMetaDD31(localMeta)) {\n assert(\n localMeta.clientID === mutationClientID,\n 'mutationClientID must match clientID of LocalMeta',\n );\n }\n const maybeMutatorImpl = mutators[name];\n if (!maybeMutatorImpl) {\n // Developers must not remove mutator names from code deployed with the\n // same schemaVersion because Replicache needs to be able to replay\n // mutations during pull.\n //\n // If we detect that this has happened, stub in a no-op mutator so that at\n // least sync can move forward. Note that the server-side mutation will\n // still get sent. This doesn't remove the queued local mutation, it just\n // removes its visible effects.\n lc.error?.(`Cannot rebase unknown mutator ${name}`);\n }\n const mutatorImpl =\n maybeMutatorImpl ||\n (async () => {\n // no op\n });\n\n const args = localMeta.mutatorArgsJSON;\n\n const basisCommit = await commitFromHash(basisHash, dagWrite);\n const nextMutationID = await basisCommit.getNextMutationID(\n mutationClientID,\n dagWrite,\n );\n if (nextMutationID !== localMeta.mutationID) {\n throw new Error(\n `Inconsistent mutation ID: original: ${localMeta.mutationID}, next: ${nextMutationID} - mutationClientID: ${mutationClientID} mutatorName: ${name}`,\n );\n }\n\n if (formatVersion >= FormatVersion.DD31) {\n assertLocalMetaDD31(localMeta);\n }\n\n const dbWrite = await newWriteLocal(\n basisHash,\n name,\n args,\n mutation.chunk.hash,\n dagWrite,\n localMeta.timestamp,\n mutationClientID,\n formatVersion,\n );\n\n const tx = new WriteTransactionImpl(\n mutationClientID,\n await dbWrite.getMutationID(),\n 'rebase',\n zeroData,\n dbWrite,\n lc,\n );\n await mutatorImpl(tx, args);\n return dbWrite;\n}\n\nexport async function rebaseMutationAndPutCommit(\n mutation: Commit<LocalMeta>,\n dagWrite: DagWrite,\n basis: Hash,\n mutators: MutatorDefs,\n lc: LogContext,\n // TODO(greg): mutationClientID can be retrieved from mutation if LocalMeta\n // is a LocalMetaDD31. As part of DD31 cleanup we can remove this arg.\n mutationClientID: ClientID,\n formatVersion: FormatVersion,\n zeroData: ZeroTxData | undefined,\n): Promise<Commit<Meta>> {\n const tx = await rebaseMutation(\n mutation,\n dagWrite,\n basis,\n mutators,\n lc,\n mutationClientID,\n formatVersion,\n zeroData,\n );\n return tx.putCommit();\n}\n\nexport async function rebaseMutationAndCommit(\n mutation: Commit<LocalMeta>,\n dagWrite: DagWrite,\n basis: Hash,\n headName: string,\n mutators: MutatorDefs,\n lc: LogContext,\n // TODO(greg): mutationClientID can be retrieved from mutation if LocalMeta\n // is a LocalMetaDD31. As part of DD31 cleanup we can remove this arg.\n mutationClientID: ClientID,\n formatVersion: FormatVersion,\n zeroData: ZeroTxData | undefined,\n): Promise<Hash> {\n const dbWrite = await rebaseMutation(\n mutation,\n dagWrite,\n basis,\n mutators,\n lc,\n mutationClientID,\n formatVersion,\n zeroData,\n );\n return dbWrite.commit(headName);\n}\n"],"mappings":";;;;;AAwBA,eAAe,eACb,UACA,UACA,WACA,UACA,IACA,kBACA,eACA,UACgB;CAChB,MAAM,YAAY,SAAS;CAC3B,MAAM,OAAO,UAAU;CACvB,IAAI,gBAAgB,SAAS,GAC3B,OACE,UAAU,aAAa,kBACvB,mDACF;CAEF,MAAM,mBAAmB,SAAS;CAClC,IAAI,CAAC,kBASH,GAAG,QAAQ,iCAAiC,MAAM;CAEpD,MAAM,cACJ,qBACC,YAAY,CAEb;CAEF,MAAM,OAAO,UAAU;CAGvB,MAAM,iBAAiB,OAAM,MADH,eAAe,WAAW,QAAQ,GACnB,kBACvC,kBACA,QACF;CACA,IAAI,mBAAmB,UAAU,YAC/B,MAAM,IAAI,MACR,uCAAuC,UAAU,WAAW,UAAU,eAAe,uBAAuB,iBAAiB,gBAAgB,MAC/I;CAGF,IAAI,iBAAiB,GACnB,oBAAoB,SAAS;CAG/B,MAAM,UAAU,MAAM,cACpB,WACA,MACA,MACA,SAAS,MAAM,MACf,UACA,UAAU,WACV,kBACA,aACF;CAUA,MAAM,YAAY,IARH,qBACb,kBACA,MAAM,QAAQ,cAAc,GAC5B,UACA,UACA,SACA,EAEgB,GAAI,IAAI;CAC1B,OAAO;AACT;AAEA,eAAsB,2BACpB,UACA,UACA,OACA,UACA,IAGA,kBACA,eACA,UACuB;CAWvB,QAAO,MAVU,eACf,UACA,UACA,OACA,UACA,IACA,kBACA,eACA,QACF,GACU,UAAU;AACtB;AAEA,eAAsB,wBACpB,UACA,UACA,OACA,UACA,UACA,IAGA,kBACA,eACA,UACe;CAWf,QAAO,MAVe,eACpB,UACA,UACA,OACA,UACA,IACA,kBACA,eACA,QACF,GACe,OAAO,QAAQ;AAChC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","names":["#dagWrite","#basis","#meta","#clientID","#formatVersion","#generateDiffs"],"sources":["../../../../../replicache/src/db/write.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport {assert} from '../../../shared/src/asserts.ts';\nimport type {Enum} from '../../../shared/src/enum.ts';\nimport {diff} from '../btree/diff.ts';\nimport type {InternalDiff} from '../btree/node.ts';\nimport {BTreeRead, allEntriesAsDiff} from '../btree/read.ts';\nimport {BTreeWrite} from '../btree/write.ts';\nimport type {FrozenCookie} from '../cookies.ts';\nimport type {Write as DagWrite} from '../dag/store.ts';\nimport * as FormatVersion from '../format-version-enum.ts';\nimport type {FrozenJSONValue} from '../frozen-json.ts';\nimport {type Hash, emptyHash} from '../hash.ts';\nimport {lazy} from '../lazy.ts';\nimport type {DiffComputationConfig} from '../sync/diff.ts';\nimport {DiffsMap} from '../sync/diff.ts';\nimport type {ClientID} from '../sync/ids.ts';\nimport type {Commit} from './commit.ts';\nimport {\n type Meta as CommitMeta,\n type IndexRecord,\n type Meta,\n baseSnapshotHashFromHash,\n commitFromHash,\n newLocalDD31 as commitNewLocalDD31,\n newSnapshotDD31 as commitNewSnapshotDD31,\n getMutationID,\n} from './commit.ts';\nimport * as IndexOperation from './index-operation-enum.ts';\nimport type {IndexRead} from './index.ts';\nimport {IndexWrite, indexValue} from './index.ts';\nimport * as MetaType from './meta-type-enum.ts';\nimport {Read, readIndexesForRead} from './read.ts';\n\ntype FormatVersion = Enum<typeof FormatVersion>;\n\nexport class Write extends Read {\n readonly #dagWrite: DagWrite;\n readonly #basis: Commit<CommitMeta> | undefined;\n readonly #meta: CommitMeta;\n\n declare map: BTreeWrite;\n\n declare readonly indexes: Map<string, IndexWrite>;\n readonly #clientID: ClientID;\n readonly #formatVersion: FormatVersion;\n\n constructor(\n dagWrite: DagWrite,\n map: BTreeWrite,\n basis: Commit<CommitMeta> | undefined,\n meta: CommitMeta,\n indexes: Map<string, IndexWrite>,\n clientID: ClientID,\n formatVersion: FormatVersion,\n ) {\n // TypeScript has trouble\n super(dagWrite, map, indexes);\n this.#dagWrite = dagWrite;\n this.#basis = basis;\n this.#meta = meta;\n this.#clientID = clientID;\n this.#formatVersion = formatVersion;\n\n // TODO(arv): if (DEBUG) { ...\n if (basis === undefined) {\n assert(\n meta.basisHash === emptyHash,\n 'Expected basisHash to be emptyHash when basis is undefined',\n );\n } else {\n assert(\n meta.basisHash === basis.chunk.hash,\n 'Expected meta.basisHash to equal basis.chunk.hash',\n );\n }\n }\n\n /**\n * The value needs to be frozen since it is kept in memory and used later for\n * comparison as well as returned in `get`.\n */\n async put(\n lc: LogContext,\n key: string,\n value: FrozenJSONValue,\n ): Promise<void> {\n const oldVal = lazy(() => this.map.get(key));\n await updateIndexes(lc, this.indexes, key, oldVal, value);\n\n await this.map.put(key, value);\n }\n\n /**\n * Inserts or updates multiple entries in a single bulk operation. More\n * efficient than calling {@link put} in a loop because it uses\n * {@link BTreeWrite.putMany} to build or merge tree nodes in one pass.\n *\n * `entries` must be sorted in ascending key order.\n */\n async putMany(\n lc: LogContext,\n entries: ReadonlyArray<readonly [string, FrozenJSONValue]>,\n ): Promise<void> {\n if (entries.length === 0) {\n return;\n }\n\n // Update indexes for all entries\n if (this.indexes.size > 0) {\n // TODO(arv): Indexes can use the optimizePatch pattern too.\n for (const [key, value] of entries) {\n const oldVal = lazy(() => this.map.get(key));\n await updateIndexes(lc, this.indexes, key, oldVal, value);\n }\n }\n\n // BTreeWrite.putMany handles both empty and non-empty trees optimally\n await this.map.putMany(entries);\n }\n\n getMutationID(): Promise<number> {\n return getMutationID(this.#clientID, this.#dagWrite, this.#meta);\n }\n\n async del(lc: LogContext, key: string): Promise<boolean> {\n // TODO(arv): This does the binary search twice. We can do better.\n const oldVal = lazy(() => this.map.get(key));\n if (oldVal !== undefined) {\n await updateIndexes(lc, this.indexes, key, oldVal, undefined);\n }\n return this.map.del(key);\n }\n\n async clear(): Promise<void> {\n await this.map.clear();\n const ps = [];\n for (const idx of this.indexes.values()) {\n ps.push(idx.clear());\n }\n await Promise.all(ps);\n }\n\n async putCommit(): Promise<Commit<CommitMeta>> {\n const valueHash = await this.map.flush();\n const indexRecords: IndexRecord[] = [];\n\n for (const index of this.indexes.values()) {\n const valueHash = await index.flush();\n const indexRecord: IndexRecord = {\n definition: index.meta.definition,\n valueHash,\n };\n indexRecords.push(indexRecord);\n }\n\n let commit: Commit<Meta>;\n const meta = this.#meta;\n switch (meta.type) {\n case MetaType.LocalDD31: {\n assert(\n this.#formatVersion >= FormatVersion.DD31,\n 'Expected formatVersion >= DD31 for LocalDD31 commit',\n );\n const {\n basisHash,\n mutationID,\n mutatorName,\n mutatorArgsJSON,\n originalHash,\n timestamp,\n } = meta;\n commit = commitNewLocalDD31(\n this.#dagWrite.createChunk,\n basisHash,\n await baseSnapshotHashFromHash(basisHash, this.#dagWrite),\n mutationID,\n mutatorName,\n mutatorArgsJSON,\n originalHash,\n valueHash,\n indexRecords,\n timestamp,\n this.#clientID,\n );\n break;\n }\n\n case MetaType.SnapshotDD31: {\n assert(\n this.#formatVersion > FormatVersion.DD31,\n 'Expected formatVersion > DD31 for SnapshotDD31 commit',\n );\n const {basisHash, lastMutationIDs, cookieJSON} = meta;\n commit = commitNewSnapshotDD31(\n this.#dagWrite.createChunk,\n basisHash,\n lastMutationIDs,\n cookieJSON,\n valueHash,\n indexRecords,\n );\n break;\n }\n }\n await this.#dagWrite.putChunk(commit.chunk);\n return commit;\n }\n\n // Return value is the hash of the new commit.\n async commit(headName: string): Promise<Hash> {\n const commit = await this.putCommit();\n const commitHash = commit.chunk.hash;\n await this.#dagWrite.setHead(headName, commitHash);\n await this.#dagWrite.commit();\n return commitHash;\n }\n\n async commitWithDiffs(\n headName: string,\n diffConfig: DiffComputationConfig,\n ): Promise<[Hash, DiffsMap]> {\n const commit = this.putCommit();\n const diffMap = await this.#generateDiffs(diffConfig);\n const commitHash = (await commit).chunk.hash;\n await this.#dagWrite.setHead(headName, commitHash);\n await this.#dagWrite.commit();\n return [commitHash, diffMap];\n }\n\n async #generateDiffs(diffConfig: DiffComputationConfig): Promise<DiffsMap> {\n const diffsMap = new DiffsMap();\n if (!diffConfig.shouldComputeDiffs()) {\n return diffsMap;\n }\n\n let valueDiff: InternalDiff = [];\n if (this.#basis) {\n const basisMap = new BTreeRead(\n this.#dagWrite,\n this.#formatVersion,\n this.#basis.valueHash,\n );\n valueDiff = await diff(basisMap, this.map);\n }\n diffsMap.set('', valueDiff);\n let basisIndexes: Map<string, IndexRead>;\n if (this.#basis) {\n basisIndexes = readIndexesForRead(\n this.#basis,\n this.#dagWrite,\n this.#formatVersion,\n );\n } else {\n basisIndexes = new Map();\n }\n\n for (const [name, index] of this.indexes) {\n if (!diffConfig.shouldComputeDiffsForIndex(name)) {\n continue;\n }\n const basisIndex = basisIndexes.get(name);\n assert(index !== basisIndex, 'Expected index to differ from basisIndex');\n\n const indexDiffResult = await (basisIndex\n ? diff(basisIndex.map, index.map)\n : // No basis. All keys are new.\n allEntriesAsDiff(index.map, 'add'));\n diffsMap.set(name, indexDiffResult);\n }\n\n // Handle indexes in basisIndex but not in this.indexes. All keys are\n // deleted.\n for (const [name, basisIndex] of basisIndexes) {\n if (\n !this.indexes.has(name) &&\n diffConfig.shouldComputeDiffsForIndex(name)\n ) {\n const indexDiffResult = await allEntriesAsDiff(basisIndex.map, 'del');\n diffsMap.set(name, indexDiffResult);\n }\n }\n return diffsMap;\n }\n\n close(): void {\n this.#dagWrite.release();\n }\n}\n\nexport async function newWriteLocal(\n basisHash: Hash,\n mutatorName: string,\n mutatorArgsJSON: FrozenJSONValue,\n originalHash: Hash | null,\n dagWrite: DagWrite,\n timestamp: number,\n clientID: ClientID,\n formatVersion: FormatVersion,\n): Promise<Write> {\n const basis = await commitFromHash(basisHash, dagWrite);\n const bTreeWrite = new BTreeWrite(dagWrite, formatVersion, basis.valueHash);\n const mutationID = await basis.getNextMutationID(clientID, dagWrite);\n const indexes = readIndexesForWrite(basis, dagWrite, formatVersion);\n assert(\n formatVersion >= FormatVersion.DD31,\n 'Expected formatVersion >= DD31 for newWriteLocal',\n );\n return new Write(\n dagWrite,\n bTreeWrite,\n basis,\n\n {\n type: MetaType.LocalDD31,\n basisHash,\n baseSnapshotHash: await baseSnapshotHashFromHash(basisHash, dagWrite),\n mutatorName,\n mutatorArgsJSON,\n mutationID,\n originalHash,\n timestamp,\n clientID,\n },\n indexes,\n clientID,\n formatVersion,\n );\n}\n\nexport async function newWriteSnapshotDD31(\n basisHash: Hash,\n lastMutationIDs: Record<ClientID, number>,\n cookieJSON: FrozenCookie,\n dagWrite: DagWrite,\n clientID: ClientID,\n formatVersion: FormatVersion,\n): Promise<Write> {\n const basis = await commitFromHash(basisHash, dagWrite);\n const bTreeWrite = new BTreeWrite(dagWrite, formatVersion, basis.valueHash);\n return new Write(\n dagWrite,\n bTreeWrite,\n basis,\n {basisHash, type: MetaType.SnapshotDD31, lastMutationIDs, cookieJSON},\n readIndexesForWrite(basis, dagWrite, formatVersion),\n clientID,\n formatVersion,\n );\n}\n\nexport async function updateIndexes(\n lc: LogContext,\n indexes: Map<string, IndexWrite>,\n key: string,\n oldValGetter: () => Promise<FrozenJSONValue | undefined>,\n newVal: FrozenJSONValue | undefined,\n): Promise<void> {\n const ps: Promise<void>[] = [];\n for (const idx of indexes.values()) {\n const {keyPrefix} = idx.meta.definition;\n if (!keyPrefix || key.startsWith(keyPrefix)) {\n const oldVal = await oldValGetter();\n if (oldVal !== undefined) {\n ps.push(\n indexValue(\n lc,\n idx.map,\n IndexOperation.Remove,\n key,\n oldVal,\n idx.meta.definition.jsonPointer,\n idx.meta.definition.allowEmpty ?? false,\n ),\n );\n }\n if (newVal !== undefined) {\n ps.push(\n indexValue(\n lc,\n idx.map,\n IndexOperation.Add,\n key,\n newVal,\n idx.meta.definition.jsonPointer,\n idx.meta.definition.allowEmpty ?? false,\n ),\n );\n }\n }\n }\n await Promise.all(ps);\n}\n\nexport function readIndexesForWrite(\n commit: Commit<CommitMeta>,\n dagWrite: DagWrite,\n formatVersion: FormatVersion,\n): Map<string, IndexWrite> {\n const m = new Map();\n for (const index of commit.indexes) {\n m.set(\n index.definition.name,\n new IndexWrite(\n index,\n new BTreeWrite(dagWrite, formatVersion, index.valueHash),\n ),\n );\n }\n return m;\n}\n\nexport async function createIndexBTree(\n lc: LogContext,\n dagWrite: DagWrite,\n valueMap: BTreeRead,\n prefix: string,\n jsonPointer: string,\n allowEmpty: boolean,\n formatVersion: FormatVersion,\n): Promise<BTreeWrite> {\n const indexMap = new BTreeWrite(dagWrite, formatVersion);\n for await (const entry of valueMap.scan(prefix)) {\n const key = entry[0];\n if (!key.startsWith(prefix)) {\n break;\n }\n await indexValue(\n lc,\n indexMap,\n IndexOperation.Add,\n key,\n entry[1],\n jsonPointer,\n allowEmpty,\n );\n }\n return indexMap;\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleted-clients.js","names":[],"sources":["../../../../replicache/src/deleted-clients.ts"],"sourcesContent":["import {stringCompare} from '../../shared/src/string-compare.ts';\nimport * as v from '../../shared/src/valita.ts';\nimport type {Read, Write} from './dag/store.ts';\nimport {deepFreeze} from './frozen-json.ts';\nimport {getClients, setClients} from './persist/clients.ts';\nimport {\n clientGroupIDSchema,\n clientIDSchema,\n type ClientGroupID,\n type ClientID,\n} from './sync/ids.ts';\n\n/**\n * We keep track of deleted clients in the {@linkcode DELETED_CLIENTS_HEAD_NAME}\n * head.\n */\nexport const DELETED_CLIENTS_HEAD_NAME = 'deleted-clients-v2';\n\ntype ClientIDPair = {\n clientGroupID: ClientGroupID;\n clientID: ClientID;\n};\n\nexport type DeletedClients = readonly Readonly<ClientIDPair>[];\n\nexport type WritableDeletedClients = ClientIDPair[];\n\nexport const deletedClientsSchema: v.Type<DeletedClients> = v.readonlyArray(\n v.readonlyObject({\n clientGroupID: clientGroupIDSchema,\n clientID: clientIDSchema,\n }),\n);\n\nfunction compare(a: ClientIDPair, b: ClientIDPair): number {\n const cg = stringCompare(a.clientGroupID, b.clientGroupID);\n if (cg !== 0) {\n return cg;\n }\n return stringCompare(a.clientID, b.clientID);\n}\n\nexport function normalizeDeletedClients(\n deletedClients: DeletedClients,\n): DeletedClients {\n return deletedClients\n .toSorted(compare)\n .filter((item, i, arr) => i === 0 || compare(item, arr[i - 1]) !== 0);\n}\n\nexport function mergeDeletedClients(\n a: DeletedClients,\n b: DeletedClients,\n): DeletedClients {\n const merged: WritableDeletedClients = [];\n a = normalizeDeletedClients(a);\n b = normalizeDeletedClients(b);\n for (let i = 0, j = 0; i < a.length || j < b.length; ) {\n if (i < a.length && (j >= b.length || compare(a[i], b[j]) < 0)) {\n merged.push(a[i]);\n i++;\n } else if (j < b.length && (i >= a.length || compare(b[j], a[i]) < 0)) {\n merged.push(b[j]);\n j++;\n } else {\n // equal\n merged.push(a[i]);\n i++;\n j++;\n }\n }\n return merged;\n}\n\nexport function removeFromDeletedClients(\n old: DeletedClients,\n toRemove: DeletedClients,\n): DeletedClients {\n old = normalizeDeletedClients(old);\n toRemove = normalizeDeletedClients(toRemove);\n const result: WritableDeletedClients = [];\n for (let i = 0, j = 0; i < old.length; ) {\n if (j >= toRemove.length || compare(old[i], toRemove[j]) < 0) {\n result.push(old[i]);\n i++;\n } else if (j < toRemove.length && compare(old[i], toRemove[j]) === 0) {\n // equal, skip\n i++;\n j++;\n } else {\n // old[i] > toRemove[j]\n j++;\n }\n }\n return result;\n}\n\nexport async function setDeletedClients(\n dagWrite: Write,\n deletedClients: DeletedClients,\n): Promise<DeletedClients> {\n // sort and dedupe\n\n const data = normalizeDeletedClients(deletedClients);\n\n const chunkData = deepFreeze(data);\n const chunk = dagWrite.createChunk(chunkData, []);\n await dagWrite.putChunk(chunk);\n await dagWrite.setHead(DELETED_CLIENTS_HEAD_NAME, chunk.hash);\n return data;\n}\n\nexport async function getDeletedClients(\n dagRead: Read,\n): Promise<DeletedClients> {\n const hash = await dagRead.getHead(DELETED_CLIENTS_HEAD_NAME);\n if (hash === undefined) {\n return [];\n }\n const chunk = await dagRead.mustGetChunk(hash);\n\n const res = v.test(chunk.data, deletedClientsSchema);\n if (!res.ok) {\n // If not ok then we ignore this. It might be in the old format but we do\n // not know the clientGroupID of the old clients.\n return [];\n }\n\n return res.value;\n}\n\n/**\n * Adds deleted clients to the {@linkcode DELETED_CLIENTS_HEAD_NAME} head.\n * @returns the new list of deleted clients (sorted and deduped).\n */\nexport async function addDeletedClients(\n dagWrite: Write,\n deletedClientsToAdd: DeletedClients,\n): Promise<DeletedClients> {\n const oldDeletedClients = await getDeletedClients(dagWrite);\n\n return setDeletedClients(\n dagWrite,\n mergeDeletedClients(oldDeletedClients, deletedClientsToAdd),\n );\n}\n\nexport async function removeDeletedClients(\n dagWrite: Write,\n deletedClientsToRemove: DeletedClients,\n): Promise<DeletedClients> {\n const oldDeletedClients = await getDeletedClients(dagWrite);\n return setDeletedClients(\n dagWrite,\n removeFromDeletedClients(oldDeletedClients, deletedClientsToRemove),\n );\n}\n\nexport async function confirmDeletedClients(\n dagWrite: Write,\n deletedClientIds: readonly ClientID[],\n deletedClientGroupIds: readonly ClientGroupID[],\n): Promise<DeletedClients> {\n const deletedClientIDSet = new Set(deletedClientIds);\n const deletedClientGroupIDSet = new Set(deletedClientGroupIds);\n const oldDeletedClients = await getDeletedClients(dagWrite);\n const clients = new Map(await getClients(dagWrite));\n for (const clientID of deletedClientIds) {\n clients.delete(clientID);\n }\n for (const clientGroupID of deletedClientGroupIds) {\n for (const [clientID, client] of clients) {\n if (client.clientGroupID === clientGroupID) {\n clients.delete(clientID);\n }\n }\n }\n\n await setClients(clients, dagWrite);\n\n return setDeletedClients(\n dagWrite,\n oldDeletedClients.filter(\n ({clientGroupID, clientID}) =>\n !deletedClientGroupIDSet.has(clientGroupID) &&\n !deletedClientIDSet.has(clientID),\n ),\n );\n}\n"],"mappings":";;;;;;;;;;AAgBA,IAAa,4BAA4B;AAWzC,IAAa,uBAA+C,cAC1D,eAAiB;CACf,eAAe;CACf,UAAU;AACZ,CAAC,CACH;AAEA,SAAS,QAAQ,GAAiB,GAAyB;CACzD,MAAM,KAAK,cAAc,EAAE,eAAe,EAAE,aAAa;CACzD,IAAI,OAAO,GACT,OAAO;CAET,OAAO,cAAc,EAAE,UAAU,EAAE,QAAQ;AAC7C;AAEA,SAAgB,wBACd,gBACgB;CAChB,OAAO,eACJ,SAAS,OAAO,EAChB,QAAQ,MAAM,GAAG,QAAQ,MAAM,KAAK,QAAQ,MAAM,IAAI,IAAI,EAAE,MAAM,CAAC;AACxE;AAEA,SAAgB,oBACd,GACA,GACgB;CAChB,MAAM,SAAiC,CAAC;CACxC,IAAI,wBAAwB,CAAC;CAC7B,IAAI,wBAAwB,CAAC;CAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,UAAU,IAAI,EAAE,SAC3C,IAAI,IAAI,EAAE,WAAW,KAAK,EAAE,UAAU,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI;EAC9D,OAAO,KAAK,EAAE,EAAE;EAChB;CACF,OAAO,IAAI,IAAI,EAAE,WAAW,KAAK,EAAE,UAAU,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI;EACrE,OAAO,KAAK,EAAE,EAAE;EAChB;CACF,OAAO;EAEL,OAAO,KAAK,EAAE,EAAE;EAChB;EACA;CACF;CAEF,OAAO;AACT;AAyBA,eAAsB,kBACpB,UACA,gBACyB;CAGzB,MAAM,OAAO,wBAAwB,cAAc;CAEnD,MAAM,YAAY,WAAW,IAAI;CACjC,MAAM,QAAQ,SAAS,YAAY,WAAW,CAAC,CAAC;CAChD,MAAM,SAAS,SAAS,KAAK;CAC7B,MAAM,SAAS,QAAQ,2BAA2B,MAAM,IAAI;CAC5D,OAAO;AACT;AAEA,eAAsB,kBACpB,SACyB;CACzB,MAAM,OAAO,MAAM,QAAQ,QAAQ,yBAAyB;CAC5D,IAAI,SAAS,KAAA,GACX,OAAO,CAAC;CAIV,MAAM,MAAM,MAAO,MAFC,QAAQ,aAAa,IAAI,GAEpB,MAAM,oBAAoB;CACnD,IAAI,CAAC,IAAI,IAGP,OAAO,CAAC;CAGV,OAAO,IAAI;AACb;;;;;AAMA,eAAsB,kBACpB,UACA,qBACyB;CAGzB,OAAO,kBACL,UACA,oBAAoB,MAJU,kBAAkB,QAAQ,GAIjB,mBAAmB,CAC5D;AACF;AAaA,eAAsB,sBACpB,UACA,kBACA,uBACyB;CACzB,MAAM,qBAAqB,IAAI,IAAI,gBAAgB;CACnD,MAAM,0BAA0B,IAAI,IAAI,qBAAqB;CAC7D,MAAM,oBAAoB,MAAM,kBAAkB,QAAQ;CAC1D,MAAM,UAAU,IAAI,IAAI,MAAM,WAAW,QAAQ,CAAC;CAClD,KAAK,MAAM,YAAY,kBACrB,QAAQ,OAAO,QAAQ;CAEzB,KAAK,MAAM,iBAAiB,uBAC1B,KAAK,MAAM,CAAC,UAAU,WAAW,SAC/B,IAAI,OAAO,kBAAkB,eAC3B,QAAQ,OAAO,QAAQ;CAK7B,MAAM,WAAW,SAAS,QAAQ;CAElC,OAAO,kBACL,UACA,kBAAkB,QACf,EAAC,eAAe,eACf,CAAC,wBAAwB,IAAI,aAAa,KAC1C,CAAC,mBAAmB,IAAI,QAAQ,CACpC,CACF;AACF"}