@rocicorp/zero 1.11.0-canary.3 → 1.11.0-canary.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/analyze-query/src/analyze-cli.js +4 -4
- package/out/analyze-query/src/analyze-cli.js.map +1 -1
- package/out/analyze-query/src/bin-analyze.js +13 -12
- package/out/analyze-query/src/bin-analyze.js.map +1 -1
- package/out/analyze-query/src/bin-transform.js +1 -1
- package/out/analyze-query/src/bin-transform.js.map +1 -1
- package/out/ast-to-zql/src/ast-to-zql.d.ts +8 -1
- package/out/ast-to-zql/src/ast-to-zql.d.ts.map +1 -1
- package/out/ast-to-zql/src/ast-to-zql.js +25 -25
- package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
- package/out/otel/src/log-options.d.ts +16 -0
- package/out/otel/src/log-options.d.ts.map +1 -1
- package/out/otel/src/log-options.js +60 -6
- package/out/otel/src/log-options.js.map +1 -1
- package/out/replicache/src/bg-interval.d.ts +2 -1
- package/out/replicache/src/bg-interval.d.ts.map +1 -1
- package/out/replicache/src/bg-interval.js +13 -4
- package/out/replicache/src/bg-interval.js.map +1 -1
- package/out/replicache/src/btree/node.d.ts.map +1 -1
- package/out/replicache/src/btree/node.js +3 -6
- package/out/replicache/src/btree/node.js.map +1 -1
- package/out/replicache/src/dag/gc.d.ts.map +1 -1
- package/out/replicache/src/dag/gc.js +8 -11
- package/out/replicache/src/dag/gc.js.map +1 -1
- package/out/replicache/src/dag/invalid-ref-count-error.d.ts +12 -0
- package/out/replicache/src/dag/invalid-ref-count-error.d.ts.map +1 -0
- package/out/replicache/src/dag/invalid-ref-count-error.js +19 -0
- package/out/replicache/src/dag/invalid-ref-count-error.js.map +1 -0
- package/out/replicache/src/dag/lazy-store.d.ts +17 -4
- package/out/replicache/src/dag/lazy-store.d.ts.map +1 -1
- package/out/replicache/src/dag/lazy-store.js +35 -9
- package/out/replicache/src/dag/lazy-store.js.map +1 -1
- package/out/replicache/src/dag/store-impl.d.ts +12 -2
- package/out/replicache/src/dag/store-impl.d.ts.map +1 -1
- package/out/replicache/src/dag/store-impl.js +29 -9
- package/out/replicache/src/dag/store-impl.js.map +1 -1
- package/out/replicache/src/db/rebase.d.ts +14 -2
- package/out/replicache/src/db/rebase.d.ts.map +1 -1
- package/out/replicache/src/db/rebase.js +27 -5
- package/out/replicache/src/db/rebase.js.map +1 -1
- package/out/replicache/src/get-kv-store-provider.d.ts +1 -1
- package/out/replicache/src/get-kv-store-provider.d.ts.map +1 -1
- package/out/replicache/src/get-kv-store-provider.js +4 -4
- package/out/replicache/src/get-kv-store-provider.js.map +1 -1
- package/out/replicache/src/kv/expo-sqlite/store.d.ts.map +1 -1
- package/out/replicache/src/kv/expo-sqlite/store.js +28 -5
- package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
- package/out/replicache/src/kv/idb-store.d.ts +18 -0
- package/out/replicache/src/kv/idb-store.d.ts.map +1 -1
- package/out/replicache/src/kv/idb-store.js +30 -2
- package/out/replicache/src/kv/idb-store.js.map +1 -1
- package/out/replicache/src/kv/mem-fallback-store.d.ts +54 -0
- package/out/replicache/src/kv/mem-fallback-store.d.ts.map +1 -0
- package/out/replicache/src/kv/mem-fallback-store.js +177 -0
- package/out/replicache/src/kv/mem-fallback-store.js.map +1 -0
- package/out/replicache/src/kv/mem-store.d.ts +1 -0
- package/out/replicache/src/kv/mem-store.d.ts.map +1 -1
- package/out/replicache/src/kv/mem-store.js +3 -0
- package/out/replicache/src/kv/mem-store.js.map +1 -1
- package/out/replicache/src/kv/op-sqlite/store.d.ts.map +1 -1
- package/out/replicache/src/kv/op-sqlite/store.js +4 -4
- package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
- package/out/replicache/src/kv/sqlite-store.d.ts +22 -1
- package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
- package/out/replicache/src/kv/sqlite-store.js +159 -14
- package/out/replicache/src/kv/sqlite-store.js.map +1 -1
- package/out/replicache/src/kv/store.d.ts +6 -0
- package/out/replicache/src/kv/store.d.ts.map +1 -1
- package/out/replicache/src/new-client-channel.js.map +1 -1
- package/out/replicache/src/persist/client-gc.d.ts +2 -1
- package/out/replicache/src/persist/client-gc.d.ts.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.d.ts +2 -1
- package/out/replicache/src/persist/client-group-gc.d.ts.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/clients.d.ts +2 -2
- package/out/replicache/src/persist/collect-idb-databases.d.ts +28 -8
- package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
- package/out/replicache/src/persist/collect-idb-databases.js +97 -20
- package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
- package/out/replicache/src/persist/heartbeat.d.ts +2 -1
- package/out/replicache/src/persist/heartbeat.d.ts.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-db-name.js +1 -1
- package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -1
- package/out/replicache/src/persist/persist.d.ts.map +1 -1
- package/out/replicache/src/persist/persist.js +18 -8
- package/out/replicache/src/persist/persist.js.map +1 -1
- package/out/replicache/src/persist/refresh.js +6 -2
- package/out/replicache/src/persist/refresh.js.map +1 -1
- package/out/replicache/src/replicache-impl.d.ts +85 -3
- package/out/replicache/src/replicache-impl.d.ts.map +1 -1
- package/out/replicache/src/replicache-impl.js +321 -29
- package/out/replicache/src/replicache-impl.js.map +1 -1
- package/out/replicache/src/replicache-options.d.ts +9 -0
- package/out/replicache/src/replicache-options.d.ts.map +1 -1
- package/out/replicache/src/storage-failure.d.ts +37 -0
- package/out/replicache/src/storage-failure.d.ts.map +1 -0
- package/out/replicache/src/storage-failure.js +31 -0
- package/out/replicache/src/storage-failure.js.map +1 -0
- package/out/shared/src/arrays.d.ts +5 -0
- package/out/shared/src/arrays.d.ts.map +1 -1
- package/out/shared/src/arrays.js +8 -10
- package/out/shared/src/arrays.js.map +1 -1
- package/out/shared/src/base64.d.ts +19 -0
- package/out/shared/src/base64.d.ts.map +1 -0
- package/out/shared/src/base64.js +40 -0
- package/out/shared/src/base64.js.map +1 -0
- package/out/shared/src/centroid.d.ts +0 -1
- package/out/shared/src/centroid.d.ts.map +1 -1
- package/out/shared/src/centroid.js +1 -4
- package/out/shared/src/centroid.js.map +1 -1
- package/out/shared/src/error.d.ts +11 -0
- package/out/shared/src/error.d.ts.map +1 -1
- package/out/shared/src/error.js +35 -1
- package/out/shared/src/error.js.map +1 -1
- package/out/shared/src/hash.d.ts.map +1 -1
- package/out/shared/src/hash.js +32 -7
- package/out/shared/src/hash.js.map +1 -1
- package/out/shared/src/iterables.d.ts +2 -0
- package/out/shared/src/iterables.d.ts.map +1 -1
- package/out/shared/src/iterables.js +18 -1
- package/out/shared/src/iterables.js.map +1 -1
- package/out/shared/src/map.d.ts +24 -2
- package/out/shared/src/map.d.ts.map +1 -1
- package/out/shared/src/map.js +18 -4
- package/out/shared/src/map.js.map +1 -1
- package/out/shared/src/options-types.d.ts +2 -2
- package/out/shared/src/options.d.ts.map +1 -1
- package/out/shared/src/options.js +10 -7
- package/out/shared/src/options.js.map +1 -1
- package/out/shared/src/packed-boolean-map.d.ts +7 -0
- package/out/shared/src/packed-boolean-map.d.ts.map +1 -0
- package/out/shared/src/packed-boolean-map.js +36 -0
- package/out/shared/src/packed-boolean-map.js.map +1 -0
- package/out/shared/src/random-values.js +12 -1
- package/out/shared/src/random-values.js.map +1 -1
- package/out/shared/src/ring-buffer.d.ts +10 -0
- package/out/shared/src/ring-buffer.d.ts.map +1 -1
- package/out/shared/src/ring-buffer.js +26 -1
- package/out/shared/src/ring-buffer.js.map +1 -1
- package/out/shared/src/tdigest.d.ts +10 -0
- package/out/shared/src/tdigest.d.ts.map +1 -1
- package/out/shared/src/tdigest.js +147 -63
- package/out/shared/src/tdigest.js.map +1 -1
- package/out/shared/src/valita.d.ts +13 -0
- package/out/shared/src/valita.d.ts.map +1 -1
- package/out/shared/src/valita.js +23 -23
- package/out/shared/src/valita.js.map +1 -1
- package/out/z2s/src/compiler.d.ts.map +1 -1
- package/out/z2s/src/compiler.js +10 -6
- package/out/z2s/src/compiler.js.map +1 -1
- package/out/z2s/src/sql.d.ts.map +1 -1
- package/out/z2s/src/sql.js +9 -5
- package/out/z2s/src/sql.js.map +1 -1
- package/out/zero/package.js +4 -5
- package/out/zero/package.js.map +1 -1
- package/out/zero/src/zero.js +2 -1
- package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.js +1 -0
- package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
- package/out/zero-cache/src/config/normalize.d.ts +1 -0
- package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
- package/out/zero-cache/src/config/normalize.js +46 -4
- package/out/zero-cache/src/config/normalize.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +116 -24
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +409 -157
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/custom/fetch.d.ts +1 -1
- package/out/zero-cache/src/custom/fetch.d.ts.map +1 -1
- package/out/zero-cache/src/custom/fetch.js.map +1 -1
- package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
- package/out/zero-cache/src/db/lite-tables.js +3 -4
- package/out/zero-cache/src/db/lite-tables.js.map +1 -1
- package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
- package/out/zero-cache/src/db/migration-lite.js +5 -3
- package/out/zero-cache/src/db/migration-lite.js.map +1 -1
- package/out/zero-cache/src/observability/events.js +4 -1
- package/out/zero-cache/src/observability/events.js.map +1 -1
- package/out/zero-cache/src/observability/log-throttle.d.ts +44 -0
- package/out/zero-cache/src/observability/log-throttle.d.ts.map +1 -0
- package/out/zero-cache/src/observability/log-throttle.js +76 -0
- package/out/zero-cache/src/observability/log-throttle.js.map +1 -0
- package/out/zero-cache/src/observability/metrics.d.ts.map +1 -1
- package/out/zero-cache/src/observability/metrics.js +2 -7
- package/out/zero-cache/src/observability/metrics.js.map +1 -1
- package/out/zero-cache/src/scripts/permissions.d.ts +16 -0
- package/out/zero-cache/src/scripts/permissions.d.ts.map +1 -1
- package/out/zero-cache/src/scripts/permissions.js +3 -3
- package/out/zero-cache/src/scripts/permissions.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 +117 -77
- package/out/zero-cache/src/server/change-streamer.js.map +1 -1
- package/out/zero-cache/src/server/inspector-delegate.d.ts +28 -2
- package/out/zero-cache/src/server/inspector-delegate.d.ts.map +1 -1
- package/out/zero-cache/src/server/inspector-delegate.js +37 -17
- package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
- package/out/zero-cache/src/server/main.d.ts.map +1 -1
- package/out/zero-cache/src/server/main.js +8 -1
- package/out/zero-cache/src/server/main.js.map +1 -1
- package/out/zero-cache/src/server/mutator.js +2 -0
- package/out/zero-cache/src/server/mutator.js.map +1 -1
- package/out/zero-cache/src/server/reaper.d.ts.map +1 -1
- package/out/zero-cache/src/server/reaper.js +2 -0
- package/out/zero-cache/src/server/reaper.js.map +1 -1
- package/out/zero-cache/src/server/replicator.d.ts +3 -0
- package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/server/replicator.js +95 -21
- package/out/zero-cache/src/server/replicator.js.map +1 -1
- package/out/zero-cache/src/server/runner/zero-dispatcher.d.ts.map +1 -1
- package/out/zero-cache/src/server/runner/zero-dispatcher.js +5 -0
- package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
- package/out/zero-cache/src/server/syncer-assigner.d.ts +14 -0
- package/out/zero-cache/src/server/syncer-assigner.d.ts.map +1 -0
- package/out/zero-cache/src/server/syncer-assigner.js +72 -0
- package/out/zero-cache/src/server/syncer-assigner.js.map +1 -0
- package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/server/syncer.js +24 -2
- package/out/zero-cache/src/server/syncer.js.map +1 -1
- package/out/zero-cache/src/server/worker-dispatcher.d.ts.map +1 -1
- package/out/zero-cache/src/server/worker-dispatcher.js +21 -4
- package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -1
- package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
- package/out/zero-cache/src/services/analyze.js +11 -9
- package/out/zero-cache/src/services/analyze.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/common/backfill-manager.js +198 -24
- 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.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js +16 -4
- 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.d.ts +24 -0
- package/out/zero-cache/src/services/change-source/common/init-cleanup.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/common/init-cleanup.js +44 -0
- package/out/zero-cache/src/services/change-source/common/init-cleanup.js.map +1 -0
- package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts +92 -2
- package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/common/replica-restore.js +27 -10
- 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.d.ts +1 -0
- package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/common/replica-schema.js +15 -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.d.ts +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.js +7 -3
- 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-stream.d.ts +9 -0
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +206 -19
- 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 +55 -0
- package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/change-source-init.js +305 -0
- package/out/zero-cache/src/services/change-source/pg/change-source-init.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +31 -18
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.js +130 -157
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +38 -2
- 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 +55 -21
- 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/stream.d.ts +31 -0
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +102 -3
- 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/replication-slot-cleanup-monitor.d.ts +16 -0
- package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js +113 -0
- package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts +40 -15
- package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slots.js +149 -27
- 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/index-predicate.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js +68 -8
- 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.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.js +32 -1
- 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/replica-stage-enum.d.ts +10 -0
- package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js +6 -0
- package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +50 -27
- 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 +98 -34
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts +68 -0
- package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js +141 -0
- package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js.map +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +45 -2
- package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/data.js +10 -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.d.ts +60 -3
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts +23 -10
- package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/upstream.js +17 -7
- 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 +2 -1
- package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts +72 -0
- package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js +162 -0
- package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts +50 -0
- package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/backfill-state.js +268 -0
- package/out/zero-cache/src/services/change-streamer/backfill-state.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js +6 -17
- 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.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-monitor.js +59 -8
- package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/broadcast.d.ts +8 -2
- package/out/zero-cache/src/services/change-streamer/broadcast.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/broadcast.js +24 -4
- 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 +19 -4
- 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 +28 -8
- 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.d.ts +17 -0
- package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-log-initializer.js +44 -1
- package/out/zero-cache/src/services/change-streamer/change-log-initializer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +48 -6
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +131 -34
- 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.d.ts +22 -0
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +149 -78
- 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.d.ts +38 -16
- package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/forwarder.d.ts +3 -3
- package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/forwarder.js +36 -5
- package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts +53 -0
- package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js +156 -0
- package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +58 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.js +107 -16
- package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts +92 -0
- package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/snapshot-message.js +42 -0
- package/out/zero-cache/src/services/change-streamer/snapshot-message.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js +16 -4
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot.d.ts +7 -69
- package/out/zero-cache/src/services/change-streamer/snapshot.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot.js +21 -53
- package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts +6 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js +27 -9
- 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 +95 -4
- package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js +293 -83
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscribe.d.ts +446 -0
- package/out/zero-cache/src/services/change-streamer/subscribe.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/subscribe.js +76 -0
- package/out/zero-cache/src/services/change-streamer/subscribe.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +58 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.js +123 -12
- package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts +19 -1
- package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/upstream-acker.js +23 -3
- package/out/zero-cache/src/services/change-streamer/upstream-acker.js.map +1 -1
- package/out/zero-cache/src/services/http-service.d.ts +1 -1
- package/out/zero-cache/src/services/http-service.d.ts.map +1 -1
- package/out/zero-cache/src/services/http-service.js.map +1 -1
- package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
- package/out/zero-cache/src/services/life-cycle.js +3 -1
- package/out/zero-cache/src/services/life-cycle.js.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.d.ts +34 -3
- package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.js +121 -35
- package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
- package/out/zero-cache/src/services/litestream/config-v5.yml +6 -7
- package/out/zero-cache/src/services/litestream/litestream-checkpointer.js +51 -24
- package/out/zero-cache/src/services/litestream/litestream-checkpointer.js.map +1 -1
- package/out/zero-cache/src/services/litestream/litestream-controller.d.ts +10 -2
- package/out/zero-cache/src/services/litestream/litestream-controller.d.ts.map +1 -1
- package/out/zero-cache/src/services/litestream/litestream-controller.js +3 -2
- package/out/zero-cache/src/services/litestream/litestream-controller.js.map +1 -1
- package/out/zero-cache/src/services/litestream/restore-progress.d.ts +24 -0
- package/out/zero-cache/src/services/litestream/restore-progress.d.ts.map +1 -0
- package/out/zero-cache/src/services/litestream/restore-progress.js +91 -0
- package/out/zero-cache/src/services/litestream/restore-progress.js.map +1 -0
- package/out/zero-cache/src/services/litestream/wal-keeper.d.ts +33 -0
- package/out/zero-cache/src/services/litestream/wal-keeper.d.ts.map +1 -0
- package/out/zero-cache/src/services/litestream/wal-keeper.js +49 -0
- package/out/zero-cache/src/services/litestream/wal-keeper.js.map +1 -0
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts +5 -0
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js +7 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/pusher.js +5 -6
- package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
- package/out/zero-cache/src/services/plannerz.d.ts +163 -0
- package/out/zero-cache/src/services/plannerz.d.ts.map +1 -0
- package/out/zero-cache/src/services/plannerz.js +267 -0
- package/out/zero-cache/src/services/plannerz.js.map +1 -0
- package/out/zero-cache/src/services/profz.d.ts +30 -0
- package/out/zero-cache/src/services/profz.d.ts.map +1 -0
- package/out/zero-cache/src/services/profz.js +163 -0
- package/out/zero-cache/src/services/profz.js.map +1 -0
- package/out/zero-cache/src/services/replicator/change-log-cookies.js +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-stream-writer.d.ts +5 -4
- package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/change-log-stream-writer.js +20 -22
- package/out/zero-cache/src/services/replicator/change-log-stream-writer.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.js +51 -5
- package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +5 -2
- package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.js +54 -21
- package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
- package/out/zero-cache/src/services/replicator/replication-status.d.ts +35 -1
- package/out/zero-cache/src/services/replicator/replication-status.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/replication-status.js +99 -8
- package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.d.ts +4 -1
- package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.js +5 -2
- package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
- package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts +16 -1
- package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/reporter/recorder.js +70 -27
- package/out/zero-cache/src/services/replicator/reporter/recorder.js.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts +23 -2
- package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/backfilling.js +54 -2
- package/out/zero-cache/src/services/replicator/schema/backfilling.js.map +1 -1
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts +6 -6
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js +19 -14
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js.map +1 -1
- package/out/zero-cache/src/services/replicator/write-worker-client.d.ts +11 -3
- package/out/zero-cache/src/services/replicator/write-worker-client.d.ts.map +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 +5 -1
- package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
- package/out/zero-cache/src/services/run-ast.d.ts +12 -0
- package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
- package/out/zero-cache/src/services/run-ast.js +42 -22
- package/out/zero-cache/src/services/run-ast.js.map +1 -1
- package/out/zero-cache/src/services/runner.d.ts +2 -1
- package/out/zero-cache/src/services/runner.d.ts.map +1 -1
- package/out/zero-cache/src/services/runner.js +10 -2
- package/out/zero-cache/src/services/runner.js.map +1 -1
- package/out/zero-cache/src/services/statz.d.ts +4 -0
- package/out/zero-cache/src/services/statz.d.ts.map +1 -1
- package/out/zero-cache/src/services/statz.js +22 -5
- package/out/zero-cache/src/services/statz.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/advancement-metrics.d.ts +26 -0
- package/out/zero-cache/src/services/view-syncer/advancement-metrics.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/advancement-metrics.js +26 -0
- package/out/zero-cache/src/services/view-syncer/advancement-metrics.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +19 -2
- 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 +42 -30
- package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts +2 -1
- package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/connection-context-manager.js +1 -0
- package/out/zero-cache/src/services/view-syncer/connection-context-manager.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +27 -2
- 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 +85 -20
- package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts +76 -11
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.js +214 -40
- package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts +81 -0
- package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js +128 -0
- package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts +14 -1
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +30 -4
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts +33 -0
- package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/hydration-budget.js +62 -0
- package/out/zero-cache/src/services/view-syncer/hydration-budget.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts +51 -0
- package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js +78 -0
- package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts +10 -1
- package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/inspect-handler.js +18 -4
- 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 +80 -6
- 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 +658 -195
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts +7 -0
- package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/plan-warnings.js +35 -0
- package/out/zero-cache/src/services/view-syncer/plan-warnings.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/query-covering.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/query-covering.js +2 -6
- package/out/zero-cache/src/services/view-syncer/query-covering.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/query-shape.d.ts +25 -0
- package/out/zero-cache/src/services/view-syncer/query-shape.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/query-shape.js +28 -0
- package/out/zero-cache/src/services/view-syncer/query-shape.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/query-stats.d.ts +82 -0
- package/out/zero-cache/src/services/view-syncer/query-stats.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/query-stats.js +214 -0
- package/out/zero-cache/src/services/view-syncer/query-stats.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +2 -107
- package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/types.js +5 -20
- 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.d.ts +95 -0
- package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js +155 -0
- package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +96 -14
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.js +214 -30
- package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +11 -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 +566 -107
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/pg-data-type.d.ts +2 -0
- package/out/zero-cache/src/types/pg-data-type.d.ts.map +1 -1
- package/out/zero-cache/src/types/pg-data-type.js +6 -1
- package/out/zero-cache/src/types/pg-data-type.js.map +1 -1
- package/out/zero-cache/src/types/pg.d.ts.map +1 -1
- package/out/zero-cache/src/types/pg.js +1 -1
- package/out/zero-cache/src/types/pg.js.map +1 -1
- package/out/zero-cache/src/types/processes.d.ts +39 -0
- package/out/zero-cache/src/types/processes.d.ts.map +1 -1
- package/out/zero-cache/src/types/processes.js +43 -4
- package/out/zero-cache/src/types/processes.js.map +1 -1
- package/out/zero-cache/src/types/profiler.d.ts +12 -0
- package/out/zero-cache/src/types/profiler.d.ts.map +1 -1
- package/out/zero-cache/src/types/profiler.js +46 -1
- package/out/zero-cache/src/types/profiler.js.map +1 -1
- package/out/zero-cache/src/types/row-key.d.ts +1 -15
- package/out/zero-cache/src/types/row-key.d.ts.map +1 -1
- package/out/zero-cache/src/types/row-key.js +6 -8
- package/out/zero-cache/src/types/row-key.js.map +1 -1
- package/out/zero-cache/src/types/streams.d.ts +49 -7
- package/out/zero-cache/src/types/streams.d.ts.map +1 -1
- package/out/zero-cache/src/types/streams.js +190 -58
- package/out/zero-cache/src/types/streams.js.map +1 -1
- package/out/zero-cache/src/types/subscription.d.ts +15 -0
- package/out/zero-cache/src/types/subscription.d.ts.map +1 -1
- package/out/zero-cache/src/types/subscription.js +123 -31
- package/out/zero-cache/src/types/subscription.js.map +1 -1
- package/out/zero-cache/src/types/websocket-handoff.d.ts +1 -1
- package/out/zero-cache/src/types/websocket-handoff.d.ts.map +1 -1
- package/out/zero-cache/src/types/websocket-handoff.js +18 -9
- package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
- package/out/zero-cache/src/types/ws.d.ts.map +1 -1
- package/out/zero-cache/src/types/ws.js +1 -16
- package/out/zero-cache/src/types/ws.js.map +1 -1
- package/out/zero-cache/src/workers/connect-params.d.ts +18 -1
- package/out/zero-cache/src/workers/connect-params.d.ts.map +1 -1
- package/out/zero-cache/src/workers/connect-params.js +25 -1
- package/out/zero-cache/src/workers/connect-params.js.map +1 -1
- package/out/zero-cache/src/workers/connection.d.ts +4 -4
- package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
- package/out/zero-cache/src/workers/connection.js +8 -8
- package/out/zero-cache/src/workers/connection.js.map +1 -1
- package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/workers/replicator.js +15 -7
- 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 +21 -16
- package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
- package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/workers/syncer.js +55 -4
- package/out/zero-cache/src/workers/syncer.js.map +1 -1
- package/out/zero-client/src/client/active-clients-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/active-clients-manager.js +4 -1
- package/out/zero-client/src/client/active-clients-manager.js.map +1 -1
- package/out/zero-client/src/client/connection-manager.d.ts +20 -0
- package/out/zero-client/src/client/connection-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/connection-manager.js +77 -13
- package/out/zero-client/src/client/connection-manager.js.map +1 -1
- package/out/zero-client/src/client/connection-status-enum.d.ts +2 -0
- package/out/zero-client/src/client/connection-status-enum.d.ts.map +1 -1
- package/out/zero-client/src/client/connection-status-enum.js +3 -1
- package/out/zero-client/src/client/connection-status-enum.js.map +1 -1
- package/out/zero-client/src/client/connection.d.ts +6 -0
- package/out/zero-client/src/client/connection.d.ts.map +1 -1
- package/out/zero-client/src/client/connection.js +2 -1
- package/out/zero-client/src/client/connection.js.map +1 -1
- package/out/zero-client/src/client/context.d.ts +23 -13
- package/out/zero-client/src/client/context.d.ts.map +1 -1
- package/out/zero-client/src/client/context.js +94 -26
- package/out/zero-client/src/client/context.js.map +1 -1
- package/out/zero-client/src/client/crud-impl.d.ts.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/custom.d.ts +5 -4
- package/out/zero-client/src/client/custom.d.ts.map +1 -1
- package/out/zero-client/src/client/custom.js +3 -3
- package/out/zero-client/src/client/custom.js.map +1 -1
- package/out/zero-client/src/client/inspector/lazy-inspector.js +1 -1
- package/out/zero-client/src/client/ivm-branch.d.ts.map +1 -1
- package/out/zero-client/src/client/ivm-branch.js +20 -3
- package/out/zero-client/src/client/ivm-branch.js.map +1 -1
- package/out/zero-client/src/client/keys.d.ts.map +1 -1
- package/out/zero-client/src/client/keys.js +19 -1
- package/out/zero-client/src/client/keys.js.map +1 -1
- package/out/zero-client/src/client/make-mutate-property.d.ts +1 -1
- package/out/zero-client/src/client/make-mutate-property.d.ts.map +1 -1
- package/out/zero-client/src/client/make-mutate-property.js.map +1 -1
- package/out/zero-client/src/client/make-replicache-mutators.d.ts.map +1 -1
- package/out/zero-client/src/client/make-replicache-mutators.js +1 -1
- package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
- package/out/zero-client/src/client/mutation-tracker.d.ts +2 -2
- package/out/zero-client/src/client/mutation-tracker.d.ts.map +1 -1
- package/out/zero-client/src/client/mutation-tracker.js +3 -7
- package/out/zero-client/src/client/mutation-tracker.js.map +1 -1
- package/out/zero-client/src/client/mutator-proxy.d.ts.map +1 -1
- package/out/zero-client/src/client/mutator-proxy.js +9 -4
- package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
- package/out/zero-client/src/client/options.d.ts +33 -0
- package/out/zero-client/src/client/options.d.ts.map +1 -1
- package/out/zero-client/src/client/options.js.map +1 -1
- package/out/zero-client/src/client/query-manager.d.ts +9 -0
- package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/query-manager.js +47 -14
- package/out/zero-client/src/client/query-manager.js.map +1 -1
- package/out/zero-client/src/client/reload-error-handler.js +2 -2
- 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-rep.d.ts +1 -0
- package/out/zero-client/src/client/zero-rep.d.ts.map +1 -1
- package/out/zero-client/src/client/zero-rep.js +8 -6
- package/out/zero-client/src/client/zero-rep.js.map +1 -1
- package/out/zero-client/src/client/zero.d.ts +18 -3
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.js +89 -50
- package/out/zero-client/src/client/zero.js.map +1 -1
- package/out/zero-client/src/mod.d.ts +2 -1
- package/out/zero-client/src/mod.d.ts.map +1 -1
- package/out/zero-client/src/mod.js +1 -0
- package/out/zero-client/src/types/query-result.d.ts +2 -0
- package/out/zero-client/src/types/query-result.d.ts.map +1 -1
- package/out/zero-events/src/status.d.ts +64 -0
- package/out/zero-events/src/status.d.ts.map +1 -1
- package/out/zero-protocol/src/analyze-query-result.d.ts +5 -0
- package/out/zero-protocol/src/analyze-query-result.d.ts.map +1 -1
- package/out/zero-protocol/src/analyze-query-result.js.map +1 -1
- package/out/zero-protocol/src/ast.d.ts.map +1 -1
- package/out/zero-protocol/src/ast.js +13 -14
- package/out/zero-protocol/src/ast.js.map +1 -1
- package/out/zero-protocol/src/connect.d.ts +16 -0
- package/out/zero-protocol/src/connect.d.ts.map +1 -1
- package/out/zero-protocol/src/connect.js +27 -1
- package/out/zero-protocol/src/connect.js.map +1 -1
- package/out/zero-protocol/src/down.d.ts +31 -31
- package/out/zero-protocol/src/feature-flag-enum.d.ts +14 -0
- package/out/zero-protocol/src/feature-flag-enum.d.ts.map +1 -0
- package/out/zero-protocol/src/feature-flag-enum.js +10 -0
- package/out/zero-protocol/src/feature-flag-enum.js.map +1 -0
- package/out/zero-protocol/src/feature-flag.d.ts +5 -0
- package/out/zero-protocol/src/feature-flag.d.ts.map +1 -0
- package/out/zero-protocol/src/inspect-down.d.ts +16 -16
- package/out/zero-protocol/src/poke.d.ts +17 -10
- package/out/zero-protocol/src/poke.d.ts.map +1 -1
- package/out/zero-protocol/src/poke.js +3 -2
- package/out/zero-protocol/src/poke.js.map +1 -1
- package/out/zero-protocol/src/protocol-version.d.ts +30 -6
- package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
- package/out/zero-protocol/src/protocol-version.js +1 -1
- package/out/zero-protocol/src/protocol-version.js.map +1 -1
- package/out/zero-protocol/src/query-hash.d.ts.map +1 -1
- package/out/zero-protocol/src/query-hash.js +2 -5
- package/out/zero-protocol/src/query-hash.js.map +1 -1
- package/out/zero-react/src/use-query.d.ts +5 -4
- package/out/zero-react/src/use-query.d.ts.map +1 -1
- package/out/zero-react/src/use-query.js +74 -7
- package/out/zero-react/src/use-query.js.map +1 -1
- package/out/zero-react/src/zero.js +1 -0
- package/out/zero-server/src/adapters/drizzle.d.ts +2 -1
- package/out/zero-server/src/adapters/drizzle.d.ts.map +1 -1
- package/out/zero-server/src/adapters/drizzle.js +12 -7
- package/out/zero-server/src/adapters/drizzle.js.map +1 -1
- package/out/zero-server/src/adapters/kysely.d.ts +2 -1
- package/out/zero-server/src/adapters/kysely.d.ts.map +1 -1
- package/out/zero-server/src/adapters/kysely.js +8 -2
- package/out/zero-server/src/adapters/kysely.js.map +1 -1
- package/out/zero-server/src/adapters/pg.d.ts +5 -1
- package/out/zero-server/src/adapters/pg.d.ts.map +1 -1
- package/out/zero-server/src/adapters/pg.js +28 -7
- package/out/zero-server/src/adapters/pg.js.map +1 -1
- package/out/zero-server/src/adapters/postgresjs.d.ts +1 -0
- package/out/zero-server/src/adapters/postgresjs.d.ts.map +1 -1
- package/out/zero-server/src/adapters/postgresjs.js +7 -1
- package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
- package/out/zero-server/src/adapters/prisma.d.ts +3 -2
- package/out/zero-server/src/adapters/prisma.d.ts.map +1 -1
- package/out/zero-server/src/adapters/prisma.js +8 -2
- package/out/zero-server/src/adapters/prisma.js.map +1 -1
- package/out/zero-server/src/closable-db-transaction.d.ts +16 -0
- package/out/zero-server/src/closable-db-transaction.d.ts.map +1 -0
- package/out/zero-server/src/closable-db-transaction.js +31 -0
- package/out/zero-server/src/closable-db-transaction.js.map +1 -0
- package/out/zero-server/src/custom.d.ts +10 -4
- package/out/zero-server/src/custom.d.ts.map +1 -1
- package/out/zero-server/src/custom.js +15 -6
- package/out/zero-server/src/custom.js.map +1 -1
- package/out/zero-server/src/logging.d.ts +2 -2
- package/out/zero-server/src/logging.d.ts.map +1 -1
- package/out/zero-server/src/logging.js +2 -2
- package/out/zero-server/src/logging.js.map +1 -1
- package/out/zero-server/src/mod.d.ts +1 -1
- package/out/zero-server/src/mod.d.ts.map +1 -1
- package/out/zero-server/src/pg-query-executor.d.ts +2 -2
- package/out/zero-server/src/pg-query-executor.d.ts.map +1 -1
- package/out/zero-server/src/pg-query-executor.js +2 -2
- package/out/zero-server/src/pg-query-executor.js.map +1 -1
- package/out/zero-server/src/process-mutations.d.ts +25 -4
- package/out/zero-server/src/process-mutations.d.ts.map +1 -1
- package/out/zero-server/src/process-mutations.js +103 -52
- package/out/zero-server/src/process-mutations.js.map +1 -1
- package/out/zero-server/src/push-processor.d.ts +8 -2
- package/out/zero-server/src/push-processor.d.ts.map +1 -1
- package/out/zero-server/src/push-processor.js +12 -4
- package/out/zero-server/src/push-processor.js.map +1 -1
- package/out/zero-server/src/schema.d.ts +2 -2
- package/out/zero-server/src/schema.d.ts.map +1 -1
- package/out/zero-server/src/schema.js +3 -2
- package/out/zero-server/src/schema.js.map +1 -1
- package/out/zero-server/src/zql-database.d.ts +21 -1
- package/out/zero-server/src/zql-database.d.ts.map +1 -1
- package/out/zero-server/src/zql-database.js +61 -24
- package/out/zero-server/src/zql-database.js.map +1 -1
- package/out/zero-solid/src/solid-view.d.ts +17 -0
- package/out/zero-solid/src/solid-view.d.ts.map +1 -1
- package/out/zero-solid/src/solid-view.js +39 -1
- package/out/zero-solid/src/solid-view.js.map +1 -1
- package/out/zero-solid/src/use-query.js +1 -2
- package/out/zero-solid/src/use-query.js.map +1 -1
- package/out/zero-solid/src/zero.js +1 -0
- package/out/zql/src/builder/builder.d.ts +25 -0
- package/out/zql/src/builder/builder.d.ts.map +1 -1
- package/out/zql/src/builder/builder.js +69 -19
- package/out/zql/src/builder/builder.js.map +1 -1
- package/out/zql/src/builder/correlated-predicate-pushdown.d.ts +43 -0
- package/out/zql/src/builder/correlated-predicate-pushdown.d.ts.map +1 -0
- package/out/zql/src/builder/correlated-predicate-pushdown.js +161 -0
- package/out/zql/src/builder/correlated-predicate-pushdown.js.map +1 -0
- package/out/zql/src/builder/debug-delegate.d.ts +6 -1
- package/out/zql/src/builder/debug-delegate.d.ts.map +1 -1
- package/out/zql/src/builder/debug-delegate.js +14 -2
- package/out/zql/src/builder/debug-delegate.js.map +1 -1
- package/out/zql/src/ivm/array-view.d.ts +29 -0
- package/out/zql/src/ivm/array-view.d.ts.map +1 -1
- package/out/zql/src/ivm/array-view.js +74 -16
- package/out/zql/src/ivm/array-view.js.map +1 -1
- package/out/zql/src/ivm/cap.d.ts +2 -1
- package/out/zql/src/ivm/cap.d.ts.map +1 -1
- package/out/zql/src/ivm/cap.js +14 -4
- package/out/zql/src/ivm/cap.js.map +1 -1
- package/out/zql/src/ivm/data.d.ts.map +1 -1
- package/out/zql/src/ivm/data.js +8 -3
- package/out/zql/src/ivm/data.js.map +1 -1
- package/out/zql/src/ivm/deferred-input.d.ts.map +1 -1
- package/out/zql/src/ivm/deferred-input.js +3 -2
- package/out/zql/src/ivm/deferred-input.js.map +1 -1
- package/out/zql/src/ivm/exists.d.ts +3 -1
- package/out/zql/src/ivm/exists.d.ts.map +1 -1
- package/out/zql/src/ivm/exists.js +4 -1
- package/out/zql/src/ivm/exists.js.map +1 -1
- package/out/zql/src/ivm/fan-in.d.ts +6 -2
- package/out/zql/src/ivm/fan-in.d.ts.map +1 -1
- package/out/zql/src/ivm/fan-in.js +13 -5
- package/out/zql/src/ivm/fan-in.js.map +1 -1
- package/out/zql/src/ivm/fan-out.d.ts +5 -2
- package/out/zql/src/ivm/fan-out.d.ts.map +1 -1
- package/out/zql/src/ivm/fan-out.js +4 -0
- package/out/zql/src/ivm/fan-out.js.map +1 -1
- package/out/zql/src/ivm/filter-operators.d.ts +8 -6
- package/out/zql/src/ivm/filter-operators.d.ts.map +1 -1
- package/out/zql/src/ivm/filter-operators.js +19 -8
- package/out/zql/src/ivm/filter-operators.js.map +1 -1
- package/out/zql/src/ivm/filter.d.ts +5 -2
- package/out/zql/src/ivm/filter.d.ts.map +1 -1
- package/out/zql/src/ivm/filter.js +10 -4
- package/out/zql/src/ivm/filter.js.map +1 -1
- package/out/zql/src/ivm/flipped-join.d.ts +9 -4
- package/out/zql/src/ivm/flipped-join.d.ts.map +1 -1
- package/out/zql/src/ivm/flipped-join.js +97 -46
- package/out/zql/src/ivm/flipped-join.js.map +1 -1
- package/out/zql/src/ivm/join-index-tap.d.ts +33 -0
- package/out/zql/src/ivm/join-index-tap.d.ts.map +1 -0
- package/out/zql/src/ivm/join-index-tap.js +70 -0
- package/out/zql/src/ivm/join-index-tap.js.map +1 -0
- package/out/zql/src/ivm/join-index.d.ts +35 -0
- package/out/zql/src/ivm/join-index.d.ts.map +1 -0
- package/out/zql/src/ivm/join-index.js +141 -0
- package/out/zql/src/ivm/join-index.js.map +1 -0
- package/out/zql/src/ivm/join-utils.d.ts +6 -0
- package/out/zql/src/ivm/join-utils.d.ts.map +1 -1
- package/out/zql/src/ivm/join-utils.js +22 -1
- package/out/zql/src/ivm/join-utils.js.map +1 -1
- package/out/zql/src/ivm/join.d.ts +19 -1
- package/out/zql/src/ivm/join.d.ts.map +1 -1
- package/out/zql/src/ivm/join.js +107 -15
- package/out/zql/src/ivm/join.js.map +1 -1
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts +1 -1
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts.map +1 -1
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +6 -4
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
- package/out/zql/src/ivm/memory-source.d.ts +29 -4
- package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-source.js +70 -34
- package/out/zql/src/ivm/memory-source.js.map +1 -1
- package/out/zql/src/ivm/memory-storage.d.ts +1 -0
- package/out/zql/src/ivm/memory-storage.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-storage.js +1 -0
- package/out/zql/src/ivm/memory-storage.js.map +1 -1
- package/out/zql/src/ivm/operator.d.ts +45 -10
- package/out/zql/src/ivm/operator.d.ts.map +1 -1
- package/out/zql/src/ivm/operator.js +9 -4
- package/out/zql/src/ivm/operator.js.map +1 -1
- package/out/zql/src/ivm/push-accumulated.d.ts +6 -1
- package/out/zql/src/ivm/push-accumulated.d.ts.map +1 -1
- package/out/zql/src/ivm/push-accumulated.js +47 -2
- package/out/zql/src/ivm/push-accumulated.js.map +1 -1
- package/out/zql/src/ivm/skip.d.ts +2 -1
- package/out/zql/src/ivm/skip.d.ts.map +1 -1
- package/out/zql/src/ivm/skip.js +3 -0
- package/out/zql/src/ivm/skip.js.map +1 -1
- package/out/zql/src/ivm/take-gate.d.ts +57 -0
- package/out/zql/src/ivm/take-gate.d.ts.map +1 -0
- package/out/zql/src/ivm/take-gate.js +106 -0
- package/out/zql/src/ivm/take-gate.js.map +1 -0
- package/out/zql/src/ivm/take.d.ts +8 -2
- package/out/zql/src/ivm/take.d.ts.map +1 -1
- package/out/zql/src/ivm/take.js +139 -103
- package/out/zql/src/ivm/take.js.map +1 -1
- package/out/zql/src/ivm/union-fan-in.d.ts +3 -0
- package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
- package/out/zql/src/ivm/union-fan-in.js +63 -10
- package/out/zql/src/ivm/union-fan-in.js.map +1 -1
- package/out/zql/src/ivm/union-fan-out.d.ts +2 -1
- package/out/zql/src/ivm/union-fan-out.d.ts.map +1 -1
- package/out/zql/src/ivm/union-fan-out.js +5 -0
- package/out/zql/src/ivm/union-fan-out.js.map +1 -1
- package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
- package/out/zql/src/ivm/view-apply-change.js +9 -4
- package/out/zql/src/ivm/view-apply-change.js.map +1 -1
- package/out/zql/src/ivm/view.d.ts +15 -0
- package/out/zql/src/ivm/view.d.ts.map +1 -1
- package/out/zql/src/mutate/custom.d.ts +53 -1
- package/out/zql/src/mutate/custom.d.ts.map +1 -1
- package/out/zql/src/mutate/custom.js.map +1 -1
- package/out/zql/src/mutate/mutator-registry.d.ts.map +1 -1
- package/out/zql/src/mutate/mutator-registry.js +3 -3
- package/out/zql/src/mutate/mutator-registry.js.map +1 -1
- package/out/zql/src/mutate/mutator.d.ts +2 -2
- package/out/zql/src/mutate/mutator.d.ts.map +1 -1
- package/out/zql/src/mutate/mutator.js.map +1 -1
- package/out/zql/src/planner/planner-builder.d.ts +23 -3
- package/out/zql/src/planner/planner-builder.d.ts.map +1 -1
- package/out/zql/src/planner/planner-builder.js +34 -17
- package/out/zql/src/planner/planner-builder.js.map +1 -1
- package/out/zql/src/planner/planner-connection.d.ts +58 -2
- package/out/zql/src/planner/planner-connection.d.ts.map +1 -1
- package/out/zql/src/planner/planner-connection.js +103 -11
- package/out/zql/src/planner/planner-connection.js.map +1 -1
- package/out/zql/src/planner/planner-debug.d.ts.map +1 -1
- package/out/zql/src/planner/planner-debug.js +3 -8
- package/out/zql/src/planner/planner-debug.js.map +1 -1
- package/out/zql/src/planner/planner-graph.d.ts +10 -0
- package/out/zql/src/planner/planner-graph.d.ts.map +1 -1
- package/out/zql/src/planner/planner-graph.js +14 -0
- package/out/zql/src/planner/planner-graph.js.map +1 -1
- package/out/zql/src/planner/planner-source.d.ts +2 -2
- package/out/zql/src/planner/planner-source.d.ts.map +1 -1
- package/out/zql/src/planner/planner-source.js +2 -2
- package/out/zql/src/planner/planner-source.js.map +1 -1
- package/out/zql/src/planner/planner-warnings.d.ts +83 -0
- package/out/zql/src/planner/planner-warnings.d.ts.map +1 -0
- package/out/zql/src/planner/planner-warnings.js +78 -0
- package/out/zql/src/planner/planner-warnings.js.map +1 -0
- package/out/zql/src/query/measure-push-operator.d.ts +9 -2
- package/out/zql/src/query/measure-push-operator.d.ts.map +1 -1
- package/out/zql/src/query/measure-push-operator.js +52 -5
- package/out/zql/src/query/measure-push-operator.js.map +1 -1
- package/out/zql/src/query/query-delegate-base.d.ts +4 -2
- package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
- package/out/zql/src/query/query-delegate-base.js +66 -33
- package/out/zql/src/query/query-delegate-base.js.map +1 -1
- package/out/zql/src/query/query-delegate.d.ts +33 -6
- package/out/zql/src/query/query-delegate.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.d.ts +1 -0
- package/out/zql/src/query/query-impl.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.js +6 -23
- package/out/zql/src/query/query-impl.js.map +1 -1
- package/out/zql/src/query/query-transitions.d.ts.map +1 -1
- package/out/zql/src/query/query-transitions.js +2 -5
- package/out/zql/src/query/query-transitions.js.map +1 -1
- package/out/zql/src/query/query.d.ts +22 -5
- package/out/zql/src/query/query.d.ts.map +1 -1
- package/out/zql/src/query/runnable-query-impl.d.ts +1 -0
- package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -1
- package/out/zql/src/query/runnable-query-impl.js +2 -10
- package/out/zql/src/query/runnable-query-impl.js.map +1 -1
- package/out/zql/src/query/typed-view.d.ts +1 -1
- package/out/zql/src/query/typed-view.d.ts.map +1 -1
- package/out/zqlite/src/database-storage.d.ts.map +1 -1
- package/out/zqlite/src/database-storage.js +9 -1
- package/out/zqlite/src/database-storage.js.map +1 -1
- package/out/zqlite/src/db.d.ts +9 -1
- package/out/zqlite/src/db.d.ts.map +1 -1
- package/out/zqlite/src/db.js +62 -30
- package/out/zqlite/src/db.js.map +1 -1
- package/out/zqlite/src/index-usage.d.ts +19 -0
- package/out/zqlite/src/index-usage.d.ts.map +1 -0
- package/out/zqlite/src/index-usage.js +49 -0
- package/out/zqlite/src/index-usage.js.map +1 -0
- package/out/zqlite/src/pending-delta.d.ts +110 -0
- package/out/zqlite/src/pending-delta.d.ts.map +1 -0
- package/out/zqlite/src/pending-delta.js +278 -0
- package/out/zqlite/src/pending-delta.js.map +1 -0
- package/out/zqlite/src/query-builder.d.ts +17 -1
- package/out/zqlite/src/query-builder.d.ts.map +1 -1
- package/out/zqlite/src/query-builder.js +111 -20
- package/out/zqlite/src/query-builder.js.map +1 -1
- package/out/zqlite/src/query-delegate.d.ts.map +1 -1
- package/out/zqlite/src/query-delegate.js +10 -7
- package/out/zqlite/src/query-delegate.js.map +1 -1
- package/out/zqlite/src/resolve-scalar-subqueries.d.ts +3 -1
- package/out/zqlite/src/resolve-scalar-subqueries.d.ts.map +1 -1
- package/out/zqlite/src/resolve-scalar-subqueries.js +1 -0
- package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
- package/out/zqlite/src/sqlite-cost-model.d.ts.map +1 -1
- package/out/zqlite/src/sqlite-cost-model.js +52 -1
- package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
- package/out/zqlite/src/sqlite-stat-fanout.d.ts.map +1 -1
- package/out/zqlite/src/sqlite-stat-fanout.js +5 -31
- package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
- package/out/zqlite/src/sqlite-stat4-sample.d.ts +37 -0
- package/out/zqlite/src/sqlite-stat4-sample.d.ts.map +1 -0
- package/out/zqlite/src/sqlite-stat4-sample.js +61 -0
- package/out/zqlite/src/sqlite-stat4-sample.js.map +1 -0
- package/out/zqlite/src/table-source.d.ts +87 -2
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +276 -42
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +4 -5
- package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts +0 -25
- package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts.map +0 -1
- package/out/replicache/src/kv/idb-store-with-mem-fallback.js +0 -83
- package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +0 -1
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts +0 -29
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts.map +0 -1
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js +0 -154
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replicache-impl.js","names":["#subscriptions","#mutationRecovery","#kvStoreProvider","#zero","#auth","#idbDatabase","#clientID","#ready","#profileIDPromise","#clientGroupIDPromise","#mutatorRegistry","#requestOptions","#idbDatabases","#lc","#closeAbortController","#persistLock","#enableScheduledPersist","#enableScheduledRefresh","#enableRefresh","#enablePullAndPushInOpen","#onPersist","#queryInternal","#pullConnectionLoop","#invokePull","#pushConnectionLoop","#invokePush","#registerMutators","#wrapInOnlineCheck","#wrapInReauthRetries","#isPullDisabled","#isPushDisabled","#handlePersist","#open","#clientStateNotFoundOnClient","#fireOnUpdateNeeded","#onVisibilityChange","#closed","#checkForClientStateNotFoundAndCallHandler","#online","#schedulePersist","#changeSyncCounters","#convertToClientStateNotFoundError","#handleVersionNotSupportedResponse","#clientStateNotFoundOnServer","#fireOnClientStateNotFound","#schedule","#persistScheduler","#scheduleRefresh","#refreshScheduler","#pushCounter","#pullCounter","#mutate","#register"],"sources":["../../../../replicache/src/replicache-impl.ts"],"sourcesContent":["import {Lock} from '@rocicorp/lock';\nimport type {LogContext} from '@rocicorp/logger';\nimport {consoleLogSink} from '@rocicorp/logger';\nimport {resolver} from '@rocicorp/resolver';\nimport {AbortError} from '../../shared/src/abort-error.ts';\nimport {assert} from '../../shared/src/asserts.ts';\nimport {getBrowserGlobal} from '../../shared/src/browser-env.ts';\nimport {getDocumentVisibilityWatcher} from '../../shared/src/document-visible.ts';\nimport type {JSONValue, ReadonlyJSONValue} from '../../shared/src/json.ts';\nimport {promiseVoid} from '../../shared/src/resolved-promises.ts';\nimport {TESTING} from '../../shared/src/testing.ts';\nimport type {MaybePromise} from '../../shared/src/types.ts';\nimport {PullDelegate, PushDelegate} from './connection-loop-delegates.ts';\nimport {ConnectionLoop, MAX_DELAY_MS, MIN_DELAY_MS} from './connection-loop.ts';\nimport {assertCookie, type Cookie} from './cookies.ts';\nimport {LazyStore} from './dag/lazy-store.ts';\nimport {StoreImpl} from './dag/store-impl.ts';\nimport {ChunkNotFoundError, mustGetHeadHash, type Store} from './dag/store.ts';\nimport {\n baseSnapshotFromHash,\n DEFAULT_HEAD_NAME,\n isLocalMetaDD31,\n type LocalMeta,\n} from './db/commit.ts';\nimport {readFromDefaultHead} from './db/read.ts';\nimport {rebaseMutationAndCommit} from './db/rebase.ts';\nimport {newWriteLocal} from './db/write.ts';\nimport {\n isClientStateNotFoundResponse,\n isVersionNotSupportedResponse,\n type VersionNotSupportedResponse,\n} from './error-responses.ts';\nimport * as FormatVersion from './format-version-enum.ts';\nimport {deepFreeze} from './frozen-json.ts';\nimport {getDefaultPuller, isDefaultPuller} from './get-default-puller.ts';\nimport {getDefaultPusher, isDefaultPusher} from './get-default-pusher.ts';\nimport {getKVStoreProvider} from './get-kv-store-provider.ts';\nimport {assertHash, emptyHash, type Hash, newRandomHash} from './hash.ts';\nimport type {HTTPRequestInfo} from './http-request-info.ts';\nimport {httpStatusUnauthorized} from './http-status-unauthorized.ts';\nimport type {IndexDefinitions} from './index-defs.ts';\nimport type {StoreProvider} from './kv/store.ts';\nimport {createLogContext} from './log-options.ts';\nimport {makeIDBName} from './make-idb-name.ts';\nimport {MutationRecovery} from './mutation-recovery.ts';\nimport {initNewClientChannel} from './new-client-channel.ts';\nimport {\n initOnPersistChannel,\n type OnPersist,\n type PersistInfo,\n} from './on-persist-channel.ts';\nimport {\n type PendingMutation,\n pendingMutationsForAPI,\n} from './pending-mutations.ts';\nimport {\n CLIENT_MAX_INACTIVE_TIME,\n GC_INTERVAL,\n initClientGC,\n} from './persist/client-gc.ts';\nimport {initClientGroupGC} from './persist/client-group-gc.ts';\nimport {disableClientGroup} from './persist/client-groups.ts';\nimport {\n ClientStateNotFoundError,\n initClientV6,\n type OnClientsDeleted,\n hasClientState as persistHasClientState,\n} from './persist/clients.ts';\nimport {\n COLLECT_IDB_INTERVAL,\n initCollectIDBDatabases,\n INITIAL_COLLECT_IDB_DELAY,\n} from './persist/collect-idb-databases.ts';\nimport {HEARTBEAT_INTERVAL, startHeartbeats} from './persist/heartbeat.ts';\nimport {\n IDBDatabasesStore,\n type IndexedDBDatabase,\n} from './persist/idb-databases-store.ts';\nimport {makeClientID} from './persist/make-client-id.ts';\nimport {persistDD31} from './persist/persist.ts';\nimport {refresh} from './persist/refresh.ts';\nimport {ProcessScheduler} from './process-scheduler.ts';\nimport type {Puller} from './puller.ts';\nimport {type Pusher, PushError} from './pusher.ts';\nimport type {\n MutationTrackingData,\n ReplicacheOptions,\n ZeroOption,\n} from './replicache-options.ts';\nimport {ReportError} from './report-error.ts';\nimport {setIntervalWithSignal} from './set-interval-with-signal.ts';\nimport {\n type SubscribeOptions,\n SubscriptionImpl,\n type SubscriptionsManager,\n SubscriptionsManagerImpl,\n type WatchCallback,\n type WatchCallbackForOptions,\n type WatchNoIndexCallback,\n type WatchOptions,\n WatchSubscription,\n} from './subscriptions.ts';\nimport type {DiffsMap} from './sync/diff.ts';\nimport * as HandlePullResponseResultEnum from './sync/handle-pull-response-result-type-enum.ts';\nimport type {ClientGroupID, ClientID} from './sync/ids.ts';\nimport {PullError} from './sync/pull-error.ts';\nimport {beginPullV1, handlePullResponseV1, maybeEndPull} from './sync/pull.ts';\nimport {push, PUSH_VERSION_DD31} from './sync/push.ts';\nimport {newRequestID} from './sync/request-id.ts';\nimport {SYNC_HEAD_NAME} from './sync/sync-head-name.ts';\nimport {throwIfClosed} from './transaction-closed-error.ts';\nimport type {ReadTransaction, WriteTransaction} from './transactions.ts';\nimport {ReadTransactionImpl, WriteTransactionImpl} from './transactions.ts';\nimport type {\n BeginPullResult,\n MakeMutator,\n MakeMutators,\n MutatorDefs,\n MutatorReturn,\n PokeInternal,\n QueryInternal,\n RequestOptions,\n UpdateNeededReason,\n} from './types.ts';\nimport {version} from './version.ts';\nimport {\n withRead,\n withWrite,\n withWriteNoImplicitCommit,\n} from './with-transactions.ts';\n\n/**\n * The maximum number of time to call out to getAuth before giving up\n * and throwing an error.\n */\nconst MAX_REAUTH_TRIES = 8;\n\nconst PERSIST_IDLE_TIMEOUT_MS = 1000;\nconst REFRESH_IDLE_TIMEOUT_MS = 1000;\n\nconst PERSIST_THROTTLE_MS = 500;\nconst REFRESH_THROTTLE_MS = 500;\n\n/**\n * Opening the database blocks everything Replicache does, including Zero's\n * first connect attempt, so a slow open is worth a warning rather than a\n * debug line.\n */\nconst SLOW_DB_OPEN_THRESHOLD_MS = 50;\n\nconst LAZY_STORE_SOURCE_CHUNK_CACHE_SIZE_LIMIT = 100 * 2 ** 20; // 100 MB\n\nconst RECOVER_MUTATIONS_INTERVAL_MS = 5 * 60 * 1000; // 5 mins\n\nconst noop = () => {\n // noop\n};\n\nconst updateNeededReasonNewClientGroup: UpdateNeededReason = {\n type: 'NewClientGroup',\n} as const;\n\n/** @deprecated Not used any more */\nexport interface MakeSubscriptionsManager {\n (queryInternal: QueryInternal, lc: LogContext): SubscriptionsManager;\n}\n\nexport interface ReplicacheImplOptions {\n /**\n * Defaults to true.\n */\n enableMutationRecovery?: boolean | undefined;\n\n /**\n * Defaults to true.\n */\n enableScheduledPersist?: boolean | undefined;\n\n /**\n * Defaults to true.\n */\n enableScheduledRefresh?: boolean | undefined;\n\n /**\n * Defaults to `() => true`.\n */\n enableRefresh?: (() => boolean) | undefined;\n\n /**\n * Defaults to true.\n */\n enablePullAndPushInOpen?: boolean | undefined;\n\n /**\n * @deprecated Not used anymore.\n */\n makeSubscriptionsManager?: unknown;\n\n /**\n * Default is `true`. If `false` if an exact match client group\n * is not found, a new client group is always made instead of forking\n * from an existing client group.\n */\n enableClientGroupForking?: boolean | undefined;\n\n /**\n * Callback for when Replicache has deleted clients.\n */\n onClientsDeleted?: OnClientsDeleted | undefined;\n\n /**\n * Internal option used by Zero.\n * Replicache will call this to and, if zero is enabled, will\n * invoke various hooks to allow Zero the keep IVM in sync with Replicache's b-trees.\n */\n zero?: ZeroOption | undefined;\n}\n\nexport class ReplicacheImpl<MD extends MutatorDefs = {}> {\n /** The URL to use when doing a pull request. */\n pullURL: string;\n\n /** The URL to use when doing a push request. */\n pushURL: string;\n\n /** The authorization token used when doing a push request. */\n #auth: string;\n\n /** The name of the Replicache database. Populated by {@link ReplicacheOptions#name}. */\n readonly name: string;\n\n readonly #subscriptions: SubscriptionsManager;\n readonly #mutationRecovery: MutationRecovery | undefined;\n\n /**\n * Client groups gets disabled when the server does not know about it.\n * A disabled client group prevents the client from pushing and pulling.\n */\n isClientGroupDisabled = false;\n\n readonly #kvStoreProvider: StoreProvider;\n\n lastMutationID: number = 0;\n\n /**\n * This is the name Replicache uses for the IndexedDB database where data is\n * stored.\n */\n get idbName(): string {\n return makeIDBName(this.name, this.schemaVersion);\n }\n\n set auth(auth: string) {\n if (this.#zero) {\n this.#zero.auth = auth;\n }\n\n this.#auth = auth;\n }\n\n get auth() {\n return this.#auth;\n }\n\n /** The schema version of the data understood by this application. */\n readonly schemaVersion: string;\n\n get #idbDatabase(): IndexedDBDatabase {\n return {\n name: this.idbName,\n replicacheName: this.name,\n replicacheFormatVersion: FormatVersion.Latest,\n schemaVersion: this.schemaVersion,\n };\n }\n #closed = false;\n #online = true;\n readonly #clientID = makeClientID();\n readonly #ready: Promise<void>;\n readonly #profileIDPromise: Promise<string>;\n readonly #clientGroupIDPromise: Promise<string>;\n readonly #mutatorRegistry: MutatorDefs = {};\n\n /**\n * The mutators that was registered in the constructor.\n */\n readonly mutate: MakeMutators<MD>;\n\n // Number of pushes/pulls at the moment.\n #pushCounter = 0;\n #pullCounter = 0;\n\n #pullConnectionLoop: ConnectionLoop;\n #pushConnectionLoop: ConnectionLoop;\n\n /**\n * The duration between each periodic {@link pull}. Setting this to `null`\n * disables periodic pull completely. Pull will still happen if you call\n * {@link pull} manually.\n */\n pullInterval: number | null;\n\n /**\n * The delay between when a change is made to Replicache and when Replicache\n * attempts to push that change.\n */\n pushDelay: number;\n\n readonly #requestOptions: Required<RequestOptions>;\n\n /**\n * The function to use to pull data from the server.\n */\n puller: Puller;\n\n /**\n * The function to use to push data to the server.\n */\n pusher: Pusher;\n\n readonly memdag: LazyStore;\n readonly perdag: Store;\n readonly #idbDatabases: IDBDatabasesStore;\n readonly #lc: LogContext;\n readonly #zero: ZeroOption | undefined;\n\n readonly #closeAbortController = new AbortController();\n\n readonly #persistLock = new Lock();\n readonly #enableScheduledPersist: boolean;\n readonly #enableScheduledRefresh: boolean;\n readonly #enableRefresh: () => boolean;\n readonly #enablePullAndPushInOpen: boolean;\n #persistScheduler = new ProcessScheduler(\n () => this.persist(),\n PERSIST_IDLE_TIMEOUT_MS,\n PERSIST_THROTTLE_MS,\n this.#closeAbortController.signal,\n );\n readonly #onPersist: OnPersist;\n #refreshScheduler = new ProcessScheduler(\n () => this.refresh(),\n REFRESH_IDLE_TIMEOUT_MS,\n REFRESH_THROTTLE_MS,\n this.#closeAbortController.signal,\n );\n\n /**\n * The options used to control the {@link pull} and push request behavior. This\n * object is live so changes to it will affect the next pull or push call.\n */\n get requestOptions(): Required<RequestOptions> {\n return this.#requestOptions;\n }\n\n /**\n * `onSync(true)` is called when Replicache transitions from no push or pull\n * happening to at least one happening. `onSync(false)` is called in the\n * opposite case: when Replicache transitions from at least one push or pull\n * happening to none happening.\n *\n * This can be used in a React like app by doing something like the following:\n *\n * ```js\n * const [syncing, setSyncing] = useState(false);\n * useEffect(() => {\n * rep.onSync = setSyncing;\n * }, [rep]);\n * ```\n */\n onSync: ((syncing: boolean) => void) | null = null;\n\n /**\n * `onClientStateNotFound` is called when the persistent client has been\n * garbage collected. This can happen if the client has no pending mutations\n * and has not been used for a while.\n *\n * The default behavior is to reload the page (using `location.reload()`). Set\n * this to `null` or provide your own function to prevent the page from\n * reloading automatically.\n */\n onClientStateNotFound: (() => void) | null = reload;\n\n /**\n * `onUpdateNeeded` is called when a code update is needed.\n *\n * A code update can be needed because:\n * - the server no longer supports the {@link pushVersion},\n * {@link pullVersion} or {@link schemaVersion} of the current code.\n * - a new Replicache client has created a new client group, because its code\n * has different mutators, indexes, schema version and/or format version\n * from this Replicache client. This is likely due to the new client having\n * newer code. A code update is needed to be able to locally sync with this\n * new Replicache client (i.e. to sync while offline, the clients can still\n * sync with each other via the server).\n *\n * The default behavior is to reload the page (using `location.reload()`). Set\n * this to `null` or provide your own function to prevent the page from\n * reloading automatically. You may want to provide your own function to\n * display a toast to inform the end user there is a new version of your app\n * available and prompting them to refresh.\n */\n onUpdateNeeded: ((reason: UpdateNeededReason) => void) | null = reload;\n\n /**\n * This gets called when we get an HTTP unauthorized (401) response from the\n * push or pull endpoint. Set this to a function that will ask your user to\n * reauthenticate.\n */\n getAuth: (() => MaybePromise<string | null | undefined>) | null | undefined =\n null;\n\n // These three are used for testing\n onPushInvoked = () => undefined;\n onBeginPull = () => undefined;\n onRecoverMutations = (r: Promise<boolean>) => r;\n\n constructor(\n options: ReplicacheOptions<MD>,\n implOptions: ReplicacheImplOptions = {},\n ) {\n validateOptions(options);\n const {\n name,\n logLevel = 'info',\n logSinks = [consoleLogSink],\n pullURL = '',\n auth,\n pushDelay = 10,\n pushURL = '',\n schemaVersion = '',\n pullInterval = 60000,\n mutators = {} as MD,\n requestOptions = {},\n puller,\n pusher,\n indexes = {},\n clientMaxAgeMs = CLIENT_MAX_INACTIVE_TIME,\n } = options;\n const {\n enableMutationRecovery = true,\n enableScheduledPersist = true,\n enableScheduledRefresh = true,\n enableRefresh = () => true,\n enablePullAndPushInOpen = true,\n enableClientGroupForking = true,\n onClientsDeleted = () => promiseVoid,\n } = implOptions;\n this.#zero = implOptions.zero;\n this.#auth = auth ?? '';\n this.pullURL = pullURL;\n this.pushURL = pushURL;\n this.name = name;\n this.schemaVersion = schemaVersion;\n this.pullInterval = pullInterval;\n this.pushDelay = pushDelay;\n this.puller = puller ?? getDefaultPuller(this);\n this.pusher = pusher ?? getDefaultPusher(this);\n\n this.#enableScheduledPersist = enableScheduledPersist;\n this.#enableScheduledRefresh = enableScheduledRefresh;\n this.#enableRefresh = enableRefresh;\n this.#enablePullAndPushInOpen = enablePullAndPushInOpen;\n\n this.#lc = createLogContext(logLevel, logSinks, {name});\n this.#lc.debug?.('Constructing Replicache', {\n name,\n 'replicache version': version,\n });\n\n this.#subscriptions = new SubscriptionsManagerImpl(\n this.#queryInternal,\n this.#lc,\n this.#closeAbortController.signal,\n );\n\n const kvStoreProvider = getKVStoreProvider(this.#lc, options.kvStore);\n this.#kvStoreProvider = kvStoreProvider;\n\n const perKVStore = kvStoreProvider.create(this.idbName);\n\n this.#idbDatabases = new IDBDatabasesStore(kvStoreProvider.create);\n this.perdag = new StoreImpl(perKVStore, newRandomHash, assertHash);\n this.memdag = new LazyStore(\n this.perdag,\n LAZY_STORE_SOURCE_CHUNK_CACHE_SIZE_LIMIT,\n newRandomHash,\n assertHash,\n );\n\n // Use a promise-resolve pair so that we have a promise to use even before\n // we call the Open RPC.\n const readyResolver = resolver<void>();\n this.#ready = readyResolver.promise;\n\n const {minDelayMs = MIN_DELAY_MS, maxDelayMs = MAX_DELAY_MS} =\n requestOptions;\n this.#requestOptions = {maxDelayMs, minDelayMs};\n\n const visibilityWatcher = getDocumentVisibilityWatcher(\n getBrowserGlobal('document'),\n 0,\n this.#closeAbortController.signal,\n );\n\n this.#pullConnectionLoop = new ConnectionLoop(\n this.#lc.withContext('PULL'),\n new PullDelegate(this, () => this.#invokePull()),\n visibilityWatcher,\n );\n\n this.#pushConnectionLoop = new ConnectionLoop(\n this.#lc.withContext('PUSH'),\n new PushDelegate(this, () => this.#invokePush()),\n );\n\n this.mutate = this.#registerMutators(mutators);\n\n const profileIDResolver = resolver<string>();\n this.#profileIDPromise = profileIDResolver.promise;\n const clientGroupIDResolver = resolver<string>();\n this.#clientGroupIDPromise = clientGroupIDResolver.promise;\n\n if (!process.env.DISABLE_MUTATION_RECOVERY) {\n this.#mutationRecovery = new MutationRecovery({\n delegate: this,\n lc: this.#lc,\n enableMutationRecovery,\n wrapInOnlineCheck: this.#wrapInOnlineCheck.bind(this),\n wrapInReauthRetries: this.#wrapInReauthRetries.bind(this),\n isPullDisabled: this.#isPullDisabled.bind(this),\n isPushDisabled: this.#isPushDisabled.bind(this),\n clientGroupIDPromise: this.#clientGroupIDPromise,\n });\n }\n\n this.#onPersist = initOnPersistChannel(\n this.name,\n this.#closeAbortController.signal,\n persistInfo => {\n void this.#handlePersist(persistInfo);\n },\n );\n\n void this.#open(\n indexes,\n enableClientGroupForking,\n enableMutationRecovery,\n clientMaxAgeMs,\n profileIDResolver.resolve,\n clientGroupIDResolver.resolve,\n readyResolver.resolve,\n onClientsDeleted,\n );\n }\n\n async #open(\n indexes: IndexDefinitions,\n enableClientGroupForking: boolean,\n enableMutationRecovery: boolean,\n clientMaxAgeMs: number,\n profileIDResolver: (profileID: string) => void,\n resolveClientGroupID: (clientGroupID: ClientGroupID) => void,\n resolveReady: () => void,\n onClientsDeleted: OnClientsDeleted,\n ): Promise<void> {\n const {clientID} = this;\n // Everything up to the head write is what it takes to have a usable\n // database, including waiting out a previous instance of the same name.\n // The timer stops before the replica is loaded into Zero's IVM sources,\n // which is separate work and usually the larger of the two: a number that\n // spanned both would report a slow hydration as a slow disk.\n const openStart = performance.now();\n // If we are currently closing a Replicache instance with the same name,\n // wait for it to finish closing.\n await closingInstances.get(this.name);\n await this.#idbDatabases.getProfileID().then(profileIDResolver);\n await this.#idbDatabases.putDatabase(this.#idbDatabase);\n const [client, headHash, , isNewClientGroup] = await initClientV6(\n clientID,\n this.#lc,\n this.perdag,\n Object.keys(this.#mutatorRegistry),\n indexes,\n FormatVersion.Latest,\n enableClientGroupForking,\n );\n\n resolveClientGroupID(client.clientGroupID);\n await withWrite(this.memdag, write =>\n write.setHead(DEFAULT_HEAD_NAME, headHash),\n );\n\n // Now we have a profileID, a clientID, a clientGroupID and DB!\n const dbOpenMs = performance.now() - openStart;\n if (dbOpenMs > SLOW_DB_OPEN_THRESHOLD_MS) {\n this.#lc.warn?.(`Opening the database took ${Math.round(dbOpenMs)}ms`, {\n name: this.idbName,\n });\n } else {\n this.#lc.debug?.('Opened the database in', Math.round(dbOpenMs), 'ms');\n }\n\n await this.#zero?.init(headHash, this.memdag);\n resolveReady();\n\n if (this.#enablePullAndPushInOpen) {\n this.pull().catch(noop);\n this.push().catch(noop);\n }\n\n const {signal} = this.#closeAbortController;\n\n startHeartbeats(\n clientID,\n this.perdag,\n () => {\n this.#clientStateNotFoundOnClient(clientID);\n },\n HEARTBEAT_INTERVAL,\n this.#lc,\n signal,\n );\n initClientGC(\n clientID,\n this.perdag,\n clientMaxAgeMs,\n GC_INTERVAL,\n onClientsDeleted,\n this.#lc,\n signal,\n );\n initCollectIDBDatabases(\n this.#idbDatabases,\n this.#kvStoreProvider,\n COLLECT_IDB_INTERVAL,\n INITIAL_COLLECT_IDB_DELAY,\n 2 * clientMaxAgeMs,\n enableMutationRecovery,\n onClientsDeleted,\n this.#lc,\n signal,\n );\n initClientGroupGC(this.perdag, enableMutationRecovery, this.#lc, signal);\n initNewClientChannel(\n this.name,\n this.idbName,\n signal,\n client.clientGroupID,\n isNewClientGroup,\n () => {\n this.#fireOnUpdateNeeded(updateNeededReasonNewClientGroup);\n },\n this.perdag,\n );\n\n setIntervalWithSignal(\n () => this.recoverMutations(),\n RECOVER_MUTATIONS_INTERVAL_MS,\n signal,\n );\n void this.recoverMutations();\n\n getBrowserGlobal('document')?.addEventListener(\n 'visibilitychange',\n this.#onVisibilityChange,\n );\n }\n\n #onVisibilityChange = async () => {\n if (this.#closed) {\n return;\n }\n\n // In case of running in a worker, we don't have a document.\n if (getBrowserGlobal('document')?.visibilityState !== 'visible') {\n return;\n }\n\n await this.#checkForClientStateNotFoundAndCallHandler();\n };\n\n async #checkForClientStateNotFoundAndCallHandler(): Promise<boolean> {\n const {clientID} = this;\n const hasClientState = await withRead(this.perdag, read =>\n persistHasClientState(clientID, read),\n );\n if (!hasClientState) {\n this.#clientStateNotFoundOnClient(clientID);\n }\n return !hasClientState;\n }\n\n /**\n * The browser profile ID for this browser profile. Every instance of Replicache\n * browser-profile-wide shares the same profile ID.\n */\n get profileID(): Promise<string> {\n return this.#profileIDPromise;\n }\n\n /**\n * The client ID for this instance of Replicache. Each instance of Replicache\n * gets a unique client ID.\n */\n get clientID(): string {\n return this.#clientID;\n }\n\n /**\n * The client group ID for this instance of Replicache. Instances of\n * Replicache will have the same client group ID if and only if they have\n * the same name, mutators, indexes, schema version, format version, and\n * browser profile.\n */\n get clientGroupID(): Promise<string> {\n return this.#clientGroupIDPromise;\n }\n\n /**\n * `onOnlineChange` is called when the {@link online} property changes. See\n * {@link online} for more details.\n */\n onOnlineChange: ((online: boolean) => void) | null = null;\n\n /**\n * A rough heuristic for whether the client is currently online. Note that\n * there is no way to know for certain whether a client is online - the next\n * request can always fail. This property returns true if the last sync attempt succeeded,\n * and false otherwise.\n */\n get online(): boolean {\n return this.#online;\n }\n\n /**\n * Whether the Replicache database has been closed. Once Replicache has been\n * closed it no longer syncs and you can no longer read or write data out of\n * it. After it has been closed it is pretty much useless and should not be\n * used any more.\n */\n get closed(): boolean {\n return this.#closed;\n }\n\n /**\n * Closes this Replicache instance.\n *\n * When closed all subscriptions end and no more read or writes are allowed.\n */\n async close(): Promise<void> {\n this.#closed = true;\n const {promise, resolve} = resolver();\n closingInstances.set(this.name, promise);\n\n this.#closeAbortController.abort();\n\n getBrowserGlobal('document')?.removeEventListener(\n 'visibilitychange',\n this.#onVisibilityChange,\n );\n\n await this.#ready;\n const closingPromises = [\n this.memdag.close(),\n this.perdag.close(),\n this.#idbDatabases.close(),\n ];\n\n this.#pullConnectionLoop.close();\n this.#pushConnectionLoop.close();\n\n this.#subscriptions.clear();\n\n await Promise.all(closingPromises);\n closingInstances.delete(this.name);\n resolve();\n }\n\n async maybeEndPull(syncHead: Hash, requestID: string): Promise<void> {\n for (;;) {\n if (this.#closed) {\n return;\n }\n\n await this.#ready;\n const {clientID} = this;\n const lc = this.#lc\n .withContext('maybeEndPull')\n .withContext('requestID', requestID);\n const {replayMutations, diffs, oldMainHead, mainHead} =\n await maybeEndPull<LocalMeta>(\n this.memdag,\n lc,\n syncHead,\n clientID,\n this.#subscriptions,\n FormatVersion.Latest,\n );\n\n if (!replayMutations || replayMutations.length === 0) {\n // All done.\n this.#zero?.advance(oldMainHead, mainHead, diffs.get('') ?? []);\n await this.#subscriptions.fire(diffs);\n void this.#schedulePersist();\n return;\n }\n\n // Replay.\n const zeroData = await this.#zero?.getTxData?.(syncHead);\n for (const mutation of replayMutations) {\n // TODO(greg): I'm not sure why this was in Replicache#_mutate...\n // Ensure that we run initial pending subscribe functions before starting a\n // write transaction.\n if (this.#subscriptions.hasPendingSubscriptionRuns) {\n await Promise.resolve();\n }\n const {meta} = mutation;\n syncHead = await withWriteNoImplicitCommit(this.memdag, dagWrite =>\n rebaseMutationAndCommit(\n mutation,\n dagWrite,\n syncHead,\n SYNC_HEAD_NAME,\n this.#mutatorRegistry,\n lc,\n isLocalMetaDD31(meta) ? meta.clientID : clientID,\n FormatVersion.Latest,\n zeroData,\n ),\n );\n }\n }\n }\n\n #invokePull(): Promise<boolean> {\n if (this.#isPullDisabled()) {\n return Promise.resolve(true);\n }\n\n return this.#wrapInOnlineCheck(async () => {\n try {\n this.#changeSyncCounters(0, 1);\n const {syncHead, requestID, ok} = await this.beginPull();\n if (!ok) {\n return false;\n }\n if (syncHead !== emptyHash) {\n await this.maybeEndPull(syncHead, requestID);\n }\n } catch (e) {\n throw await this.#convertToClientStateNotFoundError(e);\n } finally {\n this.#changeSyncCounters(0, -1);\n }\n return true;\n }, 'Pull');\n }\n\n #isPullDisabled() {\n return (\n this.isClientGroupDisabled ||\n (this.pullURL === '' && isDefaultPuller(this.puller))\n );\n }\n\n async #wrapInOnlineCheck(\n f: () => Promise<boolean>,\n name: string,\n ): Promise<boolean> {\n let online = true;\n\n try {\n return await f();\n } catch (e) {\n // The error paths of beginPull and maybeEndPull need to be reworked.\n //\n // We want to distinguish between:\n // a) network requests failed -- we're offline basically\n // b) sync was aborted because one's already in progress\n // c) oh noes - something unexpected happened\n //\n // Right now, all of these come out as errors. We distinguish (b) with a\n // hacky string search. (a) and (c) are not distinguishable currently\n // because repc doesn't provide sufficient information, so we treat all\n // errors that aren't (b) as (a).\n if (e instanceof PushError || e instanceof PullError) {\n online = false;\n this.#lc.debug?.(`${name} threw:\\n`, e, '\\nwith cause:\\n', e.causedBy);\n } else if (e instanceof ReportError) {\n this.#lc.error?.(e);\n } else {\n this.#lc.info?.(`${name} threw:\\n`, e);\n }\n return false;\n } finally {\n if (this.#online !== online) {\n this.#online = online;\n this.onOnlineChange?.(online);\n if (online) {\n void this.recoverMutations();\n }\n }\n }\n }\n\n async #wrapInReauthRetries<R>(\n f: (\n requestID: string,\n requestLc: LogContext,\n ) => Promise<{\n httpRequestInfo: HTTPRequestInfo | undefined;\n result: R;\n }>,\n verb: string,\n lc: LogContext,\n preAuth: () => MaybePromise<void> = noop,\n postAuth: () => MaybePromise<void> = noop,\n ): Promise<{\n result: R;\n authFailure: boolean;\n }> {\n const {clientID} = this;\n let reauthAttempts = 0;\n let lastResult;\n lc = lc.withContext(verb);\n do {\n const requestID = newRequestID(clientID);\n const requestLc = lc.withContext('requestID', requestID);\n const {httpRequestInfo, result} = await f(requestID, requestLc);\n lastResult = result;\n if (!httpRequestInfo) {\n return {\n result,\n authFailure: false,\n };\n }\n const {errorMessage, httpStatusCode} = httpRequestInfo;\n\n if (errorMessage || httpStatusCode !== 200) {\n // TODO(arv): Maybe we should not log the server URL when the error comes\n // from a Pusher/Puller?\n requestLc.error?.(\n `Got a non 200 response doing ${verb}: ${httpStatusCode}` +\n (errorMessage ? `: ${errorMessage}` : ''),\n );\n }\n if (httpStatusCode !== httpStatusUnauthorized) {\n return {\n result,\n authFailure: false,\n };\n }\n if (!this.getAuth) {\n return {\n result,\n authFailure: true,\n };\n }\n let auth;\n try {\n await preAuth();\n auth = await this.getAuth();\n } finally {\n await postAuth();\n }\n if (auth === null || auth === undefined) {\n return {\n result,\n authFailure: true,\n };\n }\n this.auth = auth;\n reauthAttempts++;\n } while (reauthAttempts < MAX_REAUTH_TRIES);\n lc.info?.('Tried to reauthenticate too many times');\n return {\n result: lastResult,\n authFailure: true,\n };\n }\n\n #isPushDisabled() {\n return (\n this.isClientGroupDisabled ||\n (this.pushURL === '' && isDefaultPusher(this.pusher))\n );\n }\n\n async #invokePush(): Promise<boolean> {\n if (TESTING) {\n this.onPushInvoked();\n }\n if (this.#isPushDisabled()) {\n return true;\n }\n\n await this.#ready;\n const profileID = await this.#profileIDPromise;\n const {clientID} = this;\n const clientGroupID = await this.#clientGroupIDPromise;\n return this.#wrapInOnlineCheck(async () => {\n const {result: pusherResult} = await this.#wrapInReauthRetries(\n async (requestID: string, requestLc: LogContext) => {\n try {\n this.#changeSyncCounters(1, 0);\n const pusherResult = await push(\n requestID,\n this.memdag,\n requestLc,\n profileID,\n clientGroupID,\n clientID,\n this.pusher,\n this.schemaVersion,\n PUSH_VERSION_DD31,\n );\n return {\n result: pusherResult,\n httpRequestInfo: pusherResult?.httpRequestInfo,\n };\n } finally {\n this.#changeSyncCounters(-1, 0);\n }\n },\n 'push',\n this.#lc,\n );\n\n if (pusherResult === undefined) {\n // No pending mutations.\n return true;\n }\n\n const {response, httpRequestInfo} = pusherResult;\n\n if (isVersionNotSupportedResponse(response)) {\n this.#handleVersionNotSupportedResponse(response);\n } else if (isClientStateNotFoundResponse(response)) {\n await this.#clientStateNotFoundOnServer();\n }\n\n // No pushResponse means we didn't do a push because there were no\n // pending mutations.\n return httpRequestInfo.httpStatusCode === 200;\n }, 'Push');\n }\n\n #handleVersionNotSupportedResponse(response: VersionNotSupportedResponse) {\n const reason: UpdateNeededReason = {\n type: response.error,\n };\n if (response.versionType) {\n reason.versionType = response.versionType;\n }\n this.#fireOnUpdateNeeded(reason);\n }\n\n /**\n * Push pushes pending changes to the {@link pushURL}.\n *\n * You do not usually need to manually call push. If {@link pushDelay} is\n * non-zero (which it is by default) pushes happen automatically shortly after\n * mutations.\n *\n * If the server endpoint fails push will be continuously retried with an\n * exponential backoff.\n *\n * @param [now=false] If true, push will happen immediately and ignore\n * {@link pushDelay}, {@link RequestOptions.minDelayMs} as well as the\n * exponential backoff in case of errors.\n * @returns A promise that resolves when the next push completes. In case of\n * errors the first error will reject the returned promise. Subsequent errors\n * will not be reflected in the promise.\n */\n push({now = false} = {}): Promise<void> {\n return throwIfError(this.#pushConnectionLoop.send(now));\n }\n\n /**\n * Pull pulls changes from the {@link pullURL}. If there are any changes local\n * changes will get replayed on top of the new server state.\n *\n * If the server endpoint fails pull will be continuously retried with an\n * exponential backoff.\n *\n * @param [now=false] If true, pull will happen immediately and ignore\n * {@link RequestOptions.minDelayMs} as well as the exponential backoff in\n * case of errors.\n * @returns A promise that resolves when the next pull completes. In case of\n * errors the first error will reject the returned promise. Subsequent errors\n * will not be reflected in the promise.\n */\n pull({now = false} = {}): Promise<void> {\n return throwIfError(this.#pullConnectionLoop.send(now));\n }\n\n /**\n * Applies an update from the server to Replicache.\n * Throws an error if cookie does not match. In that case the server thinks\n * this client has a different cookie than it does; the caller should disconnect\n * from the server and re-register, which transmits the cookie the client actually\n * has.\n *\n * @experimental This method is under development and its semantics will change.\n */\n async poke(poke: PokeInternal): Promise<void> {\n await this.#ready;\n // TODO(MP) Previously we created a request ID here and included it with the\n // PullRequest to the server so we could tie events across client and server\n // together. Since the direction is now reversed, creating and adding a request ID\n // here is kind of silly. We should consider creating the request ID\n // on the *server* and passing it down in the poke for inclusion here in the log\n // context\n const {clientID} = this;\n const requestID = newRequestID(clientID);\n const lc = this.#lc\n .withContext('handlePullResponse')\n .withContext('requestID', requestID);\n\n const {pullResponse} = poke;\n\n if (isVersionNotSupportedResponse(pullResponse)) {\n this.#handleVersionNotSupportedResponse(pullResponse);\n return;\n }\n\n if (isClientStateNotFoundResponse(pullResponse)) {\n await this.#clientStateNotFoundOnServer();\n return;\n }\n\n const result = await handlePullResponseV1(\n lc,\n this.memdag,\n deepFreeze(poke.baseCookie),\n pullResponse,\n clientID,\n FormatVersion.Latest,\n );\n\n switch (result.type) {\n case HandlePullResponseResultEnum.Applied:\n await this.maybeEndPull(result.syncHead, requestID);\n break;\n case HandlePullResponseResultEnum.CookieMismatch:\n throw new Error(\n 'unexpected base cookie for poke: ' + JSON.stringify(poke),\n );\n case HandlePullResponseResultEnum.NoOp:\n break;\n }\n }\n\n async beginPull(): Promise<BeginPullResult> {\n if (TESTING) {\n this.onBeginPull();\n }\n await this.#ready;\n const profileID = await this.profileID;\n const {clientID} = this;\n const clientGroupID = await this.#clientGroupIDPromise;\n const {\n result: {beginPullResponse, requestID},\n } = await this.#wrapInReauthRetries(\n async (requestID: string, requestLc: LogContext) => {\n const beginPullResponse = await beginPullV1(\n profileID,\n clientID,\n clientGroupID,\n this.schemaVersion,\n this.puller,\n requestID,\n this.memdag,\n FormatVersion.Latest,\n requestLc,\n );\n return {\n result: {beginPullResponse, requestID},\n httpRequestInfo: beginPullResponse.httpRequestInfo,\n };\n },\n 'pull',\n this.#lc,\n () => this.#changeSyncCounters(0, -1),\n () => this.#changeSyncCounters(0, 1),\n );\n\n const {pullResponse} = beginPullResponse;\n if (isVersionNotSupportedResponse(pullResponse)) {\n this.#handleVersionNotSupportedResponse(pullResponse);\n } else if (isClientStateNotFoundResponse(beginPullResponse.pullResponse)) {\n await this.#clientStateNotFoundOnServer();\n }\n\n const {syncHead, httpRequestInfo} = beginPullResponse;\n return {requestID, syncHead, ok: httpRequestInfo.httpStatusCode === 200};\n }\n\n persist(): Promise<void> {\n // Prevent multiple persist calls from running at the same time.\n return this.#persistLock.withLock(async () => {\n const {clientID} = this;\n await this.#ready;\n if (this.#closed) {\n return;\n }\n try {\n await persistDD31(\n this.#lc,\n clientID,\n this.memdag,\n this.perdag,\n this.#mutatorRegistry,\n () => this.#closed,\n FormatVersion.Latest,\n this.#zero?.getTxData,\n );\n } catch (e) {\n if (e instanceof ClientStateNotFoundError) {\n this.#clientStateNotFoundOnClient(clientID);\n } else if (this.#closed) {\n this.#lc.debug?.('Exception persisting during close', e);\n } else {\n throw e;\n }\n }\n\n const clientGroupID = await this.#clientGroupIDPromise;\n assert(clientGroupID, 'Expected clientGroupID to be defined');\n this.#onPersist({clientID, clientGroupID});\n });\n }\n\n async refresh(): Promise<void> {\n await this.#ready;\n const {clientID} = this;\n if (this.#closed || !this.#enableRefresh()) {\n return;\n }\n let refreshResult: Awaited<ReturnType<typeof refresh>>;\n try {\n refreshResult = await refresh(\n this.#lc,\n this.memdag,\n this.perdag,\n clientID,\n this.#mutatorRegistry,\n this.#subscriptions,\n () => this.closed,\n FormatVersion.Latest,\n this.#zero,\n );\n } catch (e) {\n if (e instanceof ClientStateNotFoundError) {\n this.#clientStateNotFoundOnClient(clientID);\n } else if (this.#closed) {\n this.#lc.debug?.('Exception refreshing during close', e);\n } else {\n throw e;\n }\n }\n if (refreshResult !== undefined) {\n await this.#subscriptions.fire(refreshResult.diffs);\n }\n }\n\n #fireOnClientStateNotFound() {\n this.onClientStateNotFound?.();\n }\n\n #clientStateNotFoundOnClient(clientID: ClientID) {\n this.#lc.error?.(`Client state not found on client, clientID: ${clientID}`);\n this.#fireOnClientStateNotFound();\n }\n\n async #clientStateNotFoundOnServer() {\n const clientGroupID = await this.#clientGroupIDPromise;\n this.#lc.error?.(\n `Client state not found on server, clientGroupID: ${clientGroupID}`,\n );\n await this.disableClientGroup();\n this.#fireOnClientStateNotFound();\n }\n\n async disableClientGroup(): Promise<void> {\n const clientGroupID = await this.#clientGroupIDPromise;\n assert(clientGroupID, 'Expected clientGroupID to be defined');\n this.isClientGroupDisabled = true;\n await withWrite(this.perdag, dagWrite =>\n disableClientGroup(clientGroupID, dagWrite),\n );\n }\n\n #fireOnUpdateNeeded(reason: UpdateNeededReason) {\n this.#lc.debug?.(`Update needed, reason: ${reason}`);\n this.onUpdateNeeded?.(reason);\n }\n\n async #schedulePersist(): Promise<void> {\n if (!this.#enableScheduledPersist) {\n return;\n }\n await this.#schedule('persist', this.#persistScheduler);\n }\n\n async #handlePersist(persistInfo: PersistInfo): Promise<void> {\n this.#lc.debug?.('Handling persist', persistInfo);\n const clientGroupID = await this.#clientGroupIDPromise;\n if (persistInfo.clientGroupID === clientGroupID) {\n void this.#scheduleRefresh();\n }\n }\n\n async #scheduleRefresh(): Promise<void> {\n if (!this.#enableScheduledRefresh) {\n return;\n }\n await this.#schedule('refresh from storage', this.#refreshScheduler);\n }\n\n async #schedule(name: string, scheduler: ProcessScheduler): Promise<void> {\n try {\n await scheduler.schedule();\n } catch (e) {\n if (e instanceof AbortError) {\n this.#lc.debug?.(`Scheduled ${name} did not complete before close.`);\n } else {\n this.#lc.error?.(`Error during ${name}`, e);\n }\n }\n }\n\n /**\n * Runs a refresh as soon as possible through the refresh scheduler.\n */\n runRefresh(): Promise<void> {\n return this.#refreshScheduler.run();\n }\n\n #changeSyncCounters(pushDelta: 0, pullDelta: 1 | -1): void;\n #changeSyncCounters(pushDelta: 1 | -1, pullDelta: 0): void;\n #changeSyncCounters(pushDelta: number, pullDelta: number): void {\n this.#pushCounter += pushDelta;\n this.#pullCounter += pullDelta;\n const delta = pushDelta + pullDelta;\n const counter = this.#pushCounter + this.#pullCounter;\n if ((delta === 1 && counter === 1) || counter === 0) {\n const syncing = counter > 0;\n // Run in a new microtask.\n void Promise.resolve().then(() => this.onSync?.(syncing));\n }\n }\n\n /**\n * Subscribe to the result of a {@link query}. The `body` function is\n * evaluated once and its results are returned via `onData`.\n *\n * Thereafter, each time the the result of `body` changes, `onData` is fired\n * again with the new result.\n *\n * `subscribe()` goes to significant effort to avoid extraneous work\n * re-evaluating subscriptions:\n *\n * 1. subscribe tracks the keys that `body` accesses each time it runs. `body`\n * is only re-evaluated when those keys change.\n * 2. subscribe only re-fires `onData` in the case that a result changes by\n * way of the `isEqual` option which defaults to doing a deep JSON value\n * equality check.\n *\n * Because of (1), `body` must be a pure function of the data in Replicache.\n * `body` must not access anything other than the `tx` parameter passed to it.\n *\n * Although subscribe is as efficient as it can be, it is somewhat constrained\n * by the goal of returning an arbitrary computation of the cache. For even\n * better performance (but worse dx), see {@link experimentalWatch}.\n *\n * If an error occurs in the `body` the `onError` function is called if\n * present. Otherwise, the error is logged at log level 'error'.\n *\n * To cancel the subscription, call the returned function.\n *\n * @param body The function to evaluate to get the value to pass into\n * `onData`.\n * @param options Options is either a function or an object. If it is a\n * function it is equivalent to passing it as the `onData` property of an\n * object.\n */\n subscribe<R>(\n body: (tx: ReadTransaction) => Promise<R>,\n options: SubscribeOptions<R> | ((result: R) => void),\n ): () => void {\n if (typeof options === 'function') {\n options = {onData: options};\n }\n\n const {onData, onError, onDone, isEqual} = options;\n return this.#subscriptions.add(\n new SubscriptionImpl(body, onData, onError, onDone, isEqual),\n );\n }\n\n /**\n * Watches Replicache for changes.\n *\n * The `callback` gets called whenever the underlying data changes and the\n * `key` changes matches the `prefix` of {@link ExperimentalWatchIndexOptions} or\n * {@link ExperimentalWatchNoIndexOptions} if present. If a change\n * occurs to the data but the change does not impact the key space the\n * callback is not called. In other words, the callback is never called with\n * an empty diff.\n *\n * This gets called after commit (a mutation or a rebase).\n *\n * @experimental This method is under development and its semantics will\n * change.\n */\n experimentalWatch(callback: WatchNoIndexCallback): () => void;\n experimentalWatch<Options extends WatchOptions>(\n callback: WatchCallbackForOptions<Options>,\n options?: Options,\n ): () => void;\n experimentalWatch<Options extends WatchOptions>(\n callback: WatchCallbackForOptions<Options>,\n options?: Options,\n ): () => void {\n return this.#subscriptions.add(\n new WatchSubscription(callback as WatchCallback, options),\n );\n }\n\n /**\n * Query is used for read transactions. It is recommended to use transactions\n * to ensure you get a consistent view across multiple calls to `get`, `has`\n * and `scan`.\n */\n query<R>(body: (tx: ReadTransaction) => Promise<R> | R): Promise<R> {\n return this.#queryInternal(body);\n }\n\n get cookie(): Promise<Cookie> {\n return this.#ready.then(() =>\n withRead(this.memdag, async dagRead => {\n const mainHeadHash = await dagRead.getHead(DEFAULT_HEAD_NAME);\n if (!mainHeadHash) {\n throw new Error('Internal no main head found');\n }\n const baseSnapshot = await baseSnapshotFromHash(mainHeadHash, dagRead);\n const baseSnapshotMeta = baseSnapshot.meta;\n const cookie = baseSnapshotMeta.cookieJSON;\n assertCookie(cookie);\n return cookie;\n }),\n );\n }\n\n #queryInternal: QueryInternal = async body => {\n await this.#ready;\n const {clientID} = this;\n return withRead(this.memdag, async dagRead => {\n try {\n const dbRead = await readFromDefaultHead(dagRead, FormatVersion.Latest);\n const tx = new ReadTransactionImpl(clientID, dbRead, this.#lc);\n return await body(tx);\n } catch (ex) {\n throw await this.#convertToClientStateNotFoundError(ex);\n }\n });\n };\n\n #register<Return extends ReadonlyJSONValue | void, Args extends JSONValue>(\n name: string,\n mutatorImpl: (tx: WriteTransaction, args?: Args) => MaybePromise<Return>,\n ): (\n args?: Args,\n ) => Promise<Return> | {client: Promise<Return>; server: Promise<unknown>} {\n this.#mutatorRegistry[name] = mutatorImpl as (\n tx: WriteTransaction,\n args: JSONValue | undefined,\n ) => Promise<void | JSONValue>;\n\n return (\n args?: Args,\n ):\n | Promise<Return>\n | {client: Promise<Return>; server: Promise<unknown>} => {\n // DO NOT track CRUD mutations as they do not receive responses from\n // the server.\n const trackingData =\n name === '_zero_crud' ? undefined : this.#zero?.trackMutation();\n\n const result = this.#mutate(\n trackingData,\n name,\n mutatorImpl,\n args,\n performance.now(),\n );\n\n if (trackingData) {\n return {\n client: result,\n server: trackingData.serverPromise,\n };\n }\n\n return result;\n };\n }\n\n #registerMutators<\n M extends {\n [key: string]: (\n tx: WriteTransaction,\n args?: ReadonlyJSONValue,\n ) => MutatorReturn;\n },\n >(regs: M): MakeMutators<M> {\n type Mut = MakeMutators<M>;\n const rv: Partial<Mut> = Object.create(null);\n for (const k in regs) {\n rv[k] = this.#register(k, regs[k]) as MakeMutator<M[typeof k]>;\n }\n return rv as Mut;\n }\n\n async #mutate<\n R extends ReadonlyJSONValue | void,\n A extends ReadonlyJSONValue,\n >(\n trackingData: MutationTrackingData | undefined,\n name: string,\n mutatorImpl: (tx: WriteTransaction, args?: A) => MaybePromise<R>,\n args: A | undefined,\n timestamp: number,\n ): Promise<R> {\n const frozenArgs = deepFreeze(args ?? null);\n\n // Ensure that we run initial pending subscribe functions before starting a\n // write transaction.\n if (this.#subscriptions.hasPendingSubscriptionRuns) {\n await Promise.resolve();\n }\n\n await this.#ready;\n const {clientID} = this;\n return withWriteNoImplicitCommit(this.memdag, async dagWrite => {\n try {\n let result: R;\n let newHead: Hash;\n let diffs: DiffsMap;\n let headHash: Hash;\n try {\n headHash = await mustGetHeadHash(DEFAULT_HEAD_NAME, dagWrite);\n const originalHash = null;\n\n const dbWrite = await newWriteLocal(\n headHash,\n name,\n frozenArgs,\n originalHash,\n dagWrite,\n timestamp,\n clientID,\n FormatVersion.Latest,\n );\n\n const mutationID = await dbWrite.getMutationID();\n const tx = new WriteTransactionImpl(\n clientID,\n mutationID,\n 'initial',\n await this.#zero?.getTxData(headHash, {\n openLazyRead: dagWrite,\n }),\n dbWrite,\n this.#lc,\n );\n\n if (trackingData) {\n this.#zero?.mutationIDAssigned(\n trackingData.ephemeralID,\n mutationID,\n );\n }\n\n result = await mutatorImpl(tx, args);\n\n throwIfClosed(dbWrite);\n const lastMutationID = await dbWrite.getMutationID();\n [newHead, diffs] = await dbWrite.commitWithDiffs(\n DEFAULT_HEAD_NAME,\n this.#subscriptions,\n );\n\n // Update this after the commit in case the commit fails.\n this.lastMutationID = lastMutationID;\n } catch (e) {\n // If we threw before we could persist the mutation\n // then we need to reject the mutation.\n if (trackingData) {\n this.#zero?.rejectMutation(trackingData.ephemeralID, e);\n }\n throw e;\n }\n\n this.#zero?.advance(headHash, newHead, diffs.get('') ?? []);\n\n // Send is not supposed to reject\n this.#pushConnectionLoop.send(false).catch(() => void 0);\n await this.#subscriptions.fire(diffs);\n void this.#schedulePersist();\n return result;\n } catch (ex) {\n throw await this.#convertToClientStateNotFoundError(ex);\n }\n });\n }\n\n /**\n * In the case we get a ChunkNotFoundError we check if the client got garbage\n * collected and if so change the error to a ClientStateNotFoundError instead\n */\n async #convertToClientStateNotFoundError(ex: unknown): Promise<unknown> {\n if (\n ex instanceof ChunkNotFoundError &&\n (await this.#checkForClientStateNotFoundAndCallHandler())\n ) {\n return new ClientStateNotFoundError(this.clientID);\n }\n\n return ex;\n }\n\n recoverMutations(): Promise<boolean> | void {\n if (!process.env.DISABLE_MUTATION_RECOVERY) {\n // oxlint-disable-next-line no-non-null-assertion\n const result = this.#mutationRecovery!.recoverMutations(\n this.#ready,\n this.perdag,\n this.#idbDatabase,\n this.#idbDatabases,\n this.#kvStoreProvider.create,\n );\n if (TESTING) {\n void this.onRecoverMutations(result);\n }\n return result;\n }\n }\n\n /**\n * List of pending mutations. The order of this is from oldest to newest.\n *\n * Gives a list of local mutations that have `mutationID` >\n * `syncHead.mutationID` that exists on the main client group.\n *\n * @experimental This method is experimental and may change in the future.\n */\n experimentalPendingMutations(): Promise<readonly PendingMutation[]> {\n return withRead(this.memdag, pendingMutationsForAPI);\n }\n}\n\n// This map is used to keep track of closing instances of Replicache. When an\n// instance is opening we wait for any currently closing instances.\nconst closingInstances: Map<string, Promise<unknown>> = new Map();\n\nasync function throwIfError(p: Promise<undefined | {error: unknown}>) {\n const res = await p;\n if (res) {\n throw res.error;\n }\n}\n\nfunction reload(): void {\n if (typeof location !== 'undefined') {\n location.reload();\n }\n}\n\nfunction validateOptions<MD extends MutatorDefs>(\n options: ReplicacheOptions<MD>,\n): void {\n const {name, clientMaxAgeMs} = options;\n if (typeof name !== 'string' || !name) {\n throw new TypeError('name is required and must be non-empty');\n }\n\n if (clientMaxAgeMs !== undefined) {\n const min = Math.max(GC_INTERVAL, HEARTBEAT_INTERVAL);\n if (typeof clientMaxAgeMs !== 'number' || clientMaxAgeMs <= min) {\n throw new TypeError(\n `clientAgeMaxMs must be a number larger than ${min}ms`,\n );\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"replicache-impl.js","names":["#subscriptions","#mutationRecovery","#kvStoreProvider","#perKVStore","#zero","#auth","#idbDatabase","#clientID","#ready","#openFailed","#profileIDPromise","#clientGroupIDPromise","#mutatorRegistry","#requestOptions","#idbDatabases","#lc","#closeAbortController","#persistAbortController","#refreshAbortController","#persistLock","#enableScheduledPersist","#enableScheduledRefresh","#enableRefresh","#enablePullAndPushInOpen","#onPersist","#queryInternal","#onMemFallBack","#handleStorageFailure","#onInvalidRefCount","#reportStorageFailure","#pullConnectionLoop","#invokePull","#pushConnectionLoop","#invokePush","#registerMutators","#wrapInOnlineCheck","#wrapInReauthRetries","#isPullDisabled","#isPushDisabled","#handlePersist","#open","#closed","#clientStateNotFoundOnClient","#fireOnUpdateNeeded","#onVisibilityChange","#storageFailure","#checkForClientStateNotFoundAndCallHandler","#online","#schedulePersist","#changeSyncCounters","#convertToClientStateNotFoundError","#handleVersionNotSupportedResponse","#clientStateNotFoundOnServer","#handleInvalidRefCount","#persistInFlight","#refresh","#refreshInFlight","#fireOnClientStateNotFound","#fireOnStorageFailure","#corruptDatabaseRecovery","#dropDatabaseAndFireOnClientStateNotFound","#schedule","#persistScheduler","#scheduleRefresh","#refreshScheduler","#pushCounter","#pullCounter","#mutate","#register"],"sources":["../../../../replicache/src/replicache-impl.ts"],"sourcesContent":["import {Lock} from '@rocicorp/lock';\nimport type {LogContext} from '@rocicorp/logger';\nimport {consoleLogSink} from '@rocicorp/logger';\nimport {resolver} from '@rocicorp/resolver';\nimport {AbortError} from '../../shared/src/abort-error.ts';\nimport {assert} from '../../shared/src/asserts.ts';\nimport {getBrowserGlobal} from '../../shared/src/browser-env.ts';\nimport {getDocumentVisibilityWatcher} from '../../shared/src/document-visible.ts';\nimport type {JSONValue, ReadonlyJSONValue} from '../../shared/src/json.ts';\nimport {promiseFalse, promiseVoid} from '../../shared/src/resolved-promises.ts';\nimport {TESTING} from '../../shared/src/testing.ts';\nimport type {MaybePromise} from '../../shared/src/types.ts';\nimport {PullDelegate, PushDelegate} from './connection-loop-delegates.ts';\nimport {ConnectionLoop, MAX_DELAY_MS, MIN_DELAY_MS} from './connection-loop.ts';\nimport {assertCookie, type Cookie} from './cookies.ts';\nimport {InvalidRefCountError} from './dag/invalid-ref-count-error.ts';\nimport {LazyStore} from './dag/lazy-store.ts';\nimport {StoreImpl} from './dag/store-impl.ts';\nimport {ChunkNotFoundError, mustGetHeadHash, type Store} from './dag/store.ts';\nimport {\n baseSnapshotFromHash,\n DEFAULT_HEAD_NAME,\n isLocalMetaDD31,\n type LocalMeta,\n} from './db/commit.ts';\nimport {readFromDefaultHead} from './db/read.ts';\nimport {rebaseMutationAndCommit} from './db/rebase.ts';\nimport {newWriteLocal} from './db/write.ts';\nimport {\n isClientStateNotFoundResponse,\n isVersionNotSupportedResponse,\n type VersionNotSupportedResponse,\n} from './error-responses.ts';\nimport * as FormatVersion from './format-version-enum.ts';\nimport {deepFreeze} from './frozen-json.ts';\nimport {getDefaultPuller, isDefaultPuller} from './get-default-puller.ts';\nimport {getDefaultPusher, isDefaultPusher} from './get-default-pusher.ts';\nimport {getKVStoreProvider} from './get-kv-store-provider.ts';\nimport {assertHash, emptyHash, type Hash, newRandomHash} from './hash.ts';\nimport type {HTTPRequestInfo} from './http-request-info.ts';\nimport {httpStatusUnauthorized} from './http-status-unauthorized.ts';\nimport type {IndexDefinitions} from './index-defs.ts';\nimport {\n type MemFallbackStore,\n MemFallbackStoreProvider,\n} from './kv/mem-fallback-store.ts';\nimport type {Store as KVStore} from './kv/store.ts';\nimport {createLogContext} from './log-options.ts';\nimport {makeIDBName} from './make-idb-name.ts';\nimport {MutationRecovery} from './mutation-recovery.ts';\nimport {initNewClientChannel} from './new-client-channel.ts';\nimport {\n initOnPersistChannel,\n type OnPersist,\n type PersistInfo,\n} from './on-persist-channel.ts';\nimport {\n type PendingMutation,\n pendingMutationsForAPI,\n} from './pending-mutations.ts';\nimport {\n CLIENT_MAX_INACTIVE_TIME,\n GC_INTERVAL,\n initClientGC,\n} from './persist/client-gc.ts';\nimport {initClientGroupGC} from './persist/client-group-gc.ts';\nimport {disableClientGroup} from './persist/client-groups.ts';\nimport {\n ClientStateNotFoundError,\n initClientV6,\n type OnClientsDeleted,\n hasClientState as persistHasClientState,\n} from './persist/clients.ts';\nimport {\n COLLECT_IDB_INTERVAL,\n dropDatabaseInternal,\n initCollectIDBDatabases,\n INITIAL_COLLECT_IDB_DELAY,\n} from './persist/collect-idb-databases.ts';\nimport {HEARTBEAT_INTERVAL, startHeartbeats} from './persist/heartbeat.ts';\nimport {\n IDBDatabasesStore,\n type IndexedDBDatabase,\n} from './persist/idb-databases-store.ts';\nimport {makeClientID} from './persist/make-client-id.ts';\nimport {persistDD31} from './persist/persist.ts';\nimport {refresh} from './persist/refresh.ts';\nimport {ProcessScheduler} from './process-scheduler.ts';\nimport type {Puller} from './puller.ts';\nimport {type Pusher, PushError} from './pusher.ts';\nimport type {\n MutationTrackingData,\n ReplicacheOptions,\n ZeroOption,\n} from './replicache-options.ts';\nimport {ReportError} from './report-error.ts';\nimport {setIntervalWithSignal} from './set-interval-with-signal.ts';\nimport {\n getStorageFailure,\n type StorageFailureError,\n} from './storage-failure.ts';\nimport {\n type SubscribeOptions,\n SubscriptionImpl,\n type SubscriptionsManager,\n SubscriptionsManagerImpl,\n type WatchCallback,\n type WatchCallbackForOptions,\n type WatchNoIndexCallback,\n type WatchOptions,\n WatchSubscription,\n} from './subscriptions.ts';\nimport type {DiffsMap} from './sync/diff.ts';\nimport * as HandlePullResponseResultEnum from './sync/handle-pull-response-result-type-enum.ts';\nimport type {ClientGroupID, ClientID} from './sync/ids.ts';\nimport {PullError} from './sync/pull-error.ts';\nimport {beginPullV1, handlePullResponseV1, maybeEndPull} from './sync/pull.ts';\nimport {push, PUSH_VERSION_DD31} from './sync/push.ts';\nimport {newRequestID} from './sync/request-id.ts';\nimport {SYNC_HEAD_NAME} from './sync/sync-head-name.ts';\nimport {throwIfClosed} from './transaction-closed-error.ts';\nimport type {ReadTransaction, WriteTransaction} from './transactions.ts';\nimport {ReadTransactionImpl, WriteTransactionImpl} from './transactions.ts';\nimport type {\n BeginPullResult,\n MakeMutator,\n MakeMutators,\n MutatorDefs,\n MutatorReturn,\n PokeInternal,\n QueryInternal,\n RequestOptions,\n UpdateNeededReason,\n} from './types.ts';\nimport {version} from './version.ts';\nimport {\n withRead,\n withWrite,\n withWriteNoImplicitCommit,\n} from './with-transactions.ts';\n\n/**\n * The maximum number of time to call out to getAuth before giving up\n * and throwing an error.\n */\nconst MAX_REAUTH_TRIES = 8;\n\nconst PERSIST_IDLE_TIMEOUT_MS = 1000;\nconst REFRESH_IDLE_TIMEOUT_MS = 1000;\n\nconst PERSIST_THROTTLE_MS = 500;\nconst REFRESH_THROTTLE_MS = 500;\n\n/**\n * Opening the database blocks everything Replicache does, including Zero's\n * first connect attempt, so a slow open is worth a warning rather than a\n * debug line.\n */\nconst SLOW_DB_OPEN_THRESHOLD_MS = 50;\n\nconst LAZY_STORE_SOURCE_CHUNK_CACHE_SIZE_LIMIT = 100 * 2 ** 20; // 100 MB\n\nconst RECOVER_MUTATIONS_INTERVAL_MS = 5 * 60 * 1000; // 5 mins\n\nconst noop = () => {\n // noop\n};\n\nconst updateNeededReasonNewClientGroup: UpdateNeededReason = {\n type: 'NewClientGroup',\n} as const;\n\n/** @deprecated Not used any more */\nexport interface MakeSubscriptionsManager {\n (queryInternal: QueryInternal, lc: LogContext): SubscriptionsManager;\n}\n\nexport interface ReplicacheImplOptions {\n /**\n * Defaults to true.\n */\n enableMutationRecovery?: boolean | undefined;\n\n /**\n * Defaults to true.\n */\n enableScheduledPersist?: boolean | undefined;\n\n /**\n * Defaults to true.\n */\n enableScheduledRefresh?: boolean | undefined;\n\n /**\n * Defaults to `() => true`.\n */\n enableRefresh?: (() => boolean) | undefined;\n\n /**\n * Defaults to true.\n */\n enablePullAndPushInOpen?: boolean | undefined;\n\n /**\n * @deprecated Not used anymore.\n */\n makeSubscriptionsManager?: unknown;\n\n /**\n * Default is `true`. If `false` if an exact match client group\n * is not found, a new client group is always made instead of forking\n * from an existing client group.\n */\n enableClientGroupForking?: boolean | undefined;\n\n /**\n * Callback for when Replicache has deleted clients.\n */\n onClientsDeleted?: OnClientsDeleted | undefined;\n\n /**\n * Internal option used by Zero.\n * Replicache will call this to and, if zero is enabled, will\n * invoke various hooks to allow Zero the keep IVM in sync with Replicache's b-trees.\n */\n zero?: ZeroOption | undefined;\n}\n\nexport class ReplicacheImpl<MD extends MutatorDefs = {}> {\n /** The URL to use when doing a pull request. */\n pullURL: string;\n\n /** The URL to use when doing a push request. */\n pushURL: string;\n\n /** The authorization token used when doing a push request. */\n #auth: string;\n\n /** The name of the Replicache database. Populated by {@link ReplicacheOptions#name}. */\n readonly name: string;\n\n readonly #subscriptions: SubscriptionsManager;\n readonly #mutationRecovery: MutationRecovery | undefined;\n\n /**\n * Client groups gets disabled when the server does not know about it.\n * A disabled client group prevents the client from pushing and pulling.\n */\n isClientGroupDisabled = false;\n\n readonly #kvStoreProvider: MemFallbackStoreProvider;\n readonly #perKVStore: MemFallbackStore;\n\n lastMutationID: number = 0;\n\n /**\n * This is the name Replicache uses for the IndexedDB database where data is\n * stored.\n */\n get idbName(): string {\n return makeIDBName(this.name, this.schemaVersion);\n }\n\n /**\n * The KV store backing this instance. It is a memory store once a storage\n * failure while opening moved the instance onto memory (see\n * `onStorageFailure`).\n */\n get kvStore(): KVStore {\n return this.#perKVStore.backing;\n }\n\n set auth(auth: string) {\n if (this.#zero) {\n this.#zero.auth = auth;\n }\n\n this.#auth = auth;\n }\n\n get auth() {\n return this.#auth;\n }\n\n /** The schema version of the data understood by this application. */\n readonly schemaVersion: string;\n\n get #idbDatabase(): IndexedDBDatabase {\n return {\n name: this.idbName,\n replicacheName: this.name,\n replicacheFormatVersion: FormatVersion.Latest,\n schemaVersion: this.schemaVersion,\n };\n }\n #closed = false;\n #online = true;\n readonly #clientID = makeClientID();\n readonly #ready: Promise<void>;\n /**\n * Resolves if open fails, for whatever reason. `#ready` never resolves in\n * that case, so `close()` waits on whichever of the two settles first\n * instead of hanging forever.\n */\n readonly #openFailed = resolver<void>();\n readonly #profileIDPromise: Promise<string>;\n readonly #clientGroupIDPromise: Promise<string>;\n readonly #mutatorRegistry: MutatorDefs = {};\n\n /**\n * The mutators that was registered in the constructor.\n */\n readonly mutate: MakeMutators<MD>;\n\n // Number of pushes/pulls at the moment.\n #pushCounter = 0;\n #pullCounter = 0;\n\n #pullConnectionLoop: ConnectionLoop;\n #pushConnectionLoop: ConnectionLoop;\n\n /**\n * The duration between each periodic {@link pull}. Setting this to `null`\n * disables periodic pull completely. Pull will still happen if you call\n * {@link pull} manually.\n */\n pullInterval: number | null;\n\n /**\n * The delay between when a change is made to Replicache and when Replicache\n * attempts to push that change.\n */\n pushDelay: number;\n\n readonly #requestOptions: Required<RequestOptions>;\n\n /**\n * The function to use to pull data from the server.\n */\n puller: Puller;\n\n /**\n * The function to use to push data to the server.\n */\n pusher: Pusher;\n\n readonly memdag: LazyStore;\n readonly perdag: Store;\n readonly #idbDatabases: IDBDatabasesStore;\n readonly #lc: LogContext;\n readonly #zero: ZeroOption | undefined;\n\n readonly #closeAbortController = new AbortController();\n /**\n * Aborted on close, on a storage failure after the open, and by\n * {@link stopPersist}. `persist()`, the persist scheduler and the\n * store-writing background processes (heartbeat, client and client-group\n * GC, database collection, mutation recovery) stop on this signal, so the\n * first detected failure stops them instead of letting each retry the\n * fault at its interval and log `Error running.` every time. A failure\n * during the open moves the stores onto memory instead, where they keep\n * running.\n */\n readonly #persistAbortController = new AbortController();\n\n /**\n * Aborted on close, on a storage failure after the open, and by\n * {@link stopRefresh}. `refresh()`, the refresh scheduler and the\n * store-reading background process (the new-client channel's store read)\n * stop on this signal.\n */\n readonly #refreshAbortController = new AbortController();\n\n readonly #persistLock = new Lock();\n readonly #enableScheduledPersist: boolean;\n readonly #enableScheduledRefresh: boolean;\n readonly #enableRefresh: () => boolean;\n readonly #enablePullAndPushInOpen: boolean;\n #persistScheduler = new ProcessScheduler(\n () => this.persist(),\n PERSIST_IDLE_TIMEOUT_MS,\n PERSIST_THROTTLE_MS,\n this.#closeAbortController.signal,\n );\n readonly #onPersist: OnPersist;\n #refreshScheduler = new ProcessScheduler(\n () => this.refresh(),\n REFRESH_IDLE_TIMEOUT_MS,\n REFRESH_THROTTLE_MS,\n this.#closeAbortController.signal,\n );\n\n /**\n * The options used to control the {@link pull} and push request behavior. This\n * object is live so changes to it will affect the next pull or push call.\n */\n get requestOptions(): Required<RequestOptions> {\n return this.#requestOptions;\n }\n\n /**\n * `onSync(true)` is called when Replicache transitions from no push or pull\n * happening to at least one happening. `onSync(false)` is called in the\n * opposite case: when Replicache transitions from at least one push or pull\n * happening to none happening.\n *\n * This can be used in a React like app by doing something like the following:\n *\n * ```js\n * const [syncing, setSyncing] = useState(false);\n * useEffect(() => {\n * rep.onSync = setSyncing;\n * }, [rep]);\n * ```\n */\n onSync: ((syncing: boolean) => void) | null = null;\n\n /**\n * `onClientStateNotFound` is called when the persistent client state can no\n * longer be used. This happens when:\n * - the persistent client has been garbage collected. This can happen if the\n * client has no pending mutations and has not been used for a while.\n * - the persistent store was found to be corrupt. Replicache then tries to\n * drop the database, including any pending mutations, so that a fresh one\n * is created on reload.\n *\n * The default behavior is to reload the page (using `location.reload()`). Set\n * this to `null` or provide your own function to prevent the page from\n * reloading automatically.\n */\n onClientStateNotFound: (() => void) | null = reload;\n\n /**\n * `onStorageFailure` is called once, the first time the local kv store\n * reports that its storage has failed rather than its data, by throwing a\n * {@link StorageFailureError}: the device is out of space (`full`), the\n * database cannot be opened (`cannot-open`), or a read or write to it failed\n * (`io-error`). The SQLite stores and the IndexedDB store report these; a\n * custom `StoreProvider` can throw a `StorageFailureError` itself.\n *\n * A failure while the instance is opening moves it onto memory for the\n * session, where it runs as with `kvStore: 'mem'`: it persists and\n * refreshes against the memory stores, and nothing reaches the disk.\n *\n * A failure after that stops persisting and refreshing: a rebuild would\n * open the same failing storage, and a wipe would destroy an intact replica\n * for a fault that is not in the data. Queries and mutations keep running\n * against what the in-memory dag holds, and mutations keep pushing to the\n * server, but nothing is persisted locally until the app creates a new\n * instance. A read that needs a chunk the in-memory dag has not loaded from\n * the store yet, or has since evicted from its cache, still goes to the\n * store and fails the way any store read does; that failure reaches its\n * caller, and is reported here as well, whichever caller it was (a query,\n * a mutation, a poke, a background process). An invalid ref count reported while\n * the store is failing with `cannot-open` or `io-error` is NOT treated as\n * corruption (the database is not dropped and {@link onClientStateNotFound}\n * is not called), because a store that cannot complete a read or write is\n * what produces such readings. A `full` disk keeps the drop: a torn write\n * there is real corruption, and deleting the database is also what frees\n * the space.\n *\n * After the open, the failure is detected when a transaction on the store\n * fails to begin or to commit, whichever caller ran it (`persist()`, the\n * heartbeat, garbage collection, ...), when `persist()` or `refresh()`\n * fails, when the in-memory dag fails to load a chunk from the store for\n * any caller, and when a background process fails on a store read inside\n * its transaction. The background maintenance processes (heartbeat, client and\n * client-group GC, database collection, mutation recovery) stop on it\n * instead of retrying against the store at their interval.\n *\n * There is no default behavior other than logging. An app that shows a\n * \"free up space\" or \"restart\" screen can do so from here.\n */\n onStorageFailure: ((failure: StorageFailureError) => void) | null = null;\n\n /**\n * Set the first time the kv store reports a storage failure. Read by every\n * path that writes the perdag so none of them retries against storage\n * that has failed.\n */\n #storageFailure: StorageFailureError | undefined;\n\n /**\n * The last persist queued on the persist lock, if any, so\n * {@link stopPersist} can wait for it. The lock runs persists in order, so\n * this one settles after every persist queued before it. Settled to\n * `undefined` rather than left rejected.\n */\n #persistInFlight: Promise<void> | undefined;\n\n /**\n * The refresh currently running, if any, so {@link stopRefresh} can wait\n * for it. Settled to `undefined` rather than left rejected.\n */\n #refreshInFlight: Promise<void> | undefined;\n\n /**\n * `onUpdateNeeded` is called when a code update is needed.\n *\n * A code update can be needed because:\n * - the server no longer supports the {@link pushVersion},\n * {@link pullVersion} or {@link schemaVersion} of the current code.\n * - a new Replicache client has created a new client group, because its code\n * has different mutators, indexes, schema version and/or format version\n * from this Replicache client. This is likely due to the new client having\n * newer code. A code update is needed to be able to locally sync with this\n * new Replicache client (i.e. to sync while offline, the clients can still\n * sync with each other via the server).\n *\n * The default behavior is to reload the page (using `location.reload()`). Set\n * this to `null` or provide your own function to prevent the page from\n * reloading automatically. You may want to provide your own function to\n * display a toast to inform the end user there is a new version of your app\n * available and prompting them to refresh.\n */\n onUpdateNeeded: ((reason: UpdateNeededReason) => void) | null = reload;\n\n /**\n * This gets called when we get an HTTP unauthorized (401) response from the\n * push or pull endpoint. Set this to a function that will ask your user to\n * reauthenticate.\n */\n getAuth: (() => MaybePromise<string | null | undefined>) | null | undefined =\n null;\n\n // These three are used for testing\n onPushInvoked = () => undefined;\n onBeginPull = () => undefined;\n onRecoverMutations = (r: Promise<boolean>) => r;\n\n constructor(\n options: ReplicacheOptions<MD>,\n implOptions: ReplicacheImplOptions = {},\n ) {\n validateOptions(options);\n const {\n name,\n logLevel = 'info',\n logSinks = [consoleLogSink],\n pullURL = '',\n auth,\n pushDelay = 10,\n pushURL = '',\n schemaVersion = '',\n pullInterval = 60000,\n mutators = {} as MD,\n requestOptions = {},\n puller,\n pusher,\n indexes = {},\n clientMaxAgeMs = CLIENT_MAX_INACTIVE_TIME,\n } = options;\n const {\n enableMutationRecovery = true,\n enableScheduledPersist = true,\n enableScheduledRefresh = true,\n enableRefresh = () => true,\n enablePullAndPushInOpen = true,\n enableClientGroupForking = true,\n onClientsDeleted = () => promiseVoid,\n } = implOptions;\n this.#zero = implOptions.zero;\n this.#auth = auth ?? '';\n this.pullURL = pullURL;\n this.pushURL = pushURL;\n this.name = name;\n this.schemaVersion = schemaVersion;\n this.pullInterval = pullInterval;\n this.pushDelay = pushDelay;\n this.puller = puller ?? getDefaultPuller(this);\n this.pusher = pusher ?? getDefaultPusher(this);\n\n this.#enableScheduledPersist = enableScheduledPersist;\n this.#enableScheduledRefresh = enableScheduledRefresh;\n this.#enableRefresh = enableRefresh;\n this.#enablePullAndPushInOpen = enablePullAndPushInOpen;\n\n this.#lc = createLogContext(logLevel, logSinks, {name});\n this.#lc.debug?.('Constructing Replicache', {\n name,\n 'replicache version': version,\n });\n\n // Close stops the store-using background processes too. Wired here, before\n // any close can happen, because an abort that already fired is not replayed\n // to a listener added later (an engine closed while its open is in flight).\n this.#closeAbortController.signal.addEventListener(\n 'abort',\n () => {\n this.#persistAbortController.abort();\n this.#refreshAbortController.abort();\n },\n {once: true},\n );\n this.#subscriptions = new SubscriptionsManagerImpl(\n this.#queryInternal,\n this.#lc,\n this.#closeAbortController.signal,\n );\n\n const kvStoreProvider = new MemFallbackStoreProvider(\n getKVStoreProvider(this.#lc, options.kvStore),\n failure => this.#onMemFallBack(failure),\n failure => this.#handleStorageFailure(failure),\n );\n this.#kvStoreProvider = kvStoreProvider;\n\n const perKVStore = kvStoreProvider.create(this.idbName);\n this.#perKVStore = perKVStore;\n\n this.#idbDatabases = new IDBDatabasesStore(kvStoreProvider.create);\n this.perdag = new StoreImpl(\n perKVStore,\n newRandomHash,\n assertHash,\n this.#onInvalidRefCount,\n );\n this.memdag = new LazyStore(\n this.perdag,\n LAZY_STORE_SOURCE_CHUNK_CACHE_SIZE_LIMIT,\n newRandomHash,\n assertHash,\n undefined,\n this.#reportStorageFailure,\n );\n\n // Use a promise-resolve pair so that we have a promise to use even before\n // we call the Open RPC.\n const readyResolver = resolver<void>();\n this.#ready = readyResolver.promise;\n\n const {minDelayMs = MIN_DELAY_MS, maxDelayMs = MAX_DELAY_MS} =\n requestOptions;\n this.#requestOptions = {maxDelayMs, minDelayMs};\n\n const visibilityWatcher = getDocumentVisibilityWatcher(\n getBrowserGlobal('document'),\n 0,\n this.#closeAbortController.signal,\n );\n\n this.#pullConnectionLoop = new ConnectionLoop(\n this.#lc.withContext('PULL'),\n new PullDelegate(this, () => this.#invokePull()),\n visibilityWatcher,\n );\n\n this.#pushConnectionLoop = new ConnectionLoop(\n this.#lc.withContext('PUSH'),\n new PushDelegate(this, () => this.#invokePush()),\n );\n\n this.mutate = this.#registerMutators(mutators);\n\n const profileIDResolver = resolver<string>();\n this.#profileIDPromise = profileIDResolver.promise;\n const clientGroupIDResolver = resolver<string>();\n this.#clientGroupIDPromise = clientGroupIDResolver.promise;\n\n if (!process.env.DISABLE_MUTATION_RECOVERY) {\n this.#mutationRecovery = new MutationRecovery({\n delegate: this,\n lc: this.#lc,\n enableMutationRecovery,\n wrapInOnlineCheck: this.#wrapInOnlineCheck.bind(this),\n wrapInReauthRetries: this.#wrapInReauthRetries.bind(this),\n isPullDisabled: this.#isPullDisabled.bind(this),\n isPushDisabled: this.#isPushDisabled.bind(this),\n clientGroupIDPromise: this.#clientGroupIDPromise,\n });\n }\n\n this.#onPersist = initOnPersistChannel(\n this.name,\n this.#closeAbortController.signal,\n persistInfo => {\n void this.#handlePersist(persistInfo);\n },\n );\n\n const open = () =>\n this.#open(\n indexes,\n enableClientGroupForking,\n enableMutationRecovery,\n clientMaxAgeMs,\n profileIDResolver.resolve,\n clientGroupIDResolver.resolve,\n readyResolver.resolve,\n onClientsDeleted,\n );\n void open().catch(e => {\n if (e instanceof InvalidRefCountError) {\n // #onInvalidRefCount (called from the write's release()) already\n // started recovery: drop the database and fire onClientStateNotFound.\n // Nothing else can be done with this instance: `#ready` stays pending\n // so reads and writes never run against the corrupt store, and\n // `#openFailed` lets `close()` dispose the instance anyway.\n this.#openFailed.resolve();\n this.#lc.debug?.('Open failed because the persistent store is corrupt');\n return;\n }\n if (!this.#closed && this.#kvStoreProvider.fallBack(e)) {\n // The storage failed while opening, and the stores are on memory now.\n // Nothing has been written to the in-memory dag that the memory\n // stores cannot serve, so open again on the same stores.\n return open().catch(e => {\n this.#openFailed.resolve();\n if (this.#closed) {\n this.#lc.debug?.('Open on memory ended by close', e);\n } else {\n this.#lc.error?.('Open failed again on memory', e);\n }\n });\n }\n // Whatever the reason, this open is over: `#ready` stays pending so\n // reads and writes never run against a store that failed to open, but\n // `close()` must still be able to dispose the instance.\n this.#openFailed.resolve();\n // Report rather than rethrow. The promise this `catch` returns is\n // discarded (`void` above), so a rethrow here is an unhandled rejection:\n // nothing observes it, and the failure reaches neither the log sinks the\n // caller configured nor any recovery they wired up — while `#ready` stays\n // pending, so every read, write and subscription blocks for the life of\n // the instance with nothing reported. The memory-fallback path above\n // already reports its own failure this way instead of throwing.\n this.#lc.error?.('Error during open', e);\n return;\n });\n }\n\n async #open(\n indexes: IndexDefinitions,\n enableClientGroupForking: boolean,\n enableMutationRecovery: boolean,\n clientMaxAgeMs: number,\n profileIDResolver: (profileID: string) => void,\n resolveClientGroupID: (clientGroupID: ClientGroupID) => void,\n resolveReady: () => void,\n onClientsDeleted: OnClientsDeleted,\n ): Promise<void> {\n const {clientID} = this;\n // Everything up to the head write is what it takes to have a usable\n // database, including waiting out a previous instance of the same name.\n // The timer stops before the replica is loaded into Zero's IVM sources,\n // which is separate work and usually the larger of the two: a number that\n // spanned both would report a slow hydration as a slow disk.\n const openStart = performance.now();\n // If we are currently closing a Replicache instance with the same name,\n // wait for it to finish closing.\n await closingInstances.get(this.name);\n await this.#idbDatabases.getProfileID().then(profileIDResolver);\n await this.#idbDatabases.putDatabase(this.#idbDatabase);\n const [client, headHash, , isNewClientGroup] = await initClientV6(\n clientID,\n this.#lc,\n this.perdag,\n Object.keys(this.#mutatorRegistry),\n indexes,\n FormatVersion.Latest,\n enableClientGroupForking,\n );\n\n resolveClientGroupID(client.clientGroupID);\n await withWrite(this.memdag, write =>\n write.setHead(DEFAULT_HEAD_NAME, headHash),\n );\n\n // Now we have a profileID, a clientID, a clientGroupID and DB!\n const dbOpenMs = performance.now() - openStart;\n if (dbOpenMs > SLOW_DB_OPEN_THRESHOLD_MS) {\n this.#lc.warn?.(`Opening the database took ${Math.round(dbOpenMs)}ms`, {\n name: this.idbName,\n });\n } else {\n this.#lc.debug?.('Opened the database in', Math.round(dbOpenMs), 'ms');\n }\n\n await this.#zero?.init(headHash, this.memdag);\n this.#kvStoreProvider.opened();\n resolveReady();\n\n if (this.#enablePullAndPushInOpen) {\n this.pull().catch(noop);\n this.push().catch(noop);\n }\n\n const {signal} = this.#persistAbortController;\n\n startHeartbeats(\n clientID,\n this.perdag,\n () => {\n this.#clientStateNotFoundOnClient(clientID);\n },\n HEARTBEAT_INTERVAL,\n this.#lc,\n signal,\n this.#reportStorageFailure,\n );\n initClientGC(\n clientID,\n this.perdag,\n clientMaxAgeMs,\n GC_INTERVAL,\n onClientsDeleted,\n this.#lc,\n signal,\n this.#reportStorageFailure,\n );\n initCollectIDBDatabases(\n this.#idbDatabases,\n this.#kvStoreProvider,\n COLLECT_IDB_INTERVAL,\n INITIAL_COLLECT_IDB_DELAY,\n 2 * clientMaxAgeMs,\n enableMutationRecovery,\n onClientsDeleted,\n this.#lc,\n signal,\n // Collection writes deleted clients into every surviving database using\n // its own dag store. When that is our database, a corrupt ref count\n // found there must reach the same recovery as writes through `perdag`.\n // A corrupt foreign database is left for its own instance to discover\n // and recover from on its next write.\n (name, createKVStore) =>\n new StoreImpl(\n createKVStore(name),\n newRandomHash,\n assertHash,\n name === this.idbName ? this.#onInvalidRefCount : undefined,\n ),\n this.#reportStorageFailure,\n );\n initClientGroupGC(\n this.perdag,\n enableMutationRecovery,\n this.#lc,\n signal,\n this.#reportStorageFailure,\n );\n initNewClientChannel(\n this.name,\n this.idbName,\n this.#refreshAbortController.signal,\n client.clientGroupID,\n isNewClientGroup,\n () => {\n this.#fireOnUpdateNeeded(updateNeededReasonNewClientGroup);\n },\n this.perdag,\n );\n\n setIntervalWithSignal(\n () => this.recoverMutations(),\n RECOVER_MUTATIONS_INTERVAL_MS,\n signal,\n );\n void this.recoverMutations();\n\n getBrowserGlobal('document')?.addEventListener(\n 'visibilitychange',\n this.#onVisibilityChange,\n );\n }\n\n #onVisibilityChange = async () => {\n // A failing store cannot answer whether the client state exists; asking\n // it would report a lost client for a fault that is not in the data.\n if (this.#closed || this.#storageFailure !== undefined) {\n return;\n }\n\n // In case of running in a worker, we don't have a document.\n if (getBrowserGlobal('document')?.visibilityState !== 'visible') {\n return;\n }\n\n await this.#checkForClientStateNotFoundAndCallHandler();\n };\n\n async #checkForClientStateNotFoundAndCallHandler(): Promise<boolean> {\n const {clientID} = this;\n const hasClientState = await withRead(this.perdag, read =>\n persistHasClientState(clientID, read),\n );\n if (!hasClientState) {\n this.#clientStateNotFoundOnClient(clientID);\n }\n return !hasClientState;\n }\n\n /**\n * The browser profile ID for this browser profile. Every instance of Replicache\n * browser-profile-wide shares the same profile ID.\n */\n get profileID(): Promise<string> {\n return this.#profileIDPromise;\n }\n\n /**\n * The client ID for this instance of Replicache. Each instance of Replicache\n * gets a unique client ID.\n */\n get clientID(): string {\n return this.#clientID;\n }\n\n /**\n * The client group ID for this instance of Replicache. Instances of\n * Replicache will have the same client group ID if and only if they have\n * the same name, mutators, indexes, schema version, format version, and\n * browser profile.\n */\n get clientGroupID(): Promise<string> {\n return this.#clientGroupIDPromise;\n }\n\n /**\n * `onOnlineChange` is called when the {@link online} property changes. See\n * {@link online} for more details.\n */\n onOnlineChange: ((online: boolean) => void) | null = null;\n\n /**\n * A rough heuristic for whether the client is currently online. Note that\n * there is no way to know for certain whether a client is online - the next\n * request can always fail. This property returns true if the last sync attempt succeeded,\n * and false otherwise.\n */\n get online(): boolean {\n return this.#online;\n }\n\n /**\n * Whether the Replicache database has been closed. Once Replicache has been\n * closed it no longer syncs and you can no longer read or write data out of\n * it. After it has been closed it is pretty much useless and should not be\n * used any more.\n */\n get closed(): boolean {\n return this.#closed;\n }\n\n /**\n * Closes this Replicache instance.\n *\n * When closed all subscriptions end and no more read or writes are allowed.\n */\n async close(): Promise<void> {\n this.#closed = true;\n const {promise, resolve} = resolver();\n closingInstances.set(this.name, promise);\n\n this.#closeAbortController.abort();\n\n getBrowserGlobal('document')?.removeEventListener(\n 'visibilitychange',\n this.#onVisibilityChange,\n );\n\n await Promise.race([this.#ready, this.#openFailed.promise]);\n const closingPromises = [\n this.memdag.close(),\n this.perdag.close(),\n this.#idbDatabases.close(),\n ];\n\n this.#pullConnectionLoop.close();\n this.#pushConnectionLoop.close();\n\n this.#subscriptions.clear();\n\n await Promise.all(closingPromises);\n closingInstances.delete(this.name);\n resolve();\n }\n\n async maybeEndPull(syncHead: Hash, requestID: string): Promise<void> {\n for (;;) {\n if (this.#closed) {\n return;\n }\n\n await this.#ready;\n const {clientID} = this;\n const lc = this.#lc\n .withContext('maybeEndPull')\n .withContext('requestID', requestID);\n const {replayMutations, diffs, oldMainHead, mainHead} =\n await maybeEndPull<LocalMeta>(\n this.memdag,\n lc,\n syncHead,\n clientID,\n this.#subscriptions,\n FormatVersion.Latest,\n );\n\n if (!replayMutations || replayMutations.length === 0) {\n // All done.\n this.#zero?.advance(oldMainHead, mainHead, diffs.get('') ?? []);\n await this.#subscriptions.fire(diffs);\n void this.#schedulePersist();\n return;\n }\n\n // Replay.\n let zeroData = await this.#zero?.getTxData?.(syncHead);\n for (const mutation of replayMutations) {\n // TODO(greg): I'm not sure why this was in Replicache#_mutate...\n // Ensure that we run initial pending subscribe functions before starting a\n // write transaction.\n if (this.#subscriptions.hasPendingSubscriptionRuns) {\n await Promise.resolve();\n }\n const {meta} = mutation;\n const {result, zeroData: next} = await withWriteNoImplicitCommit(\n this.memdag,\n dagWrite =>\n rebaseMutationAndCommit(\n mutation,\n dagWrite,\n syncHead,\n SYNC_HEAD_NAME,\n this.#mutatorRegistry,\n lc,\n isLocalMetaDD31(meta) ? meta.clientID : clientID,\n FormatVersion.Latest,\n zeroData,\n ),\n );\n syncHead = result;\n // The fork the mutation ran against when it succeeded, or the branch we\n // came in with when it threw.\n zeroData = next;\n }\n }\n }\n\n #invokePull(): Promise<boolean> {\n if (this.#isPullDisabled()) {\n return Promise.resolve(true);\n }\n\n return this.#wrapInOnlineCheck(async () => {\n try {\n this.#changeSyncCounters(0, 1);\n const {syncHead, requestID, ok} = await this.beginPull();\n if (!ok) {\n return false;\n }\n if (syncHead !== emptyHash) {\n await this.maybeEndPull(syncHead, requestID);\n }\n } catch (e) {\n throw await this.#convertToClientStateNotFoundError(e);\n } finally {\n this.#changeSyncCounters(0, -1);\n }\n return true;\n }, 'Pull');\n }\n\n #isPullDisabled() {\n return (\n this.isClientGroupDisabled ||\n (this.pullURL === '' && isDefaultPuller(this.puller))\n );\n }\n\n async #wrapInOnlineCheck(\n f: () => Promise<boolean>,\n name: string,\n ): Promise<boolean> {\n let online = true;\n\n try {\n return await f();\n } catch (e) {\n // The error paths of beginPull and maybeEndPull need to be reworked.\n //\n // We want to distinguish between:\n // a) network requests failed -- we're offline basically\n // b) sync was aborted because one's already in progress\n // c) oh noes - something unexpected happened\n //\n // Right now, all of these come out as errors. We distinguish (b) with a\n // hacky string search. (a) and (c) are not distinguishable currently\n // because repc doesn't provide sufficient information, so we treat all\n // errors that aren't (b) as (a).\n if (e instanceof PushError || e instanceof PullError) {\n online = false;\n this.#lc.debug?.(`${name} threw:\\n`, e, '\\nwith cause:\\n', e.causedBy);\n } else if (e instanceof ReportError) {\n this.#lc.error?.(e);\n } else {\n this.#lc.info?.(`${name} threw:\\n`, e);\n }\n return false;\n } finally {\n if (this.#online !== online) {\n this.#online = online;\n this.onOnlineChange?.(online);\n if (online) {\n void this.recoverMutations();\n }\n }\n }\n }\n\n async #wrapInReauthRetries<R>(\n f: (\n requestID: string,\n requestLc: LogContext,\n ) => Promise<{\n httpRequestInfo: HTTPRequestInfo | undefined;\n result: R;\n }>,\n verb: string,\n lc: LogContext,\n preAuth: () => MaybePromise<void> = noop,\n postAuth: () => MaybePromise<void> = noop,\n ): Promise<{\n result: R;\n authFailure: boolean;\n }> {\n const {clientID} = this;\n let reauthAttempts = 0;\n let lastResult;\n lc = lc.withContext(verb);\n do {\n const requestID = newRequestID(clientID);\n const requestLc = lc.withContext('requestID', requestID);\n const {httpRequestInfo, result} = await f(requestID, requestLc);\n lastResult = result;\n if (!httpRequestInfo) {\n return {\n result,\n authFailure: false,\n };\n }\n const {errorMessage, httpStatusCode} = httpRequestInfo;\n\n if (errorMessage || httpStatusCode !== 200) {\n // TODO(arv): Maybe we should not log the server URL when the error comes\n // from a Pusher/Puller?\n requestLc.error?.(\n `Got a non 200 response doing ${verb}: ${httpStatusCode}` +\n (errorMessage ? `: ${errorMessage}` : ''),\n );\n }\n if (httpStatusCode !== httpStatusUnauthorized) {\n return {\n result,\n authFailure: false,\n };\n }\n if (!this.getAuth) {\n return {\n result,\n authFailure: true,\n };\n }\n let auth;\n try {\n await preAuth();\n auth = await this.getAuth();\n } finally {\n await postAuth();\n }\n if (auth === null || auth === undefined) {\n return {\n result,\n authFailure: true,\n };\n }\n this.auth = auth;\n reauthAttempts++;\n } while (reauthAttempts < MAX_REAUTH_TRIES);\n lc.info?.('Tried to reauthenticate too many times');\n return {\n result: lastResult,\n authFailure: true,\n };\n }\n\n #isPushDisabled() {\n return (\n this.isClientGroupDisabled ||\n (this.pushURL === '' && isDefaultPusher(this.pusher))\n );\n }\n\n async #invokePush(): Promise<boolean> {\n if (TESTING) {\n this.onPushInvoked();\n }\n if (this.#isPushDisabled()) {\n return true;\n }\n\n await this.#ready;\n const profileID = await this.#profileIDPromise;\n const {clientID} = this;\n const clientGroupID = await this.#clientGroupIDPromise;\n return this.#wrapInOnlineCheck(async () => {\n const {result: pusherResult} = await this.#wrapInReauthRetries(\n async (requestID: string, requestLc: LogContext) => {\n try {\n this.#changeSyncCounters(1, 0);\n const pusherResult = await push(\n requestID,\n this.memdag,\n requestLc,\n profileID,\n clientGroupID,\n clientID,\n this.pusher,\n this.schemaVersion,\n PUSH_VERSION_DD31,\n );\n return {\n result: pusherResult,\n httpRequestInfo: pusherResult?.httpRequestInfo,\n };\n } finally {\n this.#changeSyncCounters(-1, 0);\n }\n },\n 'push',\n this.#lc,\n );\n\n if (pusherResult === undefined) {\n // No pending mutations.\n return true;\n }\n\n const {response, httpRequestInfo} = pusherResult;\n\n if (isVersionNotSupportedResponse(response)) {\n this.#handleVersionNotSupportedResponse(response);\n } else if (isClientStateNotFoundResponse(response)) {\n await this.#clientStateNotFoundOnServer();\n }\n\n // No pushResponse means we didn't do a push because there were no\n // pending mutations.\n return httpRequestInfo.httpStatusCode === 200;\n }, 'Push');\n }\n\n #handleVersionNotSupportedResponse(response: VersionNotSupportedResponse) {\n const reason: UpdateNeededReason = {\n type: response.error,\n };\n if (response.versionType) {\n reason.versionType = response.versionType;\n }\n this.#fireOnUpdateNeeded(reason);\n }\n\n /**\n * Push pushes pending changes to the {@link pushURL}.\n *\n * You do not usually need to manually call push. If {@link pushDelay} is\n * non-zero (which it is by default) pushes happen automatically shortly after\n * mutations.\n *\n * If the server endpoint fails push will be continuously retried with an\n * exponential backoff.\n *\n * @param [now=false] If true, push will happen immediately and ignore\n * {@link pushDelay}, {@link RequestOptions.minDelayMs} as well as the\n * exponential backoff in case of errors.\n * @returns A promise that resolves when the next push completes. In case of\n * errors the first error will reject the returned promise. Subsequent errors\n * will not be reflected in the promise.\n */\n push({now = false} = {}): Promise<void> {\n return throwIfError(this.#pushConnectionLoop.send(now));\n }\n\n /**\n * Pull pulls changes from the {@link pullURL}. If there are any changes local\n * changes will get replayed on top of the new server state.\n *\n * If the server endpoint fails pull will be continuously retried with an\n * exponential backoff.\n *\n * @param [now=false] If true, pull will happen immediately and ignore\n * {@link RequestOptions.minDelayMs} as well as the exponential backoff in\n * case of errors.\n * @returns A promise that resolves when the next pull completes. In case of\n * errors the first error will reject the returned promise. Subsequent errors\n * will not be reflected in the promise.\n */\n pull({now = false} = {}): Promise<void> {\n return throwIfError(this.#pullConnectionLoop.send(now));\n }\n\n /**\n * Applies an update from the server to Replicache.\n * Throws an error if cookie does not match. In that case the server thinks\n * this client has a different cookie than it does; the caller should disconnect\n * from the server and re-register, which transmits the cookie the client actually\n * has.\n *\n * @experimental This method is under development and its semantics will change.\n */\n async poke(poke: PokeInternal): Promise<void> {\n await this.#ready;\n // TODO(MP) Previously we created a request ID here and included it with the\n // PullRequest to the server so we could tie events across client and server\n // together. Since the direction is now reversed, creating and adding a request ID\n // here is kind of silly. We should consider creating the request ID\n // on the *server* and passing it down in the poke for inclusion here in the log\n // context\n const {clientID} = this;\n const requestID = newRequestID(clientID);\n const lc = this.#lc\n .withContext('handlePullResponse')\n .withContext('requestID', requestID);\n\n const {pullResponse} = poke;\n\n if (isVersionNotSupportedResponse(pullResponse)) {\n this.#handleVersionNotSupportedResponse(pullResponse);\n return;\n }\n\n if (isClientStateNotFoundResponse(pullResponse)) {\n await this.#clientStateNotFoundOnServer();\n return;\n }\n\n const result = await handlePullResponseV1(\n lc,\n this.memdag,\n deepFreeze(poke.baseCookie),\n pullResponse,\n clientID,\n FormatVersion.Latest,\n );\n\n switch (result.type) {\n case HandlePullResponseResultEnum.Applied:\n await this.maybeEndPull(result.syncHead, requestID);\n break;\n case HandlePullResponseResultEnum.CookieMismatch:\n throw new Error(\n 'unexpected base cookie for poke: ' + JSON.stringify(poke),\n );\n case HandlePullResponseResultEnum.NoOp:\n break;\n }\n }\n\n async beginPull(): Promise<BeginPullResult> {\n if (TESTING) {\n this.onBeginPull();\n }\n await this.#ready;\n const profileID = await this.profileID;\n const {clientID} = this;\n const clientGroupID = await this.#clientGroupIDPromise;\n const {\n result: {beginPullResponse, requestID},\n } = await this.#wrapInReauthRetries(\n async (requestID: string, requestLc: LogContext) => {\n const beginPullResponse = await beginPullV1(\n profileID,\n clientID,\n clientGroupID,\n this.schemaVersion,\n this.puller,\n requestID,\n this.memdag,\n FormatVersion.Latest,\n requestLc,\n );\n return {\n result: {beginPullResponse, requestID},\n httpRequestInfo: beginPullResponse.httpRequestInfo,\n };\n },\n 'pull',\n this.#lc,\n () => this.#changeSyncCounters(0, -1),\n () => this.#changeSyncCounters(0, 1),\n );\n\n const {pullResponse} = beginPullResponse;\n if (isVersionNotSupportedResponse(pullResponse)) {\n this.#handleVersionNotSupportedResponse(pullResponse);\n } else if (isClientStateNotFoundResponse(beginPullResponse.pullResponse)) {\n await this.#clientStateNotFoundOnServer();\n }\n\n const {syncHead, httpRequestInfo} = beginPullResponse;\n return {requestID, syncHead, ok: httpRequestInfo.httpStatusCode === 200};\n }\n\n persist(): Promise<void> {\n // Prevent multiple persist calls from running at the same time.\n const run = this.#persistLock.withLock(async () => {\n const {clientID} = this;\n await this.#ready;\n // After a storage failure, or once persist is stopped, nothing is\n // persisted.\n if (\n this.#closed ||\n this.#storageFailure ||\n this.#persistAbortController.signal.aborted\n ) {\n return;\n }\n try {\n await persistDD31(\n this.#lc,\n clientID,\n this.memdag,\n this.perdag,\n this.#mutatorRegistry,\n () => this.#closed,\n FormatVersion.Latest,\n this.#zero?.getTxData,\n );\n } catch (e) {\n if (e instanceof ClientStateNotFoundError) {\n this.#clientStateNotFoundOnClient(clientID);\n } else if (e instanceof InvalidRefCountError) {\n await this.#handleInvalidRefCount(e);\n // Nothing was persisted and the database is gone. Do not tell this\n // or other instances to refresh from it.\n return;\n } else if (this.#closed) {\n this.#lc.debug?.('Exception persisting during close', e);\n } else {\n const failure = getStorageFailure(e);\n if (failure === undefined) {\n throw e;\n }\n // Nothing was persisted, and nothing will be until the app replaces\n // this instance. Do not tell other instances to refresh.\n this.#handleStorageFailure(failure);\n return;\n }\n }\n\n const clientGroupID = await this.#clientGroupIDPromise;\n assert(clientGroupID, 'Expected clientGroupID to be defined');\n this.#onPersist({clientID, clientGroupID});\n });\n this.#persistInFlight = run.catch(noop);\n return run;\n }\n\n refresh(): Promise<void> {\n const run = this.#refresh();\n this.#refreshInFlight = run.catch(noop);\n return run;\n }\n\n async #refresh(): Promise<void> {\n await this.#ready;\n const {clientID} = this;\n if (\n this.#closed ||\n this.#storageFailure ||\n this.#refreshAbortController.signal.aborted ||\n !this.#enableRefresh()\n ) {\n return;\n }\n let refreshResult: Awaited<ReturnType<typeof refresh>>;\n try {\n refreshResult = await refresh(\n this.#lc,\n this.memdag,\n this.perdag,\n clientID,\n this.#mutatorRegistry,\n this.#subscriptions,\n () => this.closed,\n FormatVersion.Latest,\n this.#zero,\n );\n } catch (e) {\n if (e instanceof ClientStateNotFoundError) {\n this.#clientStateNotFoundOnClient(clientID);\n } else if (e instanceof InvalidRefCountError) {\n await this.#handleInvalidRefCount(e);\n } else if (this.#closed) {\n this.#lc.debug?.('Exception refreshing during close', e);\n } else {\n const failure = getStorageFailure(e);\n if (failure === undefined) {\n throw e;\n }\n this.#handleStorageFailure(failure);\n return;\n }\n }\n if (refreshResult !== undefined) {\n await this.#subscriptions.fire(refreshResult.diffs);\n }\n }\n\n #fireOnClientStateNotFound() {\n this.onClientStateNotFound?.();\n }\n\n #clientStateNotFoundOnClient(clientID: ClientID) {\n this.#lc.error?.(`Client state not found on client, clientID: ${clientID}`);\n this.#fireOnClientStateNotFound();\n }\n\n /**\n * Set once recovery from a corrupt database has started. Every write path\n * into the perdag (open, persist, refresh, heartbeat, GC, ...) can trip on\n * the same corrupt key, so recovery runs once and later reports await it.\n */\n #corruptDatabaseRecovery: Promise<void> | undefined;\n\n /**\n * Handed to the in-memory dag and the background processes, which have no\n * other way to reach this instance when a store read inside them fails.\n * Skipped while closing: a read that fails because the store was closed\n * under it is not a storage failure of the instance.\n */\n readonly #reportStorageFailure = (failure: StorageFailureError): void => {\n if (!this.#closed) {\n this.#handleStorageFailure(failure);\n }\n };\n\n /**\n * A storage failure after the open. Records the first one, stops the\n * store-using background processes, logs it once and tells the app. Later\n * failures of the same instance are the same fault and are not reported\n * again; the scheduled persist and refresh stop asking.\n */\n #handleStorageFailure(failure: StorageFailureError): void {\n if (this.#storageFailure !== undefined) {\n return;\n }\n this.#storageFailure = failure;\n this.#persistAbortController.abort();\n this.#refreshAbortController.abort();\n // warn, not error: a full or failing disk is the device's condition, and\n // it is handled here (retries stop, the app is told once through\n // onStorageFailure), so there is nothing for a developer to fix.\n this.#lc.warn?.(\n `Local store storage failed (${failure.kind}) for ${this.idbName}; persistence is stopped for this instance`,\n failure,\n );\n this.#fireOnStorageFailure(failure);\n }\n\n /**\n * A storage failure during the open: the stores have moved onto memory, so\n * the instance runs on them for the session, as with `kvStore: 'mem'`.\n * Reported on a\n * later microtask: the SQLite stores open in `create`, while the\n * constructor is still running and before the app can attach the callback.\n */\n #onMemFallBack(failure: StorageFailureError): void {\n this.#lc.warn?.(\n `Local store storage failed (${failure.kind}) opening ${this.idbName}; running this instance in memory`,\n failure,\n );\n queueMicrotask(() => this.#fireOnStorageFailure(failure));\n }\n\n /**\n * The app's callback must not be able to stop the recovery around it: in\n * the open path, a throw here would skip the open on memory and leave the\n * instance never ready.\n */\n #fireOnStorageFailure(failure: StorageFailureError): void {\n try {\n this.onStorageFailure?.(failure);\n } catch (e) {\n this.#lc.error?.('onStorageFailure threw', e);\n }\n }\n\n /**\n * Installed on the dag store that writes to our database. The store calls\n * it after the failing transaction has been released, so dropping the\n * database from here does not race with the rollback.\n */\n readonly #onInvalidRefCount = (e: InvalidRefCountError): void => {\n void this.#handleInvalidRefCount(e);\n };\n\n /**\n * The persistent dag store contains an invalid ref count. This means the\n * store is corrupt (due to some unknown bug) and every subsequent write that\n * touches that chunk would fail the same way. There is no way to repair it,\n * so we treat it like the client state was lost and fire\n * `onClientStateNotFound`.\n *\n * Disabling the client group is not enough: the corrupt ref count stays in\n * the underlying kv store and any later write that touches that chunk (for\n * example rewriting the `clients` chunk when a new client starts) would hit\n * it again. Instead we drop the whole database so that the reload starts\n * from a fresh store. Pending local mutations in this database are lost.\n *\n * This is expected to be exceedingly rare. Other instances sharing the\n * database are not told: they simply hit the same corrupt key (or, once\n * this instance drops the database, a generic storage error) on their own\n * next write and recover the same way then. That's an acceptable delay for\n * something we don't expect to ever happen.\n */\n #handleInvalidRefCount(e: InvalidRefCountError): Promise<void> {\n if (\n this.#storageFailure !== undefined &&\n this.#storageFailure.kind !== 'full'\n ) {\n // A store that cannot complete its reads and writes produces invalid\n // ref counts without the data being corrupt. Dropping the database here\n // would destroy an intact replica and rebuild onto the same failing\n // storage, which is the loop `onStorageFailure` exists to stop.\n //\n // A FULL disk is the exception, and keeps the drop: a torn write on a\n // full disk is a real corruption, and deleting the database is also the\n // one thing that frees the space the device needs.\n this.#lc.warn?.(\n `Invalid ref count while the local store is failing (${this.#storageFailure.kind}); not dropping database ${this.idbName}`,\n e,\n );\n return promiseVoid;\n }\n if (this.#corruptDatabaseRecovery === undefined) {\n this.#lc.error?.(\n `Client state is corrupt on client, clientID: ${this.clientID}. Dropping database ${this.idbName}`,\n e,\n );\n this.#corruptDatabaseRecovery =\n this.#dropDatabaseAndFireOnClientStateNotFound();\n }\n return this.#corruptDatabaseRecovery;\n }\n\n /**\n * Drops our database, then fires `onClientStateNotFound` so the app can\n * recover, whether or not the drop itself succeeded.\n *\n * Uses its own handle on the databases registry rather than `#idbDatabases`\n * so it works even when `close()` is already closing this instance.\n */\n async #dropDatabaseAndFireOnClientStateNotFound(): Promise<void> {\n const {idbName, clientID} = this;\n let idbDatabases: IDBDatabasesStore | undefined;\n try {\n idbDatabases = new IDBDatabasesStore(this.#kvStoreProvider.create);\n await dropDatabaseInternal(\n idbName,\n idbDatabases,\n this.#kvStoreProvider.drop,\n );\n } catch (dropError) {\n this.#lc.error?.(\n `Failed to drop database ${idbName}, clientID: ${clientID}`,\n dropError,\n );\n }\n try {\n await idbDatabases?.close();\n } catch (closeError) {\n // Closing the registry handle is best effort. The callback below must\n // fire regardless, and the drop outcome was already logged.\n this.#lc.debug?.(\n `Failed to close the databases registry after dropping ${idbName}, clientID: ${clientID}`,\n closeError,\n );\n }\n this.#fireOnClientStateNotFound();\n }\n\n async #clientStateNotFoundOnServer() {\n const clientGroupID = await this.#clientGroupIDPromise;\n this.#lc.error?.(\n `Client state not found on server, clientGroupID: ${clientGroupID}`,\n );\n await this.disableClientGroup();\n this.#fireOnClientStateNotFound();\n }\n\n /**\n * Stops every write to the local store, for an instance whose database is\n * about to be dropped from under it: the store-writing background\n * processes (heartbeat, GC, collection, mutation recovery) are aborted, a\n * `persist()` already in flight is waited for, and every later `persist()`\n * — scheduled or explicit — is a no-op. Mutations keep running against the in-memory\n * dag until the app replaces the instance (see `onClientStateNotFound`).\n *\n * Use together with {@link stopRefresh} before dropping the database, so\n * the drop's own footprint — `database is closed` from the next scheduled\n * persist and the background processes — is not logged as errors against a\n * store that was deleted on purpose.\n */\n async stopPersist(): Promise<void> {\n this.#persistAbortController.abort();\n await this.#persistInFlight;\n }\n\n /**\n * Stops every refresh from the local store, for an instance whose database\n * is about to be dropped from under it: the store-reading background\n * process (the new-client channel) is aborted, a `refresh()` already in\n * flight is waited for, and every later `refresh()` / `runRefresh()` —\n * scheduled or explicit — is a no-op. Queries keep running against the\n * in-memory dag until the app replaces the instance (see\n * `onClientStateNotFound`).\n *\n * Use together with {@link stopPersist} before dropping the database, so\n * the run loop's refresh after a connect error does not run into the\n * dropped store and log `database is closed` as an error.\n */\n async stopRefresh(): Promise<void> {\n this.#refreshAbortController.abort();\n await this.#refreshInFlight;\n }\n\n async disableClientGroup(): Promise<void> {\n const clientGroupID = await this.#clientGroupIDPromise;\n assert(clientGroupID, 'Expected clientGroupID to be defined');\n this.isClientGroupDisabled = true;\n await withWrite(this.perdag, dagWrite =>\n disableClientGroup(clientGroupID, dagWrite),\n );\n }\n\n #fireOnUpdateNeeded(reason: UpdateNeededReason) {\n this.#lc.debug?.(`Update needed, reason: ${reason}`);\n this.onUpdateNeeded?.(reason);\n }\n\n async #schedulePersist(): Promise<void> {\n if (\n !this.#enableScheduledPersist ||\n this.#storageFailure ||\n this.#persistAbortController.signal.aborted\n ) {\n return;\n }\n await this.#schedule('persist', this.#persistScheduler);\n }\n\n async #handlePersist(persistInfo: PersistInfo): Promise<void> {\n this.#lc.debug?.('Handling persist', persistInfo);\n const clientGroupID = await this.#clientGroupIDPromise;\n if (persistInfo.clientGroupID === clientGroupID) {\n void this.#scheduleRefresh();\n }\n }\n\n async #scheduleRefresh(): Promise<void> {\n if (\n !this.#enableScheduledRefresh ||\n this.#storageFailure ||\n this.#refreshAbortController.signal.aborted\n ) {\n return;\n }\n await this.#schedule('refresh from storage', this.#refreshScheduler);\n }\n\n async #schedule(name: string, scheduler: ProcessScheduler): Promise<void> {\n try {\n await scheduler.schedule();\n } catch (e) {\n if (e instanceof AbortError) {\n this.#lc.debug?.(`Scheduled ${name} did not complete before close.`);\n } else {\n this.#lc.error?.(`Error during ${name}`, e);\n }\n }\n }\n\n /**\n * Runs a refresh as soon as possible through the refresh scheduler.\n */\n runRefresh(): Promise<void> {\n return this.#refreshScheduler.run();\n }\n\n #changeSyncCounters(pushDelta: 0, pullDelta: 1 | -1): void;\n #changeSyncCounters(pushDelta: 1 | -1, pullDelta: 0): void;\n #changeSyncCounters(pushDelta: number, pullDelta: number): void {\n this.#pushCounter += pushDelta;\n this.#pullCounter += pullDelta;\n const delta = pushDelta + pullDelta;\n const counter = this.#pushCounter + this.#pullCounter;\n if ((delta === 1 && counter === 1) || counter === 0) {\n const syncing = counter > 0;\n // Run in a new microtask.\n void Promise.resolve().then(() => this.onSync?.(syncing));\n }\n }\n\n /**\n * Subscribe to the result of a {@link query}. The `body` function is\n * evaluated once and its results are returned via `onData`.\n *\n * Thereafter, each time the the result of `body` changes, `onData` is fired\n * again with the new result.\n *\n * `subscribe()` goes to significant effort to avoid extraneous work\n * re-evaluating subscriptions:\n *\n * 1. subscribe tracks the keys that `body` accesses each time it runs. `body`\n * is only re-evaluated when those keys change.\n * 2. subscribe only re-fires `onData` in the case that a result changes by\n * way of the `isEqual` option which defaults to doing a deep JSON value\n * equality check.\n *\n * Because of (1), `body` must be a pure function of the data in Replicache.\n * `body` must not access anything other than the `tx` parameter passed to it.\n *\n * Although subscribe is as efficient as it can be, it is somewhat constrained\n * by the goal of returning an arbitrary computation of the cache. For even\n * better performance (but worse dx), see {@link experimentalWatch}.\n *\n * If an error occurs in the `body` the `onError` function is called if\n * present. Otherwise, the error is logged at log level 'error'.\n *\n * To cancel the subscription, call the returned function.\n *\n * @param body The function to evaluate to get the value to pass into\n * `onData`.\n * @param options Options is either a function or an object. If it is a\n * function it is equivalent to passing it as the `onData` property of an\n * object.\n */\n subscribe<R>(\n body: (tx: ReadTransaction) => Promise<R>,\n options: SubscribeOptions<R> | ((result: R) => void),\n ): () => void {\n if (typeof options === 'function') {\n options = {onData: options};\n }\n\n const {onData, onError, onDone, isEqual} = options;\n return this.#subscriptions.add(\n new SubscriptionImpl(body, onData, onError, onDone, isEqual),\n );\n }\n\n /**\n * Watches Replicache for changes.\n *\n * The `callback` gets called whenever the underlying data changes and the\n * `key` changes matches the `prefix` of {@link ExperimentalWatchIndexOptions} or\n * {@link ExperimentalWatchNoIndexOptions} if present. If a change\n * occurs to the data but the change does not impact the key space the\n * callback is not called. In other words, the callback is never called with\n * an empty diff.\n *\n * This gets called after commit (a mutation or a rebase).\n *\n * @experimental This method is under development and its semantics will\n * change.\n */\n experimentalWatch(callback: WatchNoIndexCallback): () => void;\n experimentalWatch<Options extends WatchOptions>(\n callback: WatchCallbackForOptions<Options>,\n options?: Options,\n ): () => void;\n experimentalWatch<Options extends WatchOptions>(\n callback: WatchCallbackForOptions<Options>,\n options?: Options,\n ): () => void {\n return this.#subscriptions.add(\n new WatchSubscription(callback as WatchCallback, options),\n );\n }\n\n /**\n * Query is used for read transactions. It is recommended to use transactions\n * to ensure you get a consistent view across multiple calls to `get`, `has`\n * and `scan`.\n */\n query<R>(body: (tx: ReadTransaction) => Promise<R> | R): Promise<R> {\n return this.#queryInternal(body);\n }\n\n get cookie(): Promise<Cookie> {\n return this.#ready.then(() =>\n withRead(this.memdag, async dagRead => {\n const mainHeadHash = await dagRead.getHead(DEFAULT_HEAD_NAME);\n if (!mainHeadHash) {\n throw new Error('Internal no main head found');\n }\n const baseSnapshot = await baseSnapshotFromHash(mainHeadHash, dagRead);\n const baseSnapshotMeta = baseSnapshot.meta;\n const cookie = baseSnapshotMeta.cookieJSON;\n assertCookie(cookie);\n return cookie;\n }),\n );\n }\n\n #queryInternal: QueryInternal = async body => {\n await this.#ready;\n const {clientID} = this;\n return withRead(this.memdag, async dagRead => {\n try {\n const dbRead = await readFromDefaultHead(dagRead, FormatVersion.Latest);\n const tx = new ReadTransactionImpl(clientID, dbRead, this.#lc);\n return await body(tx);\n } catch (ex) {\n throw await this.#convertToClientStateNotFoundError(ex);\n }\n });\n };\n\n #register<Return extends ReadonlyJSONValue | void, Args extends JSONValue>(\n name: string,\n mutatorImpl: (tx: WriteTransaction, args?: Args) => MaybePromise<Return>,\n ): (\n args?: Args,\n ) => Promise<Return> | {client: Promise<Return>; server: Promise<unknown>} {\n this.#mutatorRegistry[name] = mutatorImpl as (\n tx: WriteTransaction,\n args: JSONValue | undefined,\n ) => Promise<void | JSONValue>;\n\n return (\n args?: Args,\n ):\n | Promise<Return>\n | {client: Promise<Return>; server: Promise<unknown>} => {\n // DO NOT track CRUD mutations as they do not receive responses from\n // the server.\n const trackingData =\n name === '_zero_crud' ? undefined : this.#zero?.trackMutation();\n\n const result = this.#mutate(\n trackingData,\n name,\n mutatorImpl,\n args,\n performance.now(),\n );\n\n if (trackingData) {\n return {\n client: result,\n server: trackingData.serverPromise,\n };\n }\n\n return result;\n };\n }\n\n #registerMutators<\n M extends {\n [key: string]: (\n tx: WriteTransaction,\n args?: ReadonlyJSONValue,\n ) => MutatorReturn;\n },\n >(regs: M): MakeMutators<M> {\n type Mut = MakeMutators<M>;\n const rv: Partial<Mut> = Object.create(null);\n for (const k in regs) {\n rv[k] = this.#register(k, regs[k]) as MakeMutator<M[typeof k]>;\n }\n return rv as Mut;\n }\n\n async #mutate<\n R extends ReadonlyJSONValue | void,\n A extends ReadonlyJSONValue,\n >(\n trackingData: MutationTrackingData | undefined,\n name: string,\n mutatorImpl: (tx: WriteTransaction, args?: A) => MaybePromise<R>,\n args: A | undefined,\n timestamp: number,\n ): Promise<R> {\n const frozenArgs = deepFreeze(args ?? null);\n\n // Ensure that we run initial pending subscribe functions before starting a\n // write transaction.\n if (this.#subscriptions.hasPendingSubscriptionRuns) {\n await Promise.resolve();\n }\n\n await this.#ready;\n const {clientID} = this;\n return withWriteNoImplicitCommit(this.memdag, async dagWrite => {\n try {\n let result: R;\n let newHead: Hash;\n let diffs: DiffsMap;\n let headHash: Hash;\n try {\n headHash = await mustGetHeadHash(DEFAULT_HEAD_NAME, dagWrite);\n const originalHash = null;\n\n const dbWrite = await newWriteLocal(\n headHash,\n name,\n frozenArgs,\n originalHash,\n dagWrite,\n timestamp,\n clientID,\n FormatVersion.Latest,\n );\n\n const mutationID = await dbWrite.getMutationID();\n const tx = new WriteTransactionImpl(\n clientID,\n mutationID,\n 'initial',\n await this.#zero?.getTxData(headHash, {\n openLazyRead: dagWrite,\n }),\n dbWrite,\n this.#lc,\n );\n\n if (trackingData) {\n this.#zero?.mutationIDAssigned(\n trackingData.ephemeralID,\n mutationID,\n );\n }\n\n result = await mutatorImpl(tx, args);\n\n throwIfClosed(dbWrite);\n const lastMutationID = await dbWrite.getMutationID();\n [newHead, diffs] = await dbWrite.commitWithDiffs(\n DEFAULT_HEAD_NAME,\n this.#subscriptions,\n );\n\n // Update this after the commit in case the commit fails.\n this.lastMutationID = lastMutationID;\n } catch (e) {\n // If we threw before we could persist the mutation\n // then we need to reject the mutation.\n if (trackingData) {\n this.#zero?.rejectMutation(trackingData.ephemeralID, e);\n }\n throw e;\n }\n\n this.#zero?.advance(headHash, newHead, diffs.get('') ?? []);\n\n // Send is not supposed to reject\n this.#pushConnectionLoop.send(false).catch(() => void 0);\n await this.#subscriptions.fire(diffs);\n void this.#schedulePersist();\n return result;\n } catch (ex) {\n throw await this.#convertToClientStateNotFoundError(ex);\n }\n });\n }\n\n /**\n * In the case we get a ChunkNotFoundError we check if the client got garbage\n * collected and if so change the error to a ClientStateNotFoundError instead\n */\n async #convertToClientStateNotFoundError(ex: unknown): Promise<unknown> {\n if (\n ex instanceof ChunkNotFoundError &&\n (await this.#checkForClientStateNotFoundAndCallHandler())\n ) {\n return new ClientStateNotFoundError(this.clientID);\n }\n\n return ex;\n }\n\n recoverMutations(): Promise<boolean> | void {\n // Also reached on every offline->online change, which does not go\n // through the persist signal.\n if (this.#persistAbortController.signal.aborted) {\n return promiseFalse;\n }\n if (!process.env.DISABLE_MUTATION_RECOVERY) {\n // oxlint-disable-next-line no-non-null-assertion\n const result = this.#mutationRecovery!.recoverMutations(\n this.#ready,\n this.perdag,\n this.#idbDatabase,\n this.#idbDatabases,\n this.#kvStoreProvider.create,\n );\n if (TESTING) {\n void this.onRecoverMutations(result);\n }\n return result;\n }\n }\n\n /**\n * List of pending mutations. The order of this is from oldest to newest.\n *\n * Gives a list of local mutations that have `mutationID` >\n * `syncHead.mutationID` that exists on the main client group.\n *\n * @experimental This method is experimental and may change in the future.\n */\n experimentalPendingMutations(): Promise<readonly PendingMutation[]> {\n return withRead(this.memdag, pendingMutationsForAPI);\n }\n}\n\n// This map is used to keep track of closing instances of Replicache. When an\n// instance is opening we wait for any currently closing instances.\nconst closingInstances: Map<string, Promise<unknown>> = new Map();\n\nasync function throwIfError(p: Promise<undefined | {error: unknown}>) {\n const res = await p;\n if (res) {\n throw res.error;\n }\n}\n\nfunction reload(): void {\n if (typeof location !== 'undefined') {\n location.reload();\n }\n}\n\nfunction validateOptions<MD extends MutatorDefs>(\n options: ReplicacheOptions<MD>,\n): void {\n const {name, clientMaxAgeMs} = options;\n if (typeof name !== 'string' || !name) {\n throw new TypeError('name is required and must be non-empty');\n }\n\n if (clientMaxAgeMs !== undefined) {\n const min = Math.max(GC_INTERVAL, HEARTBEAT_INTERVAL);\n if (typeof clientMaxAgeMs !== 'number' || clientMaxAgeMs <= min) {\n throw new TypeError(\n `clientAgeMaxMs must be a number larger than ${min}ms`,\n );\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -236,6 +236,15 @@ export interface ZeroTxData {
|
|
|
236
236
|
ivmSources: unknown;
|
|
237
237
|
token: string | undefined;
|
|
238
238
|
context: unknown;
|
|
239
|
+
/**
|
|
240
|
+
* A cheap copy, used for one mutation's speculative writes.
|
|
241
|
+
*
|
|
242
|
+
* Replaying a mutation writes to two places: Replicache's `Write` and the
|
|
243
|
+
* IVM sources held here. If the mutator throws, the `Write` is discarded,
|
|
244
|
+
* and the fork lets the IVM writes be discarded with it. The caller adopts
|
|
245
|
+
* the fork when the mutator succeeds and drops it when it throws.
|
|
246
|
+
*/
|
|
247
|
+
fork(): ZeroTxData;
|
|
239
248
|
}
|
|
240
249
|
export type ZeroReadOptions = {
|
|
241
250
|
openLazyRead?: Read | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replicache-options.d.ts","sourceRoot":"","sources":["../../../../replicache/src/replicache-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAE,OAAO,EAAC,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAC,IAAI,EAAE,KAAK,EAAC,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAC,WAAW,EAAE,cAAc,EAAC,MAAM,YAAY,CAAC;AAE5D;;GAEG;AAEH,MAAM,WAAW,iBAAiB,CAAC,EAAE,SAAS,WAAW;IACvD;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE1B;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B;;;;;;;;;;;;;;;;;;OAkBG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEnC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAEzC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE/B;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAEhC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IAEjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiEG;IACH,QAAQ,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC;IAE1B;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IAE5C;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE5B;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE5B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEhC;;OAEG;IACH,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,aAAa,GAAG,SAAS,CAAC;IAEpD;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAEhD;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"replicache-options.d.ts","sourceRoot":"","sources":["../../../../replicache/src/replicache-options.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A fault in the local kv store's storage layer, as opposed to in the data it
|
|
3
|
+
* holds.
|
|
4
|
+
*
|
|
5
|
+
* - `full`: the device is out of space (SQLite's `SQLITE_FULL`, WebKit's
|
|
6
|
+
* IndexedDB reporting `database or disk is full`). Every write fails until
|
|
7
|
+
* the user frees space.
|
|
8
|
+
* - `cannot-open`: the database cannot be opened (SQLite's `SQLITE_CANTOPEN`:
|
|
9
|
+
* a missing directory, a permissions or file-protection state, a filesystem
|
|
10
|
+
* that has gone away; or `indexedDB.open` failing).
|
|
11
|
+
* - `io-error`: a read or write to the file failed (SQLite's `SQLITE_IOERR`).
|
|
12
|
+
*
|
|
13
|
+
* None of them is by itself evidence that the data is corrupt, and dropping
|
|
14
|
+
* the database and rebuilding does not clear `cannot-open` or `io-error`: the
|
|
15
|
+
* rebuild opens the same failing storage. A write torn by a `full` disk can
|
|
16
|
+
* corrupt the data, though, and dropping the database is also what frees the
|
|
17
|
+
* space, so an invalid ref count under `full` still drops it.
|
|
18
|
+
*/
|
|
19
|
+
export type StorageFailureKind = 'full' | 'cannot-open' | 'io-error';
|
|
20
|
+
/**
|
|
21
|
+
* Thrown by a kv store when its storage has failed rather than its data. The
|
|
22
|
+
* SQLite stores and the IndexedDB store throw it, with the driver's or the
|
|
23
|
+
* browser's error as `cause`; a custom `StoreProvider` can throw it too to get
|
|
24
|
+
* the same handling (see `onStorageFailure`).
|
|
25
|
+
*/
|
|
26
|
+
export declare class StorageFailureError extends Error {
|
|
27
|
+
name: string;
|
|
28
|
+
readonly kind: StorageFailureKind;
|
|
29
|
+
constructor(kind: StorageFailureKind, message: string, options?: ErrorOptions);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The {@link StorageFailureError} in `error` or its `cause` chain. A failed
|
|
33
|
+
* transaction whose release also failed is reported wrapped, with the
|
|
34
|
+
* operation's error as `cause`.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getStorageFailure(error: unknown): StorageFailureError | undefined;
|
|
37
|
+
//# sourceMappingURL=storage-failure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-failure.d.ts","sourceRoot":"","sources":["../../../../replicache/src/storage-failure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,aAAa,GAAG,UAAU,CAAC;AAErE;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,IAAI,SAAyB;IAC7B,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAElC,YACE,IAAI,EAAE,kBAAkB,EACxB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,YAAY,EAIvB;CACF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,GACb,mBAAmB,GAAG,SAAS,CASjC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//#region ../replicache/src/storage-failure.ts
|
|
2
|
+
/**
|
|
3
|
+
* Thrown by a kv store when its storage has failed rather than its data. The
|
|
4
|
+
* SQLite stores and the IndexedDB store throw it, with the driver's or the
|
|
5
|
+
* browser's error as `cause`; a custom `StoreProvider` can throw it too to get
|
|
6
|
+
* the same handling (see `onStorageFailure`).
|
|
7
|
+
*/
|
|
8
|
+
var StorageFailureError = class extends Error {
|
|
9
|
+
name = "StorageFailureError";
|
|
10
|
+
kind;
|
|
11
|
+
constructor(kind, message, options) {
|
|
12
|
+
super(message, options);
|
|
13
|
+
this.kind = kind;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* The {@link StorageFailureError} in `error` or its `cause` chain. A failed
|
|
18
|
+
* transaction whose release also failed is reported wrapped, with the
|
|
19
|
+
* operation's error as `cause`.
|
|
20
|
+
*/
|
|
21
|
+
function getStorageFailure(error) {
|
|
22
|
+
let current = error;
|
|
23
|
+
while (current instanceof Error) {
|
|
24
|
+
if (current instanceof StorageFailureError) return current;
|
|
25
|
+
current = current.cause;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
export { StorageFailureError, getStorageFailure };
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=storage-failure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-failure.js","names":[],"sources":["../../../../replicache/src/storage-failure.ts"],"sourcesContent":["/**\n * A fault in the local kv store's storage layer, as opposed to in the data it\n * holds.\n *\n * - `full`: the device is out of space (SQLite's `SQLITE_FULL`, WebKit's\n * IndexedDB reporting `database or disk is full`). Every write fails until\n * the user frees space.\n * - `cannot-open`: the database cannot be opened (SQLite's `SQLITE_CANTOPEN`:\n * a missing directory, a permissions or file-protection state, a filesystem\n * that has gone away; or `indexedDB.open` failing).\n * - `io-error`: a read or write to the file failed (SQLite's `SQLITE_IOERR`).\n *\n * None of them is by itself evidence that the data is corrupt, and dropping\n * the database and rebuilding does not clear `cannot-open` or `io-error`: the\n * rebuild opens the same failing storage. A write torn by a `full` disk can\n * corrupt the data, though, and dropping the database is also what frees the\n * space, so an invalid ref count under `full` still drops it.\n */\nexport type StorageFailureKind = 'full' | 'cannot-open' | 'io-error';\n\n/**\n * Thrown by a kv store when its storage has failed rather than its data. The\n * SQLite stores and the IndexedDB store throw it, with the driver's or the\n * browser's error as `cause`; a custom `StoreProvider` can throw it too to get\n * the same handling (see `onStorageFailure`).\n */\nexport class StorageFailureError extends Error {\n name = 'StorageFailureError';\n readonly kind: StorageFailureKind;\n\n constructor(\n kind: StorageFailureKind,\n message: string,\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.kind = kind;\n }\n}\n\n/**\n * The {@link StorageFailureError} in `error` or its `cause` chain. A failed\n * transaction whose release also failed is reported wrapped, with the\n * operation's error as `cause`.\n */\nexport function getStorageFailure(\n error: unknown,\n): StorageFailureError | undefined {\n let current = error;\n while (current instanceof Error) {\n if (current instanceof StorageFailureError) {\n return current;\n }\n current = current.cause;\n }\n return undefined;\n}\n"],"mappings":";;;;;;;AA0BA,IAAa,sBAAb,cAAyC,MAAM;CAC7C,OAAO;CACP;CAEA,YACE,MACA,SACA,SACA;EACA,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CACd;AACF;;;;;;AAOA,SAAgB,kBACd,OACiC;CACjC,IAAI,UAAU;CACd,OAAO,mBAAmB,OAAO;EAC/B,IAAI,mBAAmB,qBACrB,OAAO;EAET,UAAU,QAAQ;CACpB;AAEF"}
|
|
@@ -6,5 +6,10 @@ export declare function defined<T>(arr: (T | undefined)[]): T[];
|
|
|
6
6
|
export declare function areEqual<T>(arr1: readonly T[], arr2: readonly T[]): boolean;
|
|
7
7
|
export declare function zip<T1, T2>(a1: readonly T1[], a2: readonly T2[]): [T1, T2][];
|
|
8
8
|
export declare function last<T>(arr: T[]): T | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Creates an empty array. Pass this to `getOrInsertComputed` instead of an
|
|
11
|
+
* inline `() => []` so that a hit does not allocate a closure.
|
|
12
|
+
*/
|
|
13
|
+
export declare const newArray: <T>() => T[];
|
|
9
14
|
export declare function groupBy<T, K>(arr: readonly T[], keyFn: (el: T) => K): Map<K, T[]>;
|
|
10
15
|
//# sourceMappingURL=arrays.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrays.d.ts","sourceRoot":"","sources":["../../../../shared/src/arrays.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"arrays.d.ts","sourceRoot":"","sources":["../../../../shared/src/arrays.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CActD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,GAAG,OAAO,CAE3E;AAED,wBAAgB,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAO5E;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,SAAS,CAE/C;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,OAAK,CAAC,EAAQ,CAAC;AAEzC,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,EAC1B,GAAG,EAAE,SAAS,CAAC,EAAE,EACjB,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAClB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAOb"}
|
package/out/shared/src/arrays.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { assert } from "./asserts.js";
|
|
2
|
+
import { getOrInsertComputed } from "./map.js";
|
|
2
3
|
//#region ../shared/src/arrays.ts
|
|
3
4
|
function areEqual(arr1, arr2) {
|
|
4
5
|
return arr1.length === arr2.length && arr1.every((e, i) => e === arr2[i]);
|
|
@@ -12,20 +13,17 @@ function zip(a1, a2) {
|
|
|
12
13
|
function last(arr) {
|
|
13
14
|
return arr.at(-1);
|
|
14
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Creates an empty array. Pass this to `getOrInsertComputed` instead of an
|
|
18
|
+
* inline `() => []` so that a hit does not allocate a closure.
|
|
19
|
+
*/
|
|
20
|
+
var newArray = () => [];
|
|
15
21
|
function groupBy(arr, keyFn) {
|
|
16
22
|
const groups = /* @__PURE__ */ new Map();
|
|
17
|
-
for (const el of arr)
|
|
18
|
-
const key = keyFn(el);
|
|
19
|
-
let group = groups.get(key);
|
|
20
|
-
if (group === void 0) {
|
|
21
|
-
group = [];
|
|
22
|
-
groups.set(key, group);
|
|
23
|
-
}
|
|
24
|
-
group.push(el);
|
|
25
|
-
}
|
|
23
|
+
for (const el of arr) getOrInsertComputed(groups, keyFn(el), newArray).push(el);
|
|
26
24
|
return groups;
|
|
27
25
|
}
|
|
28
26
|
//#endregion
|
|
29
|
-
export { areEqual, groupBy, last, zip };
|
|
27
|
+
export { areEqual, groupBy, last, newArray, zip };
|
|
30
28
|
|
|
31
29
|
//# sourceMappingURL=arrays.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrays.js","names":[],"sources":["../../../../shared/src/arrays.ts"],"sourcesContent":["import {assert} from './asserts.ts';\n\n/**\n * Returns `arr` as is if none of the elements are `undefined`.\n * Otherwise returns a new array with only defined elements in `arr`.\n */\nexport function defined<T>(arr: (T | undefined)[]): T[] {\n // avoid an array copy if possible\n let i = arr.findIndex(x => x === undefined);\n if (i < 0) {\n return arr as T[];\n }\n const defined: T[] = arr.slice(0, i) as T[];\n for (i++; i < arr.length; i++) {\n const x = arr[i];\n if (x !== undefined) {\n defined.push(x);\n }\n }\n return defined;\n}\n\nexport function areEqual<T>(arr1: readonly T[], arr2: readonly T[]): boolean {\n return arr1.length === arr2.length && arr1.every((e, i) => e === arr2[i]);\n}\n\nexport function zip<T1, T2>(a1: readonly T1[], a2: readonly T2[]): [T1, T2][] {\n assert(a1.length === a2.length, 'zip: arrays must have equal length');\n const result: [T1, T2][] = [];\n for (let i = 0; i < a1.length; i++) {\n result.push([a1[i], a2[i]]);\n }\n return result;\n}\n\nexport function last<T>(arr: T[]): T | undefined {\n return arr.at(-1);\n}\n\nexport function groupBy<T, K>(\n arr: readonly T[],\n keyFn: (el: T) => K,\n): Map<K, T[]> {\n const groups = new Map<K, T[]>();\n for (const el of arr) {\n const key = keyFn(el);\n
|
|
1
|
+
{"version":3,"file":"arrays.js","names":[],"sources":["../../../../shared/src/arrays.ts"],"sourcesContent":["import {assert} from './asserts.ts';\nimport {getOrInsertComputed} from './map.ts';\n\n/**\n * Returns `arr` as is if none of the elements are `undefined`.\n * Otherwise returns a new array with only defined elements in `arr`.\n */\nexport function defined<T>(arr: (T | undefined)[]): T[] {\n // avoid an array copy if possible\n let i = arr.findIndex(x => x === undefined);\n if (i < 0) {\n return arr as T[];\n }\n const defined: T[] = arr.slice(0, i) as T[];\n for (i++; i < arr.length; i++) {\n const x = arr[i];\n if (x !== undefined) {\n defined.push(x);\n }\n }\n return defined;\n}\n\nexport function areEqual<T>(arr1: readonly T[], arr2: readonly T[]): boolean {\n return arr1.length === arr2.length && arr1.every((e, i) => e === arr2[i]);\n}\n\nexport function zip<T1, T2>(a1: readonly T1[], a2: readonly T2[]): [T1, T2][] {\n assert(a1.length === a2.length, 'zip: arrays must have equal length');\n const result: [T1, T2][] = [];\n for (let i = 0; i < a1.length; i++) {\n result.push([a1[i], a2[i]]);\n }\n return result;\n}\n\nexport function last<T>(arr: T[]): T | undefined {\n return arr.at(-1);\n}\n\n/**\n * Creates an empty array. Pass this to `getOrInsertComputed` instead of an\n * inline `() => []` so that a hit does not allocate a closure.\n */\nexport const newArray = <T>(): T[] => [];\n\nexport function groupBy<T, K>(\n arr: readonly T[],\n keyFn: (el: T) => K,\n): Map<K, T[]> {\n const groups = new Map<K, T[]>();\n for (const el of arr) {\n const key = keyFn(el);\n getOrInsertComputed(groups, key, newArray).push(el);\n }\n return groups;\n}\n"],"mappings":";;;AAuBA,SAAgB,SAAY,MAAoB,MAA6B;CAC3E,OAAO,KAAK,WAAW,KAAK,UAAU,KAAK,OAAO,GAAG,MAAM,MAAM,KAAK,EAAE;AAC1E;AAEA,SAAgB,IAAY,IAAmB,IAA+B;CAC5E,OAAO,GAAG,WAAW,GAAG,QAAQ,oCAAoC;CACpE,MAAM,SAAqB,CAAC;CAC5B,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,QAAQ,KAC7B,OAAO,KAAK,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;CAE5B,OAAO;AACT;AAEA,SAAgB,KAAQ,KAAyB;CAC/C,OAAO,IAAI,GAAG,EAAE;AAClB;;;;;AAMA,IAAa,iBAAyB,CAAC;AAEvC,SAAgB,QACd,KACA,OACa;CACb,MAAM,yBAAS,IAAI,IAAY;CAC/B,KAAK,MAAM,MAAM,KAEf,oBAAoB,QADR,MAAM,EACU,GAAK,QAAQ,EAAE,KAAK,EAAE;CAEpD,OAAO;AACT"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Encodes `bytes` as unpadded base64url. */
|
|
2
|
+
export declare function toBase64url(bytes: Uint8Array): string;
|
|
3
|
+
/**
|
|
4
|
+
* Decodes base64url, padded or not.
|
|
5
|
+
*
|
|
6
|
+
* @throws SyntaxError if `encoded` is not base64url, including when it has
|
|
7
|
+
* whitespace, which the standard and atob skip. atob doesn't reject
|
|
8
|
+
* everything the standard rejects, so this checks first.
|
|
9
|
+
*/
|
|
10
|
+
export declare function fromBase64url(encoded: string): Uint8Array;
|
|
11
|
+
/** @visibleForTesting */
|
|
12
|
+
export declare function toBase64urlWithBtoa(bytes: Uint8Array): string;
|
|
13
|
+
/**
|
|
14
|
+
* Decodes base64url that {@link fromBase64url} has checked.
|
|
15
|
+
*
|
|
16
|
+
* @visibleForTesting
|
|
17
|
+
*/
|
|
18
|
+
export declare function fromBase64urlWithAtob(s: string): Uint8Array;
|
|
19
|
+
//# sourceMappingURL=base64.d.ts.map
|