@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,4 +1,6 @@
|
|
|
1
1
|
import { assert, unreachable } from "../../../../shared/src/asserts.js";
|
|
2
|
+
import { getOrInsertComputed } from "../../../../shared/src/map.js";
|
|
3
|
+
import { newArray } from "../../../../shared/src/arrays.js";
|
|
2
4
|
import { must } from "../../../../shared/src/must.js";
|
|
3
5
|
import { h64 } from "../../../../shared/src/hash.js";
|
|
4
6
|
import { Internal, InvalidConnectionRequest, InvalidConnectionRequestBaseCookie, Rehome } from "../../../../zero-protocol/src/error-kind-enum.js";
|
|
@@ -10,23 +12,27 @@ import { manualSpan, startAsyncSpan, startSpan } from "../../../../otel/src/span
|
|
|
10
12
|
import { ZERO_VERSION_COLUMN_NAME } from "../replicator/schema/constants.js";
|
|
11
13
|
import { transformAndHashQuery } from "../../auth/read-authorizer.js";
|
|
12
14
|
import { randInt } from "../../../../shared/src/rand.js";
|
|
13
|
-
import {
|
|
15
|
+
import { LogThrottle } from "../../observability/log-throttle.js";
|
|
16
|
+
import { getOrCreateCounter, getOrCreateLatencyHistogram, getOrCreateNativeHistogram, getOrCreateUpDownCounter, getOrCreateValueHistogram } from "../../observability/metrics.js";
|
|
14
17
|
import { rowIDString } from "../../types/row-key.js";
|
|
15
18
|
import "../replicator/schema/replication-state.js";
|
|
16
|
-
import {
|
|
19
|
+
import { planWarningMessage } from "./plan-warnings.js";
|
|
20
|
+
import { queryShape } from "./query-shape.js";
|
|
17
21
|
import { ResetPipelinesSignal } from "./snapshotter.js";
|
|
18
|
-
import "./pipeline-driver.js";
|
|
19
22
|
import { Subscription } from "../../types/subscription.js";
|
|
20
23
|
import { CustomKeyMap } from "../../../../shared/src/custom-key-map.js";
|
|
21
24
|
import { ttlClockAsNumber, ttlClockFromNumber } from "./ttl-clock.js";
|
|
22
25
|
import { EMPTY_CVR_VERSION, cmpVersions, versionFromString, versionString, versionToCookie } from "./schema/types.js";
|
|
23
26
|
import { ProtocolErrorWithLevel, getLogLevel, wrapWithProtocolError } from "../../types/error-with-level.js";
|
|
24
27
|
import { isAuthErrorBody } from "../../auth/auth.js";
|
|
28
|
+
import { AdvancementMetrics } from "./advancement-metrics.js";
|
|
25
29
|
import { ClientHandler, startPoke } from "./client-handler.js";
|
|
26
30
|
import { tracer } from "./tracer.js";
|
|
27
31
|
import { CVRStore, ClientNotFoundError } from "./cvr-store.js";
|
|
28
|
-
import { CVRConfigDrivenUpdater, CVRQueryDrivenUpdater, nextEvictionTime } from "./cvr.js";
|
|
32
|
+
import { CVRConfigDrivenUpdater, CVRQueryDrivenUpdater, classifyQueriesForHydration, nextEvictionTime } from "./cvr.js";
|
|
29
33
|
import { E2EServingLagTracker } from "./e2e-serving-lag.js";
|
|
34
|
+
import { HydrationBudget } from "./hydration-budget.js";
|
|
35
|
+
import { HydrationCircuitBreaker } from "./hydration-circuit-breaker.js";
|
|
30
36
|
import { handleInspect } from "./inspect-handler.js";
|
|
31
37
|
import { QueryCoveringIndex } from "./query-covering.js";
|
|
32
38
|
import { resolver } from "@rocicorp/resolver";
|
|
@@ -50,6 +56,7 @@ function shutdownBeforeInitializationError() {
|
|
|
50
56
|
* use a timer to update the ttlClock every minute.
|
|
51
57
|
*/
|
|
52
58
|
var TTL_CLOCK_INTERVAL = 6e4;
|
|
59
|
+
var slowHydrationLogThrottle = new LogThrottle({ windowMs: 5 * 6e4 });
|
|
53
60
|
var ViewSyncerService = class {
|
|
54
61
|
id;
|
|
55
62
|
createdAtMs = Date.now();
|
|
@@ -61,6 +68,7 @@ var ViewSyncerService = class {
|
|
|
61
68
|
#drainCoordinator;
|
|
62
69
|
#keepaliveMs;
|
|
63
70
|
#slowHydrateThreshold;
|
|
71
|
+
#hydrationCircuitBreaker;
|
|
64
72
|
#lastConnectTime = Date.now();
|
|
65
73
|
/**
|
|
66
74
|
* The TTL clock is used to determine the time at which queries are considered
|
|
@@ -88,6 +96,13 @@ var ViewSyncerService = class {
|
|
|
88
96
|
#lock = new Lock();
|
|
89
97
|
#cvrStore;
|
|
90
98
|
#stopped = resolver();
|
|
99
|
+
/**
|
|
100
|
+
* Set when {@link #cleanup} begins. Lock tasks that were in flight when the
|
|
101
|
+
* view-syncer was stopped may still complete after the timers have been
|
|
102
|
+
* cleared; this flag prevents them from scheduling new timers, which would
|
|
103
|
+
* otherwise outlive the service (and retain everything it references).
|
|
104
|
+
*/
|
|
105
|
+
#shuttingDown = false;
|
|
91
106
|
#initialized = resolver();
|
|
92
107
|
#cvr;
|
|
93
108
|
/**
|
|
@@ -102,7 +117,8 @@ var ViewSyncerService = class {
|
|
|
102
117
|
* updates are processed via `#syncQueryPipelineSet`.
|
|
103
118
|
*
|
|
104
119
|
* Resets to `false` if `#advancePipelines` returns a `ResetPipelinesSignal`
|
|
105
|
-
* and pipelines must be reset and rehydrated
|
|
120
|
+
* and pipelines must be reset and rehydrated, or if a reloaded CVR is ahead
|
|
121
|
+
* of the pipelines (see `#resetPipelinesIfBehindCVR`).
|
|
106
122
|
*/
|
|
107
123
|
#pipelinesHydrated = false;
|
|
108
124
|
#servedVersion = null;
|
|
@@ -110,6 +126,7 @@ var ViewSyncerService = class {
|
|
|
110
126
|
#expiredQueriesTimer = 0;
|
|
111
127
|
#authMaintenanceTimer = 0;
|
|
112
128
|
#setTimeout;
|
|
129
|
+
#now;
|
|
113
130
|
#customQueryTransformer;
|
|
114
131
|
#queryReplacements = /* @__PURE__ */ new Map();
|
|
115
132
|
#activeClients = getOrCreateUpDownCounter("sync", "active-clients", "Number of active sync clients");
|
|
@@ -127,6 +144,7 @@ var ViewSyncerService = class {
|
|
|
127
144
|
description: "Observations of sync.e2e_serving_lag that came out negative and were clamped to zero. Non-zero means the upstream database clock is running ahead of this pod by more than the entire pipeline latency, so sync.e2e_serving_lag is biased low and reads healthier than reality. See replication.upstream_clock_skew for the magnitude.",
|
|
128
145
|
unit: "{observation}"
|
|
129
146
|
});
|
|
147
|
+
#advancementMetrics = new AdvancementMetrics();
|
|
130
148
|
#transactionAdvanceTime = getOrCreateLatencyHistogram("sync", "advance-time", "Time to advance all queries for a given client group after applying a new transaction to the replica.");
|
|
131
149
|
#queryTransformations = getOrCreateCounter("sync", "query.transformations", "Number of query transformations performed");
|
|
132
150
|
#queryTransformationTime = getOrCreateLatencyHistogram("sync", "query.transformation-time", "Time to transform custom queries via API server.");
|
|
@@ -136,10 +154,64 @@ var ViewSyncerService = class {
|
|
|
136
154
|
#pipelineResets = getOrCreateCounter("sync", "pipeline-resets", "Number of pipeline resets");
|
|
137
155
|
#rowSetSignatureDrifts = getOrCreateCounter("sync", "query.row-set-signature-drifts", "Number of times re-hydration of an unchanged query produced a different row-set signature than what is stored in the CVR (forcing a configVersion bump and full re-execution). Expected to be near-zero in steady state; persistent non-zero values indicate non-deterministic query execution (e.g. Cap operator picking different N-row subsets).");
|
|
138
156
|
#sameHashRehydrationVersionBumps = getOrCreateCounter("sync", "query.same-hash-rehydrations-forced-bump", "Number of times query-set reconciliation forced a configVersion bump for already-gotten same-transformation-hash query rehydration because trackQueries would not otherwise bump. Expected to be near-zero; non-zero values indicate pipeline/CVR row-set drift reached query-set reconciliation.");
|
|
157
|
+
#hydrationBudgetExhaustions = getOrCreateCounter("sync", "hydration_budget_exhaustions", {
|
|
158
|
+
description: "Number of hydration passes that exhaust their budget.",
|
|
159
|
+
unit: "{pass}"
|
|
160
|
+
});
|
|
161
|
+
#hydrationBudgetEvictions = getOrCreateCounter("sync", "hydration_budget_evictions", {
|
|
162
|
+
description: "Number of inactive queries removed after hydration budget exhaustion.",
|
|
163
|
+
unit: "{query}"
|
|
164
|
+
});
|
|
165
|
+
#hydrationBudgetElapsed = getOrCreateValueHistogram("sync", "hydration_budget_elapsed", {
|
|
166
|
+
description: "Elapsed milliseconds when optional query hydration stopped.",
|
|
167
|
+
unit: "ms",
|
|
168
|
+
bucketBoundaries: [
|
|
169
|
+
1,
|
|
170
|
+
2,
|
|
171
|
+
5,
|
|
172
|
+
10,
|
|
173
|
+
20,
|
|
174
|
+
50,
|
|
175
|
+
100,
|
|
176
|
+
200,
|
|
177
|
+
500,
|
|
178
|
+
1e3,
|
|
179
|
+
5e3
|
|
180
|
+
]
|
|
181
|
+
});
|
|
182
|
+
#hydrationBudgetOvershoot = getOrCreateValueHistogram("sync", "hydration_budget_overshoot", {
|
|
183
|
+
description: "Milliseconds elapsed beyond the configured hydration budget.",
|
|
184
|
+
unit: "ms",
|
|
185
|
+
bucketBoundaries: [
|
|
186
|
+
0,
|
|
187
|
+
1,
|
|
188
|
+
2,
|
|
189
|
+
5,
|
|
190
|
+
10,
|
|
191
|
+
20,
|
|
192
|
+
50,
|
|
193
|
+
100,
|
|
194
|
+
200,
|
|
195
|
+
500,
|
|
196
|
+
1e3
|
|
197
|
+
]
|
|
198
|
+
});
|
|
199
|
+
#queryEvictions = getOrCreateCounter("sync", "query_evictions", {
|
|
200
|
+
description: "Number of queries evicted from the CVR ahead of their removal by the client, grouped by reason. Inactive queries are evicted by ttl and hydration-budget; hydration-timeout and hydration-circuit-breaker evict active queries as well.",
|
|
201
|
+
unit: "{query}"
|
|
202
|
+
});
|
|
203
|
+
#hydrationTimeouts = getOrCreateCounter("sync", "hydration_timeouts", {
|
|
204
|
+
description: "Number of query hydrations aborted for exceeding the query hydration timeout.",
|
|
205
|
+
unit: "{query}"
|
|
206
|
+
});
|
|
207
|
+
#hydrationCircuitBreakerRejections = getOrCreateCounter("sync", "hydration_circuit_breaker_rejections", {
|
|
208
|
+
description: "Number of queries rejected without hydration because their hydration circuit breaker was open.",
|
|
209
|
+
unit: "{query}"
|
|
210
|
+
});
|
|
139
211
|
#inspectorDelegate;
|
|
140
212
|
#config;
|
|
141
213
|
#runPriorityOp;
|
|
142
|
-
constructor(config, lc, shard, taskID, clientGroupID, cvrDb, pipelineDriver, versionChanges, drainCoordinator, slowHydrateThreshold, inspectorDelegate, connContextManager, customQueryTransformer, runPriorityOp, keepaliveMs = DEFAULT_KEEPALIVE_MS, setTimeoutFn = setTimeout.bind(globalThis)) {
|
|
214
|
+
constructor(config, lc, shard, taskID, clientGroupID, cvrDb, pipelineDriver, versionChanges, drainCoordinator, slowHydrateThreshold, inspectorDelegate, connContextManager, customQueryTransformer, runPriorityOp, keepaliveMs = DEFAULT_KEEPALIVE_MS, setTimeoutFn = setTimeout.bind(globalThis), now = performance.now.bind(performance)) {
|
|
143
215
|
this.#config = config;
|
|
144
216
|
this.id = clientGroupID;
|
|
145
217
|
this.connContextManager = connContextManager;
|
|
@@ -154,6 +226,8 @@ var ViewSyncerService = class {
|
|
|
154
226
|
this.#customQueryTransformer = customQueryTransformer;
|
|
155
227
|
this.#cvrStore = new CVRStore(lc, cvrDb, shard, taskID, clientGroupID, () => this.#stateChanges.cancel());
|
|
156
228
|
this.#setTimeout = setTimeoutFn;
|
|
229
|
+
this.#now = now;
|
|
230
|
+
this.#hydrationCircuitBreaker = new HydrationCircuitBreaker(config.viewSyncerQueryHydrationTimeoutMs ?? 0, void 0, now);
|
|
157
231
|
this.#runPriorityOp = runPriorityOp;
|
|
158
232
|
this.keepalive();
|
|
159
233
|
}
|
|
@@ -180,11 +254,13 @@ var ViewSyncerService = class {
|
|
|
180
254
|
this.#stateChanges.cancel();
|
|
181
255
|
return;
|
|
182
256
|
}
|
|
257
|
+
let reloaded = false;
|
|
183
258
|
if (!this.#cvr) {
|
|
184
259
|
this.#lc.debug?.("loading cvr");
|
|
185
260
|
this.#cvr = await this.#runPriorityOp(lc, "loading cvr", () => this.#cvrStore.load(lc, this.#lastConnectTime));
|
|
186
261
|
this.#ttlClock = this.#cvr.ttlClock;
|
|
187
262
|
this.#ttlClockBase = Date.now();
|
|
263
|
+
reloaded = true;
|
|
188
264
|
} else {
|
|
189
265
|
const now = Date.now();
|
|
190
266
|
this.#cvr = {
|
|
@@ -193,6 +269,10 @@ var ViewSyncerService = class {
|
|
|
193
269
|
};
|
|
194
270
|
}
|
|
195
271
|
try {
|
|
272
|
+
if (reloaded && this.#resetPipelinesIfBehindCVR(lc, this.#cvr)) {
|
|
273
|
+
const connCtx = this.connContextManager.getBackgroundConnectionContext();
|
|
274
|
+
if (connCtx) await this.#maybeHydratePipelines(lc, this.#cvr, connCtx);
|
|
275
|
+
}
|
|
196
276
|
await fn(lc, this.#cvr);
|
|
197
277
|
} catch (e) {
|
|
198
278
|
this.#cvr = void 0;
|
|
@@ -202,11 +282,47 @@ var ViewSyncerService = class {
|
|
|
202
282
|
}
|
|
203
283
|
});
|
|
204
284
|
}
|
|
285
|
+
/**
|
|
286
|
+
* The CVR is reloaded after an error clears the cached copy. By then another
|
|
287
|
+
* view-syncer may have taken over the client group and flushed the CVR at a
|
|
288
|
+
* version ahead of this instance's hydrated pipelines (e.g. its replica was
|
|
289
|
+
* further ahead). The pipelines can no longer be diffed against the CVR, so
|
|
290
|
+
* reset them and let `#maybeHydratePipelines` rehydrate once the replica has
|
|
291
|
+
* caught up to the CVR.
|
|
292
|
+
*
|
|
293
|
+
* A CVR behind the pipelines is expected (advancements that do not change
|
|
294
|
+
* the CVR are not flushed) and is handled by the normal update path.
|
|
295
|
+
*
|
|
296
|
+
* Returns whether the pipelines were reset.
|
|
297
|
+
*
|
|
298
|
+
* Must be called from within the #lock.
|
|
299
|
+
*/
|
|
300
|
+
#resetPipelinesIfBehindCVR(lc, cvr) {
|
|
301
|
+
if (!this.#pipelinesHydrated) return false;
|
|
302
|
+
const pipelineVersion = this.#pipelines.currentVersion();
|
|
303
|
+
if (pipelineVersion >= cvr.version.stateVersion) return false;
|
|
304
|
+
lc.info?.(`resetting pipelines: pipelines@${pipelineVersion} are behind reloaded cvr@${versionString(cvr.version)}`);
|
|
305
|
+
this.#pipelineResets.add(1, { reason: "behind-cvr" });
|
|
306
|
+
this.#pipelinesHydrated = false;
|
|
307
|
+
this.connContextManager.setSharedRetransformReady(false);
|
|
308
|
+
this.#pipelines.reset(must(cvr.clientSchema, "cvr.clientSchema missing after initialization"));
|
|
309
|
+
return true;
|
|
310
|
+
}
|
|
205
311
|
readyState() {
|
|
206
|
-
return Promise
|
|
312
|
+
return new Promise((resolve, reject) => {
|
|
313
|
+
const unsubscribe = this.#drainCoordinator.onDraining(() => resolve("draining"));
|
|
314
|
+
this.#initialized.promise.then((state) => {
|
|
315
|
+
unsubscribe();
|
|
316
|
+
resolve(state);
|
|
317
|
+
}, (err) => {
|
|
318
|
+
unsubscribe();
|
|
319
|
+
reject(err);
|
|
320
|
+
});
|
|
321
|
+
});
|
|
207
322
|
}
|
|
208
323
|
async run() {
|
|
209
324
|
try {
|
|
325
|
+
this.#scheduleShutdown(this.#keepaliveMs);
|
|
210
326
|
if (await this.readyState() === "draining") {
|
|
211
327
|
this.#lc.debug?.(`draining view-syncer ${this.id} before running`);
|
|
212
328
|
this.stop();
|
|
@@ -227,17 +343,28 @@ var ViewSyncerService = class {
|
|
|
227
343
|
lc.info?.(`resetting CVR: ${message}`);
|
|
228
344
|
throw new ClientNotFoundError(message);
|
|
229
345
|
}
|
|
346
|
+
let previousQueries;
|
|
230
347
|
if (this.#pipelinesHydrated) {
|
|
231
348
|
const result = await this.#advancePipelines(lc, cvr);
|
|
232
349
|
if (result === "success") return;
|
|
233
|
-
lc.info?.(`resetting pipelines: ${result.message}`);
|
|
350
|
+
lc.info?.(`resetting pipelines: ${result.message}${result.breakdown ? ` (${result.breakdown})` : ""}`);
|
|
234
351
|
this.#pipelineResets.add(1, { reason: result.reason });
|
|
352
|
+
switch (result.reason) {
|
|
353
|
+
case "advancement-timeout":
|
|
354
|
+
case "scalar-subquery":
|
|
355
|
+
case "truncation":
|
|
356
|
+
case "schema-change":
|
|
357
|
+
if (!Object.values(cvr.queries).some((q) => q.type === "client")) previousQueries = new Map(this.#pipelines.queries());
|
|
358
|
+
break;
|
|
359
|
+
case "permissions-change": break;
|
|
360
|
+
default: unreachable(result.reason);
|
|
361
|
+
}
|
|
235
362
|
this.#pipelines.reset(clientSchema);
|
|
236
363
|
this.#pipelinesHydrated = false;
|
|
237
364
|
this.connContextManager.setSharedRetransformReady(false);
|
|
238
365
|
}
|
|
239
366
|
const backgroundConnCtx = this.connContextManager.getBackgroundConnectionContext();
|
|
240
|
-
if (backgroundConnCtx) await this.#maybeHydratePipelines(lc, cvr, backgroundConnCtx);
|
|
367
|
+
if (backgroundConnCtx) await this.#maybeHydratePipelines(lc, cvr, backgroundConnCtx, previousQueries);
|
|
241
368
|
else lc.info?.("No validated background connection; deferring pipeline init");
|
|
242
369
|
});
|
|
243
370
|
}
|
|
@@ -275,17 +402,31 @@ var ViewSyncerService = class {
|
|
|
275
402
|
* - Syncs missing, errored, or drifted queries via `#syncQueryPipelineSet`.
|
|
276
403
|
* - Sets `#pipelinesHydrated = true` and enables shared retransformations.
|
|
277
404
|
*/
|
|
278
|
-
async #maybeHydratePipelines(lc, cvr, connCtx) {
|
|
405
|
+
async #maybeHydratePipelines(lc, cvr, connCtx, previousQueries) {
|
|
279
406
|
if (!this.#pipelines.initialized()) return;
|
|
280
|
-
|
|
407
|
+
let version;
|
|
408
|
+
try {
|
|
409
|
+
version = this.#pipelines.advanceWithoutDiff();
|
|
410
|
+
} catch (e) {
|
|
411
|
+
if (!(e instanceof ResetPipelinesSignal)) throw e;
|
|
412
|
+
lc.info?.(`resetting pipelines: ${e.message}${e.breakdown ? ` (${e.breakdown})` : ""}`);
|
|
413
|
+
this.#pipelineResets.add(1, { reason: e.reason });
|
|
414
|
+
this.#pipelines.reset(must(cvr.clientSchema, "cvr.clientSchema missing after initialization"));
|
|
415
|
+
version = this.#pipelines.currentVersion();
|
|
416
|
+
}
|
|
281
417
|
const cvrVer = versionString(cvr.version);
|
|
282
418
|
if (version < cvr.version.stateVersion) {
|
|
283
419
|
lc.debug?.(`replica@${version} is behind cvr@${cvrVer}`);
|
|
284
420
|
return;
|
|
285
421
|
}
|
|
286
422
|
lc.info?.(`init pipelines@${version} (cvr@${cvrVer})`);
|
|
287
|
-
const
|
|
288
|
-
|
|
423
|
+
const hydrationBudget = new HydrationBudget(this.#config.viewSyncerHydrationBudgetMs ?? 0, this.#now);
|
|
424
|
+
const hydrationPassStats = {
|
|
425
|
+
activeHydratedQueries: 0,
|
|
426
|
+
inactiveHydratedQueries: 0
|
|
427
|
+
};
|
|
428
|
+
const driftedQueryIDs = await this.#hydrateUnchangedQueries(lc, cvr, connCtx, hydrationPassStats, hydrationBudget, previousQueries);
|
|
429
|
+
await this.#syncQueryPipelineSet(lc, cvr, "missing", connCtx, driftedQueryIDs, hydrationBudget, hydrationPassStats, previousQueries);
|
|
289
430
|
this.#pipelinesHydrated = true;
|
|
290
431
|
this.connContextManager.setSharedRetransformReady(true);
|
|
291
432
|
}
|
|
@@ -379,7 +520,14 @@ var ViewSyncerService = class {
|
|
|
379
520
|
return true;
|
|
380
521
|
}
|
|
381
522
|
#shutdownTimer = null;
|
|
523
|
+
#stopShutdownTimer() {
|
|
524
|
+
if (this.#shutdownTimer !== null) {
|
|
525
|
+
clearTimeout(this.#shutdownTimer);
|
|
526
|
+
this.#shutdownTimer = null;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
382
529
|
#scheduleShutdown(delayMs = 0) {
|
|
530
|
+
if (this.#shuttingDown) return;
|
|
383
531
|
this.#shutdownTimer ??= this.#setTimeout(() => {
|
|
384
532
|
this.#shutdownTimer = null;
|
|
385
533
|
this.#runInLockWithCVR(() => {}).catch((e) => this.#stateChanges.fail(e));
|
|
@@ -426,6 +574,7 @@ var ViewSyncerService = class {
|
|
|
426
574
|
*/
|
|
427
575
|
#scheduleAuthMaintenance(lc) {
|
|
428
576
|
this.#stopAuthMaintenanceTimer();
|
|
577
|
+
if (this.#shuttingDown) return;
|
|
429
578
|
const plan = this.connContextManager.planMaintenance();
|
|
430
579
|
if (plan.earliestDeadlineAt === void 0) {
|
|
431
580
|
lc.debug?.("No auth maintenance wakeup scheduled");
|
|
@@ -531,17 +680,41 @@ var ViewSyncerService = class {
|
|
|
531
680
|
this.#ttlClockBase = now;
|
|
532
681
|
return ttlClock;
|
|
533
682
|
}
|
|
534
|
-
|
|
683
|
+
/**
|
|
684
|
+
* @param patchesPoked Whether patches computed against the updater's CVR
|
|
685
|
+
* have already been poked to clients. If so, the CVR is checked to be
|
|
686
|
+
* current even when the flush has nothing to write: another
|
|
687
|
+
* view-syncer may have already committed identical rows at a newer
|
|
688
|
+
* version, which would otherwise leave this one poking from a stale
|
|
689
|
+
* CVR whose version it cannot advance.
|
|
690
|
+
*/
|
|
691
|
+
#flushUpdater(lc, updater, patchesPoked = false) {
|
|
535
692
|
return startAsyncSpan(tracer, "vs.#flushUpdater", () => this.#runPriorityOp(lc, "flushing cvr", async () => {
|
|
536
693
|
const now = Date.now();
|
|
537
694
|
const ttlClock = this.#getTTLClock(now);
|
|
538
|
-
const { cvr, flushed } = await updater.flush(lc, this.#lastConnectTime, now, ttlClock);
|
|
695
|
+
const { cvr, flushed } = await updater.flush(lc, this.#lastConnectTime, now, ttlClock, patchesPoked);
|
|
539
696
|
if (flushed) this.#startTTLClockInterval(lc);
|
|
540
697
|
return cvr;
|
|
541
698
|
}));
|
|
542
699
|
}
|
|
700
|
+
/**
|
|
701
|
+
* Flushes an updater whose changes have already been poked. If the flush
|
|
702
|
+
* fails (e.g. the CVR was concurrently modified), the poke is cancelled
|
|
703
|
+
* before the error propagates. The error may only fail the client that
|
|
704
|
+
* initiated the operation, and any other client left mid-poke would fail
|
|
705
|
+
* its next pokeStart.
|
|
706
|
+
*/
|
|
707
|
+
async #flushPoked(lc, updater, pokers) {
|
|
708
|
+
try {
|
|
709
|
+
return await this.#flushUpdater(lc, updater, pokers.patchesSent);
|
|
710
|
+
} catch (e) {
|
|
711
|
+
await pokers.cancel();
|
|
712
|
+
throw e;
|
|
713
|
+
}
|
|
714
|
+
}
|
|
543
715
|
#startTTLClockInterval(lc) {
|
|
544
716
|
this.#stopTTLClockInterval();
|
|
717
|
+
if (this.#shuttingDown) return;
|
|
545
718
|
this.#ttlClockInterval = this.#setTimeout(() => {
|
|
546
719
|
this.#updateTTLClockInCVRWithoutLock(lc);
|
|
547
720
|
this.#startTTLClockInterval(lc);
|
|
@@ -570,7 +743,7 @@ var ViewSyncerService = class {
|
|
|
570
743
|
if (cmpVersions(cvr.version, this.#cvr.version) < 0) {
|
|
571
744
|
const newCVR = this.#cvr;
|
|
572
745
|
await startAsyncSpan(tracer, "vs.#updateCVRConfig.pokeClients", async () => {
|
|
573
|
-
const pokers = startPoke(this.#getClients(cvr.version), newCVR.version);
|
|
746
|
+
const pokers = startPoke(lc, this.#getClients(cvr.version), newCVR.version);
|
|
574
747
|
for (const patch of patches) await pokers.addPatch(patch);
|
|
575
748
|
await pokers.end(newCVR.version);
|
|
576
749
|
});
|
|
@@ -672,6 +845,7 @@ var ViewSyncerService = class {
|
|
|
672
845
|
#scheduleExpireEviction(lc, cvr) {
|
|
673
846
|
const { ttlClock } = cvr;
|
|
674
847
|
this.#stopExpireTimer();
|
|
848
|
+
if (this.#shuttingDown) return;
|
|
675
849
|
const next = nextEvictionTime(cvr);
|
|
676
850
|
if (next === void 0) {
|
|
677
851
|
lc.debug?.("no inactive queries with ttl");
|
|
@@ -699,7 +873,7 @@ var ViewSyncerService = class {
|
|
|
699
873
|
*
|
|
700
874
|
* This must be called from within the #lock.
|
|
701
875
|
*/
|
|
702
|
-
async #hydrateUnchangedQueries(lc, cvr, connCtx) {
|
|
876
|
+
async #hydrateUnchangedQueries(lc, cvr, connCtx, hydrationPassStats, hydrationBudget, previousQueries) {
|
|
703
877
|
assert(this.#pipelines.initialized(), "pipelines must be initialized");
|
|
704
878
|
const dbVersion = this.#pipelines.currentVersion();
|
|
705
879
|
const cvrVersion = cvr.version;
|
|
@@ -708,25 +882,27 @@ var ViewSyncerService = class {
|
|
|
708
882
|
return /* @__PURE__ */ new Set();
|
|
709
883
|
}
|
|
710
884
|
const gotQueries = Object.entries(cvr.queries).filter(([_, state]) => state.transformationHash !== void 0);
|
|
885
|
+
const { required: requiredGotQueries } = classifyQueriesForHydration(gotQueries.map(([, query]) => query));
|
|
711
886
|
const customQueries = /* @__PURE__ */ new Map();
|
|
712
887
|
const otherQueries = [];
|
|
713
|
-
|
|
714
|
-
for (const [, query] of gotQueries) {
|
|
715
|
-
if (query.type !== "internal" && Object.values(query.clientState).every(({ inactivatedAt }) => inactivatedAt !== void 0)) {
|
|
716
|
-
inactivatedCount++;
|
|
717
|
-
continue;
|
|
718
|
-
}
|
|
719
|
-
if (query.type === "custom") customQueries.set(query.id, query);
|
|
720
|
-
else otherQueries.push(query);
|
|
721
|
-
}
|
|
888
|
+
const inactivatedCount = gotQueries.length - requiredGotQueries.length;
|
|
722
889
|
const transformedQueries = [];
|
|
890
|
+
for (const query of requiredGotQueries) if (query.type === "custom") {
|
|
891
|
+
const previous = previousQueries?.get(query.id);
|
|
892
|
+
if (previous && previous.transformationHash === query.transformationHash) transformedQueries.push({
|
|
893
|
+
id: query.id,
|
|
894
|
+
transformationHash: previous.transformationHash,
|
|
895
|
+
transformedAst: previous.originalAst ?? previous.transformedAst
|
|
896
|
+
});
|
|
897
|
+
else customQueries.set(query.id, query);
|
|
898
|
+
} else otherQueries.push(query);
|
|
723
899
|
let customErrorCount = 0;
|
|
724
900
|
let customHashMismatchCount = 0;
|
|
725
901
|
let otherHashMismatchCount = 0;
|
|
726
902
|
if (customQueries.size > 0 && !this.#customQueryTransformer) lc.warn?.("Custom/named queries were requested but no `ZERO_QUERY_URL` is configured for Zero Cache.");
|
|
727
903
|
const customQueryTransformer = this.#customQueryTransformer;
|
|
728
904
|
if (customQueryTransformer && customQueries.size > 0) {
|
|
729
|
-
const transformedCustomQueries = await this.#runPriorityOp(lc, "#hydrateUnchangedQueries transforming custom queries", () => customQueryTransformer.transform(connCtx, customQueries.values()));
|
|
905
|
+
const transformedCustomQueries = await hydrationBudget.excluding(() => this.#runPriorityOp(lc, "#hydrateUnchangedQueries transforming custom queries", () => customQueryTransformer.transform(connCtx, customQueries.values())));
|
|
730
906
|
if (transformedCustomQueries.kind === "success" && !transformedCustomQueries.cached) this.connContextManager.validateConnection(connCtx, connCtx.revision, transformedCustomQueries.validation);
|
|
731
907
|
if (Array.isArray(transformedCustomQueries.result)) for (const q of transformedCustomQueries.result) if ("error" in q) customErrorCount++;
|
|
732
908
|
else if (q.transformationHash !== customQueries.get(q.id)?.transformationHash) customHashMismatchCount++;
|
|
@@ -746,6 +922,10 @@ var ViewSyncerService = class {
|
|
|
746
922
|
for (const { id: queryID, transformationHash, transformedAst } of transformedQueries) {
|
|
747
923
|
const query = cvr.queries[queryID];
|
|
748
924
|
const queryName = query.type === "custom" ? query.name : void 0;
|
|
925
|
+
if (query.type !== "internal" && this.#hydrationCircuitBreaker.isOpen(transformationHash)) {
|
|
926
|
+
lc.info?.(`skipping hydration of ${queryID}: hydration circuit breaker open`);
|
|
927
|
+
continue;
|
|
928
|
+
}
|
|
749
929
|
const covered = queryCoveringIndex ? this.#findQueryCoverageShadowHit(queryCoveringIndex, queryID, transformationHash, transformedAst, queryName) : void 0;
|
|
750
930
|
totalHydratedQueries++;
|
|
751
931
|
if (covered) {
|
|
@@ -754,24 +934,46 @@ var ViewSyncerService = class {
|
|
|
754
934
|
}
|
|
755
935
|
const timer = new TimeSliceTimer(lc);
|
|
756
936
|
let count = 0;
|
|
937
|
+
let timedOut = false;
|
|
757
938
|
await startAsyncSpan(tracer, "vs.#hydrateUnchangedQueries.addQuery", async (span) => {
|
|
758
939
|
span.setAttribute("queryHash", queryID);
|
|
759
940
|
span.setAttribute("transformationHash", transformationHash);
|
|
760
941
|
span.setAttribute("table", transformedAst.table);
|
|
761
942
|
if (queryName !== void 0) span.setAttribute("queryName", queryName);
|
|
762
|
-
for (const change of this.#pipelines.addQuery(transformationHash, queryID, transformedAst, await timer.start(), queryName, "unchanged-query-rehydrate")) if (change === "yield")
|
|
763
|
-
|
|
943
|
+
for (const change of this.#pipelines.addQuery(transformationHash, queryID, transformedAst, await timer.start(), queryName, "unchanged-query-rehydrate")) if (change === "yield") {
|
|
944
|
+
if (query.type !== "internal" && this.#hydrationCircuitBreaker.exceeded(timer.totalElapsed())) {
|
|
945
|
+
timedOut = true;
|
|
946
|
+
await timer.yieldProcess("yield in hydrateUnchangedQueries");
|
|
947
|
+
break;
|
|
948
|
+
}
|
|
949
|
+
await timer.yieldProcess("yield in hydrateUnchangedQueries");
|
|
950
|
+
} else count++;
|
|
764
951
|
});
|
|
765
952
|
const elapsed = timer.totalElapsed();
|
|
953
|
+
if (timedOut) {
|
|
954
|
+
this.#recordHydrationTimeout(lc, {
|
|
955
|
+
id: queryID,
|
|
956
|
+
ast: transformedAst,
|
|
957
|
+
transformationHash,
|
|
958
|
+
name: queryName
|
|
959
|
+
}, elapsed, count);
|
|
960
|
+
continue;
|
|
961
|
+
}
|
|
962
|
+
hydrationPassStats.activeHydratedQueries++;
|
|
766
963
|
this.#hydrations.add(1);
|
|
767
964
|
this.#hydrationTime.recordMs(elapsed);
|
|
768
|
-
this.#addQueryMaterializationServerMetric(
|
|
769
|
-
this.#inspectorDelegate.addQuery(
|
|
965
|
+
this.#addQueryMaterializationServerMetric(queryID, elapsed);
|
|
966
|
+
this.#inspectorDelegate.addQuery(queryID, transformedAst);
|
|
770
967
|
lc.debug?.(`hydrated ${count} rows for ${queryID} (${elapsed} ms)`);
|
|
968
|
+
if (elapsed > this.#slowHydrateThreshold) this.#logSlowHydration(lc, {
|
|
969
|
+
id: queryID,
|
|
970
|
+
ast: transformedAst,
|
|
971
|
+
transformationHash,
|
|
972
|
+
name: queryName
|
|
973
|
+
}, elapsed);
|
|
771
974
|
let drifted = false;
|
|
772
|
-
const
|
|
773
|
-
if (
|
|
774
|
-
const priorSig = parseSignature(storedSigHex);
|
|
975
|
+
const priorSig = this.#cvrStore.rowSetSignature(queryID);
|
|
976
|
+
if (priorSig !== void 0) {
|
|
775
977
|
const candidateSig = this.#pipelines.rowSetSignature(queryID) ?? 0n;
|
|
776
978
|
if (priorSig !== candidateSig) {
|
|
777
979
|
lc.warn?.(`rowSetSignature drift for query ${queryID}: prior=${priorSig.toString(16)} new=${candidateSig.toString(16)} (${count} rows). Removing from pipelines for full re-execution.`);
|
|
@@ -827,11 +1029,7 @@ var ViewSyncerService = class {
|
|
|
827
1029
|
return;
|
|
828
1030
|
}
|
|
829
1031
|
const appErrorGroups = /* @__PURE__ */ new Map();
|
|
830
|
-
for (const err of errorOrErrors) for (const clientId of getAffectedClientIDs([err.id]))
|
|
831
|
-
const group = appErrorGroups.get(clientId) ?? [];
|
|
832
|
-
group.push(err);
|
|
833
|
-
appErrorGroups.set(clientId, group);
|
|
834
|
-
}
|
|
1032
|
+
for (const err of errorOrErrors) for (const clientId of getAffectedClientIDs([err.id])) getOrInsertComputed(appErrorGroups, clientId, newArray).push(err);
|
|
835
1033
|
for (const [clientId, errors] of appErrorGroups) this.#clients.get(clientId)?.sendQueryTransformApplicationErrors(errors);
|
|
836
1034
|
}
|
|
837
1035
|
#addQueryMaterializationServerMetric(queryID, elapsed) {
|
|
@@ -867,7 +1065,10 @@ var ViewSyncerService = class {
|
|
|
867
1065
|
*
|
|
868
1066
|
* This must be called from within the #lock.
|
|
869
1067
|
*/
|
|
870
|
-
#syncQueryPipelineSet(lc, cvr, customQueryTransformMode, connCtx, driftedQueryIDs = /* @__PURE__ */ new Set()) {
|
|
1068
|
+
#syncQueryPipelineSet(lc, cvr, customQueryTransformMode, connCtx, driftedQueryIDs = /* @__PURE__ */ new Set(), hydrationBudget = new HydrationBudget(this.#config.viewSyncerHydrationBudgetMs ?? 0, this.#now), hydrationPassStats = {
|
|
1069
|
+
activeHydratedQueries: 0,
|
|
1070
|
+
inactiveHydratedQueries: 0
|
|
1071
|
+
}, previousQueries) {
|
|
871
1072
|
return startAsyncSpan(tracer, "vs.#syncQueryPipelineSet", async (span) => {
|
|
872
1073
|
const start = performance.now();
|
|
873
1074
|
span.setAttribute("clientGroupID", this.id);
|
|
@@ -876,34 +1077,42 @@ var ViewSyncerService = class {
|
|
|
876
1077
|
const now = Date.now();
|
|
877
1078
|
const ttlClock = this.#getTTLClock(now);
|
|
878
1079
|
const cvrQueryEntires = Object.entries(cvr.queries);
|
|
879
|
-
const customQueries = /* @__PURE__ */ new Map();
|
|
880
|
-
const otherQueries = [];
|
|
881
1080
|
const transformedQueries = [];
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
}
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
for (const { id, query: origQuery } of otherQueries) {
|
|
890
|
-
assert(id === origQuery.id, "query id mismatch");
|
|
891
|
-
const transformed = transformAndHashQuery(lc, origQuery.id, origQuery.ast, must(this.#pipelines.currentPermissions()).permissions ?? { tables: {} }, connCtx.auth?.type === "jwt" ? connCtx.auth : void 0, origQuery.type === "internal");
|
|
892
|
-
transformedQueries.push({
|
|
893
|
-
id,
|
|
894
|
-
origQuery,
|
|
895
|
-
transformed
|
|
896
|
-
});
|
|
897
|
-
}
|
|
898
|
-
if (customQueries.size > 0 && !this.#customQueryTransformer) lc.warn?.("Custom/named queries were requested but no `ZERO_QUERY_URL` is configured for Zero Cache.");
|
|
899
|
-
let erroredQueryIDs;
|
|
900
|
-
const customQueriesToTransform = customQueryTransformMode === "all" ? [...customQueries.values()] : customQueryTransformMode && [...customQueries.values()].filter((q) => !this.#pipelines.queries().has(q.id));
|
|
1081
|
+
const naturallyExpiredQueryIDs = new Set(cvrQueryEntires.map(([, query]) => query).filter((query) => expired(ttlClock, query)).map((query) => query.id));
|
|
1082
|
+
if (naturallyExpiredQueryIDs.size > 0) this.#queryEvictions.add(naturallyExpiredQueryIDs.size, { reason: "ttl" });
|
|
1083
|
+
const hydrationCandidates = cvrQueryEntires.map(([, query]) => query).filter((query) => !naturallyExpiredQueryIDs.has(query.id));
|
|
1084
|
+
const { required, optional } = classifyQueriesForHydration(hydrationCandidates);
|
|
1085
|
+
const requiredQueryIDs = new Set(required.map((query) => query.id));
|
|
1086
|
+
const optionalToHydrate = hydrationBudget.limitMs === 0 ? optional : optional.filter((query) => query.patchVersion !== void 0);
|
|
1087
|
+
if (!this.#customQueryTransformer && hydrationCandidates.some((query) => query.type === "custom")) lc.warn?.("Custom/named queries were requested but no `ZERO_QUERY_URL` is configured for Zero Cache.");
|
|
901
1088
|
const customQueryTransformer = this.#customQueryTransformer;
|
|
902
|
-
|
|
1089
|
+
const erroredQueryIDs = [];
|
|
1090
|
+
let transformedCustomQueryCount = 0;
|
|
1091
|
+
const transformOtherQueries = (queries) => {
|
|
1092
|
+
for (const origQuery of queries) {
|
|
1093
|
+
if (origQuery.type === "custom") continue;
|
|
1094
|
+
const transformed = transformAndHashQuery(lc, origQuery.id, origQuery.ast, must(this.#pipelines.currentPermissions()).permissions ?? { tables: {} }, connCtx.auth?.type === "jwt" ? connCtx.auth : void 0, origQuery.type === "internal");
|
|
1095
|
+
transformedQueries.push({
|
|
1096
|
+
id: origQuery.id,
|
|
1097
|
+
origQuery,
|
|
1098
|
+
transformed
|
|
1099
|
+
});
|
|
1100
|
+
}
|
|
1101
|
+
};
|
|
1102
|
+
const shouldTransformCustomQuery = (query) => {
|
|
1103
|
+
if (customQueryTransformMode === "all") return true;
|
|
1104
|
+
if (this.#pipelines.queries().has(query.id)) return false;
|
|
1105
|
+
const previous = previousQueries?.get(query.id);
|
|
1106
|
+
if (previous && previous.transformationHash === query.transformationHash) return false;
|
|
1107
|
+
return true;
|
|
1108
|
+
};
|
|
1109
|
+
const transformCustomQueries = async (queries) => {
|
|
1110
|
+
if (!customQueryTransformer || queries.length === 0) return;
|
|
1111
|
+
transformedCustomQueryCount += queries.length;
|
|
903
1112
|
const transformStart = performance.now();
|
|
904
1113
|
let transformedCustomQueries;
|
|
905
1114
|
try {
|
|
906
|
-
transformedCustomQueries = await this.#runPriorityOp(lc, "#syncQueryPipelineSet transforming custom queries", () => customQueryTransformer.transform(connCtx,
|
|
1115
|
+
transformedCustomQueries = await hydrationBudget.excluding(() => this.#runPriorityOp(lc, "#syncQueryPipelineSet transforming custom queries", () => customQueryTransformer.transform(connCtx, queries)));
|
|
907
1116
|
if (transformedCustomQueries.kind === "failed") throw new ProtocolErrorWithLevel(transformedCustomQueries.result, "warn");
|
|
908
1117
|
else {
|
|
909
1118
|
if (!transformedCustomQueries.cached) this.connContextManager.validateConnection(connCtx, connCtx.revision, transformedCustomQueries.validation);
|
|
@@ -917,8 +1126,9 @@ var ViewSyncerService = class {
|
|
|
917
1126
|
this.#queryTransformationTime.recordMs(transformDuration);
|
|
918
1127
|
}
|
|
919
1128
|
const successfullyTransformedCustomQueries = /* @__PURE__ */ new Map();
|
|
920
|
-
|
|
921
|
-
|
|
1129
|
+
const customQueryMap = new Map(queries.map((query) => [query.id, query]));
|
|
1130
|
+
erroredQueryIDs.push(...this.#processTransformedCustomQueries(lc, transformedCustomQueries.result, (q) => {
|
|
1131
|
+
const origQuery = customQueryMap.get(q.id);
|
|
922
1132
|
if (origQuery) {
|
|
923
1133
|
successfullyTransformedCustomQueries.set(q.id, q);
|
|
924
1134
|
transformedQueries.push({
|
|
@@ -927,7 +1137,7 @@ var ViewSyncerService = class {
|
|
|
927
1137
|
transformed: q
|
|
928
1138
|
});
|
|
929
1139
|
}
|
|
930
|
-
},
|
|
1140
|
+
}, customQueryMap));
|
|
931
1141
|
for (const [queryID, newTransform] of successfullyTransformedCustomQueries) {
|
|
932
1142
|
const existingTransformHash = cvr.queries[queryID]?.transformationHash;
|
|
933
1143
|
if (existingTransformHash) {
|
|
@@ -940,21 +1150,55 @@ var ViewSyncerService = class {
|
|
|
940
1150
|
} else this.#queryTransformationNoOps.add(1);
|
|
941
1151
|
}
|
|
942
1152
|
}
|
|
1153
|
+
};
|
|
1154
|
+
const queriesToTransform = [...required, ...optionalToHydrate];
|
|
1155
|
+
transformOtherQueries(queriesToTransform);
|
|
1156
|
+
if (customQueryTransformMode === "missing" && previousQueries) {
|
|
1157
|
+
for (const query of queriesToTransform) if (query.type === "custom" && !this.#pipelines.queries().has(query.id)) {
|
|
1158
|
+
const previous = previousQueries.get(query.id);
|
|
1159
|
+
if (previous && previous.transformationHash === query.transformationHash) {
|
|
1160
|
+
this.#queryTransformationNoOps.add(1);
|
|
1161
|
+
transformedQueries.push({
|
|
1162
|
+
id: query.id,
|
|
1163
|
+
origQuery: query,
|
|
1164
|
+
transformed: {
|
|
1165
|
+
id: query.id,
|
|
1166
|
+
transformationHash: previous.transformationHash,
|
|
1167
|
+
transformedAst: previous.originalAst ?? previous.transformedAst
|
|
1168
|
+
}
|
|
1169
|
+
});
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
943
1172
|
}
|
|
944
|
-
|
|
1173
|
+
await transformCustomQueries(queriesToTransform.filter((query) => query.type === "custom" && shouldTransformCustomQuery(query)));
|
|
1174
|
+
const circuitBrokenQueries = transformedQueries.filter(({ id, origQuery, transformed }) => origQuery.type !== "internal" && this.#pipelines.queries().get(id)?.transformationHash !== transformed.transformationHash && this.#hydrationCircuitBreaker.isOpen(transformed.transformationHash)).map(({ id, origQuery, transformed }) => ({
|
|
1175
|
+
id,
|
|
1176
|
+
transformationHash: transformed.transformationHash,
|
|
1177
|
+
name: origQuery.type === "custom" ? origQuery.name : void 0
|
|
1178
|
+
}));
|
|
1179
|
+
if (circuitBrokenQueries.length > 0) this.#rejectCircuitBrokenQueries(lc, cvr, circuitBrokenQueries);
|
|
1180
|
+
const removeQueriesQueryIds = new Set([
|
|
1181
|
+
...naturallyExpiredQueryIDs,
|
|
1182
|
+
...erroredQueryIDs,
|
|
1183
|
+
...circuitBrokenQueries.map(({ id }) => id)
|
|
1184
|
+
]);
|
|
945
1185
|
const addQueries = transformedQueries.map(({ id, origQuery, transformed }) => ({
|
|
946
1186
|
id,
|
|
947
1187
|
ast: transformed.transformedAst,
|
|
948
1188
|
transformationHash: transformed.transformationHash,
|
|
949
1189
|
name: origQuery.type === "custom" ? origQuery.name : void 0
|
|
950
1190
|
})).filter((q) => !removeQueriesQueryIds.has(q.id) && this.#pipelines.queries().get(q.id)?.transformationHash !== q.transformationHash);
|
|
951
|
-
|
|
1191
|
+
const hydrationOrder = new Map([...required, ...optional].map((query, index) => [query.id, index]));
|
|
1192
|
+
addQueries.sort((a, b) => must(hydrationOrder.get(a.id)) - must(hydrationOrder.get(b.id)));
|
|
1193
|
+
const requiredAddQueries = addQueries.filter((query) => requiredQueryIDs.has(query.id));
|
|
1194
|
+
const optionalAddQueries = addQueries.filter((query) => !requiredQueryIDs.has(query.id));
|
|
1195
|
+
lc.info?.(`syncQueryPipelineSet: ${cvrQueryEntires.length} CVR queries, ${transformedCustomQueryCount} custom re-transformed, ${erroredQueryIDs.length} errored, ${circuitBrokenQueries.length} circuit-broken, ${removeQueriesQueryIds.size} to remove, ${addQueries.length} to add`);
|
|
952
1196
|
for (const q of addQueries) {
|
|
953
1197
|
const orig = cvr.queries[q.id];
|
|
954
1198
|
lc.debug?.("ViewSyncer adding query", q.ast, "transformed from", orig.type === "custom" ? orig.name : orig.ast);
|
|
955
1199
|
}
|
|
956
1200
|
if (addQueries.length > 0 || removeQueriesQueryIds.size > 0) {
|
|
957
|
-
await this.#addAndRemoveQueries(lc, cvr,
|
|
1201
|
+
await this.#addAndRemoveQueries(lc, cvr, requiredAddQueries, optionalAddQueries, Array.from(removeQueriesQueryIds, (id) => ({ id })), hydrationBudget, hydrationPassStats, driftedQueryIDs);
|
|
958
1202
|
if (addQueries.length > 0) this.#viewSyncerHydration.recordMs(performance.now() - start);
|
|
959
1203
|
} else await this.#catchupClients(lc, cvr);
|
|
960
1204
|
});
|
|
@@ -987,14 +1231,134 @@ var ViewSyncerService = class {
|
|
|
987
1231
|
record.count++;
|
|
988
1232
|
if (record.count >= THRASH_THRESHOLD) this.#lc.warn?.(`Query thrashing detected for query ${queryID}. ${record.count} replacements in 60s. This may indicate clients with different auth contexts connecting to the same client group.`);
|
|
989
1233
|
}
|
|
990
|
-
|
|
1234
|
+
/**
|
|
1235
|
+
* Records that hydrating `query` was aborted for exceeding the query
|
|
1236
|
+
* hydration timeout, and opens its circuit breaker.
|
|
1237
|
+
*/
|
|
1238
|
+
#recordHydrationTimeout(lc, query, elapsedMs, rowCount) {
|
|
1239
|
+
this.#hydrationCircuitBreaker.trip(query.transformationHash);
|
|
1240
|
+
this.#hydrationTimeouts.add(1);
|
|
1241
|
+
if (!lc.warn) return;
|
|
1242
|
+
const shape = queryShape(query.ast);
|
|
1243
|
+
lc.warn("Query hydration aborted for exceeding the hydration timeout", {
|
|
1244
|
+
clientGroupID: this.id,
|
|
1245
|
+
queryHash: query.id,
|
|
1246
|
+
transformationHash: query.transformationHash,
|
|
1247
|
+
...query.name !== void 0 && { queryName: query.name },
|
|
1248
|
+
queryShape: shape.hash,
|
|
1249
|
+
hydrationTimeoutMs: this.#hydrationCircuitBreaker.timeoutMs,
|
|
1250
|
+
hydrationElapsedMs: elapsedMs,
|
|
1251
|
+
...rowCount !== void 0 && { hydrationRowCount: rowCount },
|
|
1252
|
+
circuitBreakerOpenMs: this.#hydrationCircuitBreaker.openMs,
|
|
1253
|
+
zql: shape.zql
|
|
1254
|
+
});
|
|
1255
|
+
}
|
|
1256
|
+
/**
|
|
1257
|
+
* Logs a hydration that exceeded the slow hydration threshold.
|
|
1258
|
+
*
|
|
1259
|
+
* The query is logged as its {@link queryShape}, with literal values
|
|
1260
|
+
* redacted, and each shape is logged at most once per
|
|
1261
|
+
* {@link SLOW_HYDRATION_LOG_WINDOW_MS}. The next log of a shape reports how
|
|
1262
|
+
* many slow hydrations of it were suppressed in the meantime.
|
|
1263
|
+
*/
|
|
1264
|
+
#logSlowHydration(lc, query, elapsedMs) {
|
|
1265
|
+
if (!lc.warn) return;
|
|
1266
|
+
const stats = this.#pipelines.hydrationStats(query.id);
|
|
1267
|
+
const shape = stats?.shape ?? queryShape(query.ast);
|
|
1268
|
+
const suppressed = slowHydrationLogThrottle.admit(`${query.name ?? ""}:${shape.hash}`);
|
|
1269
|
+
if (suppressed === void 0) return;
|
|
1270
|
+
lc.warn("Slow query materialization", {
|
|
1271
|
+
zeroEvent: "query-slow-hydration",
|
|
1272
|
+
clientGroupID: this.id,
|
|
1273
|
+
queryHash: query.id,
|
|
1274
|
+
transformationHash: query.transformationHash,
|
|
1275
|
+
...query.name !== void 0 && { queryName: query.name },
|
|
1276
|
+
queryShape: shape.hash,
|
|
1277
|
+
hydrationTimeMs: elapsedMs,
|
|
1278
|
+
...stats && {
|
|
1279
|
+
hydrationRowCount: stats.rowCount,
|
|
1280
|
+
hydrationRowsRead: stats.rowsRead
|
|
1281
|
+
},
|
|
1282
|
+
...stats !== void 0 && stats.planWarnings.length > 0 && { planWarnings: stats.planWarnings.map(planWarningMessage) },
|
|
1283
|
+
...suppressed > 0 && { suppressedSinceLastLog: suppressed },
|
|
1284
|
+
zql: shape.zql
|
|
1285
|
+
});
|
|
1286
|
+
}
|
|
1287
|
+
/** Records that `query` was rejected without hydration by its open breaker. */
|
|
1288
|
+
#recordCircuitBreakerRejection(lc, query) {
|
|
1289
|
+
this.#hydrationCircuitBreakerRejections.add(1);
|
|
1290
|
+
lc.warn?.("Query rejected by its open hydration circuit breaker", {
|
|
1291
|
+
clientGroupID: this.id,
|
|
1292
|
+
queryHash: query.id,
|
|
1293
|
+
transformationHash: query.transformationHash,
|
|
1294
|
+
...query.name !== void 0 && { queryName: query.name },
|
|
1295
|
+
hydrationTimeoutMs: this.#hydrationCircuitBreaker.timeoutMs,
|
|
1296
|
+
circuitBreakerOpenMs: this.#hydrationCircuitBreaker.openMs
|
|
1297
|
+
});
|
|
1298
|
+
}
|
|
1299
|
+
/**
|
|
1300
|
+
* Handles queries whose hydration circuit breaker is open: they are counted,
|
|
1301
|
+
* logged, and errored to the affected clients. The caller removes them from
|
|
1302
|
+
* the CVR.
|
|
1303
|
+
*/
|
|
1304
|
+
#rejectCircuitBrokenQueries(lc, cvr, queries) {
|
|
1305
|
+
for (const query of queries) this.#recordCircuitBreakerRejection(lc, query);
|
|
1306
|
+
this.#queryEvictions.add(queries.length, { reason: "hydration-circuit-breaker" });
|
|
1307
|
+
this.#sendHydrationTimeoutErrors(cvr, queries);
|
|
1308
|
+
}
|
|
1309
|
+
/**
|
|
1310
|
+
* Sends a per-query error to every client that desires one of `queries`.
|
|
1311
|
+
* The error goes out as a `transformError` application error, which every
|
|
1312
|
+
* client understands as "this query errored" without affecting the
|
|
1313
|
+
* connection or the client's other queries.
|
|
1314
|
+
*/
|
|
1315
|
+
#sendHydrationTimeoutErrors(cvr, queries) {
|
|
1316
|
+
const timeoutMs = this.#hydrationCircuitBreaker.timeoutMs;
|
|
1317
|
+
const errorsByClient = /* @__PURE__ */ new Map();
|
|
1318
|
+
for (const { id, name } of queries) {
|
|
1319
|
+
const query = cvr.queries[id];
|
|
1320
|
+
if (query === void 0 || query.type === "internal") continue;
|
|
1321
|
+
const error = {
|
|
1322
|
+
error: "app",
|
|
1323
|
+
id,
|
|
1324
|
+
name: name ?? (query.type === "custom" ? query.name : "legacy"),
|
|
1325
|
+
message: `Query hydration exceeded the ${timeoutMs}ms limit (ZERO_VIEW_SYNCER_QUERY_HYDRATION_TIMEOUT_MS) and was aborted`,
|
|
1326
|
+
details: {
|
|
1327
|
+
kind: "HydrationTimeout",
|
|
1328
|
+
timeoutMs
|
|
1329
|
+
}
|
|
1330
|
+
};
|
|
1331
|
+
for (const clientID of Object.keys(query.clientState)) getOrInsertComputed(errorsByClient, clientID, newArray).push(error);
|
|
1332
|
+
}
|
|
1333
|
+
for (const [clientID, errors] of errorsByClient) this.#clients.get(clientID)?.sendQueryTransformApplicationErrors(errors);
|
|
1334
|
+
}
|
|
1335
|
+
#recordHydrationBudgetExhaustion(lc, hydrationBudget, activeHydratedQueries, inactiveHydratedQueries, inactiveEvictedQueryIDs) {
|
|
1336
|
+
const elapsedMs = hydrationBudget.exhaustedAtMs;
|
|
1337
|
+
if (elapsedMs === void 0) return;
|
|
1338
|
+
this.#hydrationBudgetExhaustions.add(1);
|
|
1339
|
+
this.#hydrationBudgetEvictions.add(inactiveEvictedQueryIDs.length);
|
|
1340
|
+
this.#hydrationBudgetElapsed.record(elapsedMs);
|
|
1341
|
+
this.#hydrationBudgetOvershoot.record(Math.max(0, elapsedMs - hydrationBudget.limitMs));
|
|
1342
|
+
if (inactiveEvictedQueryIDs.length > 0) this.#queryEvictions.add(inactiveEvictedQueryIDs.length, { reason: "hydration-budget" });
|
|
1343
|
+
lc.info?.("view-syncer hydration budget exhausted", {
|
|
1344
|
+
clientGroupID: this.id,
|
|
1345
|
+
hydrationBudgetMs: hydrationBudget.limitMs,
|
|
1346
|
+
hydrationElapsedMs: elapsedMs,
|
|
1347
|
+
activeHydratedQueries,
|
|
1348
|
+
inactiveHydratedQueries,
|
|
1349
|
+
inactiveEvictedQueries: inactiveEvictedQueryIDs.length,
|
|
1350
|
+
firstEvictedQueryHash: inactiveEvictedQueryIDs[0] ?? null
|
|
1351
|
+
});
|
|
1352
|
+
}
|
|
1353
|
+
#addAndRemoveQueries(lc, cvr, requiredQueries, optionalQueries, removeQueries, hydrationBudget, hydrationPassStats, driftedQueryIDs = /* @__PURE__ */ new Set()) {
|
|
991
1354
|
return startAsyncSpan(tracer, "vs.#addAndRemoveQueries", async () => {
|
|
1355
|
+
const addQueries = [...requiredQueries, ...optionalQueries];
|
|
992
1356
|
assert(addQueries.length > 0 || removeQueries.length > 0, "Must have queries to add or remove");
|
|
993
1357
|
const start = performance.now();
|
|
994
1358
|
const stateVersion = this.#pipelines.currentVersion();
|
|
995
1359
|
lc = lc.withContext("stateVersion", stateVersion);
|
|
996
1360
|
lc.info?.(`hydrating ${addQueries.length} queries`);
|
|
997
|
-
const updater = new CVRQueryDrivenUpdater(this.#cvrStore, cvr, stateVersion, this.#pipelines.replicaVersion,
|
|
1361
|
+
const updater = new CVRQueryDrivenUpdater(this.#cvrStore, cvr, stateVersion, this.#pipelines.replicaVersion, this.#pipelines);
|
|
998
1362
|
const sameHashRehydratedQueryIDs = addQueries.filter((q) => cvr.queries[q.id]?.transformationHash === q.transformationHash).map((q) => q.id);
|
|
999
1363
|
const trackQueriesWillBumpVersion = stateVersion > cvr.version.stateVersion || removeQueries.length > 0 || addQueries.some((q) => cvr.queries[q.id]?.transformationHash !== q.transformationHash);
|
|
1000
1364
|
if (sameHashRehydratedQueryIDs.length > 0 && !trackQueriesWillBumpVersion) {
|
|
@@ -1005,7 +1369,9 @@ var ViewSyncerService = class {
|
|
|
1005
1369
|
updater.ensureNewVersion();
|
|
1006
1370
|
}
|
|
1007
1371
|
const { queryPatches, newVersion } = updater.trackQueries(lc, addQueries, removeQueries);
|
|
1008
|
-
|
|
1372
|
+
if (hydrationBudget.limitMs !== 0 && optionalQueries.length > 0) assert(cmpVersions(cvr.version, newVersion) < 0, "Optional hydration requires a final poke version before row processing so a removal is actually poked");
|
|
1373
|
+
const clients = this.#getClients();
|
|
1374
|
+
const pokers = startPoke(lc, clients, newVersion);
|
|
1009
1375
|
for (const patch of queryPatches) await pokers.addPatch(patch);
|
|
1010
1376
|
for (const q of removeQueries) {
|
|
1011
1377
|
this.#pipelines.removeQuery(q.id);
|
|
@@ -1021,22 +1387,54 @@ var ViewSyncerService = class {
|
|
|
1021
1387
|
let totalHydratedQueries = 0;
|
|
1022
1388
|
let coveredHydratedQueries = 0;
|
|
1023
1389
|
let firstCoveredQuery;
|
|
1390
|
+
const hydratedQueryIDs = [];
|
|
1391
|
+
const budgetEvictedQueryIDs = [];
|
|
1392
|
+
const timedOutQueries = [];
|
|
1393
|
+
const rejectedQueries = [];
|
|
1394
|
+
const circuitBreaker = this.#hydrationCircuitBreaker;
|
|
1024
1395
|
const self = this;
|
|
1025
1396
|
await yieldProcess(lc);
|
|
1026
|
-
function*
|
|
1027
|
-
for (
|
|
1397
|
+
function* hydrateQueries(queries, optional, slowHydrateThreshold) {
|
|
1398
|
+
for (let i = 0; i < queries.length; i++) {
|
|
1399
|
+
if (optional && hydrationBudget.exhausted()) {
|
|
1400
|
+
budgetEvictedQueryIDs.push(...queries.slice(i).map((query) => query.id));
|
|
1401
|
+
return;
|
|
1402
|
+
}
|
|
1403
|
+
const q = must(queries[i]);
|
|
1028
1404
|
let queryLC = lc.withContext("hash", q.id).withContext("queryHash", q.id).withContext("transformationHash", q.transformationHash);
|
|
1029
1405
|
if (q.name !== void 0) queryLC = queryLC.withContext("queryName", q.name);
|
|
1030
1406
|
queryLC.debug?.(`adding pipeline for query`, q.ast);
|
|
1407
|
+
const breakable = cvr.queries[q.id]?.type !== "internal";
|
|
1408
|
+
if (breakable && circuitBreaker.isOpen(q.transformationHash)) {
|
|
1409
|
+
rejectedQueries.push(q);
|
|
1410
|
+
self.#recordCircuitBreakerRejection(queryLC, q);
|
|
1411
|
+
continue;
|
|
1412
|
+
}
|
|
1031
1413
|
const covered = queryCoveringIndex ? self.#findQueryCoverageShadowHit(queryCoveringIndex, q.id, q.transformationHash, q.ast, q.name) : void 0;
|
|
1032
1414
|
totalHydratedQueries++;
|
|
1033
1415
|
if (covered) {
|
|
1034
1416
|
coveredHydratedQueries++;
|
|
1035
1417
|
firstCoveredQuery ??= covered;
|
|
1036
1418
|
}
|
|
1037
|
-
|
|
1419
|
+
let timedOut = false;
|
|
1420
|
+
for (const change of pipelines.addQuery(q.transformationHash, q.id, q.ast, timer.startWithoutYielding(), q.name, "query-set-sync")) {
|
|
1421
|
+
if (change === "yield" && breakable && circuitBreaker.exceeded(timer.totalElapsed())) {
|
|
1422
|
+
timedOut = true;
|
|
1423
|
+
yield change;
|
|
1424
|
+
break;
|
|
1425
|
+
}
|
|
1426
|
+
yield change;
|
|
1427
|
+
}
|
|
1038
1428
|
const elapsed = timer.stop();
|
|
1039
1429
|
totalProcessTime += elapsed;
|
|
1430
|
+
if (timedOut) {
|
|
1431
|
+
timedOutQueries.push(q);
|
|
1432
|
+
self.#recordHydrationTimeout(queryLC, q, elapsed);
|
|
1433
|
+
continue;
|
|
1434
|
+
}
|
|
1435
|
+
hydratedQueryIDs.push(q.id);
|
|
1436
|
+
if (optional) hydrationPassStats.inactiveHydratedQueries++;
|
|
1437
|
+
else hydrationPassStats.activeHydratedQueries++;
|
|
1040
1438
|
self.#addQueryMaterializationServerMetric(q.id, elapsed);
|
|
1041
1439
|
self.#inspectorDelegate.addQuery(q.id, q.ast);
|
|
1042
1440
|
queryCoveringIndex?.add(q.id, {
|
|
@@ -1044,24 +1442,49 @@ var ViewSyncerService = class {
|
|
|
1044
1442
|
transformationHash: q.transformationHash,
|
|
1045
1443
|
...q.name !== void 0 && { queryName: q.name }
|
|
1046
1444
|
});
|
|
1047
|
-
if (elapsed > slowHydrateThreshold) queryLC
|
|
1445
|
+
if (elapsed > slowHydrateThreshold) self.#logSlowHydration(queryLC, q, elapsed);
|
|
1048
1446
|
manualSpan(tracer, "vs.addAndConsumeQuery", elapsed, {
|
|
1049
1447
|
hash: q.id,
|
|
1050
1448
|
transformationHash: q.transformationHash,
|
|
1051
1449
|
...q.name !== void 0 && { name: q.name }
|
|
1052
1450
|
});
|
|
1451
|
+
hydrations.add(1);
|
|
1452
|
+
hydrationTime.recordMs(elapsed);
|
|
1453
|
+
}
|
|
1454
|
+
}
|
|
1455
|
+
function* generateRowChanges(slowHydrateThreshold) {
|
|
1456
|
+
yield* hydrateQueries(requiredQueries, false, slowHydrateThreshold);
|
|
1457
|
+
yield* hydrateQueries(optionalQueries, true, slowHydrateThreshold);
|
|
1458
|
+
}
|
|
1459
|
+
await this.#processChanges(lc, timer, generateRowChanges(this.#slowHydrateThreshold), (rows) => updater.received(lc, rows), pokers);
|
|
1460
|
+
const abortedQueries = [...timedOutQueries, ...rejectedQueries];
|
|
1461
|
+
if (abortedQueries.length > 0) {
|
|
1462
|
+
const abortedQueryIDs = abortedQueries.map(({ id }) => id);
|
|
1463
|
+
for (const patch of await updater.abortExecutedQueries(lc, abortedQueryIDs)) await pokers.addPatch(patch);
|
|
1464
|
+
for (const queryID of abortedQueryIDs) {
|
|
1465
|
+
this.#pipelines.removeQuery(queryID);
|
|
1466
|
+
this.#inspectorDelegate.removeQuery(queryID);
|
|
1467
|
+
this.#queryReplacements.delete(queryID);
|
|
1053
1468
|
}
|
|
1054
|
-
|
|
1055
|
-
|
|
1469
|
+
if (timedOutQueries.length > 0) this.#queryEvictions.add(timedOutQueries.length, { reason: "hydration-timeout" });
|
|
1470
|
+
if (rejectedQueries.length > 0) this.#queryEvictions.add(rejectedQueries.length, { reason: "hydration-circuit-breaker" });
|
|
1471
|
+
this.#sendHydrationTimeoutErrors(cvr, abortedQueries);
|
|
1056
1472
|
}
|
|
1057
|
-
|
|
1473
|
+
for (const patch of updater.removeTrackedQueries(budgetEvictedQueryIDs)) await pokers.addPatch(patch);
|
|
1474
|
+
for (const queryID of budgetEvictedQueryIDs) {
|
|
1475
|
+
this.#pipelines.removeQuery(queryID);
|
|
1476
|
+
this.#inspectorDelegate.removeQuery(queryID);
|
|
1477
|
+
this.#queryReplacements.delete(queryID);
|
|
1478
|
+
}
|
|
1479
|
+
this.#recordHydrationBudgetExhaustion(lc, hydrationBudget, hydrationPassStats.activeHydratedQueries, hydrationPassStats.inactiveHydratedQueries, budgetEvictedQueryIDs);
|
|
1058
1480
|
this.#logQueryCoverageShadowSummary(lc, "add", totalHydratedQueries, coveredHydratedQueries, firstCoveredQuery);
|
|
1059
1481
|
await startAsyncSpan(tracer, "vs.#syncQueryPipelineSet.deleteUnreferencedRows", async () => {
|
|
1060
1482
|
for (const patch of await updater.deleteUnreferencedRows(lc)) await pokers.addPatch(patch);
|
|
1061
1483
|
});
|
|
1062
|
-
this.#cvr = await this.#
|
|
1484
|
+
this.#cvr = await this.#flushPoked(lc, updater, pokers);
|
|
1485
|
+
if (budgetEvictedQueryIDs.length > 0) this.#scheduleExpireEviction(lc, this.#cvr);
|
|
1063
1486
|
const finalVersion = this.#cvr.version;
|
|
1064
|
-
await this.#catchupClients(lc, cvr, finalVersion,
|
|
1487
|
+
await this.#catchupClients(lc, cvr, finalVersion, hydratedQueryIDs, pokers);
|
|
1065
1488
|
await startAsyncSpan(tracer, "vs.#syncQueryPipelineSet.pokeEnd", () => pokers.end(finalVersion));
|
|
1066
1489
|
this.#markVersionServed(stateVersion);
|
|
1067
1490
|
const wallTime = performance.now() - start;
|
|
@@ -1090,7 +1513,7 @@ var ViewSyncerService = class {
|
|
|
1090
1513
|
return startAsyncSpan(tracer, "vs.#catchupClients", async (span) => {
|
|
1091
1514
|
current ??= cvr.version;
|
|
1092
1515
|
const clients = this.#getClients();
|
|
1093
|
-
const pokers = usePokers ?? startPoke(clients, cvr.version);
|
|
1516
|
+
const pokers = usePokers ?? startPoke(lc, clients, cvr.version);
|
|
1094
1517
|
span.setAttribute("numClients", clients.length);
|
|
1095
1518
|
const catchupFrom = clients.map((c) => c.version()).reduce((a, b) => cmpVersions(a, b) < 0 ? a : b, cvr.version);
|
|
1096
1519
|
const rowPatches = this.#cvrStore.catchupRowPatches(lc, catchupFrom, cvr, current, excludeQueryHashes);
|
|
@@ -1137,7 +1560,7 @@ var ViewSyncerService = class {
|
|
|
1137
1560
|
}
|
|
1138
1561
|
});
|
|
1139
1562
|
}
|
|
1140
|
-
#processChanges(lc, timer, changes,
|
|
1563
|
+
#processChanges(lc, timer, changes, onBatch, pokers) {
|
|
1141
1564
|
return startAsyncSpan(tracer, "vs.#processChanges", async () => {
|
|
1142
1565
|
const start = performance.now();
|
|
1143
1566
|
const rows = new CustomKeyMap(rowIDString);
|
|
@@ -1146,7 +1569,7 @@ var ViewSyncerService = class {
|
|
|
1146
1569
|
const wallElapsed = performance.now() - start;
|
|
1147
1570
|
total += rows.size;
|
|
1148
1571
|
lc.debug?.(`processing ${rows.size} (of ${total}) rows (${wallElapsed} ms)`);
|
|
1149
|
-
const patches = await
|
|
1572
|
+
const patches = await onBatch(rows);
|
|
1150
1573
|
await startAsyncSpan(tracer, "processBatch.flushToClient", async (span) => {
|
|
1151
1574
|
span.setAttribute("patches", patches.length);
|
|
1152
1575
|
for (const patch of patches) await pokers.addPatch(patch);
|
|
@@ -1212,29 +1635,60 @@ var ViewSyncerService = class {
|
|
|
1212
1635
|
assert(this.#pipelines.initialized(), "pipelines must be initialized (advancePipelines");
|
|
1213
1636
|
const start = performance.now();
|
|
1214
1637
|
const timer = new TimeSliceTimer(lc);
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
const updater = new CVRQueryDrivenUpdater(this.#cvrStore, cvr, version, this.#pipelines.replicaVersion, (queryID) => this.#pipelines.rowSetSignature(queryID));
|
|
1218
|
-
const pokers = startPoke(this.#getClients(cvr.version), updater.updatedVersion());
|
|
1219
|
-
lc.debug?.(`applying ${numChanges} to advance to ${version}`);
|
|
1638
|
+
let outcome = { outcome: "error" };
|
|
1639
|
+
let setupTimeMs;
|
|
1220
1640
|
try {
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1641
|
+
let pokers;
|
|
1642
|
+
let updater;
|
|
1643
|
+
let version;
|
|
1644
|
+
let numChanges = 0;
|
|
1645
|
+
try {
|
|
1646
|
+
const advancement = this.#pipelines.advance(timer);
|
|
1647
|
+
version = advancement.version;
|
|
1648
|
+
numChanges = advancement.numChanges;
|
|
1649
|
+
lc = lc.withContext("newVersion", version);
|
|
1650
|
+
const targetVersion = cmpVersions(cvr.version, { stateVersion: version }) < 0 ? { stateVersion: version } : cvr.version;
|
|
1651
|
+
pokers = startPoke(lc, this.#getClients(cvr.version), targetVersion);
|
|
1652
|
+
lc.debug?.(`applying ${numChanges} to advance to ${version}`);
|
|
1653
|
+
setupTimeMs = performance.now() - start;
|
|
1654
|
+
await this.#processChanges(lc, await timer.start(), advancement.changes, (rows) => {
|
|
1655
|
+
updater ??= new CVRQueryDrivenUpdater(this.#cvrStore, cvr, version, this.#pipelines.replicaVersion, this.#pipelines);
|
|
1656
|
+
return updater.received(lc, rows);
|
|
1657
|
+
}, pokers);
|
|
1658
|
+
} catch (e) {
|
|
1659
|
+
setupTimeMs ??= performance.now() - start;
|
|
1660
|
+
if (e instanceof ResetPipelinesSignal) {
|
|
1661
|
+
await pokers?.cancel();
|
|
1662
|
+
this.#cvrStore.discardPending();
|
|
1663
|
+
outcome = {
|
|
1664
|
+
outcome: "reset",
|
|
1665
|
+
reason: e.reason
|
|
1666
|
+
};
|
|
1667
|
+
return e;
|
|
1668
|
+
}
|
|
1669
|
+
throw e;
|
|
1226
1670
|
}
|
|
1227
|
-
|
|
1671
|
+
assert(pokers && version !== void 0, "advancement state missing");
|
|
1672
|
+
if (updater) this.#cvr = await this.#flushPoked(lc, updater, pokers);
|
|
1673
|
+
const finalVersion = (this.#cvr ?? cvr).version;
|
|
1674
|
+
await startAsyncSpan(tracer, "vs.#advancePipelines.pokeEnd", () => pokers.end(finalVersion));
|
|
1675
|
+
this.#markVersionServed(version);
|
|
1676
|
+
const wallTime = performance.now() - start;
|
|
1677
|
+
const totalProcessTime = timer.totalElapsed();
|
|
1678
|
+
lc.debug?.(`finished processing advancement of ${numChanges} changes ((process: ${totalProcessTime} ms, wall: ${wallTime} ms))`);
|
|
1679
|
+
this.#transactionAdvanceTime.recordMs(totalProcessTime);
|
|
1680
|
+
outcome = { outcome: "success" };
|
|
1681
|
+
return "success";
|
|
1682
|
+
} finally {
|
|
1683
|
+
const setupMs = must(setupTimeMs);
|
|
1684
|
+
const processingTimeMs = setupMs + timer.totalElapsed();
|
|
1685
|
+
const wallTimeMs = performance.now() - start;
|
|
1686
|
+
this.#advancementMetrics.record({
|
|
1687
|
+
processingTimeMs,
|
|
1688
|
+
setupTimeMs: setupMs,
|
|
1689
|
+
wallTimeMs
|
|
1690
|
+
}, outcome);
|
|
1228
1691
|
}
|
|
1229
|
-
this.#cvr = await this.#flushUpdater(lc, updater);
|
|
1230
|
-
const finalVersion = this.#cvr.version;
|
|
1231
|
-
await startAsyncSpan(tracer, "vs.#advancePipelines.pokeEnd", () => pokers.end(finalVersion));
|
|
1232
|
-
this.#markVersionServed(version);
|
|
1233
|
-
const wallTime = performance.now() - start;
|
|
1234
|
-
const totalProcessTime = timer.totalElapsed();
|
|
1235
|
-
lc.debug?.(`finished processing advancement of ${numChanges} changes ((process: ${totalProcessTime} ms, wall: ${wallTime} ms))`);
|
|
1236
|
-
this.#transactionAdvanceTime.recordMs(totalProcessTime);
|
|
1237
|
-
return "success";
|
|
1238
1692
|
});
|
|
1239
1693
|
}
|
|
1240
1694
|
async inspect(selector, msg) {
|
|
@@ -1246,7 +1700,7 @@ var ViewSyncerService = class {
|
|
|
1246
1700
|
clientID,
|
|
1247
1701
|
wsID: client.wsID
|
|
1248
1702
|
});
|
|
1249
|
-
return handleInspect(lc, body, cvr, client, this.#inspectorDelegate, this.id, this.#cvrStore, this.#config, connCtx);
|
|
1703
|
+
return handleInspect(lc, body, cvr, client, this.#inspectorDelegate, this.id, this, this.#cvrStore, this.#config, connCtx);
|
|
1250
1704
|
};
|
|
1251
1705
|
async #runBackgroundRetransform(lc) {
|
|
1252
1706
|
const attemptRetransform = async (connCtx) => {
|
|
@@ -1333,15 +1787,18 @@ var ViewSyncerService = class {
|
|
|
1333
1787
|
return this.#stopped.promise;
|
|
1334
1788
|
}
|
|
1335
1789
|
async #cleanup(err) {
|
|
1790
|
+
this.#shuttingDown = true;
|
|
1336
1791
|
this.connContextManager.setSharedRetransformReady(false);
|
|
1337
1792
|
this.#stopTTLClockInterval();
|
|
1338
1793
|
this.#stopExpireTimer();
|
|
1339
1794
|
this.#stopAuthMaintenanceTimer();
|
|
1795
|
+
this.#stopShutdownTimer();
|
|
1340
1796
|
this.#customQueryTransformer?.destroy();
|
|
1341
1797
|
for (const client of this.#clients.values()) if (err) client.fail(err);
|
|
1342
1798
|
else client.close(`closed clientGroupID=${this.id}`);
|
|
1343
1799
|
await this.#lock.withLock(() => {});
|
|
1344
1800
|
this.#pipelines.destroy();
|
|
1801
|
+
this.#inspectorDelegate.clearAuthenticated(this.id, this);
|
|
1345
1802
|
}
|
|
1346
1803
|
/**
|
|
1347
1804
|
* Test helper: Manually mark initialization as complete.
|
|
@@ -1377,8 +1834,10 @@ function isTransformFailedError(error) {
|
|
|
1377
1834
|
return error.errorBody.kind === "TransformFailed" && !isAuthErrorBody(error.errorBody);
|
|
1378
1835
|
}
|
|
1379
1836
|
/**
|
|
1380
|
-
* A query must be expired for all clients
|
|
1381
|
-
* expired.
|
|
1837
|
+
* Whether a query's TTL has elapsed. A query must be expired for all clients
|
|
1838
|
+
* in order to be considered expired.
|
|
1839
|
+
*
|
|
1840
|
+
* Exported for testing.
|
|
1382
1841
|
*/
|
|
1383
1842
|
function expired(ttlClock, q) {
|
|
1384
1843
|
if (q.type === "internal") return false;
|