@rocicorp/zero 1.10.0-canary.0 → 1.10.0-canary.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/replicache/src/db/commit.js +1 -4
- package/out/replicache/src/db/commit.js.map +1 -1
- package/out/replicache/src/db/read.d.ts +1 -0
- package/out/replicache/src/db/read.d.ts.map +1 -1
- package/out/replicache/src/db/read.js +1 -4
- package/out/replicache/src/db/read.js.map +1 -1
- package/out/replicache/src/db/write.d.ts +2 -1
- package/out/replicache/src/db/write.d.ts.map +1 -1
- package/out/replicache/src/db/write.js +4 -51
- package/out/replicache/src/db/write.js.map +1 -1
- package/out/replicache/src/persist/clients.d.ts +1 -0
- package/out/replicache/src/persist/clients.d.ts.map +1 -1
- package/out/replicache/src/persist/clients.js +4 -31
- package/out/replicache/src/persist/clients.js.map +1 -1
- package/out/replicache/src/process-env.d.ts +28 -0
- package/out/replicache/src/process-env.d.ts.map +1 -0
- package/out/replicache/src/replicache-impl.d.ts.map +1 -1
- package/out/replicache/src/replicache-impl.js.map +1 -1
- package/out/replicache/src/scan-iterator.js +2 -14
- package/out/replicache/src/scan-iterator.js.map +1 -1
- package/out/replicache/src/subscriptions.d.ts +1 -0
- package/out/replicache/src/subscriptions.d.ts.map +1 -1
- package/out/replicache/src/subscriptions.js +2 -10
- package/out/replicache/src/subscriptions.js.map +1 -1
- package/out/replicache/src/transactions.d.ts +1 -0
- package/out/replicache/src/transactions.d.ts.map +1 -1
- package/out/replicache/src/transactions.js +2 -4
- package/out/replicache/src/transactions.js.map +1 -1
- package/out/z2s/src/compiler.d.ts.map +1 -1
- package/out/z2s/src/compiler.js +1 -22
- package/out/z2s/src/compiler.js.map +1 -1
- package/out/zero/package.js +3 -3
- package/out/zero/package.js.map +1 -1
- package/out/zero-cache/src/config/normalize.d.ts +1 -0
- package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
- package/out/zero-cache/src/config/normalize.js +10 -1
- package/out/zero-cache/src/config/normalize.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +52 -1
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +171 -22
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/custom/fetch.js +1 -1
- package/out/zero-cache/src/custom/fetch.js.map +1 -1
- package/out/zero-cache/src/db/delete-lite-db.js +2 -1
- package/out/zero-cache/src/db/delete-lite-db.js.map +1 -1
- package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
- package/out/zero-cache/src/db/migration-lite.js +5 -2
- 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 +4 -2
- package/out/zero-cache/src/db/migration.js.map +1 -1
- package/out/zero-cache/src/db/sqlite-corruption.d.ts +3 -2
- package/out/zero-cache/src/db/sqlite-corruption.d.ts.map +1 -1
- package/out/zero-cache/src/db/sqlite-corruption.js +13 -8
- package/out/zero-cache/src/db/sqlite-corruption.js.map +1 -1
- package/out/zero-cache/src/observability/metrics.d.ts +6 -1
- package/out/zero-cache/src/observability/metrics.d.ts.map +1 -1
- package/out/zero-cache/src/observability/metrics.js +20 -2
- package/out/zero-cache/src/observability/metrics.js.map +1 -1
- package/out/zero-cache/src/server/backup-watermark-poller.js +31 -0
- package/out/zero-cache/src/server/backup-watermark-poller.js.map +1 -0
- package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/server/change-streamer.js +91 -31
- package/out/zero-cache/src/server/change-streamer.js.map +1 -1
- package/out/zero-cache/src/server/main.d.ts.map +1 -1
- package/out/zero-cache/src/server/main.js +6 -16
- package/out/zero-cache/src/server/main.js.map +1 -1
- package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/server/replicator.js +48 -5
- package/out/zero-cache/src/server/replicator.js.map +1 -1
- package/out/zero-cache/src/server/runner/run-worker.js +2 -1
- package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
- package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/server/syncer.js +1 -1
- package/out/zero-cache/src/server/syncer.js.map +1 -1
- package/out/zero-cache/src/server/worker-urls.d.ts +1 -1
- package/out/zero-cache/src/server/worker-urls.js +2 -2
- package/out/zero-cache/src/server/worker-urls.js.map +1 -1
- package/out/zero-cache/src/services/change-source/change-source.d.ts +4 -2
- package/out/zero-cache/src/services/change-source/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts +35 -0
- package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/common/replica-restore.js +34 -0
- package/out/zero-cache/src/services/change-source/common/replica-restore.js.map +1 -0
- package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts +2 -0
- package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/common/replica-schema.js +73 -1
- package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.d.ts +2 -6
- 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 +14 -5
- package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +4 -7
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +7 -7
- 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 +82 -25
- 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 +9 -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 +12 -4
- 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 +45 -2
- 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 +59 -8
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts +4 -2
- package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slots.js +7 -4
- package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts +0 -5
- 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 +29 -41
- 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/shard.d.ts +35 -16
- 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 +77 -7
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +2 -1
- 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 +5 -13
- 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 +6 -3
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/schema-change-tags.d.ts +6 -0
- package/out/zero-cache/src/services/change-source/protocol/current/schema-change-tags.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current/schema-change-tags.js +21 -0
- package/out/zero-cache/src/services/change-source/protocol/current/schema-change-tags.js.map +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current/status.d.ts +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current/status.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts +5 -6
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js +32 -9
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts +15 -5
- package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-monitor.js +66 -0
- package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/broadcast.d.ts +68 -78
- package/out/zero-cache/src/services/change-streamer/broadcast.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/broadcast.js +84 -92
- package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts +19 -0
- package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/change-log-codec.js +50 -0
- package/out/zero-cache/src/services/change-streamer/change-log-codec.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts +141 -0
- package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/change-log-initializer.js +270 -0
- package/out/zero-cache/src/services/change-streamer/change-log-initializer.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.d.ts +19 -0
- package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.js +39 -0
- package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +3 -4
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +12 -17
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +69 -24
- 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 +333 -66
- 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 +56 -13
- package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/error-type-enum.d.ts +8 -0
- package/out/zero-cache/src/services/change-streamer/error-type-enum.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/forwarder.d.ts +14 -3
- package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/forwarder.js +41 -11
- package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/{litestream3-backup-monitor.d.ts → litestream3-prometheus-poller.d.ts} +19 -45
- package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/{litestream3-backup-monitor.js → litestream3-prometheus-poller.js} +57 -171
- package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/replica-poller.d.ts +15 -0
- package/out/zero-cache/src/services/change-streamer/replica-poller.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/replica-poller.js +55 -0
- package/out/zero-cache/src/services/change-streamer/replica-poller.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +5 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.js +2 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts +14 -0
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js +86 -0
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/snapshot.d.ts +4 -1
- package/out/zero-cache/src/services/change-streamer/snapshot.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot.js +39 -14
- package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.d.ts +75 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js +261 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.d.ts +121 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.js +391 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.d.ts +62 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js +159 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts +109 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js +258 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/storer.d.ts +28 -12
- package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js +116 -121
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +61 -10
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.js +101 -8
- package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts +34 -0
- package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/upstream-acker.js +86 -0
- package/out/zero-cache/src/services/change-streamer/upstream-acker.js.map +1 -0
- 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 +4 -3
- package/out/zero-cache/src/services/life-cycle.js.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.d.ts +12 -11
- package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.js +107 -148
- package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
- package/out/zero-cache/src/services/litestream/config-v5.yml +42 -0
- package/out/zero-cache/src/services/litestream/config.yml +3 -2
- package/out/zero-cache/src/services/litestream/metrics.d.ts +4 -4
- package/out/zero-cache/src/services/litestream/metrics.d.ts.map +1 -1
- package/out/zero-cache/src/services/litestream/metrics.js +7 -10
- package/out/zero-cache/src/services/litestream/metrics.js.map +1 -1
- package/out/zero-cache/src/services/litestream/vfs-watermark-poller.d.ts +57 -0
- package/out/zero-cache/src/services/litestream/vfs-watermark-poller.d.ts.map +1 -0
- package/out/zero-cache/src/services/litestream/vfs-watermark-poller.js +137 -0
- package/out/zero-cache/src/services/litestream/vfs-watermark-poller.js.map +1 -0
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js +4 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-log-cookies.d.ts +169 -0
- package/out/zero-cache/src/services/replicator/change-log-cookies.d.ts.map +1 -0
- package/out/zero-cache/src/services/replicator/change-log-cookies.js +434 -0
- package/out/zero-cache/src/services/replicator/change-log-cookies.js.map +1 -0
- package/out/zero-cache/src/services/replicator/change-log-db.d.ts +358 -0
- package/out/zero-cache/src/services/replicator/change-log-db.d.ts.map +1 -0
- package/out/zero-cache/src/services/replicator/change-log-db.js +477 -0
- package/out/zero-cache/src/services/replicator/change-log-db.js.map +1 -0
- package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts +55 -0
- package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts.map +1 -0
- package/out/zero-cache/src/services/replicator/change-log-stream-writer.js +150 -0
- package/out/zero-cache/src/services/replicator/change-log-stream-writer.js.map +1 -0
- package/out/zero-cache/src/services/replicator/change-processor.d.ts +6 -0
- package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.js +70 -25
- package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.js +19 -6
- package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
- package/out/zero-cache/src/services/replicator/notifier.d.ts +0 -22
- package/out/zero-cache/src/services/replicator/notifier.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/notifier.js +7 -1
- package/out/zero-cache/src/services/replicator/notifier.js.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.d.ts +17 -2
- package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.js +9 -3
- package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
- package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts +27 -0
- package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/reporter/recorder.js +32 -0
- package/out/zero-cache/src/services/replicator/reporter/recorder.js.map +1 -1
- package/out/zero-cache/src/services/replicator/reporter/report-schema.d.ts +1 -1
- package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts +119 -0
- package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts.map +1 -0
- package/out/zero-cache/src/services/replicator/schema/backfilling.js +214 -0
- package/out/zero-cache/src/services/replicator/schema/backfilling.js.map +1 -0
- package/out/zero-cache/src/services/replicator/schema/change-log.d.ts +3 -3
- package/out/zero-cache/src/services/replicator/schema/column-metadata.js +1 -1
- package/out/zero-cache/src/services/replicator/schema/column-metadata.js.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts +1 -1
- 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 +9 -5
- package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts +131 -0
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts.map +1 -0
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js +413 -0
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js.map +1 -0
- package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.d.ts +120 -0
- package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.d.ts.map +1 -0
- package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.js +283 -0
- package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.js.map +1 -0
- package/out/zero-cache/src/services/replicator/write-worker.js +23 -12
- package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
- package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
- package/out/zero-cache/src/services/run-ast.js +2 -1
- package/out/zero-cache/src/services/run-ast.js.map +1 -1
- package/out/zero-cache/src/services/running-state.d.ts +1 -1
- package/out/zero-cache/src/services/running-state.d.ts.map +1 -1
- package/out/zero-cache/src/services/running-state.js +1 -0
- package/out/zero-cache/src/services/running-state.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.d.ts +53 -0
- package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.js +68 -0
- package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.js.map +1 -0
- 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 +18 -3
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +11 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.js +64 -6
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/processes.d.ts +1 -2
- package/out/zero-cache/src/types/processes.d.ts.map +1 -1
- package/out/zero-cache/src/types/processes.js +1 -25
- package/out/zero-cache/src/types/processes.js.map +1 -1
- package/out/zero-cache/src/types/streams.d.ts +21 -0
- package/out/zero-cache/src/types/streams.d.ts.map +1 -1
- package/out/zero-cache/src/types/streams.js +25 -4
- package/out/zero-cache/src/types/streams.js.map +1 -1
- package/out/zero-cache/src/types/subscription.d.ts +11 -0
- package/out/zero-cache/src/types/subscription.d.ts.map +1 -1
- package/out/zero-cache/src/types/subscription.js +27 -0
- package/out/zero-cache/src/types/subscription.js.map +1 -1
- package/out/zero-cache/src/workers/connection.d.ts +1 -0
- package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
- package/out/zero-cache/src/workers/connection.js +24 -2
- package/out/zero-cache/src/workers/connection.js.map +1 -1
- package/out/zero-cache/src/workers/replicator.d.ts +25 -0
- package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/workers/replicator.js +33 -1
- package/out/zero-cache/src/workers/replicator.js.map +1 -1
- package/out/zero-cache/src/workers/syncer.d.ts +12 -0
- package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/workers/syncer.js +75 -0
- package/out/zero-cache/src/workers/syncer.js.map +1 -1
- package/out/zero-client/src/client/version.js +1 -1
- package/out/zero-client/src/client/zero.d.ts +6 -7
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.js +156 -101
- package/out/zero-client/src/client/zero.js.map +1 -1
- package/out/zero-schema/src/builder/table-builder.d.ts +23 -0
- package/out/zero-schema/src/builder/table-builder.d.ts.map +1 -1
- package/out/zero-schema/src/builder/table-builder.js +18 -0
- package/out/zero-schema/src/builder/table-builder.js.map +1 -1
- package/out/zero-server/src/custom.js +10 -3
- package/out/zero-server/src/custom.js.map +1 -1
- package/out/zero-server/src/schema.d.ts +8 -0
- package/out/zero-server/src/schema.d.ts.map +1 -1
- package/out/zero-server/src/schema.js +63 -24
- package/out/zero-server/src/schema.js.map +1 -1
- package/out/zero-types/src/schema.d.ts +11 -0
- package/out/zero-types/src/schema.d.ts.map +1 -1
- package/out/zql/src/mutate/crud.d.ts +10 -8
- package/out/zql/src/mutate/crud.d.ts.map +1 -1
- package/out/zql/src/mutate/crud.js.map +1 -1
- package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
- package/out/zql/src/query/query-delegate-base.js +5 -1
- package/out/zql/src/query/query-delegate-base.js.map +1 -1
- package/out/zql/src/query/query-impl.d.ts +2 -2
- package/out/zql/src/query/query-impl.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.js.map +1 -1
- package/out/zql/src/query/query.d.ts +83 -14
- package/out/zql/src/query/query.d.ts.map +1 -1
- package/out/zql/src/query/static-query.d.ts +1 -1
- package/out/zql/src/query/static-query.d.ts.map +1 -1
- package/out/zqlite/src/db.js +2 -2
- package/out/zqlite/src/resolve-scalar-subqueries.d.ts +15 -0
- package/out/zqlite/src/resolve-scalar-subqueries.d.ts.map +1 -1
- package/out/zqlite/src/resolve-scalar-subqueries.js +33 -14
- package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
- package/out/zqlite/src/sqlite-cost-model.js +5 -5
- package/out/zqlite/src/table-source.js +3 -3
- package/package.json +3 -3
- package/out/replicache/src/db/index.js +0 -91
- package/out/replicache/src/db/index.js.map +0 -1
- package/out/replicache/src/lazy.d.ts +0 -2
- package/out/replicache/src/lazy.d.ts.map +0 -1
- package/out/replicache/src/lazy.js +0 -12
- package/out/replicache/src/lazy.js.map +0 -1
- package/out/zero-cache/src/server/backup-watermark-reader.js +0 -35
- package/out/zero-cache/src/server/backup-watermark-reader.js.map +0 -1
- package/out/zero-cache/src/services/change-streamer/litestream3-backup-monitor.d.ts.map +0 -1
- package/out/zero-cache/src/services/change-streamer/litestream3-backup-monitor.js.map +0 -1
- package/out/zero-cache/src/services/change-streamer/replica-monitor.d.ts +0 -16
- package/out/zero-cache/src/services/change-streamer/replica-monitor.d.ts.map +0 -1
- package/out/zero-cache/src/services/change-streamer/replica-monitor.js +0 -54
- package/out/zero-cache/src/services/change-streamer/replica-monitor.js.map +0 -1
- package/out/zero-cache/src/services/change-streamer/vfs-backup-monitor.d.ts +0 -25
- package/out/zero-cache/src/services/change-streamer/vfs-backup-monitor.d.ts.map +0 -1
- package/out/zero-cache/src/services/change-streamer/vfs-backup-monitor.js +0 -159
- package/out/zero-cache/src/services/change-streamer/vfs-backup-monitor.js.map +0 -1
- package/out/zero-cache/src/services/litestream/vfs-watermark-reader.d.ts +0 -44
- package/out/zero-cache/src/services/litestream/vfs-watermark-reader.d.ts.map +0 -1
- package/out/zero-cache/src/services/litestream/vfs-watermark-reader.js +0 -65
- package/out/zero-cache/src/services/litestream/vfs-watermark-reader.js.map +0 -1
- package/out/zero-cache/src/services/litestream/vfs-watermark-worker-source.d.ts +0 -11
- package/out/zero-cache/src/services/litestream/vfs-watermark-worker-source.d.ts.map +0 -1
- package/out/zero-cache/src/services/litestream/vfs-watermark-worker-source.js +0 -74
- package/out/zero-cache/src/services/litestream/vfs-watermark-worker-source.js.map +0 -1
- package/out/zero-cache/src/services/litestream/vfs-watermark-worker.d.ts +0 -42
- package/out/zero-cache/src/services/litestream/vfs-watermark-worker.d.ts.map +0 -1
- package/out/zero-cache/src/services/litestream/vfs-watermark-worker.js +0 -117
- package/out/zero-cache/src/services/litestream/vfs-watermark-worker.js.map +0 -1
|
@@ -2,9 +2,10 @@ import type { LogContext } from '@rocicorp/logger';
|
|
|
2
2
|
import { TransactionPool } from '../../db/transaction-pool.ts';
|
|
3
3
|
import { type PostgresDB } from '../../types/pg.ts';
|
|
4
4
|
import { type ShardID } from '../../types/shards.ts';
|
|
5
|
-
import { type BackfillRequest
|
|
5
|
+
import { type BackfillRequest } from '../change-source/protocol/current.ts';
|
|
6
6
|
import { type ChangeStreamData, type Commit } from '../change-source/protocol/current/downstream.ts';
|
|
7
|
-
import type {
|
|
7
|
+
import type { UpstreamStatusMessage } from '../change-source/protocol/current/status.ts';
|
|
8
|
+
import { type CookieSet } from '../replicator/change-log-cookies.ts';
|
|
8
9
|
import type { ReplicatorMode } from '../replicator/replicator.ts';
|
|
9
10
|
import type { Service } from '../service.ts';
|
|
10
11
|
import type { Subscriber } from './subscriber.ts';
|
|
@@ -12,6 +13,7 @@ export type TuningOptions = {
|
|
|
12
13
|
backPressureLimitHeapProportion: number;
|
|
13
14
|
statementTimeoutMs: number;
|
|
14
15
|
changeLogBatchSize: number;
|
|
16
|
+
drainTimeoutMs?: number | undefined;
|
|
15
17
|
};
|
|
16
18
|
/**
|
|
17
19
|
* Handles the storage of changes and the catchup of subscribers
|
|
@@ -46,11 +48,29 @@ export type TuningOptions = {
|
|
|
46
48
|
export declare class Storer implements Service {
|
|
47
49
|
#private;
|
|
48
50
|
readonly id = "storer";
|
|
49
|
-
constructor(lc: LogContext, shard: ShardID, taskID: string, discoveryAddress: string, discoveryProtocol: string, db: PostgresDB, replicaVersion: string,
|
|
51
|
+
constructor(lc: LogContext, shard: ShardID, taskID: string, discoveryAddress: string, discoveryProtocol: string, db: PostgresDB, replicaVersion: string, onCommitted: (c: Commit | UpstreamStatusMessage) => void, onFatal: (err: Error) => void, { backPressureLimitHeapProportion, statementTimeoutMs, changeLogBatchSize, drainTimeoutMs, }: TuningOptions);
|
|
50
52
|
assumeOwnership(purgeLock?: PurgeLock | null): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* The whole of what a stream connection starts from: where to resume, what to
|
|
55
|
+
* ask the change source to backfill, and the raw cookie set those requests
|
|
56
|
+
* were derived from.
|
|
57
|
+
*
|
|
58
|
+
* All four statements run in one REPEATABLE READ transaction, so they see one
|
|
59
|
+
* snapshot. That is invariant 15 — the resume watermark and the cookies must
|
|
60
|
+
* come from the same store, read at the same position — and it is why the
|
|
61
|
+
* cookies are read here rather than by a second call: a cookie set paired
|
|
62
|
+
* with a watermark it was not folded to loses every backfill that completed
|
|
63
|
+
* in the interval, and those rows are not replayable from the slot.
|
|
64
|
+
*
|
|
65
|
+
* `cookies` is not `backfillRequests` in another shape. The request list is
|
|
66
|
+
* driven off `backfilling`, so it drops the metadata of every table with no
|
|
67
|
+
* in-flight backfill — correct for starting a stream, lossy as the cookie
|
|
68
|
+
* snapshot that the SQLite change log continues folding onto.
|
|
69
|
+
*/
|
|
51
70
|
getStartStreamInitializationParameters(): Promise<{
|
|
52
71
|
lastWatermark: string;
|
|
53
72
|
backfillRequests: BackfillRequest[];
|
|
73
|
+
cookies: CookieSet;
|
|
54
74
|
}>;
|
|
55
75
|
getMinWatermarkForCatchup(): Promise<string | null>;
|
|
56
76
|
purgeRecordsBefore(watermark: string): Promise<number>;
|
|
@@ -59,7 +79,6 @@ export declare class Storer implements Service {
|
|
|
59
79
|
*/
|
|
60
80
|
store(watermark: string, data: ChangeStreamData): string;
|
|
61
81
|
abort(): void;
|
|
62
|
-
status(s: DownstreamStatusMessage): void;
|
|
63
82
|
catchup(subscriber: Subscriber, mode: ReplicatorMode): void;
|
|
64
83
|
readyForMore(): Promise<void> | undefined;
|
|
65
84
|
/**
|
|
@@ -72,16 +91,13 @@ export declare class Storer implements Service {
|
|
|
72
91
|
* This is only used in tests.
|
|
73
92
|
*/
|
|
74
93
|
allProcessed(): Promise<void>;
|
|
94
|
+
/**
|
|
95
|
+
* Stops the storer and waits up to a drain timeout for entries to drain,
|
|
96
|
+
* throwing an exception if it doesn't drain in time, in order to abort
|
|
97
|
+
* the server when PG (or the connection to it) appears to be wedged.
|
|
98
|
+
*/
|
|
75
99
|
stop(): Promise<void>;
|
|
76
100
|
}
|
|
77
|
-
/**
|
|
78
|
-
* Extracts the stringified change message from the stringified
|
|
79
|
-
* stream message (e.g. the second tuple element). This optimization
|
|
80
|
-
* facilitates stringifying (and sharing the result of) the stream
|
|
81
|
-
* message exactly once, but storing only the change message substring
|
|
82
|
-
* in the changeLog for backwards compatibility.
|
|
83
|
-
*/
|
|
84
|
-
export declare function extractChangeSubstring(streamMessageJSON: string, tag: Change['tag'] | undefined): string;
|
|
85
101
|
export declare class PurgeLock {
|
|
86
102
|
#private;
|
|
87
103
|
readonly replicaVersion: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storer.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/storer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"storer.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/storer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAUjD,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAC,KAAK,UAAU,EAA2B,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAY,KAAK,OAAO,EAAC,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAKL,KAAK,eAAe,EAMrB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,MAAM,EACZ,MAAM,iDAAiD,CAAC;AACzD,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,6CAA6C,CAAC;AACvF,OAAO,EAIL,KAAK,SAAS,EAEf,MAAM,qCAAqC,CAAC;AAC7C,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAc3C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAsChD,MAAM,MAAM,aAAa,GAAG;IAC1B,+BAA+B,EAAE,MAAM,CAAC;IACxC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,CAAC;AAaF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,MAAO,YAAW,OAAO;;IACpC,QAAQ,CAAC,EAAE,YAAY;gBAoBrB,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM,EACzB,EAAE,EAAE,UAAU,EACd,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,qBAAqB,KAAK,IAAI,EACxD,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,EAC7B,EACE,+BAA+B,EAC/B,kBAAkB,EAClB,kBAAkB,EAClB,cAAuB,GACxB,EAAE,aAAa;IAiCZ,eAAe,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI;IA2BlD;;;;;;;;;;;;;;;;OAgBG;IACG,sCAAsC,IAAI,OAAO,CAAC;QACtD,aAAa,EAAE,MAAM,CAAC;QACtB,gBAAgB,EAAE,eAAe,EAAE,CAAC;QACpC,OAAO,EAAE,SAAS,CAAC;KACpB,CAAC;IAoDI,yBAAyB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOzD,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyCtD;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB;IAkB/C,KAAK;IAIL,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc;IAOpD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS;IA6FzC;;;OAGG;IACG,GAAG;IAmdT;;;OAGG;IACG,YAAY;IAQlB;;;;OAIG;IACG,IAAI;CAcX;AAED,qBAAa,SAAS;;IAGpB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAG5B,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,eAAe,EACnB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM;IAUb,OAAO;CAWd;AAED,qBAAa,WAAW;;gBAKV,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU;IAWpD,OAAO;CA4Bd"}
|
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
import { assert } from "../../../../shared/src/asserts.js";
|
|
1
|
+
import { assert, unreachable } from "../../../../shared/src/asserts.js";
|
|
2
2
|
import { promiseVoid } from "../../../../shared/src/resolved-promises.js";
|
|
3
3
|
import { AbortError } from "../../../../shared/src/abort-error.js";
|
|
4
4
|
import { parse, valita_exports } from "../../../../shared/src/valita.js";
|
|
5
|
-
import { BigIntJSON } from "../../../../shared/src/bigint-json.js";
|
|
6
5
|
import { cdcSchema } from "../../types/shards.js";
|
|
7
6
|
import { isDataChange, isSchemaChange } from "../change-source/protocol/current/data.js";
|
|
8
7
|
import "../change-source/protocol/current/downstream.js";
|
|
9
8
|
import { backfillRequestSchema } from "../change-source/protocol/current/upstream.js";
|
|
10
9
|
import "../change-source/protocol/current.js";
|
|
10
|
+
import { cookieOps } from "../replicator/change-log-cookies.js";
|
|
11
11
|
import "../../types/pg.js";
|
|
12
12
|
import { READONLY, READ_COMMITTED } from "../../db/mode-enum.js";
|
|
13
13
|
import { runTx } from "../../db/run-transaction.js";
|
|
14
|
-
import { AutoResetSignal, markResetRequired } from "./schema/tables.js";
|
|
15
14
|
import { Queue } from "../../../../shared/src/queue.js";
|
|
15
|
+
import { AutoResetSignal, markResetRequired } from "./schema/tables.js";
|
|
16
16
|
import { TransactionPool } from "../../db/transaction-pool.js";
|
|
17
|
+
import { orTimeout } from "../../types/timeout.js";
|
|
18
|
+
import { extractChangeSubstring, reconstructWatermarkedChange, serializeChangeStreamData } from "./change-log-codec.js";
|
|
17
19
|
import { resolver } from "@rocicorp/resolver";
|
|
18
20
|
import "postgres";
|
|
19
21
|
import { getHeapStatistics } from "node:v8";
|
|
@@ -58,15 +60,16 @@ var Storer = class {
|
|
|
58
60
|
#discoveryProtocol;
|
|
59
61
|
#db;
|
|
60
62
|
#replicaVersion;
|
|
61
|
-
#
|
|
63
|
+
#onCommitted;
|
|
62
64
|
#onFatal;
|
|
63
65
|
#queue = new Queue();
|
|
64
66
|
#backPressureThresholdBytes;
|
|
65
67
|
#statementTimeoutMs;
|
|
66
68
|
#changeLogBatchSize;
|
|
69
|
+
#drainTimeoutMs;
|
|
67
70
|
#approximateQueuedBytes = 0;
|
|
68
71
|
#running = false;
|
|
69
|
-
constructor(lc, shard, taskID, discoveryAddress, discoveryProtocol, db, replicaVersion,
|
|
72
|
+
constructor(lc, shard, taskID, discoveryAddress, discoveryProtocol, db, replicaVersion, onCommitted, onFatal, { backPressureLimitHeapProportion, statementTimeoutMs, changeLogBatchSize, drainTimeoutMs = 3e4 }) {
|
|
70
73
|
this.#lc = lc.withContext("component", "change-log");
|
|
71
74
|
this.#shard = shard;
|
|
72
75
|
this.#taskID = taskID;
|
|
@@ -74,10 +77,11 @@ var Storer = class {
|
|
|
74
77
|
this.#discoveryProtocol = discoveryProtocol;
|
|
75
78
|
this.#db = db;
|
|
76
79
|
this.#replicaVersion = replicaVersion;
|
|
77
|
-
this.#
|
|
80
|
+
this.#onCommitted = onCommitted;
|
|
78
81
|
this.#onFatal = onFatal;
|
|
79
82
|
this.#statementTimeoutMs = statementTimeoutMs;
|
|
80
83
|
this.#changeLogBatchSize = Math.max(1, changeLogBatchSize);
|
|
84
|
+
this.#drainTimeoutMs = drainTimeoutMs;
|
|
81
85
|
const heapStats = getHeapStatistics();
|
|
82
86
|
this.#backPressureThresholdBytes = (heapStats.heap_size_limit - heapStats.used_heap_size) * backPressureLimitHeapProportion;
|
|
83
87
|
this.#lc.info?.(`Using up to ${(this.#backPressureThresholdBytes / 1024 ** 2).toFixed(2)} MB of --max-old-space-size (~${(heapStats.heap_size_limit / 1024 ** 2).toFixed(2)} MB) to absorb upstream spikes`, { heapStats });
|
|
@@ -101,25 +105,55 @@ var Storer = class {
|
|
|
101
105
|
this.#lc.info?.(`assumed ownership at ${addressWithProtocol} (${elapsed} ms)`);
|
|
102
106
|
if (purgeLock) purgeLock.release();
|
|
103
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* The whole of what a stream connection starts from: where to resume, what to
|
|
110
|
+
* ask the change source to backfill, and the raw cookie set those requests
|
|
111
|
+
* were derived from.
|
|
112
|
+
*
|
|
113
|
+
* All four statements run in one REPEATABLE READ transaction, so they see one
|
|
114
|
+
* snapshot. That is invariant 15 — the resume watermark and the cookies must
|
|
115
|
+
* come from the same store, read at the same position — and it is why the
|
|
116
|
+
* cookies are read here rather than by a second call: a cookie set paired
|
|
117
|
+
* with a watermark it was not folded to loses every backfill that completed
|
|
118
|
+
* in the interval, and those rows are not replayable from the slot.
|
|
119
|
+
*
|
|
120
|
+
* `cookies` is not `backfillRequests` in another shape. The request list is
|
|
121
|
+
* driven off `backfilling`, so it drops the metadata of every table with no
|
|
122
|
+
* in-flight backfill — correct for starting a stream, lossy as the cookie
|
|
123
|
+
* snapshot that the SQLite change log continues folding onto.
|
|
124
|
+
*/
|
|
104
125
|
async getStartStreamInitializationParameters() {
|
|
105
|
-
const [[{ lastWatermark }], result] = await runTx(this.#db, (sql) => [
|
|
106
|
-
|
|
107
|
-
SELECT
|
|
126
|
+
const [[{ lastWatermark }], result, tableMetadata, backfilling] = await runTx(this.#db, (sql) => [
|
|
127
|
+
sql`
|
|
128
|
+
SELECT "lastWatermark" FROM ${this.#cdc("replicationState")}`,
|
|
129
|
+
sql`
|
|
130
|
+
SELECT
|
|
108
131
|
json_build_object(
|
|
109
132
|
'schema', b."schema",
|
|
110
133
|
'name', b."table",
|
|
111
134
|
'metadata', t."metadata"
|
|
112
135
|
) as "table",
|
|
113
|
-
json_object_agg(b."column", b."backfill")
|
|
136
|
+
json_object_agg(b."column", b."backfill")
|
|
114
137
|
as "columns"
|
|
115
138
|
FROM ${this.#cdc("backfilling")} as b
|
|
116
139
|
LEFT JOIN ${this.#cdc("tableMetadata")} as t
|
|
117
140
|
ON (b."schema" = t."schema" AND b."table" = t."table")
|
|
118
141
|
GROUP BY b."schema", b."table", t."metadata"
|
|
119
|
-
|
|
142
|
+
`,
|
|
143
|
+
sql`
|
|
144
|
+
SELECT "schema", "table", "metadata" FROM ${this.#cdc("tableMetadata")}
|
|
145
|
+
ORDER BY "schema" COLLATE "C", "table" COLLATE "C"`,
|
|
146
|
+
sql`
|
|
147
|
+
SELECT "schema", "table", "column", "backfill" FROM ${this.#cdc("backfilling")}
|
|
148
|
+
ORDER BY "schema" COLLATE "C", "table" COLLATE "C", "column" COLLATE "C"`
|
|
149
|
+
], { mode: READONLY });
|
|
120
150
|
return {
|
|
121
151
|
lastWatermark,
|
|
122
|
-
backfillRequests: parse(result, backfillRequestsSchema)
|
|
152
|
+
backfillRequests: parse(result, backfillRequestsSchema),
|
|
153
|
+
cookies: {
|
|
154
|
+
tableMetadata: [...tableMetadata],
|
|
155
|
+
backfilling: [...backfilling]
|
|
156
|
+
}
|
|
123
157
|
};
|
|
124
158
|
}
|
|
125
159
|
async getMinWatermarkForCatchup() {
|
|
@@ -159,7 +193,7 @@ var Storer = class {
|
|
|
159
193
|
* @returns The JSON stringified stream message to be sent downstream.
|
|
160
194
|
*/
|
|
161
195
|
store(watermark, data) {
|
|
162
|
-
const json =
|
|
196
|
+
const json = serializeChangeStreamData(data);
|
|
163
197
|
this.#approximateQueuedBytes += json.length;
|
|
164
198
|
const change = data[1];
|
|
165
199
|
this.#queue.enqueue([
|
|
@@ -173,9 +207,6 @@ var Storer = class {
|
|
|
173
207
|
abort() {
|
|
174
208
|
this.#queue.enqueue(["abort"]);
|
|
175
209
|
}
|
|
176
|
-
status(s) {
|
|
177
|
-
this.#queue.enqueue(s);
|
|
178
|
-
}
|
|
179
210
|
catchup(subscriber, mode) {
|
|
180
211
|
this.#queue.enqueue(["subscriber", {
|
|
181
212
|
subscriber,
|
|
@@ -183,20 +214,30 @@ var Storer = class {
|
|
|
183
214
|
}]);
|
|
184
215
|
}
|
|
185
216
|
#readyForMore = null;
|
|
217
|
+
#backpressureTimeout;
|
|
186
218
|
readyForMore() {
|
|
187
219
|
if (!this.#running) return;
|
|
188
220
|
if (this.#readyForMore === null && this.#approximateQueuedBytes > this.#backPressureThresholdBytes) {
|
|
189
221
|
this.#lc.warn?.(`applying back pressure with ${this.#queue.size()} queued changes (~${(this.#approximateQueuedBytes / 1024 ** 2).toFixed(2)} MB)\n\nTo inspect changeLog backlog in your change DB:\n SELECT\n (change->'relation'->>'schema') || '.' || (change->'relation'->>'name') AS table_name,\n change->>'tag' AS operation,\n COUNT(*) AS count\n FROM "<app_id>/cdc"."changeLog"\n GROUP BY 1, 2\n ORDER BY 3 DESC\n LIMIT 20;`);
|
|
190
222
|
this.#readyForMore = resolver();
|
|
223
|
+
this.#resetBackpressureTimeout(true);
|
|
191
224
|
}
|
|
192
225
|
return this.#readyForMore?.promise;
|
|
193
226
|
}
|
|
227
|
+
#resetBackpressureTimeout(reschedule) {
|
|
228
|
+
clearTimeout(this.#backpressureTimeout);
|
|
229
|
+
this.#backpressureTimeout = reschedule ? setTimeout(() => {
|
|
230
|
+
this.#readyForMore?.reject(new AbortError(`No statement processed within the last ${this.#statementTimeoutMs}ms. Considering the change-log to be wedged.`));
|
|
231
|
+
this.#readyForMore = null;
|
|
232
|
+
}, this.#statementTimeoutMs) : void 0;
|
|
233
|
+
}
|
|
194
234
|
#maybeReleaseBackPressure() {
|
|
195
|
-
if (this.#readyForMore !== null
|
|
235
|
+
if (this.#readyForMore !== null) if (this.#approximateQueuedBytes < this.#backPressureThresholdBytes * .8) {
|
|
196
236
|
this.#lc.info?.(`releasing back pressure with ${this.#queue.size()} queued changes (~${(this.#approximateQueuedBytes / 1024 ** 2).toFixed(2)} MB)`);
|
|
197
237
|
this.#readyForMore.resolve();
|
|
198
238
|
this.#readyForMore = null;
|
|
199
|
-
|
|
239
|
+
this.#resetBackpressureTimeout(false);
|
|
240
|
+
} else this.#resetBackpressureTimeout(true);
|
|
200
241
|
}
|
|
201
242
|
/**
|
|
202
243
|
* Flushes any buffered {@link PendingTransaction.batch} rows to the changeLog.
|
|
@@ -246,6 +287,7 @@ var Storer = class {
|
|
|
246
287
|
this.#readyForMore.resolve();
|
|
247
288
|
this.#readyForMore = null;
|
|
248
289
|
}
|
|
290
|
+
this.#resetBackpressureTimeout(false);
|
|
249
291
|
this.#cancelQueueEntries(this.#queue.drain().filter((entry) => entry !== void 0), err);
|
|
250
292
|
this.#running = false;
|
|
251
293
|
signalStopped();
|
|
@@ -287,9 +329,6 @@ var Storer = class {
|
|
|
287
329
|
else await this.#startCatchup([subscriber]);
|
|
288
330
|
continue;
|
|
289
331
|
}
|
|
290
|
-
case "status":
|
|
291
|
-
this.#onConsumed(msg);
|
|
292
|
-
continue;
|
|
293
332
|
case "abort":
|
|
294
333
|
if (tx) {
|
|
295
334
|
tx.pool.abort();
|
|
@@ -356,7 +395,7 @@ var Storer = class {
|
|
|
356
395
|
tx.pool.setDone();
|
|
357
396
|
}
|
|
358
397
|
await tx.pool.done();
|
|
359
|
-
if (tx.ack) this.#
|
|
398
|
+
if (tx.ack) this.#onCommitted([
|
|
360
399
|
"commit",
|
|
361
400
|
change,
|
|
362
401
|
{ watermark }
|
|
@@ -377,7 +416,8 @@ var Storer = class {
|
|
|
377
416
|
}
|
|
378
417
|
async #startCatchup(subs) {
|
|
379
418
|
if (subs.length === 0) return;
|
|
380
|
-
const
|
|
419
|
+
const lc = this.#lc.withContext("pool", "catchup");
|
|
420
|
+
const reader = new TransactionPool(lc, { mode: READONLY });
|
|
381
421
|
reader.run(this.#db);
|
|
382
422
|
let lastWatermark;
|
|
383
423
|
try {
|
|
@@ -388,11 +428,13 @@ var Storer = class {
|
|
|
388
428
|
subs.map(({ subscriber }) => subscriber.fail(e));
|
|
389
429
|
throw e;
|
|
390
430
|
}
|
|
391
|
-
Promise.all(subs.map((sub) => this.#catchup(sub, lastWatermark, reader))).finally(() => reader.setDone());
|
|
431
|
+
Promise.all(subs.map((sub) => this.#catchup(lc.withContext("subscriber", sub.subscriber.id), sub, lastWatermark, reader))).finally(() => reader.setDone());
|
|
392
432
|
}
|
|
393
|
-
async #catchup({ subscriber: sub, mode }, lastWatermark, reader) {
|
|
433
|
+
async #catchup(lc, { subscriber: sub, mode }, lastWatermark, reader) {
|
|
394
434
|
try {
|
|
435
|
+
lc.info?.(`starting catchup`);
|
|
395
436
|
await reader.processReadTask(async (tx) => {
|
|
437
|
+
lc.info?.(`catching up`);
|
|
396
438
|
const start = Date.now();
|
|
397
439
|
let watermarkFound = sub.watermark === this.#replicaVersion;
|
|
398
440
|
let count = 0;
|
|
@@ -405,26 +447,26 @@ var Storer = class {
|
|
|
405
447
|
const start = performance.now();
|
|
406
448
|
await lastBatchConsumed;
|
|
407
449
|
const elapsed = performance.now() - start;
|
|
408
|
-
if (lastBatchConsumed)
|
|
450
|
+
if (lastBatchConsumed) lc[elapsed > 100 ? "info" : "debug"]?.(`waited ${elapsed.toFixed(3)} ms for ${sub.id} to consume last batch of catchup entries`);
|
|
409
451
|
for (const entry of entries) if (entry.watermark === sub.watermark) watermarkFound = true;
|
|
410
452
|
else if (watermarkFound) {
|
|
411
|
-
lastBatchConsumed = sub.catchup(
|
|
453
|
+
lastBatchConsumed = sub.catchup(reconstructWatermarkedChange(entry));
|
|
412
454
|
count++;
|
|
413
455
|
} else if (mode === "backup") throw new AutoResetSignal(`backup replica at watermark ${sub.watermark} is behind change db: ${entry.watermark})`);
|
|
414
456
|
else {
|
|
415
|
-
|
|
457
|
+
lc.warn?.(`rejecting subscriber at watermark ${sub.watermark} (earliest watermark: ${entry.watermark})`);
|
|
416
458
|
sub.close(2, `earliest supported watermark is ${entry.watermark} (requested ${sub.watermark})`);
|
|
417
459
|
return;
|
|
418
460
|
}
|
|
419
461
|
}
|
|
420
462
|
if (watermarkFound) {
|
|
421
463
|
await lastBatchConsumed;
|
|
422
|
-
|
|
423
|
-
} else
|
|
464
|
+
lc.info?.(`caught up ${sub.id} with ${count} changes (${Date.now() - start} ms)`);
|
|
465
|
+
} else lc.warn?.(`subscriber ${sub.id} at watermark ${sub.watermark} is ahead of the latest durable watermark ${lastWatermark}; waiting for the change DB to catch up`);
|
|
424
466
|
sub.setCaughtUp();
|
|
425
467
|
});
|
|
426
468
|
} catch (err) {
|
|
427
|
-
|
|
469
|
+
lc.error?.(`error while catching up subscriber ${sub.id}`, err);
|
|
428
470
|
if (err instanceof AutoResetSignal) {
|
|
429
471
|
await markResetRequired(this.#db, this.#shard);
|
|
430
472
|
this.#onFatal(err);
|
|
@@ -435,67 +477,54 @@ var Storer = class {
|
|
|
435
477
|
/**
|
|
436
478
|
* Returns the db statements necessary to track backfill and table metadata
|
|
437
479
|
* presented in the `change`, if any.
|
|
480
|
+
*
|
|
481
|
+
* This is the Postgres interpreter of {@link cookieOps}, which is also
|
|
482
|
+
* interpreted against the SQLite change log by `ChangeLogCookieWriter`. The
|
|
483
|
+
* two stores have to agree on every transition forever, and the failure mode
|
|
484
|
+
* if they drift is a backfill that is silently never re-requested — so the
|
|
485
|
+
* decision of what a schema change *means* lives in one place and only its
|
|
486
|
+
* transport lives here.
|
|
438
487
|
*/
|
|
439
488
|
#trackBackfillMetadata(sql, change) {
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
}
|
|
447
|
-
case "create-table": {
|
|
448
|
-
const { spec, metadata, backfill } = change;
|
|
449
|
-
if (metadata) stmts.push(this.#upsertTableMetadataStmt(sql, spec, metadata));
|
|
450
|
-
if (backfill) Object.entries(backfill).forEach(([col, backfill]) => {
|
|
451
|
-
stmts.push(this.#upsertColumnBackfillStmt(sql, spec, col, backfill));
|
|
452
|
-
});
|
|
453
|
-
break;
|
|
454
|
-
}
|
|
489
|
+
return cookieOps(change).flatMap((op) => this.#cookieStmts(sql, op));
|
|
490
|
+
}
|
|
491
|
+
#cookieStmts(sql, op) {
|
|
492
|
+
switch (op.op) {
|
|
493
|
+
case "upsert-metadata": return [this.#upsertTableMetadataStmt(sql, op.table, op.metadata)];
|
|
494
|
+
case "upsert-backfill": return [this.#upsertColumnBackfillStmt(sql, op.table, op.column, op.backfill)];
|
|
455
495
|
case "rename-table": {
|
|
456
|
-
const { old } =
|
|
496
|
+
const { old } = op;
|
|
457
497
|
const row = {
|
|
458
|
-
schema:
|
|
459
|
-
table:
|
|
498
|
+
schema: op.new.schema,
|
|
499
|
+
table: op.new.name
|
|
460
500
|
};
|
|
461
|
-
|
|
501
|
+
return [sql`UPDATE ${this.#cdc("tableMetadata")} SET ${sql(row)}
|
|
462
502
|
WHERE "schema" = ${old.schema} AND "table" = ${old.name}`, sql`UPDATE ${this.#cdc("backfilling")} SET ${sql(row)}
|
|
463
|
-
WHERE "schema" = ${old.schema} AND "table" = ${old.name}`
|
|
464
|
-
break;
|
|
503
|
+
WHERE "schema" = ${old.schema} AND "table" = ${old.name}`];
|
|
465
504
|
}
|
|
466
505
|
case "drop-table": {
|
|
467
|
-
const {
|
|
468
|
-
|
|
506
|
+
const { schema, name } = op.table;
|
|
507
|
+
return [sql`DELETE FROM ${this.#cdc("tableMetadata")}
|
|
469
508
|
WHERE "schema" = ${schema} AND "table" = ${name}`, sql`DELETE FROM ${this.#cdc("backfilling")}
|
|
470
|
-
WHERE "schema" = ${schema} AND "table" = ${name}`
|
|
471
|
-
break;
|
|
509
|
+
WHERE "schema" = ${schema} AND "table" = ${name}`];
|
|
472
510
|
}
|
|
473
|
-
case "
|
|
474
|
-
const {
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
break;
|
|
478
|
-
}
|
|
479
|
-
case "update-column": {
|
|
480
|
-
const { table: { schema, name: table }, old: { name: oldName }, new: { name: newName } } = change;
|
|
481
|
-
if (oldName !== newName) stmts.push(sql`UPDATE ${this.#cdc("backfilling")} SET "column" = ${newName}
|
|
482
|
-
WHERE "schema" = ${schema} AND "table" = ${table} AND "column" = ${oldName}`);
|
|
483
|
-
break;
|
|
511
|
+
case "rename-column": {
|
|
512
|
+
const { schema, name: table } = op.table;
|
|
513
|
+
return [sql`UPDATE ${this.#cdc("backfilling")} SET "column" = ${op.new}
|
|
514
|
+
WHERE "schema" = ${schema} AND "table" = ${table} AND "column" = ${op.old}`];
|
|
484
515
|
}
|
|
485
516
|
case "drop-column": {
|
|
486
|
-
const {
|
|
487
|
-
|
|
488
|
-
WHERE "schema" = ${schema} AND "table" = ${name} AND "column" = ${column}`
|
|
489
|
-
break;
|
|
517
|
+
const { schema, name } = op.table;
|
|
518
|
+
return [sql`DELETE FROM ${this.#cdc("backfilling")}
|
|
519
|
+
WHERE "schema" = ${schema} AND "table" = ${name} AND "column" = ${op.column}`];
|
|
490
520
|
}
|
|
491
|
-
case "backfill
|
|
492
|
-
const {
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
WHERE "schema" = ${schema} AND "table" = ${table} AND "column" IN ${sql(cols)}`);
|
|
521
|
+
case "complete-backfill": {
|
|
522
|
+
const { schema, name: table } = op.table;
|
|
523
|
+
return [sql`DELETE FROM ${this.#cdc("backfilling")}
|
|
524
|
+
WHERE "schema" = ${schema} AND "table" = ${table} AND "column" IN ${sql([...op.columns])}`];
|
|
496
525
|
}
|
|
526
|
+
default: unreachable(op);
|
|
497
527
|
}
|
|
498
|
-
return stmts;
|
|
499
528
|
}
|
|
500
529
|
#upsertTableMetadataStmt(sql, { schema, name: table }, metadata) {
|
|
501
530
|
const row = {
|
|
@@ -505,7 +534,7 @@ var Storer = class {
|
|
|
505
534
|
};
|
|
506
535
|
return sql`
|
|
507
536
|
INSERT INTO ${this.#cdc("tableMetadata")} ${sql(row)}
|
|
508
|
-
ON CONFLICT ("schema", "table")
|
|
537
|
+
ON CONFLICT ("schema", "table")
|
|
509
538
|
DO UPDATE SET ${sql(row)};
|
|
510
539
|
`;
|
|
511
540
|
}
|
|
@@ -518,7 +547,7 @@ var Storer = class {
|
|
|
518
547
|
};
|
|
519
548
|
return sql`
|
|
520
549
|
INSERT INTO ${this.#cdc("backfilling")} ${sql(row)}
|
|
521
|
-
ON CONFLICT ("schema", "table", "column")
|
|
550
|
+
ON CONFLICT ("schema", "table", "column")
|
|
522
551
|
DO UPDATE SET ${sql(row)};
|
|
523
552
|
`;
|
|
524
553
|
}
|
|
@@ -533,54 +562,20 @@ var Storer = class {
|
|
|
533
562
|
await promise;
|
|
534
563
|
}
|
|
535
564
|
}
|
|
536
|
-
|
|
565
|
+
/**
|
|
566
|
+
* Stops the storer and waits up to a drain timeout for entries to drain,
|
|
567
|
+
* throwing an exception if it doesn't drain in time, in order to abort
|
|
568
|
+
* the server when PG (or the connection to it) appears to be wedged.
|
|
569
|
+
*/
|
|
570
|
+
async stop() {
|
|
537
571
|
if (this.#running) {
|
|
538
572
|
this.#lc.info?.(`draining ${this.#queue.size()} changeLog entries`);
|
|
573
|
+
this.abort();
|
|
539
574
|
this.#queue.enqueue("stop");
|
|
540
575
|
}
|
|
541
|
-
|
|
576
|
+
if (await orTimeout(this.#stopped, this.#drainTimeoutMs) === "timed-out") throw new AbortError(`changeLog did not drain within ${this.#drainTimeoutMs}ms`);
|
|
542
577
|
}
|
|
543
578
|
};
|
|
544
|
-
/**
|
|
545
|
-
* Extracts the stringified change message from the stringified
|
|
546
|
-
* stream message (e.g. the second tuple element). This optimization
|
|
547
|
-
* facilitates stringifying (and sharing the result of) the stream
|
|
548
|
-
* message exactly once, but storing only the change message substring
|
|
549
|
-
* in the changeLog for backwards compatibility.
|
|
550
|
-
*/
|
|
551
|
-
function extractChangeSubstring(streamMessageJSON, tag) {
|
|
552
|
-
switch (tag) {
|
|
553
|
-
case "begin":
|
|
554
|
-
case "commit": return streamMessageJSON.substring(streamMessageJSON.indexOf(",") + 1, streamMessageJSON.lastIndexOf(","));
|
|
555
|
-
default: return streamMessageJSON.substring(streamMessageJSON.indexOf(",") + 1, streamMessageJSON.lastIndexOf("]"));
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
function toDownstream(entry) {
|
|
559
|
-
const { watermark, change } = entry;
|
|
560
|
-
const tag = entry.tag;
|
|
561
|
-
switch (tag) {
|
|
562
|
-
case "begin": return [
|
|
563
|
-
watermark,
|
|
564
|
-
tag,
|
|
565
|
-
`["begin",${change},{"commitWatermark":"${watermark}"}]`
|
|
566
|
-
];
|
|
567
|
-
case "commit": return [
|
|
568
|
-
watermark,
|
|
569
|
-
tag,
|
|
570
|
-
`["commit",${change},{"watermark":"${watermark}"}]`
|
|
571
|
-
];
|
|
572
|
-
case "rollback": return [
|
|
573
|
-
watermark,
|
|
574
|
-
tag,
|
|
575
|
-
`["rollback",${change}]`
|
|
576
|
-
];
|
|
577
|
-
default: return [
|
|
578
|
-
watermark,
|
|
579
|
-
tag,
|
|
580
|
-
`["data",${change}]`
|
|
581
|
-
];
|
|
582
|
-
}
|
|
583
|
-
}
|
|
584
579
|
var PurgeLock = class {
|
|
585
580
|
#lc;
|
|
586
581
|
#tx;
|