@rocicorp/zero 1.3.0 → 1.4.0-canary.0
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.d.ts +24 -0
- package/out/analyze-query/src/analyze-cli.d.ts.map +1 -0
- package/out/analyze-query/src/analyze-cli.js +279 -0
- package/out/analyze-query/src/analyze-cli.js.map +1 -0
- package/out/analyze-query/src/bin-analyze.js +6 -6
- package/out/analyze-query/src/bin-transform.js +2 -2
- package/out/ast-to-zql/src/bin.js +1 -1
- package/out/shared/src/logging.d.ts.map +1 -1
- package/out/shared/src/logging.js +1 -1
- package/out/shared/src/logging.js.map +1 -1
- package/out/shared/src/options.d.ts.map +1 -1
- package/out/shared/src/options.js +1 -1
- package/out/shared/src/options.js.map +1 -1
- package/out/z2s/src/compiler.d.ts.map +1 -1
- package/out/z2s/src/compiler.js +4 -1
- 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 +1 -0
- package/out/z2s/src/sql.js.map +1 -1
- package/out/zero/package.js +95 -89
- package/out/zero/package.js.map +1 -1
- package/out/zero/src/analyze.d.ts +2 -0
- package/out/zero/src/analyze.d.ts.map +1 -0
- package/out/zero/src/analyze.js +2 -0
- package/out/zero/src/zero-cache-dev.js +1 -1
- package/out/zero/src/zero-cache-dev.js.map +1 -1
- package/out/zero/src/zero-out.js +1 -1
- package/out/zero-cache/src/auth/auth.d.ts.map +1 -1
- package/out/zero-cache/src/auth/auth.js.map +1 -1
- package/out/zero-cache/src/auth/load-permissions.js +2 -2
- package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.js +5 -14
- package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
- package/out/zero-cache/src/config/network.d.ts +1 -1
- package/out/zero-cache/src/config/network.d.ts.map +1 -1
- package/out/zero-cache/src/config/network.js +1 -1
- package/out/zero-cache/src/config/network.js.map +1 -1
- package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
- package/out/zero-cache/src/config/normalize.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +5 -0
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +16 -3
- package/out/zero-cache/src/config/zero-config.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 -3
- package/out/zero-cache/src/db/lite-tables.js.map +1 -1
- package/out/zero-cache/src/db/transaction-pool.d.ts +43 -40
- package/out/zero-cache/src/db/transaction-pool.d.ts.map +1 -1
- package/out/zero-cache/src/db/transaction-pool.js +76 -56
- package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
- package/out/zero-cache/src/observability/events.d.ts.map +1 -1
- package/out/zero-cache/src/observability/events.js +1 -1
- package/out/zero-cache/src/observability/events.js.map +1 -1
- package/out/zero-cache/src/scripts/decommission.js +1 -1
- package/out/zero-cache/src/scripts/deploy-permissions.js +2 -2
- package/out/zero-cache/src/scripts/permissions.js +1 -1
- package/out/zero-cache/src/server/anonymous-otel-start.d.ts.map +1 -1
- package/out/zero-cache/src/server/anonymous-otel-start.js +4 -4
- package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
- package/out/zero-cache/src/server/change-streamer.d.ts +1 -1
- package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/server/change-streamer.js +27 -12
- package/out/zero-cache/src/server/change-streamer.js.map +1 -1
- package/out/zero-cache/src/server/logging.d.ts +1 -3
- package/out/zero-cache/src/server/logging.d.ts.map +1 -1
- package/out/zero-cache/src/server/logging.js +6 -3
- package/out/zero-cache/src/server/logging.js.map +1 -1
- package/out/zero-cache/src/server/main.d.ts.map +1 -1
- package/out/zero-cache/src/server/main.js +26 -26
- package/out/zero-cache/src/server/main.js.map +1 -1
- package/out/zero-cache/src/server/mutator.js +4 -2
- package/out/zero-cache/src/server/mutator.js.map +1 -1
- package/out/zero-cache/src/server/otel-log-sink.d.ts.map +1 -1
- package/out/zero-cache/src/server/otel-log-sink.js +0 -2
- package/out/zero-cache/src/server/otel-log-sink.js.map +1 -1
- package/out/zero-cache/src/server/otel-start.d.ts +1 -1
- package/out/zero-cache/src/server/otel-start.d.ts.map +1 -1
- package/out/zero-cache/src/server/otel-start.js +7 -3
- package/out/zero-cache/src/server/otel-start.js.map +1 -1
- package/out/zero-cache/src/server/reaper.js +6 -6
- package/out/zero-cache/src/server/reaper.js.map +1 -1
- package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/server/replicator.js +5 -3
- package/out/zero-cache/src/server/replicator.js.map +1 -1
- package/out/zero-cache/src/server/runner/run-worker.js +2 -2
- package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
- package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/server/syncer.js +13 -12
- package/out/zero-cache/src/server/syncer.js.map +1 -1
- package/out/zero-cache/src/server/worker-dispatcher.js +1 -1
- package/out/zero-cache/src/services/analyze.js +1 -1
- package/out/zero-cache/src/services/change-source/common/backfill-manager.js +1 -1
- package/out/zero-cache/src/services/change-source/common/replica-schema.js +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.js +4 -4
- 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.js +4 -1
- 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.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.js +19 -23
- 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 +58 -3
- 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 +209 -52
- 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.js +2 -2
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +24 -15
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +35 -58
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.js +2 -2
- package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts +1 -2
- package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/published.js +15 -18
- package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/data.js +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-monitor.js +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +1 -1
- 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 +4 -4
- 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 +5 -1
- 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 +10 -7
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/replica-monitor.js +2 -2
- package/out/zero-cache/src/services/change-streamer/storer.d.ts +19 -2
- package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js +70 -6
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
- package/out/zero-cache/src/services/heapz.d.ts.map +1 -1
- package/out/zero-cache/src/services/heapz.js +1 -1
- package/out/zero-cache/src/services/heapz.js.map +1 -1
- package/out/zero-cache/src/services/life-cycle.d.ts +2 -1
- package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
- package/out/zero-cache/src/services/life-cycle.js +10 -7
- package/out/zero-cache/src/services/life-cycle.js.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.d.ts +15 -4
- package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.js +40 -34
- package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js +3 -3
- package/out/zero-cache/src/services/mutagen/pusher.d.ts +28 -28
- package/out/zero-cache/src/services/replicator/change-processor.js +2 -2
- package/out/zero-cache/src/services/replicator/incremental-sync.js +1 -1
- package/out/zero-cache/src/services/replicator/schema/replication-state.js +1 -1
- package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
- package/out/zero-cache/src/services/replicator/write-worker.js +3 -3
- package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
- package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
- package/out/zero-cache/src/services/run-ast.js +2 -2
- package/out/zero-cache/src/services/run-ast.js.map +1 -1
- package/out/zero-cache/src/services/statz.d.ts.map +1 -1
- package/out/zero-cache/src/services/statz.js +3 -3
- package/out/zero-cache/src/services/statz.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/active-users-gauge.js +1 -1
- package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts +2 -2
- 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.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-purger.js +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.js +3 -3
- package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.js +1 -1
- package/out/zero-cache/src/services/view-syncer/inspect-handler.js +2 -2
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +6 -16
- 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 +30 -38
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/row-record-cache.js +4 -4
- package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.js +2 -2
- 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 +6 -6
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/profiler.d.ts.map +1 -1
- package/out/zero-cache/src/types/profiler.js.map +1 -1
- package/out/zero-cache/src/types/row-key.d.ts.map +1 -1
- package/out/zero-cache/src/types/row-key.js.map +1 -1
- package/out/zero-cache/src/types/streams.d.ts +1 -1
- package/out/zero-cache/src/types/streams.d.ts.map +1 -1
- package/out/zero-cache/src/types/streams.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 +1 -1
- package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
- package/out/zero-cache/src/workers/connection.d.ts +1 -1
- package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
- package/out/zero-cache/src/workers/connection.js +2 -2
- package/out/zero-cache/src/workers/connection.js.map +1 -1
- package/out/zero-cache/src/workers/mutator.js.map +1 -1
- package/out/zero-cache/src/workers/syncer.d.ts +1 -1
- package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/workers/syncer.js +3 -3
- package/out/zero-cache/src/workers/syncer.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 +4 -13
- package/out/zero-client/src/client/crud-impl.js.map +1 -1
- package/out/zero-client/src/client/inspector/inspector.d.ts +24 -0
- package/out/zero-client/src/client/inspector/inspector.d.ts.map +1 -1
- package/out/zero-client/src/client/inspector/inspector.js +28 -0
- package/out/zero-client/src/client/inspector/inspector.js.map +1 -1
- package/out/zero-client/src/client/inspector/lazy-inspector.d.ts +9 -0
- package/out/zero-client/src/client/inspector/lazy-inspector.d.ts.map +1 -1
- package/out/zero-client/src/client/inspector/lazy-inspector.js +28 -1
- package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -1
- package/out/zero-client/src/client/ivm-branch.d.ts.map +1 -1
- package/out/zero-client/src/client/ivm-branch.js +4 -13
- package/out/zero-client/src/client/ivm-branch.js.map +1 -1
- package/out/zero-client/src/client/version.js +1 -1
- package/out/zero-protocol/src/error.d.ts.map +1 -1
- package/out/zero-protocol/src/error.js +1 -1
- package/out/zero-protocol/src/error.js.map +1 -1
- package/out/zero-solid/src/solid-view.d.ts.map +1 -1
- package/out/zero-solid/src/solid-view.js +13 -13
- package/out/zero-solid/src/solid-view.js.map +1 -1
- package/out/zql/src/builder/builder.d.ts.map +1 -1
- package/out/zql/src/builder/builder.js.map +1 -1
- package/out/zql/src/ivm/array-view.d.ts.map +1 -1
- package/out/zql/src/ivm/array-view.js +26 -1
- package/out/zql/src/ivm/array-view.js.map +1 -1
- package/out/zql/src/ivm/change-index-enum.d.ts +9 -0
- package/out/zql/src/ivm/change-index-enum.d.ts.map +1 -0
- package/out/zql/src/ivm/change-index.d.ts +5 -0
- package/out/zql/src/ivm/change-index.d.ts.map +1 -0
- package/out/zql/src/ivm/change-type-enum.d.ts +9 -0
- package/out/zql/src/ivm/change-type-enum.d.ts.map +1 -0
- package/out/zql/src/ivm/change-type.d.ts +5 -0
- package/out/zql/src/ivm/change-type.d.ts.map +1 -0
- package/out/zql/src/ivm/change.d.ts +20 -22
- package/out/zql/src/ivm/change.d.ts.map +1 -1
- package/out/zql/src/ivm/change.js +33 -0
- package/out/zql/src/ivm/change.js.map +1 -0
- package/out/zql/src/ivm/exists.d.ts.map +1 -1
- package/out/zql/src/ivm/exists.js +27 -38
- package/out/zql/src/ivm/exists.js.map +1 -1
- package/out/zql/src/ivm/fan-in.d.ts +3 -2
- package/out/zql/src/ivm/fan-in.d.ts.map +1 -1
- package/out/zql/src/ivm/fan-in.js.map +1 -1
- package/out/zql/src/ivm/fan-out.d.ts +1 -1
- package/out/zql/src/ivm/fan-out.d.ts.map +1 -1
- package/out/zql/src/ivm/fan-out.js +1 -1
- package/out/zql/src/ivm/fan-out.js.map +1 -1
- package/out/zql/src/ivm/filter-operators.d.ts +3 -3
- package/out/zql/src/ivm/filter-operators.d.ts.map +1 -1
- package/out/zql/src/ivm/filter-operators.js.map +1 -1
- package/out/zql/src/ivm/filter-push.d.ts.map +1 -1
- package/out/zql/src/ivm/filter-push.js +7 -7
- package/out/zql/src/ivm/filter-push.js.map +1 -1
- package/out/zql/src/ivm/filter.d.ts +1 -1
- package/out/zql/src/ivm/filter.d.ts.map +1 -1
- package/out/zql/src/ivm/filter.js.map +1 -1
- package/out/zql/src/ivm/flipped-join.d.ts.map +1 -1
- package/out/zql/src/ivm/flipped-join.js +49 -58
- package/out/zql/src/ivm/flipped-join.js.map +1 -1
- package/out/zql/src/ivm/join-utils.d.ts +2 -6
- package/out/zql/src/ivm/join-utils.d.ts.map +1 -1
- package/out/zql/src/ivm/join-utils.js +25 -25
- package/out/zql/src/ivm/join-utils.js.map +1 -1
- package/out/zql/src/ivm/join.d.ts.map +1 -1
- package/out/zql/src/ivm/join.js +32 -51
- 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 +5 -10
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
- package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-source.js +51 -59
- package/out/zql/src/ivm/memory-source.js.map +1 -1
- package/out/zql/src/ivm/push-accumulated.d.ts +3 -2
- package/out/zql/src/ivm/push-accumulated.d.ts.map +1 -1
- package/out/zql/src/ivm/push-accumulated.js +98 -122
- package/out/zql/src/ivm/push-accumulated.js.map +1 -1
- package/out/zql/src/ivm/skip.d.ts +1 -1
- package/out/zql/src/ivm/skip.d.ts.map +1 -1
- package/out/zql/src/ivm/skip.js +2 -2
- package/out/zql/src/ivm/skip.js.map +1 -1
- package/out/zql/src/ivm/source-change-index-enum.d.ts +7 -0
- package/out/zql/src/ivm/source-change-index-enum.d.ts.map +1 -0
- package/out/zql/src/ivm/source-change-index.d.ts +5 -0
- package/out/zql/src/ivm/source-change-index.d.ts.map +1 -0
- package/out/zql/src/ivm/source.d.ts +11 -13
- package/out/zql/src/ivm/source.d.ts.map +1 -1
- package/out/zql/src/ivm/source.js +26 -0
- package/out/zql/src/ivm/source.js.map +1 -0
- package/out/zql/src/ivm/take.d.ts.map +1 -1
- package/out/zql/src/ivm/take.js +27 -50
- package/out/zql/src/ivm/take.js.map +1 -1
- package/out/zql/src/ivm/union-fan-in.d.ts +2 -1
- package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
- package/out/zql/src/ivm/union-fan-in.js +3 -3
- package/out/zql/src/ivm/union-fan-in.js.map +1 -1
- package/out/zql/src/ivm/union-fan-out.d.ts.map +1 -1
- package/out/zql/src/ivm/union-fan-out.js +1 -1
- package/out/zql/src/ivm/union-fan-out.js.map +1 -1
- package/out/zql/src/planner/planner-debug.d.ts +2 -2
- package/out/zql/src/planner/planner-debug.d.ts.map +1 -1
- package/out/zql/src/planner/planner-debug.js.map +1 -1
- package/out/zql/src/planner/planner-graph.d.ts +1 -1
- package/out/zql/src/planner/planner-graph.d.ts.map +1 -1
- package/out/zql/src/planner/planner-graph.js.map +1 -1
- package/out/zqlite/src/internal/sql-inline.d.ts.map +1 -1
- package/out/zqlite/src/internal/sql-inline.js.map +1 -1
- package/out/zqlite/src/query-builder.d.ts.map +1 -1
- package/out/zqlite/src/query-builder.js.map +1 -1
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +11 -11
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +99 -93
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import type { ReadonlyJSONValue } from '../../../../shared/src/json.ts';
|
|
1
2
|
import type { AnalyzeQueryResult, PlanDebugEventJSON } from '../../../../zero-protocol/src/analyze-query-result.ts';
|
|
3
|
+
import type { AST } from '../../../../zero-protocol/src/ast.ts';
|
|
2
4
|
import type { AnalyzeQueryOptions } from '../../../../zero-protocol/src/inspect-up.ts';
|
|
3
5
|
import type { QueryDelegate } from '../../../../zql/src/query/query-delegate.ts';
|
|
4
6
|
import type { AnyQuery } from '../../../../zql/src/query/query.ts';
|
|
@@ -17,6 +19,28 @@ export declare class Inspector {
|
|
|
17
19
|
clientsWithQueries(): Promise<Client[]>;
|
|
18
20
|
serverVersion(): Promise<string>;
|
|
19
21
|
analyzeQuery(query: AnyQuery, options?: AnalyzeQueryOptions): Promise<AnalyzeQueryResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Analyze a query specified by a server-side AST. Unlike {@link analyzeQuery}
|
|
24
|
+
* the AST is sent to the server verbatim with no client-to-server name
|
|
25
|
+
* mapping; callers should provide an AST already in the server shape.
|
|
26
|
+
*/
|
|
27
|
+
analyzeServerAST(ast: AST, options?: AnalyzeQueryOptions): Promise<AnalyzeQueryResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Analyze a server-registered named (custom) query. The server resolves
|
|
30
|
+
* the name and args to an AST using its registered custom-query handler.
|
|
31
|
+
*/
|
|
32
|
+
analyzeNamedQuery(name: string, args: ReadonlyArray<ReadonlyJSONValue>, options?: AnalyzeQueryOptions): Promise<AnalyzeQueryResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Authenticate with the server's admin password. Other inspector RPCs
|
|
35
|
+
* (e.g. {@link analyzeQuery}) fall back to an interactive HTML password
|
|
36
|
+
* prompt when authentication is needed, which is unavailable in non-DOM
|
|
37
|
+
* environments. Call this first from Node contexts to establish the
|
|
38
|
+
* session.
|
|
39
|
+
*
|
|
40
|
+
* Returns `true` if the password is accepted (or the server runs in a
|
|
41
|
+
* development mode that bypasses the check), `false` otherwise.
|
|
42
|
+
*/
|
|
43
|
+
authenticate(password: string): Promise<boolean>;
|
|
20
44
|
/**
|
|
21
45
|
* Format planner debug events as a human-readable string.
|
|
22
46
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../../../../../../zero-client/src/client/inspector/inspector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,uDAAuD,CAAC;AAC/D,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,6CAA6C,CAAC;AAErF,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,6CAA6C,CAAC;AAC/E,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,oCAAoC,CAAC;AACjE,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,EAEV,iBAAiB,EACjB,OAAO,EACP,GAAG,EACJ,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EAAC,iBAAiB,EAAC,CAAC;AAGhC,MAAM,MAAM,IAAI,GAAG,cAAc,qBAAqB,CAAC,CAAC;AAExD,qBAAa,SAAS;;IAEpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;gBAGhC,GAAG,EAAE,GAAG,EACR,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC;IAqB/B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAI3B,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI5B,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAMvC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAIhC,YAAY,CAChB,KAAK,EAAE,QAAQ,EACf,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IAQ9B;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM;CAG1D"}
|
|
1
|
+
{"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../../../../../../zero-client/src/client/inspector/inspector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,uDAAuD,CAAC;AAC/D,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,sCAAsC,CAAC;AAC9D,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,6CAA6C,CAAC;AAErF,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,6CAA6C,CAAC;AAC/E,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,oCAAoC,CAAC;AACjE,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,EAEV,iBAAiB,EACjB,OAAO,EACP,GAAG,EACJ,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EAAC,iBAAiB,EAAC,CAAC;AAGhC,MAAM,MAAM,IAAI,GAAG,cAAc,qBAAqB,CAAC,CAAC;AAExD,qBAAa,SAAS;;IAEpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;gBAGhC,GAAG,EAAE,GAAG,EACR,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC;IAqB/B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAI3B,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI5B,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAMvC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAIhC,YAAY,CAChB,KAAK,EAAE,QAAQ,EACf,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IAQ9B;;;;OAIG;IACG,gBAAgB,CACpB,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IAQ9B;;;OAGG;IACG,iBAAiB,CACrB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,CAAC,iBAAiB,CAAC,EACtC,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IAS9B;;;;;;;;;OASG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAItD;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM;CAG1D"}
|
|
@@ -37,6 +37,34 @@ var Inspector = class {
|
|
|
37
37
|
return (await this.#delegate.lazy).analyzeQuery(this.#delegate, query, options);
|
|
38
38
|
}
|
|
39
39
|
/**
|
|
40
|
+
* Analyze a query specified by a server-side AST. Unlike {@link analyzeQuery}
|
|
41
|
+
* the AST is sent to the server verbatim with no client-to-server name
|
|
42
|
+
* mapping; callers should provide an AST already in the server shape.
|
|
43
|
+
*/
|
|
44
|
+
async analyzeServerAST(ast, options) {
|
|
45
|
+
return (await this.#delegate.lazy).analyzeServerAST(this.#delegate, ast, options);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Analyze a server-registered named (custom) query. The server resolves
|
|
49
|
+
* the name and args to an AST using its registered custom-query handler.
|
|
50
|
+
*/
|
|
51
|
+
async analyzeNamedQuery(name, args, options) {
|
|
52
|
+
return (await this.#delegate.lazy).analyzeNamedQuery(this.#delegate, name, args, options);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Authenticate with the server's admin password. Other inspector RPCs
|
|
56
|
+
* (e.g. {@link analyzeQuery}) fall back to an interactive HTML password
|
|
57
|
+
* prompt when authentication is needed, which is unavailable in non-DOM
|
|
58
|
+
* environments. Call this first from Node contexts to establish the
|
|
59
|
+
* session.
|
|
60
|
+
*
|
|
61
|
+
* Returns `true` if the password is accepted (or the server runs in a
|
|
62
|
+
* development mode that bypasses the check), `false` otherwise.
|
|
63
|
+
*/
|
|
64
|
+
async authenticate(password) {
|
|
65
|
+
return (await this.#delegate.lazy).authenticate(this.#delegate, password);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
40
68
|
* Format planner debug events as a human-readable string.
|
|
41
69
|
*/
|
|
42
70
|
formatPlannerEvents(events) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspector.js","names":["#delegate"],"sources":["../../../../../../zero-client/src/client/inspector/inspector.ts"],"sourcesContent":["import type {\n AnalyzeQueryResult,\n PlanDebugEventJSON,\n} from '../../../../zero-protocol/src/analyze-query-result.ts';\nimport type {AnalyzeQueryOptions} from '../../../../zero-protocol/src/inspect-up.ts';\nimport {formatPlannerEvents} from '../../../../zql/src/planner/planner-debug.ts';\nimport type {QueryDelegate} from '../../../../zql/src/query/query-delegate.ts';\nimport type {AnyQuery} from '../../../../zql/src/query/query.ts';\nimport type {ClientGroup} from './client-group.ts';\nimport {Client} from './client.ts';\nimport type {\n ExtendedInspectorDelegate,\n InspectorDelegate,\n Metrics,\n Rep,\n} from './lazy-inspector.ts';\n\nexport type {InspectorDelegate};\n\n// oxlint-disable-next-line consistent-type-imports\nexport type Lazy = typeof import('./lazy-inspector.ts');\n\nexport class Inspector {\n readonly #delegate: ExtendedInspectorDelegate;\n readonly client: Client;\n readonly clientGroup: ClientGroup;\n\n constructor(\n rep: Rep,\n inspectorDelegate: InspectorDelegate,\n queryDelegate: QueryDelegate,\n getSocket: () => Promise<WebSocket>,\n ) {\n this.#delegate = {\n getQueryMetrics:\n inspectorDelegate.getQueryMetrics.bind(inspectorDelegate),\n getAST: inspectorDelegate.getAST.bind(inspectorDelegate),\n mapClientASTToServer:\n inspectorDelegate.mapClientASTToServer.bind(inspectorDelegate),\n get metrics() {\n return inspectorDelegate.metrics;\n },\n queryDelegate,\n rep,\n getSocket,\n lazy: import('./lazy-inspector.ts'),\n };\n\n this.client = new Client(this.#delegate, rep.clientID, rep.clientGroupID);\n this.clientGroup = this.client.clientGroup;\n }\n\n async metrics(): Promise<Metrics> {\n return (await this.#delegate.lazy).inspectorMetrics(this.#delegate);\n }\n\n async clients(): Promise<Client[]> {\n return (await this.#delegate.lazy).inspectorClients(this.#delegate);\n }\n\n async clientsWithQueries(): Promise<Client[]> {\n return (await this.#delegate.lazy).inspectorClientsWithQueries(\n this.#delegate,\n );\n }\n\n async serverVersion(): Promise<string> {\n return (await this.#delegate.lazy).serverVersion(this.#delegate);\n }\n\n async analyzeQuery(\n query: AnyQuery,\n options?: AnalyzeQueryOptions,\n ): Promise<AnalyzeQueryResult> {\n return (await this.#delegate.lazy).analyzeQuery(\n this.#delegate,\n query,\n options,\n );\n }\n\n /**\n * Format planner debug events as a human-readable string.\n */\n formatPlannerEvents(events: PlanDebugEventJSON[]): string {\n return formatPlannerEvents(events);\n }\n}\n"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"inspector.js","names":["#delegate"],"sources":["../../../../../../zero-client/src/client/inspector/inspector.ts"],"sourcesContent":["import type {ReadonlyJSONValue} from '../../../../shared/src/json.ts';\nimport type {\n AnalyzeQueryResult,\n PlanDebugEventJSON,\n} from '../../../../zero-protocol/src/analyze-query-result.ts';\nimport type {AST} from '../../../../zero-protocol/src/ast.ts';\nimport type {AnalyzeQueryOptions} from '../../../../zero-protocol/src/inspect-up.ts';\nimport {formatPlannerEvents} from '../../../../zql/src/planner/planner-debug.ts';\nimport type {QueryDelegate} from '../../../../zql/src/query/query-delegate.ts';\nimport type {AnyQuery} from '../../../../zql/src/query/query.ts';\nimport type {ClientGroup} from './client-group.ts';\nimport {Client} from './client.ts';\nimport type {\n ExtendedInspectorDelegate,\n InspectorDelegate,\n Metrics,\n Rep,\n} from './lazy-inspector.ts';\n\nexport type {InspectorDelegate};\n\n// oxlint-disable-next-line consistent-type-imports\nexport type Lazy = typeof import('./lazy-inspector.ts');\n\nexport class Inspector {\n readonly #delegate: ExtendedInspectorDelegate;\n readonly client: Client;\n readonly clientGroup: ClientGroup;\n\n constructor(\n rep: Rep,\n inspectorDelegate: InspectorDelegate,\n queryDelegate: QueryDelegate,\n getSocket: () => Promise<WebSocket>,\n ) {\n this.#delegate = {\n getQueryMetrics:\n inspectorDelegate.getQueryMetrics.bind(inspectorDelegate),\n getAST: inspectorDelegate.getAST.bind(inspectorDelegate),\n mapClientASTToServer:\n inspectorDelegate.mapClientASTToServer.bind(inspectorDelegate),\n get metrics() {\n return inspectorDelegate.metrics;\n },\n queryDelegate,\n rep,\n getSocket,\n lazy: import('./lazy-inspector.ts'),\n };\n\n this.client = new Client(this.#delegate, rep.clientID, rep.clientGroupID);\n this.clientGroup = this.client.clientGroup;\n }\n\n async metrics(): Promise<Metrics> {\n return (await this.#delegate.lazy).inspectorMetrics(this.#delegate);\n }\n\n async clients(): Promise<Client[]> {\n return (await this.#delegate.lazy).inspectorClients(this.#delegate);\n }\n\n async clientsWithQueries(): Promise<Client[]> {\n return (await this.#delegate.lazy).inspectorClientsWithQueries(\n this.#delegate,\n );\n }\n\n async serverVersion(): Promise<string> {\n return (await this.#delegate.lazy).serverVersion(this.#delegate);\n }\n\n async analyzeQuery(\n query: AnyQuery,\n options?: AnalyzeQueryOptions,\n ): Promise<AnalyzeQueryResult> {\n return (await this.#delegate.lazy).analyzeQuery(\n this.#delegate,\n query,\n options,\n );\n }\n\n /**\n * Analyze a query specified by a server-side AST. Unlike {@link analyzeQuery}\n * the AST is sent to the server verbatim with no client-to-server name\n * mapping; callers should provide an AST already in the server shape.\n */\n async analyzeServerAST(\n ast: AST,\n options?: AnalyzeQueryOptions,\n ): Promise<AnalyzeQueryResult> {\n return (await this.#delegate.lazy).analyzeServerAST(\n this.#delegate,\n ast,\n options,\n );\n }\n\n /**\n * Analyze a server-registered named (custom) query. The server resolves\n * the name and args to an AST using its registered custom-query handler.\n */\n async analyzeNamedQuery(\n name: string,\n args: ReadonlyArray<ReadonlyJSONValue>,\n options?: AnalyzeQueryOptions,\n ): Promise<AnalyzeQueryResult> {\n return (await this.#delegate.lazy).analyzeNamedQuery(\n this.#delegate,\n name,\n args,\n options,\n );\n }\n\n /**\n * Authenticate with the server's admin password. Other inspector RPCs\n * (e.g. {@link analyzeQuery}) fall back to an interactive HTML password\n * prompt when authentication is needed, which is unavailable in non-DOM\n * environments. Call this first from Node contexts to establish the\n * session.\n *\n * Returns `true` if the password is accepted (or the server runs in a\n * development mode that bypasses the check), `false` otherwise.\n */\n async authenticate(password: string): Promise<boolean> {\n return (await this.#delegate.lazy).authenticate(this.#delegate, password);\n }\n\n /**\n * Format planner debug events as a human-readable string.\n */\n formatPlannerEvents(events: PlanDebugEventJSON[]): string {\n return formatPlannerEvents(events);\n }\n}\n"],"mappings":";;;AAwBA,IAAa,YAAb,MAAuB;CACrB;CACA;CACA;CAEA,YACE,KACA,mBACA,eACA,WACA;AACA,QAAA,WAAiB;GACf,iBACE,kBAAkB,gBAAgB,KAAK,kBAAkB;GAC3D,QAAQ,kBAAkB,OAAO,KAAK,kBAAkB;GACxD,sBACE,kBAAkB,qBAAqB,KAAK,kBAAkB;GAChE,IAAI,UAAU;AACZ,WAAO,kBAAkB;;GAE3B;GACA;GACA;GACA,MAAM,OAAO;GACd;AAED,OAAK,SAAS,IAAI,OAAO,MAAA,UAAgB,IAAI,UAAU,IAAI,cAAc;AACzE,OAAK,cAAc,KAAK,OAAO;;CAGjC,MAAM,UAA4B;AAChC,UAAQ,MAAM,MAAA,SAAe,MAAM,iBAAiB,MAAA,SAAe;;CAGrE,MAAM,UAA6B;AACjC,UAAQ,MAAM,MAAA,SAAe,MAAM,iBAAiB,MAAA,SAAe;;CAGrE,MAAM,qBAAwC;AAC5C,UAAQ,MAAM,MAAA,SAAe,MAAM,4BACjC,MAAA,SACD;;CAGH,MAAM,gBAAiC;AACrC,UAAQ,MAAM,MAAA,SAAe,MAAM,cAAc,MAAA,SAAe;;CAGlE,MAAM,aACJ,OACA,SAC6B;AAC7B,UAAQ,MAAM,MAAA,SAAe,MAAM,aACjC,MAAA,UACA,OACA,QACD;;;;;;;CAQH,MAAM,iBACJ,KACA,SAC6B;AAC7B,UAAQ,MAAM,MAAA,SAAe,MAAM,iBACjC,MAAA,UACA,KACA,QACD;;;;;;CAOH,MAAM,kBACJ,MACA,MACA,SAC6B;AAC7B,UAAQ,MAAM,MAAA,SAAe,MAAM,kBACjC,MAAA,UACA,MACA,MACA,QACD;;;;;;;;;;;;CAaH,MAAM,aAAa,UAAoC;AACrD,UAAQ,MAAM,MAAA,SAAe,MAAM,aAAa,MAAA,UAAgB,SAAS;;;;;CAM3E,oBAAoB,QAAsC;AACxD,SAAO,oBAAoB,OAAO"}
|
|
@@ -32,6 +32,15 @@ export declare function clientRows(delegate: ExtendedInspectorDelegate, clientID
|
|
|
32
32
|
export declare function serverVersion(delegate: ExtendedInspectorDelegate): Promise<string>;
|
|
33
33
|
export declare function clientQueries(delegate: ExtendedInspectorDelegate, clientID: string): Promise<Query[]>;
|
|
34
34
|
export declare function analyzeQuery(delegate: ExtendedInspectorDelegate, query: AnyQuery, options?: AnalyzeQueryOptions): Promise<AnalyzeQueryResult>;
|
|
35
|
+
export declare function analyzeServerAST(delegate: ExtendedInspectorDelegate, ast: AST, options?: AnalyzeQueryOptions): Promise<AnalyzeQueryResult>;
|
|
36
|
+
export declare function analyzeNamedQuery(delegate: ExtendedInspectorDelegate, name: string, args: ReadonlyArray<ReadonlyJSONValue>, options?: AnalyzeQueryOptions): Promise<AnalyzeQueryResult>;
|
|
37
|
+
/**
|
|
38
|
+
* Sends an `authenticate` op to the server. Returns `true` if the password
|
|
39
|
+
* is accepted (or the server is in a development mode that bypasses the
|
|
40
|
+
* check). Use this from Node contexts where the default interactive HTML
|
|
41
|
+
* prompt used by other inspector RPCs is not available.
|
|
42
|
+
*/
|
|
43
|
+
export declare function authenticate(delegate: ExtendedInspectorDelegate, password: string): Promise<boolean>;
|
|
35
44
|
export interface InspectorDelegate {
|
|
36
45
|
getQueryMetrics(hash: string): ClientMetrics | undefined;
|
|
37
46
|
getAST(queryID: string): AST | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy-inspector.d.ts","sourceRoot":"","sources":["../../../../../../zero-client/src/client/inspector/lazy-inspector.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lazy-inspector.d.ts","sourceRoot":"","sources":["../../../../../../zero-client/src/client/inspector/lazy-inspector.ts"],"names":[],"mappings":"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"}
|
|
@@ -176,8 +176,35 @@ async function analyzeQuery(delegate, query, options) {
|
|
|
176
176
|
options
|
|
177
177
|
}, inspectAnalyzeQueryDownSchema);
|
|
178
178
|
}
|
|
179
|
+
async function analyzeServerAST(delegate, ast, options) {
|
|
180
|
+
return rpc(await delegate.getSocket(), {
|
|
181
|
+
op: "analyze-query",
|
|
182
|
+
ast,
|
|
183
|
+
options
|
|
184
|
+
}, inspectAnalyzeQueryDownSchema);
|
|
185
|
+
}
|
|
186
|
+
async function analyzeNamedQuery(delegate, name, args, options) {
|
|
187
|
+
return rpc(await delegate.getSocket(), {
|
|
188
|
+
op: "analyze-query",
|
|
189
|
+
name,
|
|
190
|
+
args,
|
|
191
|
+
options
|
|
192
|
+
}, inspectAnalyzeQueryDownSchema);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Sends an `authenticate` op to the server. Returns `true` if the password
|
|
196
|
+
* is accepted (or the server is in a development mode that bypasses the
|
|
197
|
+
* check). Use this from Node contexts where the default interactive HTML
|
|
198
|
+
* prompt used by other inspector RPCs is not available.
|
|
199
|
+
*/
|
|
200
|
+
async function authenticate(delegate, password) {
|
|
201
|
+
return rpc(await delegate.getSocket(), {
|
|
202
|
+
op: "authenticate",
|
|
203
|
+
value: password
|
|
204
|
+
}, inspectAuthenticatedDownSchema);
|
|
205
|
+
}
|
|
179
206
|
var UnauthenticatedError = class extends Error {};
|
|
180
207
|
//#endregion
|
|
181
|
-
export { analyzeQuery, clientGroupClients, clientGroupClientsWithQueries, clientGroupQueries, clientMap, clientQueries, clientRows, inspectorClients, inspectorClientsWithQueries, inspectorMetrics, mergeMetrics, rpc, serverVersion };
|
|
208
|
+
export { analyzeNamedQuery, analyzeQuery, analyzeServerAST, authenticate, clientGroupClients, clientGroupClientsWithQueries, clientGroupQueries, clientMap, clientQueries, clientRows, inspectorClients, inspectorClientsWithQueries, inspectorMetrics, mergeMetrics, rpc, serverVersion };
|
|
182
209
|
|
|
183
210
|
//# sourceMappingURL=lazy-inspector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy-inspector.js","names":[],"sources":["../../../../../../zero-client/src/client/inspector/lazy-inspector.ts"],"sourcesContent":["import type {BTreeRead} from '../../../../replicache/src/btree/read.ts';\nimport type {Read} from '../../../../replicache/src/dag/store.ts';\nimport {readFromHash} from '../../../../replicache/src/db/read.ts';\nimport * as FormatVersion from '../../../../replicache/src/format-version-enum.ts';\nimport {getClientGroup} from '../../../../replicache/src/persist/client-groups.ts';\nimport {\n getClient,\n getClients,\n type ClientMap,\n} from '../../../../replicache/src/persist/clients.ts';\nimport type {ReplicacheImpl} from '../../../../replicache/src/replicache-impl.ts';\nimport {withRead} from '../../../../replicache/src/with-transactions.ts';\nimport {assert} from '../../../../shared/src/asserts.ts';\nimport type {ReadonlyJSONValue} from '../../../../shared/src/json.ts';\nimport {mapValues} from '../../../../shared/src/objects.ts';\nimport {TDigest, type ReadonlyTDigest} from '../../../../shared/src/tdigest.ts';\nimport * as valita from '../../../../shared/src/valita.ts';\nimport type {AnalyzeQueryResult} from '../../../../zero-protocol/src/analyze-query-result.ts';\nimport type {AST} from '../../../../zero-protocol/src/ast.ts';\nimport type {Row} from '../../../../zero-protocol/src/data.ts';\nimport {\n inspectAnalyzeQueryDownSchema,\n inspectAuthenticatedDownSchema,\n inspectMetricsDownSchema,\n inspectQueriesDownSchema,\n inspectVersionDownSchema,\n type InspectDownBody,\n type InspectQueryRow,\n type ServerMetrics as ServerMetricsJSON,\n} from '../../../../zero-protocol/src/inspect-down.ts';\nimport type {\n AnalyzeQueryOptions,\n InspectUpBody,\n} from '../../../../zero-protocol/src/inspect-up.ts';\nimport type {\n ClientMetricMap,\n ServerMetricMap,\n} from '../../../../zql/src/query/metrics-delegate.ts';\nimport type {QueryDelegate} from '../../../../zql/src/query/query-delegate.ts';\nimport {asQueryInternals} from '../../../../zql/src/query/query-internals.ts';\nimport type {AnyQuery} from '../../../../zql/src/query/query.ts';\nimport {nanoid} from '../../util/nanoid.ts';\nimport {ENTITIES_KEY_PREFIX} from '../keys.ts';\nimport type {MutatorDefs} from '../replicache-types.ts';\nimport {Client} from './client.ts';\nimport {createHTMLPasswordPrompt} from './html-dialog-prompt.ts';\nimport {type Lazy} from './inspector.ts';\nimport {Query} from './query.ts';\n\nexport type GetWebSocket = () => Promise<WebSocket>;\n\nexport type Metrics = {\n readonly [K in keyof (ClientMetricMap & ServerMetricMap)]: ReadonlyTDigest;\n};\n\ntype DistributiveOmit<T, K extends string> = T extends object\n ? Omit<T, K>\n : never;\n\nexport async function rpc<T extends InspectDownBody>(\n socket: WebSocket,\n arg: DistributiveOmit<InspectUpBody, 'id'>,\n downSchema: valita.Type<T>,\n): Promise<T['value']> {\n try {\n return await rpcNoAuthTry(socket, arg, downSchema);\n } catch (e) {\n if (e instanceof UnauthenticatedError) {\n const password = await createHTMLPasswordPrompt('Enter password:');\n if (password) {\n // Do authenticate rpc\n const authRes = await rpcNoAuthTry(\n socket,\n {op: 'authenticate', value: password},\n inspectAuthenticatedDownSchema,\n );\n if (authRes) {\n // If authentication is successful, retry the original RPC\n return rpcNoAuthTry(socket, arg, downSchema);\n }\n }\n throw new Error('Authentication failed');\n }\n throw e;\n }\n}\n\nfunction rpcNoAuthTry<T extends InspectDownBody>(\n socket: WebSocket,\n arg: DistributiveOmit<InspectUpBody, 'id'>,\n downSchema: valita.Type<T>,\n): Promise<T['value']> {\n return new Promise((resolve, reject) => {\n const id = nanoid();\n const f = (ev: MessageEvent) => {\n const msg = JSON.parse(ev.data);\n if (msg[0] === 'inspect') {\n const body = msg[1];\n if (body.id !== id) {\n return;\n }\n const res = valita.test(body, downSchema);\n if (res.ok) {\n if (res.value.op === 'error') {\n reject(new Error(res.value.value));\n } else {\n resolve(res.value.value);\n }\n } else {\n // Check if we got un authenticated/false response\n const authRes = valita.test(body, inspectAuthenticatedDownSchema);\n if (authRes.ok) {\n // Handle authenticated response\n assert(\n authRes.value.value === false,\n 'Expected unauthenticated response',\n );\n reject(new UnauthenticatedError());\n }\n\n reject(res.error);\n }\n socket.removeEventListener('message', f);\n }\n };\n socket.addEventListener('message', f);\n socket.send(JSON.stringify(['inspect', {...arg, id}]));\n });\n} // T extends forces T to be resolved\n\nexport function mergeMetrics(\n clientMetrics: ClientMetrics | undefined,\n serverMetrics: ServerMetricsJSON | null | undefined,\n): ClientMetrics & ServerMetrics {\n return {\n ...(clientMetrics ?? newClientMetrics()),\n ...(serverMetrics\n ? convertServerMetrics(serverMetrics)\n : newServerMetrics()),\n };\n}\n\nfunction newClientMetrics(): ClientMetrics {\n return {\n 'query-materialization-client': new TDigest(),\n 'query-materialization-end-to-end': new TDigest(),\n 'query-update-client': new TDigest(),\n };\n}\n\nfunction newServerMetrics(): ServerMetrics {\n return {\n 'query-materialization-server': new TDigest(),\n 'query-update-server': new TDigest(),\n };\n}\n\nfunction convertServerMetrics(metrics: ServerMetricsJSON): ServerMetrics {\n return mapValues(metrics, v => TDigest.fromJSON(v));\n}\n\nexport async function inspectorMetrics(\n delegate: ExtendedInspectorDelegate,\n): Promise<Metrics> {\n const clientMetrics = delegate.metrics;\n const serverMetricsJSON = await rpc(\n await delegate.getSocket(),\n {op: 'metrics'},\n inspectMetricsDownSchema,\n );\n return mergeMetrics(clientMetrics, serverMetricsJSON);\n}\n\nexport function inspectorClients(\n delegate: ExtendedInspectorDelegate,\n): Promise<Client[]> {\n return withDagRead(delegate, dagRead => clients(delegate, dagRead));\n}\n\nexport function inspectorClientsWithQueries(\n delegate: ExtendedInspectorDelegate,\n): Promise<Client[]> {\n return withDagRead(delegate, dagRead =>\n clientsWithQueries(delegate, dagRead),\n );\n}\n\nasync function withDagRead<T>(\n delegate: ExtendedInspectorDelegate,\n f: (dagRead: Read) => Promise<T>,\n): Promise<T> {\n const {rep} = delegate;\n await rep.refresh();\n await rep.persist();\n return withRead(rep.perdag, f);\n}\n\nasync function getBTree(dagRead: Read, clientID: string): Promise<BTreeRead> {\n const client = await getClient(clientID, dagRead);\n assert(client, `Client not found: ${clientID}`);\n const {clientGroupID} = client;\n const clientGroup = await getClientGroup(clientGroupID, dagRead);\n assert(clientGroup, `Client group not found: ${clientGroupID}`);\n const dbRead = await readFromHash(\n clientGroup.headHash,\n dagRead,\n FormatVersion.Latest,\n );\n return dbRead.map;\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype MapEntry<T extends ReadonlyMap<any, any>> =\n T extends ReadonlyMap<infer K, infer V> ? readonly [K, V] : never;\n\nasync function clients(\n delegate: ExtendedInspectorDelegate,\n dagRead: Read,\n predicate: (entry: MapEntry<ClientMap>) => boolean = () => true,\n): Promise<Client[]> {\n const clients = await getClients(dagRead);\n return [...clients.entries()]\n .filter(predicate)\n .map(\n ([clientID, {clientGroupID}]) =>\n new Client(delegate, clientID, clientGroupID),\n );\n}\n\nasync function clientsWithQueries(\n delegate: ExtendedInspectorDelegate,\n dagRead: Read,\n predicate: (entry: MapEntry<ClientMap>) => boolean = () => true,\n): Promise<Client[]> {\n const allClients = await clients(delegate, dagRead, predicate);\n const clientsWithQueries: Client[] = [];\n await Promise.all(\n allClients.map(async client => {\n const queries = await client.queries();\n if (queries.length > 0) {\n clientsWithQueries.push(client);\n }\n }),\n );\n return clientsWithQueries;\n}\n\nexport async function clientGroupClients(\n delegate: ExtendedInspectorDelegate,\n clientGroupID: Promise<string> | string,\n): Promise<Client[]> {\n const id = await clientGroupID;\n return withDagRead(delegate, dagRead =>\n clients(delegate, dagRead, ([_, v]) => v.clientGroupID === id),\n );\n}\n\nexport async function clientGroupClientsWithQueries(\n delegate: ExtendedInspectorDelegate,\n clientGroupID: Promise<string> | string,\n): Promise<Client[]> {\n const id = await clientGroupID;\n return withDagRead(delegate, dagRead =>\n clientsWithQueries(delegate, dagRead, ([_, v]) => v.clientGroupID === id),\n );\n}\n\nexport function clientGroupQueries(\n delegate: ExtendedInspectorDelegate,\n): Promise<Query[]> {\n return queries(delegate, {op: 'queries'});\n}\nexport function clientMap(\n delegate: ExtendedInspectorDelegate,\n clientID: string,\n): Promise<Map<string, ReadonlyJSONValue>> {\n return withDagRead(delegate, async dagRead => {\n const tree = await getBTree(dagRead, clientID);\n const map = new Map<string, ReadonlyJSONValue>();\n for await (const [key, value] of tree.scan('')) {\n map.set(key, value);\n }\n return map;\n });\n}\n\nexport function clientRows(\n delegate: ExtendedInspectorDelegate,\n clientID: string,\n tableName: string,\n): Promise<Row[]> {\n return withDagRead(delegate, async dagRead => {\n const prefix = ENTITIES_KEY_PREFIX + tableName + '/';\n const tree = await getBTree(dagRead, clientID);\n const rows: Row[] = [];\n for await (const [key, value] of tree.scan(prefix)) {\n if (!key.startsWith(prefix)) {\n break;\n }\n rows.push(value as Row);\n }\n return rows;\n });\n}\n\nexport async function serverVersion(\n delegate: ExtendedInspectorDelegate,\n): Promise<string> {\n return rpc(\n await delegate.getSocket(),\n {op: 'version'},\n inspectVersionDownSchema,\n );\n}\n\nexport function clientQueries(\n delegate: ExtendedInspectorDelegate,\n clientID: string,\n): Promise<Query[]> {\n return queries(delegate, {op: 'queries', clientID});\n}\n\nasync function queries(\n delegate: ExtendedInspectorDelegate,\n arg: {op: 'queries'; clientID?: string},\n): Promise<Query[]> {\n const rows: InspectQueryRow[] = await rpc(\n await delegate.getSocket(),\n arg,\n inspectQueriesDownSchema,\n );\n const queries = rows.map(row => new Query(row, delegate, delegate.getSocket));\n queries.sort((a, b) => (b.hydrateServer ?? 0) - (a.hydrateServer ?? 0));\n return queries;\n}\n\nexport async function analyzeQuery(\n delegate: ExtendedInspectorDelegate,\n query: AnyQuery,\n options?: AnalyzeQueryOptions,\n): Promise<AnalyzeQueryResult> {\n const qi = asQueryInternals(query);\n const {customQueryID} = qi;\n const queryParameters = customQueryID\n ? {name: customQueryID.name, args: customQueryID.args}\n : {ast: delegate.mapClientASTToServer(qi.ast)};\n\n return rpc(\n await delegate.getSocket(),\n {\n op: 'analyze-query',\n ...queryParameters,\n options,\n },\n inspectAnalyzeQueryDownSchema,\n );\n}\n\nclass UnauthenticatedError extends Error {}\n\nexport interface InspectorDelegate {\n getQueryMetrics(hash: string): ClientMetrics | undefined;\n getAST(queryID: string): AST | undefined;\n readonly metrics: ClientMetrics;\n mapClientASTToServer(ast: AST): AST;\n}\n\nexport interface ExtendedInspectorDelegate extends InspectorDelegate {\n readonly rep: Rep;\n readonly getSocket: () => Promise<WebSocket>;\n readonly queryDelegate: QueryDelegate;\n lazy: Promise<Lazy>;\n}\n\nexport type Rep = ReplicacheImpl<MutatorDefs>;\n\nexport type ClientMetrics = {\n readonly [K in keyof ClientMetricMap]: ReadonlyTDigest;\n};\n\nexport type ServerMetrics = {\n readonly [K in keyof ServerMetricMap]: ReadonlyTDigest;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lazy-inspector.js","names":[],"sources":["../../../../../../zero-client/src/client/inspector/lazy-inspector.ts"],"sourcesContent":["import type {BTreeRead} from '../../../../replicache/src/btree/read.ts';\nimport type {Read} from '../../../../replicache/src/dag/store.ts';\nimport {readFromHash} from '../../../../replicache/src/db/read.ts';\nimport * as FormatVersion from '../../../../replicache/src/format-version-enum.ts';\nimport {getClientGroup} from '../../../../replicache/src/persist/client-groups.ts';\nimport {\n getClient,\n getClients,\n type ClientMap,\n} from '../../../../replicache/src/persist/clients.ts';\nimport type {ReplicacheImpl} from '../../../../replicache/src/replicache-impl.ts';\nimport {withRead} from '../../../../replicache/src/with-transactions.ts';\nimport {assert} from '../../../../shared/src/asserts.ts';\nimport type {ReadonlyJSONValue} from '../../../../shared/src/json.ts';\nimport {mapValues} from '../../../../shared/src/objects.ts';\nimport {TDigest, type ReadonlyTDigest} from '../../../../shared/src/tdigest.ts';\nimport * as valita from '../../../../shared/src/valita.ts';\nimport type {AnalyzeQueryResult} from '../../../../zero-protocol/src/analyze-query-result.ts';\nimport type {AST} from '../../../../zero-protocol/src/ast.ts';\nimport type {Row} from '../../../../zero-protocol/src/data.ts';\nimport {\n inspectAnalyzeQueryDownSchema,\n inspectAuthenticatedDownSchema,\n inspectMetricsDownSchema,\n inspectQueriesDownSchema,\n inspectVersionDownSchema,\n type InspectDownBody,\n type InspectQueryRow,\n type ServerMetrics as ServerMetricsJSON,\n} from '../../../../zero-protocol/src/inspect-down.ts';\nimport type {\n AnalyzeQueryOptions,\n InspectUpBody,\n} from '../../../../zero-protocol/src/inspect-up.ts';\nimport type {\n ClientMetricMap,\n ServerMetricMap,\n} from '../../../../zql/src/query/metrics-delegate.ts';\nimport type {QueryDelegate} from '../../../../zql/src/query/query-delegate.ts';\nimport {asQueryInternals} from '../../../../zql/src/query/query-internals.ts';\nimport type {AnyQuery} from '../../../../zql/src/query/query.ts';\nimport {nanoid} from '../../util/nanoid.ts';\nimport {ENTITIES_KEY_PREFIX} from '../keys.ts';\nimport type {MutatorDefs} from '../replicache-types.ts';\nimport {Client} from './client.ts';\nimport {createHTMLPasswordPrompt} from './html-dialog-prompt.ts';\nimport {type Lazy} from './inspector.ts';\nimport {Query} from './query.ts';\n\nexport type GetWebSocket = () => Promise<WebSocket>;\n\nexport type Metrics = {\n readonly [K in keyof (ClientMetricMap & ServerMetricMap)]: ReadonlyTDigest;\n};\n\ntype DistributiveOmit<T, K extends string> = T extends object\n ? Omit<T, K>\n : never;\n\nexport async function rpc<T extends InspectDownBody>(\n socket: WebSocket,\n arg: DistributiveOmit<InspectUpBody, 'id'>,\n downSchema: valita.Type<T>,\n): Promise<T['value']> {\n try {\n return await rpcNoAuthTry(socket, arg, downSchema);\n } catch (e) {\n if (e instanceof UnauthenticatedError) {\n const password = await createHTMLPasswordPrompt('Enter password:');\n if (password) {\n // Do authenticate rpc\n const authRes = await rpcNoAuthTry(\n socket,\n {op: 'authenticate', value: password},\n inspectAuthenticatedDownSchema,\n );\n if (authRes) {\n // If authentication is successful, retry the original RPC\n return rpcNoAuthTry(socket, arg, downSchema);\n }\n }\n throw new Error('Authentication failed');\n }\n throw e;\n }\n}\n\nfunction rpcNoAuthTry<T extends InspectDownBody>(\n socket: WebSocket,\n arg: DistributiveOmit<InspectUpBody, 'id'>,\n downSchema: valita.Type<T>,\n): Promise<T['value']> {\n return new Promise((resolve, reject) => {\n const id = nanoid();\n const f = (ev: MessageEvent) => {\n const msg = JSON.parse(ev.data);\n if (msg[0] === 'inspect') {\n const body = msg[1];\n if (body.id !== id) {\n return;\n }\n const res = valita.test(body, downSchema);\n if (res.ok) {\n if (res.value.op === 'error') {\n reject(new Error(res.value.value));\n } else {\n resolve(res.value.value);\n }\n } else {\n // Check if we got un authenticated/false response\n const authRes = valita.test(body, inspectAuthenticatedDownSchema);\n if (authRes.ok) {\n // Handle authenticated response\n assert(\n authRes.value.value === false,\n 'Expected unauthenticated response',\n );\n reject(new UnauthenticatedError());\n }\n\n reject(res.error);\n }\n socket.removeEventListener('message', f);\n }\n };\n socket.addEventListener('message', f);\n socket.send(JSON.stringify(['inspect', {...arg, id}]));\n });\n} // T extends forces T to be resolved\n\nexport function mergeMetrics(\n clientMetrics: ClientMetrics | undefined,\n serverMetrics: ServerMetricsJSON | null | undefined,\n): ClientMetrics & ServerMetrics {\n return {\n ...(clientMetrics ?? newClientMetrics()),\n ...(serverMetrics\n ? convertServerMetrics(serverMetrics)\n : newServerMetrics()),\n };\n}\n\nfunction newClientMetrics(): ClientMetrics {\n return {\n 'query-materialization-client': new TDigest(),\n 'query-materialization-end-to-end': new TDigest(),\n 'query-update-client': new TDigest(),\n };\n}\n\nfunction newServerMetrics(): ServerMetrics {\n return {\n 'query-materialization-server': new TDigest(),\n 'query-update-server': new TDigest(),\n };\n}\n\nfunction convertServerMetrics(metrics: ServerMetricsJSON): ServerMetrics {\n return mapValues(metrics, v => TDigest.fromJSON(v));\n}\n\nexport async function inspectorMetrics(\n delegate: ExtendedInspectorDelegate,\n): Promise<Metrics> {\n const clientMetrics = delegate.metrics;\n const serverMetricsJSON = await rpc(\n await delegate.getSocket(),\n {op: 'metrics'},\n inspectMetricsDownSchema,\n );\n return mergeMetrics(clientMetrics, serverMetricsJSON);\n}\n\nexport function inspectorClients(\n delegate: ExtendedInspectorDelegate,\n): Promise<Client[]> {\n return withDagRead(delegate, dagRead => clients(delegate, dagRead));\n}\n\nexport function inspectorClientsWithQueries(\n delegate: ExtendedInspectorDelegate,\n): Promise<Client[]> {\n return withDagRead(delegate, dagRead =>\n clientsWithQueries(delegate, dagRead),\n );\n}\n\nasync function withDagRead<T>(\n delegate: ExtendedInspectorDelegate,\n f: (dagRead: Read) => Promise<T>,\n): Promise<T> {\n const {rep} = delegate;\n await rep.refresh();\n await rep.persist();\n return withRead(rep.perdag, f);\n}\n\nasync function getBTree(dagRead: Read, clientID: string): Promise<BTreeRead> {\n const client = await getClient(clientID, dagRead);\n assert(client, `Client not found: ${clientID}`);\n const {clientGroupID} = client;\n const clientGroup = await getClientGroup(clientGroupID, dagRead);\n assert(clientGroup, `Client group not found: ${clientGroupID}`);\n const dbRead = await readFromHash(\n clientGroup.headHash,\n dagRead,\n FormatVersion.Latest,\n );\n return dbRead.map;\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype MapEntry<T extends ReadonlyMap<any, any>> =\n T extends ReadonlyMap<infer K, infer V> ? readonly [K, V] : never;\n\nasync function clients(\n delegate: ExtendedInspectorDelegate,\n dagRead: Read,\n predicate: (entry: MapEntry<ClientMap>) => boolean = () => true,\n): Promise<Client[]> {\n const clients = await getClients(dagRead);\n return [...clients.entries()]\n .filter(predicate)\n .map(\n ([clientID, {clientGroupID}]) =>\n new Client(delegate, clientID, clientGroupID),\n );\n}\n\nasync function clientsWithQueries(\n delegate: ExtendedInspectorDelegate,\n dagRead: Read,\n predicate: (entry: MapEntry<ClientMap>) => boolean = () => true,\n): Promise<Client[]> {\n const allClients = await clients(delegate, dagRead, predicate);\n const clientsWithQueries: Client[] = [];\n await Promise.all(\n allClients.map(async client => {\n const queries = await client.queries();\n if (queries.length > 0) {\n clientsWithQueries.push(client);\n }\n }),\n );\n return clientsWithQueries;\n}\n\nexport async function clientGroupClients(\n delegate: ExtendedInspectorDelegate,\n clientGroupID: Promise<string> | string,\n): Promise<Client[]> {\n const id = await clientGroupID;\n return withDagRead(delegate, dagRead =>\n clients(delegate, dagRead, ([_, v]) => v.clientGroupID === id),\n );\n}\n\nexport async function clientGroupClientsWithQueries(\n delegate: ExtendedInspectorDelegate,\n clientGroupID: Promise<string> | string,\n): Promise<Client[]> {\n const id = await clientGroupID;\n return withDagRead(delegate, dagRead =>\n clientsWithQueries(delegate, dagRead, ([_, v]) => v.clientGroupID === id),\n );\n}\n\nexport function clientGroupQueries(\n delegate: ExtendedInspectorDelegate,\n): Promise<Query[]> {\n return queries(delegate, {op: 'queries'});\n}\nexport function clientMap(\n delegate: ExtendedInspectorDelegate,\n clientID: string,\n): Promise<Map<string, ReadonlyJSONValue>> {\n return withDagRead(delegate, async dagRead => {\n const tree = await getBTree(dagRead, clientID);\n const map = new Map<string, ReadonlyJSONValue>();\n for await (const [key, value] of tree.scan('')) {\n map.set(key, value);\n }\n return map;\n });\n}\n\nexport function clientRows(\n delegate: ExtendedInspectorDelegate,\n clientID: string,\n tableName: string,\n): Promise<Row[]> {\n return withDagRead(delegate, async dagRead => {\n const prefix = ENTITIES_KEY_PREFIX + tableName + '/';\n const tree = await getBTree(dagRead, clientID);\n const rows: Row[] = [];\n for await (const [key, value] of tree.scan(prefix)) {\n if (!key.startsWith(prefix)) {\n break;\n }\n rows.push(value as Row);\n }\n return rows;\n });\n}\n\nexport async function serverVersion(\n delegate: ExtendedInspectorDelegate,\n): Promise<string> {\n return rpc(\n await delegate.getSocket(),\n {op: 'version'},\n inspectVersionDownSchema,\n );\n}\n\nexport function clientQueries(\n delegate: ExtendedInspectorDelegate,\n clientID: string,\n): Promise<Query[]> {\n return queries(delegate, {op: 'queries', clientID});\n}\n\nasync function queries(\n delegate: ExtendedInspectorDelegate,\n arg: {op: 'queries'; clientID?: string},\n): Promise<Query[]> {\n const rows: InspectQueryRow[] = await rpc(\n await delegate.getSocket(),\n arg,\n inspectQueriesDownSchema,\n );\n const queries = rows.map(row => new Query(row, delegate, delegate.getSocket));\n queries.sort((a, b) => (b.hydrateServer ?? 0) - (a.hydrateServer ?? 0));\n return queries;\n}\n\nexport async function analyzeQuery(\n delegate: ExtendedInspectorDelegate,\n query: AnyQuery,\n options?: AnalyzeQueryOptions,\n): Promise<AnalyzeQueryResult> {\n const qi = asQueryInternals(query);\n const {customQueryID} = qi;\n const queryParameters = customQueryID\n ? {name: customQueryID.name, args: customQueryID.args}\n : {ast: delegate.mapClientASTToServer(qi.ast)};\n\n return rpc(\n await delegate.getSocket(),\n {\n op: 'analyze-query',\n ...queryParameters,\n options,\n },\n inspectAnalyzeQueryDownSchema,\n );\n}\n\nexport async function analyzeServerAST(\n delegate: ExtendedInspectorDelegate,\n ast: AST,\n options?: AnalyzeQueryOptions,\n): Promise<AnalyzeQueryResult> {\n return rpc(\n await delegate.getSocket(),\n {op: 'analyze-query', ast, options},\n inspectAnalyzeQueryDownSchema,\n );\n}\n\nexport async function analyzeNamedQuery(\n delegate: ExtendedInspectorDelegate,\n name: string,\n args: ReadonlyArray<ReadonlyJSONValue>,\n options?: AnalyzeQueryOptions,\n): Promise<AnalyzeQueryResult> {\n return rpc(\n await delegate.getSocket(),\n {op: 'analyze-query', name, args, options},\n inspectAnalyzeQueryDownSchema,\n );\n}\n\n/**\n * Sends an `authenticate` op to the server. Returns `true` if the password\n * is accepted (or the server is in a development mode that bypasses the\n * check). Use this from Node contexts where the default interactive HTML\n * prompt used by other inspector RPCs is not available.\n */\nexport async function authenticate(\n delegate: ExtendedInspectorDelegate,\n password: string,\n): Promise<boolean> {\n return rpc(\n await delegate.getSocket(),\n {op: 'authenticate', value: password},\n inspectAuthenticatedDownSchema,\n );\n}\n\nclass UnauthenticatedError extends Error {}\n\nexport interface InspectorDelegate {\n getQueryMetrics(hash: string): ClientMetrics | undefined;\n getAST(queryID: string): AST | undefined;\n readonly metrics: ClientMetrics;\n mapClientASTToServer(ast: AST): AST;\n}\n\nexport interface ExtendedInspectorDelegate extends InspectorDelegate {\n readonly rep: Rep;\n readonly getSocket: () => Promise<WebSocket>;\n readonly queryDelegate: QueryDelegate;\n lazy: Promise<Lazy>;\n}\n\nexport type Rep = ReplicacheImpl<MutatorDefs>;\n\nexport type ClientMetrics = {\n readonly [K in keyof ClientMetricMap]: ReadonlyTDigest;\n};\n\nexport type ServerMetrics = {\n readonly [K in keyof ServerMetricMap]: ReadonlyTDigest;\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ivm-branch.d.ts","sourceRoot":"","sources":["../../../../../zero-client/src/client/ivm-branch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EACZ,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,2CAA2C,CAAC;AACzE,OAAO,EAAY,KAAK,KAAK,EAAC,MAAM,sCAAsC,CAAC;AAG3E,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,iCAAiC,CAAC;AAC1D,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,+CAA+C,CAAC;AASnF,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,0CAA0C,CAAC;AAC1E,OAAO,EAAC,YAAY,EAAC,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"ivm-branch.d.ts","sourceRoot":"","sources":["../../../../../zero-client/src/client/ivm-branch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EACZ,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,2CAA2C,CAAC;AACzE,OAAO,EAAY,KAAK,KAAK,EAAC,MAAM,sCAAsC,CAAC;AAG3E,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,iCAAiC,CAAC;AAC1D,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,+CAA+C,CAAC;AASnF,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,0CAA0C,CAAC;AAC1E,OAAO,EAAC,YAAY,EAAC,MAAM,uCAAuC,CAAC;AASnE;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,eAAe;;IAG1B,IAAI,EAAE,IAAI,GAAG,SAAS,CAAC;gBAGrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACnC,IAAI,CAAC,EAAE,IAAI,EACX,OAAO,GAAE,GAAG,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAAa;IAO5D,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAajD,KAAK;IAIL;;;OAGG;IACH,OAAO,CAAC,YAAY,EAAE,IAAI,GAAG,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW;IAWzE;;OAEG;IACG,UAAU,CACd,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,IAAI,EACjB,WAAW,CAAC,EAAE,eAAe,GAC5B,OAAO,CAAC,eAAe,CAAC;IAY3B;;;;;;;OAOG;IACH,IAAI;CAYL;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,iBAkBb"}
|
|
@@ -6,6 +6,7 @@ import { using, withRead } from "../../../replicache/src/with-transactions.js";
|
|
|
6
6
|
import { must } from "../../../shared/src/must.js";
|
|
7
7
|
import { diffBinarySearch } from "../../../replicache/src/subscriptions.js";
|
|
8
8
|
import { consume } from "../../../zql/src/ivm/stream.js";
|
|
9
|
+
import { makeSourceChangeAdd, makeSourceChangeEdit, makeSourceChangeRemove } from "../../../zql/src/ivm/source.js";
|
|
9
10
|
import { MemorySource } from "../../../zql/src/ivm/memory-source.js";
|
|
10
11
|
import { sourceNameFromKey } from "./keys.js";
|
|
11
12
|
//#region ../zero-client/src/client/ivm-branch.ts
|
|
@@ -102,23 +103,13 @@ function applyDiffs(diffs, branch) {
|
|
|
102
103
|
const source = must(branch.getSource(name));
|
|
103
104
|
switch (diff.op) {
|
|
104
105
|
case "del":
|
|
105
|
-
consume(source.push(
|
|
106
|
-
type: "remove",
|
|
107
|
-
row: diff.oldValue
|
|
108
|
-
}));
|
|
106
|
+
consume(source.push(makeSourceChangeRemove(diff.oldValue)));
|
|
109
107
|
break;
|
|
110
108
|
case "add":
|
|
111
|
-
consume(source.push(
|
|
112
|
-
type: "add",
|
|
113
|
-
row: diff.newValue
|
|
114
|
-
}));
|
|
109
|
+
consume(source.push(makeSourceChangeAdd(diff.newValue)));
|
|
115
110
|
break;
|
|
116
111
|
case "change":
|
|
117
|
-
consume(source.push(
|
|
118
|
-
type: "edit",
|
|
119
|
-
row: diff.newValue,
|
|
120
|
-
oldRow: diff.oldValue
|
|
121
|
-
}));
|
|
112
|
+
consume(source.push(makeSourceChangeEdit(diff.newValue, diff.oldValue)));
|
|
122
113
|
break;
|
|
123
114
|
}
|
|
124
115
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ivm-branch.js","names":["#sources","#tables"],"sources":["../../../../../zero-client/src/client/ivm-branch.ts"],"sourcesContent":["import type {\n InternalDiff,\n InternalDiffOperation,\n NoIndexDiff,\n} from '../../../replicache/src/btree/node.ts';\nimport type {LazyStore} from '../../../replicache/src/dag/lazy-store.ts';\nimport {type Read, type Store} from '../../../replicache/src/dag/store.ts';\nimport {readFromHash} from '../../../replicache/src/db/read.ts';\nimport * as FormatVersion from '../../../replicache/src/format-version-enum.ts';\nimport type {Hash} from '../../../replicache/src/hash.ts';\nimport type {ZeroReadOptions} from '../../../replicache/src/replicache-options.ts';\nimport {diffBinarySearch} from '../../../replicache/src/subscriptions.ts';\nimport type {DiffsMap} from '../../../replicache/src/sync/diff.ts';\nimport {diff} from '../../../replicache/src/sync/diff.ts';\nimport {using, withRead} from '../../../replicache/src/with-transactions.ts';\nimport {assert} from '../../../shared/src/asserts.ts';\nimport {wrapIterable} from '../../../shared/src/iterables.ts';\nimport {must} from '../../../shared/src/must.ts';\nimport type {Row} from '../../../zero-protocol/src/data.ts';\nimport type {TableSchema} from '../../../zero-schema/src/table-schema.ts';\nimport {MemorySource} from '../../../zql/src/ivm/memory-source.ts';\nimport {consume} from '../../../zql/src/ivm/stream.ts';\nimport {ENTITIES_KEY_PREFIX, sourceNameFromKey} from './keys.ts';\n\n/**\n * Replicache needs to rebase mutations onto different\n * commits of it's b-tree. These mutations can have reads\n * in them and those reads must be run against the IVM sources.\n *\n * To ensure the reads get the correct state, the IVM\n * sources need to reflect the state of the commit\n * being rebased onto. `IVMSourceBranch` allows us to:\n * 1. fork the IVM sources\n * 2. patch them up to match the desired head\n * 3. run the reads against the forked sources\n *\n * (2) is expected to be a cheap operation as there should only\n * ever be a few outstanding diffs to apply given Zero is meant\n * to be run in a connected state.\n */\nexport class IVMSourceBranch {\n readonly #sources: Map<string, MemorySource | undefined>;\n readonly #tables: Record<string, TableSchema>;\n hash: Hash | undefined;\n\n constructor(\n tables: Record<string, TableSchema>,\n hash?: Hash,\n sources: Map<string, MemorySource | undefined> = new Map(),\n ) {\n this.#tables = tables;\n this.#sources = sources;\n this.hash = hash;\n }\n\n getSource(name: string): MemorySource | undefined {\n if (this.#sources.has(name)) {\n return this.#sources.get(name);\n }\n\n const schema = this.#tables[name];\n const source = schema\n ? new MemorySource(name, schema.columns, schema.primaryKey)\n : undefined;\n this.#sources.set(name, source);\n return source;\n }\n\n clear() {\n this.#sources.clear();\n }\n\n /**\n * Mutates the current branch, advancing it to the new head\n * by applying the given diffs.\n */\n advance(expectedHead: Hash | undefined, newHead: Hash, diffs: NoIndexDiff) {\n assert(\n this.hash === expectedHead,\n () =>\n `Expected head must match the main head. Got: ${this.hash}, expected: ${expectedHead}`,\n );\n\n applyDiffs(diffs, this);\n this.hash = newHead;\n }\n\n /**\n * Fork the branch and patch it up to match the desired head.\n */\n async forkToHead(\n store: LazyStore,\n desiredHead: Hash,\n readOptions?: ZeroReadOptions,\n ): Promise<IVMSourceBranch> {\n const fork = this.fork();\n\n if (fork.hash === desiredHead) {\n return fork;\n }\n\n await patchBranch(desiredHead, store, fork, readOptions);\n fork.hash = desiredHead;\n return fork;\n }\n\n /**\n * Creates a new IVMSourceBranch that is a copy of the current one.\n * This is a cheap operation since the b-trees are shared until a write is performed\n * and then only the modified nodes are copied.\n *\n * IVM branches are forked when we need to rebase mutations.\n * The mutations modify the fork rather than original branch.\n */\n fork() {\n return new IVMSourceBranch(\n this.#tables,\n this.hash,\n new Map(\n wrapIterable(this.#sources.entries()).map(([name, source]) => [\n name,\n source?.fork(),\n ]),\n ),\n );\n }\n}\n\nexport async function initFromStore(\n branch: IVMSourceBranch,\n hash: Hash,\n store: Store,\n) {\n const diffs: InternalDiffOperation[] = [];\n await withRead(store, async dagRead => {\n const read = await readFromHash(hash, dagRead, FormatVersion.Latest);\n for await (const entry of read.map.scan(ENTITIES_KEY_PREFIX)) {\n if (!entry[0].startsWith(ENTITIES_KEY_PREFIX)) {\n break;\n }\n diffs.push({\n op: 'add',\n key: entry[0],\n newValue: entry[1],\n });\n }\n });\n\n branch.advance(undefined, hash, diffs);\n}\n\nasync function patchBranch(\n desiredHead: Hash,\n store: LazyStore,\n fork: IVMSourceBranch,\n readOptions: ZeroReadOptions | undefined,\n) {\n const diffs = await computeDiffs(\n must(fork.hash),\n desiredHead,\n store,\n readOptions,\n );\n if (!diffs) {\n return;\n }\n applyDiffs(diffs, fork);\n}\n\nasync function computeDiffs(\n startHash: Hash,\n endHash: Hash,\n store: LazyStore,\n readOptions: ZeroReadOptions | undefined,\n): Promise<InternalDiff | undefined> {\n const readFn = (dagRead: Read) =>\n diff(\n startHash,\n endHash,\n dagRead,\n {\n shouldComputeDiffs: () => true,\n shouldComputeDiffsForIndex(_name) {\n return false;\n },\n },\n FormatVersion.Latest,\n );\n\n let diffs: DiffsMap;\n if (readOptions?.openLazySourceRead) {\n diffs = await using(store.read(readOptions.openLazySourceRead), readFn);\n } else if (readOptions?.openLazyRead) {\n diffs = await readFn(readOptions.openLazyRead);\n } else {\n diffs = await withRead(store, readFn);\n }\n\n return diffs.get('');\n}\n\nfunction applyDiffs(diffs: NoIndexDiff, branch: IVMSourceBranch) {\n for (\n let i = diffBinarySearch(diffs, ENTITIES_KEY_PREFIX, diff => diff.key);\n i < diffs.length;\n i++\n ) {\n const diff = diffs[i];\n const {key} = diff;\n if (!key.startsWith(ENTITIES_KEY_PREFIX)) {\n break;\n }\n const name = sourceNameFromKey(key);\n const source = must(branch.getSource(name));\n switch (diff.op) {\n case 'del':\n consume(
|
|
1
|
+
{"version":3,"file":"ivm-branch.js","names":["#sources","#tables"],"sources":["../../../../../zero-client/src/client/ivm-branch.ts"],"sourcesContent":["import type {\n InternalDiff,\n InternalDiffOperation,\n NoIndexDiff,\n} from '../../../replicache/src/btree/node.ts';\nimport type {LazyStore} from '../../../replicache/src/dag/lazy-store.ts';\nimport {type Read, type Store} from '../../../replicache/src/dag/store.ts';\nimport {readFromHash} from '../../../replicache/src/db/read.ts';\nimport * as FormatVersion from '../../../replicache/src/format-version-enum.ts';\nimport type {Hash} from '../../../replicache/src/hash.ts';\nimport type {ZeroReadOptions} from '../../../replicache/src/replicache-options.ts';\nimport {diffBinarySearch} from '../../../replicache/src/subscriptions.ts';\nimport type {DiffsMap} from '../../../replicache/src/sync/diff.ts';\nimport {diff} from '../../../replicache/src/sync/diff.ts';\nimport {using, withRead} from '../../../replicache/src/with-transactions.ts';\nimport {assert} from '../../../shared/src/asserts.ts';\nimport {wrapIterable} from '../../../shared/src/iterables.ts';\nimport {must} from '../../../shared/src/must.ts';\nimport type {Row} from '../../../zero-protocol/src/data.ts';\nimport type {TableSchema} from '../../../zero-schema/src/table-schema.ts';\nimport {MemorySource} from '../../../zql/src/ivm/memory-source.ts';\nimport {consume} from '../../../zql/src/ivm/stream.ts';\nimport {ENTITIES_KEY_PREFIX, sourceNameFromKey} from './keys.ts';\n\nimport {\n makeSourceChangeAdd,\n makeSourceChangeEdit,\n makeSourceChangeRemove,\n} from '../../../zql/src/ivm/source.ts';\n/**\n * Replicache needs to rebase mutations onto different\n * commits of it's b-tree. These mutations can have reads\n * in them and those reads must be run against the IVM sources.\n *\n * To ensure the reads get the correct state, the IVM\n * sources need to reflect the state of the commit\n * being rebased onto. `IVMSourceBranch` allows us to:\n * 1. fork the IVM sources\n * 2. patch them up to match the desired head\n * 3. run the reads against the forked sources\n *\n * (2) is expected to be a cheap operation as there should only\n * ever be a few outstanding diffs to apply given Zero is meant\n * to be run in a connected state.\n */\nexport class IVMSourceBranch {\n readonly #sources: Map<string, MemorySource | undefined>;\n readonly #tables: Record<string, TableSchema>;\n hash: Hash | undefined;\n\n constructor(\n tables: Record<string, TableSchema>,\n hash?: Hash,\n sources: Map<string, MemorySource | undefined> = new Map(),\n ) {\n this.#tables = tables;\n this.#sources = sources;\n this.hash = hash;\n }\n\n getSource(name: string): MemorySource | undefined {\n if (this.#sources.has(name)) {\n return this.#sources.get(name);\n }\n\n const schema = this.#tables[name];\n const source = schema\n ? new MemorySource(name, schema.columns, schema.primaryKey)\n : undefined;\n this.#sources.set(name, source);\n return source;\n }\n\n clear() {\n this.#sources.clear();\n }\n\n /**\n * Mutates the current branch, advancing it to the new head\n * by applying the given diffs.\n */\n advance(expectedHead: Hash | undefined, newHead: Hash, diffs: NoIndexDiff) {\n assert(\n this.hash === expectedHead,\n () =>\n `Expected head must match the main head. Got: ${this.hash}, expected: ${expectedHead}`,\n );\n\n applyDiffs(diffs, this);\n this.hash = newHead;\n }\n\n /**\n * Fork the branch and patch it up to match the desired head.\n */\n async forkToHead(\n store: LazyStore,\n desiredHead: Hash,\n readOptions?: ZeroReadOptions,\n ): Promise<IVMSourceBranch> {\n const fork = this.fork();\n\n if (fork.hash === desiredHead) {\n return fork;\n }\n\n await patchBranch(desiredHead, store, fork, readOptions);\n fork.hash = desiredHead;\n return fork;\n }\n\n /**\n * Creates a new IVMSourceBranch that is a copy of the current one.\n * This is a cheap operation since the b-trees are shared until a write is performed\n * and then only the modified nodes are copied.\n *\n * IVM branches are forked when we need to rebase mutations.\n * The mutations modify the fork rather than original branch.\n */\n fork() {\n return new IVMSourceBranch(\n this.#tables,\n this.hash,\n new Map(\n wrapIterable(this.#sources.entries()).map(([name, source]) => [\n name,\n source?.fork(),\n ]),\n ),\n );\n }\n}\n\nexport async function initFromStore(\n branch: IVMSourceBranch,\n hash: Hash,\n store: Store,\n) {\n const diffs: InternalDiffOperation[] = [];\n await withRead(store, async dagRead => {\n const read = await readFromHash(hash, dagRead, FormatVersion.Latest);\n for await (const entry of read.map.scan(ENTITIES_KEY_PREFIX)) {\n if (!entry[0].startsWith(ENTITIES_KEY_PREFIX)) {\n break;\n }\n diffs.push({\n op: 'add',\n key: entry[0],\n newValue: entry[1],\n });\n }\n });\n\n branch.advance(undefined, hash, diffs);\n}\n\nasync function patchBranch(\n desiredHead: Hash,\n store: LazyStore,\n fork: IVMSourceBranch,\n readOptions: ZeroReadOptions | undefined,\n) {\n const diffs = await computeDiffs(\n must(fork.hash),\n desiredHead,\n store,\n readOptions,\n );\n if (!diffs) {\n return;\n }\n applyDiffs(diffs, fork);\n}\n\nasync function computeDiffs(\n startHash: Hash,\n endHash: Hash,\n store: LazyStore,\n readOptions: ZeroReadOptions | undefined,\n): Promise<InternalDiff | undefined> {\n const readFn = (dagRead: Read) =>\n diff(\n startHash,\n endHash,\n dagRead,\n {\n shouldComputeDiffs: () => true,\n shouldComputeDiffsForIndex(_name) {\n return false;\n },\n },\n FormatVersion.Latest,\n );\n\n let diffs: DiffsMap;\n if (readOptions?.openLazySourceRead) {\n diffs = await using(store.read(readOptions.openLazySourceRead), readFn);\n } else if (readOptions?.openLazyRead) {\n diffs = await readFn(readOptions.openLazyRead);\n } else {\n diffs = await withRead(store, readFn);\n }\n\n return diffs.get('');\n}\n\nfunction applyDiffs(diffs: NoIndexDiff, branch: IVMSourceBranch) {\n for (\n let i = diffBinarySearch(diffs, ENTITIES_KEY_PREFIX, diff => diff.key);\n i < diffs.length;\n i++\n ) {\n const diff = diffs[i];\n const {key} = diff;\n if (!key.startsWith(ENTITIES_KEY_PREFIX)) {\n break;\n }\n const name = sourceNameFromKey(key);\n const source = must(branch.getSource(name));\n switch (diff.op) {\n case 'del':\n consume(source.push(makeSourceChangeRemove(diff.oldValue as Row)));\n break;\n case 'add':\n consume(source.push(makeSourceChangeAdd(diff.newValue as Row)));\n break;\n case 'change':\n consume(\n source.push(\n makeSourceChangeEdit(diff.newValue as Row, diff.oldValue as Row),\n ),\n );\n break;\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,IAAa,kBAAb,MAAa,gBAAgB;CAC3B;CACA;CACA;CAEA,YACE,QACA,MACA,0BAAiD,IAAI,KAAK,EAC1D;AACA,QAAA,SAAe;AACf,QAAA,UAAgB;AAChB,OAAK,OAAO;;CAGd,UAAU,MAAwC;AAChD,MAAI,MAAA,QAAc,IAAI,KAAK,CACzB,QAAO,MAAA,QAAc,IAAI,KAAK;EAGhC,MAAM,SAAS,MAAA,OAAa;EAC5B,MAAM,SAAS,SACX,IAAI,aAAa,MAAM,OAAO,SAAS,OAAO,WAAW,GACzD,KAAA;AACJ,QAAA,QAAc,IAAI,MAAM,OAAO;AAC/B,SAAO;;CAGT,QAAQ;AACN,QAAA,QAAc,OAAO;;;;;;CAOvB,QAAQ,cAAgC,SAAe,OAAoB;AACzE,SACE,KAAK,SAAS,oBAEZ,gDAAgD,KAAK,KAAK,cAAc,eAC3E;AAED,aAAW,OAAO,KAAK;AACvB,OAAK,OAAO;;;;;CAMd,MAAM,WACJ,OACA,aACA,aAC0B;EAC1B,MAAM,OAAO,KAAK,MAAM;AAExB,MAAI,KAAK,SAAS,YAChB,QAAO;AAGT,QAAM,YAAY,aAAa,OAAO,MAAM,YAAY;AACxD,OAAK,OAAO;AACZ,SAAO;;;;;;;;;;CAWT,OAAO;AACL,SAAO,IAAI,gBACT,MAAA,QACA,KAAK,MACL,IAAI,IACF,aAAa,MAAA,QAAc,SAAS,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,CAC5D,MACA,QAAQ,MAAM,CACf,CAAC,CACH,CACF;;;AA2BL,eAAe,YACb,aACA,OACA,MACA,aACA;CACA,MAAM,QAAQ,MAAM,aAClB,KAAK,KAAK,KAAK,EACf,aACA,OACA,YACD;AACD,KAAI,CAAC,MACH;AAEF,YAAW,OAAO,KAAK;;AAGzB,eAAe,aACb,WACA,SACA,OACA,aACmC;CACnC,MAAM,UAAU,YACd,KACE,WACA,SACA,SACA;EACE,0BAA0B;EAC1B,2BAA2B,OAAO;AAChC,UAAO;;EAEV,EACD,EACD;CAEH,IAAI;AACJ,KAAI,aAAa,mBACf,SAAQ,MAAM,MAAM,MAAM,KAAK,YAAY,mBAAmB,EAAE,OAAO;UAC9D,aAAa,aACtB,SAAQ,MAAM,OAAO,YAAY,aAAa;KAE9C,SAAQ,MAAM,SAAS,OAAO,OAAO;AAGvC,QAAO,MAAM,IAAI,GAAG;;AAGtB,SAAS,WAAW,OAAoB,QAAyB;AAC/D,MACE,IAAI,IAAI,iBAAiB,OAAA,OAA4B,SAAQ,KAAK,IAAI,EACtE,IAAI,MAAM,QACV,KACA;EACA,MAAM,OAAO,MAAM;EACnB,MAAM,EAAC,QAAO;AACd,MAAI,CAAC,IAAI,WAAA,KAA+B,CACtC;EAEF,MAAM,OAAO,kBAAkB,IAAI;EACnC,MAAM,SAAS,KAAK,OAAO,UAAU,KAAK,CAAC;AAC3C,UAAQ,KAAK,IAAb;GACE,KAAK;AACH,YAAQ,OAAO,KAAK,uBAAuB,KAAK,SAAgB,CAAC,CAAC;AAClE;GACF,KAAK;AACH,YAAQ,OAAO,KAAK,oBAAoB,KAAK,SAAgB,CAAC,CAAC;AAC/D;GACF,KAAK;AACH,YACE,OAAO,KACL,qBAAqB,KAAK,UAAiB,KAAK,SAAgB,CACjE,CACF;AACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../../zero-protocol/src/error.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../../zero-protocol/src/error.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,4BAA4B,CAAC;AAChD,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAmC1C,QAAA,MAAM,iBAAiB;;;;;;;aAcrB,CAAC;AAKH,eAAO,MAAM,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAK7C,CAAC;AAaF,eAAO,MAAM,oBAAoB;;;IAR/B;;;OAGG;;;;;;;;;;;;IAHH;;;OAGG;;;;;;;;;;;;;;IAHH;;;OAGG;;;;;;;;;eA8BJ,CAAC;AAYF,eAAO,MAAM,yBAAyB;;;IAPpC;;OAEG;;;;;;;;;IAFH;;OAEG;;;;;;;;;;;IAFH;;OAEG;;;;;;eA4BJ,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;IAtE1B;;;OAGG;;;;;;;;;;;;IAHH;;;OAGG;;;;;;;;;;;;;;IAHH;;;OAGG;;;;;;;;;;;;IAmCH;;OAEG;;;;;;;;;IAFH;;OAEG;;;;;;;;;;;IAFH;;OAEG;;;;;;iBAmCJ,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,kBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAGlD,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAEhD;;GAEG;AACH,qBAAa,aAAa,CACxB,KAAK,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,CACrC,SAAQ,KAAK;IACb,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;gBAEV,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY;IAMhD,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,CAEpB;CACF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { literalUnion, valita_exports } from "../../shared/src/valita.js";
|
|
2
2
|
import { jsonSchema } from "../../shared/src/json-schema.js";
|
|
3
|
-
import { mutationIDSchema } from "./mutation-id.js";
|
|
4
3
|
import { AuthInvalidated, ClientNotFound, Internal, InvalidConnectionRequest, InvalidConnectionRequestBaseCookie, InvalidConnectionRequestClientDeleted, InvalidConnectionRequestLastMutationID, InvalidMessage, InvalidPush, MutationFailed, MutationRateLimited, PushFailed, Rebalance, Rehome, SchemaVersionNotSupported, ServerOverloaded, TransformFailed, Unauthorized, VersionNotSupported } from "./error-kind-enum.js";
|
|
5
4
|
import { Server, ZeroCache } from "./error-origin-enum.js";
|
|
6
5
|
import { Database, HTTP, Internal as Internal$1, OutOfOrderMutation, Parse, Timeout, UnsupportedPushVersion } from "./error-reason-enum.js";
|
|
6
|
+
import { mutationIDSchema } from "./mutation-id.js";
|
|
7
7
|
//#region ../zero-protocol/src/error.ts
|
|
8
8
|
var basicErrorKindSchema = literalUnion(AuthInvalidated, ClientNotFound, InvalidConnectionRequest, InvalidConnectionRequestBaseCookie, InvalidConnectionRequestLastMutationID, InvalidConnectionRequestClientDeleted, InvalidMessage, InvalidPush, MutationRateLimited, MutationFailed, Unauthorized, VersionNotSupported, SchemaVersionNotSupported, Internal);
|
|
9
9
|
var basicErrorBodySchema = valita_exports.object({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.js","names":[],"sources":["../../../../zero-protocol/src/error.ts"],"sourcesContent":["import {jsonSchema} from '../../shared/src/json-schema.ts';\nimport * as v from '../../shared/src/valita.ts';\nimport {
|
|
1
|
+
{"version":3,"file":"error.js","names":[],"sources":["../../../../zero-protocol/src/error.ts"],"sourcesContent":["import {jsonSchema} from '../../shared/src/json-schema.ts';\nimport * as v from '../../shared/src/valita.ts';\nimport {ErrorKind} from './error-kind.ts';\nimport {ErrorOrigin} from './error-origin.ts';\nimport {ErrorReason} from './error-reason.ts';\nimport {mutationIDSchema} from './mutation-id.ts';\n\nconst basicErrorKindSchema = v.literalUnion(\n ErrorKind.AuthInvalidated,\n ErrorKind.ClientNotFound,\n ErrorKind.InvalidConnectionRequest,\n ErrorKind.InvalidConnectionRequestBaseCookie,\n ErrorKind.InvalidConnectionRequestLastMutationID,\n ErrorKind.InvalidConnectionRequestClientDeleted,\n ErrorKind.InvalidMessage,\n ErrorKind.InvalidPush,\n ErrorKind.MutationRateLimited,\n ErrorKind.MutationFailed,\n ErrorKind.Unauthorized,\n ErrorKind.VersionNotSupported,\n ErrorKind.SchemaVersionNotSupported,\n ErrorKind.Internal,\n);\n\nconst basicErrorBodySchema = v.object({\n kind: basicErrorKindSchema,\n message: v.string(),\n // this is optional for backwards compatibility\n origin: v.literalUnion(ErrorOrigin.Server, ErrorOrigin.ZeroCache).optional(),\n});\n\nconst backoffErrorKindSchema = v.literalUnion(\n ErrorKind.Rebalance,\n ErrorKind.Rehome,\n ErrorKind.ServerOverloaded,\n);\n\nconst backoffBodySchema = v.object({\n kind: backoffErrorKindSchema,\n message: v.string(),\n minBackoffMs: v.number().optional(),\n maxBackoffMs: v.number().optional(),\n // Query parameters to send in the next reconnect. In the event of\n // a conflict, these will be overridden by the parameters used by\n // the client; it is the responsibility of the server to avoid\n // parameter name conflicts.\n //\n // The parameters will only be added to the immediately following\n // reconnect, and not after that.\n reconnectParams: v.record(v.string()).optional(),\n origin: v.literal(ErrorOrigin.ZeroCache).optional(),\n});\n\nconst pushFailedErrorKindSchema = v.literal(ErrorKind.PushFailed);\nconst transformFailedErrorKindSchema = v.literal(ErrorKind.TransformFailed);\n\nexport const errorKindSchema: v.Type<ErrorKind> = v.union(\n basicErrorKindSchema,\n backoffErrorKindSchema,\n pushFailedErrorKindSchema,\n transformFailedErrorKindSchema,\n);\n\nconst pushFailedBaseSchema = v.object({\n kind: pushFailedErrorKindSchema,\n details: jsonSchema.optional(),\n /**\n * The mutationIDs of the mutations that failed to process.\n * This can be a subset of the mutationIDs in the request.\n */\n mutationIDs: v.array(mutationIDSchema),\n message: v.string(),\n});\n\nexport const pushFailedBodySchema = v.union(\n pushFailedBaseSchema.extend({\n origin: v.literal(ErrorOrigin.Server),\n reason: v.literalUnion(\n ErrorReason.Database,\n ErrorReason.Parse,\n ErrorReason.OutOfOrderMutation,\n ErrorReason.UnsupportedPushVersion,\n ErrorReason.Internal,\n ),\n }),\n pushFailedBaseSchema.extend({\n origin: v.literal(ErrorOrigin.ZeroCache),\n reason: v.literal(ErrorReason.HTTP),\n status: v.number(),\n bodyPreview: v.string().optional(),\n }),\n pushFailedBaseSchema.extend({\n origin: v.literal(ErrorOrigin.ZeroCache),\n reason: v.literalUnion(\n ErrorReason.Timeout,\n ErrorReason.Parse,\n ErrorReason.Internal,\n ),\n }),\n);\n\nconst transformFailedBaseSchema = v.object({\n kind: transformFailedErrorKindSchema,\n details: jsonSchema.optional(),\n /**\n * The queryIDs of the queries that failed to transform.\n */\n queryIDs: v.array(v.string()),\n message: v.string(),\n});\n\nexport const transformFailedBodySchema = v.union(\n transformFailedBaseSchema.extend({\n origin: v.literal(ErrorOrigin.Server),\n reason: v.literalUnion(\n ErrorReason.Database,\n ErrorReason.Parse,\n ErrorReason.Internal,\n ),\n }),\n transformFailedBaseSchema.extend({\n origin: v.literal(ErrorOrigin.ZeroCache),\n reason: v.literal(ErrorReason.HTTP),\n status: v.number(),\n bodyPreview: v.string().optional(),\n }),\n transformFailedBaseSchema.extend({\n origin: v.literal(ErrorOrigin.ZeroCache),\n reason: v.literalUnion(\n ErrorReason.Timeout,\n ErrorReason.Parse,\n ErrorReason.Internal,\n ),\n }),\n);\n\nexport const errorBodySchema = v.union(\n basicErrorBodySchema,\n backoffBodySchema,\n pushFailedBodySchema,\n transformFailedBodySchema,\n);\n\nexport type BackoffBody = v.Infer<typeof backoffBodySchema>;\nexport type PushFailedBody = v.Infer<typeof pushFailedBodySchema>;\nexport type TransformFailedBody = v.Infer<typeof transformFailedBodySchema>;\nexport type ErrorBody = v.Infer<typeof errorBodySchema>;\n\nexport const errorMessageSchema: v.Type<ErrorMessage> = v.tuple([\n v.literal('error'),\n errorBodySchema,\n]);\n\nexport type ErrorMessage = ['error', ErrorBody];\n\n/**\n * Represents an error used across zero-client, zero-cache, and zero-server.\n */\nexport class ProtocolError<\n const T extends ErrorBody = ErrorBody,\n> extends Error {\n readonly errorBody: T;\n\n constructor(errorBody: T, options?: ErrorOptions) {\n super(errorBody.message, options);\n this.name = 'ProtocolError';\n this.errorBody = errorBody;\n }\n\n get kind(): T['kind'] {\n return this.errorBody.kind;\n }\n}\n\nexport function isProtocolError(error: unknown): error is ProtocolError {\n return error instanceof ProtocolError;\n}\n"],"mappings":";;;;;;;AAOA,IAAM,uBAAuB,aAC3B,iBACA,gBACA,0BACA,oCACA,wCACA,uCACA,gBACA,aACA,qBACA,gBACA,cACA,qBACA,2BACA,SACD;AAED,IAAM,uBAAuB,eAAE,OAAO;CACpC,MAAM;CACN,SAAS,eAAE,QAAQ;CAEnB,QAAQ,aAAe,QAAoB,UAAsB,CAAC,UAAU;CAC7E,CAAC;AAEF,IAAM,yBAAyB,aAC7B,WACA,QACA,iBACD;AAED,IAAM,oBAAoB,eAAE,OAAO;CACjC,MAAM;CACN,SAAS,eAAE,QAAQ;CACnB,cAAc,eAAE,QAAQ,CAAC,UAAU;CACnC,cAAc,eAAE,QAAQ,CAAC,UAAU;CAQnC,iBAAiB,eAAE,OAAO,eAAE,QAAQ,CAAC,CAAC,UAAU;CAChD,QAAQ,eAAE,QAAQ,UAAsB,CAAC,UAAU;CACpD,CAAC;AAEF,IAAM,4BAA4B,eAAE,QAAQ,WAAqB;AACjE,IAAM,iCAAiC,eAAE,QAAQ,gBAA0B;AAE3E,IAAa,kBAAqC,eAAE,MAClD,sBACA,wBACA,2BACA,+BACD;AAED,IAAM,uBAAuB,eAAE,OAAO;CACpC,MAAM;CACN,SAAS,WAAW,UAAU;CAK9B,aAAa,eAAE,MAAM,iBAAiB;CACtC,SAAS,eAAE,QAAQ;CACpB,CAAC;AAEF,IAAa,uBAAuB,eAAE,MACpC,qBAAqB,OAAO;CAC1B,QAAQ,eAAE,QAAQ,OAAmB;CACrC,QAAQ,aACN,UACA,OACA,oBACA,wBACA,WACD;CACF,CAAC,EACF,qBAAqB,OAAO;CAC1B,QAAQ,eAAE,QAAQ,UAAsB;CACxC,QAAQ,eAAE,QAAQ,KAAiB;CACnC,QAAQ,eAAE,QAAQ;CAClB,aAAa,eAAE,QAAQ,CAAC,UAAU;CACnC,CAAC,EACF,qBAAqB,OAAO;CAC1B,QAAQ,eAAE,QAAQ,UAAsB;CACxC,QAAQ,aACN,SACA,OACA,WACD;CACF,CAAC,CACH;AAED,IAAM,4BAA4B,eAAE,OAAO;CACzC,MAAM;CACN,SAAS,WAAW,UAAU;CAI9B,UAAU,eAAE,MAAM,eAAE,QAAQ,CAAC;CAC7B,SAAS,eAAE,QAAQ;CACpB,CAAC;AAEF,IAAa,4BAA4B,eAAE,MACzC,0BAA0B,OAAO;CAC/B,QAAQ,eAAE,QAAQ,OAAmB;CACrC,QAAQ,aACN,UACA,OACA,WACD;CACF,CAAC,EACF,0BAA0B,OAAO;CAC/B,QAAQ,eAAE,QAAQ,UAAsB;CACxC,QAAQ,eAAE,QAAQ,KAAiB;CACnC,QAAQ,eAAE,QAAQ;CAClB,aAAa,eAAE,QAAQ,CAAC,UAAU;CACnC,CAAC,EACF,0BAA0B,OAAO;CAC/B,QAAQ,eAAE,QAAQ,UAAsB;CACxC,QAAQ,aACN,SACA,OACA,WACD;CACF,CAAC,CACH;AAED,IAAa,kBAAkB,eAAE,MAC/B,sBACA,mBACA,sBACA,0BACD;AAOD,IAAa,qBAA2C,eAAE,MAAM,CAC9D,eAAE,QAAQ,QAAQ,EAClB,gBACD,CAAC;;;;AAOF,IAAa,gBAAb,cAEU,MAAM;CACd;CAEA,YAAY,WAAc,SAAwB;AAChD,QAAM,UAAU,SAAS,QAAQ;AACjC,OAAK,OAAO;AACZ,OAAK,YAAY;;CAGnB,IAAI,OAAkB;AACpB,SAAO,KAAK,UAAU;;;AAI1B,SAAgB,gBAAgB,OAAwC;AACtE,QAAO,iBAAiB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solid-view.d.ts","sourceRoot":"","sources":["../../../../zero-solid/src/solid-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"solid-view.d.ts","sourceRoot":"","sources":["../../../../zero-solid/src/solid-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAUzE,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,KAAK,EACV,KAAK,YAAY,EACjB,KAAK,MAAM,EACX,KAAK,KAAK,EAEV,KAAK,MAAM,EACX,KAAK,KAAK,EAEV,KAAK,kBAAkB,EACvB,KAAK,MAAM,EAEX,KAAK,GAAG,EACT,MAAM,WAAW,CAAC;AAEnB,MAAM,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;AAEhD,eAAO,MAAM,QAAQ,EAAE,kBAAsD,CAAC;AAC9E,eAAO,MAAM,OAAO,EAAE,kBAAqD,CAAC;AAE5E,qBAAa,SAAU,YAAW,MAAM;;gBAqBpC,KAAK,EAAE,KAAK,EACZ,mBAAmB,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,EAC7C,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,IAAI,EACrB,aAAa,EAAE,IAAI,GAAG,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,EAClD,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,EAC7B,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,EACjC,KAAK,EAAE,MAAM,IAAI;IAiEnB,OAAO,IAAI,IAAI;IA2Bf,IAAI,CAAC,MAAM,EAAE,MAAM;IAwDnB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;CAG1B;AAsDD,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,EACjC,KAAK,CAAC,EAAE,MAAM,IAAI,IAGhB,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,MAAM,EACtB,OAAO,UAEC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,SAChC,KAAK,UACJ,MAAM,aACH,MAAM,IAAI,uBACA,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,iBAC9B,IAAI,GAAG,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,aACvC,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,eAiBhC"}
|
|
@@ -69,7 +69,7 @@ var SolidView = class {
|
|
|
69
69
|
}
|
|
70
70
|
};
|
|
71
71
|
push(change) {
|
|
72
|
-
if (this.#builderRoot) this.#applyChangeToRoot(change, this.#builderRoot);
|
|
72
|
+
if (this.#builderRoot) this.#applyChangeToRoot(materializeRelationships(change), this.#builderRoot);
|
|
73
73
|
else this.#pendingChanges.push(materializeRelationships(change));
|
|
74
74
|
return emptyArray;
|
|
75
75
|
}
|
|
@@ -93,27 +93,27 @@ var SolidView = class {
|
|
|
93
93
|
}
|
|
94
94
|
};
|
|
95
95
|
function materializeRelationships(change) {
|
|
96
|
-
switch (change
|
|
97
|
-
case
|
|
96
|
+
switch (change[0]) {
|
|
97
|
+
case 0: return {
|
|
98
98
|
type: "add",
|
|
99
|
-
node: materializeNodeRelationships(change
|
|
99
|
+
node: materializeNodeRelationships(change[1])
|
|
100
100
|
};
|
|
101
|
-
case
|
|
101
|
+
case 1: return {
|
|
102
102
|
type: "remove",
|
|
103
|
-
node: materializeNodeRelationships(change
|
|
103
|
+
node: materializeNodeRelationships(change[1])
|
|
104
104
|
};
|
|
105
|
-
case
|
|
105
|
+
case 3: return {
|
|
106
106
|
type: "child",
|
|
107
|
-
node: { row: change.
|
|
107
|
+
node: { row: change[1].row },
|
|
108
108
|
child: {
|
|
109
|
-
relationshipName: change.
|
|
110
|
-
change: materializeRelationships(change.
|
|
109
|
+
relationshipName: change[2].relationshipName,
|
|
110
|
+
change: materializeRelationships(change[2].change)
|
|
111
111
|
}
|
|
112
112
|
};
|
|
113
|
-
case
|
|
113
|
+
case 2: return {
|
|
114
114
|
type: "edit",
|
|
115
|
-
node: { row: change.
|
|
116
|
-
oldNode: { row: change.
|
|
115
|
+
node: { row: change[1].row },
|
|
116
|
+
oldNode: { row: change[2].row }
|
|
117
117
|
};
|
|
118
118
|
}
|
|
119
119
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solid-view.js","names":["#input","#format","#onDestroy","#retry","#updateTTL","#onTransactionCommit","#createEmptyRoot","#applyChangesToRoot","#setState","#makeError","#builderRoot","#applyChanges","#pendingChanges","#applyChangeToRoot"],"sources":["../../../../zero-solid/src/solid-view.ts"],"sourcesContent":["import {produce, reconcile, type SetStoreFunction} from 'solid-js/store';\nimport {emptyArray} from '../../shared/src/sentinels.ts';\nimport {\n applyChange,\n idSymbol,\n skipYields,\n type ViewChange,\n} from './bindings.ts';\nimport {\n type AnyViewFactory,\n type Change,\n type Entry,\n type ErroredQuery,\n type Format,\n type Input,\n type Node,\n type Output,\n type Query,\n type QueryErrorDetails,\n type QueryResultDetails,\n type Schema,\n type Stream,\n type TTL,\n} from './zero.ts';\n\nexport type State = [Entry, QueryResultDetails];\n\nexport const COMPLETE: QueryResultDetails = Object.freeze({type: 'complete'});\nexport const UNKNOWN: QueryResultDetails = Object.freeze({type: 'unknown'});\n\nexport class SolidView implements Output {\n readonly #input: Input;\n readonly #format: Format;\n readonly #onDestroy: () => void;\n readonly #retry: () => void;\n\n #setState: SetStoreFunction<State>;\n\n // Optimization: if the store is currently empty we build up\n // the view on a plain old JS object stored at #builderRoot, and return\n // that for the new state on transaction commit. This avoids building up\n // large views from scratch via solid produce. The proxy object used by\n // solid produce is slow and in this case we don't care about solid tracking\n // the fine grained changes (everything has changed, it's all new). For a\n // test case with a view with 3000 rows, each row having 2 children, this\n // optimization reduced #applyChanges time from 743ms to 133ms.\n #builderRoot: Entry | undefined;\n #pendingChanges: ViewChange[] = [];\n readonly #updateTTL: (ttl: TTL) => void;\n\n constructor(\n input: Input,\n onTransactionCommit: (cb: () => void) => void,\n format: Format,\n onDestroy: () => void,\n queryComplete: true | ErroredQuery | Promise<true>,\n updateTTL: (ttl: TTL) => void,\n setState: SetStoreFunction<State>,\n retry: () => void,\n ) {\n this.#input = input;\n onTransactionCommit(this.#onTransactionCommit);\n this.#format = format;\n this.#onDestroy = onDestroy;\n this.#updateTTL = updateTTL;\n this.#retry = retry;\n\n input.setOutput(this);\n\n const initialRoot = this.#createEmptyRoot();\n this.#applyChangesToRoot(\n skipYields(input.fetch({})),\n node => ({type: 'add', node}),\n initialRoot,\n );\n\n this.#setState = setState;\n this.#setState(\n reconcile(\n [\n initialRoot,\n queryComplete === true\n ? COMPLETE\n : 'error' in queryComplete\n ? this.#makeError(queryComplete)\n : UNKNOWN,\n ],\n {\n // solidjs's types want a string, but a symbol works\n key: idSymbol as unknown as string,\n },\n ),\n );\n\n if (isEmptyRoot(initialRoot)) {\n this.#builderRoot = this.#createEmptyRoot();\n }\n\n if (queryComplete !== true && !('error' in queryComplete)) {\n void queryComplete\n .then(() => {\n this.#setState(prev => [prev[0], COMPLETE]);\n })\n .catch((error: ErroredQuery) => {\n this.#setState(prev => [prev[0], this.#makeError(error)]);\n });\n }\n }\n\n #makeError(error: ErroredQuery): QueryErrorDetails {\n const message = error.message ?? 'An unknown error occurred';\n return {\n type: 'error',\n retry: this.#retry,\n refetch: this.#retry,\n error: {\n type: error.error,\n message,\n ...(error.details ? {details: error.details} : {}),\n },\n };\n }\n\n destroy(): void {\n this.#onDestroy();\n }\n\n #onTransactionCommit = () => {\n const builderRoot = this.#builderRoot;\n if (builderRoot) {\n if (!isEmptyRoot(builderRoot)) {\n this.#setState(\n 0,\n reconcile(builderRoot, {\n // solidjs's types want a string, but a symbol works\n key: idSymbol as unknown as string,\n }),\n );\n this.#setState(prev => [builderRoot, prev[1]]);\n this.#builderRoot = undefined;\n }\n } else {\n try {\n this.#applyChanges(this.#pendingChanges, c => c);\n } finally {\n this.#pendingChanges = [];\n }\n }\n };\n\n push(change: Change) {\n // Delay updating the solid store state until the transaction commit\n // (because each update of the solid store is quite expensive). If\n // this.#builderRoot is defined apply the changes to it (we are building\n // from an empty root), otherwise queue the changes to be applied\n // using produce at the end of the transaction but read the relationships\n // now as they are only valid to read when the push is received.\n if (this.#builderRoot) {\n this.#applyChangeToRoot(change, this.#builderRoot);\n } else {\n this.#pendingChanges.push(materializeRelationships(change));\n }\n return emptyArray;\n }\n\n #applyChanges<T>(changes: Iterable<T>, mapper: (v: T) => ViewChange): void {\n this.#setState(\n produce((draftState: State) => {\n this.#applyChangesToRoot<T>(changes, mapper, draftState[0]);\n if (isEmptyRoot(draftState[0])) {\n this.#builderRoot = this.#createEmptyRoot();\n }\n }),\n );\n }\n\n #applyChangesToRoot<T>(\n changes: Iterable<T>,\n mapper: (v: T) => ViewChange,\n root: Entry,\n ) {\n for (const change of changes) {\n this.#applyChangeToRoot(mapper(change), root);\n }\n }\n\n #applyChangeToRoot(change: ViewChange, root: Entry) {\n applyChange(\n root,\n change,\n this.#input.getSchema(),\n '',\n this.#format,\n true /* withIDs */,\n );\n }\n\n #createEmptyRoot(): Entry {\n return {\n '': this.#format.singular ? undefined : [],\n };\n }\n\n updateTTL(ttl: TTL): void {\n this.#updateTTL(ttl);\n }\n}\n\nfunction materializeRelationships(change: Change): ViewChange {\n switch (change.type) {\n case 'add':\n return {type: 'add', node: materializeNodeRelationships(change.node)};\n case 'remove':\n return {type: 'remove', node: materializeNodeRelationships(change.node)};\n case 'child':\n return {\n type: 'child',\n node: {row: change.node.row},\n child: {\n relationshipName: change.child.relationshipName,\n change: materializeRelationships(change.child.change),\n },\n };\n case 'edit':\n return {\n type: 'edit',\n node: {row: change.node.row},\n oldNode: {row: change.oldNode.row},\n };\n }\n}\n\nfunction materializeNodeRelationships(node: Node): Node {\n const relationships: Record<string, () => Stream<Node>> = {};\n for (const relationship in node.relationships) {\n const materialized: Node[] = [];\n for (const n of skipYields(node.relationships[relationship]())) {\n materialized.push(materializeNodeRelationships(n));\n }\n relationships[relationship] = () => materialized;\n }\n return {\n row: node.row,\n relationships,\n };\n}\n\nfunction isEmptyRoot(entry: Entry) {\n const data = entry[''];\n return data === undefined || (Array.isArray(data) && data.length === 0);\n}\n\nexport function createSolidViewFactory(\n setState: SetStoreFunction<State>,\n retry?: () => void,\n) {\n function solidViewFactory<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n >(\n _query: Query<TTable, TSchema, TReturn>,\n input: Input,\n format: Format,\n onDestroy: () => void,\n onTransactionCommit: (cb: () => void) => void,\n queryComplete: true | ErroredQuery | Promise<true>,\n updateTTL: (ttl: TTL) => void,\n ) {\n return new SolidView(\n input,\n onTransactionCommit,\n format,\n onDestroy,\n queryComplete,\n updateTTL,\n setState,\n retry || (() => {}),\n );\n }\n\n solidViewFactory satisfies AnyViewFactory;\n\n return solidViewFactory;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"solid-view.js","names":["#input","#format","#onDestroy","#retry","#updateTTL","#onTransactionCommit","#createEmptyRoot","#applyChangesToRoot","#setState","#makeError","#builderRoot","#applyChanges","#pendingChanges","#applyChangeToRoot"],"sources":["../../../../zero-solid/src/solid-view.ts"],"sourcesContent":["import {produce, reconcile, type SetStoreFunction} from 'solid-js/store';\nimport {emptyArray} from '../../shared/src/sentinels.ts';\nimport {ChangeIndex} from '../../zql/src/ivm/change-index.ts';\nimport {ChangeType} from '../../zql/src/ivm/change-type.ts';\nimport {\n applyChange,\n idSymbol,\n skipYields,\n type ViewChange,\n} from './bindings.ts';\nimport {\n type AnyViewFactory,\n type Change,\n type Entry,\n type ErroredQuery,\n type Format,\n type Input,\n type Node,\n type Output,\n type Query,\n type QueryErrorDetails,\n type QueryResultDetails,\n type Schema,\n type Stream,\n type TTL,\n} from './zero.ts';\n\nexport type State = [Entry, QueryResultDetails];\n\nexport const COMPLETE: QueryResultDetails = Object.freeze({type: 'complete'});\nexport const UNKNOWN: QueryResultDetails = Object.freeze({type: 'unknown'});\n\nexport class SolidView implements Output {\n readonly #input: Input;\n readonly #format: Format;\n readonly #onDestroy: () => void;\n readonly #retry: () => void;\n\n #setState: SetStoreFunction<State>;\n\n // Optimization: if the store is currently empty we build up\n // the view on a plain old JS object stored at #builderRoot, and return\n // that for the new state on transaction commit. This avoids building up\n // large views from scratch via solid produce. The proxy object used by\n // solid produce is slow and in this case we don't care about solid tracking\n // the fine grained changes (everything has changed, it's all new). For a\n // test case with a view with 3000 rows, each row having 2 children, this\n // optimization reduced #applyChanges time from 743ms to 133ms.\n #builderRoot: Entry | undefined;\n #pendingChanges: ViewChange[] = [];\n readonly #updateTTL: (ttl: TTL) => void;\n\n constructor(\n input: Input,\n onTransactionCommit: (cb: () => void) => void,\n format: Format,\n onDestroy: () => void,\n queryComplete: true | ErroredQuery | Promise<true>,\n updateTTL: (ttl: TTL) => void,\n setState: SetStoreFunction<State>,\n retry: () => void,\n ) {\n this.#input = input;\n onTransactionCommit(this.#onTransactionCommit);\n this.#format = format;\n this.#onDestroy = onDestroy;\n this.#updateTTL = updateTTL;\n this.#retry = retry;\n\n input.setOutput(this);\n\n const initialRoot = this.#createEmptyRoot();\n this.#applyChangesToRoot(\n skipYields(input.fetch({})),\n node => ({type: 'add', node}),\n initialRoot,\n );\n\n this.#setState = setState;\n this.#setState(\n reconcile(\n [\n initialRoot,\n queryComplete === true\n ? COMPLETE\n : 'error' in queryComplete\n ? this.#makeError(queryComplete)\n : UNKNOWN,\n ],\n {\n // solidjs's types want a string, but a symbol works\n key: idSymbol as unknown as string,\n },\n ),\n );\n\n if (isEmptyRoot(initialRoot)) {\n this.#builderRoot = this.#createEmptyRoot();\n }\n\n if (queryComplete !== true && !('error' in queryComplete)) {\n void queryComplete\n .then(() => {\n this.#setState(prev => [prev[0], COMPLETE]);\n })\n .catch((error: ErroredQuery) => {\n this.#setState(prev => [prev[0], this.#makeError(error)]);\n });\n }\n }\n\n #makeError(error: ErroredQuery): QueryErrorDetails {\n const message = error.message ?? 'An unknown error occurred';\n return {\n type: 'error',\n retry: this.#retry,\n refetch: this.#retry,\n error: {\n type: error.error,\n message,\n ...(error.details ? {details: error.details} : {}),\n },\n };\n }\n\n destroy(): void {\n this.#onDestroy();\n }\n\n #onTransactionCommit = () => {\n const builderRoot = this.#builderRoot;\n if (builderRoot) {\n if (!isEmptyRoot(builderRoot)) {\n this.#setState(\n 0,\n reconcile(builderRoot, {\n // solidjs's types want a string, but a symbol works\n key: idSymbol as unknown as string,\n }),\n );\n this.#setState(prev => [builderRoot, prev[1]]);\n this.#builderRoot = undefined;\n }\n } else {\n try {\n this.#applyChanges(this.#pendingChanges, c => c);\n } finally {\n this.#pendingChanges = [];\n }\n }\n };\n\n push(change: Change) {\n // Delay updating the solid store state until the transaction commit\n // (because each update of the solid store is quite expensive). If\n // this.#builderRoot is defined apply the changes to it (we are building\n // from an empty root), otherwise queue the changes to be applied\n // using produce at the end of the transaction but read the relationships\n // now as they are only valid to read when the push is received.\n if (this.#builderRoot) {\n this.#applyChangeToRoot(\n materializeRelationships(change),\n this.#builderRoot,\n );\n } else {\n this.#pendingChanges.push(materializeRelationships(change));\n }\n return emptyArray;\n }\n\n #applyChanges<T>(changes: Iterable<T>, mapper: (v: T) => ViewChange): void {\n this.#setState(\n produce((draftState: State) => {\n this.#applyChangesToRoot<T>(changes, mapper, draftState[0]);\n if (isEmptyRoot(draftState[0])) {\n this.#builderRoot = this.#createEmptyRoot();\n }\n }),\n );\n }\n\n #applyChangesToRoot<T>(\n changes: Iterable<T>,\n mapper: (v: T) => ViewChange,\n root: Entry,\n ) {\n for (const change of changes) {\n this.#applyChangeToRoot(mapper(change), root);\n }\n }\n\n #applyChangeToRoot(change: ViewChange, root: Entry) {\n applyChange(\n root,\n change,\n this.#input.getSchema(),\n '',\n this.#format,\n true /* withIDs */,\n );\n }\n\n #createEmptyRoot(): Entry {\n return {\n '': this.#format.singular ? undefined : [],\n };\n }\n\n updateTTL(ttl: TTL): void {\n this.#updateTTL(ttl);\n }\n}\n\nfunction materializeRelationships(change: Change): ViewChange {\n switch (change[ChangeIndex.TYPE]) {\n case ChangeType.ADD:\n return {\n type: 'add',\n node: materializeNodeRelationships(change[ChangeIndex.NODE]),\n };\n case ChangeType.REMOVE:\n return {\n type: 'remove',\n node: materializeNodeRelationships(change[ChangeIndex.NODE]),\n };\n case ChangeType.CHILD:\n return {\n type: 'child',\n node: {row: change[ChangeIndex.NODE].row},\n child: {\n relationshipName: change[ChangeIndex.CHILD_DATA].relationshipName,\n change: materializeRelationships(\n change[ChangeIndex.CHILD_DATA].change,\n ),\n },\n };\n case ChangeType.EDIT:\n return {\n type: 'edit',\n node: {row: change[ChangeIndex.NODE].row},\n oldNode: {row: change[ChangeIndex.OLD_NODE].row},\n };\n }\n}\n\nfunction materializeNodeRelationships(node: Node): Node {\n const relationships: Record<string, () => Stream<Node>> = {};\n for (const relationship in node.relationships) {\n const materialized: Node[] = [];\n for (const n of skipYields(node.relationships[relationship]())) {\n materialized.push(materializeNodeRelationships(n));\n }\n relationships[relationship] = () => materialized;\n }\n return {\n row: node.row,\n relationships,\n };\n}\n\nfunction isEmptyRoot(entry: Entry) {\n const data = entry[''];\n return data === undefined || (Array.isArray(data) && data.length === 0);\n}\n\nexport function createSolidViewFactory(\n setState: SetStoreFunction<State>,\n retry?: () => void,\n) {\n function solidViewFactory<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n >(\n _query: Query<TTable, TSchema, TReturn>,\n input: Input,\n format: Format,\n onDestroy: () => void,\n onTransactionCommit: (cb: () => void) => void,\n queryComplete: true | ErroredQuery | Promise<true>,\n updateTTL: (ttl: TTL) => void,\n ) {\n return new SolidView(\n input,\n onTransactionCommit,\n format,\n onDestroy,\n queryComplete,\n updateTTL,\n setState,\n retry || (() => {}),\n );\n }\n\n solidViewFactory satisfies AnyViewFactory;\n\n return solidViewFactory;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../../../zql/src/builder/builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,6BAA6B,CAAC;AAE3D,OAAO,KAAK,EACV,GAAG,EAGH,SAAS,EAIT,WAAW,EAEX,QAAQ,EAIT,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,oCAAoC,CAAC;AAC5D,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,2CAA2C,CAAC;AAI1E,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,4BAA4B,CAAC;AAIpC,OAAO,KAAK,EAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAElE,OAAO,KAAK,EAAC,MAAM,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAK1D,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../../../zql/src/builder/builder.ts"],"names":[],"mappings":"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"}
|