@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
|
@@ -30,6 +30,7 @@ import "@rocicorp/zero-sqlite3";
|
|
|
30
30
|
import "../../../../zqlite/src/internal/sql.js";
|
|
31
31
|
import "@databases/escape-identifier";
|
|
32
32
|
import "../../../../shared/src/btree-set.js";
|
|
33
|
+
import "../../../../shared/src/iterables.js";
|
|
33
34
|
import "../../../../shared/src/valita.js";
|
|
34
35
|
import "../../../../zero-schema/src/compiled-permissions.js";
|
|
35
36
|
import "../../../../zero-protocol/src/primary-key.js";
|
|
@@ -58,6 +59,7 @@ class ViewSyncerService {
|
|
|
58
59
|
#slowHydrateThreshold;
|
|
59
60
|
#queryConfig;
|
|
60
61
|
userQueryURL;
|
|
62
|
+
userQueryHeaders;
|
|
61
63
|
// The ViewSyncerService is only started in response to a connection,
|
|
62
64
|
// so #lastConnectTime is always initialized to now(). This is necessary
|
|
63
65
|
// to handle race conditions in which, e.g. the replica is ready and the
|
|
@@ -102,6 +104,7 @@ class ViewSyncerService {
|
|
|
102
104
|
// auth and cookie headers directly
|
|
103
105
|
#authData;
|
|
104
106
|
#httpCookie;
|
|
107
|
+
#origin;
|
|
105
108
|
#expiredQueriesTimer = 0;
|
|
106
109
|
#setTimeout;
|
|
107
110
|
#customQueryTransformer;
|
|
@@ -154,7 +157,8 @@ class ViewSyncerService {
|
|
|
154
157
|
);
|
|
155
158
|
#inspectorDelegate;
|
|
156
159
|
#config;
|
|
157
|
-
|
|
160
|
+
#runPriorityOp;
|
|
161
|
+
constructor(config, lc, shard, taskID, clientGroupID, cvrDb, pipelineDriver, versionChanges, drainCoordinator, slowHydrateThreshold, inspectorDelegate, customQueryTransformer, runPriorityOp, keepaliveMs = DEFAULT_KEEPALIVE_MS, setTimeoutFn = setTimeout.bind(globalThis)) {
|
|
158
162
|
const queryConfig = config.query?.url ? config.query : config.getQueries;
|
|
159
163
|
this.#config = config;
|
|
160
164
|
this.id = clientGroupID;
|
|
@@ -171,7 +175,6 @@ class ViewSyncerService {
|
|
|
171
175
|
this.#cvrStore = new CVRStore(
|
|
172
176
|
lc,
|
|
173
177
|
cvrDb,
|
|
174
|
-
upstreamDb,
|
|
175
178
|
shard,
|
|
176
179
|
taskID,
|
|
177
180
|
clientGroupID,
|
|
@@ -180,13 +183,17 @@ class ViewSyncerService {
|
|
|
180
183
|
() => this.#stateChanges.cancel()
|
|
181
184
|
);
|
|
182
185
|
this.#setTimeout = setTimeoutFn;
|
|
186
|
+
this.#runPriorityOp = runPriorityOp;
|
|
183
187
|
this.keepalive();
|
|
184
188
|
}
|
|
185
189
|
#getHeaderOptions(forwardCookie) {
|
|
186
190
|
return {
|
|
187
191
|
apiKey: this.#queryConfig.apiKey,
|
|
192
|
+
customHeaders: this.userQueryHeaders,
|
|
193
|
+
allowedClientHeaders: this.#queryConfig.allowedClientHeaders,
|
|
188
194
|
token: this.#authData?.raw,
|
|
189
|
-
cookie: forwardCookie ? this.#httpCookie : void 0
|
|
195
|
+
cookie: forwardCookie ? this.#httpCookie : void 0,
|
|
196
|
+
origin: this.#origin
|
|
190
197
|
};
|
|
191
198
|
}
|
|
192
199
|
#runInLockWithCVR(fn) {
|
|
@@ -210,8 +217,12 @@ class ViewSyncerService {
|
|
|
210
217
|
return;
|
|
211
218
|
}
|
|
212
219
|
if (!this.#cvr) {
|
|
213
|
-
this.#lc.debug?.("loading
|
|
214
|
-
this.#cvr = await this.#
|
|
220
|
+
this.#lc.debug?.("loading cvr");
|
|
221
|
+
this.#cvr = await this.#runPriorityOp(
|
|
222
|
+
lc,
|
|
223
|
+
"loading cvr",
|
|
224
|
+
() => this.#cvrStore.load(lc, this.#lastConnectTime)
|
|
225
|
+
);
|
|
215
226
|
this.#ttlClock = this.#cvr.ttlClock;
|
|
216
227
|
this.#ttlClockBase = Date.now();
|
|
217
228
|
} else {
|
|
@@ -267,6 +278,7 @@ class ViewSyncerService {
|
|
|
267
278
|
}
|
|
268
279
|
lc.info?.(`resetting pipelines: ${result.message}`);
|
|
269
280
|
this.#pipelines.reset(clientSchema);
|
|
281
|
+
this.#pipelinesSynced = false;
|
|
270
282
|
}
|
|
271
283
|
const version2 = this.#pipelines.advanceWithoutDiff();
|
|
272
284
|
const cvrVer = versionString(cvr.version);
|
|
@@ -276,7 +288,7 @@ class ViewSyncerService {
|
|
|
276
288
|
}
|
|
277
289
|
lc.info?.(`init pipelines@${version2} (cvr@${cvrVer})`);
|
|
278
290
|
await this.#hydrateUnchangedQueries(lc, cvr);
|
|
279
|
-
await this.#syncQueryPipelineSet(lc, cvr);
|
|
291
|
+
await this.#syncQueryPipelineSet(lc, cvr, "missing");
|
|
280
292
|
this.#pipelinesSynced = true;
|
|
281
293
|
});
|
|
282
294
|
}
|
|
@@ -301,8 +313,9 @@ class ViewSyncerService {
|
|
|
301
313
|
if (hasExpiredQueries(cvr)) {
|
|
302
314
|
lc = lc.withContext("method", "#removeExpiredQueries");
|
|
303
315
|
lc.debug?.("Queries have expired");
|
|
304
|
-
|
|
305
|
-
|
|
316
|
+
if (this.#pipelinesSynced) {
|
|
317
|
+
await this.#syncQueryPipelineSet(lc, cvr, "missing");
|
|
318
|
+
}
|
|
306
319
|
}
|
|
307
320
|
this.#scheduleExpireEviction(lc, cvr);
|
|
308
321
|
};
|
|
@@ -378,19 +391,19 @@ class ViewSyncerService {
|
|
|
378
391
|
profileID,
|
|
379
392
|
wsID,
|
|
380
393
|
baseCookie,
|
|
381
|
-
schemaVersion,
|
|
382
394
|
tokenData,
|
|
383
395
|
httpCookie,
|
|
396
|
+
origin,
|
|
384
397
|
protocolVersion
|
|
385
398
|
} = ctx;
|
|
386
399
|
this.#authData = pickToken(this.#lc, this.#authData, tokenData);
|
|
387
|
-
this.#lc.debug?.(
|
|
388
|
-
`Picked auth token: ${JSON.stringify(this.#authData?.decoded)}`
|
|
389
|
-
);
|
|
400
|
+
this.#lc.debug?.(`Picked auth token for clientGroupID`);
|
|
390
401
|
this.#httpCookie = httpCookie;
|
|
391
|
-
|
|
402
|
+
this.#origin = origin;
|
|
403
|
+
const [, { userQueryURL, userQueryHeaders }] = initConnectionMessage;
|
|
392
404
|
if (this.userQueryURL === void 0) {
|
|
393
405
|
this.userQueryURL = userQueryURL;
|
|
406
|
+
this.userQueryHeaders = userQueryHeaders;
|
|
394
407
|
} else {
|
|
395
408
|
if (this.userQueryURL !== userQueryURL) {
|
|
396
409
|
this.#lc.warn?.(
|
|
@@ -427,7 +440,6 @@ class ViewSyncerService {
|
|
|
427
440
|
wsID,
|
|
428
441
|
this.#shard,
|
|
429
442
|
baseCookie,
|
|
430
|
-
schemaVersion,
|
|
431
443
|
downstream
|
|
432
444
|
);
|
|
433
445
|
this.#clients.get(clientID)?.close(`replaced by wsID: ${wsID}`);
|
|
@@ -448,6 +460,8 @@ class ViewSyncerService {
|
|
|
448
460
|
clientID2,
|
|
449
461
|
msg,
|
|
450
462
|
cvr,
|
|
463
|
+
"all",
|
|
464
|
+
// re transform all on new connections
|
|
451
465
|
// Until the profileID is required in the URL, default it to
|
|
452
466
|
// `cg${clientGroupID}`, as is done in the schema migration.
|
|
453
467
|
// As clients update to the zero version with the profileID logic,
|
|
@@ -462,13 +476,17 @@ class ViewSyncerService {
|
|
|
462
476
|
});
|
|
463
477
|
}
|
|
464
478
|
async changeDesiredQueries(ctx, msg) {
|
|
465
|
-
await this.#runInLockForClient(
|
|
479
|
+
await this.#runInLockForClient(
|
|
480
|
+
ctx,
|
|
481
|
+
msg,
|
|
482
|
+
(lc, clientID, msg2, cvr) => this.#handleConfigUpdate(lc, clientID, msg2, cvr, "missing")
|
|
483
|
+
);
|
|
466
484
|
}
|
|
467
485
|
async deleteClients(ctx, msg) {
|
|
468
|
-
await this.#runInLockForClient(
|
|
486
|
+
return await this.#runInLockForClient(
|
|
469
487
|
ctx,
|
|
470
488
|
[msg[0], { deleted: msg[1] }],
|
|
471
|
-
this.#handleConfigUpdate
|
|
489
|
+
(lc, clientID, msg2, cvr) => this.#handleConfigUpdate(lc, clientID, msg2, cvr, "missing")
|
|
472
490
|
);
|
|
473
491
|
}
|
|
474
492
|
#getTTLClock(now) {
|
|
@@ -485,19 +503,21 @@ class ViewSyncerService {
|
|
|
485
503
|
this.#ttlClockBase = now;
|
|
486
504
|
return ttlClock;
|
|
487
505
|
}
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
506
|
+
#flushUpdater(lc, updater) {
|
|
507
|
+
return this.#runPriorityOp(lc, "flushing cvr", async () => {
|
|
508
|
+
const now = Date.now();
|
|
509
|
+
const ttlClock = this.#getTTLClock(now);
|
|
510
|
+
const { cvr, flushed } = await updater.flush(
|
|
511
|
+
lc,
|
|
512
|
+
this.#lastConnectTime,
|
|
513
|
+
now,
|
|
514
|
+
ttlClock
|
|
515
|
+
);
|
|
516
|
+
if (flushed) {
|
|
517
|
+
this.#startTTLClockInterval(lc);
|
|
518
|
+
}
|
|
519
|
+
return cvr;
|
|
520
|
+
});
|
|
501
521
|
}
|
|
502
522
|
#startTTLClockInterval(lc) {
|
|
503
523
|
this.#stopTTLClockInterval();
|
|
@@ -511,14 +531,22 @@ class ViewSyncerService {
|
|
|
511
531
|
this.#ttlClockInterval = 0;
|
|
512
532
|
}
|
|
513
533
|
#updateTTLClockInCVRWithoutLock(lc) {
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
const
|
|
517
|
-
this.#
|
|
518
|
-
|
|
534
|
+
const rid = randomID();
|
|
535
|
+
lc.debug?.("Syncing ttlClock", rid);
|
|
536
|
+
const start = Date.now();
|
|
537
|
+
const ttlClock = this.#getTTLClock(start);
|
|
538
|
+
this.#cvrStore.updateTTLClock(ttlClock, start).then(() => {
|
|
539
|
+
lc.debug?.("Synced ttlClock", rid, `in ${Date.now() - start} ms`);
|
|
540
|
+
}).catch((e) => {
|
|
541
|
+
lc.error?.(
|
|
542
|
+
"failed to update TTL clock",
|
|
543
|
+
rid,
|
|
544
|
+
`after ${Date.now() - start} ms`,
|
|
545
|
+
e
|
|
546
|
+
);
|
|
519
547
|
});
|
|
520
548
|
}
|
|
521
|
-
async #updateCVRConfig(lc, cvr, clientID, fn) {
|
|
549
|
+
async #updateCVRConfig(lc, cvr, clientID, customQueryTransformMode, fn) {
|
|
522
550
|
const updater = new CVRConfigDrivenUpdater(
|
|
523
551
|
this.#cvrStore,
|
|
524
552
|
cvr,
|
|
@@ -536,7 +564,7 @@ class ViewSyncerService {
|
|
|
536
564
|
await pokers.end(newCVR.version);
|
|
537
565
|
}
|
|
538
566
|
if (this.#pipelinesSynced) {
|
|
539
|
-
await this.#syncQueryPipelineSet(lc, this.#cvr);
|
|
567
|
+
await this.#syncQueryPipelineSet(lc, this.#cvr, customQueryTransformMode);
|
|
540
568
|
}
|
|
541
569
|
return this.#cvr;
|
|
542
570
|
}
|
|
@@ -556,8 +584,9 @@ class ViewSyncerService {
|
|
|
556
584
|
`vs.#runInLockForClient(${cmd})`,
|
|
557
585
|
async () => {
|
|
558
586
|
let client;
|
|
587
|
+
let result;
|
|
559
588
|
try {
|
|
560
|
-
await this.#runInLockWithCVR((lc, cvr) => {
|
|
589
|
+
await this.#runInLockWithCVR(async (lc, cvr) => {
|
|
561
590
|
lc = lc.withContext("clientID", clientID).withContext("wsID", wsID).withContext("cmd", cmd);
|
|
562
591
|
lc.debug?.("acquired lock for cvr");
|
|
563
592
|
client = this.#clients.get(clientID);
|
|
@@ -575,7 +604,7 @@ class ViewSyncerService {
|
|
|
575
604
|
lc.warn?.(`Processing ${cmd} before initConnection was received`);
|
|
576
605
|
}
|
|
577
606
|
lc.debug?.(cmd, body);
|
|
578
|
-
|
|
607
|
+
result = await fn(lc, clientID, body, cvr);
|
|
579
608
|
});
|
|
580
609
|
} catch (e) {
|
|
581
610
|
const lc = this.#lc.withContext("clientID", clientID).withContext("wsID", wsID).withContext("cmd", cmd);
|
|
@@ -586,6 +615,7 @@ class ViewSyncerService {
|
|
|
586
615
|
throw e;
|
|
587
616
|
}
|
|
588
617
|
}
|
|
618
|
+
return result;
|
|
589
619
|
}
|
|
590
620
|
);
|
|
591
621
|
}
|
|
@@ -601,68 +631,74 @@ class ViewSyncerService {
|
|
|
601
631
|
deleted,
|
|
602
632
|
desiredQueriesPatch,
|
|
603
633
|
activeClients
|
|
604
|
-
}, cvr, profileID) => startAsyncSpan(tracer, "vs.#patchQueries", async () => {
|
|
634
|
+
}, cvr, customQueryTransformMode, profileID) => startAsyncSpan(tracer, "vs.#patchQueries", async () => {
|
|
605
635
|
const deletedClientIDs = [];
|
|
606
636
|
const deletedClientGroupIDs = [];
|
|
607
|
-
cvr = await this.#updateCVRConfig(
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
637
|
+
cvr = await this.#updateCVRConfig(
|
|
638
|
+
lc,
|
|
639
|
+
cvr,
|
|
640
|
+
clientID,
|
|
641
|
+
customQueryTransformMode,
|
|
642
|
+
(updater) => {
|
|
643
|
+
const { ttlClock } = cvr;
|
|
644
|
+
const patches = [];
|
|
645
|
+
if (clientSchema) {
|
|
646
|
+
updater.setClientSchema(lc, clientSchema);
|
|
647
|
+
}
|
|
648
|
+
if (profileID) {
|
|
649
|
+
updater.setProfileID(lc, profileID);
|
|
650
|
+
}
|
|
651
|
+
lc.debug?.(`applying ${desiredQueriesPatch?.length} query patches`);
|
|
652
|
+
if (desiredQueriesPatch?.length) {
|
|
653
|
+
for (const patch of desiredQueriesPatch) {
|
|
654
|
+
switch (patch.op) {
|
|
655
|
+
case "put":
|
|
656
|
+
patches.push(...updater.putDesiredQueries(clientID, [patch]));
|
|
657
|
+
break;
|
|
658
|
+
case "del":
|
|
659
|
+
patches.push(
|
|
660
|
+
...updater.markDesiredQueriesAsInactive(
|
|
661
|
+
clientID,
|
|
662
|
+
[patch.hash],
|
|
663
|
+
ttlClock
|
|
664
|
+
)
|
|
665
|
+
);
|
|
666
|
+
break;
|
|
667
|
+
case "clear":
|
|
668
|
+
patches.push(...updater.clearDesiredQueries(clientID));
|
|
669
|
+
break;
|
|
670
|
+
}
|
|
635
671
|
}
|
|
636
672
|
}
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
673
|
+
const clientIDsToDelete = /* @__PURE__ */ new Set();
|
|
674
|
+
if (activeClients) {
|
|
675
|
+
const allClientIDs = Object.keys(cvr.clients);
|
|
676
|
+
const activeClientsSet = new Set(activeClients);
|
|
677
|
+
for (const id of allClientIDs) {
|
|
678
|
+
if (!activeClientsSet.has(id)) {
|
|
679
|
+
clientIDsToDelete.add(id);
|
|
680
|
+
}
|
|
645
681
|
}
|
|
646
682
|
}
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
683
|
+
if (deleted?.clientIDs?.length) {
|
|
684
|
+
for (const cid of deleted.clientIDs) {
|
|
685
|
+
assert(cid !== clientID, "cannot delete self");
|
|
686
|
+
clientIDsToDelete.add(cid);
|
|
687
|
+
}
|
|
652
688
|
}
|
|
689
|
+
for (const cid of clientIDsToDelete) {
|
|
690
|
+
const patchesDueToClient = updater.deleteClient(cid, ttlClock);
|
|
691
|
+
patches.push(...patchesDueToClient);
|
|
692
|
+
deletedClientIDs.push(cid);
|
|
693
|
+
}
|
|
694
|
+
if (deleted?.clientGroupIDs?.length) {
|
|
695
|
+
lc.debug?.(
|
|
696
|
+
`ignoring ${deleted.clientGroupIDs.length} deprecated client group deletes`
|
|
697
|
+
);
|
|
698
|
+
}
|
|
699
|
+
return patches;
|
|
653
700
|
}
|
|
654
|
-
|
|
655
|
-
const patchesDueToClient = updater.deleteClient(cid, ttlClock);
|
|
656
|
-
patches.push(...patchesDueToClient);
|
|
657
|
-
deletedClientIDs.push(cid);
|
|
658
|
-
}
|
|
659
|
-
if (deleted?.clientGroupIDs?.length) {
|
|
660
|
-
lc.debug?.(
|
|
661
|
-
`ignoring ${deleted.clientGroupIDs.length} deprecated client group deletes`
|
|
662
|
-
);
|
|
663
|
-
}
|
|
664
|
-
return patches;
|
|
665
|
-
});
|
|
701
|
+
);
|
|
666
702
|
if (deletedClientIDs.length && deleted?.clientIDs?.length || deletedClientGroupIDs.length) {
|
|
667
703
|
const clients = this.#getClients();
|
|
668
704
|
await Promise.allSettled(
|
|
@@ -676,6 +712,7 @@ class ViewSyncerService {
|
|
|
676
712
|
);
|
|
677
713
|
}
|
|
678
714
|
this.#scheduleExpireEviction(lc, cvr);
|
|
715
|
+
return deletedClientIDs;
|
|
679
716
|
});
|
|
680
717
|
#scheduleExpireEviction(lc, cvr) {
|
|
681
718
|
const { ttlClock } = cvr;
|
|
@@ -754,18 +791,24 @@ class ViewSyncerService {
|
|
|
754
791
|
"Custom/named queries were requested but no `ZERO_QUERY_URL` is configured for Zero Cache."
|
|
755
792
|
);
|
|
756
793
|
}
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
customQueries.values(),
|
|
761
|
-
this.userQueryURL
|
|
762
|
-
);
|
|
763
|
-
this.#processTransformedCustomQueries(
|
|
794
|
+
const customQueryTransformer = this.#customQueryTransformer;
|
|
795
|
+
if (customQueryTransformer && customQueries.size > 0) {
|
|
796
|
+
const transformedCustomQueries = await this.#runPriorityOp(
|
|
764
797
|
lc,
|
|
765
|
-
|
|
766
|
-
(
|
|
767
|
-
|
|
798
|
+
"#hydrateUnchangedQueries transforming custom queries",
|
|
799
|
+
() => customQueryTransformer.transform(
|
|
800
|
+
this.#getHeaderOptions(this.#queryConfig.forwardCookies),
|
|
801
|
+
customQueries.values(),
|
|
802
|
+
this.userQueryURL
|
|
803
|
+
)
|
|
768
804
|
);
|
|
805
|
+
if (Array.isArray(transformedCustomQueries)) {
|
|
806
|
+
for (const q of transformedCustomQueries) {
|
|
807
|
+
if (!("error" in q) && q.transformationHash === customQueries.get(q.id)?.transformationHash) {
|
|
808
|
+
transformedQueries.push(q);
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
}
|
|
769
812
|
}
|
|
770
813
|
for (const q of otherQueries) {
|
|
771
814
|
const transformed = transformAndHashQuery(
|
|
@@ -787,7 +830,7 @@ class ViewSyncerService {
|
|
|
787
830
|
transformationHash,
|
|
788
831
|
transformedAst
|
|
789
832
|
} of transformedQueries) {
|
|
790
|
-
const timer = new TimeSliceTimer();
|
|
833
|
+
const timer = new TimeSliceTimer(lc);
|
|
791
834
|
let count = 0;
|
|
792
835
|
await startAsyncSpan(
|
|
793
836
|
tracer,
|
|
@@ -869,11 +912,11 @@ class ViewSyncerService {
|
|
|
869
912
|
this.#clients.get(clientId)?.sendQueryTransformApplicationErrors(errors);
|
|
870
913
|
}
|
|
871
914
|
}
|
|
872
|
-
#addQueryMaterializationServerMetric(
|
|
915
|
+
#addQueryMaterializationServerMetric(queryID, elapsed) {
|
|
873
916
|
this.#inspectorDelegate.addMetric(
|
|
874
917
|
"query-materialization-server",
|
|
875
918
|
elapsed,
|
|
876
|
-
|
|
919
|
+
queryID
|
|
877
920
|
);
|
|
878
921
|
}
|
|
879
922
|
/**
|
|
@@ -884,14 +927,12 @@ class ViewSyncerService {
|
|
|
884
927
|
*
|
|
885
928
|
* This must be called from within the #lock.
|
|
886
929
|
*/
|
|
887
|
-
#syncQueryPipelineSet(lc, cvr) {
|
|
930
|
+
#syncQueryPipelineSet(lc, cvr, customQueryTransformMode) {
|
|
888
931
|
return startAsyncSpan(tracer, "vs.#syncQueryPipelineSet", async () => {
|
|
889
932
|
assert(
|
|
890
933
|
this.#pipelines.initialized(),
|
|
891
934
|
"pipelines must be initialized (syncQueryPipelineSet)"
|
|
892
935
|
);
|
|
893
|
-
const [hydratedQueries, byOriginalHash] = this.#pipelines.addedQueries();
|
|
894
|
-
const hashToIDs = /* @__PURE__ */ new Map();
|
|
895
936
|
if (this.#ttlClock === void 0) {
|
|
896
937
|
this.#ttlClock = cvr.ttlClock;
|
|
897
938
|
}
|
|
@@ -933,14 +974,22 @@ class ViewSyncerService {
|
|
|
933
974
|
);
|
|
934
975
|
}
|
|
935
976
|
let erroredQueryIDs;
|
|
936
|
-
|
|
977
|
+
const customQueriesToTransform = customQueryTransformMode === "all" ? [...customQueries.values()] : customQueryTransformMode && [...customQueries.values()].filter(
|
|
978
|
+
(q) => !this.#pipelines.queries().has(q.id)
|
|
979
|
+
);
|
|
980
|
+
const customQueryTransformer = this.#customQueryTransformer;
|
|
981
|
+
if (customQueryTransformer && customQueriesToTransform.length > 0) {
|
|
937
982
|
const transformStart = performance.now();
|
|
938
983
|
let transformedCustomQueries;
|
|
939
984
|
try {
|
|
940
|
-
transformedCustomQueries = await this.#
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
985
|
+
transformedCustomQueries = await this.#runPriorityOp(
|
|
986
|
+
lc,
|
|
987
|
+
"#syncQueryPipelineSet transforming custom queries",
|
|
988
|
+
() => customQueryTransformer.transform(
|
|
989
|
+
this.#getHeaderOptions(true),
|
|
990
|
+
customQueriesToTransform,
|
|
991
|
+
this.userQueryURL
|
|
992
|
+
)
|
|
944
993
|
);
|
|
945
994
|
this.#queryTransformations.add(1, { result: "success" });
|
|
946
995
|
} catch (e) {
|
|
@@ -956,24 +1005,30 @@ class ViewSyncerService {
|
|
|
956
1005
|
getLogLevel(transformedCustomQueries.kind)
|
|
957
1006
|
);
|
|
958
1007
|
}
|
|
959
|
-
const
|
|
1008
|
+
const successfullyTransformedCustomQueries = /* @__PURE__ */ new Map();
|
|
960
1009
|
erroredQueryIDs = this.#processTransformedCustomQueries(
|
|
961
1010
|
lc,
|
|
962
1011
|
transformedCustomQueries,
|
|
963
1012
|
(q) => {
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
1013
|
+
const origQuery = customQueries.get(q.id);
|
|
1014
|
+
if (origQuery) {
|
|
1015
|
+
successfullyTransformedCustomQueries.set(q.id, q);
|
|
1016
|
+
transformedQueries.push({
|
|
1017
|
+
id: q.id,
|
|
1018
|
+
origQuery,
|
|
1019
|
+
transformed: q
|
|
1020
|
+
});
|
|
1021
|
+
}
|
|
970
1022
|
},
|
|
971
1023
|
customQueries
|
|
972
1024
|
);
|
|
973
|
-
for (const [
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
1025
|
+
for (const [
|
|
1026
|
+
queryID,
|
|
1027
|
+
newTransform
|
|
1028
|
+
] of successfullyTransformedCustomQueries) {
|
|
1029
|
+
const existingTransformHash = cvr.queries[queryID]?.transformationHash;
|
|
1030
|
+
if (existingTransformHash) {
|
|
1031
|
+
const oldHash = existingTransformHash;
|
|
977
1032
|
const newHash = newTransform.transformationHash;
|
|
978
1033
|
if (oldHash !== newHash) {
|
|
979
1034
|
lc.info?.(
|
|
@@ -987,31 +1042,15 @@ class ViewSyncerService {
|
|
|
987
1042
|
}
|
|
988
1043
|
}
|
|
989
1044
|
}
|
|
990
|
-
const
|
|
991
|
-
(
|
|
992
|
-
const ids = hashToIDs.get(transformed.transformationHash);
|
|
993
|
-
if (ids) {
|
|
994
|
-
ids.push(id);
|
|
995
|
-
} else {
|
|
996
|
-
hashToIDs.set(transformed.transformationHash, [id]);
|
|
997
|
-
}
|
|
998
|
-
return {
|
|
999
|
-
id,
|
|
1000
|
-
ast: transformed.transformedAst,
|
|
1001
|
-
transformationHash: transformed.transformationHash,
|
|
1002
|
-
remove: expired(ttlClock, origQuery)
|
|
1003
|
-
};
|
|
1004
|
-
}
|
|
1005
|
-
);
|
|
1006
|
-
const addQueries = serverQueries.filter(
|
|
1007
|
-
(q) => !q.remove && !hydratedQueries.has(q.transformationHash)
|
|
1045
|
+
const removeQueriesQueryIds = new Set(
|
|
1046
|
+
Object.values(cvr.queries).filter((q) => expired(ttlClock, q)).map((q) => q.id).concat(erroredQueryIDs || [])
|
|
1008
1047
|
);
|
|
1009
|
-
const
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
(
|
|
1048
|
+
const addQueries = transformedQueries.map(({ id, transformed }) => ({
|
|
1049
|
+
id,
|
|
1050
|
+
ast: transformed.transformedAst,
|
|
1051
|
+
transformationHash: transformed.transformationHash
|
|
1052
|
+
})).filter(
|
|
1053
|
+
(q) => !removeQueriesQueryIds.has(q.id) && this.#pipelines.queries().get(q.id)?.transformationHash !== q.transformationHash
|
|
1015
1054
|
);
|
|
1016
1055
|
for (const q of addQueries) {
|
|
1017
1056
|
const orig = cvr.queries[q.id];
|
|
@@ -1022,33 +1061,12 @@ class ViewSyncerService {
|
|
|
1022
1061
|
orig.type === "custom" ? orig.name : orig.ast
|
|
1023
1062
|
);
|
|
1024
1063
|
}
|
|
1025
|
-
if (
|
|
1026
|
-
const successfulHashes = new Set(
|
|
1027
|
-
transformedQueries.map(
|
|
1028
|
-
({ transformed }) => transformed.transformationHash
|
|
1029
|
-
)
|
|
1030
|
-
);
|
|
1031
|
-
for (const queryID of erroredQueryIDs) {
|
|
1032
|
-
let lastKnownHash;
|
|
1033
|
-
const cvrQuery = cvr.queries[queryID];
|
|
1034
|
-
if (cvrQuery?.transformationHash) {
|
|
1035
|
-
lastKnownHash = cvrQuery.transformationHash;
|
|
1036
|
-
}
|
|
1037
|
-
const transformationHash = lastKnownHash && successfulHashes.has(lastKnownHash) ? void 0 : lastKnownHash;
|
|
1038
|
-
removeQueries.push({
|
|
1039
|
-
id: queryID,
|
|
1040
|
-
transformationHash
|
|
1041
|
-
});
|
|
1042
|
-
}
|
|
1043
|
-
}
|
|
1044
|
-
if (addQueries.length > 0 || removeQueries.length > 0 || unhydrateQueries.length > 0) {
|
|
1064
|
+
if (addQueries.length > 0 || removeQueriesQueryIds.size > 0) {
|
|
1045
1065
|
await this.#addAndRemoveQueries(
|
|
1046
1066
|
lc,
|
|
1047
1067
|
cvr,
|
|
1048
1068
|
addQueries,
|
|
1049
|
-
|
|
1050
|
-
unhydrateQueries,
|
|
1051
|
-
hashToIDs
|
|
1069
|
+
[...removeQueriesQueryIds].map((id) => ({ id }))
|
|
1052
1070
|
);
|
|
1053
1071
|
} else {
|
|
1054
1072
|
await this.#catchupClients(lc, cvr);
|
|
@@ -1082,10 +1100,10 @@ class ViewSyncerService {
|
|
|
1082
1100
|
}
|
|
1083
1101
|
}
|
|
1084
1102
|
// This must be called from within the #lock.
|
|
1085
|
-
#addAndRemoveQueries(lc, cvr, addQueries, removeQueries
|
|
1103
|
+
#addAndRemoveQueries(lc, cvr, addQueries, removeQueries) {
|
|
1086
1104
|
return startAsyncSpan(tracer, "vs.#addAndRemoveQueries", async () => {
|
|
1087
1105
|
assert(
|
|
1088
|
-
addQueries.length > 0 || removeQueries.length > 0
|
|
1106
|
+
addQueries.length > 0 || removeQueries.length > 0,
|
|
1089
1107
|
"Must have queries to add or remove"
|
|
1090
1108
|
);
|
|
1091
1109
|
const start = performance.now();
|
|
@@ -1104,38 +1122,22 @@ class ViewSyncerService {
|
|
|
1104
1122
|
removeQueries
|
|
1105
1123
|
);
|
|
1106
1124
|
const clients = this.#getClients();
|
|
1107
|
-
const pokers = startPoke(
|
|
1108
|
-
clients,
|
|
1109
|
-
newVersion,
|
|
1110
|
-
this.#pipelines.currentSchemaVersions()
|
|
1111
|
-
);
|
|
1125
|
+
const pokers = startPoke(clients, newVersion);
|
|
1112
1126
|
for (const patch of queryPatches) {
|
|
1113
1127
|
await pokers.addPatch(patch);
|
|
1114
1128
|
}
|
|
1115
1129
|
for (const q of removeQueries) {
|
|
1116
|
-
|
|
1117
|
-
this.#pipelines.removeQuery(q.transformationHash);
|
|
1118
|
-
}
|
|
1130
|
+
this.#pipelines.removeQuery(q.id);
|
|
1119
1131
|
this.#inspectorDelegate.removeQuery(q.id);
|
|
1120
1132
|
this.#queryReplacements.delete(q.id);
|
|
1121
1133
|
}
|
|
1122
|
-
for (const hash of unhydrateQueries) {
|
|
1123
|
-
this.#pipelines.removeQuery(hash);
|
|
1124
|
-
const ids = hashToIDs.get(hash);
|
|
1125
|
-
if (ids) {
|
|
1126
|
-
for (const id of ids) {
|
|
1127
|
-
this.#inspectorDelegate.removeQuery(id);
|
|
1128
|
-
this.#queryReplacements.delete(id);
|
|
1129
|
-
}
|
|
1130
|
-
}
|
|
1131
|
-
}
|
|
1132
1134
|
let totalProcessTime = 0;
|
|
1133
|
-
const timer = new TimeSliceTimer();
|
|
1135
|
+
const timer = new TimeSliceTimer(lc);
|
|
1134
1136
|
const pipelines = this.#pipelines;
|
|
1135
1137
|
const hydrations = this.#hydrations;
|
|
1136
1138
|
const hydrationTime = this.#hydrationTime;
|
|
1137
1139
|
const self = this;
|
|
1138
|
-
await yieldProcess();
|
|
1140
|
+
await yieldProcess(lc);
|
|
1139
1141
|
function* generateRowChanges(slowHydrateThreshold) {
|
|
1140
1142
|
for (const q of addQueries) {
|
|
1141
1143
|
lc = lc.withContext("hash", q.id).withContext("transformationHash", q.transformationHash);
|
|
@@ -1148,10 +1150,7 @@ class ViewSyncerService {
|
|
|
1148
1150
|
);
|
|
1149
1151
|
const elapsed = timer.stop();
|
|
1150
1152
|
totalProcessTime += elapsed;
|
|
1151
|
-
self.#addQueryMaterializationServerMetric(
|
|
1152
|
-
q.transformationHash,
|
|
1153
|
-
elapsed
|
|
1154
|
-
);
|
|
1153
|
+
self.#addQueryMaterializationServerMetric(q.id, elapsed);
|
|
1155
1154
|
if (elapsed > slowHydrateThreshold) {
|
|
1156
1155
|
lc.warn?.("Slow query materialization", elapsed, q.ast);
|
|
1157
1156
|
}
|
|
@@ -1168,8 +1167,7 @@ class ViewSyncerService {
|
|
|
1168
1167
|
timer,
|
|
1169
1168
|
generateRowChanges(this.#slowHydrateThreshold),
|
|
1170
1169
|
updater,
|
|
1171
|
-
pokers
|
|
1172
|
-
hashToIDs
|
|
1170
|
+
pokers
|
|
1173
1171
|
);
|
|
1174
1172
|
for (const patch of await updater.deleteUnreferencedRows(lc)) {
|
|
1175
1173
|
await pokers.addPatch(patch);
|
|
@@ -1213,11 +1211,7 @@ class ViewSyncerService {
|
|
|
1213
1211
|
return startAsyncSpan(tracer, "vs.#catchupClients", async (span) => {
|
|
1214
1212
|
current ??= cvr.version;
|
|
1215
1213
|
const clients = this.#getClients();
|
|
1216
|
-
const pokers = usePokers ?? startPoke(
|
|
1217
|
-
clients,
|
|
1218
|
-
cvr.version,
|
|
1219
|
-
this.#pipelines.currentSchemaVersions()
|
|
1220
|
-
);
|
|
1214
|
+
const pokers = usePokers ?? startPoke(clients, cvr.version);
|
|
1221
1215
|
span.setAttribute("numClients", clients.length);
|
|
1222
1216
|
const catchupFrom = clients.map((c) => c.version()).reduce((a, b) => cmpVersions(a, b) < 0 ? a : b, cvr.version);
|
|
1223
1217
|
const rowPatches = this.#cvrStore.catchupRowPatches(
|
|
@@ -1233,6 +1227,8 @@ class ViewSyncerService {
|
|
|
1233
1227
|
cvr,
|
|
1234
1228
|
current
|
|
1235
1229
|
);
|
|
1230
|
+
configPatches.catch(() => {
|
|
1231
|
+
});
|
|
1236
1232
|
let rowPatchCount = 0;
|
|
1237
1233
|
for await (const rows of rowPatches) {
|
|
1238
1234
|
for (const row of rows) {
|
|
@@ -1268,7 +1264,7 @@ class ViewSyncerService {
|
|
|
1268
1264
|
}
|
|
1269
1265
|
});
|
|
1270
1266
|
}
|
|
1271
|
-
#processChanges(lc, timer, changes, updater, pokers
|
|
1267
|
+
#processChanges(lc, timer, changes, updater, pokers) {
|
|
1272
1268
|
return startAsyncSpan(tracer, "vs.#processChanges", async () => {
|
|
1273
1269
|
const start = performance.now();
|
|
1274
1270
|
const rows = new CustomKeyMap(rowIDString);
|
|
@@ -1291,24 +1287,14 @@ class ViewSyncerService {
|
|
|
1291
1287
|
await timer.yieldProcess("yield in processChanges");
|
|
1292
1288
|
continue;
|
|
1293
1289
|
}
|
|
1294
|
-
const {
|
|
1295
|
-
type,
|
|
1296
|
-
queryHash: transformationHash,
|
|
1297
|
-
table,
|
|
1298
|
-
rowKey,
|
|
1299
|
-
row
|
|
1300
|
-
} = change;
|
|
1301
|
-
const queryIDs = must(
|
|
1302
|
-
hashToIDs.get(transformationHash),
|
|
1303
|
-
"could not find the original hash for the transformation hash"
|
|
1304
|
-
);
|
|
1290
|
+
const { type, queryID, table, rowKey, row } = change;
|
|
1305
1291
|
const rowID = { schema: "", table, rowKey };
|
|
1306
1292
|
let parsedRow = rows.get(rowID);
|
|
1307
1293
|
if (!parsedRow) {
|
|
1308
1294
|
parsedRow = { refCounts: {} };
|
|
1309
1295
|
rows.set(rowID, parsedRow);
|
|
1310
1296
|
}
|
|
1311
|
-
|
|
1297
|
+
parsedRow.refCounts[queryID] ??= 0;
|
|
1312
1298
|
const updateVersion = (row2) => {
|
|
1313
1299
|
const { version: version2, contents } = contentsAndVersion(row2);
|
|
1314
1300
|
parsedRow.version = version2;
|
|
@@ -1317,13 +1303,13 @@ class ViewSyncerService {
|
|
|
1317
1303
|
switch (type) {
|
|
1318
1304
|
case "add":
|
|
1319
1305
|
updateVersion(row);
|
|
1320
|
-
|
|
1306
|
+
parsedRow.refCounts[queryID]++;
|
|
1321
1307
|
break;
|
|
1322
1308
|
case "edit":
|
|
1323
1309
|
updateVersion(row);
|
|
1324
1310
|
break;
|
|
1325
1311
|
case "remove":
|
|
1326
|
-
|
|
1312
|
+
parsedRow.refCounts[queryID]--;
|
|
1327
1313
|
break;
|
|
1328
1314
|
default:
|
|
1329
1315
|
unreachable(type);
|
|
@@ -1354,7 +1340,7 @@ class ViewSyncerService {
|
|
|
1354
1340
|
"pipelines must be initialized (advancePipelines"
|
|
1355
1341
|
);
|
|
1356
1342
|
const start = performance.now();
|
|
1357
|
-
const timer = new TimeSliceTimer();
|
|
1343
|
+
const timer = new TimeSliceTimer(lc);
|
|
1358
1344
|
const { version: version2, numChanges, changes } = this.#pipelines.advance(timer);
|
|
1359
1345
|
lc = lc.withContext("newVersion", version2);
|
|
1360
1346
|
const updater = new CVRQueryDrivenUpdater(
|
|
@@ -1365,19 +1351,16 @@ class ViewSyncerService {
|
|
|
1365
1351
|
);
|
|
1366
1352
|
const pokers = startPoke(
|
|
1367
1353
|
this.#getClients(cvr.version),
|
|
1368
|
-
updater.updatedVersion()
|
|
1369
|
-
this.#pipelines.currentSchemaVersions()
|
|
1354
|
+
updater.updatedVersion()
|
|
1370
1355
|
);
|
|
1371
1356
|
lc.debug?.(`applying ${numChanges} to advance to ${version2}`);
|
|
1372
|
-
const hashToIDs = createHashToIDs(cvr);
|
|
1373
1357
|
try {
|
|
1374
1358
|
await this.#processChanges(
|
|
1375
1359
|
lc,
|
|
1376
1360
|
await timer.start(),
|
|
1377
1361
|
changes,
|
|
1378
1362
|
updater,
|
|
1379
|
-
pokers
|
|
1380
|
-
hashToIDs
|
|
1363
|
+
pokers
|
|
1381
1364
|
);
|
|
1382
1365
|
} catch (e) {
|
|
1383
1366
|
if (e instanceof ResetPipelinesSignal) {
|
|
@@ -1444,22 +1427,8 @@ class ViewSyncerService {
|
|
|
1444
1427
|
}
|
|
1445
1428
|
}
|
|
1446
1429
|
const CURSOR_PAGE_SIZE = 1e4;
|
|
1447
|
-
function createHashToIDs(cvr) {
|
|
1448
|
-
const hashToIDs = /* @__PURE__ */ new Map();
|
|
1449
|
-
for (const { id, transformationHash } of Object.values(cvr.queries)) {
|
|
1450
|
-
if (!transformationHash) {
|
|
1451
|
-
continue;
|
|
1452
|
-
}
|
|
1453
|
-
if (hashToIDs.has(transformationHash)) {
|
|
1454
|
-
must(hashToIDs.get(transformationHash)).push(id);
|
|
1455
|
-
} else {
|
|
1456
|
-
hashToIDs.set(transformationHash, [id]);
|
|
1457
|
-
}
|
|
1458
|
-
}
|
|
1459
|
-
return hashToIDs;
|
|
1460
|
-
}
|
|
1461
1430
|
const timeSliceQueue = new Lock();
|
|
1462
|
-
function yieldProcess() {
|
|
1431
|
+
function yieldProcess(_lc) {
|
|
1463
1432
|
return timeSliceQueue.withLock(() => new Promise(setImmediate));
|
|
1464
1433
|
}
|
|
1465
1434
|
function contentsAndVersion(row) {
|
|
@@ -1547,8 +1516,12 @@ function hasExpiredQueries(cvr) {
|
|
|
1547
1516
|
class TimeSliceTimer {
|
|
1548
1517
|
#total = 0;
|
|
1549
1518
|
#start = 0;
|
|
1519
|
+
#lc;
|
|
1520
|
+
constructor(lc) {
|
|
1521
|
+
this.#lc = lc;
|
|
1522
|
+
}
|
|
1550
1523
|
async start() {
|
|
1551
|
-
await yieldProcess();
|
|
1524
|
+
await yieldProcess(this.#lc);
|
|
1552
1525
|
return this.startWithoutYielding();
|
|
1553
1526
|
}
|
|
1554
1527
|
startWithoutYielding() {
|
|
@@ -1558,7 +1531,7 @@ class TimeSliceTimer {
|
|
|
1558
1531
|
}
|
|
1559
1532
|
async yieldProcess(_msgForTesting) {
|
|
1560
1533
|
this.#stopLap();
|
|
1561
|
-
await yieldProcess();
|
|
1534
|
+
await yieldProcess(this.#lc);
|
|
1562
1535
|
this.#startLap();
|
|
1563
1536
|
}
|
|
1564
1537
|
#startLap() {
|