@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
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { isSchemaChange } from "../change-source/protocol/current/data.js";
|
|
2
|
+
import { ChangeLogCookieWriter } from "./change-log-cookies.js";
|
|
3
|
+
import { CHANGE_LOG_STREAM_TABLE, estimateChangeLogStreamRowBytes } from "./change-log-db.js";
|
|
4
|
+
import { extractChangeSubstring } from "../change-streamer/change-log-codec.js";
|
|
5
|
+
import { ChangeLogTransactionHasher } from "../change-streamer/change-log-transaction-hash.js";
|
|
6
|
+
//#region ../zero-cache/src/services/replicator/change-log-stream-writer.ts
|
|
7
|
+
var ChangeLogStreamInvariantError = class extends Error {
|
|
8
|
+
name = "ChangeLogStreamInvariantError";
|
|
9
|
+
};
|
|
10
|
+
function assertInvariant(condition, message) {
|
|
11
|
+
if (!condition) throw new ChangeLogStreamInvariantError(message);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Appends the canonical downstream stream to the change-log database, which is
|
|
15
|
+
* a separate file from the replica, and folds its schema changes into the log's
|
|
16
|
+
* cookie jar (`change-log-cookies.ts`) as it goes.
|
|
17
|
+
*
|
|
18
|
+
* This class owns the change log's transaction, and its transaction alone. It is
|
|
19
|
+
* driven from the change-streamer's stream loop, which commits it before
|
|
20
|
+
* forwarding a transaction's `commit` message; see `SQLiteChangeLogWriter` in
|
|
21
|
+
* `change-streamer/sqlite-change-log-writer.ts` for the ordering that makes a
|
|
22
|
+
* hole unreachable, and for the fail-soft policy that wraps every call here.
|
|
23
|
+
*
|
|
24
|
+
* Because the cookies are written in that same transaction, they are atomic with
|
|
25
|
+
* the head and {@link rollback} discards them with the rows they were folded
|
|
26
|
+
* from. Neither needs any handling of its own.
|
|
27
|
+
*/
|
|
28
|
+
var ChangeLogStreamWriter = class {
|
|
29
|
+
#db;
|
|
30
|
+
#insertChange;
|
|
31
|
+
#insertCommit;
|
|
32
|
+
#cookies;
|
|
33
|
+
#watermark;
|
|
34
|
+
#pos = 0;
|
|
35
|
+
#estimatedBytes = 0;
|
|
36
|
+
#hasher;
|
|
37
|
+
#cookieMutations = [];
|
|
38
|
+
constructor(db) {
|
|
39
|
+
this.#db = db;
|
|
40
|
+
this.#insertChange = db.db.prepare(`
|
|
41
|
+
INSERT INTO "${CHANGE_LOG_STREAM_TABLE}"
|
|
42
|
+
("watermark", "pos", "tag", "estimatedBytes", "change")
|
|
43
|
+
VALUES (?, ?, ?, ?, ?)
|
|
44
|
+
`);
|
|
45
|
+
this.#insertCommit = db.db.prepare(`
|
|
46
|
+
INSERT INTO "${CHANGE_LOG_STREAM_TABLE}"
|
|
47
|
+
("watermark", "pos", "tag", "estimatedBytes", "change", "precommit",
|
|
48
|
+
"writeTimeMs")
|
|
49
|
+
VALUES (?, ?, 'commit', ?, ?, ?, ?)
|
|
50
|
+
`);
|
|
51
|
+
this.#cookies = new ChangeLogCookieWriter(db.db);
|
|
52
|
+
}
|
|
53
|
+
begin(watermark, json) {
|
|
54
|
+
assertInvariant(this.#watermark === void 0, `change-log stream transaction already open at ${this.#watermark}`);
|
|
55
|
+
this.#db.beginImmediate();
|
|
56
|
+
this.#watermark = watermark;
|
|
57
|
+
this.#pos = 0;
|
|
58
|
+
const change = extractChangeSubstring(json, "begin");
|
|
59
|
+
const estimatedBytes = estimateChangeLogStreamRowBytes(watermark, "begin", change);
|
|
60
|
+
this.#insertChange.run(watermark, this.#pos, "begin", estimatedBytes, change);
|
|
61
|
+
this.#hasher = new ChangeLogTransactionHasher();
|
|
62
|
+
this.#hasher.add({
|
|
63
|
+
watermark,
|
|
64
|
+
pos: this.#pos,
|
|
65
|
+
tag: "begin",
|
|
66
|
+
change,
|
|
67
|
+
precommit: null
|
|
68
|
+
});
|
|
69
|
+
this.#estimatedBytes = estimatedBytes;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Appends one data or schema change. The parsed message is taken rather than
|
|
73
|
+
* just its tag because a schema change also mutates the cookie jar, and the
|
|
74
|
+
* caller already holds it — so the fold costs no re-parse.
|
|
75
|
+
*
|
|
76
|
+
* The cookie statements run here, i.e. inside this transaction and in stream
|
|
77
|
+
* order relative to the rows they were folded from. The Postgres change log
|
|
78
|
+
* has to flush its buffered batch to get the same ordering
|
|
79
|
+
* (`Storer.#processQueue()`); SQLite gets it from statement order.
|
|
80
|
+
*/
|
|
81
|
+
append(json, change) {
|
|
82
|
+
const watermark = this.#requireWatermark();
|
|
83
|
+
const { tag } = change;
|
|
84
|
+
const stored = extractChangeSubstring(json, tag);
|
|
85
|
+
const estimatedBytes = estimateChangeLogStreamRowBytes(watermark, tag, stored);
|
|
86
|
+
this.#insertChange.run(watermark, ++this.#pos, tag, estimatedBytes, stored);
|
|
87
|
+
this.#requireHasher().add({
|
|
88
|
+
watermark,
|
|
89
|
+
pos: this.#pos,
|
|
90
|
+
tag,
|
|
91
|
+
change: stored,
|
|
92
|
+
precommit: null
|
|
93
|
+
});
|
|
94
|
+
this.#estimatedBytes += estimatedBytes;
|
|
95
|
+
if (isSchemaChange(change)) for (const op of this.#cookies.apply(change)) this.#cookieMutations.push(op.op);
|
|
96
|
+
}
|
|
97
|
+
commit(watermark, json, writeTimeMs) {
|
|
98
|
+
const precommit = this.#requireWatermark();
|
|
99
|
+
assertInvariant(watermark === precommit, `change-log stream commit ${watermark} does not match begin ${precommit}`);
|
|
100
|
+
const change = extractChangeSubstring(json, "commit");
|
|
101
|
+
const estimatedBytes = estimateChangeLogStreamRowBytes(watermark, "commit", change, precommit, true);
|
|
102
|
+
this.#insertCommit.run(watermark, ++this.#pos, estimatedBytes, change, precommit, writeTimeMs);
|
|
103
|
+
const hasher = this.#requireHasher();
|
|
104
|
+
hasher.add({
|
|
105
|
+
watermark,
|
|
106
|
+
pos: this.#pos,
|
|
107
|
+
tag: "commit",
|
|
108
|
+
change,
|
|
109
|
+
precommit
|
|
110
|
+
});
|
|
111
|
+
const stats = {
|
|
112
|
+
rows: this.#pos + 1,
|
|
113
|
+
estimatedBytes: this.#estimatedBytes + estimatedBytes,
|
|
114
|
+
hash: hasher.digest(),
|
|
115
|
+
cookieMutations: this.#cookieMutations
|
|
116
|
+
};
|
|
117
|
+
this.#db.commit();
|
|
118
|
+
this.#reset();
|
|
119
|
+
return stats;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Discards the open transaction, if any. Safe to call when none is open — the
|
|
123
|
+
* caller rolls back on an interrupted change stream, which can arrive between
|
|
124
|
+
* transactions as well as inside one.
|
|
125
|
+
*/
|
|
126
|
+
rollback() {
|
|
127
|
+
const { inTransaction } = this.#db.db;
|
|
128
|
+
this.#reset();
|
|
129
|
+
if (inTransaction) this.#db.rollback();
|
|
130
|
+
}
|
|
131
|
+
#reset() {
|
|
132
|
+
this.#watermark = void 0;
|
|
133
|
+
this.#pos = 0;
|
|
134
|
+
this.#estimatedBytes = 0;
|
|
135
|
+
this.#hasher = void 0;
|
|
136
|
+
this.#cookieMutations = [];
|
|
137
|
+
}
|
|
138
|
+
#requireWatermark() {
|
|
139
|
+
assertInvariant(this.#watermark !== void 0, "change-log stream message received outside of a transaction");
|
|
140
|
+
return this.#watermark;
|
|
141
|
+
}
|
|
142
|
+
#requireHasher() {
|
|
143
|
+
assertInvariant(this.#hasher !== void 0, "change-log stream hash received outside of a transaction");
|
|
144
|
+
return this.#hasher;
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
//#endregion
|
|
148
|
+
export { ChangeLogStreamWriter };
|
|
149
|
+
|
|
150
|
+
//# sourceMappingURL=change-log-stream-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-log-stream-writer.js","names":["#db","#insertChange","#insertCommit","#cookies","#watermark","#pos","#hasher","#estimatedBytes","#requireWatermark","#requireHasher","#cookieMutations","#reset"],"sources":["../../../../../../zero-cache/src/services/replicator/change-log-stream-writer.ts"],"sourcesContent":["import type {Statement} from '../../../../zqlite/src/db.ts';\nimport type {StatementRunner} from '../../db/statements.ts';\nimport {\n isSchemaChange,\n type DataOrSchemaChange,\n} from '../change-source/protocol/current/data.ts';\nimport {extractChangeSubstring} from '../change-streamer/change-log-codec.ts';\nimport {ChangeLogTransactionHasher} from '../change-streamer/change-log-transaction-hash.ts';\nimport {ChangeLogCookieWriter, type CookieOpTag} from './change-log-cookies.ts';\nimport {\n CHANGE_LOG_STREAM_TABLE,\n estimateChangeLogStreamRowBytes,\n} from './change-log-db.ts';\n\nexport type ChangeLogStreamTransactionStats = {\n readonly rows: number;\n readonly estimatedBytes: number;\n readonly hash: string;\n /**\n * The cookie mutations this transaction's schema changes folded in, in stream\n * order. Empty for the overwhelming majority of transactions.\n */\n readonly cookieMutations: readonly CookieOpTag[];\n};\n\nexport class ChangeLogStreamInvariantError extends Error {\n override readonly name = 'ChangeLogStreamInvariantError';\n}\n\nfunction assertInvariant(\n condition: unknown,\n message: string,\n): asserts condition {\n if (!condition) {\n throw new ChangeLogStreamInvariantError(message);\n }\n}\n\n/**\n * Appends the canonical downstream stream to the change-log database, which is\n * a separate file from the replica, and folds its schema changes into the log's\n * cookie jar (`change-log-cookies.ts`) as it goes.\n *\n * This class owns the change log's transaction, and its transaction alone. It is\n * driven from the change-streamer's stream loop, which commits it before\n * forwarding a transaction's `commit` message; see `SQLiteChangeLogWriter` in\n * `change-streamer/sqlite-change-log-writer.ts` for the ordering that makes a\n * hole unreachable, and for the fail-soft policy that wraps every call here.\n *\n * Because the cookies are written in that same transaction, they are atomic with\n * the head and {@link rollback} discards them with the rows they were folded\n * from. Neither needs any handling of its own.\n */\nexport class ChangeLogStreamWriter {\n readonly #db: StatementRunner;\n readonly #insertChange: Statement;\n readonly #insertCommit: Statement;\n readonly #cookies: ChangeLogCookieWriter;\n\n #watermark: string | undefined;\n #pos = 0;\n #estimatedBytes = 0;\n #hasher: ChangeLogTransactionHasher | undefined;\n #cookieMutations: CookieOpTag[] = [];\n\n constructor(db: StatementRunner) {\n this.#db = db;\n this.#insertChange = db.db.prepare(/*sql*/ `\n INSERT INTO \"${CHANGE_LOG_STREAM_TABLE}\"\n (\"watermark\", \"pos\", \"tag\", \"estimatedBytes\", \"change\")\n VALUES (?, ?, ?, ?, ?)\n `);\n this.#insertCommit = db.db.prepare(/*sql*/ `\n INSERT INTO \"${CHANGE_LOG_STREAM_TABLE}\"\n (\"watermark\", \"pos\", \"tag\", \"estimatedBytes\", \"change\", \"precommit\",\n \"writeTimeMs\")\n VALUES (?, ?, 'commit', ?, ?, ?, ?)\n `);\n this.#cookies = new ChangeLogCookieWriter(db.db);\n }\n\n begin(watermark: string, json: string): void {\n assertInvariant(\n this.#watermark === undefined,\n `change-log stream transaction already open at ${this.#watermark}`,\n );\n // This process is the sole writer of the change-log database, so the write\n // lock is taken up front rather than risking a failed upgrade from a\n // deferred transaction partway through the append.\n this.#db.beginImmediate();\n this.#watermark = watermark;\n this.#pos = 0;\n const change = extractChangeSubstring(json, 'begin');\n const estimatedBytes = estimateChangeLogStreamRowBytes(\n watermark,\n 'begin',\n change,\n );\n this.#insertChange.run(\n watermark,\n this.#pos,\n 'begin',\n estimatedBytes,\n change,\n );\n this.#hasher = new ChangeLogTransactionHasher();\n this.#hasher.add({\n watermark,\n pos: this.#pos,\n tag: 'begin',\n change,\n precommit: null,\n });\n this.#estimatedBytes = estimatedBytes;\n }\n\n /**\n * Appends one data or schema change. The parsed message is taken rather than\n * just its tag because a schema change also mutates the cookie jar, and the\n * caller already holds it — so the fold costs no re-parse.\n *\n * The cookie statements run here, i.e. inside this transaction and in stream\n * order relative to the rows they were folded from. The Postgres change log\n * has to flush its buffered batch to get the same ordering\n * (`Storer.#processQueue()`); SQLite gets it from statement order.\n */\n append(json: string, change: DataOrSchemaChange): void {\n const watermark = this.#requireWatermark();\n const {tag} = change;\n const stored = extractChangeSubstring(json, tag);\n const estimatedBytes = estimateChangeLogStreamRowBytes(\n watermark,\n tag,\n stored,\n );\n this.#insertChange.run(watermark, ++this.#pos, tag, estimatedBytes, stored);\n this.#requireHasher().add({\n watermark,\n pos: this.#pos,\n tag,\n change: stored,\n precommit: null,\n });\n this.#estimatedBytes += estimatedBytes;\n\n if (isSchemaChange(change)) {\n for (const op of this.#cookies.apply(change)) {\n this.#cookieMutations.push(op.op);\n }\n }\n }\n\n commit(\n watermark: string,\n json: string,\n writeTimeMs: number,\n ): ChangeLogStreamTransactionStats {\n const precommit = this.#requireWatermark();\n assertInvariant(\n watermark === precommit,\n `change-log stream commit ${watermark} does not match begin ${precommit}`,\n );\n const change = extractChangeSubstring(json, 'commit');\n const estimatedBytes = estimateChangeLogStreamRowBytes(\n watermark,\n 'commit',\n change,\n precommit,\n true,\n );\n this.#insertCommit.run(\n watermark,\n ++this.#pos,\n estimatedBytes,\n change,\n precommit,\n writeTimeMs,\n );\n const hasher = this.#requireHasher();\n hasher.add({\n watermark,\n pos: this.#pos,\n tag: 'commit',\n change,\n precommit,\n });\n const stats = {\n rows: this.#pos + 1,\n estimatedBytes: this.#estimatedBytes + estimatedBytes,\n hash: hasher.digest(),\n cookieMutations: this.#cookieMutations,\n };\n // The log is durable at `watermark` from here on, and nothing that can\n // advance the watermark the stream would resume from has run yet. A crash in\n // that window leaves a transaction the resumed stream re-delivers, which\n // reconciliation truncates.\n this.#db.commit();\n this.#reset();\n return stats;\n }\n\n /**\n * Discards the open transaction, if any. Safe to call when none is open — the\n * caller rolls back on an interrupted change stream, which can arrive between\n * transactions as well as inside one.\n */\n rollback(): void {\n const {inTransaction} = this.#db.db;\n this.#reset();\n if (inTransaction) {\n this.#db.rollback();\n }\n }\n\n #reset(): void {\n this.#watermark = undefined;\n this.#pos = 0;\n this.#estimatedBytes = 0;\n this.#hasher = undefined;\n // A fresh array rather than a truncation: the committed stats hold a\n // reference to the previous one.\n this.#cookieMutations = [];\n }\n\n #requireWatermark(): string {\n assertInvariant(\n this.#watermark !== undefined,\n 'change-log stream message received outside of a transaction',\n );\n return this.#watermark;\n }\n\n #requireHasher(): ChangeLogTransactionHasher {\n assertInvariant(\n this.#hasher !== undefined,\n 'change-log stream hash received outside of a transaction',\n );\n return this.#hasher;\n }\n}\n"],"mappings":";;;;;;AAyBA,IAAa,gCAAb,cAAmD,MAAM;CACvD,OAAyB;AAC3B;AAEA,SAAS,gBACP,WACA,SACmB;CACnB,IAAI,CAAC,WACH,MAAM,IAAI,8BAA8B,OAAO;AAEnD;;;;;;;;;;;;;;;;AAiBA,IAAa,wBAAb,MAAmC;CACjC;CACA;CACA;CACA;CAEA;CACA,OAAO;CACP,kBAAkB;CAClB;CACA,mBAAkC,CAAC;CAEnC,YAAY,IAAqB;EAC/B,KAAKA,MAAM;EACX,KAAKC,gBAAgB,GAAG,GAAG,QAAgB;qBAC1B,wBAAwB;;;KAGxC;EACD,KAAKC,gBAAgB,GAAG,GAAG,QAAgB;qBAC1B,wBAAwB;;;;KAIxC;EACD,KAAKC,WAAW,IAAI,sBAAsB,GAAG,EAAE;CACjD;CAEA,MAAM,WAAmB,MAAoB;EAC3C,gBACE,KAAKC,eAAe,KAAA,GACpB,iDAAiD,KAAKA,YACxD;EAIA,KAAKJ,IAAI,eAAe;EACxB,KAAKI,aAAa;EAClB,KAAKC,OAAO;EACZ,MAAM,SAAS,uBAAuB,MAAM,OAAO;EACnD,MAAM,iBAAiB,gCACrB,WACA,SACA,MACF;EACA,KAAKJ,cAAc,IACjB,WACA,KAAKI,MACL,SACA,gBACA,MACF;EACA,KAAKC,UAAU,IAAI,2BAA2B;EAC9C,KAAKA,QAAQ,IAAI;GACf;GACA,KAAK,KAAKD;GACV,KAAK;GACL;GACA,WAAW;EACb,CAAC;EACD,KAAKE,kBAAkB;CACzB;;;;;;;;;;;CAYA,OAAO,MAAc,QAAkC;EACrD,MAAM,YAAY,KAAKC,kBAAkB;EACzC,MAAM,EAAC,QAAO;EACd,MAAM,SAAS,uBAAuB,MAAM,GAAG;EAC/C,MAAM,iBAAiB,gCACrB,WACA,KACA,MACF;EACA,KAAKP,cAAc,IAAI,WAAW,EAAE,KAAKI,MAAM,KAAK,gBAAgB,MAAM;EAC1E,KAAKI,eAAe,EAAE,IAAI;GACxB;GACA,KAAK,KAAKJ;GACV;GACA,QAAQ;GACR,WAAW;EACb,CAAC;EACD,KAAKE,mBAAmB;EAExB,IAAI,eAAe,MAAM,GACvB,KAAK,MAAM,MAAM,KAAKJ,SAAS,MAAM,MAAM,GACzC,KAAKO,iBAAiB,KAAK,GAAG,EAAE;CAGtC;CAEA,OACE,WACA,MACA,aACiC;EACjC,MAAM,YAAY,KAAKF,kBAAkB;EACzC,gBACE,cAAc,WACd,4BAA4B,UAAU,wBAAwB,WAChE;EACA,MAAM,SAAS,uBAAuB,MAAM,QAAQ;EACpD,MAAM,iBAAiB,gCACrB,WACA,UACA,QACA,WACA,IACF;EACA,KAAKN,cAAc,IACjB,WACA,EAAE,KAAKG,MACP,gBACA,QACA,WACA,WACF;EACA,MAAM,SAAS,KAAKI,eAAe;EACnC,OAAO,IAAI;GACT;GACA,KAAK,KAAKJ;GACV,KAAK;GACL;GACA;EACF,CAAC;EACD,MAAM,QAAQ;GACZ,MAAM,KAAKA,OAAO;GAClB,gBAAgB,KAAKE,kBAAkB;GACvC,MAAM,OAAO,OAAO;GACpB,iBAAiB,KAAKG;EACxB;EAKA,KAAKV,IAAI,OAAO;EAChB,KAAKW,OAAO;EACZ,OAAO;CACT;;;;;;CAOA,WAAiB;EACf,MAAM,EAAC,kBAAiB,KAAKX,IAAI;EACjC,KAAKW,OAAO;EACZ,IAAI,eACF,KAAKX,IAAI,SAAS;CAEtB;CAEA,SAAe;EACb,KAAKI,aAAa,KAAA;EAClB,KAAKC,OAAO;EACZ,KAAKE,kBAAkB;EACvB,KAAKD,UAAU,KAAA;EAGf,KAAKI,mBAAmB,CAAC;CAC3B;CAEA,oBAA4B;EAC1B,gBACE,KAAKN,eAAe,KAAA,GACpB,6DACF;EACA,OAAO,KAAKA;CACd;CAEA,iBAA6C;EAC3C,gBACE,KAAKE,YAAY,KAAA,GACjB,0DACF;EACA,OAAO,KAAKA;CACd;AACF"}
|
|
@@ -9,6 +9,12 @@ export type CommitResult = {
|
|
|
9
9
|
completedBackfill: DownloadStatus | undefined;
|
|
10
10
|
schemaUpdated: boolean;
|
|
11
11
|
changeLogUpdated: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Millisecond epoch at which the transaction committed upstream, if the
|
|
14
|
+
* ChangeSource reported one. Propagated to ViewSyncers as the origin
|
|
15
|
+
* timestamp of the end-to-end serving lag measurement.
|
|
16
|
+
*/
|
|
17
|
+
upstreamCommitTimeMs?: number | undefined;
|
|
12
18
|
};
|
|
13
19
|
/**
|
|
14
20
|
* The ChangeProcessor partitions the stream of messages into transactions
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-processor.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/replicator/change-processor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"change-processor.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/replicator/change-processor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAOjD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,uCAAuC,CAAC;AAoB1E,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,wBAAwB,CAAC;AAiC5D,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,iDAAiD,CAAC;AACtF,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,iBAAiB,CAAC;AAUpD,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,cAAc,CAAC;AASlE,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,cAAc,GAAG,SAAS,CAAC;IAC9C,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,qBAAa,eAAe;;gBAkBxB,EAAE,EAAE,eAAe,EACnB,IAAI,EAAE,mBAAmB,EACzB,WAAW,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI;IAmCrD,KAAK,CAAC,EAAE,EAAE,UAAU;IAIpB,8CAA8C;IAC9C,cAAc,CACZ,EAAE,EAAE,UAAU,EACd,UAAU,EAAE,gBAAgB,GAC3B,YAAY,GAAG,IAAI;CA2JvB"}
|
|
@@ -6,16 +6,20 @@ import { stringify } from "../../../../shared/src/bigint-json.js";
|
|
|
6
6
|
import { ZERO_VERSION_COLUMN_NAME } from "./schema/constants.js";
|
|
7
7
|
import { liteRow } from "../../types/lite.js";
|
|
8
8
|
import { liteTableName } from "../../types/names.js";
|
|
9
|
-
import { mapPostgresToLite, mapPostgresToLiteColumn, mapPostgresToLiteIndex } from "../../db/pg-to-lite.js";
|
|
9
|
+
import { isArrayColumn, isEnumColumn, mapPostgresToLite, mapPostgresToLiteColumn, mapPostgresToLiteIndex } from "../../db/pg-to-lite.js";
|
|
10
10
|
import { ColumnMetadataStore } from "./schema/column-metadata.js";
|
|
11
11
|
import { TableMetadataTracker } from "./schema/table-metadata.js";
|
|
12
12
|
import { computeZqlSpecs, listIndexes, listTables } from "../../db/lite-tables.js";
|
|
13
|
+
import { BackfillingTracker } from "./schema/backfilling.js";
|
|
13
14
|
import { ChangeLog } from "./schema/change-log.js";
|
|
14
15
|
import { updateReplicationWatermark } from "./schema/replication-state.js";
|
|
15
16
|
import { id } from "../../types/sql.js";
|
|
16
17
|
import { createLiteIndexStatement, createLiteTableStatement, liteColumnDef } from "../../db/create.js";
|
|
17
18
|
import { SqliteError } from "@rocicorp/zero-sqlite3";
|
|
19
|
+
import { constants } from "node:buffer";
|
|
18
20
|
//#region ../zero-cache/src/services/replicator/change-processor.ts
|
|
21
|
+
var BIND_VALUE_TOO_BIG_ERROR = "The bound string, buffer, or bigint is too big";
|
|
22
|
+
var MAX_SQLITE_BIND_BYTES = Math.min(constants.MAX_LENGTH, constants.MAX_STRING_LENGTH);
|
|
19
23
|
/**
|
|
20
24
|
* The ChangeProcessor partitions the stream of messages into transactions
|
|
21
25
|
* by creating a {@link TransactionProcessor} when a transaction begins, and dispatching
|
|
@@ -31,6 +35,7 @@ var ChangeProcessor = class {
|
|
|
31
35
|
#db;
|
|
32
36
|
#changeLog;
|
|
33
37
|
#tableMetadata;
|
|
38
|
+
#backfilling;
|
|
34
39
|
#mode;
|
|
35
40
|
#failService;
|
|
36
41
|
#tableSpecs = /* @__PURE__ */ new Map();
|
|
@@ -40,16 +45,16 @@ var ChangeProcessor = class {
|
|
|
40
45
|
this.#db = db;
|
|
41
46
|
this.#changeLog = new ChangeLog(db.db);
|
|
42
47
|
this.#tableMetadata = new TableMetadataTracker(db.db);
|
|
48
|
+
this.#backfilling = new BackfillingTracker(db.db);
|
|
43
49
|
this.#mode = mode;
|
|
44
50
|
this.#failService = failService;
|
|
45
51
|
}
|
|
46
52
|
#fail(lc, err) {
|
|
47
53
|
if (!this.#failure) {
|
|
48
54
|
let failureError = err;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const combinedError = /* @__PURE__ */ new Error(`Message processing failed and rollback also failed: operation error = ${String(err)}; rollback error = ${String(rollbackError)}`);
|
|
55
|
+
const rollbackErrors = [attempt(() => this.#currentTx?.abort(lc))].filter((e) => e !== void 0);
|
|
56
|
+
if (rollbackErrors.length) {
|
|
57
|
+
const combinedError = /* @__PURE__ */ new Error(`Message processing failed and rollback also failed: operation error = ${String(err)}; rollback error = ${rollbackErrors.map(String).join("; ")}`);
|
|
53
58
|
combinedError.cause = err;
|
|
54
59
|
failureError = combinedError;
|
|
55
60
|
}
|
|
@@ -81,7 +86,7 @@ var ChangeProcessor = class {
|
|
|
81
86
|
#beginTransaction(lc, commitVersion, jsonFormat) {
|
|
82
87
|
const start = Date.now();
|
|
83
88
|
for (let i = 0;; i++) try {
|
|
84
|
-
return new TransactionProcessor(lc, this.#db, this.#mode, this.#changeLog, this.#tableMetadata, this.#tableSpecs, commitVersion, jsonFormat);
|
|
89
|
+
return new TransactionProcessor(lc, this.#db, this.#mode, this.#changeLog, this.#tableMetadata, this.#backfilling, this.#tableSpecs, commitVersion, jsonFormat);
|
|
85
90
|
} catch (e) {
|
|
86
91
|
if (e instanceof SqliteError && e.code === "SQLITE_BUSY") {
|
|
87
92
|
lc.warn?.(`SQLITE_BUSY for ${Date.now() - start} ms (attempt ${i + 1}). This is only expected if litestream is performing a large checkpoint.`, e);
|
|
@@ -100,12 +105,13 @@ var ChangeProcessor = class {
|
|
|
100
105
|
const tx = this.#currentTx;
|
|
101
106
|
if (!tx) throw new Error(`Received message outside of transaction: ${stringify(msg)}`);
|
|
102
107
|
if (msg.tag === "commit") {
|
|
103
|
-
this.#currentTx = null;
|
|
104
108
|
assert(watermark, "watermark is required for commit messages");
|
|
105
|
-
|
|
109
|
+
const result = tx.processCommit(msg, watermark);
|
|
110
|
+
this.#currentTx = null;
|
|
111
|
+
return result;
|
|
106
112
|
}
|
|
107
113
|
if (msg.tag === "rollback") {
|
|
108
|
-
|
|
114
|
+
tx.abort(lc);
|
|
109
115
|
this.#currentTx = null;
|
|
110
116
|
return null;
|
|
111
117
|
}
|
|
@@ -189,19 +195,20 @@ var TransactionProcessor = class {
|
|
|
189
195
|
#version;
|
|
190
196
|
#changeLog;
|
|
191
197
|
#tableMetadata;
|
|
198
|
+
#backfilling;
|
|
192
199
|
#tableSpecs;
|
|
193
200
|
#jsonFormat;
|
|
194
201
|
#columnMetadata;
|
|
195
202
|
#pos = 0;
|
|
196
203
|
#schemaChanged = false;
|
|
197
204
|
#numChangeLogEntries = 0;
|
|
198
|
-
constructor(lc, db, mode, changeLog, tableMetadata, tableSpecs, commitVersion, jsonFormat) {
|
|
205
|
+
constructor(lc, db, mode, changeLog, tableMetadata, backfilling, tableSpecs, commitVersion, jsonFormat) {
|
|
199
206
|
this.#startMs = Date.now();
|
|
200
207
|
this.#mode = mode;
|
|
201
208
|
this.#jsonFormat = jsonFormat;
|
|
202
209
|
switch (mode) {
|
|
203
210
|
case "serving":
|
|
204
|
-
db.
|
|
211
|
+
db.beginImmediate();
|
|
205
212
|
break;
|
|
206
213
|
case "backup":
|
|
207
214
|
db.beginImmediate();
|
|
@@ -214,6 +221,7 @@ var TransactionProcessor = class {
|
|
|
214
221
|
this.#lc = lc.withContext("version", commitVersion);
|
|
215
222
|
this.#changeLog = changeLog;
|
|
216
223
|
this.#tableMetadata = tableMetadata;
|
|
224
|
+
this.#backfilling = backfilling;
|
|
217
225
|
this.#tableSpecs = tableSpecs;
|
|
218
226
|
this.#columnMetadata = must(ColumnMetadataStore.getInstance(db.db));
|
|
219
227
|
if (this.#tableSpecs.size === 0) this.#reloadTableSpecs();
|
|
@@ -274,12 +282,21 @@ var TransactionProcessor = class {
|
|
|
274
282
|
const currKey = oldKey ?? newKey;
|
|
275
283
|
const conds = Object.keys(currKey).map((col) => `${id(col)}=?`);
|
|
276
284
|
const setExprs = Object.keys(row).map((col) => `${id(col)}=?`);
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
285
|
+
try {
|
|
286
|
+
const { changes } = this.#db.run(`
|
|
287
|
+
UPDATE ${id(table)}
|
|
288
|
+
SET ${setExprs.join(",")}
|
|
289
|
+
WHERE ${conds.join(" AND ")}
|
|
290
|
+
`, [...Object.values(row), ...Object.values(currKey)]);
|
|
291
|
+
if (changes === 0) this.#upsert(table, row);
|
|
292
|
+
} catch (e) {
|
|
293
|
+
if (!(e instanceof RangeError) || e.message !== BIND_VALUE_TOO_BIG_ERROR) throw e;
|
|
294
|
+
const binding = [...Object.entries(row), ...Object.entries(currKey)].map(([column, value]) => [column, oversizedValueDescription(value)]).find(([, description]) => description);
|
|
295
|
+
const relationOid = "relationOid" in update.relation && typeof update.relation.relationOid === "number" ? ` relationOid=${update.relation.relationOid}` : "";
|
|
296
|
+
const error = new Error(`Oversized SQLite update binding: tx=${this.#version}${relationOid} table=${update.relation.schema}.${update.relation.name} column=${binding?.[0] ?? "unknown"}${binding?.[1] ? ` ${binding[1]}` : ""}`, { cause: e });
|
|
297
|
+
error.name = "OversizedUpdateBindingError";
|
|
298
|
+
throw error;
|
|
299
|
+
}
|
|
283
300
|
}
|
|
284
301
|
processDelete(del) {
|
|
285
302
|
const table = liteTableName(del.relation);
|
|
@@ -301,6 +318,7 @@ var TransactionProcessor = class {
|
|
|
301
318
|
}
|
|
302
319
|
processCreateTable(create) {
|
|
303
320
|
if (create.metadata) this.#tableMetadata.setUpstreamMetadata(create.spec, create.metadata);
|
|
321
|
+
this.#backfilling.apply(create);
|
|
304
322
|
const table = mapPostgresToLite(create.spec);
|
|
305
323
|
this.#db.db.exec(createLiteTableStatement(table));
|
|
306
324
|
for (const [colName, colSpec] of Object.entries(create.spec.columns)) this.#columnMetadata.insert(table.name, colName, colSpec, create.backfill?.[colName]);
|
|
@@ -310,9 +328,11 @@ var TransactionProcessor = class {
|
|
|
310
328
|
}
|
|
311
329
|
processTableMetadata(msg) {
|
|
312
330
|
this.#tableMetadata.setUpstreamMetadata(msg.table, msg.new);
|
|
331
|
+
this.#backfilling.apply(msg);
|
|
313
332
|
}
|
|
314
333
|
processRenameTable(rename) {
|
|
315
334
|
this.#tableMetadata.rename(rename.old, rename.new);
|
|
335
|
+
this.#backfilling.apply(rename);
|
|
316
336
|
const oldName = liteTableName(rename.old);
|
|
317
337
|
const newName = liteTableName(rename.new);
|
|
318
338
|
this.#db.db.exec(`ALTER TABLE ${id(oldName)} RENAME TO ${id(newName)}`);
|
|
@@ -323,6 +343,7 @@ var TransactionProcessor = class {
|
|
|
323
343
|
}
|
|
324
344
|
processAddColumn(msg) {
|
|
325
345
|
if (msg.tableMetadata) this.#tableMetadata.setUpstreamMetadata(msg.table, msg.tableMetadata);
|
|
346
|
+
this.#backfilling.apply(msg);
|
|
326
347
|
const table = liteTableName(msg.table);
|
|
327
348
|
const { name } = msg.column;
|
|
328
349
|
const spec = mapPostgresToLiteColumn(table, msg.column);
|
|
@@ -333,22 +354,24 @@ var TransactionProcessor = class {
|
|
|
333
354
|
this.#lc.info?.(msg.tag, table, msg.column);
|
|
334
355
|
}
|
|
335
356
|
processUpdateColumn(msg) {
|
|
357
|
+
this.#backfilling.apply(msg);
|
|
336
358
|
const table = liteTableName(msg.table);
|
|
337
359
|
let oldName = msg.old.name;
|
|
338
360
|
const newName = msg.new.name;
|
|
339
|
-
const
|
|
340
|
-
|
|
341
|
-
if (oldName === newName && oldSpec.dataType === newSpec.dataType) {
|
|
361
|
+
const storageTypesDiffer = differentStorageTypes(msg.old.spec, msg.new.spec);
|
|
362
|
+
if (oldName === newName && !storageTypesDiffer) {
|
|
342
363
|
this.#columnMetadata.update(table, msg.old.name, msg.new.name, msg.new.spec);
|
|
343
|
-
|
|
364
|
+
if (Boolean(msg.old.spec.notNull) !== Boolean(msg.new.spec.notNull)) this.#bumpVersions(msg.table);
|
|
365
|
+
this.#lc.info?.(msg.tag, "updated metadata only", msg.old, msg.new);
|
|
344
366
|
return;
|
|
345
367
|
}
|
|
346
|
-
if (
|
|
368
|
+
if (storageTypesDiffer) {
|
|
369
|
+
const newLiteSpec = mapPostgresToLiteColumn(table, msg.new, "ignore-default");
|
|
347
370
|
const tableSpec = must(listTables(this.#db.db, false, false).find((tableSpec) => tableSpec.name === table));
|
|
348
371
|
const indexes = listIndexes(this.#db.db).filter((idx) => idx.tableName === table);
|
|
349
372
|
const tmpTable = `tmp.${table}`;
|
|
350
373
|
const newColumns = mapEntries(tableSpec.columns, (column, spec) => [column === oldName ? newName : column, column === oldName ? {
|
|
351
|
-
...
|
|
374
|
+
...newLiteSpec,
|
|
352
375
|
pos: spec.pos
|
|
353
376
|
} : spec]);
|
|
354
377
|
const sourceColumns = Object.keys(tableSpec.columns);
|
|
@@ -381,11 +404,13 @@ var TransactionProcessor = class {
|
|
|
381
404
|
const { column } = msg;
|
|
382
405
|
this.#db.db.exec(`ALTER TABLE ${id(table)} DROP ${id(column)}`);
|
|
383
406
|
this.#columnMetadata.deleteColumn(table, column);
|
|
407
|
+
this.#backfilling.apply(msg);
|
|
384
408
|
this.#bumpVersions(msg.table);
|
|
385
409
|
this.#lc.info?.(msg.tag, table, column);
|
|
386
410
|
}
|
|
387
411
|
processDropTable(drop) {
|
|
388
412
|
this.#tableMetadata.drop(drop.id);
|
|
413
|
+
this.#backfilling.apply(drop);
|
|
389
414
|
const name = liteTableName(drop.id);
|
|
390
415
|
this.#db.db.exec(`DROP TABLE IF EXISTS ${id(name)}`);
|
|
391
416
|
this.#columnMetadata.deleteTable(name);
|
|
@@ -472,11 +497,13 @@ var TransactionProcessor = class {
|
|
|
472
497
|
this.#lc.debug?.(`backfilled ${backfilled} rows (skipped ${skipped}) into ${tableName}`);
|
|
473
498
|
}
|
|
474
499
|
#completedBackfill;
|
|
475
|
-
processBackfillCompleted(
|
|
500
|
+
processBackfillCompleted(msg) {
|
|
501
|
+
const { relation, columns, status } = msg;
|
|
476
502
|
const tableName = liteTableName(relation);
|
|
477
503
|
const cols = [...relation.rowKey.columns, ...columns];
|
|
478
504
|
const columnMetadata = must(ColumnMetadataStore.getInstance(this.#db.db));
|
|
479
505
|
for (const col of cols) columnMetadata.clearBackfilling(tableName, col);
|
|
506
|
+
this.#backfilling.apply(msg);
|
|
480
507
|
this.#bumpVersions(relation);
|
|
481
508
|
if (status) this.#completedBackfill = {
|
|
482
509
|
table: tableName,
|
|
@@ -500,7 +527,8 @@ var TransactionProcessor = class {
|
|
|
500
527
|
watermark,
|
|
501
528
|
completedBackfill: this.#completedBackfill,
|
|
502
529
|
schemaUpdated: this.#schemaChanged,
|
|
503
|
-
changeLogUpdated: this.#numChangeLogEntries > 0
|
|
530
|
+
changeLogUpdated: this.#numChangeLogEntries > 0,
|
|
531
|
+
upstreamCommitTimeMs: commit.commitTimeMs
|
|
504
532
|
};
|
|
505
533
|
}
|
|
506
534
|
abort(lc) {
|
|
@@ -508,10 +536,27 @@ var TransactionProcessor = class {
|
|
|
508
536
|
this.#db.rollback();
|
|
509
537
|
}
|
|
510
538
|
};
|
|
539
|
+
function differentStorageTypes(oldSpec, newSpec) {
|
|
540
|
+
return oldSpec.dataType !== newSpec.dataType || isEnumColumn(oldSpec) !== isEnumColumn(newSpec) || isArrayColumn(oldSpec) !== isArrayColumn(newSpec);
|
|
541
|
+
}
|
|
511
542
|
function getBackfilledColumns(row, { backfilling }) {
|
|
512
543
|
if (!backfilling?.length) return;
|
|
513
544
|
return backfilling.filter((col) => col in row);
|
|
514
545
|
}
|
|
546
|
+
function oversizedValueDescription(value) {
|
|
547
|
+
if (typeof value === "bigint") return BigInt.asIntN(64, value) !== value ? "valueType=bigint fitsInt64=false" : void 0;
|
|
548
|
+
const sizeBytes = typeof value === "string" ? Buffer.byteLength(value) : value instanceof Uint8Array ? value.byteLength : void 0;
|
|
549
|
+
if (sizeBytes !== void 0 && sizeBytes > MAX_SQLITE_BIND_BYTES) return `valueType=${typeof value === "string" ? "string" : "buffer"} sizeBytes=${sizeBytes} limitBytes=${MAX_SQLITE_BIND_BYTES}`;
|
|
550
|
+
}
|
|
551
|
+
/** Runs `fn`, returning its error rather than throwing it. */
|
|
552
|
+
function attempt(fn) {
|
|
553
|
+
try {
|
|
554
|
+
fn();
|
|
555
|
+
return;
|
|
556
|
+
} catch (e) {
|
|
557
|
+
return e ?? /* @__PURE__ */ new Error("rollback failed");
|
|
558
|
+
}
|
|
559
|
+
}
|
|
515
560
|
function ensureError(err) {
|
|
516
561
|
if (err instanceof Error) return err;
|
|
517
562
|
const error = /* @__PURE__ */ new Error();
|