@rocicorp/zero 1.9.1-canary.1 → 1.10.0-canary.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/analyze-query/src/analyze-cli.js +2 -2
- package/out/analyze-query/src/analyze-cli.js.map +1 -1
- 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/zero/package.js +2 -2
- 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 +43 -1
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +139 -20
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/db/migration.js +1 -1
- package/out/zero-cache/src/observability/metrics.d.ts +5 -0
- package/out/zero-cache/src/observability/metrics.d.ts.map +1 -1
- package/out/zero-cache/src/observability/metrics.js +15 -1
- 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 +90 -30
- 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 +5 -15
- 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 +46 -3
- 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/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 +16 -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/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 +75 -23
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +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 +34 -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.js +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 +1 -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 +1 -12
- 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 +3 -3
- 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-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 +15 -20
- 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 +330 -63
- 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 +55 -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 +22 -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 +93 -117
- 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 +3 -2
- 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 +50 -140
- 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/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/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.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.js +44 -17
- 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 +11 -4
- package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.d.ts +1 -1
- package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.js +2 -2
- package/out/zero-cache/src/services/replicator/replicator.js.map +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 +9 -6
- 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 +9 -0
- package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.js +9 -0
- package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.js.map +1 -1
- 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/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 +48 -7
- 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 +10 -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/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 +25 -3
- 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-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-types/src/schema.d.ts +11 -0
- package/out/zero-types/src/schema.d.ts.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/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 +20 -13
- package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
- package/package.json +2 -2
- 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';
|
|
@@ -47,11 +48,29 @@ export type TuningOptions = {
|
|
|
47
48
|
export declare class Storer implements Service {
|
|
48
49
|
#private;
|
|
49
50
|
readonly id = "storer";
|
|
50
|
-
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);
|
|
51
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
|
+
*/
|
|
52
70
|
getStartStreamInitializationParameters(): Promise<{
|
|
53
71
|
lastWatermark: string;
|
|
54
72
|
backfillRequests: BackfillRequest[];
|
|
73
|
+
cookies: CookieSet;
|
|
55
74
|
}>;
|
|
56
75
|
getMinWatermarkForCatchup(): Promise<string | null>;
|
|
57
76
|
purgeRecordsBefore(watermark: string): Promise<number>;
|
|
@@ -60,7 +79,6 @@ export declare class Storer implements Service {
|
|
|
60
79
|
*/
|
|
61
80
|
store(watermark: string, data: ChangeStreamData): string;
|
|
62
81
|
abort(): void;
|
|
63
|
-
status(s: DownstreamStatusMessage): void;
|
|
64
82
|
catchup(subscriber: Subscriber, mode: ReplicatorMode): void;
|
|
65
83
|
readyForMore(): Promise<void> | undefined;
|
|
66
84
|
/**
|
|
@@ -80,14 +98,6 @@ export declare class Storer implements Service {
|
|
|
80
98
|
*/
|
|
81
99
|
stop(): Promise<void>;
|
|
82
100
|
}
|
|
83
|
-
/**
|
|
84
|
-
* Extracts the stringified change message from the stringified
|
|
85
|
-
* stream message (e.g. the second tuple element). This optimization
|
|
86
|
-
* facilitates stringifying (and sharing the result of) the stream
|
|
87
|
-
* message exactly once, but storing only the change message substring
|
|
88
|
-
* in the changeLog for backwards compatibility.
|
|
89
|
-
*/
|
|
90
|
-
export declare function extractChangeSubstring(streamMessageJSON: string, tag: Change['tag'] | undefined): string;
|
|
91
101
|
export declare class PurgeLock {
|
|
92
102
|
#private;
|
|
93
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,20 +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
17
|
import { orTimeout } from "../../types/timeout.js";
|
|
18
|
+
import { extractChangeSubstring, reconstructWatermarkedChange, serializeChangeStreamData } from "./change-log-codec.js";
|
|
18
19
|
import { resolver } from "@rocicorp/resolver";
|
|
19
20
|
import "postgres";
|
|
20
21
|
import { getHeapStatistics } from "node:v8";
|
|
@@ -59,7 +60,7 @@ var Storer = class {
|
|
|
59
60
|
#discoveryProtocol;
|
|
60
61
|
#db;
|
|
61
62
|
#replicaVersion;
|
|
62
|
-
#
|
|
63
|
+
#onCommitted;
|
|
63
64
|
#onFatal;
|
|
64
65
|
#queue = new Queue();
|
|
65
66
|
#backPressureThresholdBytes;
|
|
@@ -68,7 +69,7 @@ var Storer = class {
|
|
|
68
69
|
#drainTimeoutMs;
|
|
69
70
|
#approximateQueuedBytes = 0;
|
|
70
71
|
#running = false;
|
|
71
|
-
constructor(lc, shard, taskID, discoveryAddress, discoveryProtocol, db, replicaVersion,
|
|
72
|
+
constructor(lc, shard, taskID, discoveryAddress, discoveryProtocol, db, replicaVersion, onCommitted, onFatal, { backPressureLimitHeapProportion, statementTimeoutMs, changeLogBatchSize, drainTimeoutMs = 3e4 }) {
|
|
72
73
|
this.#lc = lc.withContext("component", "change-log");
|
|
73
74
|
this.#shard = shard;
|
|
74
75
|
this.#taskID = taskID;
|
|
@@ -76,7 +77,7 @@ var Storer = class {
|
|
|
76
77
|
this.#discoveryProtocol = discoveryProtocol;
|
|
77
78
|
this.#db = db;
|
|
78
79
|
this.#replicaVersion = replicaVersion;
|
|
79
|
-
this.#
|
|
80
|
+
this.#onCommitted = onCommitted;
|
|
80
81
|
this.#onFatal = onFatal;
|
|
81
82
|
this.#statementTimeoutMs = statementTimeoutMs;
|
|
82
83
|
this.#changeLogBatchSize = Math.max(1, changeLogBatchSize);
|
|
@@ -104,25 +105,55 @@ var Storer = class {
|
|
|
104
105
|
this.#lc.info?.(`assumed ownership at ${addressWithProtocol} (${elapsed} ms)`);
|
|
105
106
|
if (purgeLock) purgeLock.release();
|
|
106
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
|
+
*/
|
|
107
125
|
async getStartStreamInitializationParameters() {
|
|
108
|
-
const [[{ lastWatermark }], result] = await runTx(this.#db, (sql) => [
|
|
109
|
-
|
|
110
|
-
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
|
|
111
131
|
json_build_object(
|
|
112
132
|
'schema', b."schema",
|
|
113
133
|
'name', b."table",
|
|
114
134
|
'metadata', t."metadata"
|
|
115
135
|
) as "table",
|
|
116
|
-
json_object_agg(b."column", b."backfill")
|
|
136
|
+
json_object_agg(b."column", b."backfill")
|
|
117
137
|
as "columns"
|
|
118
138
|
FROM ${this.#cdc("backfilling")} as b
|
|
119
139
|
LEFT JOIN ${this.#cdc("tableMetadata")} as t
|
|
120
140
|
ON (b."schema" = t."schema" AND b."table" = t."table")
|
|
121
141
|
GROUP BY b."schema", b."table", t."metadata"
|
|
122
|
-
|
|
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 });
|
|
123
150
|
return {
|
|
124
151
|
lastWatermark,
|
|
125
|
-
backfillRequests: parse(result, backfillRequestsSchema)
|
|
152
|
+
backfillRequests: parse(result, backfillRequestsSchema),
|
|
153
|
+
cookies: {
|
|
154
|
+
tableMetadata: [...tableMetadata],
|
|
155
|
+
backfilling: [...backfilling]
|
|
156
|
+
}
|
|
126
157
|
};
|
|
127
158
|
}
|
|
128
159
|
async getMinWatermarkForCatchup() {
|
|
@@ -162,7 +193,7 @@ var Storer = class {
|
|
|
162
193
|
* @returns The JSON stringified stream message to be sent downstream.
|
|
163
194
|
*/
|
|
164
195
|
store(watermark, data) {
|
|
165
|
-
const json =
|
|
196
|
+
const json = serializeChangeStreamData(data);
|
|
166
197
|
this.#approximateQueuedBytes += json.length;
|
|
167
198
|
const change = data[1];
|
|
168
199
|
this.#queue.enqueue([
|
|
@@ -176,9 +207,6 @@ var Storer = class {
|
|
|
176
207
|
abort() {
|
|
177
208
|
this.#queue.enqueue(["abort"]);
|
|
178
209
|
}
|
|
179
|
-
status(s) {
|
|
180
|
-
this.#queue.enqueue(s);
|
|
181
|
-
}
|
|
182
210
|
catchup(subscriber, mode) {
|
|
183
211
|
this.#queue.enqueue(["subscriber", {
|
|
184
212
|
subscriber,
|
|
@@ -301,9 +329,6 @@ var Storer = class {
|
|
|
301
329
|
else await this.#startCatchup([subscriber]);
|
|
302
330
|
continue;
|
|
303
331
|
}
|
|
304
|
-
case "status":
|
|
305
|
-
this.#onConsumed(msg);
|
|
306
|
-
continue;
|
|
307
332
|
case "abort":
|
|
308
333
|
if (tx) {
|
|
309
334
|
tx.pool.abort();
|
|
@@ -370,7 +395,7 @@ var Storer = class {
|
|
|
370
395
|
tx.pool.setDone();
|
|
371
396
|
}
|
|
372
397
|
await tx.pool.done();
|
|
373
|
-
if (tx.ack) this.#
|
|
398
|
+
if (tx.ack) this.#onCommitted([
|
|
374
399
|
"commit",
|
|
375
400
|
change,
|
|
376
401
|
{ watermark }
|
|
@@ -391,7 +416,8 @@ var Storer = class {
|
|
|
391
416
|
}
|
|
392
417
|
async #startCatchup(subs) {
|
|
393
418
|
if (subs.length === 0) return;
|
|
394
|
-
const
|
|
419
|
+
const lc = this.#lc.withContext("pool", "catchup");
|
|
420
|
+
const reader = new TransactionPool(lc, { mode: READONLY });
|
|
395
421
|
reader.run(this.#db);
|
|
396
422
|
let lastWatermark;
|
|
397
423
|
try {
|
|
@@ -402,11 +428,13 @@ var Storer = class {
|
|
|
402
428
|
subs.map(({ subscriber }) => subscriber.fail(e));
|
|
403
429
|
throw e;
|
|
404
430
|
}
|
|
405
|
-
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());
|
|
406
432
|
}
|
|
407
|
-
async #catchup({ subscriber: sub, mode }, lastWatermark, reader) {
|
|
433
|
+
async #catchup(lc, { subscriber: sub, mode }, lastWatermark, reader) {
|
|
408
434
|
try {
|
|
435
|
+
lc.info?.(`starting catchup`);
|
|
409
436
|
await reader.processReadTask(async (tx) => {
|
|
437
|
+
lc.info?.(`catching up`);
|
|
410
438
|
const start = Date.now();
|
|
411
439
|
let watermarkFound = sub.watermark === this.#replicaVersion;
|
|
412
440
|
let count = 0;
|
|
@@ -419,26 +447,26 @@ var Storer = class {
|
|
|
419
447
|
const start = performance.now();
|
|
420
448
|
await lastBatchConsumed;
|
|
421
449
|
const elapsed = performance.now() - start;
|
|
422
|
-
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`);
|
|
423
451
|
for (const entry of entries) if (entry.watermark === sub.watermark) watermarkFound = true;
|
|
424
452
|
else if (watermarkFound) {
|
|
425
|
-
lastBatchConsumed = sub.catchup(
|
|
453
|
+
lastBatchConsumed = sub.catchup(reconstructWatermarkedChange(entry));
|
|
426
454
|
count++;
|
|
427
455
|
} else if (mode === "backup") throw new AutoResetSignal(`backup replica at watermark ${sub.watermark} is behind change db: ${entry.watermark})`);
|
|
428
456
|
else {
|
|
429
|
-
|
|
457
|
+
lc.warn?.(`rejecting subscriber at watermark ${sub.watermark} (earliest watermark: ${entry.watermark})`);
|
|
430
458
|
sub.close(2, `earliest supported watermark is ${entry.watermark} (requested ${sub.watermark})`);
|
|
431
459
|
return;
|
|
432
460
|
}
|
|
433
461
|
}
|
|
434
462
|
if (watermarkFound) {
|
|
435
463
|
await lastBatchConsumed;
|
|
436
|
-
|
|
437
|
-
} 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`);
|
|
438
466
|
sub.setCaughtUp();
|
|
439
467
|
});
|
|
440
468
|
} catch (err) {
|
|
441
|
-
|
|
469
|
+
lc.error?.(`error while catching up subscriber ${sub.id}`, err);
|
|
442
470
|
if (err instanceof AutoResetSignal) {
|
|
443
471
|
await markResetRequired(this.#db, this.#shard);
|
|
444
472
|
this.#onFatal(err);
|
|
@@ -449,67 +477,54 @@ var Storer = class {
|
|
|
449
477
|
/**
|
|
450
478
|
* Returns the db statements necessary to track backfill and table metadata
|
|
451
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.
|
|
452
487
|
*/
|
|
453
488
|
#trackBackfillMetadata(sql, change) {
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
}
|
|
461
|
-
case "create-table": {
|
|
462
|
-
const { spec, metadata, backfill } = change;
|
|
463
|
-
if (metadata) stmts.push(this.#upsertTableMetadataStmt(sql, spec, metadata));
|
|
464
|
-
if (backfill) Object.entries(backfill).forEach(([col, backfill]) => {
|
|
465
|
-
stmts.push(this.#upsertColumnBackfillStmt(sql, spec, col, backfill));
|
|
466
|
-
});
|
|
467
|
-
break;
|
|
468
|
-
}
|
|
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)];
|
|
469
495
|
case "rename-table": {
|
|
470
|
-
const { old } =
|
|
496
|
+
const { old } = op;
|
|
471
497
|
const row = {
|
|
472
|
-
schema:
|
|
473
|
-
table:
|
|
498
|
+
schema: op.new.schema,
|
|
499
|
+
table: op.new.name
|
|
474
500
|
};
|
|
475
|
-
|
|
501
|
+
return [sql`UPDATE ${this.#cdc("tableMetadata")} SET ${sql(row)}
|
|
476
502
|
WHERE "schema" = ${old.schema} AND "table" = ${old.name}`, sql`UPDATE ${this.#cdc("backfilling")} SET ${sql(row)}
|
|
477
|
-
WHERE "schema" = ${old.schema} AND "table" = ${old.name}`
|
|
478
|
-
break;
|
|
503
|
+
WHERE "schema" = ${old.schema} AND "table" = ${old.name}`];
|
|
479
504
|
}
|
|
480
505
|
case "drop-table": {
|
|
481
|
-
const {
|
|
482
|
-
|
|
506
|
+
const { schema, name } = op.table;
|
|
507
|
+
return [sql`DELETE FROM ${this.#cdc("tableMetadata")}
|
|
483
508
|
WHERE "schema" = ${schema} AND "table" = ${name}`, sql`DELETE FROM ${this.#cdc("backfilling")}
|
|
484
|
-
WHERE "schema" = ${schema} AND "table" = ${name}`
|
|
485
|
-
break;
|
|
486
|
-
}
|
|
487
|
-
case "add-column": {
|
|
488
|
-
const { table, tableMetadata, column, backfill } = change;
|
|
489
|
-
if (tableMetadata) stmts.push(this.#upsertTableMetadataStmt(sql, table, tableMetadata));
|
|
490
|
-
if (backfill) stmts.push(this.#upsertColumnBackfillStmt(sql, table, column.name, backfill));
|
|
491
|
-
break;
|
|
509
|
+
WHERE "schema" = ${schema} AND "table" = ${name}`];
|
|
492
510
|
}
|
|
493
|
-
case "
|
|
494
|
-
const {
|
|
495
|
-
|
|
496
|
-
WHERE "schema" = ${schema} AND "table" = ${table} AND "column" = ${
|
|
497
|
-
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}`];
|
|
498
515
|
}
|
|
499
516
|
case "drop-column": {
|
|
500
|
-
const {
|
|
501
|
-
|
|
502
|
-
WHERE "schema" = ${schema} AND "table" = ${name} AND "column" = ${column}`
|
|
503
|
-
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}`];
|
|
504
520
|
}
|
|
505
|
-
case "backfill
|
|
506
|
-
const {
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
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])}`];
|
|
510
525
|
}
|
|
526
|
+
default: unreachable(op);
|
|
511
527
|
}
|
|
512
|
-
return stmts;
|
|
513
528
|
}
|
|
514
529
|
#upsertTableMetadataStmt(sql, { schema, name: table }, metadata) {
|
|
515
530
|
const row = {
|
|
@@ -519,7 +534,7 @@ var Storer = class {
|
|
|
519
534
|
};
|
|
520
535
|
return sql`
|
|
521
536
|
INSERT INTO ${this.#cdc("tableMetadata")} ${sql(row)}
|
|
522
|
-
ON CONFLICT ("schema", "table")
|
|
537
|
+
ON CONFLICT ("schema", "table")
|
|
523
538
|
DO UPDATE SET ${sql(row)};
|
|
524
539
|
`;
|
|
525
540
|
}
|
|
@@ -532,7 +547,7 @@ var Storer = class {
|
|
|
532
547
|
};
|
|
533
548
|
return sql`
|
|
534
549
|
INSERT INTO ${this.#cdc("backfilling")} ${sql(row)}
|
|
535
|
-
ON CONFLICT ("schema", "table", "column")
|
|
550
|
+
ON CONFLICT ("schema", "table", "column")
|
|
536
551
|
DO UPDATE SET ${sql(row)};
|
|
537
552
|
`;
|
|
538
553
|
}
|
|
@@ -555,51 +570,12 @@ var Storer = class {
|
|
|
555
570
|
async stop() {
|
|
556
571
|
if (this.#running) {
|
|
557
572
|
this.#lc.info?.(`draining ${this.#queue.size()} changeLog entries`);
|
|
573
|
+
this.abort();
|
|
558
574
|
this.#queue.enqueue("stop");
|
|
559
575
|
}
|
|
560
576
|
if (await orTimeout(this.#stopped, this.#drainTimeoutMs) === "timed-out") throw new AbortError(`changeLog did not drain within ${this.#drainTimeoutMs}ms`);
|
|
561
577
|
}
|
|
562
578
|
};
|
|
563
|
-
/**
|
|
564
|
-
* Extracts the stringified change message from the stringified
|
|
565
|
-
* stream message (e.g. the second tuple element). This optimization
|
|
566
|
-
* facilitates stringifying (and sharing the result of) the stream
|
|
567
|
-
* message exactly once, but storing only the change message substring
|
|
568
|
-
* in the changeLog for backwards compatibility.
|
|
569
|
-
*/
|
|
570
|
-
function extractChangeSubstring(streamMessageJSON, tag) {
|
|
571
|
-
switch (tag) {
|
|
572
|
-
case "begin":
|
|
573
|
-
case "commit": return streamMessageJSON.substring(streamMessageJSON.indexOf(",") + 1, streamMessageJSON.lastIndexOf(","));
|
|
574
|
-
default: return streamMessageJSON.substring(streamMessageJSON.indexOf(",") + 1, streamMessageJSON.lastIndexOf("]"));
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
function toDownstream(entry) {
|
|
578
|
-
const { watermark, change } = entry;
|
|
579
|
-
const tag = entry.tag;
|
|
580
|
-
switch (tag) {
|
|
581
|
-
case "begin": return [
|
|
582
|
-
watermark,
|
|
583
|
-
tag,
|
|
584
|
-
`["begin",${change},{"commitWatermark":"${watermark}"}]`
|
|
585
|
-
];
|
|
586
|
-
case "commit": return [
|
|
587
|
-
watermark,
|
|
588
|
-
tag,
|
|
589
|
-
`["commit",${change},{"watermark":"${watermark}"}]`
|
|
590
|
-
];
|
|
591
|
-
case "rollback": return [
|
|
592
|
-
watermark,
|
|
593
|
-
tag,
|
|
594
|
-
`["rollback",${change}]`
|
|
595
|
-
];
|
|
596
|
-
default: return [
|
|
597
|
-
watermark,
|
|
598
|
-
tag,
|
|
599
|
-
`["data",${change}]`
|
|
600
|
-
];
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
579
|
var PurgeLock = class {
|
|
604
580
|
#lc;
|
|
605
581
|
#tx;
|