@rocicorp/zero 1.6.0-canary.10 → 1.6.0-canary.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/analyze-query/src/analyze-cli.js.map +1 -0
- package/out/analyze-query/src/bin-analyze.js.map +1 -0
- package/out/analyze-query/src/bin-transform.js.map +1 -0
- package/out/ast-to-zql/src/ast-to-zql.js.map +1 -0
- package/out/ast-to-zql/src/bin.js.map +1 -0
- package/out/ast-to-zql/src/format.js.map +1 -0
- package/out/datadog/src/datadog-log-sink.js.map +1 -0
- package/out/otel/src/enabled.js.map +1 -0
- package/out/otel/src/log-options.js.map +1 -0
- package/out/otel/src/maybe-time.js.map +1 -0
- package/out/otel/src/span.js.map +1 -0
- package/out/otel/src/version.js.map +1 -0
- package/out/replicache/src/async-iterable-to-array.js.map +1 -0
- package/out/replicache/src/bg-interval.js.map +1 -0
- package/out/replicache/src/btree/diff.js.map +1 -0
- package/out/replicache/src/btree/node.js.map +1 -0
- package/out/replicache/src/btree/read.js.map +1 -0
- package/out/replicache/src/btree/splice.js.map +1 -0
- package/out/replicache/src/btree/write.js.map +1 -0
- package/out/replicache/src/call-default-fetch.js.map +1 -0
- package/out/replicache/src/connection-loop-delegates.js.map +1 -0
- package/out/replicache/src/connection-loop.js.map +1 -0
- package/out/replicache/src/cookies.js.map +1 -0
- package/out/replicache/src/dag/chunk.js.map +1 -0
- package/out/replicache/src/dag/gc.js.map +1 -0
- package/out/replicache/src/dag/key.js.map +1 -0
- package/out/replicache/src/dag/lazy-store.js.map +1 -0
- package/out/replicache/src/dag/store-impl.js.map +1 -0
- package/out/replicache/src/dag/store.js.map +1 -0
- package/out/replicache/src/dag/visitor.js.map +1 -0
- package/out/replicache/src/db/commit.js.map +1 -0
- package/out/replicache/src/db/index.js.map +1 -0
- package/out/replicache/src/db/read.js.map +1 -0
- package/out/replicache/src/db/rebase.js.map +1 -0
- package/out/replicache/src/db/write.js.map +1 -0
- package/out/replicache/src/deleted-clients.js.map +1 -0
- package/out/replicache/src/error-responses.js.map +1 -0
- package/out/replicache/src/frozen-json.js.map +1 -0
- package/out/replicache/src/get-default-puller.js.map +1 -0
- package/out/replicache/src/get-default-pusher.js.map +1 -0
- package/out/replicache/src/get-kv-store-provider.js.map +1 -0
- package/out/replicache/src/hash.js.map +1 -0
- package/out/replicache/src/http-request-info.js.map +1 -0
- package/out/replicache/src/index-defs.js.map +1 -0
- package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -0
- package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +1 -0
- package/out/replicache/src/kv/idb-store.js.map +1 -0
- package/out/replicache/src/kv/mem-store.js.map +1 -0
- package/out/replicache/src/kv/op-sqlite/store.js.map +1 -0
- package/out/replicache/src/kv/op-sqlite/types.js.map +1 -0
- package/out/replicache/src/kv/read-impl.js.map +1 -0
- package/out/replicache/src/kv/sqlite-store.js.map +1 -0
- package/out/replicache/src/kv/throw-if-closed.js.map +1 -0
- package/out/replicache/src/kv/write-impl-base.js.map +1 -0
- package/out/replicache/src/kv/write-impl.js.map +1 -0
- package/out/replicache/src/lazy.js.map +1 -0
- package/out/replicache/src/log-options.js.map +1 -0
- package/out/replicache/src/make-idb-name.js.map +1 -0
- package/out/replicache/src/new-client-channel.js.map +1 -0
- package/out/replicache/src/on-persist-channel.js.map +1 -0
- package/out/replicache/src/patch-operation.js.map +1 -0
- package/out/replicache/src/pending-mutations.js.map +1 -0
- package/out/replicache/src/persist/client-gc.js.map +1 -0
- package/out/replicache/src/persist/client-group-gc.js.map +1 -0
- package/out/replicache/src/persist/client-groups.js.map +1 -0
- package/out/replicache/src/persist/clients.js.map +1 -0
- package/out/replicache/src/persist/collect-idb-databases.js.map +1 -0
- package/out/replicache/src/persist/gather-mem-only-visitor.js.map +1 -0
- package/out/replicache/src/persist/gather-not-cached-visitor.js.map +1 -0
- package/out/replicache/src/persist/heartbeat.js.map +1 -0
- package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -0
- package/out/replicache/src/persist/idb-databases-store.js.map +1 -0
- package/out/replicache/src/persist/make-client-id.js.map +1 -0
- package/out/replicache/src/persist/persist.js.map +1 -0
- package/out/replicache/src/persist/refresh.js.map +1 -0
- package/out/replicache/src/process-scheduler.js.map +1 -0
- package/out/replicache/src/pusher.js.map +1 -0
- package/out/replicache/src/replicache-impl.js.map +1 -0
- package/out/replicache/src/report-error.js.map +1 -0
- package/out/replicache/src/request-idle.js.map +1 -0
- package/out/replicache/src/scan-iterator.js.map +1 -0
- package/out/replicache/src/scan-options.js.map +1 -0
- package/out/replicache/src/set-interval-with-signal.js.map +1 -0
- package/out/replicache/src/subscriptions.js.map +1 -0
- package/out/replicache/src/sync/diff.js.map +1 -0
- package/out/replicache/src/sync/ids.js.map +1 -0
- package/out/replicache/src/sync/patch.js.map +1 -0
- package/out/replicache/src/sync/pull-error.js.map +1 -0
- package/out/replicache/src/sync/pull.js.map +1 -0
- package/out/replicache/src/sync/push.js.map +1 -0
- package/out/replicache/src/sync/request-id.js.map +1 -0
- package/out/replicache/src/sync/sync-head-name.js.map +1 -0
- package/out/replicache/src/to-error.js.map +1 -0
- package/out/replicache/src/transaction-closed-error.js.map +1 -0
- package/out/replicache/src/transactions.js.map +1 -0
- package/out/replicache/src/version.js.map +1 -0
- package/out/replicache/src/with-transactions.js.map +1 -0
- package/out/shared/src/abort-error.js.map +1 -0
- package/out/shared/src/arrays.js.map +1 -0
- package/out/shared/src/asserts.js.map +1 -0
- package/out/shared/src/bigint-json.js.map +1 -0
- package/out/shared/src/binary-search.js.map +1 -0
- package/out/shared/src/broadcast-channel.js.map +1 -0
- package/out/shared/src/browser-env.js.map +1 -0
- package/out/shared/src/btree-set.js.map +1 -0
- package/out/shared/src/cache.js.map +1 -0
- package/out/shared/src/centroid.js.map +1 -0
- package/out/shared/src/config.js.map +1 -0
- package/out/shared/src/custom-key-map.js.map +1 -0
- package/out/shared/src/custom-key-set.js.map +1 -0
- package/out/shared/src/deep-clone.js.map +1 -0
- package/out/shared/src/deep-merge.js.map +1 -0
- package/out/shared/src/document-visible.js.map +1 -0
- package/out/shared/src/dotenv.js.map +1 -0
- package/out/shared/src/error.js.map +1 -0
- package/out/shared/src/has-own.js.map +1 -0
- package/out/shared/src/hash.js.map +1 -0
- package/out/shared/src/iterables.js.map +1 -0
- package/out/shared/src/json-schema.js.map +1 -0
- package/out/shared/src/json.js.map +1 -0
- package/out/shared/src/logging-test-utils.js.map +1 -0
- package/out/shared/src/logging.js.map +1 -0
- package/out/shared/src/map.js.map +1 -0
- package/out/shared/src/must.js.map +1 -0
- package/out/shared/src/navigator.js.map +1 -0
- package/out/shared/src/object-traversal.js.map +1 -0
- package/out/shared/src/objects.js.map +1 -0
- package/out/shared/src/options.js.map +1 -0
- package/out/shared/src/parse-big-int.js.map +1 -0
- package/out/shared/src/promise-race.js.map +1 -0
- package/out/shared/src/queue.js.map +1 -0
- package/out/shared/src/rand.js.map +1 -0
- package/out/shared/src/random-uint64.js.map +1 -0
- package/out/shared/src/random-values.js.map +1 -0
- package/out/shared/src/record-proxy.js.map +1 -0
- package/out/shared/src/resolved-promises.js.map +1 -0
- package/out/shared/src/ring-buffer.js.map +1 -0
- package/out/shared/src/sentinels.js.map +1 -0
- package/out/shared/src/set-utils.js.map +1 -0
- package/out/shared/src/size-of-value.js.map +1 -0
- package/out/shared/src/sleep.js.map +1 -0
- package/out/shared/src/sorted-entries.js.map +1 -0
- package/out/shared/src/string-compare.js.map +1 -0
- package/out/shared/src/subscribable.js.map +1 -0
- package/out/shared/src/tdigest-schema.js.map +1 -0
- package/out/shared/src/tdigest.js.map +1 -0
- package/out/shared/src/valita.js +172 -0
- package/out/shared/src/valita.js.map +1 -0
- package/out/z2s/src/compiler.js.map +1 -0
- package/out/z2s/src/sql.js.map +1 -0
- package/out/zero/package.js +205 -0
- package/out/zero/package.js.map +1 -0
- package/out/zero/src/adapters/drizzle.js +1 -1
- package/out/zero/src/adapters/kysely.js +1 -1
- package/out/zero/src/adapters/pg.js +1 -1
- package/out/zero/src/adapters/postgresjs.js +1 -1
- package/out/zero/src/adapters/prisma.js +1 -1
- package/out/zero/src/analyze-query.js +1 -1
- package/out/zero/src/analyze.js +1 -1
- package/out/zero/src/ast-to-zql.js +1 -1
- package/out/zero/src/bindings.js +11 -11
- package/out/zero/src/change-protocol/v0.js +2 -2
- package/out/zero/src/cli.js +1 -1
- package/out/zero/src/deploy-permissions.js +1 -1
- package/out/zero/src/expo-sqlite.js +2 -2
- package/out/zero/src/op-sqlite.js +2 -2
- package/out/zero/src/pg.js +9 -9
- package/out/zero/src/react-native.js +2 -2
- package/out/zero/src/react.js +5 -5
- package/out/zero/src/server.js +8 -8
- package/out/zero/src/solid.js +5 -5
- package/out/zero/src/sqlite.js +2 -2
- package/out/zero/src/transform-query.js +1 -1
- package/out/zero/src/zero-cache-dev.js +6 -6
- package/out/zero/src/zero-out.js +5 -5
- package/out/zero/src/zero.js +22 -22
- package/out/zero/src/zqlite.js +5 -5
- package/out/zero-cache/src/auth/auth.js.map +1 -0
- package/out/zero-cache/src/auth/jwt.js.map +1 -0
- package/out/zero-cache/src/auth/load-permissions.js.map +1 -0
- package/out/zero-cache/src/auth/read-authorizer.js.map +1 -0
- package/out/zero-cache/src/auth/write-authorizer.js.map +1 -0
- package/out/zero-cache/src/config/network.js.map +1 -0
- package/out/zero-cache/src/config/normalize.js.map +1 -0
- package/out/zero-cache/src/config/server-context.js.map +1 -0
- package/out/zero-cache/src/config/zero-config.js.map +1 -0
- package/out/zero-cache/src/custom/fetch.js.map +1 -0
- package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -0
- package/out/zero-cache/src/db/create.js.map +1 -0
- package/out/zero-cache/src/db/delete-lite-db.js.map +1 -0
- package/out/zero-cache/src/db/lite-tables.js.map +1 -0
- package/out/zero-cache/src/db/migration-lite.js.map +1 -0
- package/out/zero-cache/src/db/migration.js.map +1 -0
- package/out/zero-cache/src/db/mode-enum.js.map +1 -0
- package/out/zero-cache/src/db/pg-copy-binary.js.map +1 -0
- package/out/zero-cache/src/db/pg-copy.js.map +1 -0
- package/out/zero-cache/src/db/pg-to-lite.js.map +1 -0
- package/out/zero-cache/src/db/pg-type-parser.js.map +1 -0
- package/out/zero-cache/src/db/run-transaction.js.map +1 -0
- package/out/zero-cache/src/db/specs.js.map +1 -0
- package/out/zero-cache/src/db/statements.js.map +1 -0
- package/out/zero-cache/src/db/transaction-pool.js.map +1 -0
- package/out/zero-cache/src/db/warmup.js.map +1 -0
- package/out/zero-cache/src/observability/events.js.map +1 -0
- package/out/zero-cache/src/observability/metrics.js.map +1 -0
- package/out/zero-cache/src/scripts/decommission.js.map +1 -0
- package/out/zero-cache/src/scripts/deploy-permissions.js.map +1 -0
- package/out/zero-cache/src/scripts/permissions.js.map +1 -0
- package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -0
- package/out/zero-cache/src/server/change-streamer.js +26 -26
- package/out/zero-cache/src/server/inspector-delegate.js.map +1 -0
- package/out/zero-cache/src/server/logging.js.map +1 -0
- package/out/zero-cache/src/server/main.js +11 -11
- package/out/zero-cache/src/server/mutator.js +8 -8
- package/out/zero-cache/src/server/otel-diag-logger.js.map +1 -0
- package/out/zero-cache/src/server/otel-log-sink.js.map +1 -0
- package/out/zero-cache/src/server/otel-start.js +53 -0
- package/out/zero-cache/src/server/otel-start.js.map +1 -0
- package/out/zero-cache/src/server/priority-op.js.map +1 -0
- package/out/zero-cache/src/server/reaper.js +13 -13
- package/out/zero-cache/src/server/replicator.js +16 -16
- package/out/zero-cache/src/server/runner/main.js.map +1 -0
- package/out/zero-cache/src/server/runner/run-worker.js.map +1 -0
- package/out/zero-cache/src/server/runner/runtime.js.map +1 -0
- package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -0
- package/out/zero-cache/src/server/shadow-syncer.js +10 -10
- package/out/zero-cache/src/server/syncer.js +29 -29
- package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -0
- package/out/zero-cache/src/server/worker-urls.js.map +1 -0
- package/out/zero-cache/src/server/write-worker.js +1 -1
- package/out/zero-cache/src/services/analyze.js +72 -0
- package/out/zero-cache/src/services/analyze.js.map +1 -0
- package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -0
- package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -0
- package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -0
- package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/backfill-metadata.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/decommission.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/lsn.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/schema/validation.js.map +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current/control.js.map +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.js.map +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current/json.js.map +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current/path.js.map +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current/status.js.map +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current.js +56 -0
- package/out/zero-cache/src/services/change-source/protocol/current.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/replica-monitor.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -0
- package/out/zero-cache/src/services/heapz.js.map +1 -0
- package/out/zero-cache/src/services/http-service.js.map +1 -0
- package/out/zero-cache/src/services/life-cycle.js.map +1 -0
- package/out/zero-cache/src/services/limiter/sliding-window-limiter.js.map +1 -0
- package/out/zero-cache/src/services/litestream/commands.js.map +1 -0
- package/out/zero-cache/src/services/mutagen/error.js.map +1 -0
- package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -0
- package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -0
- package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -0
- package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -0
- package/out/zero-cache/src/services/replicator/notifier.js.map +1 -0
- package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -0
- package/out/zero-cache/src/services/replicator/replicator.js.map +1 -0
- package/out/zero-cache/src/services/replicator/reporter/recorder.js.map +1 -0
- package/out/zero-cache/src/services/replicator/reporter/report-schema.js.map +1 -0
- package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -0
- package/out/zero-cache/src/services/replicator/schema/column-metadata.js.map +1 -0
- package/out/zero-cache/src/services/replicator/schema/constants.js.map +1 -0
- package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -0
- package/out/zero-cache/src/services/replicator/schema/table-metadata.js.map +1 -0
- package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -0
- package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -0
- package/out/zero-cache/src/services/run-ast.js.map +1 -0
- package/out/zero-cache/src/services/runner.js.map +1 -0
- package/out/zero-cache/src/services/running-state.js.map +1 -0
- package/out/zero-cache/src/services/shadow-sync/shadow-sync-service.js.map +1 -0
- package/out/zero-cache/src/services/statz.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/active-users-gauge.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/client-schema.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/connection-context-manager.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/cvr-purger.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/inspect-handler.js +102 -0
- package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/row-set-signature.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/tracer.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/ttl-clock.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -0
- package/out/zero-cache/src/types/configuration-error.js.map +1 -0
- package/out/zero-cache/src/types/error-with-level.js.map +1 -0
- package/out/zero-cache/src/types/http.js.map +1 -0
- package/out/zero-cache/src/types/lexi-version.js.map +1 -0
- package/out/zero-cache/src/types/lite.js.map +1 -0
- package/out/zero-cache/src/types/names.js.map +1 -0
- package/out/zero-cache/src/types/pg-data-type.js.map +1 -0
- package/out/zero-cache/src/types/pg-types.js.map +1 -0
- package/out/zero-cache/src/types/pg-versions.js.map +1 -0
- package/out/zero-cache/src/types/pg.js.map +1 -0
- package/out/zero-cache/src/types/processes.js.map +1 -0
- package/out/zero-cache/src/types/profiler.js.map +1 -0
- package/out/zero-cache/src/types/row-key.js.map +1 -0
- package/out/zero-cache/src/types/shards.js.map +1 -0
- package/out/zero-cache/src/types/sql.js.map +1 -0
- package/out/zero-cache/src/types/state-version.js.map +1 -0
- package/out/zero-cache/src/types/streams.js.map +1 -0
- package/out/zero-cache/src/types/strings.js.map +1 -0
- package/out/zero-cache/src/types/subscription.js.map +1 -0
- package/out/zero-cache/src/types/timeout.js.map +1 -0
- package/out/zero-cache/src/types/url-params.js.map +1 -0
- package/out/zero-cache/src/types/websocket-handoff.js.map +1 -0
- package/out/zero-cache/src/types/ws.js.map +1 -0
- package/out/zero-cache/src/workers/connect-params.js.map +1 -0
- package/out/zero-cache/src/workers/connection.js.map +1 -0
- package/out/zero-cache/src/workers/mutator.js.map +1 -0
- package/out/zero-cache/src/workers/replicator.js.map +1 -0
- package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -0
- package/out/zero-cache/src/workers/syncer.js.map +1 -0
- package/out/zero-client/src/client/active-clients-manager.js.map +1 -0
- package/out/zero-client/src/client/client-error-kind-enum.js.map +1 -0
- package/out/zero-client/src/client/connection-manager.js.map +1 -0
- package/out/zero-client/src/client/connection-status-enum.js +20 -0
- package/out/zero-client/src/client/connection-status-enum.js.map +1 -0
- package/out/zero-client/src/client/connection.js.map +1 -0
- package/out/zero-client/src/client/context.js.map +1 -0
- package/out/zero-client/src/client/crud-impl.js +61 -0
- package/out/zero-client/src/client/crud-impl.js.map +1 -0
- package/out/zero-client/src/client/crud.js.map +1 -0
- package/out/zero-client/src/client/custom.js.map +1 -0
- package/out/zero-client/src/client/delete-clients-manager.js.map +1 -0
- package/out/zero-client/src/client/enable-analytics.js.map +1 -0
- package/out/zero-client/src/client/error.js.map +1 -0
- package/out/zero-client/src/client/http-string.js.map +1 -0
- package/out/zero-client/src/client/inspector/client-group.js.map +1 -0
- package/out/zero-client/src/client/inspector/client.js.map +1 -0
- package/out/zero-client/src/client/inspector/html-dialog-prompt.js.map +1 -0
- package/out/zero-client/src/client/inspector/inspector.js.map +1 -0
- package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -0
- package/out/zero-client/src/client/inspector/query.js.map +1 -0
- package/out/zero-client/src/client/ivm-branch.js.map +1 -0
- package/out/zero-client/src/client/keys.js.map +1 -0
- package/out/zero-client/src/client/log-options.js.map +1 -0
- package/out/zero-client/src/client/make-mutate-property.js.map +1 -0
- package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -0
- package/out/zero-client/src/client/metric-name-enum.js.map +1 -0
- package/out/zero-client/src/client/metrics.js.map +1 -0
- package/out/zero-client/src/client/mutation-tracker.js.map +1 -0
- package/out/zero-client/src/client/mutator-proxy.js.map +1 -0
- package/out/zero-client/src/client/options.js.map +1 -0
- package/out/zero-client/src/client/query-manager.js.map +1 -0
- package/out/zero-client/src/client/reload-error-handler.js.map +1 -0
- package/out/zero-client/src/client/server-option.js.map +1 -0
- package/out/zero-client/src/client/update-needed-reason-type-enum.js +27 -0
- package/out/zero-client/src/client/update-needed-reason-type-enum.js.map +1 -0
- package/out/zero-client/src/client/version.js +9 -0
- package/out/zero-client/src/client/version.js.map +1 -0
- package/out/zero-client/src/client/zero-poke-handler.js.map +1 -0
- package/out/zero-client/src/client/zero-rep.js.map +1 -0
- package/out/zero-client/src/client/zero.js.map +1 -0
- package/out/zero-client/src/util/nanoid.js.map +1 -0
- package/out/zero-protocol/src/analyze-query-result.js.map +1 -0
- package/out/zero-protocol/src/application-error.js.map +1 -0
- package/out/zero-protocol/src/ast.js.map +1 -0
- package/out/zero-protocol/src/change-desired-queries.js.map +1 -0
- package/out/zero-protocol/src/client-schema.js.map +1 -0
- package/out/zero-protocol/src/close-connection.js.map +1 -0
- package/out/zero-protocol/src/connect.js.map +1 -0
- package/out/zero-protocol/src/custom-queries.js.map +1 -0
- package/out/zero-protocol/src/data.js.map +1 -0
- package/out/zero-protocol/src/delete-clients.js.map +1 -0
- package/out/zero-protocol/src/down.js.map +1 -0
- package/out/zero-protocol/src/error-kind-enum.js.map +1 -0
- package/out/zero-protocol/src/error-origin-enum.js.map +1 -0
- package/out/zero-protocol/src/error-reason-enum.js.map +1 -0
- package/out/zero-protocol/src/error.js.map +1 -0
- package/out/zero-protocol/src/inspect-down.js.map +1 -0
- package/out/zero-protocol/src/inspect-up.js.map +1 -0
- package/out/zero-protocol/src/mutate-server.js.map +1 -0
- package/out/zero-protocol/src/mutation-id.js.map +1 -0
- package/out/zero-protocol/src/mutation-type-enum.js.map +1 -0
- package/out/zero-protocol/src/mutation.js.map +1 -0
- package/out/zero-protocol/src/mutations-patch.js.map +1 -0
- package/out/zero-protocol/src/ping.js.map +1 -0
- package/out/zero-protocol/src/poke.js.map +1 -0
- package/out/zero-protocol/src/pong.js.map +1 -0
- package/out/zero-protocol/src/primary-key.js.map +1 -0
- package/out/zero-protocol/src/protocol-version.js.map +1 -0
- package/out/zero-protocol/src/pull.js.map +1 -0
- package/out/zero-protocol/src/push.js.map +1 -0
- package/out/zero-protocol/src/queries-patch.js.map +1 -0
- package/out/zero-protocol/src/query-hash.js.map +1 -0
- package/out/zero-protocol/src/query-server.js.map +1 -0
- package/out/zero-protocol/src/row-patch.js.map +1 -0
- package/out/zero-protocol/src/up.js.map +1 -0
- package/out/zero-protocol/src/update-auth.js.map +1 -0
- package/out/zero-protocol/src/version.js.map +1 -0
- package/out/zero-react/src/use-connection-state.js +19 -0
- package/out/zero-react/src/use-connection-state.js.map +1 -0
- package/out/zero-react/src/use-query.js +301 -0
- package/out/zero-react/src/use-query.js.map +1 -0
- package/out/zero-react/src/use-zero-online.js +22 -0
- package/out/zero-react/src/use-zero-online.js.map +1 -0
- package/out/zero-react/src/zero-provider.js +90 -0
- package/out/zero-react/src/zero-provider.js.map +1 -0
- package/out/zero-schema/src/builder/relationship-builder.js.map +1 -0
- package/out/zero-schema/src/builder/schema-builder.js.map +1 -0
- package/out/zero-schema/src/builder/table-builder.js.map +1 -0
- package/out/zero-schema/src/compiled-permissions.js.map +1 -0
- package/out/zero-schema/src/name-mapper.js.map +1 -0
- package/out/zero-schema/src/permissions.js.map +1 -0
- package/out/zero-schema/src/schema-config.js.map +1 -0
- package/out/zero-server/src/adapters/drizzle.js.map +1 -0
- package/out/zero-server/src/adapters/kysely.js.map +1 -0
- package/out/zero-server/src/adapters/pg.js +83 -0
- package/out/zero-server/src/adapters/pg.js.map +1 -0
- package/out/zero-server/src/adapters/postgresjs.js.map +1 -0
- package/out/zero-server/src/adapters/prisma.js.map +1 -0
- package/out/zero-server/src/custom.js.map +1 -0
- package/out/zero-server/src/logging.js.map +1 -0
- package/out/zero-server/src/pg-query-executor.js.map +1 -0
- package/out/zero-server/src/process-mutations.js.map +1 -0
- package/out/zero-server/src/push-processor.js.map +1 -0
- package/out/zero-server/src/queries/process-queries.js.map +1 -0
- package/out/zero-server/src/schema.js.map +1 -0
- package/out/zero-server/src/zql-database.js.map +1 -0
- package/out/zero-solid/src/solid-view.js +145 -0
- package/out/zero-solid/src/solid-view.js.map +1 -0
- package/out/zero-solid/src/use-connection-state.js +21 -0
- package/out/zero-solid/src/use-connection-state.js.map +1 -0
- package/out/zero-solid/src/use-query.js +64 -0
- package/out/zero-solid/src/use-query.js.map +1 -0
- package/out/zero-solid/src/use-zero-online.js +21 -0
- package/out/zero-solid/src/use-zero-online.js.map +1 -0
- package/out/zero-solid/src/use-zero.js +93 -0
- package/out/zero-solid/src/use-zero.js.map +1 -0
- package/out/zero-types/src/format.js.map +1 -0
- package/out/zero-types/src/name-mapper.js.map +1 -0
- package/out/zql/src/builder/builder.js.map +1 -0
- package/out/zql/src/builder/debug-delegate.js.map +1 -0
- package/out/zql/src/builder/filter.js.map +1 -0
- package/out/zql/src/builder/like.js.map +1 -0
- package/out/zql/src/error.js.map +1 -0
- package/out/zql/src/ivm/array-view.js.map +1 -0
- package/out/zql/src/ivm/cap.js.map +1 -0
- package/out/zql/src/ivm/change.js.map +1 -0
- package/out/zql/src/ivm/constraint.js.map +1 -0
- package/out/zql/src/ivm/data.js.map +1 -0
- package/out/zql/src/ivm/exists.js.map +1 -0
- package/out/zql/src/ivm/fan-in.js.map +1 -0
- package/out/zql/src/ivm/fan-out.js.map +1 -0
- package/out/zql/src/ivm/filter-operators.js.map +1 -0
- package/out/zql/src/ivm/filter-push.js.map +1 -0
- package/out/zql/src/ivm/filter.js.map +1 -0
- package/out/zql/src/ivm/flipped-join.js.map +1 -0
- package/out/zql/src/ivm/join-utils.js.map +1 -0
- package/out/zql/src/ivm/join.js.map +1 -0
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -0
- package/out/zql/src/ivm/memory-source.js.map +1 -0
- package/out/zql/src/ivm/memory-storage.js.map +1 -0
- package/out/zql/src/ivm/operator.js.map +1 -0
- package/out/zql/src/ivm/push-accumulated.js.map +1 -0
- package/out/zql/src/ivm/skip-yields.js.map +1 -0
- package/out/zql/src/ivm/skip.js.map +1 -0
- package/out/zql/src/ivm/source.js.map +1 -0
- package/out/zql/src/ivm/stream.js.map +1 -0
- package/out/zql/src/ivm/take.js.map +1 -0
- package/out/zql/src/ivm/union-fan-in.js.map +1 -0
- package/out/zql/src/ivm/union-fan-out.js.map +1 -0
- package/out/zql/src/ivm/view-apply-change.js.map +1 -0
- package/out/zql/src/mutate/crud.js.map +1 -0
- package/out/zql/src/mutate/custom.js.map +1 -0
- package/out/zql/src/mutate/mutator-registry.js.map +1 -0
- package/out/zql/src/mutate/mutator.js.map +1 -0
- package/out/zql/src/planner/planner-builder.js.map +1 -0
- package/out/zql/src/planner/planner-connection.js.map +1 -0
- package/out/zql/src/planner/planner-constraint.js.map +1 -0
- package/out/zql/src/planner/planner-debug.js.map +1 -0
- package/out/zql/src/planner/planner-fan-in.js.map +1 -0
- package/out/zql/src/planner/planner-fan-out.js.map +1 -0
- package/out/zql/src/planner/planner-graph.js.map +1 -0
- package/out/zql/src/planner/planner-join.js.map +1 -0
- package/out/zql/src/planner/planner-node.js.map +1 -0
- package/out/zql/src/planner/planner-source.js.map +1 -0
- package/out/zql/src/planner/planner-terminus.js.map +1 -0
- package/out/zql/src/query/complete-ordering.js.map +1 -0
- package/out/zql/src/query/create-builder.js.map +1 -0
- package/out/zql/src/query/error.js.map +1 -0
- package/out/zql/src/query/escape-like.js.map +1 -0
- package/out/zql/src/query/expression.js.map +1 -0
- package/out/zql/src/query/measure-push-operator.js.map +1 -0
- package/out/zql/src/query/metrics-delegate.js.map +1 -0
- package/out/zql/src/query/named.js.map +1 -0
- package/out/zql/src/query/query-delegate-base.js.map +1 -0
- package/out/zql/src/query/query-impl.js.map +1 -0
- package/out/zql/src/query/query-internals.js.map +1 -0
- package/out/zql/src/query/query-registry.js.map +1 -0
- package/out/zql/src/query/runnable-query-impl.js.map +1 -0
- package/out/zql/src/query/static-query.js.map +1 -0
- package/out/zql/src/query/ttl.js.map +1 -0
- package/out/zql/src/query/validate-input.js.map +1 -0
- package/out/zqlite/src/database-storage.js.map +1 -0
- package/out/zqlite/src/db.js.map +1 -0
- package/out/zqlite/src/explain-queries.js.map +1 -0
- package/out/zqlite/src/internal/sql-inline.js.map +1 -0
- package/out/zqlite/src/internal/sql.js.map +1 -0
- package/out/zqlite/src/internal/statement-cache.js.map +1 -0
- package/out/zqlite/src/query-builder.js.map +1 -0
- package/out/zqlite/src/query-delegate.js.map +1 -0
- package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -0
- package/out/zqlite/src/sqlite-cost-model.js.map +1 -0
- package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -0
- package/out/zqlite/src/table-source.js.map +1 -0
- package/package.json +1 -1
- package/out/packages/analyze-query/src/analyze-cli.js.map +0 -1
- package/out/packages/analyze-query/src/bin-analyze.js.map +0 -1
- package/out/packages/analyze-query/src/bin-transform.js.map +0 -1
- package/out/packages/ast-to-zql/src/ast-to-zql.js.map +0 -1
- package/out/packages/ast-to-zql/src/bin.js.map +0 -1
- package/out/packages/ast-to-zql/src/format.js.map +0 -1
- package/out/packages/datadog/src/datadog-log-sink.js.map +0 -1
- package/out/packages/otel/src/enabled.js.map +0 -1
- package/out/packages/otel/src/log-options.js.map +0 -1
- package/out/packages/otel/src/maybe-time.js.map +0 -1
- package/out/packages/otel/src/span.js.map +0 -1
- package/out/packages/otel/src/version.js.map +0 -1
- package/out/packages/replicache/src/async-iterable-to-array.js.map +0 -1
- package/out/packages/replicache/src/bg-interval.js.map +0 -1
- package/out/packages/replicache/src/btree/diff.js.map +0 -1
- package/out/packages/replicache/src/btree/node.js.map +0 -1
- package/out/packages/replicache/src/btree/read.js.map +0 -1
- package/out/packages/replicache/src/btree/splice.js.map +0 -1
- package/out/packages/replicache/src/btree/write.js.map +0 -1
- package/out/packages/replicache/src/call-default-fetch.js.map +0 -1
- package/out/packages/replicache/src/connection-loop-delegates.js.map +0 -1
- package/out/packages/replicache/src/connection-loop.js.map +0 -1
- package/out/packages/replicache/src/cookies.js.map +0 -1
- package/out/packages/replicache/src/dag/chunk.js.map +0 -1
- package/out/packages/replicache/src/dag/gc.js.map +0 -1
- package/out/packages/replicache/src/dag/key.js.map +0 -1
- package/out/packages/replicache/src/dag/lazy-store.js.map +0 -1
- package/out/packages/replicache/src/dag/store-impl.js.map +0 -1
- package/out/packages/replicache/src/dag/store.js.map +0 -1
- package/out/packages/replicache/src/dag/visitor.js.map +0 -1
- package/out/packages/replicache/src/db/commit.js.map +0 -1
- package/out/packages/replicache/src/db/index.js.map +0 -1
- package/out/packages/replicache/src/db/read.js.map +0 -1
- package/out/packages/replicache/src/db/rebase.js.map +0 -1
- package/out/packages/replicache/src/db/write.js.map +0 -1
- package/out/packages/replicache/src/deleted-clients.js.map +0 -1
- package/out/packages/replicache/src/error-responses.js.map +0 -1
- package/out/packages/replicache/src/frozen-json.js.map +0 -1
- package/out/packages/replicache/src/get-default-puller.js.map +0 -1
- package/out/packages/replicache/src/get-default-pusher.js.map +0 -1
- package/out/packages/replicache/src/get-kv-store-provider.js.map +0 -1
- package/out/packages/replicache/src/hash.js.map +0 -1
- package/out/packages/replicache/src/http-request-info.js.map +0 -1
- package/out/packages/replicache/src/index-defs.js.map +0 -1
- package/out/packages/replicache/src/kv/expo-sqlite/store.js.map +0 -1
- package/out/packages/replicache/src/kv/idb-store-with-mem-fallback.js.map +0 -1
- package/out/packages/replicache/src/kv/idb-store.js.map +0 -1
- package/out/packages/replicache/src/kv/mem-store.js.map +0 -1
- package/out/packages/replicache/src/kv/op-sqlite/store.js.map +0 -1
- package/out/packages/replicache/src/kv/op-sqlite/types.js.map +0 -1
- package/out/packages/replicache/src/kv/read-impl.js.map +0 -1
- package/out/packages/replicache/src/kv/sqlite-store.js.map +0 -1
- package/out/packages/replicache/src/kv/throw-if-closed.js.map +0 -1
- package/out/packages/replicache/src/kv/write-impl-base.js.map +0 -1
- package/out/packages/replicache/src/kv/write-impl.js.map +0 -1
- package/out/packages/replicache/src/lazy.js.map +0 -1
- package/out/packages/replicache/src/log-options.js.map +0 -1
- package/out/packages/replicache/src/make-idb-name.js.map +0 -1
- package/out/packages/replicache/src/new-client-channel.js.map +0 -1
- package/out/packages/replicache/src/on-persist-channel.js.map +0 -1
- package/out/packages/replicache/src/patch-operation.js.map +0 -1
- package/out/packages/replicache/src/pending-mutations.js.map +0 -1
- package/out/packages/replicache/src/persist/client-gc.js.map +0 -1
- package/out/packages/replicache/src/persist/client-group-gc.js.map +0 -1
- package/out/packages/replicache/src/persist/client-groups.js.map +0 -1
- package/out/packages/replicache/src/persist/clients.js.map +0 -1
- package/out/packages/replicache/src/persist/collect-idb-databases.js.map +0 -1
- package/out/packages/replicache/src/persist/gather-mem-only-visitor.js.map +0 -1
- package/out/packages/replicache/src/persist/gather-not-cached-visitor.js.map +0 -1
- package/out/packages/replicache/src/persist/heartbeat.js.map +0 -1
- package/out/packages/replicache/src/persist/idb-databases-store-db-name.js.map +0 -1
- package/out/packages/replicache/src/persist/idb-databases-store.js.map +0 -1
- package/out/packages/replicache/src/persist/make-client-id.js.map +0 -1
- package/out/packages/replicache/src/persist/persist.js.map +0 -1
- package/out/packages/replicache/src/persist/refresh.js.map +0 -1
- package/out/packages/replicache/src/process-scheduler.js.map +0 -1
- package/out/packages/replicache/src/pusher.js.map +0 -1
- package/out/packages/replicache/src/replicache-impl.js.map +0 -1
- package/out/packages/replicache/src/report-error.js.map +0 -1
- package/out/packages/replicache/src/request-idle.js.map +0 -1
- package/out/packages/replicache/src/scan-iterator.js.map +0 -1
- package/out/packages/replicache/src/scan-options.js.map +0 -1
- package/out/packages/replicache/src/set-interval-with-signal.js.map +0 -1
- package/out/packages/replicache/src/subscriptions.js.map +0 -1
- package/out/packages/replicache/src/sync/diff.js.map +0 -1
- package/out/packages/replicache/src/sync/ids.js.map +0 -1
- package/out/packages/replicache/src/sync/patch.js.map +0 -1
- package/out/packages/replicache/src/sync/pull-error.js.map +0 -1
- package/out/packages/replicache/src/sync/pull.js.map +0 -1
- package/out/packages/replicache/src/sync/push.js.map +0 -1
- package/out/packages/replicache/src/sync/request-id.js.map +0 -1
- package/out/packages/replicache/src/sync/sync-head-name.js.map +0 -1
- package/out/packages/replicache/src/to-error.js.map +0 -1
- package/out/packages/replicache/src/transaction-closed-error.js.map +0 -1
- package/out/packages/replicache/src/transactions.js.map +0 -1
- package/out/packages/replicache/src/version.js.map +0 -1
- package/out/packages/replicache/src/with-transactions.js.map +0 -1
- package/out/packages/shared/src/abort-error.js.map +0 -1
- package/out/packages/shared/src/arrays.js.map +0 -1
- package/out/packages/shared/src/asserts.js.map +0 -1
- package/out/packages/shared/src/bigint-json.js.map +0 -1
- package/out/packages/shared/src/binary-search.js.map +0 -1
- package/out/packages/shared/src/broadcast-channel.js.map +0 -1
- package/out/packages/shared/src/browser-env.js.map +0 -1
- package/out/packages/shared/src/btree-set.js.map +0 -1
- package/out/packages/shared/src/cache.js.map +0 -1
- package/out/packages/shared/src/centroid.js.map +0 -1
- package/out/packages/shared/src/config.js.map +0 -1
- package/out/packages/shared/src/custom-key-map.js.map +0 -1
- package/out/packages/shared/src/custom-key-set.js.map +0 -1
- package/out/packages/shared/src/deep-clone.js.map +0 -1
- package/out/packages/shared/src/deep-merge.js.map +0 -1
- package/out/packages/shared/src/document-visible.js.map +0 -1
- package/out/packages/shared/src/dotenv.js.map +0 -1
- package/out/packages/shared/src/error.js.map +0 -1
- package/out/packages/shared/src/has-own.js.map +0 -1
- package/out/packages/shared/src/hash.js.map +0 -1
- package/out/packages/shared/src/iterables.js.map +0 -1
- package/out/packages/shared/src/json-schema.js.map +0 -1
- package/out/packages/shared/src/json.js.map +0 -1
- package/out/packages/shared/src/logging-test-utils.js.map +0 -1
- package/out/packages/shared/src/logging.js.map +0 -1
- package/out/packages/shared/src/map.js.map +0 -1
- package/out/packages/shared/src/must.js.map +0 -1
- package/out/packages/shared/src/navigator.js.map +0 -1
- package/out/packages/shared/src/object-traversal.js.map +0 -1
- package/out/packages/shared/src/objects.js.map +0 -1
- package/out/packages/shared/src/options.js.map +0 -1
- package/out/packages/shared/src/parse-big-int.js.map +0 -1
- package/out/packages/shared/src/promise-race.js.map +0 -1
- package/out/packages/shared/src/queue.js.map +0 -1
- package/out/packages/shared/src/rand.js.map +0 -1
- package/out/packages/shared/src/random-uint64.js.map +0 -1
- package/out/packages/shared/src/random-values.js.map +0 -1
- package/out/packages/shared/src/record-proxy.js.map +0 -1
- package/out/packages/shared/src/resolved-promises.js.map +0 -1
- package/out/packages/shared/src/ring-buffer.js.map +0 -1
- package/out/packages/shared/src/sentinels.js.map +0 -1
- package/out/packages/shared/src/set-utils.js.map +0 -1
- package/out/packages/shared/src/size-of-value.js.map +0 -1
- package/out/packages/shared/src/sleep.js.map +0 -1
- package/out/packages/shared/src/sorted-entries.js.map +0 -1
- package/out/packages/shared/src/string-compare.js.map +0 -1
- package/out/packages/shared/src/subscribable.js.map +0 -1
- package/out/packages/shared/src/tdigest-schema.js.map +0 -1
- package/out/packages/shared/src/tdigest.js.map +0 -1
- package/out/packages/shared/src/valita.js +0 -172
- package/out/packages/shared/src/valita.js.map +0 -1
- package/out/packages/z2s/src/compiler.js.map +0 -1
- package/out/packages/z2s/src/sql.js.map +0 -1
- package/out/packages/zero/package.js +0 -205
- package/out/packages/zero/package.js.map +0 -1
- package/out/packages/zero-cache/src/auth/auth.js.map +0 -1
- package/out/packages/zero-cache/src/auth/jwt.js.map +0 -1
- package/out/packages/zero-cache/src/auth/load-permissions.js.map +0 -1
- package/out/packages/zero-cache/src/auth/read-authorizer.js.map +0 -1
- package/out/packages/zero-cache/src/auth/write-authorizer.js.map +0 -1
- package/out/packages/zero-cache/src/config/network.js.map +0 -1
- package/out/packages/zero-cache/src/config/normalize.js.map +0 -1
- package/out/packages/zero-cache/src/config/server-context.js.map +0 -1
- package/out/packages/zero-cache/src/config/zero-config.js.map +0 -1
- package/out/packages/zero-cache/src/custom/fetch.js.map +0 -1
- package/out/packages/zero-cache/src/custom-queries/transform-query.js.map +0 -1
- package/out/packages/zero-cache/src/db/create.js.map +0 -1
- package/out/packages/zero-cache/src/db/delete-lite-db.js.map +0 -1
- package/out/packages/zero-cache/src/db/lite-tables.js.map +0 -1
- package/out/packages/zero-cache/src/db/migration-lite.js.map +0 -1
- package/out/packages/zero-cache/src/db/migration.js.map +0 -1
- package/out/packages/zero-cache/src/db/mode-enum.js.map +0 -1
- package/out/packages/zero-cache/src/db/pg-copy-binary.js.map +0 -1
- package/out/packages/zero-cache/src/db/pg-copy.js.map +0 -1
- package/out/packages/zero-cache/src/db/pg-to-lite.js.map +0 -1
- package/out/packages/zero-cache/src/db/pg-type-parser.js.map +0 -1
- package/out/packages/zero-cache/src/db/run-transaction.js.map +0 -1
- package/out/packages/zero-cache/src/db/specs.js.map +0 -1
- package/out/packages/zero-cache/src/db/statements.js.map +0 -1
- package/out/packages/zero-cache/src/db/transaction-pool.js.map +0 -1
- package/out/packages/zero-cache/src/db/warmup.js.map +0 -1
- package/out/packages/zero-cache/src/observability/events.js.map +0 -1
- package/out/packages/zero-cache/src/observability/metrics.js.map +0 -1
- package/out/packages/zero-cache/src/scripts/decommission.js.map +0 -1
- package/out/packages/zero-cache/src/scripts/deploy-permissions.js.map +0 -1
- package/out/packages/zero-cache/src/scripts/permissions.js.map +0 -1
- package/out/packages/zero-cache/src/server/anonymous-otel-start.js.map +0 -1
- package/out/packages/zero-cache/src/server/inspector-delegate.js.map +0 -1
- package/out/packages/zero-cache/src/server/logging.js.map +0 -1
- package/out/packages/zero-cache/src/server/otel-diag-logger.js.map +0 -1
- package/out/packages/zero-cache/src/server/otel-log-sink.js.map +0 -1
- package/out/packages/zero-cache/src/server/otel-start.js +0 -53
- package/out/packages/zero-cache/src/server/otel-start.js.map +0 -1
- package/out/packages/zero-cache/src/server/priority-op.js.map +0 -1
- package/out/packages/zero-cache/src/server/runner/main.js.map +0 -1
- package/out/packages/zero-cache/src/server/runner/run-worker.js.map +0 -1
- package/out/packages/zero-cache/src/server/runner/runtime.js.map +0 -1
- package/out/packages/zero-cache/src/server/runner/zero-dispatcher.js.map +0 -1
- package/out/packages/zero-cache/src/server/worker-dispatcher.js.map +0 -1
- package/out/packages/zero-cache/src/server/worker-urls.js.map +0 -1
- package/out/packages/zero-cache/src/services/analyze.js +0 -72
- package/out/packages/zero-cache/src/services/analyze.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/common/backfill-manager.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/common/replica-schema.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/custom/change-source.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/pg/backfill-metadata.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/pg/backfill-stream.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/pg/change-source.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/pg/decommission.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/pg/initial-sync.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/pg/lsn.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/pg/replication-slots.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/pg/schema/ddl.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/pg/schema/init.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/pg/schema/published.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/pg/schema/shard.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/pg/schema/validation.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/protocol/current/control.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/protocol/current/data.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/protocol/current/downstream.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/protocol/current/json.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/protocol/current/path.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/protocol/current/status.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/protocol/current/upstream.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-source/protocol/current.js +0 -56
- package/out/packages/zero-cache/src/services/change-source/protocol/current.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-streamer/backup-monitor.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-streamer/broadcast.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-streamer/change-streamer-http.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-streamer/change-streamer-service.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-streamer/change-streamer.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-streamer/forwarder.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-streamer/replica-monitor.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-streamer/schema/init.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-streamer/schema/tables.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-streamer/snapshot.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-streamer/storer.js.map +0 -1
- package/out/packages/zero-cache/src/services/change-streamer/subscriber.js.map +0 -1
- package/out/packages/zero-cache/src/services/heapz.js.map +0 -1
- package/out/packages/zero-cache/src/services/http-service.js.map +0 -1
- package/out/packages/zero-cache/src/services/life-cycle.js.map +0 -1
- package/out/packages/zero-cache/src/services/limiter/sliding-window-limiter.js.map +0 -1
- package/out/packages/zero-cache/src/services/litestream/commands.js.map +0 -1
- package/out/packages/zero-cache/src/services/mutagen/error.js.map +0 -1
- package/out/packages/zero-cache/src/services/mutagen/mutagen.js.map +0 -1
- package/out/packages/zero-cache/src/services/mutagen/pusher.js.map +0 -1
- package/out/packages/zero-cache/src/services/replicator/change-processor.js.map +0 -1
- package/out/packages/zero-cache/src/services/replicator/incremental-sync.js.map +0 -1
- package/out/packages/zero-cache/src/services/replicator/notifier.js.map +0 -1
- package/out/packages/zero-cache/src/services/replicator/replication-status.js.map +0 -1
- package/out/packages/zero-cache/src/services/replicator/replicator.js.map +0 -1
- package/out/packages/zero-cache/src/services/replicator/reporter/recorder.js.map +0 -1
- package/out/packages/zero-cache/src/services/replicator/reporter/report-schema.js.map +0 -1
- package/out/packages/zero-cache/src/services/replicator/schema/change-log.js.map +0 -1
- package/out/packages/zero-cache/src/services/replicator/schema/column-metadata.js.map +0 -1
- package/out/packages/zero-cache/src/services/replicator/schema/constants.js.map +0 -1
- package/out/packages/zero-cache/src/services/replicator/schema/replication-state.js.map +0 -1
- package/out/packages/zero-cache/src/services/replicator/schema/table-metadata.js.map +0 -1
- package/out/packages/zero-cache/src/services/replicator/write-worker-client.js.map +0 -1
- package/out/packages/zero-cache/src/services/replicator/write-worker.js.map +0 -1
- package/out/packages/zero-cache/src/services/run-ast.js.map +0 -1
- package/out/packages/zero-cache/src/services/runner.js.map +0 -1
- package/out/packages/zero-cache/src/services/running-state.js.map +0 -1
- package/out/packages/zero-cache/src/services/shadow-sync/shadow-sync-service.js.map +0 -1
- package/out/packages/zero-cache/src/services/statz.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/active-users-gauge.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/client-handler.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/client-schema.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/connection-context-manager.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/cvr-purger.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/cvr-store.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/cvr.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/drain-coordinator.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/inspect-handler.js +0 -102
- package/out/packages/zero-cache/src/services/view-syncer/inspect-handler.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/pipeline-driver.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/row-record-cache.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/row-set-signature.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/schema/cvr.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/schema/init.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/schema/types.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/snapshotter.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/tracer.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/ttl-clock.js.map +0 -1
- package/out/packages/zero-cache/src/services/view-syncer/view-syncer.js.map +0 -1
- package/out/packages/zero-cache/src/types/configuration-error.js.map +0 -1
- package/out/packages/zero-cache/src/types/error-with-level.js.map +0 -1
- package/out/packages/zero-cache/src/types/http.js.map +0 -1
- package/out/packages/zero-cache/src/types/lexi-version.js.map +0 -1
- package/out/packages/zero-cache/src/types/lite.js.map +0 -1
- package/out/packages/zero-cache/src/types/names.js.map +0 -1
- package/out/packages/zero-cache/src/types/pg-data-type.js.map +0 -1
- package/out/packages/zero-cache/src/types/pg-types.js.map +0 -1
- package/out/packages/zero-cache/src/types/pg-versions.js.map +0 -1
- package/out/packages/zero-cache/src/types/pg.js.map +0 -1
- package/out/packages/zero-cache/src/types/processes.js.map +0 -1
- package/out/packages/zero-cache/src/types/profiler.js.map +0 -1
- package/out/packages/zero-cache/src/types/row-key.js.map +0 -1
- package/out/packages/zero-cache/src/types/shards.js.map +0 -1
- package/out/packages/zero-cache/src/types/sql.js.map +0 -1
- package/out/packages/zero-cache/src/types/state-version.js.map +0 -1
- package/out/packages/zero-cache/src/types/streams.js.map +0 -1
- package/out/packages/zero-cache/src/types/strings.js.map +0 -1
- package/out/packages/zero-cache/src/types/subscription.js.map +0 -1
- package/out/packages/zero-cache/src/types/timeout.js.map +0 -1
- package/out/packages/zero-cache/src/types/url-params.js.map +0 -1
- package/out/packages/zero-cache/src/types/websocket-handoff.js.map +0 -1
- package/out/packages/zero-cache/src/types/ws.js.map +0 -1
- package/out/packages/zero-cache/src/workers/connect-params.js.map +0 -1
- package/out/packages/zero-cache/src/workers/connection.js.map +0 -1
- package/out/packages/zero-cache/src/workers/mutator.js.map +0 -1
- package/out/packages/zero-cache/src/workers/replicator.js.map +0 -1
- package/out/packages/zero-cache/src/workers/syncer-ws-message-handler.js.map +0 -1
- package/out/packages/zero-cache/src/workers/syncer.js.map +0 -1
- package/out/packages/zero-client/src/client/active-clients-manager.js.map +0 -1
- package/out/packages/zero-client/src/client/client-error-kind-enum.js.map +0 -1
- package/out/packages/zero-client/src/client/connection-manager.js.map +0 -1
- package/out/packages/zero-client/src/client/connection-status-enum.js +0 -20
- package/out/packages/zero-client/src/client/connection-status-enum.js.map +0 -1
- package/out/packages/zero-client/src/client/connection.js.map +0 -1
- package/out/packages/zero-client/src/client/context.js.map +0 -1
- package/out/packages/zero-client/src/client/crud-impl.js +0 -61
- package/out/packages/zero-client/src/client/crud-impl.js.map +0 -1
- package/out/packages/zero-client/src/client/crud.js.map +0 -1
- package/out/packages/zero-client/src/client/custom.js.map +0 -1
- package/out/packages/zero-client/src/client/delete-clients-manager.js.map +0 -1
- package/out/packages/zero-client/src/client/enable-analytics.js.map +0 -1
- package/out/packages/zero-client/src/client/error.js.map +0 -1
- package/out/packages/zero-client/src/client/http-string.js.map +0 -1
- package/out/packages/zero-client/src/client/inspector/client-group.js.map +0 -1
- package/out/packages/zero-client/src/client/inspector/client.js.map +0 -1
- package/out/packages/zero-client/src/client/inspector/html-dialog-prompt.js.map +0 -1
- package/out/packages/zero-client/src/client/inspector/inspector.js.map +0 -1
- package/out/packages/zero-client/src/client/inspector/lazy-inspector.js.map +0 -1
- package/out/packages/zero-client/src/client/inspector/query.js.map +0 -1
- package/out/packages/zero-client/src/client/ivm-branch.js.map +0 -1
- package/out/packages/zero-client/src/client/keys.js.map +0 -1
- package/out/packages/zero-client/src/client/log-options.js.map +0 -1
- package/out/packages/zero-client/src/client/make-mutate-property.js.map +0 -1
- package/out/packages/zero-client/src/client/make-replicache-mutators.js.map +0 -1
- package/out/packages/zero-client/src/client/metric-name-enum.js.map +0 -1
- package/out/packages/zero-client/src/client/metrics.js.map +0 -1
- package/out/packages/zero-client/src/client/mutation-tracker.js.map +0 -1
- package/out/packages/zero-client/src/client/mutator-proxy.js.map +0 -1
- package/out/packages/zero-client/src/client/options.js.map +0 -1
- package/out/packages/zero-client/src/client/query-manager.js.map +0 -1
- package/out/packages/zero-client/src/client/reload-error-handler.js.map +0 -1
- package/out/packages/zero-client/src/client/server-option.js.map +0 -1
- package/out/packages/zero-client/src/client/update-needed-reason-type-enum.js +0 -27
- package/out/packages/zero-client/src/client/update-needed-reason-type-enum.js.map +0 -1
- package/out/packages/zero-client/src/client/version.js +0 -9
- package/out/packages/zero-client/src/client/version.js.map +0 -1
- package/out/packages/zero-client/src/client/zero-poke-handler.js.map +0 -1
- package/out/packages/zero-client/src/client/zero-rep.js.map +0 -1
- package/out/packages/zero-client/src/client/zero.js.map +0 -1
- package/out/packages/zero-client/src/util/nanoid.js.map +0 -1
- package/out/packages/zero-protocol/src/analyze-query-result.js.map +0 -1
- package/out/packages/zero-protocol/src/application-error.js.map +0 -1
- package/out/packages/zero-protocol/src/ast.js.map +0 -1
- package/out/packages/zero-protocol/src/change-desired-queries.js.map +0 -1
- package/out/packages/zero-protocol/src/client-schema.js.map +0 -1
- package/out/packages/zero-protocol/src/close-connection.js.map +0 -1
- package/out/packages/zero-protocol/src/connect.js.map +0 -1
- package/out/packages/zero-protocol/src/custom-queries.js.map +0 -1
- package/out/packages/zero-protocol/src/data.js.map +0 -1
- package/out/packages/zero-protocol/src/delete-clients.js.map +0 -1
- package/out/packages/zero-protocol/src/down.js.map +0 -1
- package/out/packages/zero-protocol/src/error-kind-enum.js.map +0 -1
- package/out/packages/zero-protocol/src/error-origin-enum.js.map +0 -1
- package/out/packages/zero-protocol/src/error-reason-enum.js.map +0 -1
- package/out/packages/zero-protocol/src/error.js.map +0 -1
- package/out/packages/zero-protocol/src/inspect-down.js.map +0 -1
- package/out/packages/zero-protocol/src/inspect-up.js.map +0 -1
- package/out/packages/zero-protocol/src/mutate-server.js.map +0 -1
- package/out/packages/zero-protocol/src/mutation-id.js.map +0 -1
- package/out/packages/zero-protocol/src/mutation-type-enum.js.map +0 -1
- package/out/packages/zero-protocol/src/mutation.js.map +0 -1
- package/out/packages/zero-protocol/src/mutations-patch.js.map +0 -1
- package/out/packages/zero-protocol/src/ping.js.map +0 -1
- package/out/packages/zero-protocol/src/poke.js.map +0 -1
- package/out/packages/zero-protocol/src/pong.js.map +0 -1
- package/out/packages/zero-protocol/src/primary-key.js.map +0 -1
- package/out/packages/zero-protocol/src/protocol-version.js.map +0 -1
- package/out/packages/zero-protocol/src/pull.js.map +0 -1
- package/out/packages/zero-protocol/src/push.js.map +0 -1
- package/out/packages/zero-protocol/src/queries-patch.js.map +0 -1
- package/out/packages/zero-protocol/src/query-hash.js.map +0 -1
- package/out/packages/zero-protocol/src/query-server.js.map +0 -1
- package/out/packages/zero-protocol/src/row-patch.js.map +0 -1
- package/out/packages/zero-protocol/src/up.js.map +0 -1
- package/out/packages/zero-protocol/src/update-auth.js.map +0 -1
- package/out/packages/zero-protocol/src/version.js.map +0 -1
- package/out/packages/zero-react/src/use-connection-state.js +0 -19
- package/out/packages/zero-react/src/use-connection-state.js.map +0 -1
- package/out/packages/zero-react/src/use-query.js +0 -301
- package/out/packages/zero-react/src/use-query.js.map +0 -1
- package/out/packages/zero-react/src/use-zero-online.js +0 -22
- package/out/packages/zero-react/src/use-zero-online.js.map +0 -1
- package/out/packages/zero-react/src/zero-provider.js +0 -90
- package/out/packages/zero-react/src/zero-provider.js.map +0 -1
- package/out/packages/zero-schema/src/builder/relationship-builder.js.map +0 -1
- package/out/packages/zero-schema/src/builder/schema-builder.js.map +0 -1
- package/out/packages/zero-schema/src/builder/table-builder.js.map +0 -1
- package/out/packages/zero-schema/src/compiled-permissions.js.map +0 -1
- package/out/packages/zero-schema/src/name-mapper.js.map +0 -1
- package/out/packages/zero-schema/src/permissions.js.map +0 -1
- package/out/packages/zero-schema/src/schema-config.js.map +0 -1
- package/out/packages/zero-server/src/adapters/drizzle.js.map +0 -1
- package/out/packages/zero-server/src/adapters/kysely.js.map +0 -1
- package/out/packages/zero-server/src/adapters/pg.js +0 -83
- package/out/packages/zero-server/src/adapters/pg.js.map +0 -1
- package/out/packages/zero-server/src/adapters/postgresjs.js.map +0 -1
- package/out/packages/zero-server/src/adapters/prisma.js.map +0 -1
- package/out/packages/zero-server/src/custom.js.map +0 -1
- package/out/packages/zero-server/src/logging.js.map +0 -1
- package/out/packages/zero-server/src/pg-query-executor.js.map +0 -1
- package/out/packages/zero-server/src/process-mutations.js.map +0 -1
- package/out/packages/zero-server/src/push-processor.js.map +0 -1
- package/out/packages/zero-server/src/queries/process-queries.js.map +0 -1
- package/out/packages/zero-server/src/schema.js.map +0 -1
- package/out/packages/zero-server/src/zql-database.js.map +0 -1
- package/out/packages/zero-solid/src/solid-view.js +0 -145
- package/out/packages/zero-solid/src/solid-view.js.map +0 -1
- package/out/packages/zero-solid/src/use-connection-state.js +0 -21
- package/out/packages/zero-solid/src/use-connection-state.js.map +0 -1
- package/out/packages/zero-solid/src/use-query.js +0 -64
- package/out/packages/zero-solid/src/use-query.js.map +0 -1
- package/out/packages/zero-solid/src/use-zero-online.js +0 -21
- package/out/packages/zero-solid/src/use-zero-online.js.map +0 -1
- package/out/packages/zero-solid/src/use-zero.js +0 -93
- package/out/packages/zero-solid/src/use-zero.js.map +0 -1
- package/out/packages/zero-types/src/format.js.map +0 -1
- package/out/packages/zero-types/src/name-mapper.js.map +0 -1
- package/out/packages/zql/src/builder/builder.js.map +0 -1
- package/out/packages/zql/src/builder/debug-delegate.js.map +0 -1
- package/out/packages/zql/src/builder/filter.js.map +0 -1
- package/out/packages/zql/src/builder/like.js.map +0 -1
- package/out/packages/zql/src/error.js.map +0 -1
- package/out/packages/zql/src/ivm/array-view.js.map +0 -1
- package/out/packages/zql/src/ivm/cap.js.map +0 -1
- package/out/packages/zql/src/ivm/change.js.map +0 -1
- package/out/packages/zql/src/ivm/constraint.js.map +0 -1
- package/out/packages/zql/src/ivm/data.js.map +0 -1
- package/out/packages/zql/src/ivm/exists.js.map +0 -1
- package/out/packages/zql/src/ivm/fan-in.js.map +0 -1
- package/out/packages/zql/src/ivm/fan-out.js.map +0 -1
- package/out/packages/zql/src/ivm/filter-operators.js.map +0 -1
- package/out/packages/zql/src/ivm/filter-push.js.map +0 -1
- package/out/packages/zql/src/ivm/filter.js.map +0 -1
- package/out/packages/zql/src/ivm/flipped-join.js.map +0 -1
- package/out/packages/zql/src/ivm/join-utils.js.map +0 -1
- package/out/packages/zql/src/ivm/join.js.map +0 -1
- package/out/packages/zql/src/ivm/maybe-split-and-push-edit-change.js.map +0 -1
- package/out/packages/zql/src/ivm/memory-source.js.map +0 -1
- package/out/packages/zql/src/ivm/memory-storage.js.map +0 -1
- package/out/packages/zql/src/ivm/operator.js.map +0 -1
- package/out/packages/zql/src/ivm/push-accumulated.js.map +0 -1
- package/out/packages/zql/src/ivm/skip-yields.js.map +0 -1
- package/out/packages/zql/src/ivm/skip.js.map +0 -1
- package/out/packages/zql/src/ivm/source.js.map +0 -1
- package/out/packages/zql/src/ivm/stream.js.map +0 -1
- package/out/packages/zql/src/ivm/take.js.map +0 -1
- package/out/packages/zql/src/ivm/union-fan-in.js.map +0 -1
- package/out/packages/zql/src/ivm/union-fan-out.js.map +0 -1
- package/out/packages/zql/src/ivm/view-apply-change.js.map +0 -1
- package/out/packages/zql/src/mutate/crud.js.map +0 -1
- package/out/packages/zql/src/mutate/custom.js.map +0 -1
- package/out/packages/zql/src/mutate/mutator-registry.js.map +0 -1
- package/out/packages/zql/src/mutate/mutator.js.map +0 -1
- package/out/packages/zql/src/planner/planner-builder.js.map +0 -1
- package/out/packages/zql/src/planner/planner-connection.js.map +0 -1
- package/out/packages/zql/src/planner/planner-constraint.js.map +0 -1
- package/out/packages/zql/src/planner/planner-debug.js.map +0 -1
- package/out/packages/zql/src/planner/planner-fan-in.js.map +0 -1
- package/out/packages/zql/src/planner/planner-fan-out.js.map +0 -1
- package/out/packages/zql/src/planner/planner-graph.js.map +0 -1
- package/out/packages/zql/src/planner/planner-join.js.map +0 -1
- package/out/packages/zql/src/planner/planner-node.js.map +0 -1
- package/out/packages/zql/src/planner/planner-source.js.map +0 -1
- package/out/packages/zql/src/planner/planner-terminus.js.map +0 -1
- package/out/packages/zql/src/query/complete-ordering.js.map +0 -1
- package/out/packages/zql/src/query/create-builder.js.map +0 -1
- package/out/packages/zql/src/query/error.js.map +0 -1
- package/out/packages/zql/src/query/escape-like.js.map +0 -1
- package/out/packages/zql/src/query/expression.js.map +0 -1
- package/out/packages/zql/src/query/measure-push-operator.js.map +0 -1
- package/out/packages/zql/src/query/metrics-delegate.js.map +0 -1
- package/out/packages/zql/src/query/named.js.map +0 -1
- package/out/packages/zql/src/query/query-delegate-base.js.map +0 -1
- package/out/packages/zql/src/query/query-impl.js.map +0 -1
- package/out/packages/zql/src/query/query-internals.js.map +0 -1
- package/out/packages/zql/src/query/query-registry.js.map +0 -1
- package/out/packages/zql/src/query/runnable-query-impl.js.map +0 -1
- package/out/packages/zql/src/query/static-query.js.map +0 -1
- package/out/packages/zql/src/query/ttl.js.map +0 -1
- package/out/packages/zql/src/query/validate-input.js.map +0 -1
- package/out/packages/zqlite/src/database-storage.js.map +0 -1
- package/out/packages/zqlite/src/db.js.map +0 -1
- package/out/packages/zqlite/src/explain-queries.js.map +0 -1
- package/out/packages/zqlite/src/internal/sql-inline.js.map +0 -1
- package/out/packages/zqlite/src/internal/sql.js.map +0 -1
- package/out/packages/zqlite/src/internal/statement-cache.js.map +0 -1
- package/out/packages/zqlite/src/query-builder.js.map +0 -1
- package/out/packages/zqlite/src/query-delegate.js.map +0 -1
- package/out/packages/zqlite/src/resolve-scalar-subqueries.js.map +0 -1
- package/out/packages/zqlite/src/sqlite-cost-model.js.map +0 -1
- package/out/packages/zqlite/src/sqlite-stat-fanout.js.map +0 -1
- package/out/packages/zqlite/src/table-source.js.map +0 -1
- /package/out/{packages/analyze-query → analyze-query}/src/analyze-cli.js +0 -0
- /package/out/{packages/analyze-query → analyze-query}/src/bin-analyze.js +0 -0
- /package/out/{packages/analyze-query → analyze-query}/src/bin-transform.js +0 -0
- /package/out/{packages/ast-to-zql → ast-to-zql}/src/ast-to-zql.js +0 -0
- /package/out/{packages/ast-to-zql → ast-to-zql}/src/bin.js +0 -0
- /package/out/{packages/ast-to-zql → ast-to-zql}/src/format.js +0 -0
- /package/out/{packages/datadog → datadog}/src/datadog-log-sink.js +0 -0
- /package/out/{packages/otel → otel}/src/enabled.js +0 -0
- /package/out/{packages/otel → otel}/src/log-options.js +0 -0
- /package/out/{packages/otel → otel}/src/maybe-time.js +0 -0
- /package/out/{packages/otel → otel}/src/span.js +0 -0
- /package/out/{packages/otel → otel}/src/version.js +0 -0
- /package/out/{packages/replicache → replicache}/src/async-iterable-to-array.js +0 -0
- /package/out/{packages/replicache → replicache}/src/bg-interval.js +0 -0
- /package/out/{packages/replicache → replicache}/src/btree/diff.js +0 -0
- /package/out/{packages/replicache → replicache}/src/btree/node.js +0 -0
- /package/out/{packages/replicache → replicache}/src/btree/read.js +0 -0
- /package/out/{packages/replicache → replicache}/src/btree/splice.js +0 -0
- /package/out/{packages/replicache → replicache}/src/btree/write.js +0 -0
- /package/out/{packages/replicache → replicache}/src/call-default-fetch.js +0 -0
- /package/out/{packages/replicache → replicache}/src/config.js +0 -0
- /package/out/{packages/replicache → replicache}/src/connection-loop-delegates.js +0 -0
- /package/out/{packages/replicache → replicache}/src/connection-loop.js +0 -0
- /package/out/{packages/replicache → replicache}/src/cookies.js +0 -0
- /package/out/{packages/replicache → replicache}/src/dag/chunk.js +0 -0
- /package/out/{packages/replicache → replicache}/src/dag/gc.js +0 -0
- /package/out/{packages/replicache → replicache}/src/dag/key.js +0 -0
- /package/out/{packages/replicache → replicache}/src/dag/lazy-store.js +0 -0
- /package/out/{packages/replicache → replicache}/src/dag/store-impl.js +0 -0
- /package/out/{packages/replicache → replicache}/src/dag/store.js +0 -0
- /package/out/{packages/replicache → replicache}/src/dag/visitor.js +0 -0
- /package/out/{packages/replicache → replicache}/src/db/commit.js +0 -0
- /package/out/{packages/replicache → replicache}/src/db/index.js +0 -0
- /package/out/{packages/replicache → replicache}/src/db/read.js +0 -0
- /package/out/{packages/replicache → replicache}/src/db/rebase.js +0 -0
- /package/out/{packages/replicache → replicache}/src/db/write.js +0 -0
- /package/out/{packages/replicache → replicache}/src/deleted-clients.js +0 -0
- /package/out/{packages/replicache → replicache}/src/error-responses.js +0 -0
- /package/out/{packages/replicache → replicache}/src/expo-sqlite.js +0 -0
- /package/out/{packages/replicache → replicache}/src/frozen-json.js +0 -0
- /package/out/{packages/replicache → replicache}/src/get-default-puller.js +0 -0
- /package/out/{packages/replicache → replicache}/src/get-default-pusher.js +0 -0
- /package/out/{packages/replicache → replicache}/src/get-kv-store-provider.js +0 -0
- /package/out/{packages/replicache → replicache}/src/hash.js +0 -0
- /package/out/{packages/replicache → replicache}/src/http-request-info.js +0 -0
- /package/out/{packages/replicache → replicache}/src/impl.js +0 -0
- /package/out/{packages/replicache → replicache}/src/index-defs.js +0 -0
- /package/out/{packages/replicache → replicache}/src/kv/expo-sqlite/store.js +0 -0
- /package/out/{packages/replicache → replicache}/src/kv/idb-store-with-mem-fallback.js +0 -0
- /package/out/{packages/replicache → replicache}/src/kv/idb-store.js +0 -0
- /package/out/{packages/replicache → replicache}/src/kv/mem-store.js +0 -0
- /package/out/{packages/replicache → replicache}/src/kv/op-sqlite/store.js +0 -0
- /package/out/{packages/replicache → replicache}/src/kv/op-sqlite/types.js +0 -0
- /package/out/{packages/replicache → replicache}/src/kv/read-impl.js +0 -0
- /package/out/{packages/replicache → replicache}/src/kv/sqlite-store.js +0 -0
- /package/out/{packages/replicache → replicache}/src/kv/throw-if-closed.js +0 -0
- /package/out/{packages/replicache → replicache}/src/kv/write-impl-base.js +0 -0
- /package/out/{packages/replicache → replicache}/src/kv/write-impl.js +0 -0
- /package/out/{packages/replicache → replicache}/src/lazy.js +0 -0
- /package/out/{packages/replicache → replicache}/src/log-options.js +0 -0
- /package/out/{packages/replicache → replicache}/src/make-idb-name.js +0 -0
- /package/out/{packages/replicache → replicache}/src/mutation-recovery.js +0 -0
- /package/out/{packages/replicache → replicache}/src/new-client-channel.js +0 -0
- /package/out/{packages/replicache → replicache}/src/on-persist-channel.js +0 -0
- /package/out/{packages/replicache → replicache}/src/op-sqlite.js +0 -0
- /package/out/{packages/replicache → replicache}/src/patch-operation.js +0 -0
- /package/out/{packages/replicache → replicache}/src/pending-mutations.js +0 -0
- /package/out/{packages/replicache → replicache}/src/persist/client-gc.js +0 -0
- /package/out/{packages/replicache → replicache}/src/persist/client-group-gc.js +0 -0
- /package/out/{packages/replicache → replicache}/src/persist/client-groups.js +0 -0
- /package/out/{packages/replicache → replicache}/src/persist/clients.js +0 -0
- /package/out/{packages/replicache → replicache}/src/persist/collect-idb-databases.js +0 -0
- /package/out/{packages/replicache → replicache}/src/persist/gather-mem-only-visitor.js +0 -0
- /package/out/{packages/replicache → replicache}/src/persist/gather-not-cached-visitor.js +0 -0
- /package/out/{packages/replicache → replicache}/src/persist/heartbeat.js +0 -0
- /package/out/{packages/replicache → replicache}/src/persist/idb-databases-store-db-name.js +0 -0
- /package/out/{packages/replicache → replicache}/src/persist/idb-databases-store.js +0 -0
- /package/out/{packages/replicache → replicache}/src/persist/make-client-id.js +0 -0
- /package/out/{packages/replicache → replicache}/src/persist/persist.js +0 -0
- /package/out/{packages/replicache → replicache}/src/persist/refresh.js +0 -0
- /package/out/{packages/replicache → replicache}/src/process-scheduler.js +0 -0
- /package/out/{packages/replicache → replicache}/src/pusher.js +0 -0
- /package/out/{packages/replicache → replicache}/src/replicache-impl.js +0 -0
- /package/out/{packages/replicache → replicache}/src/report-error.js +0 -0
- /package/out/{packages/replicache → replicache}/src/request-idle.js +0 -0
- /package/out/{packages/replicache → replicache}/src/scan-iterator.js +0 -0
- /package/out/{packages/replicache → replicache}/src/scan-options.js +0 -0
- /package/out/{packages/replicache → replicache}/src/set-interval-with-signal.js +0 -0
- /package/out/{packages/replicache → replicache}/src/sqlite.js +0 -0
- /package/out/{packages/replicache → replicache}/src/subscriptions.js +0 -0
- /package/out/{packages/replicache → replicache}/src/sync/diff.js +0 -0
- /package/out/{packages/replicache → replicache}/src/sync/ids.js +0 -0
- /package/out/{packages/replicache → replicache}/src/sync/patch.js +0 -0
- /package/out/{packages/replicache → replicache}/src/sync/pull-error.js +0 -0
- /package/out/{packages/replicache → replicache}/src/sync/pull.js +0 -0
- /package/out/{packages/replicache → replicache}/src/sync/push.js +0 -0
- /package/out/{packages/replicache → replicache}/src/sync/request-id.js +0 -0
- /package/out/{packages/replicache → replicache}/src/sync/sync-head-name.js +0 -0
- /package/out/{packages/replicache → replicache}/src/to-error.js +0 -0
- /package/out/{packages/replicache → replicache}/src/transaction-closed-error.js +0 -0
- /package/out/{packages/replicache → replicache}/src/transactions.js +0 -0
- /package/out/{packages/replicache → replicache}/src/version.js +0 -0
- /package/out/{packages/replicache → replicache}/src/with-transactions.js +0 -0
- /package/out/{packages/shared → shared}/src/abort-error.js +0 -0
- /package/out/{packages/shared → shared}/src/arrays.js +0 -0
- /package/out/{packages/shared → shared}/src/asserts.js +0 -0
- /package/out/{packages/shared → shared}/src/bigint-json.js +0 -0
- /package/out/{packages/shared → shared}/src/binary-search.js +0 -0
- /package/out/{packages/shared → shared}/src/broadcast-channel.js +0 -0
- /package/out/{packages/shared → shared}/src/browser-env.js +0 -0
- /package/out/{packages/shared → shared}/src/btree-set.js +0 -0
- /package/out/{packages/shared → shared}/src/cache.js +0 -0
- /package/out/{packages/shared → shared}/src/centroid.js +0 -0
- /package/out/{packages/shared → shared}/src/config.js +0 -0
- /package/out/{packages/shared → shared}/src/custom-key-map.js +0 -0
- /package/out/{packages/shared → shared}/src/custom-key-set.js +0 -0
- /package/out/{packages/shared → shared}/src/deep-clone.js +0 -0
- /package/out/{packages/shared → shared}/src/deep-merge.js +0 -0
- /package/out/{packages/shared → shared}/src/document-visible.js +0 -0
- /package/out/{packages/shared → shared}/src/dotenv.js +0 -0
- /package/out/{packages/shared → shared}/src/error.js +0 -0
- /package/out/{packages/shared → shared}/src/has-own.js +0 -0
- /package/out/{packages/shared → shared}/src/hash.js +0 -0
- /package/out/{packages/shared → shared}/src/iterables.js +0 -0
- /package/out/{packages/shared → shared}/src/json-schema.js +0 -0
- /package/out/{packages/shared → shared}/src/json.js +0 -0
- /package/out/{packages/shared → shared}/src/logging-test-utils.js +0 -0
- /package/out/{packages/shared → shared}/src/logging.js +0 -0
- /package/out/{packages/shared → shared}/src/map.js +0 -0
- /package/out/{packages/shared → shared}/src/must.js +0 -0
- /package/out/{packages/shared → shared}/src/navigator.js +0 -0
- /package/out/{packages/shared → shared}/src/object-traversal.js +0 -0
- /package/out/{packages/shared → shared}/src/objects.js +0 -0
- /package/out/{packages/shared → shared}/src/options.js +0 -0
- /package/out/{packages/shared → shared}/src/parse-big-int.js +0 -0
- /package/out/{packages/shared → shared}/src/promise-race.js +0 -0
- /package/out/{packages/shared → shared}/src/queue.js +0 -0
- /package/out/{packages/shared → shared}/src/rand.js +0 -0
- /package/out/{packages/shared → shared}/src/random-uint64.js +0 -0
- /package/out/{packages/shared → shared}/src/random-values.js +0 -0
- /package/out/{packages/shared → shared}/src/record-proxy.js +0 -0
- /package/out/{packages/shared → shared}/src/resolved-promises.js +0 -0
- /package/out/{packages/shared → shared}/src/ring-buffer.js +0 -0
- /package/out/{packages/shared → shared}/src/sentinels.js +0 -0
- /package/out/{packages/shared → shared}/src/set-utils.js +0 -0
- /package/out/{packages/shared → shared}/src/size-of-value.js +0 -0
- /package/out/{packages/shared → shared}/src/sleep.js +0 -0
- /package/out/{packages/shared → shared}/src/sorted-entries.js +0 -0
- /package/out/{packages/shared → shared}/src/string-compare.js +0 -0
- /package/out/{packages/shared → shared}/src/subscribable.js +0 -0
- /package/out/{packages/shared → shared}/src/tdigest-schema.js +0 -0
- /package/out/{packages/shared → shared}/src/tdigest.js +0 -0
- /package/out/{packages/z2s → z2s}/src/compiler.js +0 -0
- /package/out/{packages/z2s → z2s}/src/sql.js +0 -0
- /package/out/{packages/zero → zero}/src/server/runner/main.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/auth/auth.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/auth/jwt.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/auth/load-permissions.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/auth/read-authorizer.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/auth/write-authorizer.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/config/network.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/config/normalize.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/config/server-context.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/config/zero-config.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/custom/fetch.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/custom-queries/transform-query.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/db/create.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/db/delete-lite-db.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/db/lite-tables.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/db/migration-lite.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/db/migration.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/db/mode-enum.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/db/pg-copy-binary.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/db/pg-copy.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/db/pg-to-lite.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/db/pg-type-parser.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/db/run-transaction.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/db/specs.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/db/statements.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/db/transaction-pool.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/db/warmup.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/observability/events.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/observability/metrics.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/scripts/decommission.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/scripts/deploy-permissions.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/scripts/permissions.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/server/anonymous-otel-start.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/server/inspector-delegate.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/server/logging.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/server/otel-diag-logger.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/server/otel-log-sink.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/server/priority-op.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/server/runner/main.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/server/runner/run-worker.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/server/runner/runtime.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/server/runner/zero-dispatcher.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/server/worker-dispatcher.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/server/worker-urls.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/common/backfill-manager.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/common/change-stream-multiplexer.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/common/replica-schema.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/custom/change-source.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/backfill-metadata.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/backfill-stream.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/change-source.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/decommission.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/initial-sync.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/logical-replication/binary-reader.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/logical-replication/pgoutput-parser.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/logical-replication/stream.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/lsn.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/replication-slots.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/schema/ddl.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/schema/init.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/schema/published.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/schema/shard.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/pg/schema/validation.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/protocol/current/control.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/protocol/current/data.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/protocol/current/downstream.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/protocol/current/json.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/protocol/current/path.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/protocol/current/status.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/protocol/current/upstream.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-source/protocol/mod.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/backup-monitor.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/broadcast.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/change-streamer-http.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/change-streamer-service.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/change-streamer.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/forwarder.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/replica-monitor.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/schema/init.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/schema/tables.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/snapshot.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/storer.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/change-streamer/subscriber.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/heapz.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/http-service.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/life-cycle.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/limiter/sliding-window-limiter.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/litestream/commands.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/mutagen/error.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/mutagen/mutagen.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/mutagen/pusher.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/change-processor.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/incremental-sync.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/notifier.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/replication-status.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/replicator.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/reporter/recorder.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/reporter/report-schema.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/schema/change-log.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/schema/column-metadata.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/schema/constants.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/schema/replication-state.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/schema/table-metadata.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/write-worker-client.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/replicator/write-worker.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/run-ast.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/runner.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/running-state.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/shadow-sync/shadow-sync-service.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/statz.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/active-users-gauge.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/client-handler.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/client-schema.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/connection-context-manager.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/cvr-purger.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/cvr-store.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/cvr.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/drain-coordinator.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/pipeline-driver.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/row-record-cache.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/row-set-signature.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/schema/cvr.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/schema/init.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/schema/types.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/snapshotter.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/tracer.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/ttl-clock.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/services/view-syncer/view-syncer.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/configuration-error.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/error-with-level.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/http.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/lexi-version.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/lite.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/names.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/pg-data-type.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/pg-types.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/pg-versions.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/pg.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/processes.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/profiler.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/row-key.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/shards.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/sql.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/state-version.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/streams.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/strings.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/subscription.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/timeout.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/url-params.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/websocket-handoff.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/types/ws.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/workers/connect-params.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/workers/connection.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/workers/mutator.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/workers/replicator.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/workers/syncer-ws-message-handler.js +0 -0
- /package/out/{packages/zero-cache → zero-cache}/src/workers/syncer.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/active-clients-manager.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/bindings.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/client-error-kind-enum.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/connection-manager.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/connection.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/context.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/crud.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/custom.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/delete-clients-manager.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/enable-analytics.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/error.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/http-string.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/inspector/client-group.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/inspector/client.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/inspector/html-dialog-prompt.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/inspector/inspector.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/inspector/lazy-inspector.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/inspector/query.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/ivm-branch.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/keys.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/log-options.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/make-mutate-property.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/make-replicache-mutators.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/metric-name-enum.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/metrics.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/mutation-tracker.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/mutator-proxy.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/options.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/query-manager.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/reload-error-handler.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/server-option.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/zero-poke-handler.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/zero-rep.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/client/zero.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/mod.js +0 -0
- /package/out/{packages/zero-client → zero-client}/src/util/nanoid.js +0 -0
- /package/out/{packages/zero-pg → zero-pg}/src/mod.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/analyze-query-result.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/application-error.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/ast.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/change-desired-queries.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/client-schema.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/close-connection.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/connect.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/custom-queries.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/data.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/delete-clients.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/down.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/error-kind-enum.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/error-origin-enum.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/error-reason-enum.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/error.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/inspect-down.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/inspect-up.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/mutate-server.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/mutation-id.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/mutation-type-enum.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/mutation.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/mutations-patch.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/ping.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/poke.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/pong.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/primary-key.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/protocol-version.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/pull.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/push.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/queries-patch.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/query-hash.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/query-server.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/row-patch.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/up.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/update-auth.js +0 -0
- /package/out/{packages/zero-protocol → zero-protocol}/src/version.js +0 -0
- /package/out/{packages/zero-react → zero-react}/src/bindings.js +0 -0
- /package/out/{packages/zero-react → zero-react}/src/mod.js +0 -0
- /package/out/{packages/zero-react → zero-react}/src/zero.js +0 -0
- /package/out/{packages/zero-schema → zero-schema}/src/builder/relationship-builder.js +0 -0
- /package/out/{packages/zero-schema → zero-schema}/src/builder/schema-builder.js +0 -0
- /package/out/{packages/zero-schema → zero-schema}/src/builder/table-builder.js +0 -0
- /package/out/{packages/zero-schema → zero-schema}/src/compiled-permissions.js +0 -0
- /package/out/{packages/zero-schema → zero-schema}/src/name-mapper.js +0 -0
- /package/out/{packages/zero-schema → zero-schema}/src/permissions.js +0 -0
- /package/out/{packages/zero-schema → zero-schema}/src/schema-config.js +0 -0
- /package/out/{packages/zero-server → zero-server}/src/adapters/drizzle.js +0 -0
- /package/out/{packages/zero-server → zero-server}/src/adapters/kysely.js +0 -0
- /package/out/{packages/zero-server → zero-server}/src/adapters/postgresjs.js +0 -0
- /package/out/{packages/zero-server → zero-server}/src/adapters/prisma.js +0 -0
- /package/out/{packages/zero-server → zero-server}/src/custom.js +0 -0
- /package/out/{packages/zero-server → zero-server}/src/logging.js +0 -0
- /package/out/{packages/zero-server → zero-server}/src/mod.js +0 -0
- /package/out/{packages/zero-server → zero-server}/src/pg-query-executor.js +0 -0
- /package/out/{packages/zero-server → zero-server}/src/process-mutations.js +0 -0
- /package/out/{packages/zero-server → zero-server}/src/push-processor.js +0 -0
- /package/out/{packages/zero-server → zero-server}/src/queries/process-queries.js +0 -0
- /package/out/{packages/zero-server → zero-server}/src/schema.js +0 -0
- /package/out/{packages/zero-server → zero-server}/src/zql-database.js +0 -0
- /package/out/{packages/zero-solid → zero-solid}/src/bindings.js +0 -0
- /package/out/{packages/zero-solid → zero-solid}/src/mod.js +0 -0
- /package/out/{packages/zero-solid → zero-solid}/src/zero.js +0 -0
- /package/out/{packages/zero-types → zero-types}/src/format.js +0 -0
- /package/out/{packages/zero-types → zero-types}/src/name-mapper.js +0 -0
- /package/out/{packages/zql → zql}/src/builder/builder.js +0 -0
- /package/out/{packages/zql → zql}/src/builder/debug-delegate.js +0 -0
- /package/out/{packages/zql → zql}/src/builder/filter.js +0 -0
- /package/out/{packages/zql → zql}/src/builder/like.js +0 -0
- /package/out/{packages/zql → zql}/src/error.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/array-view.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/cap.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/change.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/constraint.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/data.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/exists.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/fan-in.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/fan-out.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/filter-operators.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/filter-push.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/filter.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/flipped-join.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/join-utils.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/join.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/maybe-split-and-push-edit-change.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/memory-source.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/memory-storage.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/operator.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/push-accumulated.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/skip-yields.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/skip.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/source.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/stream.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/take.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/union-fan-in.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/union-fan-out.js +0 -0
- /package/out/{packages/zql → zql}/src/ivm/view-apply-change.js +0 -0
- /package/out/{packages/zql → zql}/src/mutate/crud.js +0 -0
- /package/out/{packages/zql → zql}/src/mutate/custom.js +0 -0
- /package/out/{packages/zql → zql}/src/mutate/mutator-registry.js +0 -0
- /package/out/{packages/zql → zql}/src/mutate/mutator.js +0 -0
- /package/out/{packages/zql → zql}/src/planner/planner-builder.js +0 -0
- /package/out/{packages/zql → zql}/src/planner/planner-connection.js +0 -0
- /package/out/{packages/zql → zql}/src/planner/planner-constraint.js +0 -0
- /package/out/{packages/zql → zql}/src/planner/planner-debug.js +0 -0
- /package/out/{packages/zql → zql}/src/planner/planner-fan-in.js +0 -0
- /package/out/{packages/zql → zql}/src/planner/planner-fan-out.js +0 -0
- /package/out/{packages/zql → zql}/src/planner/planner-graph.js +0 -0
- /package/out/{packages/zql → zql}/src/planner/planner-join.js +0 -0
- /package/out/{packages/zql → zql}/src/planner/planner-node.js +0 -0
- /package/out/{packages/zql → zql}/src/planner/planner-source.js +0 -0
- /package/out/{packages/zql → zql}/src/planner/planner-terminus.js +0 -0
- /package/out/{packages/zql → zql}/src/query/complete-ordering.js +0 -0
- /package/out/{packages/zql → zql}/src/query/create-builder.js +0 -0
- /package/out/{packages/zql → zql}/src/query/error.js +0 -0
- /package/out/{packages/zql → zql}/src/query/escape-like.js +0 -0
- /package/out/{packages/zql → zql}/src/query/expression.js +0 -0
- /package/out/{packages/zql → zql}/src/query/measure-push-operator.js +0 -0
- /package/out/{packages/zql → zql}/src/query/metrics-delegate.js +0 -0
- /package/out/{packages/zql → zql}/src/query/named.js +0 -0
- /package/out/{packages/zql → zql}/src/query/query-delegate-base.js +0 -0
- /package/out/{packages/zql → zql}/src/query/query-impl.js +0 -0
- /package/out/{packages/zql → zql}/src/query/query-internals.js +0 -0
- /package/out/{packages/zql → zql}/src/query/query-registry.js +0 -0
- /package/out/{packages/zql → zql}/src/query/query.js +0 -0
- /package/out/{packages/zql → zql}/src/query/runnable-query-impl.js +0 -0
- /package/out/{packages/zql → zql}/src/query/static-query.js +0 -0
- /package/out/{packages/zql → zql}/src/query/ttl.js +0 -0
- /package/out/{packages/zql → zql}/src/query/validate-input.js +0 -0
- /package/out/{packages/zqlite → zqlite}/src/database-storage.js +0 -0
- /package/out/{packages/zqlite → zqlite}/src/db.js +0 -0
- /package/out/{packages/zqlite → zqlite}/src/explain-queries.js +0 -0
- /package/out/{packages/zqlite → zqlite}/src/internal/sql-inline.js +0 -0
- /package/out/{packages/zqlite → zqlite}/src/internal/sql.js +0 -0
- /package/out/{packages/zqlite → zqlite}/src/internal/statement-cache.js +0 -0
- /package/out/{packages/zqlite → zqlite}/src/mod.js +0 -0
- /package/out/{packages/zqlite → zqlite}/src/query-builder.js +0 -0
- /package/out/{packages/zqlite → zqlite}/src/query-delegate.js +0 -0
- /package/out/{packages/zqlite → zqlite}/src/resolve-scalar-subqueries.js +0 -0
- /package/out/{packages/zqlite → zqlite}/src/sqlite-cost-model.js +0 -0
- /package/out/{packages/zqlite → zqlite}/src/sqlite-stat-fanout.js +0 -0
- /package/out/{packages/zqlite → zqlite}/src/table-source.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze-cli.js","names":[],"sources":["../../../../analyze-query/src/analyze-cli.ts"],"sourcesContent":["import '../../shared/src/dotenv.ts';\n\nimport {Console} from 'node:console';\nimport {styleText} from 'node:util';\nimport type {LogSink} from '@rocicorp/logger';\nimport {WebSocket as NodeWebSocket} from 'ws';\nimport {logLevel, logOptions} from '../../otel/src/log-options.ts';\nimport {colorConsole} from '../../shared/src/logging.ts';\nimport {parseOptions} from '../../shared/src/options.ts';\nimport * as v from '../../shared/src/valita.ts';\nimport {ZERO_ENV_VAR_PREFIX} from '../../zero-cache/src/config/zero-config.ts';\nimport {Zero} from '../../zero-client/src/client/zero.ts';\nimport type {AnalyzeQueryResult} from '../../zero-protocol/src/analyze-query-result.ts';\nimport type {AST} from '../../zero-protocol/src/ast.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport {createBuilder} from '../../zql/src/query/create-builder.ts';\nimport type {AnyQuery} from '../../zql/src/query/query.ts';\nimport type {SchemaQuery} from '../../zql/src/query/schema-query.ts';\n\nexport type AnalyzeCLIOptions = {\n schema: Schema;\n /** Defaults to `process.argv.slice(2)`. */\n argv?: readonly string[] | undefined;\n};\n\nconst options = {\n zeroCacheURL: {\n type: v.string().optional(),\n desc: [\n 'URL of the remote zero-cache to analyze against.',\n 'Accepts http(s):// or ws(s):// (ws(s) is the transport actually used).',\n ],\n },\n adminPassword: {\n type: v.string().optional(),\n desc: [\n 'Admin password for zero-cache.',\n 'Required when the server is configured with one; ignored in dev mode.',\n ],\n },\n authToken: {\n type: v.string().optional(),\n desc: [\n 'Raw JWT forwarded to zero-cache.',\n 'Used server-side to fill permission variables for the query.',\n ],\n },\n cookie: {\n type: v.string().optional(),\n desc: [\n 'Cookie header value sent on the WebSocket upgrade request,',\n 'e.g. `session=abc; foo=bar`. Use this when zero-cache is behind',\n 'a proxy that resolves auth via cookies. Merged with --headers-json',\n '(--cookie wins on conflict).',\n ],\n },\n headersJson: {\n type: v.string().optional(),\n desc: [\n 'JSON object of arbitrary headers to send on the WebSocket upgrade',\n 'request, e.g. `{\"x-api-key\":\"...\"}`. Escape hatch for exotic auth',\n 'schemes; prefer --auth-token or --cookie when possible.',\n ],\n },\n userId: {\n type: v.string().optional(),\n desc: [\n 'Optional userID to report to zero-cache.',\n 'Has no functional effect on analysis; defaults to \"analyze-cli\".',\n ],\n },\n ast: {\n type: v.string().optional(),\n desc: [\n 'JSON-encoded AST. Exactly one of --ast / --query / --query-name is required.',\n 'The AST is sent to the server verbatim — provide it in server (post-mapping) form.',\n ],\n },\n query: {\n type: v.string().optional(),\n desc: [\n 'ZQL query in chain form, e.g. `issue.related(\"comments\").limit(10)`.',\n 'Evaluated against the schema you pass to runAnalyzeCLI.',\n ],\n },\n queryName: {\n type: v.string().optional(),\n desc: [\n 'Name of a server-registered custom (named) query.',\n 'The server resolves the name + args via its registered query handler.',\n ],\n },\n queryArgs: {\n type: v.string().optional(),\n desc: [\n 'JSON-encoded array of arguments for --query-name. Defaults to `[]`.',\n ],\n },\n outputVendedRows: {\n type: v.boolean().default(false),\n desc: [\n 'Include the rows read from the replica to execute the query.',\n 'Each row appears once per read.',\n ],\n },\n outputSyncedRows: {\n type: v.boolean().default(false),\n desc: ['Include the rows that would be synced to the client.'],\n },\n log: {\n ...logOptions,\n level: logLevel.default('error'),\n },\n};\n\ntype QueryPlan =\n | {kind: 'ast'; ast: AST}\n | {kind: 'zql'; text: string}\n | {kind: 'named'; name: string; args: ReadonlyArray<unknown>};\n\n// Route all Zero client log output to stderr so stdout contains only the\n// analyze result. Shell redirection (`2>/dev/null`) can then cleanly silence\n// logs without affecting output.\nconst stderrConsole = new Console({\n stdout: process.stderr,\n stderr: process.stderr,\n});\nconst stderrLogSink: LogSink = {\n log(level, context, ...args) {\n const ctx = context\n ? Object.entries(context).map(([k, v]) =>\n v === undefined ? k : `${k}=${v}`,\n )\n : [];\n stderrConsole[level](...ctx, ...args);\n },\n};\n\n/**\n * Entry point for a user's `cli.ts`. Parses argv, connects to a remote\n * zero-cache by standing up an in-process Zero client (in-memory storage,\n * no subscriptions), calls the inspector's `analyze-query` RPC, and\n * renders the result. Intended to be called as:\n *\n * ```ts\n * import {schema} from './schema.ts';\n * import {runAnalyzeCLI} from '@rocicorp/zero/analyze';\n * await runAnalyzeCLI({schema});\n * ```\n *\n * Exits the process with code 1 on error.\n */\nexport async function runAnalyzeCLI(opts: AnalyzeCLIOptions): Promise<void> {\n const argv = (opts.argv ?? process.argv.slice(2)).map(s =>\n s.replaceAll('\\n', ' '),\n );\n\n const config = parseOptions(options, {\n argv,\n envNamePrefix: ZERO_ENV_VAR_PREFIX,\n description: [\n {\n header: 'analyze-query (remote)',\n content: `Analyze a ZQL query against a remote zero-cache.\n\n Connects to zero-cache's inspector protocol and reports the server-observed\n row scans, SQLite query plans, and timings.`,\n },\n {\n header: 'Examples',\n content: ` tsx cli.ts --zero-cache-url=https://zero.example.com \\\\\n --admin-password=\"$ZERO_ADMIN_PASSWORD\" \\\\\n --query='issue.related(\"comments\").limit(10)'\n\n tsx cli.ts --zero-cache-url=http://localhost:4848 \\\\\n --ast='\\\\{\"table\": \"issue\", \"limit\": 5\\\\}'\n\n tsx cli.ts --zero-cache-url=http://localhost:4848 \\\\\n --query-name=issueList --query-args='[]'`,\n },\n ],\n });\n\n if (!config.zeroCacheURL) {\n colorConsole.error('--zero-cache-url is required. See --help for usage.');\n process.exit(1);\n }\n\n const plan = buildQueryPlan(config);\n\n const handshakeHeaders = resolveHandshakeHeaders(config);\n if (Object.keys(handshakeHeaders).length > 0) {\n installWebSocketHeaderShim(handshakeHeaders);\n }\n\n // zero-client and replicache reference a build-time `TESTING` global that\n // bundlers replace with a boolean literal; under tsx there's no replacement,\n // so provide a runtime default.\n (globalThis as {TESTING?: boolean}).TESTING ??= false;\n\n const z = new Zero({\n schema: opts.schema,\n server: config.zeroCacheURL,\n auth: config.authToken,\n userID: config.userId ?? 'analyze-cli',\n kvStore: 'mem',\n logLevel: config.log.level,\n logSink: stderrLogSink,\n });\n\n let result: AnalyzeQueryResult;\n try {\n const authOk = await z.inspector.authenticate(config.adminPassword ?? '');\n if (!authOk) {\n throw new Error(\n 'admin password rejected (or --admin-password is required)',\n );\n }\n\n const rpcOptions = {\n vendedRows: config.outputVendedRows,\n syncedRows: config.outputSyncedRows,\n };\n\n if (plan.kind === 'ast') {\n result = await z.inspector.analyzeServerAST(plan.ast, rpcOptions);\n } else if (plan.kind === 'named') {\n result = await z.inspector.analyzeNamedQuery(\n plan.name,\n plan.args as ReadonlyArray<never>,\n rpcOptions,\n );\n } else {\n const built = buildZqlQuery(plan.text, createBuilder(opts.schema));\n result = await z.inspector.analyzeQuery(built, rpcOptions);\n }\n } catch (e) {\n colorConsole.error(e instanceof Error ? e.message : String(e));\n await z.close().catch(() => {});\n process.exit(1);\n }\n\n renderResult(result, {\n outputSyncedRows: config.outputSyncedRows,\n outputVendedRows: config.outputVendedRows,\n });\n\n await z.close();\n}\n\nfunction buildQueryPlan(config: {\n ast?: string | undefined;\n query?: string | undefined;\n queryName?: string | undefined;\n queryArgs?: string | undefined;\n}): QueryPlan {\n const selectors = [\n config.ast !== undefined && 'ast',\n config.query !== undefined && 'query',\n config.queryName !== undefined && 'queryName',\n ].filter(Boolean) as string[];\n\n if (selectors.length === 0) {\n colorConsole.error(\n 'Exactly one of --ast / --query / --query-name is required.',\n );\n process.exit(1);\n }\n if (selectors.length > 1) {\n colorConsole.error(\n `Only one of --ast / --query / --query-name may be provided; got: ${selectors.join(', ')}`,\n );\n process.exit(1);\n }\n\n if (config.ast !== undefined) {\n return {kind: 'ast', ast: JSON.parse(config.ast) as AST};\n }\n if (config.query !== undefined) {\n return {kind: 'zql', text: config.query};\n }\n const args = config.queryArgs\n ? (JSON.parse(config.queryArgs) as ReadonlyArray<unknown>)\n : [];\n return {kind: 'named', name: config.queryName as string, args};\n}\n\nfunction buildZqlQuery(\n queryString: string,\n builder: SchemaQuery<Schema>,\n): AnyQuery {\n const f = new Function('builder', `return builder.${queryString};`);\n return f(builder) as AnyQuery;\n}\n\nfunction resolveHandshakeHeaders(config: {\n cookie?: string | undefined;\n headersJson?: string | undefined;\n}): Record<string, string> {\n const headers: Record<string, string> = {};\n if (config.headersJson !== undefined) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(config.headersJson);\n } catch (e) {\n colorConsole.error(\n `--headers-json is not valid JSON: ${e instanceof Error ? e.message : String(e)}`,\n );\n process.exit(1);\n }\n if (\n parsed === null ||\n typeof parsed !== 'object' ||\n Array.isArray(parsed)\n ) {\n colorConsole.error('--headers-json must be a JSON object.');\n process.exit(1);\n }\n for (const [k, val] of Object.entries(parsed)) {\n if (typeof val !== 'string') {\n colorConsole.error(\n `--headers-json values must be strings; got ${typeof val} for \"${k}\".`,\n );\n process.exit(1);\n }\n headers[k] = val;\n }\n }\n if (config.cookie !== undefined) {\n headers.cookie = config.cookie;\n }\n return headers;\n}\n\nfunction installWebSocketHeaderShim(headers: Record<string, string>): void {\n class HeaderInjectingWebSocket extends NodeWebSocket {\n constructor(url: string | URL, protocols?: string | string[]) {\n super(url, protocols, {headers});\n }\n }\n (globalThis as {WebSocket?: unknown}).WebSocket = HeaderInjectingWebSocket;\n}\n\nfunction renderResult(\n result: AnalyzeQueryResult,\n opts: {outputSyncedRows: boolean; outputVendedRows: boolean},\n) {\n if (opts.outputSyncedRows) {\n colorConsole.log(styleText(['blue', 'bold'], '=== Synced Rows: ===\\n'));\n for (const [table, rows] of Object.entries(result.syncedRows ?? {})) {\n colorConsole.log(styleText('bold', table + ':'), rows);\n }\n }\n\n colorConsole.log(styleText(['blue', 'bold'], '=== Query Stats: ===\\n'));\n colorConsole.log(\n styleText('bold', 'total synced rows:'),\n result.syncedRowCount,\n );\n\n const readRowCountsByQuery = result.readRowCountsByQuery ?? {};\n let totalRowsRead = 0;\n for (const table of Object.keys(readRowCountsByQuery).sort()) {\n const counts = readRowCountsByQuery[table];\n for (const n of Object.values(counts)) {\n totalRowsRead += n;\n }\n colorConsole.log(styleText('bold', `${table} vended:`), counts);\n }\n colorConsole.log(\n styleText('bold', 'Rows Read (into JS):'),\n colorRowsConsidered(totalRowsRead),\n );\n const duration = result.elapsed ?? result.end - result.start;\n colorConsole.log(styleText('bold', 'time:'), colorTime(duration), 'ms');\n\n if (opts.outputVendedRows) {\n colorConsole.log(\n styleText(['blue', 'bold'], '=== JS Row Scan Values: ===\\n'),\n );\n for (const [table, rows] of Object.entries(result.readRows ?? {})) {\n colorConsole.log(styleText('bold', `${table}:`), rows);\n }\n }\n\n colorConsole.log(\n styleText(['blue', 'bold'], '\\n=== Rows Scanned (by SQLite): ===\\n'),\n );\n const dbScansByQuery = result.dbScansByQuery ?? {};\n let totalNVisit = 0;\n for (const [table, queries] of Object.entries(dbScansByQuery)) {\n colorConsole.log(styleText('bold', `${table}:`), queries);\n for (const count of Object.values(queries)) {\n totalNVisit += count;\n }\n }\n colorConsole.log(\n styleText('bold', 'total rows scanned:'),\n colorRowsConsidered(totalNVisit),\n );\n\n colorConsole.log(styleText(['blue', 'bold'], '\\n\\n=== Query Plans: ===\\n'));\n const plans = result.sqlitePlans ?? {};\n for (const [query, plan] of Object.entries(plans)) {\n colorConsole.log(styleText('bold', 'query'), query);\n colorConsole.log(plan.map((row, i) => colorPlanRow(row, i)).join('\\n'));\n colorConsole.log('\\n');\n }\n\n if (result.warnings.length > 0) {\n colorConsole.log(styleText(['yellow', 'bold'], '=== Warnings: ===\\n'));\n for (const w of result.warnings) {\n colorConsole.log(styleText('yellow', w));\n }\n }\n}\n\nfunction colorTime(duration: number) {\n if (duration < 100) {\n return styleText('green', duration.toFixed(2) + 'ms');\n } else if (duration < 1000) {\n return styleText('yellow', duration.toFixed(2) + 'ms');\n }\n return styleText('red', duration.toFixed(2) + 'ms');\n}\n\nfunction colorRowsConsidered(n: number) {\n if (n < 1000) {\n return styleText('green', n.toString());\n } else if (n < 10000) {\n return styleText('yellow', n.toString());\n }\n return styleText('red', n.toString());\n}\n\nfunction colorPlanRow(row: string, i: number) {\n if (row.includes('SCAN')) {\n if (i === 0) {\n return styleText('yellow', row);\n }\n return styleText('red', row);\n }\n return styleText('green', row);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin-analyze.js","names":[],"sources":["../../../../analyze-query/src/bin-analyze.ts"],"sourcesContent":["import '../../shared/src/dotenv.ts';\n\nimport fs from 'node:fs';\nimport {styleText} from 'node:util';\nimport {astToZQL} from '../../ast-to-zql/src/ast-to-zql.ts';\nimport {formatOutput} from '../../ast-to-zql/src/format.ts';\nimport {logLevel, logOptions} from '../../otel/src/log-options.ts';\nimport {colorConsole, createLogContext} from '../../shared/src/logging.ts';\nimport {must} from '../../shared/src/must.ts';\nimport {parseOptions} from '../../shared/src/options.ts';\nimport * as v from '../../shared/src/valita.ts';\nimport {\n appOptions,\n shardOptions,\n ZERO_ENV_VAR_PREFIX,\n zeroOptions,\n} from '../../zero-cache/src/config/zero-config.ts';\nimport {\n computeZqlSpecs,\n mustGetTableSpec,\n} from '../../zero-cache/src/db/lite-tables.ts';\nimport {\n deployPermissionsOptions,\n loadSchemaAndPermissions,\n} from '../../zero-cache/src/scripts/permissions.ts';\nimport {runAst} from '../../zero-cache/src/services/run-ast.ts';\nimport {pgClient} from '../../zero-cache/src/types/pg.ts';\nimport {getShardID, upstreamSchema} from '../../zero-cache/src/types/shards.ts';\nimport type {AnalyzeQueryResult} from '../../zero-protocol/src/analyze-query-result.ts';\nimport {type AST} from '../../zero-protocol/src/ast.ts';\nimport {clientSchemaFrom} from '../../zero-schema/src/builder/schema-builder.ts';\nimport {clientToServer} from '../../zero-schema/src/name-mapper.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport {\n Debug,\n runtimeDebugFlags,\n} from '../../zql/src/builder/debug-delegate.ts';\nimport type {Source} from '../../zql/src/ivm/source.ts';\nimport {QueryDelegateBase} from '../../zql/src/query/query-delegate-base.ts';\nimport {newQuery} from '../../zql/src/query/query-impl.ts';\nimport {asQueryInternals} from '../../zql/src/query/query-internals.ts';\nimport {type PullRow, type Query} from '../../zql/src/query/query.ts';\nimport {Database} from '../../zqlite/src/db.ts';\nimport {explainQueries} from '../../zqlite/src/explain-queries.ts';\nimport {TableSource} from '../../zqlite/src/table-source.ts';\n\nconst options = {\n schema: deployPermissionsOptions.schema,\n replicaFile: {\n ...zeroOptions.replica.file,\n desc: ['File path to the SQLite replica to test queries against.'],\n },\n ast: {\n type: v.string().optional(),\n desc: [\n 'AST for the query to be analyzed. Only one of ast/query/hash should be provided.',\n ],\n },\n query: {\n type: v.string().optional(),\n desc: [\n 'Query to be analyzed in the form of: table.where(...).related(...).etc. ',\n 'Only one of ast/query/hash should be provided.',\n ],\n },\n hash: {\n type: v.string().optional(),\n desc: [\n 'Hash of the query to be analyzed. This is used to look up the query in the database. ',\n 'Only one of ast/query/hash should be provided.',\n 'You should run this script from the directory containing your .env file to reduce the amount of',\n 'configuration required. The .env file should contain the connection URL to the CVR database.',\n ],\n },\n applyPermissions: {\n type: v.boolean().default(false),\n desc: [\n 'Whether to apply permissions (from your schema file) to the provided query.',\n ],\n },\n authData: {\n type: v.string().optional(),\n desc: [\n 'JSON encoded payload of the auth data.',\n 'This will be used to fill permission variables if the \"applyPermissions\" option is set',\n ],\n },\n outputVendedRows: {\n type: v.boolean().default(false),\n desc: [\n 'Whether to output the rows which were read from the replica in order to execute the analyzed query. ',\n 'If the same row is read more than once it will be logged once for each time it was read.',\n ],\n },\n outputSyncedRows: {\n type: v.boolean().default(false),\n desc: [\n 'Whether to output the rows which would be synced to the client for the analyzed query.',\n ],\n },\n cvr: {\n db: {\n type: v.string().optional(),\n desc: [\n 'Connection URL to the CVR database. If using --hash, either this or --upstream-db',\n 'must be specified.',\n ],\n },\n },\n upstream: {\n db: {\n desc: [\n `Connection URL to the \"upstream\" authoritative postgres database. If using --hash, `,\n 'either this or --cvr-db must be specified.',\n ],\n type: v.string().optional(),\n },\n type: zeroOptions.upstream.type,\n },\n app: appOptions,\n shard: shardOptions,\n log: {\n ...logOptions,\n level: logLevel.default('error'),\n },\n};\n\nconst cfg = parseOptions(options, {\n argv: process.argv.slice(2).map(s => s.replaceAll('\\n', ' ')),\n envNamePrefix: ZERO_ENV_VAR_PREFIX,\n description: [\n {\n header: 'analyze-query',\n content: `Analyze a ZQL query and show information about how it runs against a SQLite replica.\n\n analyze-query uses the same environment variables and flags as zero-cache-dev. If run from your development environment, it will pick up your ZERO_REPLICA_FILE, ZERO_SCHEMA_PATH, and other env vars automatically.\n\n If run in another environment (e.g., production) you will have to specify these flags. In particular, you must have a copy of the appropriate Zero schema file to give to the --schema-path flag.`,\n },\n {\n header: 'Examples',\n content: `# In development\n npx analyze-query --query='issue.related(\"comments\").limit(10)'\n npx analyze-query --ast='\\\\{\"table\": \"artist\",\"limit\": 10\\\\}'\n npx analyze-query --hash=1234567890\n\n # In production\n # First copy schema.ts to your production environment, then run:\n npx analyze-query \\\\\n --schema-path='./schema.ts' \\\\\n --replica-file='/path/to/replica.db' \\\\\n --query='issue.related(\"comments\").limit(10)'\n\n npx analyze-query \\\\\n --schema-path='./schema.ts' \\\\\n --replica-file='/path/to/replica.db' \\\\\n --ast='\\\\{\"table\": \"artist\",\"limit\": 10\\\\}'\n\n # cvr-db is required when using the hash option.\n # It is typically the same as your upstream db.\n npx analyze-query \\\\\n --schema-path='./schema.ts' \\\\\n --replica-file='/path/to/replica.db' \\\\\n --cvr-db='postgres://user:pass@host:port/db' \\\\\n --hash=1234567890\n `,\n },\n ],\n});\nconst config = {\n ...cfg,\n cvr: {\n ...cfg.cvr,\n db: cfg.cvr.db ?? cfg.upstream.db,\n },\n};\n\nruntimeDebugFlags.trackRowCountsVended = true;\nruntimeDebugFlags.trackRowsVended = config.outputVendedRows;\n\nconst lc = createLogContext({\n log: config.log,\n});\n\ncolorConsole.warn(\n 'DEPRECATED: `analyze-query` is deprecated. Please migrate to a project-specific analyze command built with `runAnalyzeCLI` from `@rocicorp/zero/analyze`.',\n);\n\nif (!fs.existsSync(config.replicaFile)) {\n colorConsole.error(`Replica file ${config.replicaFile} does not exist`);\n process.exit(1);\n}\nconst db = new Database(lc, config.replicaFile);\n\nconst {schema, permissions} = await loadSchemaAndPermissions(\n config.schema.path,\n);\nconst clientSchema = clientSchemaFrom(schema).clientSchema;\n\nconst sources = new Map<string, TableSource>();\nconst clientToServerMapper = clientToServer(schema.tables);\nconst debug = new Debug();\nconst tableSpecs = computeZqlSpecs(lc, db, {includeBackfillingColumns: false});\n\nclass AnalyzeQueryDelegate extends QueryDelegateBase {\n readonly debug = debug;\n readonly defaultQueryComplete = true;\n\n getSource(serverTableName: string): Source | undefined {\n let source = sources.get(serverTableName);\n if (source) {\n return source;\n }\n const tableSpec = mustGetTableSpec(tableSpecs, serverTableName);\n const {primaryKey} = tableSpec.tableSpec;\n\n source = new TableSource(\n lc,\n config.log,\n db,\n serverTableName,\n tableSpec.zqlSpec,\n primaryKey,\n );\n\n sources.set(serverTableName, source);\n return source;\n }\n}\n\nconst host = new AnalyzeQueryDelegate();\n\nlet result: AnalyzeQueryResult;\n\nif (config.ast) {\n result = await runAst(\n lc,\n clientSchema,\n JSON.parse(config.ast),\n true,\n {\n applyPermissions: config.applyPermissions,\n auth: config.authData\n ? {type: 'jwt' as const, raw: '', decoded: JSON.parse(config.authData)}\n : undefined,\n clientToServerMapper,\n permissions,\n syncedRows: config.outputSyncedRows,\n db,\n tableSpecs,\n host,\n },\n async () => {},\n );\n} else if (config.query) {\n result = await runQuery(config.query);\n} else if (config.hash) {\n result = await runHash(config.hash);\n} else {\n colorConsole.error('No query or AST or hash provided');\n process.exit(1);\n}\n\nfunction runQuery(queryString: string): Promise<AnalyzeQueryResult> {\n const z = {\n query: Object.fromEntries(\n Object.entries(schema.tables).map(([name]) => [\n name,\n newQuery(schema, name),\n ]),\n ),\n };\n\n const f = new Function('z', `return z.query.${queryString};`);\n const q: Query<string, Schema, PullRow<string, Schema>> = f(z);\n\n const ast = asQueryInternals(q).ast;\n return runAst(\n lc,\n clientSchema,\n ast,\n false,\n {\n applyPermissions: config.applyPermissions,\n auth: config.authData\n ? {type: 'jwt' as const, raw: '', decoded: JSON.parse(config.authData)}\n : undefined,\n clientToServerMapper,\n permissions,\n syncedRows: config.outputSyncedRows,\n db,\n tableSpecs,\n host,\n },\n async () => {},\n );\n}\n\nasync function runHash(hash: string) {\n const cvrDB = pgClient(\n lc,\n must(config.cvr.db, 'CVR DB must be provided when using the hash option'),\n 'analyze-query-hash-cvr',\n );\n\n const rows = await cvrDB`select \"clientAST\", \"internal\" from ${cvrDB(\n upstreamSchema(getShardID(config)) + '/cvr',\n )}.\"queries\" where \"queryHash\" = ${must(hash)} limit 1;`;\n await cvrDB.end();\n\n colorConsole.log('ZQL from Hash:');\n const ast = rows[0].clientAST as AST;\n colorConsole.log(await formatOutput(ast.table + astToZQL(ast)));\n\n return runAst(\n lc,\n clientSchema,\n ast,\n true,\n {\n applyPermissions: config.applyPermissions,\n auth: config.authData\n ? {type: 'jwt' as const, raw: '', decoded: JSON.parse(config.authData)}\n : undefined,\n clientToServerMapper,\n permissions,\n syncedRows: config.outputSyncedRows,\n db,\n tableSpecs,\n host,\n },\n async () => {},\n );\n}\n\nif (config.outputSyncedRows) {\n colorConsole.log(styleText(['blue', 'bold'], '=== Synced Rows: ===\\n'));\n for (const [table, rows] of Object.entries(result.syncedRows ?? {})) {\n colorConsole.log(styleText('bold', table + ':'), rows);\n }\n}\n\ncolorConsole.log(styleText(['blue', 'bold'], '=== Query Stats: ===\\n'));\ncolorConsole.log(\n styleText('bold', 'total synced rows:'),\n result.syncedRowCount,\n);\nshowStats();\nif (config.outputVendedRows) {\n colorConsole.log(\n styleText(['blue', 'bold'], '=== JS Row Scan Values: ===\\n'),\n );\n for (const source of sources.values()) {\n colorConsole.log(\n styleText('bold', `${source.tableSchema.name}:`),\n debug.getVendedRows()?.[source.tableSchema.name] ?? {},\n );\n }\n}\n\ncolorConsole.log(\n styleText(['blue', 'bold'], '\\n=== Rows Scanned (by SQLite): ===\\n'),\n);\nconst nvisitCounts = debug.getNVisitCounts();\nlet totalNVisit = 0;\nfor (const [table, queries] of Object.entries(nvisitCounts)) {\n colorConsole.log(styleText('bold', `${table}:`), queries);\n for (const count of Object.values(queries)) {\n totalNVisit += count;\n }\n}\ncolorConsole.log(\n styleText('bold', 'total rows scanned:'),\n colorRowsConsidered(totalNVisit),\n);\n\ncolorConsole.log(styleText(['blue', 'bold'], '\\n\\n=== Query Plans: ===\\n'));\nconst fallbackPlans = explainQueries(debug.getVendedRowCounts() ?? {}, db);\nconst capturedPlans = debug.getSQLitePlans();\nconst plans: Record<string, string[]> = {...fallbackPlans, ...capturedPlans};\nfor (const [query, plan] of Object.entries(plans)) {\n colorConsole.log(styleText('bold', 'query'), query);\n colorConsole.log(plan.map((row, i) => colorPlanRow(row, i)).join('\\n'));\n colorConsole.log('\\n');\n}\n\nfunction showStats() {\n let totalRowsConsidered = 0;\n for (const source of sources.values()) {\n const values = Object.values(\n debug.getVendedRowCounts()?.[source.tableSchema.name] ?? {},\n );\n for (const v of values) {\n totalRowsConsidered += v;\n }\n colorConsole.log(\n styleText('bold', source.tableSchema.name + ' vended:'),\n debug.getVendedRowCounts()?.[source.tableSchema.name] ?? {},\n );\n }\n\n colorConsole.log(\n styleText('bold', 'Rows Read (into JS):'),\n colorRowsConsidered(totalRowsConsidered),\n );\n colorConsole.log(\n styleText('bold', 'time:'),\n colorTime(result.end - result.start),\n 'ms',\n );\n}\n\nfunction colorTime(duration: number) {\n if (duration < 100) {\n return styleText('green', duration.toFixed(2) + 'ms');\n } else if (duration < 1000) {\n return styleText('yellow', duration.toFixed(2) + 'ms');\n }\n return styleText('red', duration.toFixed(2) + 'ms');\n}\n\nfunction colorRowsConsidered(n: number) {\n if (n < 1000) {\n return styleText('green', n.toString());\n } else if (n < 10000) {\n return styleText('yellow', n.toString());\n }\n return styleText('red', n.toString());\n}\n\nfunction colorPlanRow(row: string, i: number) {\n if (row.includes('SCAN')) {\n if (i === 0) {\n return styleText('yellow', row);\n }\n return styleText('red', row);\n }\n return styleText('green', row);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin-transform.js","names":[],"sources":["../../../../analyze-query/src/bin-transform.ts"],"sourcesContent":["import '../../shared/src/dotenv.ts';\n\nimport {consoleLogSink, LogContext} from '@rocicorp/logger';\nimport {astToZQL} from '../../ast-to-zql/src/ast-to-zql.ts';\nimport {formatOutput} from '../../ast-to-zql/src/format.ts';\nimport {must} from '../../shared/src/must.ts';\nimport {parseOptions} from '../../shared/src/options.ts';\nimport * as v from '../../shared/src/valita.ts';\nimport {transformAndHashQuery} from '../../zero-cache/src/auth/read-authorizer.ts';\nimport {\n appOptions,\n shardOptions,\n ZERO_ENV_VAR_PREFIX,\n} from '../../zero-cache/src/config/zero-config.ts';\nimport {loadSchemaAndPermissions} from '../../zero-cache/src/scripts/permissions.ts';\nimport {pgClient} from '../../zero-cache/src/types/pg.ts';\nimport {getShardID, upstreamSchema} from '../../zero-cache/src/types/shards.ts';\n\nconst options = {\n cvr: {db: v.string()},\n schema: {\n type: v.string().default('./schema.ts'),\n desc: ['Path to the schema file.'],\n },\n app: appOptions,\n shard: shardOptions,\n hash: {\n type: v.string().optional(),\n desc: ['Hash of the query to fetch the AST for.'],\n },\n};\n\nconst config = parseOptions(options, {envNamePrefix: ZERO_ENV_VAR_PREFIX});\n\nconst lc = new LogContext('debug', {}, consoleLogSink);\nconst {permissions} = await loadSchemaAndPermissions(config.schema);\n\nconst cvrDB = pgClient(lc, config.cvr.db, 'analyze-query-transform-cvr');\n\nconst rows =\n await cvrDB`select \"clientAST\", \"internal\" from ${cvrDB(upstreamSchema(getShardID(config)) + '/cvr')}.\"queries\" where \"queryHash\" = ${must(\n config.hash,\n )} limit 1;`;\n\nconst queryAst = transformAndHashQuery(\n lc,\n '',\n rows[0].clientAST,\n permissions,\n {\n type: 'jwt',\n raw: '',\n decoded: {},\n },\n rows[0].internal,\n).transformedAst;\n\n// oxlint-disable no-console\nconsole.log('\\n=== AST ===\\n');\nconsole.log(JSON.stringify(queryAst, null, 2));\nconsole.log('\\n=== ZQL ===\\n');\nconsole.log(await formatOutput(queryAst.table + astToZQL(queryAst)));\n// oxlint-enable no-console\n\nawait cvrDB.end();\n"],"mappings":";;;;;;;;;;;;;AAgCA,IAAM,SAAS,aAAa;CAb1B,KAAK,EAAC,IAAI,eAAE,OAAO,EAAC;CACpB,QAAQ;EACN,MAAM,eAAE,OAAO,EAAE,QAAQ,aAAa;EACtC,MAAM,CAAC,0BAA0B;CACnC;CACA,KAAK;CACL,OAAO;CACP,MAAM;EACJ,MAAM,eAAE,OAAO,EAAE,SAAS;EAC1B,MAAM,CAAC,yCAAyC;CAClD;AAG0B,GAAS,EAAC,eAAe,oBAAmB,CAAC;AAEzE,IAAM,KAAK,IAAI,WAAW,SAAS,CAAC,GAAG,cAAc;AACrD,IAAM,EAAC,gBAAe,MAAM,yBAAyB,OAAO,MAAM;AAElE,IAAM,QAAQ,SAAS,IAAI,OAAO,IAAI,IAAI,6BAA6B;AAEvE,IAAM,OACJ,MAAM,KAAK,uCAAuC,MAAM,eAAe,WAAW,MAAM,CAAC,IAAI,MAAM,EAAE,iCAAiC,KACpI,OAAO,IACT,EAAE;AAEJ,IAAM,WAAW,sBACf,IACA,IACA,KAAK,GAAG,WACR,aACA;CACE,MAAM;CACN,KAAK;CACL,SAAS,CAAC;AACZ,GACA,KAAK,GAAG,QACV,EAAE;AAGF,QAAQ,IAAI,iBAAiB;AAC7B,QAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAC7C,QAAQ,IAAI,iBAAiB;AAC7B,QAAQ,IAAI,MAAM,aAAa,SAAS,QAAQ,SAAS,QAAQ,CAAC,CAAC;AAGnE,MAAM,MAAM,IAAI"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-to-zql.js","names":[],"sources":["../../../../ast-to-zql/src/ast-to-zql.ts"],"sourcesContent":["import {unreachable} from '../../shared/src/asserts.ts';\nimport {toSorted} from '../../shared/src/iterables.ts';\nimport {must} from '../../shared/src/must.ts';\nimport type {\n AST,\n Condition,\n Conjunction,\n CorrelatedSubquery,\n CorrelatedSubqueryCondition,\n Disjunction,\n LiteralReference,\n Ordering,\n Parameter,\n SimpleCondition,\n ValuePosition,\n} from '../../zero-protocol/src/ast.ts';\nimport {SUBQ_PREFIX} from '../../zero-protocol/src/ast.ts';\n\n/**\n * Converts an AST to the equivalent query builder code.\n * This is useful for debugging and understanding queries.\n *\n * @example\n * ```\n * const ast = query.issue.where('id', '=', 123)[astSymbol];\n * console.log(astToZQL(ast)); // outputs: .where('id', '=', 123)\n * ```\n */\nexport function astToZQL(ast: AST): string {\n let code = '';\n\n // Handle where conditions\n if (ast.where) {\n code += transformCondition(ast.where, '.where', new Set());\n }\n\n // Handle related subqueries\n if (ast.related && ast.related.length > 0) {\n for (const related of ast.related) {\n if (related.hidden) {\n const nestedRelated = related.subquery.related?.[0];\n if (nestedRelated) {\n code += transformRelated(nestedRelated);\n }\n } else {\n code += transformRelated(related);\n }\n }\n }\n\n // Handle orderBy\n if (ast.orderBy && ast.orderBy.length > 0) {\n code += transformOrder(ast.orderBy);\n }\n\n // Handle limit\n if (ast.limit !== undefined) {\n code += `.limit(${ast.limit})`;\n }\n\n // Handle start\n if (ast.start) {\n const {row, exclusive} = ast.start;\n code += `.start(${JSON.stringify(row)}${\n exclusive ? '' : ', { inclusive: true }'\n })`;\n }\n\n return code;\n}\n\ntype Args = Set<string>;\n\ntype Prefix = '.where' | 'cmp';\n\nfunction transformCondition(\n condition: Condition,\n prefix: Prefix,\n args: Args,\n): string {\n switch (condition.type) {\n case 'simple':\n return transformSimpleCondition(condition, prefix);\n case 'and':\n case 'or':\n return transformLogicalCondition(condition, prefix, args);\n case 'correlatedSubquery':\n return transformExistsCondition(condition, prefix, args);\n default:\n unreachable(condition);\n }\n}\n\nfunction transformSimpleCondition(\n condition: SimpleCondition,\n prefix: Prefix,\n): string {\n const {left, op, right} = condition;\n\n const leftCode = transformValuePosition(left);\n const rightCode = transformValuePosition(right);\n\n // Handle the shorthand form for equals\n if (op === '=') {\n return `${prefix}(${leftCode}, ${rightCode})`;\n }\n\n return `${prefix}(${leftCode}, '${op}', ${rightCode})`;\n}\n\nfunction transformLogicalCondition(\n condition: Conjunction | Disjunction,\n prefix: Prefix,\n args: Args,\n): string {\n const {type, conditions} = condition;\n\n // For single condition, no need for logical operator\n if (conditions.length === 1) {\n return transformCondition(conditions[0], prefix, args);\n }\n\n // Generate multiple where calls for top-level AND conditions\n if (type === 'and') {\n const parts = conditions.map(c => transformCondition(c, prefix, args));\n // Simply concatenate the where conditions\n if (prefix === '.where') {\n return parts.join('');\n }\n args.add('and');\n return 'and(' + parts.join(', ') + ')';\n }\n\n args = new Set<string>();\n\n // Handle nested conditions with a callback for OR conditions and nested ANDs/ORs\n const conditionsCode = conditions\n .map(c => transformCondition(c, 'cmp', args))\n .join(', ');\n\n args.add('cmp');\n args.add(type);\n const argsCode = toSorted(args).join(', ');\n\n return `.where(({${argsCode}}) => ${type}(${conditionsCode}))`;\n}\n\nfunction transformExistsCondition(\n condition: CorrelatedSubqueryCondition,\n prefix: '.where' | 'cmp',\n args: Set<string>,\n): string {\n const {related, op} = condition;\n const relationship = extractRelationshipName(related);\n\n const nextSubquery = getNextExistsSubquery(related);\n\n // Check if subquery has additional properties\n const hasSubQueryProps =\n nextSubquery.where ||\n (nextSubquery.related && nextSubquery.related.length > 0) ||\n nextSubquery.orderBy ||\n nextSubquery.limit;\n\n // Build options string for flip and scalar\n const optionParts: string[] = [];\n if (condition.flip !== undefined) {\n optionParts.push(`flip: ${condition.flip}`);\n }\n if (condition.scalar !== undefined) {\n optionParts.push(`scalar: ${condition.scalar}`);\n }\n const optionsStr =\n optionParts.length > 0 ? `, {${optionParts.join(', ')}}` : '';\n\n if (op === 'EXISTS') {\n if (!hasSubQueryProps) {\n if (prefix === '.where') {\n return `.whereExists('${relationship}'${optionsStr})`;\n }\n args.add('exists');\n return `exists('${relationship}'${optionsStr})`;\n }\n\n if (prefix === '.where') {\n return `.whereExists('${relationship}', q => q${astToZQL(nextSubquery)}${optionsStr})`;\n }\n prefix satisfies 'cmp';\n args.add('exists');\n return `exists('${relationship}', q => q${astToZQL(nextSubquery)}${optionsStr})`;\n }\n\n op satisfies 'NOT EXISTS';\n\n if (hasSubQueryProps) {\n if (prefix === '.where') {\n return `.where(({exists, not}) => not(exists('${relationship}', q => q${astToZQL(\n nextSubquery,\n )}${optionsStr})))`;\n }\n prefix satisfies 'cmp';\n args.add('not');\n args.add('exists');\n return `not(exists('${relationship}', q => q${astToZQL(nextSubquery)}${optionsStr}))`;\n }\n\n if (prefix === '.where') {\n return `.where(({exists, not}) => not(exists('${relationship}'${optionsStr})))`;\n }\n args.add('not');\n args.add('exists');\n\n return `not(exists('${relationship}'${optionsStr})))`;\n}\n\n// If the `exists` is applied against a junction edge, both hops will have the same alias and both hops will be exists conditions.\nfunction getNextExistsSubquery(related: CorrelatedSubquery): AST {\n if (\n related.subquery.where?.type === 'correlatedSubquery' &&\n related.subquery.where.related.subquery.alias?.includes(\n SUBQ_PREFIX + 'zhidden_',\n )\n ) {\n return getNextExistsSubquery(related.subquery.where.related);\n }\n\n return related.subquery;\n}\n\nfunction extractRelationshipName(related: CorrelatedSubquery): string {\n const alias = must(related.subquery.alias);\n return alias.startsWith(SUBQ_PREFIX)\n ? alias.substring(SUBQ_PREFIX.length)\n : alias;\n}\n\nfunction transformRelated(related: CorrelatedSubquery): string {\n const {alias} = related.subquery;\n if (!alias) return '';\n\n const relationship = alias;\n let code = `.related('${relationship}'`;\n\n // If the subquery has additional filters or configurations\n if (\n related.subquery.where ||\n (related.subquery.related && related.subquery.related.length > 0) ||\n related.subquery.orderBy ||\n related.subquery.limit\n ) {\n code += ', q => q' + astToZQL(related.subquery);\n }\n\n code += ')';\n return code;\n}\n\nfunction transformOrder(orderBy: Ordering): string {\n let code = '';\n for (const [field, direction] of orderBy) {\n code += `.orderBy('${field}', '${direction}')`;\n }\n return code;\n}\n\nfunction transformValuePosition(value: ValuePosition): string {\n switch (value.type) {\n case 'literal':\n return transformLiteral(value);\n case 'column':\n return `'${value.name}'`;\n case 'static':\n return transformParameter(value);\n default:\n unreachable(value);\n }\n}\n\nfunction transformLiteral(literal: LiteralReference): string {\n if (literal.value === null) {\n return 'null';\n }\n if (Array.isArray(literal.value)) {\n return JSON.stringify(literal.value);\n }\n if (typeof literal.value === 'string') {\n return `'${literal.value.replace(/'/g, \"\\\\'\")}'`;\n }\n return String(literal.value);\n}\n\nfunction transformParameter(param: Parameter): string {\n const fieldStr = Array.isArray(param.field)\n ? `[${param.field.map(f => `'${f}'`).join(', ')}]`\n : `'${param.field}'`;\n\n return `authParam(${fieldStr})`;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","names":[],"sources":["../../../../ast-to-zql/src/bin.ts"],"sourcesContent":["/* oxlint-disable no-console */\nimport {readFile} from 'node:fs/promises';\nimport process from 'node:process';\nimport {createInterface} from 'node:readline';\nimport {parseOptions} from '../../shared/src/options.ts';\nimport * as v from '../../shared/src/valita.ts';\nimport {loadSchemaAndPermissions} from '../../zero-cache/src/scripts/permissions.ts';\nimport {mapAST} from '../../zero-protocol/src/ast.ts';\nimport {serverToClient} from '../../zero-schema/src/name-mapper.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport {astToZQL} from './ast-to-zql.ts';\nimport {formatOutput} from './format.ts';\n\nconst options = {\n schema: {\n type: v.string().optional(),\n desc: [\n 'Path to the schema file. Use this to re-map the AST to client names.',\n ],\n },\n};\n\nconst config = parseOptions(options);\n\nlet schema: Schema | undefined;\nif (config.schema) {\n schema = (await loadSchemaAndPermissions(config.schema)).schema;\n}\n\nfunction isStdinPiped(): boolean {\n return !process.stdin.isTTY;\n}\n\nfunction readFromStdin(): Promise<string> {\n return new Promise(resolve => {\n let data = '';\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false,\n });\n\n rl.on('line', line => {\n data += line + '\\n';\n });\n\n rl.on('close', () => {\n resolve(data);\n });\n });\n}\n\nasync function main(): Promise<void> {\n try {\n let input: string;\n\n if (isStdinPiped()) {\n input = await readFromStdin();\n } else if (process.argv.length > 2) {\n const filePath = process.argv[2];\n input = await readFile(filePath, 'utf-8');\n } else {\n console.error('Error: No input provided.');\n console.error('Usage:');\n console.error(` cat ast.json | npx ast-to-zql`);\n console.error(` npx ast-to-zql ast.json`);\n process.exit(1);\n }\n\n let ast = JSON.parse(input);\n if (schema) {\n const mapper = serverToClient(schema.tables);\n ast = mapAST(ast, mapper);\n }\n\n const zql = astToZQL(ast);\n const code = `query.${ast.table}${zql}`;\n\n console.log(await formatOutput(code));\n } catch (error) {\n console.error('Error processing input:', error);\n process.exit(1);\n }\n}\n\nawait main();\n"],"mappings":";;;;;;;;;;;AAsBA,IAAM,SAAS,aAAa,EAR1B,QAAQ;CACN,MAAM,eAAE,OAAO,EAAE,SAAS;CAC1B,MAAM,CACJ,sEACF;AACF,EAG0B,CAAO;AAEnC,IAAI;AACJ,IAAI,OAAO,QACT,UAAU,MAAM,yBAAyB,OAAO,MAAM,GAAG;AAG3D,SAAS,eAAwB;CAC/B,OAAO,CAAC,QAAQ,MAAM;AACxB;AAEA,SAAS,gBAAiC;CACxC,OAAO,IAAI,SAAQ,YAAW;EAC5B,IAAI,OAAO;EACX,MAAM,KAAK,gBAAgB;GACzB,OAAO,QAAQ;GACf,QAAQ,QAAQ;GAChB,UAAU;EACZ,CAAC;EAED,GAAG,GAAG,SAAQ,SAAQ;GACpB,QAAQ,OAAO;EACjB,CAAC;EAED,GAAG,GAAG,eAAe;GACnB,QAAQ,IAAI;EACd,CAAC;CACH,CAAC;AACH;AAEA,eAAe,OAAsB;CACnC,IAAI;EACF,IAAI;EAEJ,IAAI,aAAa,GACf,QAAQ,MAAM,cAAc;OACvB,IAAI,QAAQ,KAAK,SAAS,GAAG;GAClC,MAAM,WAAW,QAAQ,KAAK;GAC9B,QAAQ,MAAM,SAAS,UAAU,OAAO;EAC1C,OAAO;GACL,QAAQ,MAAM,2BAA2B;GACzC,QAAQ,MAAM,QAAQ;GACtB,QAAQ,MAAM,iCAAiC;GAC/C,QAAQ,MAAM,2BAA2B;GACzC,QAAQ,KAAK,CAAC;EAChB;EAEA,IAAI,MAAM,KAAK,MAAM,KAAK;EAC1B,IAAI,QAAQ;GACV,MAAM,SAAS,eAAe,OAAO,MAAM;GAC3C,MAAM,OAAO,KAAK,MAAM;EAC1B;EAEA,MAAM,MAAM,SAAS,GAAG;EACxB,MAAM,OAAO,SAAS,IAAI,QAAQ;EAElC,QAAQ,IAAI,MAAM,aAAa,IAAI,CAAC;CACtC,SAAS,OAAO;EACd,QAAQ,MAAM,2BAA2B,KAAK;EAC9C,QAAQ,KAAK,CAAC;CAChB;AACF;AAEA,MAAM,KAAK"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","names":[],"sources":["../../../../ast-to-zql/src/format.ts"],"sourcesContent":["import {format} from 'oxfmt';\n\nexport async function formatOutput(content: string): Promise<string> {\n try {\n const result = await format('output.ts', content, {\n semi: false,\n printWidth: 80,\n });\n return result.code;\n } catch (error) {\n // oxlint-disable-next-line no-console\n console.warn('Warning: Unable to format output with oxfmt:', error);\n return content;\n }\n}\n"],"mappings":";;AAEA,eAAsB,aAAa,SAAkC;CACnE,IAAI;EAKF,QAAO,MAJc,OAAO,aAAa,SAAS;GAChD,MAAM;GACN,YAAY;EACd,CAAC,GACa;CAChB,SAAS,OAAO;EAEd,QAAQ,KAAK,gDAAgD,KAAK;EAClE,OAAO;CACT;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datadog-log-sink.js","names":["#apiKey","#source","#service","#host","#version","#interval","#baseURL","#messages","#startTimer","#timerID","#flushLock"],"sources":["../../../../datadog/src/datadog-log-sink.ts"],"sourcesContent":["import {Lock} from '@rocicorp/lock';\nimport type {Context, LogLevel, LogSink} from '@rocicorp/logger';\n\nexport interface DatadogLogSinkOptions {\n apiKey?: string | undefined;\n source?: string | undefined;\n service?: string | undefined;\n host?: string | undefined;\n version?: string | undefined;\n interval?: number | undefined;\n baseURL?: URL | undefined;\n}\n\nconst DD_BASE_URL = new URL(\n 'https://http-intake.logs.datadoghq.com/api/v2/logs',\n);\n\n// https://docs.datadoghq.com/api/latest/logs/\nexport const MAX_LOG_ENTRIES_PER_FLUSH = 1000;\nexport const FORCE_FLUSH_THRESHOLD = 250;\nconst MAX_ENTRY_BYTES = 5 * 1024 * 1024;\nconst MAX_MESSAGE_RETRIES = 2;\n\n// Conservative limit that assumes all chars are encoded as 4 UTF-8 bytes.\n// This makes the actual limit somewhere closer to 1.25 MB, which is still\n// a reasonable amount of log data to send per request.\nexport const MAX_ENTRY_CHARS = MAX_ENTRY_BYTES / 4;\n\nexport class DatadogLogSink implements LogSink {\n #messages: Message[] = [];\n readonly #apiKey: string | undefined;\n readonly #source: string | undefined;\n readonly #service: string | undefined;\n readonly #host: string | undefined;\n readonly #version: string | undefined;\n readonly #interval: number;\n readonly #baseURL: string;\n #timerID: ReturnType<typeof setTimeout> | 0 = 0;\n #flushLock = new Lock();\n\n constructor(options: DatadogLogSinkOptions) {\n const {\n apiKey,\n source,\n service,\n host,\n version,\n interval = 5_000,\n baseURL: baseUrl = DD_BASE_URL,\n } = options;\n\n this.#apiKey = apiKey;\n this.#source = source;\n this.#service = service;\n this.#host = host;\n this.#version = version;\n this.#interval = interval;\n this.#baseURL = baseUrl.toString();\n }\n\n log(level: LogLevel, context: Context | undefined, ...args: unknown[]): void {\n this.#messages.push(makeMessage(args, context, level));\n if (level === 'error' || this.#messages.length === FORCE_FLUSH_THRESHOLD) {\n // Do not await. Later calls to flush will await as needed.\n void this.flush();\n } else {\n this.#startTimer();\n }\n }\n #startTimer() {\n if (this.#timerID) {\n return;\n }\n\n this.#timerID = setTimeout(() => {\n this.#timerID = 0;\n\n void this.flush();\n }, this.#interval);\n }\n\n flush(): Promise<void> {\n return this.#flushLock.withLock(async () => {\n const {length} = this.#messages;\n if (length === 0) {\n return;\n }\n do {\n const flushTime = Date.now();\n const stringified = [];\n let totalBytes = 0;\n\n for (const m of this.#messages) {\n // As a small perf optimization, we directly mutate\n // the message rather than making a shallow copy.\n // The LOG_SINK_FLUSH_DELAY_ATTRIBUTE will be clobbered by\n // the next flush if this flush fails (which is the desired behavior).\n m.flushDelayMs = flushTime - m.date;\n\n let str = JSON.stringify(m);\n if (str.length > MAX_ENTRY_CHARS) {\n // A single message above the total payload limit will otherwise halt\n // log flushing progress. Drop and replace with a message indicating so.\n m.message = `[Dropped message of length ${str.length}]`;\n str = JSON.stringify(m);\n }\n // Calculate the totalBytes with the newline characters between messages.\n if (str.length + totalBytes + stringified.length > MAX_ENTRY_CHARS) {\n break;\n }\n totalBytes += str.length;\n stringified.push(str);\n\n if (stringified.length === MAX_LOG_ENTRIES_PER_FLUSH) {\n break;\n }\n }\n\n const body = stringified.join('\\n');\n const url = new URL(this.#baseURL);\n if (this.#apiKey !== undefined) {\n url.searchParams.set('dd-api-key', this.#apiKey);\n }\n\n if (this.#source) {\n // Both need to be set for server to treat us as the browser SDK for\n // value 'browser'.\n url.searchParams.set('ddsource', this.#source);\n url.searchParams.set('dd-evp-origin', this.#source);\n }\n\n if (this.#service) {\n url.searchParams.set('service', this.#service);\n }\n\n if (this.#host) {\n url.searchParams.set('host', this.#host);\n }\n\n if (this.#version) {\n url.searchParams.set('ddtags', `version:${this.#version}`);\n }\n\n let ok = false;\n try {\n const response = await fetch(url.toString(), {\n method: 'POST',\n body,\n keepalive: true,\n } as RequestInit);\n\n ok = response.ok;\n if (!ok) {\n // Log to console so that we might catch this in `wrangler tail`.\n // oxlint-disable-next-line no-console\n console.error(\n 'response',\n response.status,\n response.statusText,\n await response.text,\n );\n }\n } catch (e) {\n // Log to console so that we might catch this in `wrangler tail`.\n // oxlint-disable-next-line no-console\n console.error('Log flush to datadog failed', e);\n }\n\n if (ok) {\n // Remove messages that were successfully flushed.\n this.#messages.splice(0, stringified.length);\n } else {\n let numWithTooManyRetries = 0;\n for (let i = 0; i < stringified.length; i++) {\n const m = this.#messages[i];\n m.flushRetryCount = (m.flushRetryCount ?? 0) + 1;\n if (m.flushRetryCount > MAX_MESSAGE_RETRIES) {\n numWithTooManyRetries++;\n }\n }\n if (numWithTooManyRetries > 0) {\n // oxlint-disable-next-line no-console\n console.error(\n `Dropping ${numWithTooManyRetries} datadog log messages which failed to send ${\n MAX_MESSAGE_RETRIES + 1\n } times.`,\n );\n // Remove messages that have failed too many times.\n this.#messages.splice(0, numWithTooManyRetries);\n }\n }\n } while (this.#messages.length >= FORCE_FLUSH_THRESHOLD);\n // If any messages left at this point schedule another flush.\n if (this.#messages.length) {\n this.#startTimer();\n }\n });\n }\n}\n\ntype Message = Context & {\n status: LogLevel;\n date: number;\n message: unknown;\n error?: {origin: 'logger'};\n flushDelayMs?: number;\n flushRetryCount?: number;\n};\n\nfunction flattenMessage(message: unknown): unknown {\n if (Array.isArray(message) && message.length === 1) {\n return flattenMessage(message[0]);\n }\n return message;\n}\n\nfunction convertError(e: Error): {\n name: string;\n message: string;\n stack: string | undefined;\n} {\n return {\n name: e.name,\n message: e.message,\n stack: e.stack,\n };\n}\n\nfunction convertErrors(message: unknown): unknown {\n if (message instanceof Error) {\n return convertError(message);\n }\n if (message instanceof Array) {\n const convertedMessage: unknown[] = [];\n for (const item of message) {\n if (item instanceof Error) {\n convertedMessage.push(convertError(item));\n } else {\n convertedMessage.push(item);\n }\n }\n return convertedMessage;\n }\n return message;\n}\n\nconst LOG_SINK_FLUSH_RETRY_COUNT = 'flushRetryCount';\nconst LOG_SINK_FLUSH_DELAY_ATTRIBUTE = 'flushDelayMs';\n// This code assumes that no context keys will start with\n// @DATADOG_RESERVED_ (a fairly safe assumption).\nconst RESERVED_KEY_PREFIX = '@DATADOG_RESERVED_';\n// See https://docs.datadoghq.com/logs/log_configuration/attributes_naming_convention/#reserved-attributes\n// Note 'msg' and 'date' are not documented.\n// We should avoid using these as context keys. We escape them here\n// because otherwise the impact on the data dog log UI is very confusing\n// (e.g. using 'msg' as a context key results, in the context value\n// replacing the log message.)\nconst RESERVED_KEYS: ReadonlyArray<string> = [\n 'host',\n 'source',\n 'status',\n 'service',\n 'version',\n 'trace_id',\n 'message',\n 'msg', // alias for message\n 'date',\n // The following are attributes reserved by the DataDogLogSink\n // itself (as opposed to DataDog), to report on its own behavior.\n LOG_SINK_FLUSH_DELAY_ATTRIBUTE,\n LOG_SINK_FLUSH_RETRY_COUNT,\n];\n\nfunction makeMessage(\n message: unknown,\n context: Context | undefined,\n logLevel: LogLevel,\n): Message {\n let safeContext = undefined;\n if (context !== undefined) {\n for (const reservedKey of RESERVED_KEYS) {\n if (Object.hasOwn(context, reservedKey)) {\n if (safeContext === undefined) {\n safeContext = {...context};\n }\n safeContext[RESERVED_KEY_PREFIX + reservedKey] =\n safeContext[reservedKey];\n delete safeContext[reservedKey];\n }\n }\n }\n const msg: Message = {\n ...(safeContext ?? context),\n date: Date.now(),\n message: convertErrors(flattenMessage(message)),\n status: logLevel,\n };\n if (logLevel === 'error') {\n msg.error = {origin: 'logger'};\n }\n return msg;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enabled.js","names":[],"sources":["../../../../otel/src/enabled.ts"],"sourcesContent":["export function otelEnabled() {\n return otelMetricsEnabled() || otelTracesEnabled() || otelLogsEnabled();\n}\n\nexport function otelMetricsEnabled() {\n return (\n process.env.OTEL_EXPORTER_OTLP_ENDPOINT ||\n process.env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT ||\n process.env.OTEL_METRICS_EXPORTER\n );\n}\n\nexport function otelLogsEnabled() {\n return (\n process.env.OTEL_EXPORTER_OTLP_ENDPOINT ||\n process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT ||\n process.env.OTEL_LOGS_EXPORTER\n );\n}\n\nexport function otelTracesEnabled() {\n return (\n process.env.OTEL_EXPORTER_OTLP_ENDPOINT ||\n process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ||\n process.env.OTEL_TRACES_EXPORTER\n );\n}\n"],"mappings":";AAAA,SAAgB,cAAc;CAC5B,OAAO,mBAAmB,KAAK,kBAAkB,KAAK,gBAAgB;AACxE;AAEA,SAAgB,qBAAqB;CACnC,OACE,QAAQ,IAAI,+BACZ,QAAQ,IAAI,uCACZ,QAAQ,IAAI;AAEhB;AAEA,SAAgB,kBAAkB;CAChC,OACE,QAAQ,IAAI,+BACZ,QAAQ,IAAI,oCACZ,QAAQ,IAAI;AAEhB;AAEA,SAAgB,oBAAoB;CAClC,OACE,QAAQ,IAAI,+BACZ,QAAQ,IAAI,sCACZ,QAAQ,IAAI;AAEhB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-options.js","names":[],"sources":["../../../../otel/src/log-options.ts"],"sourcesContent":["import {type Config} from '../../shared/src/options-types.ts';\nimport * as v from '../../shared/src/valita.ts';\n\nexport const logLevel = v.literalUnion('debug', 'info', 'warn', 'error');\n\nexport const logOptions = {\n level: logLevel.default('info'),\n\n format: {\n type: v.literalUnion('text', 'json').default('text'),\n desc: [\n `Use {bold text} for developer-friendly console logging`,\n `and {bold json} for consumption by structured-logging services`,\n ],\n },\n\n slowRowThreshold: {\n type: v.number().default(2),\n desc: [\n `The number of ms a row must take to fetch from table-source before it is considered slow.`,\n ],\n },\n\n slowHydrateThreshold: {\n type: v.number().default(100),\n desc: [\n `The number of milliseconds a query hydration must take to print a slow warning.`,\n ],\n },\n\n ivmSampling: {\n type: v.number().default(5000),\n desc: [\n `How often to collect IVM metrics. 1 out of N requests will be sampled where N is this value.`,\n ],\n },\n};\n\nexport type LogConfig = Config<typeof logOptions>;\n"],"mappings":";;AAGA,IAAa,WAAW,aAAe,SAAS,QAAQ,QAAQ,OAAO;AAEvE,IAAa,aAAa;CACxB,OAAO,SAAS,QAAQ,MAAM;CAE9B,QAAQ;EACN,MAAM,aAAe,QAAQ,MAAM,EAAE,QAAQ,MAAM;EACnD,MAAM,CACJ,0DACA,gEACF;CACF;CAEA,kBAAkB;EAChB,MAAM,eAAE,OAAO,EAAE,QAAQ,CAAC;EAC1B,MAAM,CACJ,2FACF;CACF;CAEA,sBAAsB;EACpB,MAAM,eAAE,OAAO,EAAE,QAAQ,GAAG;EAC5B,MAAM,CACJ,iFACF;CACF;CAEA,aAAa;EACX,MAAM,eAAE,OAAO,EAAE,QAAQ,GAAI;EAC7B,MAAM,CACJ,8FACF;CACF;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maybe-time.js","names":[],"sources":["../../../../otel/src/maybe-time.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\n\nexport function timeSampled<T>(\n lc: LogContext,\n numerator: number,\n denominator: number,\n cb: () => T,\n threshold: number = 0,\n prefix: () => string = () => '',\n) {\n if (denominator > 0 && numerator % denominator === 0) {\n const start = performance.now();\n const result = cb();\n const duration = performance.now() - start;\n if (duration > threshold) {\n lc.warn?.(`${prefix()} duration: ${duration}ms`);\n }\n\n return result;\n }\n return cb();\n}\n"],"mappings":";AAEA,SAAgB,YACd,IACA,WACA,aACA,IACA,YAAoB,GACpB,eAA6B,IAC7B;CACA,IAAI,cAAc,KAAK,YAAY,gBAAgB,GAAG;EACpD,MAAM,QAAQ,YAAY,IAAI;EAC9B,MAAM,SAAS,GAAG;EAClB,MAAM,WAAW,YAAY,IAAI,IAAI;EACrC,IAAI,WAAW,WACb,GAAG,OAAO,GAAG,OAAO,EAAE,aAAa,SAAS,GAAG;EAGjD,OAAO;CACT;CACA,OAAO,GAAG;AACZ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"span.js","names":[],"sources":["../../../../otel/src/span.ts"],"sourcesContent":["import {\n type Attributes,\n type Span,\n type Tracer,\n context,\n} from '@opentelemetry/api';\n\nexport function startSpan<T>(\n tracer: Tracer,\n name: string,\n cb: (span: Omit<Span, 'end'>) => T,\n): T {\n return tracer.startActiveSpan(name, span => {\n try {\n return cb(span);\n } finally {\n span.end();\n }\n });\n}\n\nexport function startAsyncSpan<T>(\n tracer: Tracer,\n name: string,\n cb: (span: Omit<Span, 'end'>) => Promise<T>,\n): Promise<T> {\n return tracer.startActiveSpan(name, async span => {\n try {\n return await cb(span);\n } finally {\n span.end();\n }\n });\n}\n\nexport function manualSpan(\n tracer: Tracer,\n name: string,\n durationMs: number,\n attributes?: Attributes,\n): void {\n const startTime = Date.now() - durationMs;\n const span = tracer.startSpan(name, {startTime}, context.active());\n if (attributes) {\n span.setAttributes(attributes);\n }\n span.end(startTime + durationMs);\n}\n"],"mappings":";;AAOA,SAAgB,UACd,QACA,MACA,IACG;CACH,OAAO,OAAO,gBAAgB,OAAM,SAAQ;EAC1C,IAAI;GACF,OAAO,GAAG,IAAI;EAChB,UAAU;GACR,KAAK,IAAI;EACX;CACF,CAAC;AACH;AAEA,SAAgB,eACd,QACA,MACA,IACY;CACZ,OAAO,OAAO,gBAAgB,MAAM,OAAM,SAAQ;EAChD,IAAI;GACF,OAAO,MAAM,GAAG,IAAI;EACtB,UAAU;GACR,KAAK,IAAI;EACX;CACF,CAAC;AACH;AAEA,SAAgB,WACd,QACA,MACA,YACA,YACM;CACN,MAAM,YAAY,KAAK,IAAI,IAAI;CAC/B,MAAM,OAAO,OAAO,UAAU,MAAM,EAAC,UAAS,GAAG,QAAQ,OAAO,CAAC;CACjE,IAAI,YACF,KAAK,cAAc,UAAU;CAE/B,KAAK,IAAI,YAAY,UAAU;AACjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","names":[],"sources":["../../../../otel/src/version.ts"],"sourcesContent":["export const version = '0.0.2';\n"],"mappings":";AAAA,IAAa,UAAU"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-iterable-to-array.js","names":[],"sources":["../../../../replicache/src/async-iterable-to-array.ts"],"sourcesContent":["export async function asyncIterableToArray<T>(\n it: AsyncIterable<T>,\n): Promise<T[]> {\n const arr: T[] = [];\n for await (const v of it) {\n arr.push(v);\n }\n return arr;\n}\n"],"mappings":";AAAA,eAAsB,qBACpB,IACc;CACd,MAAM,MAAW,CAAC;CAClB,WAAW,MAAM,KAAK,IACpB,IAAI,KAAK,CAAC;CAEZ,OAAO;AACT"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bg-interval.js","names":[],"sources":["../../../../replicache/src/bg-interval.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport {AbortError} from '../../shared/src/abort-error.ts';\nimport {sleep} from '../../shared/src/sleep.ts';\nimport {IDBNotFoundError} from './kv/idb-store.ts';\n\nexport function initBgIntervalProcess(\n processName: string,\n process: () => Promise<unknown>,\n delayMs: () => number,\n lc: LogContext,\n signal: AbortSignal,\n): void {\n void runBgIntervalProcess(processName, process, delayMs, lc, signal);\n}\n\nasync function runBgIntervalProcess(\n processName: string,\n process: () => Promise<unknown>,\n delayMs: () => number,\n lc: LogContext,\n signal: AbortSignal,\n): Promise<void> {\n if (signal.aborted) {\n return;\n }\n lc = lc.withContext('bgIntervalProcess', processName);\n lc.debug?.('Starting');\n while (!signal.aborted) {\n try {\n await sleep(delayMs(), signal);\n } catch (e) {\n if (!(e instanceof AbortError)) {\n throw e;\n }\n }\n if (!signal.aborted) {\n lc.debug?.('Running');\n try {\n await process();\n } catch (e) {\n if (signal.aborted) {\n lc.debug?.('Error running most likely due to close.', e);\n } else if (e instanceof IDBNotFoundError) {\n lc.info?.('IndexedDB was deleted externally.', e);\n } else {\n lc.error?.('Error running.', e);\n }\n }\n }\n }\n lc.debug?.('Stopping');\n}\n"],"mappings":";;;;AAKA,SAAgB,sBACd,aACA,SACA,SACA,IACA,QACM;CACN,qBAA0B,aAAa,SAAS,SAAS,IAAI,MAAM;AACrE;AAEA,eAAe,qBACb,aACA,SACA,SACA,IACA,QACe;CACf,IAAI,OAAO,SACT;CAEF,KAAK,GAAG,YAAY,qBAAqB,WAAW;CACpD,GAAG,QAAQ,UAAU;CACrB,OAAO,CAAC,OAAO,SAAS;EACtB,IAAI;GACF,MAAM,MAAM,QAAQ,GAAG,MAAM;EAC/B,SAAS,GAAG;GACV,IAAI,EAAE,aAAa,aACjB,MAAM;EAEV;EACA,IAAI,CAAC,OAAO,SAAS;GACnB,GAAG,QAAQ,SAAS;GACpB,IAAI;IACF,MAAM,QAAQ;GAChB,SAAS,GAAG;IACV,IAAI,OAAO,SACT,GAAG,QAAQ,2CAA2C,CAAC;SAClD,IAAI,aAAa,kBACtB,GAAG,OAAO,qCAAqC,CAAC;SAEhD,GAAG,QAAQ,kBAAkB,CAAC;GAElC;EACF;CACF;CACA,GAAG,QAAQ,UAAU;AACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","names":[],"sources":["../../../../../replicache/src/btree/diff.ts"],"sourcesContent":["import {asyncIterableToArray} from '../async-iterable-to-array.ts';\nimport type {InternalDiff} from './node.ts';\nimport type {BTreeRead} from './read.ts';\n\nexport function diff(\n oldMap: BTreeRead,\n newMap: BTreeRead,\n): Promise<InternalDiff> {\n // Return an array to ensure we do not compute the diff more than once.\n return asyncIterableToArray(newMap.diff(oldMap));\n}\n"],"mappings":";;AAIA,SAAgB,KACd,QACA,QACuB;CAEvB,OAAO,qBAAqB,OAAO,KAAK,MAAM,CAAC;AACjD"}
|
|
@@ -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"}
|