@rocicorp/zero 0.26.0-canary.0 → 0.26.0-canary.3
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/README.md +1 -1
- package/out/replicache/src/persist/collect-idb-databases.d.ts +4 -4
- package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
- package/out/replicache/src/persist/collect-idb-databases.js +22 -19
- package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
- package/out/replicache/src/persist/refresh.d.ts.map +1 -1
- package/out/replicache/src/persist/refresh.js +0 -8
- package/out/replicache/src/persist/refresh.js.map +1 -1
- package/out/replicache/src/process-scheduler.d.ts +23 -0
- package/out/replicache/src/process-scheduler.d.ts.map +1 -1
- package/out/replicache/src/process-scheduler.js +50 -1
- package/out/replicache/src/process-scheduler.js.map +1 -1
- package/out/replicache/src/replicache-impl.d.ts +8 -0
- package/out/replicache/src/replicache-impl.d.ts.map +1 -1
- package/out/replicache/src/replicache-impl.js +11 -2
- package/out/replicache/src/replicache-impl.js.map +1 -1
- package/out/shared/src/custom-key-map.d.ts +4 -4
- package/out/shared/src/custom-key-map.d.ts.map +1 -1
- package/out/shared/src/custom-key-map.js.map +1 -1
- package/out/shared/src/falsy.d.ts +3 -0
- package/out/shared/src/falsy.d.ts.map +1 -0
- package/out/shared/src/iterables.d.ts +6 -8
- package/out/shared/src/iterables.d.ts.map +1 -1
- package/out/shared/src/iterables.js +13 -7
- package/out/shared/src/iterables.js.map +1 -1
- package/out/shared/src/options.d.ts +1 -0
- package/out/shared/src/options.d.ts.map +1 -1
- package/out/shared/src/options.js +5 -1
- package/out/shared/src/options.js.map +1 -1
- package/out/zero/package.json.js +1 -1
- package/out/zero/src/adapters/drizzle.js +1 -2
- package/out/zero/src/adapters/prisma.d.ts +2 -0
- package/out/zero/src/adapters/prisma.d.ts.map +1 -0
- package/out/zero/src/adapters/prisma.js +6 -0
- package/out/zero/src/adapters/prisma.js.map +1 -0
- package/out/zero/src/pg.js +4 -7
- package/out/zero/src/react.js +3 -1
- package/out/zero/src/react.js.map +1 -1
- package/out/zero/src/server.js +5 -8
- package/out/zero/src/zero-cache-dev.js +7 -3
- package/out/zero/src/zero-cache-dev.js.map +1 -1
- package/out/zero-cache/src/auth/load-permissions.d.ts +3 -2
- package/out/zero-cache/src/auth/load-permissions.d.ts.map +1 -1
- package/out/zero-cache/src/auth/load-permissions.js +14 -8
- package/out/zero-cache/src/auth/load-permissions.js.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.d.ts +6 -0
- package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.js +16 -3
- package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +54 -9
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +80 -20
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/custom/fetch.d.ts +3 -0
- package/out/zero-cache/src/custom/fetch.d.ts.map +1 -1
- package/out/zero-cache/src/custom/fetch.js +26 -0
- package/out/zero-cache/src/custom/fetch.js.map +1 -1
- package/out/zero-cache/src/db/lite-tables.js +1 -1
- package/out/zero-cache/src/db/lite-tables.js.map +1 -1
- package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
- package/out/zero-cache/src/db/migration-lite.js +9 -3
- package/out/zero-cache/src/db/migration-lite.js.map +1 -1
- package/out/zero-cache/src/db/migration.d.ts.map +1 -1
- package/out/zero-cache/src/db/migration.js +9 -3
- package/out/zero-cache/src/db/migration.js.map +1 -1
- package/out/zero-cache/src/db/specs.d.ts +4 -3
- package/out/zero-cache/src/db/specs.d.ts.map +1 -1
- package/out/zero-cache/src/db/specs.js +4 -1
- package/out/zero-cache/src/db/specs.js.map +1 -1
- package/out/zero-cache/src/db/transaction-pool.d.ts.map +1 -1
- package/out/zero-cache/src/db/transaction-pool.js +9 -3
- 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 +15 -5
- package/out/zero-cache/src/observability/events.js.map +1 -1
- package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/server/change-streamer.js +10 -2
- package/out/zero-cache/src/server/change-streamer.js.map +1 -1
- package/out/zero-cache/src/server/inspector-delegate.d.ts +1 -1
- package/out/zero-cache/src/server/inspector-delegate.d.ts.map +1 -1
- package/out/zero-cache/src/server/inspector-delegate.js +11 -30
- package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
- package/out/zero-cache/src/server/main.js +1 -1
- package/out/zero-cache/src/server/main.js.map +1 -1
- package/out/zero-cache/src/server/priority-op.d.ts +8 -0
- package/out/zero-cache/src/server/priority-op.d.ts.map +1 -0
- package/out/zero-cache/src/server/priority-op.js +29 -0
- package/out/zero-cache/src/server/priority-op.js.map +1 -0
- package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/server/syncer.js +10 -10
- package/out/zero-cache/src/server/syncer.js.map +1 -1
- package/out/zero-cache/src/services/analyze.js +1 -1
- package/out/zero-cache/src/services/analyze.js.map +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.js +4 -7
- package/out/zero-cache/src/services/change-source/custom/change-source.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 +68 -13
- 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.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js +7 -2
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +7 -4
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +125 -180
- 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 +1 -10
- 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 +26 -12
- 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 +36 -90
- 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 +51 -14
- 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.d.ts +31 -36
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js +25 -17
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/validation.d.ts +2 -2
- package/out/zero-cache/src/services/change-source/pg/schema/validation.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/validation.js +2 -4
- package/out/zero-cache/src/services/change-source/pg/schema/validation.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +158 -53
- package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/data.js +55 -10
- package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +210 -72
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current.js +4 -2
- package/out/zero-cache/src/services/change-source/replica-schema.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/replica-schema.js +20 -4
- package/out/zero-cache/src/services/change-source/replica-schema.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +1 -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 +6 -4
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +71 -25
- package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.js +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +1 -0
- package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.js +6 -5
- package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.d.ts +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js +17 -6
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +2 -0
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.js +14 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.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 -0
- package/out/zero-cache/src/services/heapz.js.map +1 -1
- package/out/zero-cache/src/services/life-cycle.d.ts +1 -1
- package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
- package/out/zero-cache/src/services/life-cycle.js.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.js +3 -1
- package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
- package/out/zero-cache/src/services/litestream/config.yml +1 -0
- package/out/zero-cache/src/services/mutagen/error.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/error.js +4 -1
- package/out/zero-cache/src/services/mutagen/error.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts +4 -4
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js +10 -24
- package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/pusher.d.ts +8 -6
- package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/pusher.js +130 -19
- package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.js +24 -31
- package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/change-log.d.ts +4 -4
- package/out/zero-cache/src/services/replicator/schema/change-log.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/change-log.js +38 -36
- package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -1
- package/out/zero-cache/src/services/{change-source → replicator/schema}/column-metadata.d.ts +3 -3
- package/out/zero-cache/src/services/replicator/schema/column-metadata.d.ts.map +1 -0
- package/out/zero-cache/src/services/{change-source → replicator/schema}/column-metadata.js +3 -3
- package/out/zero-cache/src/services/replicator/schema/column-metadata.js.map +1 -0
- package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/replication-state.js +3 -1
- package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
- package/out/zero-cache/src/services/run-ast.js +1 -1
- 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 +1 -0
- package/out/zero-cache/src/services/statz.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +5 -6
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.js +5 -23
- package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.js +65 -44
- package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts +0 -1
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.js +23 -6
- package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +14 -22
- 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 +46 -67
- 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 +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 +22 -11
- package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +0 -2
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.js +3 -11
- package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +6 -4
- 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 +216 -243
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/lexi-version.d.ts.map +1 -1
- package/out/zero-cache/src/types/lexi-version.js +4 -1
- package/out/zero-cache/src/types/lexi-version.js.map +1 -1
- package/out/zero-cache/src/types/lite.d.ts.map +1 -1
- package/out/zero-cache/src/types/lite.js +8 -2
- package/out/zero-cache/src/types/lite.js.map +1 -1
- package/out/zero-cache/src/types/shards.js +1 -1
- package/out/zero-cache/src/types/shards.js.map +1 -1
- package/out/zero-cache/src/types/sql.d.ts +5 -0
- package/out/zero-cache/src/types/sql.d.ts.map +1 -1
- package/out/zero-cache/src/types/sql.js +5 -1
- package/out/zero-cache/src/types/sql.js.map +1 -1
- package/out/zero-cache/src/types/subscription.js +1 -1
- package/out/zero-cache/src/types/subscription.js.map +1 -1
- package/out/zero-cache/src/workers/connect-params.d.ts +1 -1
- package/out/zero-cache/src/workers/connect-params.d.ts.map +1 -1
- package/out/zero-cache/src/workers/connect-params.js +2 -3
- package/out/zero-cache/src/workers/connect-params.js.map +1 -1
- package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/workers/replicator.js +2 -5
- package/out/zero-cache/src/workers/replicator.js.map +1 -1
- package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +1 -1
- package/out/zero-cache/src/workers/syncer-ws-message-handler.js +15 -10
- package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
- package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/workers/syncer.js +17 -10
- package/out/zero-cache/src/workers/syncer.js.map +1 -1
- package/out/zero-client/src/client/connection-manager.d.ts +8 -0
- package/out/zero-client/src/client/connection-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/connection-manager.js +33 -0
- package/out/zero-client/src/client/connection-manager.js.map +1 -1
- package/out/zero-client/src/client/connection.d.ts.map +1 -1
- package/out/zero-client/src/client/connection.js +6 -3
- package/out/zero-client/src/client/connection.js.map +1 -1
- package/out/zero-client/src/client/context.js +1 -0
- package/out/zero-client/src/client/context.js.map +1 -1
- package/out/zero-client/src/client/error.js +1 -1
- package/out/zero-client/src/client/error.js.map +1 -1
- package/out/zero-client/src/client/mutator-proxy.d.ts.map +1 -1
- package/out/zero-client/src/client/mutator-proxy.js +15 -1
- package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
- package/out/zero-client/src/client/options.d.ts +11 -1
- package/out/zero-client/src/client/options.d.ts.map +1 -1
- package/out/zero-client/src/client/options.js.map +1 -1
- package/out/zero-client/src/client/query-manager.d.ts +4 -0
- package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/query-manager.js +7 -0
- package/out/zero-client/src/client/query-manager.js.map +1 -1
- package/out/zero-client/src/client/version.js +1 -1
- package/out/zero-client/src/client/zero.d.ts +5 -5
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.js +53 -8
- package/out/zero-client/src/client/zero.js.map +1 -1
- package/out/zero-client/src/mod.d.ts +1 -0
- package/out/zero-client/src/mod.d.ts.map +1 -1
- package/out/zero-protocol/src/connect.d.ts +4 -0
- package/out/zero-protocol/src/connect.d.ts.map +1 -1
- package/out/zero-protocol/src/connect.js +3 -1
- package/out/zero-protocol/src/connect.js.map +1 -1
- package/out/zero-protocol/src/protocol-version.d.ts +1 -1
- package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
- package/out/zero-protocol/src/protocol-version.js +1 -1
- package/out/zero-protocol/src/protocol-version.js.map +1 -1
- package/out/zero-protocol/src/push.d.ts +16 -0
- package/out/zero-protocol/src/push.d.ts.map +1 -1
- package/out/zero-protocol/src/push.js +25 -1
- package/out/zero-protocol/src/push.js.map +1 -1
- package/out/zero-protocol/src/up.d.ts +2 -0
- package/out/zero-protocol/src/up.d.ts.map +1 -1
- package/out/zero-react/src/mod.d.ts +3 -1
- package/out/zero-react/src/mod.d.ts.map +1 -1
- package/out/zero-react/src/paging-reducer.d.ts +61 -0
- package/out/zero-react/src/paging-reducer.d.ts.map +1 -0
- package/out/zero-react/src/paging-reducer.js +77 -0
- package/out/zero-react/src/paging-reducer.js.map +1 -0
- package/out/zero-react/src/use-query.d.ts +11 -1
- package/out/zero-react/src/use-query.d.ts.map +1 -1
- package/out/zero-react/src/use-query.js +13 -11
- package/out/zero-react/src/use-query.js.map +1 -1
- package/out/zero-react/src/use-rows.d.ts +39 -0
- package/out/zero-react/src/use-rows.d.ts.map +1 -0
- package/out/zero-react/src/use-rows.js +130 -0
- package/out/zero-react/src/use-rows.js.map +1 -0
- package/out/zero-react/src/use-zero-virtualizer.d.ts +122 -0
- package/out/zero-react/src/use-zero-virtualizer.d.ts.map +1 -0
- package/out/zero-react/src/use-zero-virtualizer.js +342 -0
- package/out/zero-react/src/use-zero-virtualizer.js.map +1 -0
- package/out/zero-react/src/zero-provider.js +1 -1
- package/out/zero-react/src/zero-provider.js.map +1 -1
- package/out/zero-server/src/adapters/drizzle.d.ts +18 -18
- package/out/zero-server/src/adapters/drizzle.d.ts.map +1 -1
- package/out/zero-server/src/adapters/drizzle.js +8 -22
- package/out/zero-server/src/adapters/drizzle.js.map +1 -1
- package/out/zero-server/src/adapters/pg.d.ts +19 -13
- package/out/zero-server/src/adapters/pg.d.ts.map +1 -1
- package/out/zero-server/src/adapters/pg.js.map +1 -1
- package/out/zero-server/src/adapters/postgresjs.d.ts +19 -13
- package/out/zero-server/src/adapters/postgresjs.d.ts.map +1 -1
- package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
- package/out/zero-server/src/adapters/prisma.d.ts +66 -0
- package/out/zero-server/src/adapters/prisma.d.ts.map +1 -0
- package/out/zero-server/src/adapters/prisma.js +63 -0
- package/out/zero-server/src/adapters/prisma.js.map +1 -0
- package/out/zero-server/src/custom.js +1 -15
- package/out/zero-server/src/custom.js.map +1 -1
- package/out/zero-server/src/mod.d.ts +9 -8
- package/out/zero-server/src/mod.d.ts.map +1 -1
- package/out/zero-server/src/process-mutations.d.ts +2 -1
- package/out/zero-server/src/process-mutations.d.ts.map +1 -1
- package/out/zero-server/src/process-mutations.js +39 -4
- package/out/zero-server/src/process-mutations.js.map +1 -1
- package/out/zero-server/src/push-processor.js +1 -1
- package/out/zero-server/src/push-processor.js.map +1 -1
- package/out/zero-server/src/schema.d.ts.map +1 -1
- package/out/zero-server/src/schema.js +4 -1
- package/out/zero-server/src/schema.js.map +1 -1
- package/out/zero-server/src/zql-database.d.ts.map +1 -1
- package/out/zero-server/src/zql-database.js +18 -0
- package/out/zero-server/src/zql-database.js.map +1 -1
- package/out/zero-solid/src/mod.d.ts +1 -1
- package/out/zero-solid/src/mod.d.ts.map +1 -1
- package/out/zero-solid/src/solid-view.js +1 -0
- package/out/zero-solid/src/solid-view.js.map +1 -1
- package/out/zero-solid/src/use-query.d.ts +10 -1
- package/out/zero-solid/src/use-query.d.ts.map +1 -1
- package/out/zero-solid/src/use-query.js +22 -5
- package/out/zero-solid/src/use-query.js.map +1 -1
- package/out/zero-solid/src/use-zero.js +1 -1
- package/out/zero-solid/src/use-zero.js.map +1 -1
- package/out/zql/src/ivm/constraint.d.ts.map +1 -1
- package/out/zql/src/ivm/constraint.js +4 -1
- package/out/zql/src/ivm/constraint.js.map +1 -1
- package/out/zql/src/ivm/exists.d.ts.map +1 -1
- package/out/zql/src/ivm/exists.js +4 -1
- package/out/zql/src/ivm/exists.js.map +1 -1
- package/out/zql/src/ivm/join-utils.d.ts.map +1 -1
- package/out/zql/src/ivm/join-utils.js +8 -2
- package/out/zql/src/ivm/join-utils.js.map +1 -1
- package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-source.js +12 -3
- package/out/zql/src/ivm/memory-source.js.map +1 -1
- package/out/zql/src/ivm/push-accumulated.d.ts.map +1 -1
- package/out/zql/src/ivm/push-accumulated.js +25 -2
- package/out/zql/src/ivm/push-accumulated.js.map +1 -1
- package/out/zql/src/ivm/stream.d.ts.map +1 -1
- package/out/zql/src/ivm/stream.js +1 -1
- package/out/zql/src/ivm/stream.js.map +1 -1
- package/out/zql/src/ivm/take.d.ts.map +1 -1
- package/out/zql/src/ivm/take.js +24 -6
- package/out/zql/src/ivm/take.js.map +1 -1
- package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
- package/out/zql/src/ivm/union-fan-in.js +12 -3
- package/out/zql/src/ivm/union-fan-in.js.map +1 -1
- package/out/zql/src/mutate/mutator.js +4 -4
- package/out/zql/src/mutate/mutator.js.map +1 -1
- package/out/zql/src/query/create-builder.js +3 -5
- package/out/zql/src/query/create-builder.js.map +1 -1
- package/out/zql/src/query/query-registry.js +4 -4
- package/out/zql/src/query/query-registry.js.map +1 -1
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +1 -2
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +8 -4
- package/out/zero-cache/src/services/change-source/column-metadata.d.ts.map +0 -1
- package/out/zero-cache/src/services/change-source/column-metadata.js.map +0 -1
- package/out/zero-cache/src/types/schema-versions.d.ts +0 -12
- package/out/zero-cache/src/types/schema-versions.d.ts.map +0 -1
- package/out/zero-cache/src/types/schema-versions.js +0 -28
- package/out/zero-cache/src/types/schema-versions.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-handler.js","sources":["../../../../../../zero-cache/src/services/view-syncer/client-handler.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport {assert, unreachable} from '../../../../shared/src/asserts.ts';\nimport type {JSONObject} from '../../../../shared/src/bigint-json.ts';\nimport {\n assertJSONValue,\n type JSONObject as SafeJSONObject,\n} from '../../../../shared/src/json.ts';\nimport {promiseVoid} from '../../../../shared/src/resolved-promises.ts';\nimport * as v from '../../../../shared/src/valita.ts';\nimport type {Writable} from '../../../../shared/src/writable.ts';\nimport {rowSchema} from '../../../../zero-protocol/src/data.ts';\nimport type {DeleteClientsBody} from '../../../../zero-protocol/src/delete-clients.ts';\nimport type {Downstream} from '../../../../zero-protocol/src/down.ts';\nimport type {InspectDownBody} from '../../../../zero-protocol/src/inspect-down.ts';\nimport type {\n PokePartBody,\n PokeStartBody,\n} from '../../../../zero-protocol/src/poke.ts';\nimport {primaryKeyValueRecordSchema} from '../../../../zero-protocol/src/primary-key.ts';\nimport {mutationResultSchema} from '../../../../zero-protocol/src/push.ts';\nimport type {RowPatchOp} from '../../../../zero-protocol/src/row-patch.ts';\nimport {\n getOrCreateCounter,\n getOrCreateHistogram,\n} from '../../observability/metrics.ts';\nimport {\n getLogLevel,\n wrapWithProtocolError,\n} from '../../types/error-with-level.ts';\nimport {\n getProtocolErrorIfSchemaVersionNotSupported,\n type SchemaVersions,\n} from '../../types/schema-versions.ts';\nimport {upstreamSchema, type ShardID} from '../../types/shards.ts';\nimport type {Subscription} from '../../types/subscription.ts';\nimport {\n cmpVersions,\n cookieToVersion,\n versionToCookie,\n versionToNullableCookie,\n type CVRVersion,\n type DelQueryPatch,\n type NullableCVRVersion,\n type PutQueryPatch,\n type RowID,\n} from './schema/types.ts';\nimport type {ErroredQuery} from '../../../../zero-protocol/src/custom-queries.ts';\nimport {\n ProtocolError,\n type TransformFailedBody,\n} from '../../../../zero-protocol/src/error.ts';\n\nexport type PutRowPatch = {\n type: 'row';\n op: 'put';\n id: RowID;\n contents: JSONObject;\n};\n\nexport type DeleteRowPatch = {\n type: 'row';\n op: 'del';\n id: RowID;\n};\n\nexport type RowPatch = PutRowPatch | DeleteRowPatch;\nexport type ConfigPatch = DelQueryPatch | PutQueryPatch;\n\nexport type Patch = ConfigPatch | RowPatch;\n\nexport type PatchToVersion = {\n patch: Patch;\n toVersion: CVRVersion;\n};\n\nexport interface PokeHandler {\n addPatch(patch: PatchToVersion): Promise<void>;\n cancel(): Promise<void>;\n end(finalVersion: CVRVersion): Promise<void>;\n}\n\nconst NOOP: PokeHandler = {\n addPatch: () => promiseVoid,\n cancel: () => promiseVoid,\n end: () => promiseVoid,\n};\n\n/** Wraps PokeHandlers for multiple clients in a single PokeHandler. */\nexport function startPoke(\n clients: ClientHandler[],\n tentativeVersion: CVRVersion,\n schemaVersions?: SchemaVersions, // absent for config-only pokes\n): PokeHandler {\n const pokers = clients.map(c =>\n c.startPoke(tentativeVersion, schemaVersions),\n );\n\n // Promise.allSettled() ensures that a failed (e.g. disconnected) client\n // does not prevent other clients from receiving the pokes. However, the\n // rate (per client group) will be limited by the slowest connection.\n return {\n addPatch: async patch => {\n await Promise.allSettled(pokers.map(poker => poker.addPatch(patch)));\n },\n cancel: async () => {\n await Promise.allSettled(pokers.map(poker => poker.cancel()));\n },\n end: async finalVersion => {\n await Promise.allSettled(pokers.map(poker => poker.end(finalVersion)));\n },\n };\n}\n\n// Semi-arbitrary threshold at which poke body parts are flushed.\n// When row size is being computed, that should be used as a threshold instead.\nconst PART_COUNT_FLUSH_THRESHOLD = 100;\n\n/**\n * Handles a single `ViewSyncer` connection.\n */\nexport class ClientHandler {\n readonly #clientGroupID: string;\n readonly clientID: string;\n readonly wsID: string;\n readonly #zeroClientsTable: string;\n readonly #zeroMutationsTable: string;\n readonly #lc: LogContext;\n readonly #downstream: Subscription<Downstream>;\n #baseVersion: NullableCVRVersion;\n readonly #schemaVersion: number | null;\n\n readonly #pokeTime = getOrCreateHistogram('sync', 'poke.time', {\n description:\n 'Time elapsed for each poke transaction. Canceled / noop pokes are excluded.',\n unit: 's',\n });\n\n readonly #pokeTransactions = getOrCreateCounter(\n 'sync',\n 'poke.transactions',\n 'Count of poke transactions.',\n );\n\n readonly #pokedRows = getOrCreateCounter(\n 'sync',\n 'poke.rows',\n 'Count of poked rows.',\n );\n\n constructor(\n lc: LogContext,\n clientGroupID: string,\n clientID: string,\n wsID: string,\n shard: ShardID,\n baseCookie: string | null,\n schemaVersion: number | null,\n downstream: Subscription<Downstream>,\n ) {\n lc.debug?.('new client handler');\n this.#clientGroupID = clientGroupID;\n this.clientID = clientID;\n this.wsID = wsID;\n this.#zeroClientsTable = `${upstreamSchema(shard)}.clients`;\n this.#zeroMutationsTable = `${upstreamSchema(shard)}.mutations`;\n this.#lc = lc;\n this.#downstream = downstream;\n this.#baseVersion = cookieToVersion(baseCookie);\n this.#schemaVersion = schemaVersion;\n }\n\n version(): NullableCVRVersion {\n return this.#baseVersion;\n }\n\n async #push(msg: Downstream): Promise<void> {\n const {result} = this.#downstream.push(msg);\n await result;\n }\n\n fail(e: unknown) {\n this.#lc[getLogLevel(e)]?.(\n `view-syncer closing connection with error: ${String(e)}`,\n e,\n );\n this.#downstream.fail(wrapWithProtocolError(e));\n }\n\n close(reason: string) {\n this.#lc.debug?.(`view-syncer closing connection: ${reason}`);\n this.#downstream.cancel();\n }\n\n startPoke(\n tentativeVersion: CVRVersion,\n schemaVersions?: SchemaVersions, // absent for config-only pokes\n ): PokeHandler {\n const pokeID = versionToCookie(tentativeVersion);\n const lc = this.#lc.withContext('pokeID', pokeID);\n\n if (schemaVersions && this.#schemaVersion) {\n const schemaVersionError = getProtocolErrorIfSchemaVersionNotSupported(\n this.#schemaVersion,\n schemaVersions,\n );\n\n if (schemaVersionError) {\n this.fail(schemaVersionError);\n return NOOP;\n }\n }\n\n if (cmpVersions(this.#baseVersion, tentativeVersion) >= 0) {\n lc.info?.(`already caught up, not sending poke.`);\n return NOOP;\n }\n\n const baseCookie = versionToNullableCookie(this.#baseVersion);\n const cookie = versionToCookie(tentativeVersion);\n lc.info?.(`starting poke from ${baseCookie} to ${cookie}`);\n\n const start = performance.now();\n\n const pokeStart: PokeStartBody = {pokeID, baseCookie};\n if (schemaVersions) {\n pokeStart.schemaVersions = schemaVersions;\n }\n\n let pokeStarted = false;\n let body: PokePartBody | undefined;\n let partCount = 0;\n const ensureBody = async () => {\n if (!pokeStarted) {\n await this.#push(['pokeStart', pokeStart]);\n pokeStarted = true;\n }\n return (body ??= {pokeID});\n };\n const flushBody = async () => {\n if (body) {\n await this.#push(['pokePart', body]);\n body = undefined;\n partCount = 0;\n }\n };\n\n const addPatch = async (patchToVersion: PatchToVersion) => {\n const {patch, toVersion} = patchToVersion;\n if (cmpVersions(toVersion, this.#baseVersion) <= 0) {\n return;\n }\n const body = await ensureBody();\n\n const {type, op} = patch;\n switch (type) {\n case 'query': {\n const patches = patch.clientID\n ? ((body.desiredQueriesPatches ??= {})[patch.clientID] ??= [])\n : (body.gotQueriesPatch ??= []);\n if (op === 'put') {\n patches.push({op, hash: patch.id});\n } else {\n patches.push({op, hash: patch.id});\n }\n break;\n }\n case 'row':\n if (patch.id.table === this.#zeroClientsTable) {\n this.#updateLMIDs((body.lastMutationIDChanges ??= {}), patch);\n } else if (patch.id.table === this.#zeroMutationsTable) {\n const patches = (body.mutationsPatch ??= []);\n if (op === 'put') {\n const row = v.parse(\n ensureSafeJSON(patch.contents),\n mutationRowSchema,\n 'passthrough',\n );\n patches.push({\n op: 'put',\n mutation: {\n id: {\n clientID: row.clientID,\n id: row.mutationID,\n },\n result: row.result,\n },\n });\n } else {\n const {clientID, mutationID} = patch.id.rowKey;\n assert(\n typeof clientID === 'string',\n 'client id must be a string',\n );\n const id = Number(mutationID);\n assert(\n !Number.isNaN(id) && Number.isFinite(id) && id >= 0,\n 'mutation id must be a finite number',\n );\n patches.push({\n op: 'del',\n id: {\n clientID,\n id,\n },\n });\n }\n } else {\n (body.rowsPatch ??= []).push(makeRowPatch(patch));\n }\n break;\n default:\n unreachable(patch);\n }\n\n if (++partCount >= PART_COUNT_FLUSH_THRESHOLD) {\n await flushBody();\n }\n };\n\n return {\n addPatch: async (patchToVersion: PatchToVersion) => {\n try {\n await addPatch(patchToVersion);\n if (patchToVersion.patch.type === 'row') {\n this.#pokedRows.add(1);\n }\n } catch (e) {\n this.#downstream.fail(wrapWithProtocolError(e));\n }\n },\n\n cancel: async () => {\n if (pokeStarted) {\n await this.#push(['pokeEnd', {pokeID, cookie: '', cancel: true}]);\n }\n },\n\n end: async (finalVersion: CVRVersion) => {\n const cookie = versionToCookie(finalVersion);\n if (!pokeStarted) {\n if (cmpVersions(this.#baseVersion, finalVersion) === 0) {\n return; // Nothing changed and nothing was sent.\n }\n await this.#push(['pokeStart', pokeStart]);\n } else if (cmpVersions(this.#baseVersion, finalVersion) >= 0) {\n // Sanity check: If the poke was started, the finalVersion\n // must be > #baseVersion.\n throw new Error(\n `Patches were sent but finalVersion ${finalVersion} is ` +\n `not greater than baseVersion ${this.#baseVersion}`,\n );\n }\n await flushBody();\n await this.#push(['pokeEnd', {pokeID, cookie}]);\n this.#baseVersion = finalVersion;\n\n const elapsed = performance.now() - start;\n this.#pokeTransactions.add(1);\n this.#pokeTime.record(elapsed / 1000);\n },\n };\n }\n\n async sendDeleteClients(\n lc: LogContext,\n deletedClientIDs: string[],\n deletedClientGroupIDs: string[],\n ) {\n const deleteClientsBody: Writable<DeleteClientsBody> = {};\n if (deletedClientIDs.length > 0) {\n deleteClientsBody.clientIDs = deletedClientIDs;\n }\n if (deletedClientGroupIDs.length > 0) {\n deleteClientsBody.clientGroupIDs = deletedClientGroupIDs;\n }\n lc.debug?.('sending deleteClients', deleteClientsBody);\n await this.#push(['deleteClients', deleteClientsBody]);\n }\n\n sendQueryTransformApplicationErrors(errors: ErroredQuery[]) {\n void this.#push(['transformError', errors]);\n }\n\n sendQueryTransformFailedError(error: TransformFailedBody) {\n this.fail(new ProtocolError(error));\n }\n\n sendInspectResponse(lc: LogContext, response: InspectDownBody): void {\n lc.debug?.('sending inspect response', response);\n this.#downstream.push(['inspect', response]);\n }\n\n #updateLMIDs(lmids: Record<string, number>, patch: RowPatch) {\n if (patch.op === 'put') {\n const row = ensureSafeJSON(patch.contents);\n const {clientGroupID, clientID, lastMutationID} = v.parse(\n row,\n lmidRowSchema,\n 'passthrough',\n );\n if (clientGroupID !== this.#clientGroupID) {\n this.#lc.error?.(\n `Received clients row for wrong clientGroupID. Ignoring.`,\n clientGroupID,\n );\n } else {\n lmids[clientID] = lastMutationID;\n }\n } else {\n // The 'constrain' and 'del' ops for clients can be ignored.\n patch.op satisfies 'constrain' | 'del';\n }\n }\n}\n\n// Note: The {APP_ID}_{SHARD_ID}.clients table is set up in replicator/initial-sync.ts.\nconst lmidRowSchema = v.object({\n clientGroupID: v.string(),\n clientID: v.string(),\n lastMutationID: v.number(), // Actually returned as a bigint, but converted by ensureSafeJSON().\n});\n\nconst mutationRowSchema = v.object({\n clientGroupID: v.string(),\n clientID: v.string(),\n mutationID: v.number(),\n result: mutationResultSchema,\n});\n\nfunction makeRowPatch(patch: RowPatch): RowPatchOp {\n const {\n op,\n id: {table: tableName, rowKey: id},\n } = patch;\n\n switch (op) {\n case 'put':\n return {\n op: 'put',\n tableName,\n value: v.parse(ensureSafeJSON(patch.contents), rowSchema),\n };\n\n case 'del':\n return {\n op,\n tableName,\n id: v.parse(id, primaryKeyValueRecordSchema),\n };\n\n default:\n unreachable(op);\n }\n}\n\n/**\n * Column values of type INT8 are returned as the `bigint` from the\n * Postgres library. These are converted to `number` if they are within\n * the safe Number range, allowing the protocol to support numbers larger\n * than 32-bits. Values outside of the safe number range (e.g. > 2^53) will\n * result in an Error.\n */\nexport function ensureSafeJSON(row: JSONObject): SafeJSONObject {\n const modified = Object.entries(row)\n .filter(([k, v]) => {\n if (typeof v === 'bigint') {\n if (v >= Number.MIN_SAFE_INTEGER && v <= Number.MAX_SAFE_INTEGER) {\n return true; // send this entry onto the next map() step.\n }\n throw new Error(`Value of \"${k}\" exceeds safe Number range (${v})`);\n } else if (typeof v === 'object') {\n assertJSONValue(v);\n }\n return false;\n })\n .map(([k, v]) => [k, Number(v)]);\n\n return modified.length\n ? {...row, ...Object.fromEntries(modified)}\n : (row as SafeJSONObject);\n}\n"],"names":["body","v.parse","cookie","v.object","v.string","v.number","v"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client-handler.js","sources":["../../../../../../zero-cache/src/services/view-syncer/client-handler.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport {assert, unreachable} from '../../../../shared/src/asserts.ts';\nimport type {JSONObject} from '../../../../shared/src/bigint-json.ts';\nimport {\n assertJSONValue,\n type JSONObject as SafeJSONObject,\n} from '../../../../shared/src/json.ts';\nimport {promiseVoid} from '../../../../shared/src/resolved-promises.ts';\nimport * as v from '../../../../shared/src/valita.ts';\nimport type {Writable} from '../../../../shared/src/writable.ts';\nimport type {ErroredQuery} from '../../../../zero-protocol/src/custom-queries.ts';\nimport {rowSchema} from '../../../../zero-protocol/src/data.ts';\nimport type {DeleteClientsBody} from '../../../../zero-protocol/src/delete-clients.ts';\nimport type {Downstream} from '../../../../zero-protocol/src/down.ts';\nimport {\n ProtocolError,\n type TransformFailedBody,\n} from '../../../../zero-protocol/src/error.ts';\nimport type {InspectDownBody} from '../../../../zero-protocol/src/inspect-down.ts';\nimport type {\n PokePartBody,\n PokeStartBody,\n} from '../../../../zero-protocol/src/poke.ts';\nimport {primaryKeyValueRecordSchema} from '../../../../zero-protocol/src/primary-key.ts';\nimport {mutationResultSchema} from '../../../../zero-protocol/src/push.ts';\nimport type {RowPatchOp} from '../../../../zero-protocol/src/row-patch.ts';\nimport {\n getOrCreateCounter,\n getOrCreateHistogram,\n} from '../../observability/metrics.ts';\nimport {\n getLogLevel,\n wrapWithProtocolError,\n} from '../../types/error-with-level.ts';\nimport {upstreamSchema, type ShardID} from '../../types/shards.ts';\nimport type {Subscription} from '../../types/subscription.ts';\nimport {\n cmpVersions,\n cookieToVersion,\n versionToCookie,\n versionToNullableCookie,\n type CVRVersion,\n type DelQueryPatch,\n type NullableCVRVersion,\n type PutQueryPatch,\n type RowID,\n} from './schema/types.ts';\n\nexport type PutRowPatch = {\n type: 'row';\n op: 'put';\n id: RowID;\n contents: JSONObject;\n};\n\nexport type DeleteRowPatch = {\n type: 'row';\n op: 'del';\n id: RowID;\n};\n\nexport type RowPatch = PutRowPatch | DeleteRowPatch;\nexport type ConfigPatch = DelQueryPatch | PutQueryPatch;\n\nexport type Patch = ConfigPatch | RowPatch;\n\nexport type PatchToVersion = {\n patch: Patch;\n toVersion: CVRVersion;\n};\n\nexport interface PokeHandler {\n addPatch(patch: PatchToVersion): Promise<void>;\n cancel(): Promise<void>;\n end(finalVersion: CVRVersion): Promise<void>;\n}\n\nconst NOOP: PokeHandler = {\n addPatch: () => promiseVoid,\n cancel: () => promiseVoid,\n end: () => promiseVoid,\n};\n\n/** Wraps PokeHandlers for multiple clients in a single PokeHandler. */\nexport function startPoke(\n clients: ClientHandler[],\n tentativeVersion: CVRVersion,\n): PokeHandler {\n const pokers = clients.map(c => c.startPoke(tentativeVersion));\n\n // Promise.allSettled() ensures that a failed (e.g. disconnected) client\n // does not prevent other clients from receiving the pokes. However, the\n // rate (per client group) will be limited by the slowest connection.\n return {\n addPatch: async patch => {\n await Promise.allSettled(pokers.map(poker => poker.addPatch(patch)));\n },\n cancel: async () => {\n await Promise.allSettled(pokers.map(poker => poker.cancel()));\n },\n end: async finalVersion => {\n await Promise.allSettled(pokers.map(poker => poker.end(finalVersion)));\n },\n };\n}\n\n// Semi-arbitrary threshold at which poke body parts are flushed.\n// When row size is being computed, that should be used as a threshold instead.\nconst PART_COUNT_FLUSH_THRESHOLD = 100;\n\n/**\n * Handles a single `ViewSyncer` connection.\n */\nexport class ClientHandler {\n readonly #clientGroupID: string;\n readonly clientID: string;\n readonly wsID: string;\n readonly #zeroClientsTable: string;\n readonly #zeroMutationsTable: string;\n readonly #lc: LogContext;\n readonly #downstream: Subscription<Downstream>;\n #baseVersion: NullableCVRVersion;\n\n readonly #pokeTime = getOrCreateHistogram('sync', 'poke.time', {\n description:\n 'Time elapsed for each poke transaction. Canceled / noop pokes are excluded.',\n unit: 's',\n });\n\n readonly #pokeTransactions = getOrCreateCounter(\n 'sync',\n 'poke.transactions',\n 'Count of poke transactions.',\n );\n\n readonly #pokedRows = getOrCreateCounter(\n 'sync',\n 'poke.rows',\n 'Count of poked rows.',\n );\n\n constructor(\n lc: LogContext,\n clientGroupID: string,\n clientID: string,\n wsID: string,\n shard: ShardID,\n baseCookie: string | null,\n downstream: Subscription<Downstream>,\n ) {\n lc.debug?.('new client handler');\n this.#clientGroupID = clientGroupID;\n this.clientID = clientID;\n this.wsID = wsID;\n this.#zeroClientsTable = `${upstreamSchema(shard)}.clients`;\n this.#zeroMutationsTable = `${upstreamSchema(shard)}.mutations`;\n this.#lc = lc;\n this.#downstream = downstream;\n this.#baseVersion = cookieToVersion(baseCookie);\n }\n\n version(): NullableCVRVersion {\n return this.#baseVersion;\n }\n\n async #push(msg: Downstream): Promise<void> {\n const {result} = this.#downstream.push(msg);\n await result;\n }\n\n fail(e: unknown) {\n this.#lc[getLogLevel(e)]?.(\n `view-syncer closing connection with error: ${String(e)}`,\n e,\n );\n this.#downstream.fail(wrapWithProtocolError(e));\n }\n\n close(reason: string) {\n this.#lc.debug?.(`view-syncer closing connection: ${reason}`);\n this.#downstream.cancel();\n }\n\n startPoke(tentativeVersion: CVRVersion): PokeHandler {\n const pokeID = versionToCookie(tentativeVersion);\n const lc = this.#lc.withContext('pokeID', pokeID);\n\n if (cmpVersions(this.#baseVersion, tentativeVersion) >= 0) {\n lc.info?.(`already caught up, not sending poke.`);\n return NOOP;\n }\n\n const baseCookie = versionToNullableCookie(this.#baseVersion);\n const cookie = versionToCookie(tentativeVersion);\n lc.info?.(`starting poke from ${baseCookie} to ${cookie}`);\n\n const start = performance.now();\n\n const pokeStart: PokeStartBody = {pokeID, baseCookie};\n\n let pokeStarted = false;\n let body: PokePartBody | undefined;\n let partCount = 0;\n const ensureBody = async () => {\n if (!pokeStarted) {\n await this.#push(['pokeStart', pokeStart]);\n pokeStarted = true;\n }\n return (body ??= {pokeID});\n };\n const flushBody = async () => {\n if (body) {\n await this.#push(['pokePart', body]);\n body = undefined;\n partCount = 0;\n }\n };\n\n const addPatch = async (patchToVersion: PatchToVersion) => {\n const {patch, toVersion} = patchToVersion;\n if (cmpVersions(toVersion, this.#baseVersion) <= 0) {\n return;\n }\n const body = await ensureBody();\n\n const {type, op} = patch;\n switch (type) {\n case 'query': {\n const patches = patch.clientID\n ? ((body.desiredQueriesPatches ??= {})[patch.clientID] ??= [])\n : (body.gotQueriesPatch ??= []);\n if (op === 'put') {\n patches.push({op, hash: patch.id});\n } else {\n patches.push({op, hash: patch.id});\n }\n break;\n }\n case 'row':\n if (patch.id.table === this.#zeroClientsTable) {\n this.#updateLMIDs((body.lastMutationIDChanges ??= {}), patch);\n } else if (patch.id.table === this.#zeroMutationsTable) {\n const patches = (body.mutationsPatch ??= []);\n if (op === 'put') {\n const row = v.parse(\n ensureSafeJSON(patch.contents),\n mutationRowSchema,\n 'passthrough',\n );\n patches.push({\n op: 'put',\n mutation: {\n id: {\n clientID: row.clientID,\n id: row.mutationID,\n },\n result: row.result,\n },\n });\n } else {\n const {clientID, mutationID} = patch.id.rowKey;\n assert(\n typeof clientID === 'string',\n 'client id must be a string',\n );\n const id = Number(mutationID);\n assert(\n !Number.isNaN(id) && Number.isFinite(id) && id >= 0,\n 'mutation id must be a finite number',\n );\n patches.push({\n op: 'del',\n id: {\n clientID,\n id,\n },\n });\n }\n } else {\n (body.rowsPatch ??= []).push(makeRowPatch(patch));\n }\n break;\n default:\n unreachable(patch);\n }\n\n if (++partCount >= PART_COUNT_FLUSH_THRESHOLD) {\n await flushBody();\n }\n };\n\n return {\n addPatch: async (patchToVersion: PatchToVersion) => {\n try {\n await addPatch(patchToVersion);\n if (patchToVersion.patch.type === 'row') {\n this.#pokedRows.add(1);\n }\n } catch (e) {\n this.#downstream.fail(wrapWithProtocolError(e));\n }\n },\n\n cancel: async () => {\n if (pokeStarted) {\n await this.#push(['pokeEnd', {pokeID, cookie: '', cancel: true}]);\n }\n },\n\n end: async (finalVersion: CVRVersion) => {\n const cookie = versionToCookie(finalVersion);\n if (!pokeStarted) {\n if (cmpVersions(this.#baseVersion, finalVersion) === 0) {\n return; // Nothing changed and nothing was sent.\n }\n await this.#push(['pokeStart', pokeStart]);\n } else if (cmpVersions(this.#baseVersion, finalVersion) >= 0) {\n // Sanity check: If the poke was started, the finalVersion\n // must be > #baseVersion.\n throw new Error(\n `Patches were sent but finalVersion ${finalVersion} is ` +\n `not greater than baseVersion ${this.#baseVersion}`,\n );\n }\n await flushBody();\n await this.#push(['pokeEnd', {pokeID, cookie}]);\n this.#baseVersion = finalVersion;\n\n const elapsed = performance.now() - start;\n this.#pokeTransactions.add(1);\n this.#pokeTime.record(elapsed / 1000);\n },\n };\n }\n\n async sendDeleteClients(\n lc: LogContext,\n deletedClientIDs: string[],\n deletedClientGroupIDs: string[],\n ) {\n const deleteClientsBody: Writable<DeleteClientsBody> = {};\n if (deletedClientIDs.length > 0) {\n deleteClientsBody.clientIDs = deletedClientIDs;\n }\n if (deletedClientGroupIDs.length > 0) {\n deleteClientsBody.clientGroupIDs = deletedClientGroupIDs;\n }\n lc.debug?.('sending deleteClients', deleteClientsBody);\n await this.#push(['deleteClients', deleteClientsBody]);\n }\n\n sendQueryTransformApplicationErrors(errors: ErroredQuery[]) {\n void this.#push(['transformError', errors]);\n }\n\n sendQueryTransformFailedError(error: TransformFailedBody) {\n this.fail(new ProtocolError(error));\n }\n\n sendInspectResponse(lc: LogContext, response: InspectDownBody): void {\n lc.debug?.('sending inspect response', response);\n this.#downstream.push(['inspect', response]);\n }\n\n #updateLMIDs(lmids: Record<string, number>, patch: RowPatch) {\n if (patch.op === 'put') {\n const row = ensureSafeJSON(patch.contents);\n const {clientGroupID, clientID, lastMutationID} = v.parse(\n row,\n lmidRowSchema,\n 'passthrough',\n );\n if (clientGroupID !== this.#clientGroupID) {\n this.#lc.error?.(\n `Received clients row for wrong clientGroupID. Ignoring.`,\n clientGroupID,\n );\n } else {\n lmids[clientID] = lastMutationID;\n }\n } else {\n // The 'constrain' and 'del' ops for clients can be ignored.\n patch.op satisfies 'constrain' | 'del';\n }\n }\n}\n\n// Note: The {APP_ID}_{SHARD_ID}.clients table is set up in replicator/initial-sync.ts.\nconst lmidRowSchema = v.object({\n clientGroupID: v.string(),\n clientID: v.string(),\n lastMutationID: v.number(), // Actually returned as a bigint, but converted by ensureSafeJSON().\n});\n\nconst mutationRowSchema = v.object({\n clientGroupID: v.string(),\n clientID: v.string(),\n mutationID: v.number(),\n result: mutationResultSchema,\n});\n\nfunction makeRowPatch(patch: RowPatch): RowPatchOp {\n const {\n op,\n id: {table: tableName, rowKey: id},\n } = patch;\n\n switch (op) {\n case 'put':\n return {\n op: 'put',\n tableName,\n value: v.parse(ensureSafeJSON(patch.contents), rowSchema),\n };\n\n case 'del':\n return {\n op,\n tableName,\n id: v.parse(id, primaryKeyValueRecordSchema),\n };\n\n default:\n unreachable(op);\n }\n}\n\n/**\n * Column values of type INT8 are returned as the `bigint` from the\n * Postgres library. These are converted to `number` if they are within\n * the safe Number range, allowing the protocol to support numbers larger\n * than 32-bits. Values outside of the safe number range (e.g. > 2^53) will\n * result in an Error.\n */\nexport function ensureSafeJSON(row: JSONObject): SafeJSONObject {\n const modified = Object.entries(row)\n .filter(([k, v]) => {\n if (typeof v === 'bigint') {\n if (v >= Number.MIN_SAFE_INTEGER && v <= Number.MAX_SAFE_INTEGER) {\n return true; // send this entry onto the next map() step.\n }\n throw new Error(`Value of \"${k}\" exceeds safe Number range (${v})`);\n } else if (typeof v === 'object') {\n assertJSONValue(v);\n }\n return false;\n })\n .map(([k, v]) => [k, Number(v)]);\n\n return modified.length\n ? {...row, ...Object.fromEntries(modified)}\n : (row as SafeJSONObject);\n}\n"],"names":["body","v.parse","cookie","v.object","v.string","v.number","v"],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@ export type CVRFlushStats = {
|
|
|
19
19
|
};
|
|
20
20
|
export declare class CVRStore {
|
|
21
21
|
#private;
|
|
22
|
-
constructor(lc: LogContext, cvrDb: PostgresDB,
|
|
22
|
+
constructor(lc: LogContext, cvrDb: PostgresDB, shard: ShardID, taskID: string, cvrID: string, failService: (e: unknown) => void, loadAttemptIntervalMs?: number, maxLoadAttempts?: number, deferredRowFlushThreshold?: number, // somewhat arbitrary
|
|
23
23
|
setTimeoutFn?: typeof setTimeout);
|
|
24
24
|
load(lc: LogContext, lastConnectTime: number): Promise<CVR>;
|
|
25
25
|
getRowRecords(): Promise<ReadonlyMap<RowID, RowRecord>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cvr-store.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/view-syncer/cvr-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAiBjD,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,+CAA+C,CAAC;AAKnF,OAAO,EAAC,sBAAsB,EAAC,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAC,UAAU,EAAE,mBAAmB,EAAC,MAAM,mBAAmB,CAAC;AAEvE,OAAO,EAAY,KAAK,OAAO,
|
|
1
|
+
{"version":3,"file":"cvr-store.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/view-syncer/cvr-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,12 +17,13 @@ import { TransactionPool } from "../../db/transaction-pool.js";
|
|
|
17
17
|
import { recordRowsSynced } from "../../server/anonymous-otel-start.js";
|
|
18
18
|
import { ProtocolErrorWithLevel } from "../../types/error-with-level.js";
|
|
19
19
|
import { rowIDString } from "../../types/row-key.js";
|
|
20
|
-
import { cvrSchema
|
|
20
|
+
import { cvrSchema } from "../../types/shards.js";
|
|
21
21
|
import { RowRecordCache } from "./row-record-cache.js";
|
|
22
22
|
import "pg-format";
|
|
23
23
|
import "../../../../shared/src/bigint-json.js";
|
|
24
24
|
import { EMPTY_CVR_VERSION, versionFromString, versionString, queryRecordToQueryRow, cmpVersions } from "./schema/types.js";
|
|
25
25
|
import { ttlClockFromNumber, ttlClockAsNumber } from "./ttl-clock.js";
|
|
26
|
+
let flushCounter = 0;
|
|
26
27
|
const tracer = trace.getTracer("cvr-store", version);
|
|
27
28
|
function asQuery(row) {
|
|
28
29
|
const maybeVersion = (s) => s === null ? void 0 : versionFromString(s);
|
|
@@ -67,9 +68,7 @@ class CVRStore {
|
|
|
67
68
|
#id;
|
|
68
69
|
#failService;
|
|
69
70
|
#db;
|
|
70
|
-
#upstreamDb;
|
|
71
71
|
#writes = /* @__PURE__ */ new Set();
|
|
72
|
-
#upstreamWrites = [];
|
|
73
72
|
#pendingRowRecordUpdates = new CustomKeyMap(
|
|
74
73
|
rowIDString
|
|
75
74
|
);
|
|
@@ -77,12 +76,10 @@ class CVRStore {
|
|
|
77
76
|
#rowCache;
|
|
78
77
|
#loadAttemptIntervalMs;
|
|
79
78
|
#maxLoadAttempts;
|
|
80
|
-
#upstreamSchemaName;
|
|
81
79
|
#rowCount = 0;
|
|
82
|
-
constructor(lc, cvrDb,
|
|
80
|
+
constructor(lc, cvrDb, shard, taskID, cvrID, failService, loadAttemptIntervalMs = LOAD_ATTEMPT_INTERVAL_MS, maxLoadAttempts = MAX_LOAD_ATTEMPTS, deferredRowFlushThreshold = 100, setTimeoutFn = setTimeout) {
|
|
83
81
|
this.#failService = failService;
|
|
84
82
|
this.#db = cvrDb;
|
|
85
|
-
this.#upstreamDb = upstreamDb;
|
|
86
83
|
this.#schema = cvrSchema(shard);
|
|
87
84
|
this.#taskID = taskID;
|
|
88
85
|
this.#id = cvrID;
|
|
@@ -97,7 +94,6 @@ class CVRStore {
|
|
|
97
94
|
);
|
|
98
95
|
this.#loadAttemptIntervalMs = loadAttemptIntervalMs;
|
|
99
96
|
this.#maxLoadAttempts = maxLoadAttempts;
|
|
100
|
-
this.#upstreamSchemaName = upstreamSchema(shard);
|
|
101
97
|
}
|
|
102
98
|
#cvr(table) {
|
|
103
99
|
return this.#db(`${this.#schema}.${table}`);
|
|
@@ -117,7 +113,7 @@ class CVRStore {
|
|
|
117
113
|
}
|
|
118
114
|
return result;
|
|
119
115
|
}
|
|
120
|
-
assert(err);
|
|
116
|
+
assert(err, "Expected error to be set after retry loop exhausted");
|
|
121
117
|
throw new ClientNotFoundError(
|
|
122
118
|
`max attempts exceeded waiting for CVR@${err.cvrVersion} to catch up from ${err.rowsVersion}`
|
|
123
119
|
);
|
|
@@ -138,28 +134,30 @@ class CVRStore {
|
|
|
138
134
|
clientSchema: null,
|
|
139
135
|
profileID: null
|
|
140
136
|
};
|
|
141
|
-
const [instance, clientsRows, queryRows, desiresRows] = await this.#db.begin(READONLY, (tx) =>
|
|
142
|
-
|
|
137
|
+
const [instance, clientsRows, queryRows, desiresRows] = await this.#db.begin(READONLY, (tx) => {
|
|
138
|
+
lc.debug?.(`CVR tx started after ${Date.now() - start} ms`);
|
|
139
|
+
return [
|
|
140
|
+
tx`SELECT cvr."version",
|
|
143
141
|
"lastActive",
|
|
144
142
|
"ttlClock",
|
|
145
|
-
"replicaVersion",
|
|
146
|
-
"owner",
|
|
143
|
+
"replicaVersion",
|
|
144
|
+
"owner",
|
|
147
145
|
"grantedAt",
|
|
148
|
-
"clientSchema",
|
|
146
|
+
"clientSchema",
|
|
149
147
|
"profileID",
|
|
150
148
|
"deleted",
|
|
151
149
|
rows."version" as "rowsVersion"
|
|
152
150
|
FROM ${this.#cvr("instances")} AS cvr
|
|
153
|
-
LEFT JOIN ${this.#cvr("rowsVersion")} AS rows
|
|
151
|
+
LEFT JOIN ${this.#cvr("rowsVersion")} AS rows
|
|
154
152
|
ON cvr."clientGroupID" = rows."clientGroupID"
|
|
155
153
|
WHERE cvr."clientGroupID" = ${id}`,
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
154
|
+
tx`SELECT "clientID" FROM ${this.#cvr(
|
|
155
|
+
"clients"
|
|
156
|
+
)}
|
|
159
157
|
WHERE "clientGroupID" = ${id}`,
|
|
160
|
-
|
|
158
|
+
tx`SELECT * FROM ${this.#cvr("queries")}
|
|
161
159
|
WHERE "clientGroupID" = ${id} AND deleted IS DISTINCT FROM true`,
|
|
162
|
-
|
|
160
|
+
tx`SELECT
|
|
163
161
|
"clientGroupID",
|
|
164
162
|
"clientID",
|
|
165
163
|
"queryHash",
|
|
@@ -169,7 +167,11 @@ class CVRStore {
|
|
|
169
167
|
"inactivatedAtMs" AS "inactivatedAt"
|
|
170
168
|
FROM ${this.#cvr("desires")}
|
|
171
169
|
WHERE "clientGroupID" = ${id}`
|
|
172
|
-
|
|
170
|
+
];
|
|
171
|
+
});
|
|
172
|
+
lc.debug?.(
|
|
173
|
+
`CVR tx completed after ${Date.now() - start} ms (${clientsRows.length} clients, ${queryRows.length} queries, ${desiresRows.length} desires)`
|
|
174
|
+
);
|
|
173
175
|
if (instance.length === 0) {
|
|
174
176
|
this.putInstance({
|
|
175
177
|
version: cvr.version,
|
|
@@ -181,7 +183,10 @@ class CVRStore {
|
|
|
181
183
|
profileID: null
|
|
182
184
|
});
|
|
183
185
|
} else {
|
|
184
|
-
assert(
|
|
186
|
+
assert(
|
|
187
|
+
instance.length === 1,
|
|
188
|
+
() => `Expected exactly one CVR instance, got ${instance.length}`
|
|
189
|
+
);
|
|
185
190
|
const {
|
|
186
191
|
version: version2,
|
|
187
192
|
lastActive,
|
|
@@ -239,12 +244,14 @@ class CVRStore {
|
|
|
239
244
|
}
|
|
240
245
|
for (const row of desiresRows) {
|
|
241
246
|
const client = cvr.clients[row.clientID];
|
|
242
|
-
if (
|
|
243
|
-
if (
|
|
247
|
+
if (!row.deleted && row.inactivatedAt === null) {
|
|
248
|
+
if (client) {
|
|
244
249
|
client.desiredQueryIDs.push(row.queryHash);
|
|
250
|
+
} else {
|
|
251
|
+
lc.debug?.(
|
|
252
|
+
`Not adding to desiredQueryIDs for client ${row.clientID} because it has been deleted.`
|
|
253
|
+
);
|
|
245
254
|
}
|
|
246
|
-
} else {
|
|
247
|
-
lc.debug?.(`Client ${row.clientID} not found`);
|
|
248
255
|
}
|
|
249
256
|
const query = cvr.queries[row.queryHash];
|
|
250
257
|
if (query && query.type !== "internal" && (!row.deleted || row.inactivatedAt !== null)) {
|
|
@@ -311,7 +318,10 @@ class CVRStore {
|
|
|
311
318
|
if (result.length === 0) {
|
|
312
319
|
return void 0;
|
|
313
320
|
}
|
|
314
|
-
assert(
|
|
321
|
+
assert(
|
|
322
|
+
result.length === 1,
|
|
323
|
+
() => `Expected exactly one rowsVersion result, got ${result.length}`
|
|
324
|
+
);
|
|
315
325
|
return result[0][0];
|
|
316
326
|
}
|
|
317
327
|
putInstance({
|
|
@@ -420,15 +430,10 @@ class CVRStore {
|
|
|
420
430
|
deleteClient(clientID) {
|
|
421
431
|
this.#writes.add({
|
|
422
432
|
stats: { clients: 1 },
|
|
423
|
-
write: (sql) => sql`DELETE FROM ${this.#cvr("clients")}
|
|
424
|
-
WHERE "clientGroupID" = ${this.#id}
|
|
433
|
+
write: (sql) => sql`DELETE FROM ${this.#cvr("clients")}
|
|
434
|
+
WHERE "clientGroupID" = ${this.#id}
|
|
425
435
|
AND "clientID" = ${clientID}`
|
|
426
436
|
});
|
|
427
|
-
this.#upstreamWrites.push(
|
|
428
|
-
(sql) => sql`DELETE FROM ${sql(this.#upstreamSchemaName)}."mutations"
|
|
429
|
-
WHERE "clientGroupID" = ${this.#id}
|
|
430
|
-
AND "clientID" = ${clientID}`
|
|
431
|
-
);
|
|
432
437
|
}
|
|
433
438
|
putDesiredQuery(newVersion, query, client, deleted, inactivatedAt, ttl) {
|
|
434
439
|
const change = {
|
|
@@ -505,7 +510,7 @@ class CVRStore {
|
|
|
505
510
|
const { queryHash: id } = row;
|
|
506
511
|
const patch = row.deleted ? { type: "query", op: "del", id } : { type: "query", op: "put", id };
|
|
507
512
|
const v2 = row.patchVersion;
|
|
508
|
-
assert(v2);
|
|
513
|
+
assert(v2, "patchVersion must be set for query patches");
|
|
509
514
|
patches.push({ patch, toVersion: versionFromString(v2) });
|
|
510
515
|
}
|
|
511
516
|
for (const row of allDesires) {
|
|
@@ -521,7 +526,9 @@ class CVRStore {
|
|
|
521
526
|
reader.setDone();
|
|
522
527
|
}
|
|
523
528
|
}
|
|
524
|
-
async #checkVersionAndOwnership(tx, expectedCurrentVersion, lastConnectTime) {
|
|
529
|
+
async #checkVersionAndOwnership(lc, tx, expectedCurrentVersion, lastConnectTime) {
|
|
530
|
+
const start = Date.now();
|
|
531
|
+
lc.debug?.("checking cvr version and ownership");
|
|
525
532
|
const expected = versionString(expectedCurrentVersion);
|
|
526
533
|
const result = await tx`SELECT "version", "owner", "grantedAt" FROM ${this.#cvr("instances")}
|
|
527
534
|
WHERE "clientGroupID" = ${this.#id}
|
|
@@ -531,6 +538,9 @@ class CVRStore {
|
|
|
531
538
|
owner: null,
|
|
532
539
|
grantedAt: null
|
|
533
540
|
};
|
|
541
|
+
lc.debug?.(
|
|
542
|
+
"checked cvr version and ownership in " + (Date.now() - start) + " ms"
|
|
543
|
+
);
|
|
534
544
|
if (owner !== this.#taskID && (grantedAt ?? 0) > lastConnectTime) {
|
|
535
545
|
throw new OwnershipError(owner, grantedAt, lastConnectTime);
|
|
536
546
|
}
|
|
@@ -538,7 +548,7 @@ class CVRStore {
|
|
|
538
548
|
throw new ConcurrentModificationException(expected, version2);
|
|
539
549
|
}
|
|
540
550
|
}
|
|
541
|
-
async #flush(expectedCurrentVersion, cvr, lastConnectTime) {
|
|
551
|
+
async #flush(lc, expectedCurrentVersion, cvr, lastConnectTime) {
|
|
542
552
|
const stats = {
|
|
543
553
|
instances: 0,
|
|
544
554
|
queries: 0,
|
|
@@ -572,7 +582,10 @@ class CVRStore {
|
|
|
572
582
|
return null;
|
|
573
583
|
}
|
|
574
584
|
this.putInstance(cvr);
|
|
585
|
+
const start = Date.now();
|
|
586
|
+
lc.debug?.("flush tx beginning");
|
|
575
587
|
const rowsFlushed = await this.#db.begin(READ_COMMITTED, async (tx) => {
|
|
588
|
+
lc.debug?.(`flush tx begun after ${Date.now() - start} ms`);
|
|
576
589
|
const pipelined = [
|
|
577
590
|
// #checkVersionAndOwnership() executes a `SELECT ... FOR UPDATE`
|
|
578
591
|
// query to acquire a row-level lock so that version-updating
|
|
@@ -582,29 +595,41 @@ class CVRStore {
|
|
|
582
595
|
// to this lock and can thus commit / be-committed independently of
|
|
583
596
|
// cvr.instances.
|
|
584
597
|
this.#checkVersionAndOwnership(
|
|
598
|
+
lc,
|
|
585
599
|
tx,
|
|
586
600
|
expectedCurrentVersion,
|
|
587
601
|
lastConnectTime
|
|
588
602
|
)
|
|
589
603
|
];
|
|
604
|
+
let i = 0;
|
|
590
605
|
for (const write of this.#writes) {
|
|
591
606
|
stats.instances += write.stats.instances ?? 0;
|
|
592
607
|
stats.queries += write.stats.queries ?? 0;
|
|
593
608
|
stats.desires += write.stats.desires ?? 0;
|
|
594
609
|
stats.clients += write.stats.clients ?? 0;
|
|
595
610
|
stats.rows += write.stats.rows ?? 0;
|
|
596
|
-
|
|
611
|
+
const writeIndex = i++;
|
|
612
|
+
const writeStart = Date.now();
|
|
613
|
+
pipelined.push(
|
|
614
|
+
write.write(tx, lastConnectTime).execute().then(() => {
|
|
615
|
+
lc.debug?.(
|
|
616
|
+
`write ${writeIndex}/${this.#writes.size} completed in ${Date.now() - writeStart} ms`
|
|
617
|
+
);
|
|
618
|
+
})
|
|
619
|
+
);
|
|
597
620
|
stats.statements++;
|
|
598
621
|
}
|
|
599
622
|
const rowUpdates = this.#rowCache.executeRowUpdates(
|
|
600
623
|
tx,
|
|
601
624
|
cvr.version,
|
|
602
625
|
this.#pendingRowRecordUpdates,
|
|
603
|
-
"allow-defer"
|
|
626
|
+
"allow-defer",
|
|
627
|
+
lc
|
|
604
628
|
);
|
|
605
629
|
pipelined.push(...rowUpdates);
|
|
606
630
|
stats.statements += rowUpdates.length;
|
|
607
631
|
await Promise.all(pipelined);
|
|
632
|
+
lc.debug?.(`flush tx returning after ${Date.now() - start} ms`);
|
|
608
633
|
if (rowUpdates.length === 0) {
|
|
609
634
|
stats.rowsDeferred = this.#pendingRowRecordUpdates.size;
|
|
610
635
|
return false;
|
|
@@ -618,11 +643,6 @@ class CVRStore {
|
|
|
618
643
|
rowsFlushed
|
|
619
644
|
);
|
|
620
645
|
recordRowsSynced(this.#rowCount);
|
|
621
|
-
if (this.#upstreamDb) {
|
|
622
|
-
await this.#upstreamDb.begin(READ_COMMITTED, async (tx) => {
|
|
623
|
-
await Promise.all(this.#upstreamWrites.map((write) => write(tx)));
|
|
624
|
-
});
|
|
625
|
-
}
|
|
626
646
|
return stats;
|
|
627
647
|
}
|
|
628
648
|
get rowCount() {
|
|
@@ -630,8 +650,10 @@ class CVRStore {
|
|
|
630
650
|
}
|
|
631
651
|
async flush(lc, expectedCurrentVersion, cvr, lastConnectTime) {
|
|
632
652
|
const start = performance.now();
|
|
653
|
+
lc = lc.withContext("cvrFlushID", flushCounter++);
|
|
633
654
|
try {
|
|
634
655
|
const stats = await this.#flush(
|
|
656
|
+
lc,
|
|
635
657
|
expectedCurrentVersion,
|
|
636
658
|
cvr,
|
|
637
659
|
lastConnectTime
|
|
@@ -649,7 +671,6 @@ class CVRStore {
|
|
|
649
671
|
throw e;
|
|
650
672
|
} finally {
|
|
651
673
|
this.#writes.clear();
|
|
652
|
-
this.#upstreamWrites.length = 0;
|
|
653
674
|
this.#pendingRowRecordUpdates.clear();
|
|
654
675
|
this.#forceUpdates.clear();
|
|
655
676
|
}
|