@rocicorp/zero 1.12.0-canary.2 → 1.12.0-canary.4
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/_virtual/{_@oxc-project_runtime@0.130.0/helpers → _@oxc-project_runtime@0.154.0/helpers/esm}/usingCtx.js +2 -2
- package/out/analyze-query/src/analyze-cli.js +2 -1
- package/out/analyze-query/src/analyze-cli.js.map +1 -1
- package/out/analyze-query/src/bin-analyze.js +5 -3
- package/out/analyze-query/src/bin-analyze.js.map +1 -1
- package/out/analyze-query/src/bin-transform.js +3 -2
- package/out/analyze-query/src/bin-transform.js.map +1 -1
- package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
- package/out/ast-to-zql/src/bin.js +3 -2
- package/out/ast-to-zql/src/bin.js.map +1 -1
- package/out/ast-to-zql/src/format.js.map +1 -1
- package/out/datadog/src/datadog-log-sink.js +5 -4
- package/out/datadog/src/datadog-log-sink.js.map +1 -1
- package/out/otel/src/log-options.js.map +1 -1
- package/out/replicache/src/btree/node.js +13 -11
- package/out/replicache/src/btree/node.js.map +1 -1
- package/out/replicache/src/btree/read.js +4 -2
- package/out/replicache/src/btree/read.js.map +1 -1
- package/out/replicache/src/btree/splice.js.map +1 -1
- package/out/replicache/src/btree/write.js +9 -5
- package/out/replicache/src/btree/write.js.map +1 -1
- package/out/replicache/src/config.js +1 -2
- package/out/replicache/src/connection-loop.js.map +1 -1
- package/out/replicache/src/dag/chunk.js +1 -1
- package/out/replicache/src/dag/gc.js.map +1 -1
- package/out/replicache/src/dag/lazy-store.js +8 -7
- package/out/replicache/src/dag/lazy-store.js.map +1 -1
- package/out/replicache/src/dag/store-impl.js +1 -1
- package/out/replicache/src/dag/store-impl.js.map +1 -1
- package/out/replicache/src/dag/visitor.js.map +1 -1
- package/out/replicache/src/db/commit.js +5 -3
- package/out/replicache/src/db/commit.js.map +1 -1
- package/out/replicache/src/db/read.js +1 -1
- package/out/replicache/src/db/read.js.map +1 -1
- package/out/replicache/src/db/rebase.js.map +1 -1
- package/out/replicache/src/db/write.js +5 -2
- package/out/replicache/src/db/write.js.map +1 -1
- package/out/replicache/src/deleted-clients.js +3 -2
- package/out/replicache/src/deleted-clients.js.map +1 -1
- package/out/replicache/src/expo-sqlite.js +1 -2
- package/out/replicache/src/frozen-json.js +1 -1
- package/out/replicache/src/frozen-json.js.map +1 -1
- package/out/replicache/src/get-default-puller.js +1 -1
- package/out/replicache/src/hash.js +1 -1
- package/out/replicache/src/hash.js.map +1 -1
- package/out/replicache/src/impl.js +1 -2
- package/out/replicache/src/index-defs.js +5 -3
- package/out/replicache/src/index-defs.js.map +1 -1
- package/out/replicache/src/kv/expo-sqlite/store.js +1 -1
- package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
- package/out/replicache/src/kv/idb-store.js +1 -1
- package/out/replicache/src/kv/idb-store.js.map +1 -1
- package/out/replicache/src/kv/mem-fallback-store.js +1 -1
- package/out/replicache/src/kv/mem-fallback-store.js.map +1 -1
- package/out/replicache/src/kv/mem-store.js.map +1 -1
- package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
- package/out/replicache/src/kv/op-sqlite/types.js.map +1 -1
- package/out/replicache/src/kv/read-impl.js.map +1 -1
- package/out/replicache/src/kv/sqlite-store.js +1 -1
- package/out/replicache/src/kv/sqlite-store.js.map +1 -1
- package/out/replicache/src/kv/write-impl-base.js +4 -1
- package/out/replicache/src/kv/write-impl-base.js.map +1 -1
- package/out/replicache/src/kv/write-impl.js.map +1 -1
- package/out/replicache/src/log-options.js +2 -1
- package/out/replicache/src/log-options.js.map +1 -1
- package/out/replicache/src/make-idb-name.js +1 -1
- package/out/replicache/src/new-client-channel.js +9 -7
- package/out/replicache/src/new-client-channel.js.map +1 -1
- package/out/replicache/src/on-persist-channel.js +1 -1
- package/out/replicache/src/on-persist-channel.js.map +1 -1
- package/out/replicache/src/op-sqlite.js +1 -2
- package/out/replicache/src/pending-mutations.js +2 -1
- package/out/replicache/src/pending-mutations.js.map +1 -1
- package/out/replicache/src/persist/client-gc.js +2 -2
- package/out/replicache/src/persist/client-gc.js.map +1 -1
- package/out/replicache/src/persist/client-group-gc.js +2 -2
- package/out/replicache/src/persist/client-group-gc.js.map +1 -1
- package/out/replicache/src/persist/client-groups.js +1 -1
- package/out/replicache/src/persist/client-groups.js.map +1 -1
- package/out/replicache/src/persist/clients.js +1 -1
- package/out/replicache/src/persist/clients.js.map +1 -1
- package/out/replicache/src/persist/collect-idb-databases.js +5 -4
- package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
- package/out/replicache/src/persist/gather-mem-only-visitor.js.map +1 -1
- package/out/replicache/src/persist/gather-not-cached-visitor.js.map +1 -1
- package/out/replicache/src/persist/heartbeat.js +2 -2
- package/out/replicache/src/persist/heartbeat.js.map +1 -1
- package/out/replicache/src/persist/idb-databases-store.js +1 -1
- package/out/replicache/src/persist/idb-databases-store.js.map +1 -1
- package/out/replicache/src/persist/make-client-id.js +1 -1
- package/out/replicache/src/persist/make-client-id.js.map +1 -1
- package/out/replicache/src/persist/persist.js +3 -2
- package/out/replicache/src/persist/persist.js.map +1 -1
- package/out/replicache/src/persist/refresh.js +8 -5
- package/out/replicache/src/persist/refresh.js.map +1 -1
- package/out/replicache/src/process-scheduler.js.map +1 -1
- package/out/replicache/src/replicache-impl.js +3 -3
- package/out/replicache/src/replicache-impl.js.map +1 -1
- package/out/replicache/src/scan-iterator.js.map +1 -1
- package/out/replicache/src/scan-options.js +7 -6
- package/out/replicache/src/scan-options.js.map +1 -1
- package/out/replicache/src/sqlite.js +1 -2
- package/out/replicache/src/subscriptions.js +1 -1
- package/out/replicache/src/subscriptions.js.map +1 -1
- package/out/replicache/src/sync/diff.js +3 -1
- package/out/replicache/src/sync/diff.js.map +1 -1
- package/out/replicache/src/sync/ids.js.map +1 -1
- package/out/replicache/src/sync/patch.js +2 -4
- package/out/replicache/src/sync/patch.js.map +1 -1
- package/out/replicache/src/sync/pull.js +3 -1
- package/out/replicache/src/sync/pull.js.map +1 -1
- package/out/replicache/src/sync/push.js.map +1 -1
- package/out/replicache/src/sync/request-id.js +1 -1
- package/out/replicache/src/sync/request-id.js.map +1 -1
- package/out/replicache/src/transactions.js +1 -1
- package/out/replicache/src/transactions.js.map +1 -1
- package/out/shared/src/arrays.js +4 -1
- package/out/shared/src/arrays.js.map +1 -1
- package/out/shared/src/asserts.js +1 -1
- package/out/shared/src/bigint-json.d.ts +9 -0
- package/out/shared/src/bigint-json.d.ts.map +1 -1
- package/out/shared/src/bigint-json.js +27 -2
- package/out/shared/src/bigint-json.js.map +1 -1
- package/out/shared/src/broadcast-channel.js +1 -1
- package/out/shared/src/btree-set.js +11 -8
- package/out/shared/src/btree-set.js.map +1 -1
- package/out/shared/src/cache.js.map +1 -1
- package/out/shared/src/config.js +1 -1
- package/out/shared/src/custom-key-map.js.map +1 -1
- package/out/shared/src/custom-key-set.js.map +1 -1
- package/out/shared/src/deep-clone.js +1 -1
- package/out/shared/src/document-visible.js.map +1 -1
- package/out/shared/src/dotenv.js.map +1 -1
- package/out/shared/src/error.js +1 -1
- package/out/shared/src/error.js.map +1 -1
- package/out/shared/src/hash.js +2 -2
- package/out/shared/src/hash.js.map +1 -1
- package/out/shared/src/iterables.js.map +1 -1
- package/out/shared/src/json-schema.js.map +1 -1
- package/out/shared/src/json.js.map +1 -1
- package/out/shared/src/logging-test-utils.js +1 -1
- package/out/shared/src/logging.js +1 -1
- package/out/shared/src/logging.js.map +1 -1
- package/out/shared/src/navigator.js +1 -1
- package/out/shared/src/options.js +9 -12
- package/out/shared/src/options.js.map +1 -1
- package/out/shared/src/promise-race.js.map +1 -1
- package/out/shared/src/queue.js.map +1 -1
- package/out/shared/src/record-proxy.js.map +1 -1
- package/out/shared/src/ring-buffer.js.map +1 -1
- package/out/shared/src/size-of-value.js +7 -10
- package/out/shared/src/size-of-value.js.map +1 -1
- package/out/shared/src/sorted-entries.js.map +1 -1
- package/out/shared/src/tdigest-schema.js.map +1 -1
- package/out/shared/src/tdigest.js.map +1 -1
- package/out/shared/src/valita.js +1 -1
- package/out/shared/src/valita.js.map +1 -1
- package/out/z2s/src/compiler.js +2 -4
- package/out/z2s/src/compiler.js.map +1 -1
- package/out/z2s/src/sql.js +1 -1
- package/out/z2s/src/sql.js.map +1 -1
- package/out/zero/package.js +212 -189
- package/out/zero/package.js.map +1 -1
- package/out/zero/src/adapters/drizzle.js +1 -2
- package/out/zero/src/adapters/kysely.js +1 -2
- package/out/zero/src/adapters/pg.js +1 -2
- package/out/zero/src/adapters/postgresjs.js +1 -2
- package/out/zero/src/adapters/prisma.js +1 -2
- package/out/zero/src/analyze.js +1 -2
- package/out/zero/src/change-protocol/v0.js +1 -2
- package/out/zero/src/expo-sqlite.js +1 -2
- package/out/zero/src/op-sqlite.js +1 -2
- package/out/zero/src/react-native.js.map +1 -1
- package/out/zero/src/sqlite.js +1 -2
- package/out/zero/src/zero-cache-dev.js +10 -9
- package/out/zero/src/zero-cache-dev.js.map +1 -1
- package/out/zero/src/zero-out.js +2 -1
- package/out/zero/src/zero-out.js.map +1 -1
- package/out/zero-cache/src/auth/auth.js +1 -1
- package/out/zero-cache/src/auth/auth.js.map +1 -1
- package/out/zero-cache/src/auth/jwt.js +4 -1
- package/out/zero-cache/src/auth/jwt.js.map +1 -1
- package/out/zero-cache/src/auth/load-permissions.js.map +1 -1
- package/out/zero-cache/src/auth/read-authorizer.js +3 -2
- package/out/zero-cache/src/auth/read-authorizer.js.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.js +5 -16
- package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
- package/out/zero-cache/src/config/network.js +1 -1
- package/out/zero-cache/src/config/network.js.map +1 -1
- package/out/zero-cache/src/config/server-context.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +9 -0
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +17 -2
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/custom/fetch.js +1 -1
- package/out/zero-cache/src/custom/fetch.js.map +1 -1
- package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -1
- package/out/zero-cache/src/db/create.js.map +1 -1
- package/out/zero-cache/src/db/index-predicate.js.map +1 -1
- package/out/zero-cache/src/db/lite-tables.d.ts +2 -2
- package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
- package/out/zero-cache/src/db/lite-tables.js.map +1 -1
- package/out/zero-cache/src/db/migration-lite.js +1 -1
- package/out/zero-cache/src/db/migration-lite.js.map +1 -1
- package/out/zero-cache/src/db/migration.js +5 -3
- package/out/zero-cache/src/db/migration.js.map +1 -1
- package/out/zero-cache/src/db/pg-copy-binary.js +4 -3
- package/out/zero-cache/src/db/pg-copy-binary.js.map +1 -1
- package/out/zero-cache/src/db/pg-copy.js +0 -1
- package/out/zero-cache/src/db/pg-copy.js.map +1 -1
- package/out/zero-cache/src/db/pg-to-lite.js +1 -1
- package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
- package/out/zero-cache/src/db/run-transaction.js.map +1 -1
- package/out/zero-cache/src/db/specs.js +7 -5
- package/out/zero-cache/src/db/specs.js.map +1 -1
- package/out/zero-cache/src/db/sqlite-corruption.js.map +1 -1
- package/out/zero-cache/src/db/statements.d.ts.map +1 -1
- package/out/zero-cache/src/db/statements.js +9 -2
- package/out/zero-cache/src/db/statements.js.map +1 -1
- package/out/zero-cache/src/db/transaction-pool.js +5 -3
- package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
- package/out/zero-cache/src/db/warmup.js.map +1 -1
- package/out/zero-cache/src/observability/events.js.map +1 -1
- package/out/zero-cache/src/observability/log-throttle.js.map +1 -1
- package/out/zero-cache/src/observability/metrics.js.map +1 -1
- package/out/zero-cache/src/scripts/deploy-permissions.js +4 -2
- package/out/zero-cache/src/scripts/deploy-permissions.js.map +1 -1
- package/out/zero-cache/src/scripts/permissions.js.map +1 -1
- package/out/zero-cache/src/server/anonymous-otel-start.js +2 -1
- package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
- package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/server/change-streamer.js +2 -1
- package/out/zero-cache/src/server/change-streamer.js.map +1 -1
- package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
- package/out/zero-cache/src/server/logging.js +1 -1
- package/out/zero-cache/src/server/logging.js.map +1 -1
- package/out/zero-cache/src/server/main.js.map +1 -1
- package/out/zero-cache/src/server/otel-log-sink.js.map +1 -1
- package/out/zero-cache/src/server/otel-start.js.map +1 -1
- package/out/zero-cache/src/server/reaper.js +2 -2
- package/out/zero-cache/src/server/reaper.js.map +1 -1
- package/out/zero-cache/src/server/replicator.js.map +1 -1
- package/out/zero-cache/src/server/runner/run-worker.js +2 -1
- package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
- package/out/zero-cache/src/server/runner/runtime.js +2 -1
- package/out/zero-cache/src/server/runner/runtime.js.map +1 -1
- package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
- package/out/zero-cache/src/server/shadow-syncer.js +1 -1
- package/out/zero-cache/src/server/shadow-syncer.js.map +1 -1
- package/out/zero-cache/src/server/slot-keeper.js.map +1 -1
- package/out/zero-cache/src/server/syncer-assigner.js.map +1 -1
- package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/server/syncer.js +6 -1
- package/out/zero-cache/src/server/syncer.js.map +1 -1
- package/out/zero-cache/src/server/worker-dispatcher.js +1 -1
- package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -1
- package/out/zero-cache/src/server/worker-urls.js.map +1 -1
- package/out/zero-cache/src/services/analyze.js +1 -1
- package/out/zero-cache/src/services/analyze.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/backfill-manager.js +1 -1
- package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/init-cleanup.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/replica-restore.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/replica-schema.js +3 -3
- package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.js +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-metadata.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +3 -3
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source-init.js +2 -2
- package/out/zero-cache/src/services/change-source/pg/change-source-init.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.js +4 -6
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/decommission.js +2 -1
- package/out/zero-cache/src/services/change-source/pg/decommission.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +1 -0
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js +10 -8
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +3 -2
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/lsn.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js +2 -2
- package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slot-health.js +1 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slot-health.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slots.js +3 -3
- package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +3 -3
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js +13 -12
- package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.js +8 -8
- package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/published.js +3 -2
- package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +2 -2
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js +13 -10
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/validation.js +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/validation.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js +1 -1
- package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/control.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/status.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current.js +1 -1
- package/out/zero-cache/src/services/change-source/protocol/mod.js +1 -2
- package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backfill-state.js +1 -1
- package/out/zero-cache/src/services/change-streamer/backfill-state.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/broadcast.js +1 -1
- package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts +1 -1
- package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-log-codec.js +2 -3
- package/out/zero-cache/src/services/change-streamer/change-log-codec.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-log-initializer.js +2 -2
- package/out/zero-cache/src/services/change-streamer/change-log-initializer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +4 -2
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +21 -21
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.js +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/drain-tracker.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/forwarder.js +11 -10
- package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js +1 -1
- package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.js +3 -3
- package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/replica-poller.js +1 -1
- package/out/zero-cache/src/services/change-streamer/replica-poller.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/restore-admission.js +12 -1
- package/out/zero-cache/src/services/change-streamer/restore-admission.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/init.js +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.js +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot-message.js +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot-message.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.js +2 -2
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-read-router.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js +4 -6
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js +1 -3
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js +2 -2
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscribe.js +1 -1
- package/out/zero-cache/src/services/change-streamer/subscribe.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.js +2 -2
- package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/upstream-acker.js +0 -1
- package/out/zero-cache/src/services/change-streamer/upstream-acker.js.map +1 -1
- package/out/zero-cache/src/services/heapz.js +2 -1
- package/out/zero-cache/src/services/heapz.js.map +1 -1
- package/out/zero-cache/src/services/http-service.js.map +1 -1
- package/out/zero-cache/src/services/life-cycle.js +1 -1
- package/out/zero-cache/src/services/life-cycle.js.map +1 -1
- package/out/zero-cache/src/services/limiter/sliding-window-limiter.js +4 -2
- package/out/zero-cache/src/services/limiter/sliding-window-limiter.js.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.js +1 -1
- package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
- package/out/zero-cache/src/services/litestream/litestream-checkpointer.js +2 -2
- package/out/zero-cache/src/services/litestream/litestream-checkpointer.js.map +1 -1
- package/out/zero-cache/src/services/litestream/litestream-controller.js.map +1 -1
- package/out/zero-cache/src/services/litestream/metrics.js.map +1 -1
- package/out/zero-cache/src/services/litestream/restore-progress.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/pusher.js +3 -2
- package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
- package/out/zero-cache/src/services/plannerz.js +4 -3
- package/out/zero-cache/src/services/plannerz.js.map +1 -1
- package/out/zero-cache/src/services/profz.js +5 -3
- package/out/zero-cache/src/services/profz.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-log-cookies.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-log-db.js +3 -2
- package/out/zero-cache/src/services/replicator/change-log-db.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-log-stream-writer.js +1 -1
- package/out/zero-cache/src/services/replicator/change-log-stream-writer.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
- package/out/zero-cache/src/services/replicator/drain-handler.js.map +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.js +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
- package/out/zero-cache/src/services/replicator/notifier.js.map +1 -1
- package/out/zero-cache/src/services/replicator/replication-status.js +4 -3
- package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
- package/out/zero-cache/src/services/replicator/reporter/recorder.js +1 -1
- package/out/zero-cache/src/services/replicator/reporter/recorder.js.map +1 -1
- package/out/zero-cache/src/services/replicator/reporter/report-schema.js +1 -1
- package/out/zero-cache/src/services/replicator/reporter/report-schema.js.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/backfilling.js +1 -1
- package/out/zero-cache/src/services/replicator/schema/backfilling.js.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/change-log.d.ts +19 -7
- package/out/zero-cache/src/services/replicator/schema/change-log.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/change-log.js +31 -15
- package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/column-metadata.js +1 -1
- package/out/zero-cache/src/services/replicator/schema/column-metadata.js.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/replication-state.js +10 -7
- package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/table-metadata.js.map +1 -1
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js +1 -1
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js.map +1 -1
- package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.js +1 -1
- package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.js.map +1 -1
- package/out/zero-cache/src/services/replicator/write-worker-client.js +1 -1
- package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
- package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
- package/out/zero-cache/src/services/run-ast.js.map +1 -1
- package/out/zero-cache/src/services/runner.js.map +1 -1
- package/out/zero-cache/src/services/running-state.js.map +1 -1
- package/out/zero-cache/src/services/shadow-sync/shadow-sync-service.js.map +1 -1
- package/out/zero-cache/src/services/statz.js +2 -1
- package/out/zero-cache/src/services/statz.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/active-users-gauge.js +2 -2
- package/out/zero-cache/src/services/view-syncer/active-users-gauge.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/advancement-metrics.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/batch-pacer.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +18 -0
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.js +70 -23
- package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-schema.d.ts +15 -2
- package/out/zero-cache/src/services/view-syncer/client-schema.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-schema.js +46 -6
- package/out/zero-cache/src/services/view-syncer/client-schema.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/connection-context-manager.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-purger.js +2 -2
- package/out/zero-cache/src/services/view-syncer/cvr-purger.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.js +10 -5
- package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.js +12 -4
- package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js +1 -1
- package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/hydration-budget.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js +2 -2
- package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/inspect-handler.js +5 -3
- package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +8 -5
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/plan-warnings.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/push-cost.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/push-cutoff.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/query-covering.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/query-shape.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/query-stats.js +1 -1
- package/out/zero-cache/src/services/view-syncer/query-stats.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/cvr.js +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/types.js +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js +7 -1
- package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +12 -4
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.js +11 -7
- package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/ttl-clock.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.js +13 -9
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/error-with-level.js.map +1 -1
- package/out/zero-cache/src/types/lexi-version.js.map +1 -1
- package/out/zero-cache/src/types/lite.js +1 -1
- package/out/zero-cache/src/types/lite.js.map +1 -1
- package/out/zero-cache/src/types/pg-data-type.js +1 -1
- package/out/zero-cache/src/types/pg-data-type.js.map +1 -1
- package/out/zero-cache/src/types/pg.js +6 -4
- package/out/zero-cache/src/types/pg.js.map +1 -1
- package/out/zero-cache/src/types/poke-chunk.js +2 -2
- package/out/zero-cache/src/types/poke-chunk.js.map +1 -1
- package/out/zero-cache/src/types/processes.js +1 -1
- package/out/zero-cache/src/types/processes.js.map +1 -1
- package/out/zero-cache/src/types/profiler.js.map +1 -1
- package/out/zero-cache/src/types/row-key.js.map +1 -1
- package/out/zero-cache/src/types/sql.js.map +1 -1
- package/out/zero-cache/src/types/streams.js +10 -9
- package/out/zero-cache/src/types/streams.js.map +1 -1
- package/out/zero-cache/src/types/strings.js.map +1 -1
- package/out/zero-cache/src/types/subscription.js.map +1 -1
- package/out/zero-cache/src/types/timeout.js +1 -1
- package/out/zero-cache/src/types/websocket-handoff.js +1 -1
- package/out/zero-cache/src/types/ws.js +1 -1
- package/out/zero-cache/src/workers/connection.js +2 -3
- package/out/zero-cache/src/workers/connection.js.map +1 -1
- package/out/zero-cache/src/workers/mutator.js.map +1 -1
- package/out/zero-cache/src/workers/replicator.js +5 -4
- package/out/zero-cache/src/workers/replicator.js.map +1 -1
- package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +1 -1
- package/out/zero-cache/src/workers/syncer-ws-message-handler.js +9 -1
- package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
- package/out/zero-cache/src/workers/syncer.js +2 -2
- package/out/zero-cache/src/workers/syncer.js.map +1 -1
- package/out/zero-client/src/client/active-clients-manager.js +1 -1
- package/out/zero-client/src/client/active-clients-manager.js.map +1 -1
- package/out/zero-client/src/client/bindings.js +11 -11
- package/out/zero-client/src/client/connection-manager.js.map +1 -1
- package/out/zero-client/src/client/connection.js +1 -1
- package/out/zero-client/src/client/connection.js.map +1 -1
- package/out/zero-client/src/client/context.js.map +1 -1
- package/out/zero-client/src/client/crud-impl.js +1 -1
- package/out/zero-client/src/client/crud-impl.js.map +1 -1
- package/out/zero-client/src/client/crud.js +1 -1
- package/out/zero-client/src/client/crud.js.map +1 -1
- package/out/zero-client/src/client/custom.js +1 -1
- package/out/zero-client/src/client/custom.js.map +1 -1
- package/out/zero-client/src/client/delete-clients-manager.js.map +1 -1
- package/out/zero-client/src/client/enable-analytics.js +1 -1
- package/out/zero-client/src/client/enable-analytics.js.map +1 -1
- package/out/zero-client/src/client/error.js.map +1 -1
- package/out/zero-client/src/client/inspector/client-group.js.map +1 -1
- package/out/zero-client/src/client/inspector/client.js.map +1 -1
- package/out/zero-client/src/client/inspector/html-dialog-prompt.js +1 -1
- package/out/zero-client/src/client/inspector/html-dialog-prompt.js.map +1 -1
- package/out/zero-client/src/client/inspector/inspector.js.map +1 -1
- package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -1
- package/out/zero-client/src/client/inspector/query.js.map +1 -1
- package/out/zero-client/src/client/ivm-branch.js +1 -3
- package/out/zero-client/src/client/ivm-branch.js.map +1 -1
- package/out/zero-client/src/client/keys.js +2 -1
- package/out/zero-client/src/client/keys.js.map +1 -1
- package/out/zero-client/src/client/log-options.js.map +1 -1
- package/out/zero-client/src/client/make-replicache-mutators.js +5 -3
- package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
- package/out/zero-client/src/client/metrics.js +3 -5
- package/out/zero-client/src/client/metrics.js.map +1 -1
- package/out/zero-client/src/client/mutation-tracker.js.map +1 -1
- package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
- package/out/zero-client/src/client/options.js.map +1 -1
- package/out/zero-client/src/client/query-manager.js +2 -2
- package/out/zero-client/src/client/query-manager.js.map +1 -1
- package/out/zero-client/src/client/reload-error-handler.js +4 -3
- package/out/zero-client/src/client/reload-error-handler.js.map +1 -1
- package/out/zero-client/src/client/version.js +1 -1
- package/out/zero-client/src/client/zero-poke-handler.js +1 -1
- package/out/zero-client/src/client/zero-poke-handler.js.map +1 -1
- package/out/zero-client/src/client/zero-rep.js.map +1 -1
- package/out/zero-client/src/client/zero.js +19 -11
- package/out/zero-client/src/client/zero.js.map +1 -1
- package/out/zero-client/src/mod.js +23 -23
- package/out/zero-client/src/util/nanoid.js.map +1 -1
- package/out/zero-permissions/src/permissions.js +3 -2
- package/out/zero-permissions/src/permissions.js.map +1 -1
- package/out/zero-pg/src/mod.js +9 -9
- package/out/zero-protocol/src/analyze-query-result.js +1 -1
- package/out/zero-protocol/src/analyze-query-result.js.map +1 -1
- package/out/zero-protocol/src/application-error.js.map +1 -1
- package/out/zero-protocol/src/ast.js +19 -9
- package/out/zero-protocol/src/ast.js.map +1 -1
- package/out/zero-protocol/src/change-desired-queries.js.map +1 -1
- package/out/zero-protocol/src/client-schema.js +1 -1
- package/out/zero-protocol/src/client-schema.js.map +1 -1
- package/out/zero-protocol/src/close-connection.js +1 -1
- package/out/zero-protocol/src/close-connection.js.map +1 -1
- package/out/zero-protocol/src/connect.js +1 -1
- package/out/zero-protocol/src/connect.js.map +1 -1
- package/out/zero-protocol/src/custom-queries.js +1 -1
- package/out/zero-protocol/src/custom-queries.js.map +1 -1
- package/out/zero-protocol/src/data.js +4 -2
- package/out/zero-protocol/src/data.js.map +1 -1
- package/out/zero-protocol/src/delete-clients.js.map +1 -1
- package/out/zero-protocol/src/down.d.ts +27 -27
- package/out/zero-protocol/src/down.js.map +1 -1
- package/out/zero-protocol/src/error.js.map +1 -1
- package/out/zero-protocol/src/inspect-down.js +1 -1
- package/out/zero-protocol/src/inspect-down.js.map +1 -1
- package/out/zero-protocol/src/inspect-up.js +1 -1
- package/out/zero-protocol/src/inspect-up.js.map +1 -1
- package/out/zero-protocol/src/mutate-server.js +1 -1
- package/out/zero-protocol/src/mutate-server.js.map +1 -1
- package/out/zero-protocol/src/mutation-id.js.map +1 -1
- package/out/zero-protocol/src/mutation.js +1 -1
- package/out/zero-protocol/src/mutation.js.map +1 -1
- package/out/zero-protocol/src/mutations-patch.js +1 -1
- package/out/zero-protocol/src/mutations-patch.js.map +1 -1
- package/out/zero-protocol/src/ping.js +1 -1
- package/out/zero-protocol/src/ping.js.map +1 -1
- package/out/zero-protocol/src/poke.js +1 -1
- package/out/zero-protocol/src/poke.js.map +1 -1
- package/out/zero-protocol/src/pong.js +1 -1
- package/out/zero-protocol/src/pong.js.map +1 -1
- package/out/zero-protocol/src/primary-key.js.map +1 -1
- package/out/zero-protocol/src/protocol-version.js +1 -0
- package/out/zero-protocol/src/protocol-version.js.map +1 -1
- package/out/zero-protocol/src/pull.js +1 -1
- package/out/zero-protocol/src/pull.js.map +1 -1
- package/out/zero-protocol/src/push.js +1 -1
- package/out/zero-protocol/src/push.js.map +1 -1
- package/out/zero-protocol/src/queries-patch.js +1 -1
- package/out/zero-protocol/src/queries-patch.js.map +1 -1
- package/out/zero-protocol/src/query-hash-visitor.js.map +1 -1
- package/out/zero-protocol/src/query-hash.js +2 -2
- package/out/zero-protocol/src/query-server.js +1 -1
- package/out/zero-protocol/src/query-server.js.map +1 -1
- package/out/zero-protocol/src/row-patch.js.map +1 -1
- package/out/zero-protocol/src/up.js.map +1 -1
- package/out/zero-protocol/src/update-auth.js.map +1 -1
- package/out/zero-protocol/src/version.js.map +1 -1
- package/out/zero-react/src/bindings.js +11 -11
- package/out/zero-react/src/mod.js +5 -5
- package/out/zero-react/src/use-query.js +1 -1
- package/out/zero-react/src/use-query.js.map +1 -1
- package/out/zero-react/src/zero-provider.d.ts +1 -1
- package/out/zero-react/src/zero-provider.d.ts.map +1 -1
- package/out/zero-react/src/zero-provider.js +2 -1
- package/out/zero-react/src/zero-provider.js.map +1 -1
- package/out/zero-react/src/zero.js +23 -23
- package/out/zero-schema/src/builder/schema-builder.js +3 -2
- package/out/zero-schema/src/builder/schema-builder.js.map +1 -1
- package/out/zero-schema/src/builder/table-builder.js +1 -1
- package/out/zero-schema/src/builder/table-builder.js.map +1 -1
- package/out/zero-schema/src/compiled-permissions.js.map +1 -1
- package/out/zero-schema/src/name-mapper.js +7 -5
- package/out/zero-schema/src/name-mapper.js.map +1 -1
- package/out/zero-schema/src/schema-config.js +1 -1
- package/out/zero-schema/src/schema-config.js.map +1 -1
- package/out/zero-server/src/adapters/drizzle.js.map +1 -1
- package/out/zero-server/src/adapters/kysely.js.map +1 -1
- package/out/zero-server/src/adapters/pg.js.map +1 -1
- package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
- package/out/zero-server/src/adapters/prisma.js.map +1 -1
- package/out/zero-server/src/closable-db-transaction.js.map +1 -1
- package/out/zero-server/src/custom.js +1 -1
- package/out/zero-server/src/custom.js.map +1 -1
- package/out/zero-server/src/mod.js +8 -8
- package/out/zero-server/src/process-mutations.js.map +1 -1
- package/out/zero-server/src/push-processor.js.map +1 -1
- package/out/zero-server/src/queries/process-queries.js +2 -1
- package/out/zero-server/src/queries/process-queries.js.map +1 -1
- package/out/zero-server/src/schema.js +7 -7
- package/out/zero-server/src/schema.js.map +1 -1
- package/out/zero-server/src/zql-database.js.map +1 -1
- package/out/zero-solid/src/bindings.js +11 -11
- package/out/zero-solid/src/mod.js +5 -5
- package/out/zero-solid/src/solid-view.js +1 -1
- package/out/zero-solid/src/solid-view.js.map +1 -1
- package/out/zero-solid/src/use-connection-state.js +2 -1
- package/out/zero-solid/src/use-connection-state.js.map +1 -1
- package/out/zero-solid/src/use-query.js.map +1 -1
- package/out/zero-solid/src/use-zero-online.js +2 -1
- package/out/zero-solid/src/use-zero-online.js.map +1 -1
- package/out/zero-solid/src/use-zero.js +3 -2
- package/out/zero-solid/src/use-zero.js.map +1 -1
- package/out/zero-solid/src/zero.js +23 -23
- package/out/zero-types/src/name-mapper.js.map +1 -1
- package/out/zql/src/builder/builder.js +15 -13
- package/out/zql/src/builder/builder.js.map +1 -1
- package/out/zql/src/builder/correlated-predicate-pushdown.js.map +1 -1
- package/out/zql/src/builder/debug-delegate.js.map +1 -1
- package/out/zql/src/builder/like.js +0 -1
- package/out/zql/src/builder/like.js.map +1 -1
- package/out/zql/src/ivm/array-view.js.map +1 -1
- package/out/zql/src/ivm/cap.js +2 -4
- package/out/zql/src/ivm/cap.js.map +1 -1
- package/out/zql/src/ivm/constraint.js +1 -1
- package/out/zql/src/ivm/constraint.js.map +1 -1
- package/out/zql/src/ivm/data.js.map +1 -1
- package/out/zql/src/ivm/deferred-input.js.map +1 -1
- package/out/zql/src/ivm/exists.js +20 -18
- package/out/zql/src/ivm/exists.js.map +1 -1
- package/out/zql/src/ivm/fan-in.js.map +1 -1
- package/out/zql/src/ivm/fan-out.js.map +1 -1
- package/out/zql/src/ivm/filter-operators.js +1 -1
- package/out/zql/src/ivm/filter-operators.js.map +1 -1
- package/out/zql/src/ivm/filter-push.js.map +1 -1
- package/out/zql/src/ivm/filter.js.map +1 -1
- package/out/zql/src/ivm/flipped-join.js +1 -3
- package/out/zql/src/ivm/flipped-join.js.map +1 -1
- package/out/zql/src/ivm/join-index-tap.js.map +1 -1
- package/out/zql/src/ivm/join-index.js.map +1 -1
- package/out/zql/src/ivm/join-utils.js +11 -13
- package/out/zql/src/ivm/join-utils.js.map +1 -1
- package/out/zql/src/ivm/join.js.map +1 -1
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
- package/out/zql/src/ivm/memory-source.js +26 -22
- package/out/zql/src/ivm/memory-source.js.map +1 -1
- package/out/zql/src/ivm/memory-storage.js.map +1 -1
- package/out/zql/src/ivm/operator.js +2 -2
- package/out/zql/src/ivm/push-accumulated.js +0 -1
- package/out/zql/src/ivm/push-accumulated.js.map +1 -1
- package/out/zql/src/ivm/skip-yields.js.map +1 -1
- package/out/zql/src/ivm/skip.js.map +1 -1
- package/out/zql/src/ivm/take-gate.js.map +1 -1
- package/out/zql/src/ivm/take.js +3 -5
- package/out/zql/src/ivm/take.js.map +1 -1
- package/out/zql/src/ivm/union-fan-in.js +1 -1
- package/out/zql/src/ivm/union-fan-in.js.map +1 -1
- package/out/zql/src/ivm/union-fan-out.js.map +1 -1
- package/out/zql/src/ivm/view-apply-change.js +1 -1
- package/out/zql/src/ivm/view-apply-change.js.map +1 -1
- package/out/zql/src/mutate/crud.js +3 -2
- package/out/zql/src/mutate/crud.js.map +1 -1
- package/out/zql/src/planner/planner-builder.js +1 -1
- package/out/zql/src/planner/planner-builder.js.map +1 -1
- package/out/zql/src/planner/planner-connection.js.map +1 -1
- package/out/zql/src/planner/planner-debug.js.map +1 -1
- package/out/zql/src/planner/planner-fan-in.js.map +1 -1
- package/out/zql/src/planner/planner-fan-out.js.map +1 -1
- package/out/zql/src/planner/planner-filter.js.map +1 -1
- package/out/zql/src/planner/planner-graph.js +1 -5
- package/out/zql/src/planner/planner-graph.js.map +1 -1
- package/out/zql/src/planner/planner-join.js +1 -1
- package/out/zql/src/planner/planner-join.js.map +1 -1
- package/out/zql/src/planner/planner-source.js.map +1 -1
- package/out/zql/src/planner/planner-terminus.js.map +1 -1
- package/out/zql/src/query/create-builder.js +2 -1
- package/out/zql/src/query/create-builder.js.map +1 -1
- package/out/zql/src/query/expression.js +1 -1
- package/out/zql/src/query/expression.js.map +1 -1
- package/out/zql/src/query/measure-push-operator.js.map +1 -1
- package/out/zql/src/query/named.js +2 -1
- package/out/zql/src/query/named.js.map +1 -1
- package/out/zql/src/query/query-delegate-base.js +1 -1
- package/out/zql/src/query/query-delegate-base.js.map +1 -1
- package/out/zql/src/query/query-impl.js +3 -2
- package/out/zql/src/query/query-impl.js.map +1 -1
- package/out/zql/src/query/query-registry.js +1 -1
- package/out/zql/src/query/query-registry.js.map +1 -1
- package/out/zql/src/query/query-transitions.js +1 -1
- package/out/zql/src/query/query-transitions.js.map +1 -1
- package/out/zql/src/query/runnable-query-impl.js +3 -2
- package/out/zql/src/query/runnable-query-impl.js.map +1 -1
- package/out/zql/src/query/static-query.js.map +1 -1
- package/out/zql/src/query/ttl.js +8 -8
- package/out/zql/src/query/ttl.js.map +1 -1
- package/out/zql/src/query/validate-input.js.map +1 -1
- package/out/zqlite/src/database-storage.d.ts +27 -8
- package/out/zqlite/src/database-storage.d.ts.map +1 -1
- package/out/zqlite/src/database-storage.js +195 -26
- package/out/zqlite/src/database-storage.js.map +1 -1
- package/out/zqlite/src/db.d.ts +47 -1
- package/out/zqlite/src/db.d.ts.map +1 -1
- package/out/zqlite/src/db.js +121 -21
- package/out/zqlite/src/db.js.map +1 -1
- package/out/zqlite/src/explain-queries.js.map +1 -1
- package/out/zqlite/src/fetch-sql.d.ts +27 -0
- package/out/zqlite/src/fetch-sql.d.ts.map +1 -0
- package/out/zqlite/src/fetch-sql.js +112 -0
- package/out/zqlite/src/fetch-sql.js.map +1 -0
- package/out/zqlite/src/index-usage.js.map +1 -1
- package/out/zqlite/src/internal/sql-inline.js.map +1 -1
- package/out/zqlite/src/internal/sql.js.map +1 -1
- package/out/zqlite/src/internal/statement-cache.d.ts +7 -0
- package/out/zqlite/src/internal/statement-cache.d.ts.map +1 -1
- package/out/zqlite/src/internal/statement-cache.js +11 -4
- package/out/zqlite/src/internal/statement-cache.js.map +1 -1
- package/out/zqlite/src/mod.js +5 -5
- package/out/zqlite/src/pending-delta.js.map +1 -1
- package/out/zqlite/src/query-builder.d.ts +11 -1
- package/out/zqlite/src/query-builder.d.ts.map +1 -1
- package/out/zqlite/src/query-builder.js +22 -7
- package/out/zqlite/src/query-builder.js.map +1 -1
- package/out/zqlite/src/query-delegate.js.map +1 -1
- package/out/zqlite/src/resolve-scalar-subqueries.js +2 -5
- package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
- package/out/zqlite/src/sqlite-cost-model.js +3 -2
- package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
- package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
- package/out/zqlite/src/table-source.d.ts +20 -2
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +73 -39
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +17 -15
- package/out/otel/src/maybe-time.d.ts +0 -3
- package/out/otel/src/maybe-time.d.ts.map +0 -1
- package/out/otel/src/maybe-time.js +0 -15
- package/out/otel/src/maybe-time.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ttl.js","names":[],"sources":["../../../../../zql/src/query/ttl.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\n\nexport type TimeUnit = 's' | 'm' | 'h' | 'd' | 'y';\n\n/**\n * Time To Live. This is used for query expiration.\n * - `forever` means the query will never expire.\n * - `none` means the query will expire immediately.\n * - A number means the query will expire after that many milliseconds.\n * - A negative number means the query will never expire, this is same as 'forever'.\n * - A string like `1s` means the query will expire after that many seconds.\n * - A string like `1m` means the query will expire after that many minutes.\n * - A string like `1h` means the query will expire after that many hours.\n * - A string like `1d` means the query will expire after that many days.\n * - A string like `1y` means the query will expire after that many years.\n */\nexport type TTL = `${number}${TimeUnit}` | 'forever' | 'none' | number;\n\nexport const DEFAULT_TTL: TTL = '5m';\nexport const DEFAULT_TTL_MS = 1_000 * 60 * 5;\n\nexport const DEFAULT_PRELOAD_TTL: TTL = 'none';\nexport const DEFAULT_PRELOAD_TTL_MS = 0;\n\nexport const MAX_TTL: TTL = '10m';\nexport const MAX_TTL_MS = 1_000 * 60 * 10;\n\nconst multiplier = {\n s: 1000,\n m: 60 * 1000,\n h: 60 * 60 * 1000,\n d: 24 * 60 * 60 * 1000,\n y: 365 * 24 * 60 * 60 * 1000,\n} as const;\n\nexport function parseTTL(ttl: TTL): number {\n if (typeof ttl === 'number') {\n return Number.isNaN(ttl) ? 0 : !Number.isFinite(ttl) || ttl < 0 ? -1 : ttl;\n }\n if (ttl === 'none') {\n return 0;\n }\n if (ttl === 'forever') {\n return -1;\n }\n const multi = multiplier[ttl.at(-1) as TimeUnit];\n return Number(ttl.slice(0, -1)) * multi;\n}\n\nexport function compareTTL(a: TTL, b: TTL): number {\n const ap = parseTTL(a);\n const bp = parseTTL(b);\n if (ap === -1 && bp !== -1) {\n return 1;\n }\n if (ap !== -1 && bp === -1) {\n return -1;\n }\n return ap - bp;\n}\n\nexport function normalizeTTL(ttl: TTL): TTL {\n if (typeof ttl === 'string') {\n return ttl;\n }\n\n if (ttl < 0) {\n return 'forever';\n }\n\n if (ttl === 0) {\n return 'none';\n }\n\n let shortest = ttl.toString();\n const lengthOfNumber = shortest.length;\n for (const unit of ['y', 'd', 'h', 'm', 's'] as const) {\n const multi = multiplier[unit];\n const value = ttl / multi;\n const candidate = `${value}${unit}`;\n if (candidate.length < shortest.length) {\n shortest = candidate;\n }\n }\n\n return (shortest.length < lengthOfNumber ? shortest : ttl) as TTL;\n}\n\nexport function clampTTL(ttl: TTL, lc?: Pick<LogContext, 'warn'>): number {\n const parsedTTL = parseTTL(ttl);\n if (parsedTTL === -1 || parsedTTL > 10 * 60 * 1000) {\n // 10 minutes in milliseconds\n lc?.warn?.(`TTL (${ttl}) is too high, clamping to ${MAX_TTL}`);\n return parseTTL(MAX_TTL);\n }\n return parsedTTL;\n}\n"],"mappings":";AAmBA,IAAa,iBAAiB
|
|
1
|
+
{"version":3,"file":"ttl.js","names":[],"sources":["../../../../../zql/src/query/ttl.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\n\nexport type TimeUnit = 's' | 'm' | 'h' | 'd' | 'y';\n\n/**\n * Time To Live. This is used for query expiration.\n * - `forever` means the query will never expire.\n * - `none` means the query will expire immediately.\n * - A number means the query will expire after that many milliseconds.\n * - A negative number means the query will never expire, this is same as 'forever'.\n * - A string like `1s` means the query will expire after that many seconds.\n * - A string like `1m` means the query will expire after that many minutes.\n * - A string like `1h` means the query will expire after that many hours.\n * - A string like `1d` means the query will expire after that many days.\n * - A string like `1y` means the query will expire after that many years.\n */\nexport type TTL = `${number}${TimeUnit}` | 'forever' | 'none' | number;\n\nexport const DEFAULT_TTL: TTL = '5m';\nexport const DEFAULT_TTL_MS = 1_000 * 60 * 5;\n\nexport const DEFAULT_PRELOAD_TTL: TTL = 'none';\nexport const DEFAULT_PRELOAD_TTL_MS = 0;\n\nexport const MAX_TTL: TTL = '10m';\nexport const MAX_TTL_MS = 1_000 * 60 * 10;\n\nconst multiplier = {\n s: 1000,\n m: 60 * 1000,\n h: 60 * 60 * 1000,\n d: 24 * 60 * 60 * 1000,\n y: 365 * 24 * 60 * 60 * 1000,\n} as const;\n\nexport function parseTTL(ttl: TTL): number {\n if (typeof ttl === 'number') {\n return Number.isNaN(ttl) ? 0 : !Number.isFinite(ttl) || ttl < 0 ? -1 : ttl;\n }\n if (ttl === 'none') {\n return 0;\n }\n if (ttl === 'forever') {\n return -1;\n }\n const multi = multiplier[ttl.at(-1) as TimeUnit];\n return Number(ttl.slice(0, -1)) * multi;\n}\n\nexport function compareTTL(a: TTL, b: TTL): number {\n const ap = parseTTL(a);\n const bp = parseTTL(b);\n if (ap === -1 && bp !== -1) {\n return 1;\n }\n if (ap !== -1 && bp === -1) {\n return -1;\n }\n return ap - bp;\n}\n\nexport function normalizeTTL(ttl: TTL): TTL {\n if (typeof ttl === 'string') {\n return ttl;\n }\n\n if (ttl < 0) {\n return 'forever';\n }\n\n if (ttl === 0) {\n return 'none';\n }\n\n let shortest = ttl.toString();\n const lengthOfNumber = shortest.length;\n for (const unit of ['y', 'd', 'h', 'm', 's'] as const) {\n const multi = multiplier[unit];\n const value = ttl / multi;\n const candidate = `${value}${unit}`;\n if (candidate.length < shortest.length) {\n shortest = candidate;\n }\n }\n\n return (shortest.length < lengthOfNumber ? shortest : ttl) as TTL;\n}\n\nexport function clampTTL(ttl: TTL, lc?: Pick<LogContext, 'warn'>): number {\n const parsedTTL = parseTTL(ttl);\n if (parsedTTL === -1 || parsedTTL > 10 * 60 * 1000) {\n // 10 minutes in milliseconds\n lc?.warn?.(`TTL (${ttl}) is too high, clamping to ${MAX_TTL}`);\n return parseTTL(MAX_TTL);\n }\n return parsedTTL;\n}\n"],"mappings":";AAmBA,IAAa,iBAAiB;AAM9B,IAAa,aAAa;AAE1B,IAAM,aAAa;CACjB,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACL;AAEA,SAAgB,SAAS,KAAkB;CACzC,IAAI,OAAO,QAAQ,UACjB,OAAO,OAAO,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,SAAS,GAAG,KAAK,MAAM,IAAI,KAAK;CAEzE,IAAI,QAAQ,QACV,OAAO;CAET,IAAI,QAAQ,WACV,OAAO;CAET,MAAM,QAAQ,WAAW,IAAI,GAAG,EAAE;CAClC,OAAO,OAAO,IAAI,MAAM,GAAG,EAAE,CAAC,IAAI;AACpC;AAEA,SAAgB,WAAW,GAAQ,GAAgB;CACjD,MAAM,KAAK,SAAS,CAAC;CACrB,MAAM,KAAK,SAAS,CAAC;CACrB,IAAI,OAAO,MAAM,OAAO,IACtB,OAAO;CAET,IAAI,OAAO,MAAM,OAAO,IACtB,OAAO;CAET,OAAO,KAAK;AACd;AAEA,SAAgB,aAAa,KAAe;CAC1C,IAAI,OAAO,QAAQ,UACjB,OAAO;CAGT,IAAI,MAAM,GACR,OAAO;CAGT,IAAI,QAAQ,GACV,OAAO;CAGT,IAAI,WAAW,IAAI,SAAS;CAC5B,MAAM,iBAAiB,SAAS;CAChC,KAAK,MAAM,QAAQ;EAAC;EAAK;EAAK;EAAK;EAAK;CAAG,GAAY;EAGrD,MAAM,YAAY,GADJ,MADA,WAAW,QAEI;EAC7B,IAAI,UAAU,SAAS,SAAS,QAC9B,WAAW;CAEf;CAEA,OAAQ,SAAS,SAAS,iBAAiB,WAAW;AACxD;AAEA,SAAgB,SAAS,KAAU,IAAuC;CACxE,MAAM,YAAY,SAAS,GAAG;CAC9B,IAAI,cAAc,MAAM,YAAY,KAAgB;EAElD,IAAI,OAAO,QAAQ,IAAI,+BAAsC;EAC7D,OAAO,SAAA,KAAgB;CACzB;CACA,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-input.js","names":[],"sources":["../../../../../zql/src/query/validate-input.ts"],"sourcesContent":["import type {StandardSchemaV1} from '@standard-schema/spec';\n\nexport class InputValidationError extends Error {\n readonly result: StandardSchemaV1.FailureResult;\n\n // will get picked up by `getErrorDetails` when mapping to an `ApplicationError`\n readonly details: {\n type: 'InputValidationError';\n result: StandardSchemaV1.FailureResult;\n };\n\n constructor(message: string, result: StandardSchemaV1.FailureResult) {\n super(message);\n this.name = 'InputValidationError';\n this.result = result;\n this.details = {type: 'InputValidationError', result};\n }\n}\n\n/**\n * Validates input using a StandardSchema validator if provided.\n * This is shared validation logic used by both defineQuery and defineMutator.\n *\n * @param name - The name of the query or mutator (for error messages)\n * @param input - The input value to validate\n * @param validator - Optional StandardSchema validator\n * @param kind - Type of definition ('query' or 'mutator') for error messages\n * @returns The validated output (either transformed by validator or input as-is)\n * @throws Error if validation fails or if an async validator is used\n * @internal\n */\nexport function validateInput<TInput, TOutput>(\n name: string,\n input: TInput,\n validator: StandardSchemaV1<TInput, TOutput> | undefined,\n kind: 'query' | 'mutator',\n): TOutput {\n if (!validator) {\n // No validator, so input and output are the same\n return input as unknown as TOutput;\n }\n\n const result = validator['~standard'].validate(input);\n if (result instanceof Promise) {\n throw new Error(\n `Async validators are not supported. ${titleCase(kind)} name ${name}`,\n );\n }\n if (result.issues) {\n throw new InputValidationError(\n `Validation failed for ${kind} ${name}: ${result.issues\n .map(issue => issue.message)\n .join(', ')}`,\n result,\n );\n }\n return result.value;\n}\n\nfunction titleCase(kind: string): string {\n return kind.charAt(0).toUpperCase() + kind.slice(1);\n}\n"],"mappings":";AAEA,IAAa,uBAAb,cAA0C,MAAM;CAC9C;CAGA;CAKA,YAAY,SAAiB,QAAwC;EACnE,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,SAAS;EACd,KAAK,UAAU;GAAC,MAAM;GAAwB;EAAM;CACtD;AACF;;;;;;;;;;;;;AAcA,SAAgB,cACd,MACA,OACA,WACA,MACS;CACT,IAAI,CAAC,WAEH,OAAO;CAGT,MAAM,SAAS,UAAU,
|
|
1
|
+
{"version":3,"file":"validate-input.js","names":[],"sources":["../../../../../zql/src/query/validate-input.ts"],"sourcesContent":["import type {StandardSchemaV1} from '@standard-schema/spec';\n\nexport class InputValidationError extends Error {\n readonly result: StandardSchemaV1.FailureResult;\n\n // will get picked up by `getErrorDetails` when mapping to an `ApplicationError`\n readonly details: {\n type: 'InputValidationError';\n result: StandardSchemaV1.FailureResult;\n };\n\n constructor(message: string, result: StandardSchemaV1.FailureResult) {\n super(message);\n this.name = 'InputValidationError';\n this.result = result;\n this.details = {type: 'InputValidationError', result};\n }\n}\n\n/**\n * Validates input using a StandardSchema validator if provided.\n * This is shared validation logic used by both defineQuery and defineMutator.\n *\n * @param name - The name of the query or mutator (for error messages)\n * @param input - The input value to validate\n * @param validator - Optional StandardSchema validator\n * @param kind - Type of definition ('query' or 'mutator') for error messages\n * @returns The validated output (either transformed by validator or input as-is)\n * @throws Error if validation fails or if an async validator is used\n * @internal\n */\nexport function validateInput<TInput, TOutput>(\n name: string,\n input: TInput,\n validator: StandardSchemaV1<TInput, TOutput> | undefined,\n kind: 'query' | 'mutator',\n): TOutput {\n if (!validator) {\n // No validator, so input and output are the same\n return input as unknown as TOutput;\n }\n\n const result = validator['~standard'].validate(input);\n if (result instanceof Promise) {\n throw new Error(\n `Async validators are not supported. ${titleCase(kind)} name ${name}`,\n );\n }\n if (result.issues) {\n throw new InputValidationError(\n `Validation failed for ${kind} ${name}: ${result.issues\n .map(issue => issue.message)\n .join(', ')}`,\n result,\n );\n }\n return result.value;\n}\n\nfunction titleCase(kind: string): string {\n return kind.charAt(0).toUpperCase() + kind.slice(1);\n}\n"],"mappings":";AAEA,IAAa,uBAAb,cAA0C,MAAM;CAC9C;CAGA;CAKA,YAAY,SAAiB,QAAwC;EACnE,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,SAAS;EACd,KAAK,UAAU;GAAC,MAAM;GAAwB;EAAM;CACtD;AACF;;;;;;;;;;;;;AAcA,SAAgB,cACd,MACA,OACA,WACA,MACS;CACT,IAAI,CAAC,WAEH,OAAO;CAGT,MAAM,SAAS,UAAU,YAAY,CAAC,SAAS,KAAK;CACpD,IAAI,kBAAkB,SACpB,MAAM,IAAI,MACR,uCAAuC,UAAU,IAAI,EAAE,QAAQ,MACjE;CAEF,IAAI,OAAO,QACT,MAAM,IAAI,qBACR,yBAAyB,KAAK,GAAG,KAAK,IAAI,OAAO,OAC9C,KAAI,UAAS,MAAM,OAAO,CAAC,CAC3B,KAAK,IAAI,KACZ,MACF;CAEF,OAAO,OAAO;AAChB;AAEA,SAAS,UAAU,MAAsB;CACvC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC;AACpD"}
|
|
@@ -8,17 +8,36 @@ export interface ClientGroupStorage {
|
|
|
8
8
|
destroy(): void;
|
|
9
9
|
}
|
|
10
10
|
export declare const CREATE_STORAGE_TABLE = "\n CREATE TABLE storage (\n clientGroupID TEXT,\n op NUMBER,\n key TEXT,\n val TEXT,\n PRIMARY KEY(clientGroupID, op, key)\n )\n ";
|
|
11
|
+
export type DatabaseStorageOptions = {
|
|
12
|
+
commitInterval?: number | undefined;
|
|
13
|
+
compactionThresholdBytes?: number | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* The most heap bytes, as estimated from {@link getSizeOfEntry}, that the
|
|
16
|
+
* operators of all client groups keep in memory before the least recently
|
|
17
|
+
* used ones spill to SQLite. 0, the default, keeps every operator's values
|
|
18
|
+
* in SQLite.
|
|
19
|
+
*/
|
|
20
|
+
maxMemoryBytes?: number | undefined;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Operator storage for the client groups of a sync worker.
|
|
24
|
+
*
|
|
25
|
+
* Each operator keeps its values in a `Map`, so reading a key that was never
|
|
26
|
+
* written does not ask SQLite. When the values of all of the operators go
|
|
27
|
+
* over `maxMemoryBytes`, the least recently used operators spill: their
|
|
28
|
+
* values are written to SQLite, where they stay until the operator is
|
|
29
|
+
* destroyed.
|
|
30
|
+
*
|
|
31
|
+
* Like `MemoryStorage`, `get` returns the stored value itself, which
|
|
32
|
+
* operators do not mutate.
|
|
33
|
+
*/
|
|
11
34
|
export declare class DatabaseStorage {
|
|
12
35
|
#private;
|
|
13
|
-
static create(lc: LogContext, path: string, options?:
|
|
14
|
-
|
|
15
|
-
compactionThresholdBytes: number;
|
|
16
|
-
}): DatabaseStorage;
|
|
17
|
-
constructor(db: Database, options?: {
|
|
18
|
-
commitInterval: number;
|
|
19
|
-
compactionThresholdBytes: number;
|
|
20
|
-
});
|
|
36
|
+
static create(lc: LogContext, path: string, options?: DatabaseStorageOptions): DatabaseStorage;
|
|
37
|
+
constructor(db: Database, options?: DatabaseStorageOptions);
|
|
21
38
|
close(): void;
|
|
39
|
+
/** The estimated size of the values that operators keep in memory. */
|
|
40
|
+
get memoryBytes(): number;
|
|
22
41
|
createClientGroupStorage(cgID: string): ClientGroupStorage;
|
|
23
42
|
}
|
|
24
43
|
//# sourceMappingURL=database-storage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-storage.d.ts","sourceRoot":"","sources":["../../../../zqlite/src/database-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"database-storage.d.ts","sourceRoot":"","sources":["../../../../zqlite/src/database-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAIjD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,+BAA+B,CAAC;AAG3D,OAAO,EAAC,QAAQ,EAAC,MAAM,SAAS,CAAC;AAEjC,MAAM,WAAW,kBAAkB;IACjC,gEAAgE;IAChE,aAAa,IAAI,OAAO,CAAC;IAEzB,gDAAgD;IAChD,OAAO,IAAI,IAAI,CAAC;CACjB;AAcD,eAAO,MAAM,oBAAoB,wJAQ9B,CAAC;AAsBJ,MAAM,MAAM,sBAAsB,GAAG;IACnC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,wBAAwB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,CAAC;AA4CF;;;;;;;;;;;GAWG;AACH,qBAAa,eAAe;;IAC1B,MAAM,CAAC,MAAM,CACX,EAAE,EAAE,UAAU,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,sBAA2B,GACnC,eAAe,CAiBjB;IAgBD,YAAY,EAAE,EAAE,QAAQ,EAAE,OAAO,GAAE,sBAA2B,EAgD7D;IAED,KAAK,SAGJ;IAED,sEAAsE;IACtE,IAAI,WAAW,IAAI,MAAM,CAExB;IA+KD,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAoCzD;CACF"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { getSizeOfEntry } from "../../shared/src/size-of-value.js";
|
|
2
|
+
import { compareValues } from "../../zql/src/ivm/data.js";
|
|
1
3
|
import { Database } from "./db.js";
|
|
2
4
|
//#region ../zqlite/src/database-storage.ts
|
|
3
5
|
var CREATE_STORAGE_TABLE = `
|
|
@@ -9,12 +11,73 @@ var CREATE_STORAGE_TABLE = `
|
|
|
9
11
|
PRIMARY KEY(clientGroupID, op, key)
|
|
10
12
|
)
|
|
11
13
|
`;
|
|
14
|
+
/**
|
|
15
|
+
* The most values the storage of a spilled operator keeps in memory. Profiles
|
|
16
|
+
* of the view-syncer gain as much from 64 as from 1,024.
|
|
17
|
+
*/
|
|
18
|
+
var MAX_CACHED_ENTRIES_PER_OP = 64;
|
|
19
|
+
/**
|
|
20
|
+
* When the operators' values go over `maxMemoryBytes`, operators are spilled
|
|
21
|
+
* until they are back under this proportion of it, so that spilling, which
|
|
22
|
+
* sorts the operators by last use, happens in batches.
|
|
23
|
+
*/
|
|
24
|
+
var SPILL_TARGET_PROPORTION = .9;
|
|
25
|
+
/**
|
|
26
|
+
* The heap bytes that operator state takes per byte of {@link getSizeOfEntry}.
|
|
27
|
+
* Measured with `heapUsed` on view-syncer operator state, mostly Cap's
|
|
28
|
+
* `{size, pks}` and Take's `{size, bound}`.
|
|
29
|
+
*/
|
|
30
|
+
var HEAP_BYTES_PER_SIZE = 2.6;
|
|
12
31
|
var defaultOptions = {
|
|
13
32
|
commitInterval: 5e3,
|
|
14
|
-
compactionThresholdBytes:
|
|
33
|
+
compactionThresholdBytes: 52428800,
|
|
34
|
+
maxMemoryBytes: 0
|
|
15
35
|
};
|
|
36
|
+
/**
|
|
37
|
+
* The storage of one operator. Its values live in `values` until the
|
|
38
|
+
* operator is spilled, and in SQLite afterwards, with the most recently used
|
|
39
|
+
* of them in `cache`.
|
|
40
|
+
*/
|
|
41
|
+
var OpStorage = class {
|
|
42
|
+
cgID;
|
|
43
|
+
opID;
|
|
44
|
+
/** `undefined` once spilled. */
|
|
45
|
+
values;
|
|
46
|
+
/** The {@link getSizeOfEntry} of `values`. */
|
|
47
|
+
size = 0;
|
|
48
|
+
lastUsed = 0;
|
|
49
|
+
/**
|
|
50
|
+
* Once spilled, the operator's most recently read and written values,
|
|
51
|
+
* `undefined` for a key known to be absent. Operators read the same key
|
|
52
|
+
* again and again (Cap and Take read their state on every fetch and push),
|
|
53
|
+
* so this saves most of the SQLite reads.
|
|
54
|
+
*/
|
|
55
|
+
cache = /* @__PURE__ */ new Map();
|
|
56
|
+
constructor(cgID, opID, inMemory) {
|
|
57
|
+
this.cgID = cgID;
|
|
58
|
+
this.opID = opID;
|
|
59
|
+
this.values = inMemory ? /* @__PURE__ */ new Map() : void 0;
|
|
60
|
+
}
|
|
61
|
+
cacheSet(key, val) {
|
|
62
|
+
const { cache } = this;
|
|
63
|
+
if (cache.size >= MAX_CACHED_ENTRIES_PER_OP && !cache.has(key)) cache.clear();
|
|
64
|
+
cache.set(key, val);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Operator storage for the client groups of a sync worker.
|
|
69
|
+
*
|
|
70
|
+
* Each operator keeps its values in a `Map`, so reading a key that was never
|
|
71
|
+
* written does not ask SQLite. When the values of all of the operators go
|
|
72
|
+
* over `maxMemoryBytes`, the least recently used operators spill: their
|
|
73
|
+
* values are written to SQLite, where they stay until the operator is
|
|
74
|
+
* destroyed.
|
|
75
|
+
*
|
|
76
|
+
* Like `MemoryStorage`, `get` returns the stored value itself, which
|
|
77
|
+
* operators do not mutate.
|
|
78
|
+
*/
|
|
16
79
|
var DatabaseStorage = class DatabaseStorage {
|
|
17
|
-
static create(lc, path, options =
|
|
80
|
+
static create(lc, path, options = {}) {
|
|
18
81
|
const db = new Database(lc, path);
|
|
19
82
|
db.unsafeMode(true);
|
|
20
83
|
db.pragma("locking_mode = EXCLUSIVE");
|
|
@@ -30,12 +93,20 @@ var DatabaseStorage = class DatabaseStorage {
|
|
|
30
93
|
#options;
|
|
31
94
|
#db;
|
|
32
95
|
#numWrites = 0;
|
|
33
|
-
|
|
96
|
+
/** The operators whose values are in memory. */
|
|
97
|
+
#inMemory = /* @__PURE__ */ new Set();
|
|
98
|
+
/** The {@link getSizeOfEntry} of the values of the operators in `#inMemory`. */
|
|
99
|
+
#size = 0;
|
|
100
|
+
/** `maxMemoryBytes` in units of {@link getSizeOfEntry}. */
|
|
101
|
+
#maxSize;
|
|
102
|
+
/** Orders the operators by last use. */
|
|
103
|
+
#clock = 0;
|
|
104
|
+
constructor(db, options = {}) {
|
|
34
105
|
this.#stmts = {
|
|
35
106
|
get: db.prepare(`
|
|
36
107
|
SELECT val FROM storage WHERE
|
|
37
108
|
clientGroupID = ? AND op = ? AND key = ?
|
|
38
|
-
`),
|
|
109
|
+
`).pluck(true),
|
|
39
110
|
set: db.prepare(`
|
|
40
111
|
INSERT INTO storage (clientGroupID, op, key, val)
|
|
41
112
|
VALUES(?, ?, ?, ?)
|
|
@@ -50,7 +121,7 @@ var DatabaseStorage = class DatabaseStorage {
|
|
|
50
121
|
scan: db.prepare(`
|
|
51
122
|
SELECT key, val FROM storage WHERE
|
|
52
123
|
clientGroupID = ? AND op = ? AND key >= ?
|
|
53
|
-
`),
|
|
124
|
+
`).raw(true),
|
|
54
125
|
clear: db.prepare(`
|
|
55
126
|
DELETE FROM storage WHERE clientGroupID = ?
|
|
56
127
|
`),
|
|
@@ -61,29 +132,110 @@ var DatabaseStorage = class DatabaseStorage {
|
|
|
61
132
|
begin: db.prepare("BEGIN")
|
|
62
133
|
};
|
|
63
134
|
this.#stmts.begin.run();
|
|
64
|
-
this.#options =
|
|
135
|
+
this.#options = {
|
|
136
|
+
commitInterval: options.commitInterval ?? defaultOptions.commitInterval,
|
|
137
|
+
compactionThresholdBytes: options.compactionThresholdBytes ?? defaultOptions.compactionThresholdBytes,
|
|
138
|
+
maxMemoryBytes: options.maxMemoryBytes ?? defaultOptions.maxMemoryBytes
|
|
139
|
+
};
|
|
140
|
+
this.#maxSize = this.#options.maxMemoryBytes / HEAP_BYTES_PER_SIZE;
|
|
65
141
|
this.#db = db;
|
|
66
142
|
}
|
|
67
143
|
close() {
|
|
68
144
|
this.#checkpoint();
|
|
69
145
|
this.#db.close();
|
|
70
146
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
return row ? JSON.parse(row.val) : def;
|
|
147
|
+
/** The estimated size of the values that operators keep in memory. */
|
|
148
|
+
get memoryBytes() {
|
|
149
|
+
return Math.round(this.#size * HEAP_BYTES_PER_SIZE);
|
|
75
150
|
}
|
|
76
|
-
#
|
|
77
|
-
this.#
|
|
78
|
-
|
|
151
|
+
#get(op, key, def) {
|
|
152
|
+
op.lastUsed = ++this.#clock;
|
|
153
|
+
const { values } = op;
|
|
154
|
+
if (values) {
|
|
155
|
+
const val = values.get(key);
|
|
156
|
+
return val === void 0 ? def : val;
|
|
157
|
+
}
|
|
158
|
+
let val = op.cache.get(key);
|
|
159
|
+
if (val === void 0 && !op.cache.has(key)) {
|
|
160
|
+
this.#maybeCheckpoint();
|
|
161
|
+
const json = this.#stmts.get.get(op.cgID, op.opID, key);
|
|
162
|
+
val = json === void 0 ? void 0 : JSON.parse(json);
|
|
163
|
+
op.cacheSet(key, val);
|
|
164
|
+
}
|
|
165
|
+
return val === void 0 ? def : val;
|
|
79
166
|
}
|
|
80
|
-
#
|
|
167
|
+
#set(op, key, val) {
|
|
168
|
+
op.lastUsed = ++this.#clock;
|
|
169
|
+
const { values } = op;
|
|
170
|
+
if (values) {
|
|
171
|
+
if (values.size === 0) this.#inMemory.add(op);
|
|
172
|
+
const old = values.get(key);
|
|
173
|
+
const delta = getSizeOfEntry(key, val) - (old === void 0 ? 0 : getSizeOfEntry(key, old));
|
|
174
|
+
values.set(key, val);
|
|
175
|
+
op.size += delta;
|
|
176
|
+
this.#size += delta;
|
|
177
|
+
if (this.#size > this.#maxSize) this.#spillLeastRecentlyUsed();
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
this.#write(op, key, val);
|
|
181
|
+
op.cacheSet(key, val);
|
|
182
|
+
}
|
|
183
|
+
#del(op, key) {
|
|
184
|
+
op.lastUsed = ++this.#clock;
|
|
185
|
+
const { values } = op;
|
|
186
|
+
if (values) {
|
|
187
|
+
const old = values.get(key);
|
|
188
|
+
if (old !== void 0) {
|
|
189
|
+
values.delete(key);
|
|
190
|
+
const size = getSizeOfEntry(key, old);
|
|
191
|
+
op.size -= size;
|
|
192
|
+
this.#size -= size;
|
|
193
|
+
}
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
81
196
|
this.#maybeCheckpoint();
|
|
82
|
-
this.#stmts.del.run(cgID, opID, key);
|
|
197
|
+
this.#stmts.del.run(op.cgID, op.opID, key);
|
|
198
|
+
op.cacheSet(key, void 0);
|
|
83
199
|
}
|
|
84
|
-
#
|
|
200
|
+
#write(op, key, val) {
|
|
85
201
|
this.#maybeCheckpoint();
|
|
86
|
-
this.#stmts.
|
|
202
|
+
this.#stmts.set.run(op.cgID, op.opID, key, JSON.stringify(val));
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Spills the least recently used operators until the values in memory are
|
|
206
|
+
* under {@link SPILL_TARGET_PROPORTION} of the budget.
|
|
207
|
+
*/
|
|
208
|
+
#spillLeastRecentlyUsed() {
|
|
209
|
+
const target = this.#maxSize * SPILL_TARGET_PROPORTION;
|
|
210
|
+
const ops = [];
|
|
211
|
+
for (const op of this.#inMemory) ops.push(op);
|
|
212
|
+
ops.sort((a, b) => a.lastUsed - b.lastUsed);
|
|
213
|
+
for (const op of ops) {
|
|
214
|
+
if (this.#size <= target) break;
|
|
215
|
+
this.#spill(op);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
#spill(op) {
|
|
219
|
+
const { values } = op;
|
|
220
|
+
if (!values) return;
|
|
221
|
+
for (const [key, val] of values) this.#write(op, key, val);
|
|
222
|
+
this.#release(op);
|
|
223
|
+
op.values = void 0;
|
|
224
|
+
}
|
|
225
|
+
/** Drops the values that `op` keeps in memory. */
|
|
226
|
+
#release(op) {
|
|
227
|
+
this.#size -= op.size;
|
|
228
|
+
op.size = 0;
|
|
229
|
+
op.values?.clear();
|
|
230
|
+
op.cache.clear();
|
|
231
|
+
this.#inMemory.delete(op);
|
|
232
|
+
}
|
|
233
|
+
#destroy(op) {
|
|
234
|
+
if (!op.values) {
|
|
235
|
+
this.#maybeCheckpoint();
|
|
236
|
+
this.#stmts.clearOp.run(op.cgID, op.opID);
|
|
237
|
+
}
|
|
238
|
+
this.#release(op);
|
|
87
239
|
}
|
|
88
240
|
/**
|
|
89
241
|
* We don't need to commit every single write to the DB
|
|
@@ -99,16 +251,29 @@ var DatabaseStorage = class DatabaseStorage {
|
|
|
99
251
|
this.#stmts.begin.run();
|
|
100
252
|
this.#numWrites = 0;
|
|
101
253
|
}
|
|
102
|
-
*#scan(
|
|
254
|
+
*#scan(op, opts = { prefix: "" }) {
|
|
103
255
|
const { prefix } = opts;
|
|
104
|
-
|
|
256
|
+
const { values } = op;
|
|
257
|
+
if (values) {
|
|
258
|
+
const keys = [];
|
|
259
|
+
for (const key of values.keys()) if (key.startsWith(prefix)) keys.push(key);
|
|
260
|
+
keys.sort(compareValues);
|
|
261
|
+
for (const key of keys) {
|
|
262
|
+
const val = this.#get(op, key);
|
|
263
|
+
if (val !== void 0) yield [key, val];
|
|
264
|
+
}
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
for (const [key, val] of this.#stmts.scan.iterate(op.cgID, op.opID, prefix)) {
|
|
105
268
|
if (!key.startsWith(prefix)) return;
|
|
106
269
|
yield [key, JSON.parse(val)];
|
|
107
270
|
}
|
|
108
271
|
}
|
|
109
272
|
createClientGroupStorage(cgID) {
|
|
273
|
+
const ops = /* @__PURE__ */ new Set();
|
|
110
274
|
const destroy = () => {
|
|
111
275
|
this.#stmts.clear.run(cgID);
|
|
276
|
+
for (const op of ops) this.#release(op);
|
|
112
277
|
this.#checkpoint();
|
|
113
278
|
this.#db.compact(this.#options.compactionThresholdBytes);
|
|
114
279
|
};
|
|
@@ -116,13 +281,17 @@ var DatabaseStorage = class DatabaseStorage {
|
|
|
116
281
|
let nextOpID = 1;
|
|
117
282
|
return {
|
|
118
283
|
createStorage: () => {
|
|
119
|
-
const
|
|
284
|
+
const op = new OpStorage(cgID, nextOpID++, this.#options.maxMemoryBytes > 0);
|
|
285
|
+
ops.add(op);
|
|
120
286
|
return {
|
|
121
|
-
get: (key, def) => this.#get(
|
|
122
|
-
set: (key, val) => this.#set(
|
|
123
|
-
del: (key) => this.#del(
|
|
124
|
-
scan: (opts) => this.#scan(
|
|
125
|
-
destroy: () =>
|
|
287
|
+
get: (key, def) => this.#get(op, key, def),
|
|
288
|
+
set: (key, val) => this.#set(op, key, val),
|
|
289
|
+
del: (key) => this.#del(op, key),
|
|
290
|
+
scan: (opts) => this.#scan(op, opts),
|
|
291
|
+
destroy: () => {
|
|
292
|
+
this.#destroy(op);
|
|
293
|
+
ops.delete(op);
|
|
294
|
+
}
|
|
126
295
|
};
|
|
127
296
|
},
|
|
128
297
|
destroy
|
|
@@ -130,6 +299,6 @@ var DatabaseStorage = class DatabaseStorage {
|
|
|
130
299
|
}
|
|
131
300
|
};
|
|
132
301
|
//#endregion
|
|
133
|
-
export { DatabaseStorage };
|
|
302
|
+
export { CREATE_STORAGE_TABLE, DatabaseStorage };
|
|
134
303
|
|
|
135
304
|
//# sourceMappingURL=database-storage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-storage.js","names":["#stmts","#options","#db","#checkpoint","#maybeCheckpoint","#numWrites","#scan","#get","#set","#del","#destroy"],"sources":["../../../../zqlite/src/database-storage.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport type {JSONValue} from '../../shared/src/json.ts';\nimport type {Storage} from '../../zql/src/ivm/operator.ts';\nimport type {Stream} from '../../zql/src/ivm/stream.ts';\nimport type {Statement} from './db.ts';\nimport {Database} from './db.ts';\n\nexport interface ClientGroupStorage {\n /** Creates a {@link Storage} instance for a single operator. */\n createStorage(): Storage;\n\n /** Deletes all storage for the client group. */\n destroy(): void;\n}\n\ntype Statements = {\n get: Statement;\n set: Statement;\n del: Statement;\n scan: Statement;\n clear: Statement;\n clearOp: Statement;\n commit: Statement;\n begin: Statement;\n};\n\n// Exported for testing.\nexport const CREATE_STORAGE_TABLE = `\n CREATE TABLE storage (\n clientGroupID TEXT,\n op NUMBER,\n key TEXT,\n val TEXT,\n PRIMARY KEY(clientGroupID, op, key)\n )\n `;\n\nconst defaultOptions = {\n commitInterval: 5_000,\n compactionThresholdBytes: 50 * 1024 * 1024,\n};\n\nexport class DatabaseStorage {\n static create(\n lc: LogContext,\n path: string,\n options = defaultOptions,\n ): DatabaseStorage {\n // SQLite is used for ephemeral storage (i.e. similar to RAM) that can spill to\n // disk to avoid consuming too much memory. Each worker thread gets its own\n // database (file) and acts as the single reader/writer of the DB, so\n // `locking_mode` is set to `EXCLUSIVE` for performance. Similarly, since\n // durability is not important, `synchronous` is set to `OFF` for performance.\n const db = new Database(lc, path);\n db.unsafeMode(true); // Allows journal_mode = OFF\n db.pragma('locking_mode = EXCLUSIVE');\n db.pragma('foreign_keys = OFF');\n db.pragma('journal_mode = OFF');\n db.pragma('synchronous = OFF');\n db.pragma('auto_vacuum = INCREMENTAL');\n\n db.prepare(CREATE_STORAGE_TABLE).run();\n lc.debug?.(`Created DatabaseStorage backed by ${path}`);\n return new DatabaseStorage(db, options);\n }\n\n readonly #stmts: Statements;\n readonly #options: typeof defaultOptions;\n readonly #db: Database;\n #numWrites = 0;\n\n constructor(db: Database, options = defaultOptions) {\n this.#stmts = {\n get: db.prepare(`\n SELECT val FROM storage WHERE\n clientGroupID = ? AND op = ? AND key = ?\n `),\n set: db.prepare(`\n INSERT INTO storage (clientGroupID, op, key, val)\n VALUES(?, ?, ?, ?)\n ON CONFLICT(clientGroupID, op, key) \n DO \n UPDATE SET val = excluded.val\n `),\n del: db.prepare(`\n DELETE FROM storage WHERE\n clientGroupID = ? AND op = ? AND key = ?\n `),\n scan: db.prepare(`\n SELECT key, val FROM storage WHERE\n clientGroupID = ? AND op = ? AND key >= ?\n `),\n clear: db.prepare(`\n DELETE FROM storage WHERE clientGroupID = ?\n `),\n clearOp: db.prepare(`\n DELETE FROM storage WHERE clientGroupID = ? AND op = ?\n `),\n commit: db.prepare('COMMIT'),\n begin: db.prepare('BEGIN'),\n };\n this.#stmts.begin.run();\n this.#options = options;\n this.#db = db;\n }\n\n close() {\n this.#checkpoint();\n this.#db.close();\n }\n\n #get(\n cgID: string,\n opID: number,\n key: string,\n def?: JSONValue,\n ): JSONValue | undefined {\n this.#maybeCheckpoint();\n const row = this.#stmts.get.get<{val: string}>(cgID, opID, key);\n return row ? JSON.parse(row.val) : def;\n }\n\n #set(cgID: string, opID: number, key: string, val: JSONValue) {\n this.#maybeCheckpoint();\n this.#stmts.set.run(cgID, opID, key, JSON.stringify(val));\n }\n\n #del(cgID: string, opID: number, key: string) {\n this.#maybeCheckpoint();\n this.#stmts.del.run(cgID, opID, key);\n }\n\n #destroy(cgID: string, opID: number) {\n this.#maybeCheckpoint();\n this.#stmts.clearOp.run(cgID, opID);\n }\n\n /**\n * We don't need to commit every single write to the DB\n * since we're not concerned with durability.\n * Waiting on commits can be expensive, so we commit\n * every `COMMIT_INTERVAL` writes.\n */\n #maybeCheckpoint() {\n if (++this.#numWrites >= this.#options.commitInterval) {\n this.#checkpoint();\n }\n }\n\n #checkpoint() {\n this.#stmts.commit.run();\n this.#stmts.begin.run();\n this.#numWrites = 0;\n }\n\n *#scan(\n cgID: string,\n opID: number,\n opts: {prefix: string} = {prefix: ''},\n ): Stream<[string, JSONValue]> {\n const {prefix} = opts;\n for (const {key, val} of this.#stmts.scan.iterate<{\n key: string;\n val: string;\n }>(cgID, opID, prefix)) {\n if (!key.startsWith(prefix)) {\n return;\n }\n yield [key, JSON.parse(val)];\n }\n }\n\n createClientGroupStorage(cgID: string): ClientGroupStorage {\n const destroy = () => {\n this.#stmts.clear.run(cgID);\n this.#checkpoint();\n this.#db.compact(this.#options.compactionThresholdBytes);\n };\n this.#stmts.clear.run(cgID);\n\n let nextOpID = 1;\n return {\n createStorage: () => {\n const opID = nextOpID++;\n return {\n get: (key, def?) => this.#get(cgID, opID, key, def),\n set: (key, val) => this.#set(cgID, opID, key, val),\n del: key => this.#del(cgID, opID, key),\n scan: opts => this.#scan(cgID, opID, opts),\n destroy: () => this.#destroy(cgID, opID),\n };\n },\n\n destroy,\n };\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"database-storage.js","names":[],"sources":["../../../../zqlite/src/database-storage.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport type {JSONValue} from '../../shared/src/json.ts';\nimport {getSizeOfEntry} from '../../shared/src/size-of-value.ts';\nimport {compareValues} from '../../zql/src/ivm/data.ts';\nimport type {Storage} from '../../zql/src/ivm/operator.ts';\nimport type {Stream} from '../../zql/src/ivm/stream.ts';\nimport type {Statement} from './db.ts';\nimport {Database} from './db.ts';\n\nexport interface ClientGroupStorage {\n /** Creates a {@link Storage} instance for a single operator. */\n createStorage(): Storage;\n\n /** Deletes all storage for the client group. */\n destroy(): void;\n}\n\ntype Statements = {\n get: Statement;\n set: Statement;\n del: Statement;\n scan: Statement;\n clear: Statement;\n clearOp: Statement;\n commit: Statement;\n begin: Statement;\n};\n\n// Exported for testing.\nexport const CREATE_STORAGE_TABLE = `\n CREATE TABLE storage (\n clientGroupID TEXT,\n op NUMBER,\n key TEXT,\n val TEXT,\n PRIMARY KEY(clientGroupID, op, key)\n )\n `;\n\n/**\n * The most values the storage of a spilled operator keeps in memory. Profiles\n * of the view-syncer gain as much from 64 as from 1,024.\n */\nconst MAX_CACHED_ENTRIES_PER_OP = 64;\n\n/**\n * When the operators' values go over `maxMemoryBytes`, operators are spilled\n * until they are back under this proportion of it, so that spilling, which\n * sorts the operators by last use, happens in batches.\n */\nconst SPILL_TARGET_PROPORTION = 0.9;\n\n/**\n * The heap bytes that operator state takes per byte of {@link getSizeOfEntry}.\n * Measured with `heapUsed` on view-syncer operator state, mostly Cap's\n * `{size, pks}` and Take's `{size, bound}`.\n */\nconst HEAP_BYTES_PER_SIZE = 2.6;\n\nexport type DatabaseStorageOptions = {\n commitInterval?: number | undefined;\n compactionThresholdBytes?: number | undefined;\n /**\n * The most heap bytes, as estimated from {@link getSizeOfEntry}, that the\n * operators of all client groups keep in memory before the least recently\n * used ones spill to SQLite. 0, the default, keeps every operator's values\n * in SQLite.\n */\n maxMemoryBytes?: number | undefined;\n};\n\nconst defaultOptions = {\n commitInterval: 5_000,\n compactionThresholdBytes: 50 * 1024 * 1024,\n maxMemoryBytes: 0,\n};\n\n/**\n * The storage of one operator. Its values live in `values` until the\n * operator is spilled, and in SQLite afterwards, with the most recently used\n * of them in `cache`.\n */\nclass OpStorage {\n readonly cgID: string;\n readonly opID: number;\n /** `undefined` once spilled. */\n values: Map<string, JSONValue> | undefined;\n /** The {@link getSizeOfEntry} of `values`. */\n size = 0;\n lastUsed = 0;\n /**\n * Once spilled, the operator's most recently read and written values,\n * `undefined` for a key known to be absent. Operators read the same key\n * again and again (Cap and Take read their state on every fetch and push),\n * so this saves most of the SQLite reads.\n */\n readonly cache = new Map<string, JSONValue | undefined>();\n\n constructor(cgID: string, opID: number, inMemory: boolean) {\n this.cgID = cgID;\n this.opID = opID;\n this.values = inMemory ? new Map() : undefined;\n }\n\n cacheSet(key: string, val: JSONValue | undefined) {\n const {cache} = this;\n if (cache.size >= MAX_CACHED_ENTRIES_PER_OP && !cache.has(key)) {\n cache.clear();\n }\n cache.set(key, val);\n }\n}\n\n/**\n * Operator storage for the client groups of a sync worker.\n *\n * Each operator keeps its values in a `Map`, so reading a key that was never\n * written does not ask SQLite. When the values of all of the operators go\n * over `maxMemoryBytes`, the least recently used operators spill: their\n * values are written to SQLite, where they stay until the operator is\n * destroyed.\n *\n * Like `MemoryStorage`, `get` returns the stored value itself, which\n * operators do not mutate.\n */\nexport class DatabaseStorage {\n static create(\n lc: LogContext,\n path: string,\n options: DatabaseStorageOptions = {},\n ): DatabaseStorage {\n // SQLite is used for ephemeral storage (i.e. similar to RAM) that can spill to\n // disk to avoid consuming too much memory. Each worker thread gets its own\n // database (file) and acts as the single reader/writer of the DB, so\n // `locking_mode` is set to `EXCLUSIVE` for performance. Similarly, since\n // durability is not important, `synchronous` is set to `OFF` for performance.\n const db = new Database(lc, path);\n db.unsafeMode(true); // Allows journal_mode = OFF\n db.pragma('locking_mode = EXCLUSIVE');\n db.pragma('foreign_keys = OFF');\n db.pragma('journal_mode = OFF');\n db.pragma('synchronous = OFF');\n db.pragma('auto_vacuum = INCREMENTAL');\n\n db.prepare(CREATE_STORAGE_TABLE).run();\n lc.debug?.(`Created DatabaseStorage backed by ${path}`);\n return new DatabaseStorage(db, options);\n }\n\n readonly #stmts: Statements;\n readonly #options: typeof defaultOptions;\n readonly #db: Database;\n #numWrites = 0;\n\n /** The operators whose values are in memory. */\n readonly #inMemory = new Set<OpStorage>();\n /** The {@link getSizeOfEntry} of the values of the operators in `#inMemory`. */\n #size = 0;\n /** `maxMemoryBytes` in units of {@link getSizeOfEntry}. */\n readonly #maxSize: number;\n /** Orders the operators by last use. */\n #clock = 0;\n\n constructor(db: Database, options: DatabaseStorageOptions = {}) {\n this.#stmts = {\n get: db\n .prepare(\n `\n SELECT val FROM storage WHERE\n clientGroupID = ? AND op = ? AND key = ?\n `,\n )\n .pluck(true),\n set: db.prepare(`\n INSERT INTO storage (clientGroupID, op, key, val)\n VALUES(?, ?, ?, ?)\n ON CONFLICT(clientGroupID, op, key) \n DO \n UPDATE SET val = excluded.val\n `),\n del: db.prepare(`\n DELETE FROM storage WHERE\n clientGroupID = ? AND op = ? AND key = ?\n `),\n scan: db\n .prepare(\n `\n SELECT key, val FROM storage WHERE\n clientGroupID = ? AND op = ? AND key >= ?\n `,\n )\n .raw(true),\n clear: db.prepare(`\n DELETE FROM storage WHERE clientGroupID = ?\n `),\n clearOp: db.prepare(`\n DELETE FROM storage WHERE clientGroupID = ? AND op = ?\n `),\n commit: db.prepare('COMMIT'),\n begin: db.prepare('BEGIN'),\n };\n this.#stmts.begin.run();\n this.#options = {\n commitInterval: options.commitInterval ?? defaultOptions.commitInterval,\n compactionThresholdBytes:\n options.compactionThresholdBytes ??\n defaultOptions.compactionThresholdBytes,\n maxMemoryBytes: options.maxMemoryBytes ?? defaultOptions.maxMemoryBytes,\n };\n this.#maxSize = this.#options.maxMemoryBytes / HEAP_BYTES_PER_SIZE;\n this.#db = db;\n }\n\n close() {\n this.#checkpoint();\n this.#db.close();\n }\n\n /** The estimated size of the values that operators keep in memory. */\n get memoryBytes(): number {\n return Math.round(this.#size * HEAP_BYTES_PER_SIZE);\n }\n\n #get(op: OpStorage, key: string, def?: JSONValue): JSONValue | undefined {\n op.lastUsed = ++this.#clock;\n const {values} = op;\n if (values) {\n const val = values.get(key);\n return val === undefined ? def : val;\n }\n let val = op.cache.get(key);\n if (val === undefined && !op.cache.has(key)) {\n this.#maybeCheckpoint();\n const json = this.#stmts.get.get<string | undefined>(\n op.cgID,\n op.opID,\n key,\n );\n val = json === undefined ? undefined : JSON.parse(json);\n op.cacheSet(key, val);\n }\n return val === undefined ? def : val;\n }\n\n #set(op: OpStorage, key: string, val: JSONValue) {\n op.lastUsed = ++this.#clock;\n const {values} = op;\n if (values) {\n if (values.size === 0) {\n // The operator may have been released by destroy().\n this.#inMemory.add(op);\n }\n const old = values.get(key);\n const delta =\n getSizeOfEntry(key, val) -\n (old === undefined ? 0 : getSizeOfEntry(key, old));\n values.set(key, val);\n op.size += delta;\n this.#size += delta;\n if (this.#size > this.#maxSize) {\n this.#spillLeastRecentlyUsed();\n }\n return;\n }\n this.#write(op, key, val);\n // The cache is updated only once the database is, so a failed write\n // leaves it consistent with the database.\n op.cacheSet(key, val);\n }\n\n #del(op: OpStorage, key: string) {\n op.lastUsed = ++this.#clock;\n const {values} = op;\n if (values) {\n const old = values.get(key);\n if (old !== undefined) {\n values.delete(key);\n const size = getSizeOfEntry(key, old);\n op.size -= size;\n this.#size -= size;\n }\n return;\n }\n this.#maybeCheckpoint();\n this.#stmts.del.run(op.cgID, op.opID, key);\n op.cacheSet(key, undefined);\n }\n\n #write(op: OpStorage, key: string, val: JSONValue) {\n this.#maybeCheckpoint();\n this.#stmts.set.run(op.cgID, op.opID, key, JSON.stringify(val));\n }\n\n /**\n * Spills the least recently used operators until the values in memory are\n * under {@link SPILL_TARGET_PROPORTION} of the budget.\n */\n #spillLeastRecentlyUsed() {\n const target = this.#maxSize * SPILL_TARGET_PROPORTION;\n const ops: OpStorage[] = [];\n for (const op of this.#inMemory) {\n ops.push(op);\n }\n ops.sort((a, b) => a.lastUsed - b.lastUsed);\n for (const op of ops) {\n if (this.#size <= target) {\n break;\n }\n this.#spill(op);\n }\n }\n\n #spill(op: OpStorage) {\n const {values} = op;\n if (!values) {\n return;\n }\n for (const [key, val] of values) {\n this.#write(op, key, val);\n }\n this.#release(op);\n op.values = undefined;\n }\n\n /** Drops the values that `op` keeps in memory. */\n #release(op: OpStorage) {\n this.#size -= op.size;\n op.size = 0;\n op.values?.clear();\n op.cache.clear();\n this.#inMemory.delete(op);\n }\n\n #destroy(op: OpStorage) {\n if (!op.values) {\n this.#maybeCheckpoint();\n this.#stmts.clearOp.run(op.cgID, op.opID);\n }\n this.#release(op);\n }\n\n /**\n * We don't need to commit every single write to the DB\n * since we're not concerned with durability.\n * Waiting on commits can be expensive, so we commit\n * every `COMMIT_INTERVAL` writes.\n */\n #maybeCheckpoint() {\n if (++this.#numWrites >= this.#options.commitInterval) {\n this.#checkpoint();\n }\n }\n\n #checkpoint() {\n this.#stmts.commit.run();\n this.#stmts.begin.run();\n this.#numWrites = 0;\n }\n\n *#scan(\n op: OpStorage,\n opts: {prefix: string} = {prefix: ''},\n ): Stream<[string, JSONValue]> {\n const {prefix} = opts;\n const {values} = op;\n if (values) {\n const keys: string[] = [];\n for (const key of values.keys()) {\n if (key.startsWith(prefix)) {\n keys.push(key);\n }\n }\n // Sorted like SQLite's BINARY collation, which compares UTF-8 bytes.\n keys.sort(compareValues);\n for (const key of keys) {\n // Read through #get, which skips keys deleted since and still works\n // if the operator spills while the scan is suspended.\n const val = this.#get(op, key);\n if (val !== undefined) {\n yield [key, val];\n }\n }\n return;\n }\n for (const [key, val] of this.#stmts.scan.iterate<[string, string]>(\n op.cgID,\n op.opID,\n prefix,\n )) {\n if (!key.startsWith(prefix)) {\n return;\n }\n yield [key, JSON.parse(val)];\n }\n }\n\n createClientGroupStorage(cgID: string): ClientGroupStorage {\n // The group's live operator storages.\n const ops = new Set<OpStorage>();\n const destroy = () => {\n this.#stmts.clear.run(cgID);\n for (const op of ops) {\n this.#release(op);\n }\n this.#checkpoint();\n this.#db.compact(this.#options.compactionThresholdBytes);\n };\n this.#stmts.clear.run(cgID);\n\n let nextOpID = 1;\n return {\n createStorage: () => {\n const op = new OpStorage(\n cgID,\n nextOpID++,\n this.#options.maxMemoryBytes > 0,\n );\n ops.add(op);\n return {\n get: (key, def?) => this.#get(op, key, def),\n set: (key, val) => this.#set(op, key, val),\n del: key => this.#del(op, key),\n scan: opts => this.#scan(op, opts),\n destroy: () => {\n this.#destroy(op);\n ops.delete(op);\n },\n };\n },\n\n destroy,\n };\n }\n}\n"],"mappings":"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"}
|
package/out/zqlite/src/db.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Attributes } from '@opentelemetry/api';
|
|
2
2
|
import type { LogContext } from '@rocicorp/logger';
|
|
3
|
-
import SQLite3Database, { type RunResult, type Statement as SQLite3Statement } from '@rocicorp/zero-sqlite3';
|
|
3
|
+
import SQLite3Database, { type ColumnDefinition, type RunResult, type Statement as SQLite3Statement, type StatementIterator as SQLite3StatementIterator } from '@rocicorp/zero-sqlite3';
|
|
4
4
|
export declare class Database implements Disposable {
|
|
5
5
|
#private;
|
|
6
6
|
constructor(lc: LogContext, path: string, options?: SQLite3Database.Options, slowQueryThreshold?: number);
|
|
@@ -37,10 +37,55 @@ export declare class Statement {
|
|
|
37
37
|
readonly scanStatusReset: SQLite3Statement['scanStatusReset'];
|
|
38
38
|
constructor(lc: LogContext, attrs: Attributes, stmt: SQLite3Statement, threshold: number);
|
|
39
39
|
safeIntegers(useBigInt: boolean): this;
|
|
40
|
+
/**
|
|
41
|
+
* Return rows as arrays of column values instead of objects. Turning it
|
|
42
|
+
* off has no effect in pluck mode, as in better-sqlite3.
|
|
43
|
+
*/
|
|
44
|
+
raw(enabled: boolean): this;
|
|
45
|
+
/**
|
|
46
|
+
* Return the first column of each row instead of the row. Turning it off
|
|
47
|
+
* has no effect in raw mode, as in better-sqlite3.
|
|
48
|
+
*/
|
|
49
|
+
pluck(enabled: boolean): this;
|
|
50
|
+
/** The result columns, in the order of the values in a raw row. */
|
|
51
|
+
columns(): ColumnDefinition[];
|
|
40
52
|
run(...params: unknown[]): RunResult;
|
|
41
53
|
get<T>(...params: unknown[]): T;
|
|
42
54
|
all<T>(...params: unknown[]): T[];
|
|
43
55
|
iterate<T>(...params: unknown[]): IterableIterator<T>;
|
|
56
|
+
/**
|
|
57
|
+
* Reads the statement's rows in batches. Integers are read as with
|
|
58
|
+
* `safeIntegers(true)`. The cursor must be {@link BatchCursor.close closed}.
|
|
59
|
+
*/
|
|
60
|
+
batches(params: readonly unknown[]): BatchCursor;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Reads a statement's rows a batch at a time with one native call per batch
|
|
64
|
+
* (`nextBatch`), instead of one per row as `next()` does.
|
|
65
|
+
*/
|
|
66
|
+
export declare class BatchCursor {
|
|
67
|
+
#private;
|
|
68
|
+
constructor(log: IterationLog, it: SQLite3StatementIterator, columns: number);
|
|
69
|
+
/**
|
|
70
|
+
* Reads up to `capacity` rows and returns their values in one row-major
|
|
71
|
+
* array, empty once the rows are exhausted.
|
|
72
|
+
*/
|
|
73
|
+
next(capacity: number): (bigint | number | string | null)[];
|
|
74
|
+
/**
|
|
75
|
+
* Ends the cursor, abandoning any rows that were not read, and logs if the
|
|
76
|
+
* iteration was slow. Must be called once the rows are consumed.
|
|
77
|
+
*/
|
|
78
|
+
close(): void;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Logs slow iterations: once the time spent in SQLite, or the total time
|
|
82
|
+
* including the consumer's work between rows, reaches the threshold.
|
|
83
|
+
*/
|
|
84
|
+
declare class IterationLog {
|
|
85
|
+
#private;
|
|
86
|
+
constructor(lc: LogContext, attrs: Attributes, slowQueryThreshold: number);
|
|
87
|
+
addSQLiteTime(elapsed: number): void;
|
|
88
|
+
log(): void;
|
|
44
89
|
}
|
|
45
90
|
/**
|
|
46
91
|
* An error indicating that the Database failed to open. This essentially
|
|
@@ -49,4 +94,5 @@ export declare class Statement {
|
|
|
49
94
|
*/
|
|
50
95
|
export declare class DatabaseInitError extends Error {
|
|
51
96
|
}
|
|
97
|
+
export {};
|
|
52
98
|
//# sourceMappingURL=db.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../../zqlite/src/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,eAAe,EAAE,EAEtB,KAAK,SAAS,EACd,KAAK,SAAS,IAAI,gBAAgB,
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../../zqlite/src/db.ts"],"names":[],"mappings":"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"}
|