@rocicorp/zero 0.2.2024101101 → 0.3.2024102500
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/react.js +91 -39
- package/out/react.js.map +2 -2
- package/out/replicache/src/async-iterable-to-array.js +8 -0
- package/out/replicache/src/async-iterable-to-array.js.map +1 -0
- package/out/replicache/src/bg-interval.js +38 -0
- package/out/replicache/src/bg-interval.js.map +1 -0
- package/out/replicache/src/binary-search.js +31 -0
- package/out/replicache/src/binary-search.js.map +1 -0
- package/out/replicache/src/broadcast-channel.js +29 -0
- package/out/replicache/src/broadcast-channel.js.map +1 -0
- package/out/replicache/src/btree/diff.js +6 -0
- package/out/replicache/src/btree/diff.js.map +1 -0
- package/out/replicache/src/btree/node.js +392 -0
- package/out/replicache/src/btree/node.js.map +1 -0
- package/out/replicache/src/btree/read.js +227 -0
- package/out/replicache/src/btree/read.js.map +1 -0
- package/out/replicache/src/btree/splice.js +79 -0
- package/out/replicache/src/btree/splice.js.map +1 -0
- package/out/replicache/src/btree/write.js +154 -0
- package/out/replicache/src/btree/write.js.map +1 -0
- package/out/replicache/src/call-default-fetch.js +37 -0
- package/out/replicache/src/call-default-fetch.js.map +1 -0
- package/out/replicache/src/config.js +13 -0
- package/out/replicache/src/config.js.map +1 -0
- package/out/replicache/src/connection-loop-delegates.js +30 -0
- package/out/replicache/src/connection-loop-delegates.js.map +1 -0
- package/out/replicache/src/connection-loop.js +268 -0
- package/out/replicache/src/connection-loop.js.map +1 -0
- package/out/replicache/src/cookies.js +41 -0
- package/out/replicache/src/cookies.js.map +1 -0
- package/out/replicache/src/dag/chunk.js +60 -0
- package/out/replicache/src/dag/chunk.js.map +1 -0
- package/out/replicache/src/dag/gc.js +126 -0
- package/out/replicache/src/dag/gc.js.map +1 -0
- package/out/replicache/src/dag/key-type-enum.js +6 -0
- package/out/replicache/src/dag/key-type-enum.js.map +1 -0
- package/out/replicache/src/dag/key.js +54 -0
- package/out/replicache/src/dag/key.js.map +1 -0
- package/out/replicache/src/dag/lazy-store.js +532 -0
- package/out/replicache/src/dag/lazy-store.js.map +1 -0
- package/out/replicache/src/dag/store-impl.js +175 -0
- package/out/replicache/src/dag/store-impl.js.map +1 -0
- package/out/replicache/src/dag/store.js +22 -0
- package/out/replicache/src/dag/store.js.map +1 -0
- package/out/replicache/src/dag/visitor.js +22 -0
- package/out/replicache/src/dag/visitor.js.map +1 -0
- package/out/replicache/src/db/commit.js +443 -0
- package/out/replicache/src/db/commit.js.map +1 -0
- package/out/replicache/src/db/index-operation-enum.js +4 -0
- package/out/replicache/src/db/index-operation-enum.js.map +1 -0
- package/out/replicache/src/db/index.js +170 -0
- package/out/replicache/src/db/index.js.map +1 -0
- package/out/replicache/src/db/meta-type-enum.js +7 -0
- package/out/replicache/src/db/meta-type-enum.js.map +1 -0
- package/out/replicache/src/db/read.js +59 -0
- package/out/replicache/src/db/read.js.map +1 -0
- package/out/replicache/src/db/rebase.js +56 -0
- package/out/replicache/src/db/rebase.js.map +1 -0
- package/out/replicache/src/db/scan.js +2 -0
- package/out/replicache/src/db/scan.js.map +1 -0
- package/out/replicache/src/db/write.js +260 -0
- package/out/replicache/src/db/write.js.map +1 -0
- package/out/replicache/src/error-responses.js +30 -0
- package/out/replicache/src/error-responses.js.map +1 -0
- package/out/replicache/src/filter-async-iterable.js +15 -0
- package/out/replicache/src/filter-async-iterable.js.map +1 -0
- package/out/replicache/src/format-version-enum.js +9 -0
- package/out/replicache/src/format-version-enum.js.map +1 -0
- package/out/replicache/src/format-version.js +8 -0
- package/out/replicache/src/format-version.js.map +1 -0
- package/out/replicache/src/frozen-json.js +151 -0
- package/out/replicache/src/frozen-json.js.map +1 -0
- package/out/replicache/src/get-default-puller.js +74 -0
- package/out/replicache/src/get-default-puller.js.map +1 -0
- package/out/replicache/src/get-default-pusher.js +36 -0
- package/out/replicache/src/get-default-pusher.js.map +1 -0
- package/out/replicache/src/hash.js +73 -0
- package/out/replicache/src/hash.js.map +1 -0
- package/out/replicache/src/http-request-info.js +7 -0
- package/out/replicache/src/http-request-info.js.map +1 -0
- package/out/replicache/src/impl.js +2 -0
- package/out/replicache/src/impl.js.map +1 -0
- package/out/replicache/src/index-defs.js +28 -0
- package/out/replicache/src/index-defs.js.map +1 -0
- package/out/replicache/src/invoke-kind-enum.js +4 -0
- package/out/replicache/src/invoke-kind-enum.js.map +1 -0
- package/out/replicache/src/iterable-union.js +5 -0
- package/out/replicache/src/iterable-union.js.map +1 -0
- package/out/replicache/src/kv/idb-store-with-mem-fallback.js +93 -0
- package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +1 -0
- package/out/replicache/src/kv/idb-store.js +179 -0
- package/out/replicache/src/kv/idb-store.js.map +1 -0
- package/out/replicache/src/kv/mem-store.js +61 -0
- package/out/replicache/src/kv/mem-store.js.map +1 -0
- package/out/replicache/src/kv/read-impl.js +23 -0
- package/out/replicache/src/kv/read-impl.js.map +1 -0
- package/out/replicache/src/kv/store.js +2 -0
- package/out/replicache/src/kv/store.js.map +1 -0
- package/out/replicache/src/kv/write-impl-base.js +48 -0
- package/out/replicache/src/kv/write-impl-base.js.map +1 -0
- package/out/replicache/src/kv/write-impl.js +25 -0
- package/out/replicache/src/kv/write-impl.js.map +1 -0
- package/out/replicache/src/lazy.js +10 -0
- package/out/replicache/src/lazy.js.map +1 -0
- package/out/replicache/src/log-options.js +13 -0
- package/out/replicache/src/log-options.js.map +1 -0
- package/out/replicache/src/merge-async-iterables.js +61 -0
- package/out/replicache/src/merge-async-iterables.js.map +1 -0
- package/out/replicache/src/mod.js +14 -0
- package/out/replicache/src/mod.js.map +1 -0
- package/out/replicache/src/mutation-recovery.js +439 -0
- package/out/replicache/src/mutation-recovery.js.map +1 -0
- package/out/replicache/src/new-client-channel.js +77 -0
- package/out/replicache/src/new-client-channel.js.map +1 -0
- package/out/replicache/src/on-persist-channel.js +33 -0
- package/out/replicache/src/on-persist-channel.js.map +1 -0
- package/out/replicache/src/patch-operation.js +37 -0
- package/out/replicache/src/patch-operation.js.map +1 -0
- package/out/replicache/src/pending-mutations.js +18 -0
- package/out/replicache/src/pending-mutations.js.map +1 -0
- package/out/replicache/src/persist/client-gc.js +38 -0
- package/out/replicache/src/persist/client-gc.js.map +1 -0
- package/out/replicache/src/persist/client-group-gc.js +38 -0
- package/out/replicache/src/persist/client-group-gc.js.map +1 -0
- package/out/replicache/src/persist/client-groups.js +180 -0
- package/out/replicache/src/persist/client-groups.js.map +1 -0
- package/out/replicache/src/persist/clients.js +390 -0
- package/out/replicache/src/persist/clients.js.map +1 -0
- package/out/replicache/src/persist/collect-idb-databases.js +174 -0
- package/out/replicache/src/persist/collect-idb-databases.js.map +1 -0
- package/out/replicache/src/persist/gather-mem-only-visitor.js +25 -0
- package/out/replicache/src/persist/gather-mem-only-visitor.js.map +1 -0
- package/out/replicache/src/persist/gather-not-cached-visitor.js +35 -0
- package/out/replicache/src/persist/gather-not-cached-visitor.js.map +1 -0
- package/out/replicache/src/persist/heartbeat.js +37 -0
- package/out/replicache/src/persist/heartbeat.js.map +1 -0
- package/out/replicache/src/persist/idb-databases-store-db-name.js +18 -0
- package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -0
- package/out/replicache/src/persist/idb-databases-store.js +90 -0
- package/out/replicache/src/persist/idb-databases-store.js.map +1 -0
- package/out/replicache/src/persist/make-client-id.js +13 -0
- package/out/replicache/src/persist/make-client-id.js.map +1 -0
- package/out/replicache/src/persist/persist.js +132 -0
- package/out/replicache/src/persist/persist.js.map +1 -0
- package/out/replicache/src/persist/refresh.js +147 -0
- package/out/replicache/src/persist/refresh.js.map +1 -0
- package/out/replicache/src/process-scheduler.js +93 -0
- package/out/replicache/src/process-scheduler.js.map +1 -0
- package/out/replicache/src/puller.js +2 -0
- package/out/replicache/src/puller.js.map +1 -0
- package/out/replicache/src/pusher.js +32 -0
- package/out/replicache/src/pusher.js.map +1 -0
- package/out/replicache/src/replicache-impl.js +1007 -0
- package/out/replicache/src/replicache-impl.js.map +1 -0
- package/out/replicache/src/replicache-options.js +2 -0
- package/out/replicache/src/replicache-options.js.map +1 -0
- package/out/replicache/src/replicache.js +387 -0
- package/out/replicache/src/replicache.js.map +1 -0
- package/out/replicache/src/request-idle.js +15 -0
- package/out/replicache/src/request-idle.js.map +1 -0
- package/out/replicache/src/scan-iterator.js +202 -0
- package/out/replicache/src/scan-iterator.js.map +1 -0
- package/out/replicache/src/scan-options.js +45 -0
- package/out/replicache/src/scan-options.js.map +1 -0
- package/out/replicache/src/set-interval-with-signal.js +7 -0
- package/out/replicache/src/set-interval-with-signal.js.map +1 -0
- package/out/replicache/src/size-of-value.js +77 -0
- package/out/replicache/src/size-of-value.js.map +1 -0
- package/out/replicache/src/subscriptions.js +357 -0
- package/out/replicache/src/subscriptions.js.map +1 -0
- package/out/replicache/src/sync/diff.js +75 -0
- package/out/replicache/src/sync/diff.js.map +1 -0
- package/out/replicache/src/sync/handle-pull-response-result-type-enum.js +5 -0
- package/out/replicache/src/sync/handle-pull-response-result-type-enum.js.map +1 -0
- package/out/replicache/src/sync/ids.js +4 -0
- package/out/replicache/src/sync/ids.js.map +1 -0
- package/out/replicache/src/sync/patch.js +41 -0
- package/out/replicache/src/sync/patch.js.map +1 -0
- package/out/replicache/src/sync/pull-error.js +16 -0
- package/out/replicache/src/sync/pull-error.js.map +1 -0
- package/out/replicache/src/sync/pull.js +375 -0
- package/out/replicache/src/sync/pull.js.map +1 -0
- package/out/replicache/src/sync/push.js +141 -0
- package/out/replicache/src/sync/push.js.map +1 -0
- package/out/replicache/src/sync/request-id.js +31 -0
- package/out/replicache/src/sync/request-id.js.map +1 -0
- package/out/replicache/src/sync/sync-head-name.js +2 -0
- package/out/replicache/src/sync/sync-head-name.js.map +1 -0
- package/out/replicache/src/test-license-key.js +3 -0
- package/out/replicache/src/test-license-key.js.map +1 -0
- package/out/replicache/src/to-error.js +7 -0
- package/out/replicache/src/to-error.js.map +1 -0
- package/out/replicache/src/transaction-closed-error.js +17 -0
- package/out/replicache/src/transaction-closed-error.js.map +1 -0
- package/out/replicache/src/transactions.js +144 -0
- package/out/replicache/src/transactions.js.map +1 -0
- package/out/replicache/src/types.js +2 -0
- package/out/replicache/src/types.js.map +1 -0
- package/out/replicache/src/version.js +5 -0
- package/out/replicache/src/version.js.map +1 -0
- package/out/replicache/src/with-transactions.js +28 -0
- package/out/replicache/src/with-transactions.js.map +1 -0
- package/out/shared/src/browser-env.js +14 -0
- package/out/shared/src/browser-env.js.map +1 -0
- package/out/shared/src/document-visible.js +76 -0
- package/out/shared/src/document-visible.js.map +1 -0
- package/out/shared/src/immutable.js +2 -0
- package/out/shared/src/immutable.js.map +1 -0
- package/out/shared/src/iterables.d.ts +2 -2
- package/out/shared/src/iterables.d.ts.map +1 -1
- package/out/shared/src/iterables.js +40 -0
- package/out/shared/src/iterables.js.map +1 -0
- package/out/shared/src/navigator.js +3 -0
- package/out/shared/src/navigator.js.map +1 -0
- package/out/shared/src/random-uint64.js +8 -0
- package/out/shared/src/random-uint64.js.map +1 -0
- package/out/shared/src/random-values.d.ts +1 -0
- package/out/shared/src/random-values.d.ts.map +1 -1
- package/out/shared/src/random-values.js +22 -0
- package/out/shared/src/random-values.js.map +1 -0
- package/out/shared/src/set-utils.d.ts +1 -1
- package/out/shared/src/set-utils.d.ts.map +1 -1
- package/out/shared/src/set-utils.js +6 -4
- package/out/shared/src/set-utils.js.map +1 -1
- package/out/shared/src/sorted-entries.d.ts +2 -0
- package/out/shared/src/sorted-entries.d.ts.map +1 -0
- package/out/shared/src/sorted-entries.js +6 -0
- package/out/shared/src/sorted-entries.js.map +1 -0
- package/out/shared/src/types.js +2 -0
- package/out/shared/src/types.js.map +1 -0
- package/out/shared/src/valita.d.ts +1 -1
- package/out/shared/src/valita.d.ts.map +1 -1
- package/out/shared/src/valita.js.map +1 -1
- package/out/shared/src/writable.d.ts +4 -0
- package/out/shared/src/writable.d.ts.map +1 -0
- package/out/shared/src/writable.js +2 -0
- package/out/shared/src/writable.js.map +1 -0
- package/out/zero/src/config.d.ts +2 -0
- package/out/zero/src/config.d.ts.map +1 -0
- package/out/zero/src/config.js +2 -0
- package/out/zero/src/config.js.map +1 -0
- package/out/zero-cache/src/config/config-query.d.ts +18 -0
- package/out/zero-cache/src/config/config-query.d.ts.map +1 -0
- package/out/zero-cache/src/config/config-query.js +19 -0
- package/out/zero-cache/src/config/config-query.js.map +1 -0
- package/out/zero-cache/src/config/define-config.d.ts +43 -0
- package/out/zero-cache/src/config/define-config.d.ts.map +1 -0
- package/out/zero-cache/src/config/define-config.js +120 -0
- package/out/zero-cache/src/config/define-config.js.map +1 -0
- package/out/zero-cache/src/config/refs.d.ts +3 -0
- package/out/zero-cache/src/config/refs.d.ts.map +1 -0
- package/out/zero-cache/src/config/refs.js +14 -0
- package/out/zero-cache/src/config/refs.js.map +1 -0
- package/out/zero-cache/src/config/zero-config.d.ts +126 -686
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +43 -161
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/db/create.d.ts +8 -0
- package/out/zero-cache/src/db/create.d.ts.map +1 -0
- package/out/zero-cache/src/db/create.js +39 -0
- package/out/zero-cache/src/db/create.js.map +1 -0
- package/out/zero-cache/src/db/lite-tables.d.ts +3 -3
- package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
- package/out/zero-cache/src/db/lite-tables.js +29 -20
- package/out/zero-cache/src/db/lite-tables.js.map +1 -1
- package/out/zero-cache/src/db/migration-lite.d.ts +60 -20
- package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
- package/out/zero-cache/src/db/migration-lite.js +89 -69
- package/out/zero-cache/src/db/migration-lite.js.map +1 -1
- package/out/zero-cache/src/db/migration.d.ts +61 -20
- package/out/zero-cache/src/db/migration.d.ts.map +1 -1
- package/out/zero-cache/src/db/migration.js +92 -75
- package/out/zero-cache/src/db/migration.js.map +1 -1
- package/out/zero-cache/src/db/pg-to-lite.d.ts +11 -0
- package/out/zero-cache/src/db/pg-to-lite.d.ts.map +1 -0
- package/out/zero-cache/src/{services/change-streamer/pg/schema/lite.js → db/pg-to-lite.js} +27 -15
- package/out/zero-cache/src/db/pg-to-lite.js.map +1 -0
- package/out/zero-cache/src/db/specs.d.ts +73 -0
- package/out/zero-cache/src/db/specs.d.ts.map +1 -0
- package/out/zero-cache/src/db/specs.js +30 -0
- package/out/zero-cache/src/db/specs.js.map +1 -0
- package/out/zero-cache/src/db/statements.d.ts +1 -1
- package/out/zero-cache/src/db/statements.d.ts.map +1 -1
- package/out/zero-cache/src/server/life-cycle.d.ts.map +1 -1
- package/out/zero-cache/src/server/life-cycle.js +9 -5
- package/out/zero-cache/src/server/life-cycle.js.map +1 -1
- package/out/zero-cache/src/server/main.js +3 -3
- package/out/zero-cache/src/server/main.js.map +1 -1
- package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/server/syncer.js +2 -1
- package/out/zero-cache/src/server/syncer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +1 -1
- 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 +1 -4
- 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.d.ts +455 -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 +16 -0
- package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/change-source.js +313 -88
- package/out/zero-cache/src/services/change-streamer/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/initial-sync.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/initial-sync.js +13 -54
- package/out/zero-cache/src/services/change-streamer/pg/initial-sync.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.d.ts +239 -59
- package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.js +291 -183
- package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/init.d.ts +5 -0
- package/out/zero-cache/src/services/change-streamer/pg/schema/init.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/pg/schema/init.js +18 -0
- package/out/zero-cache/src/services/change-streamer/pg/schema/init.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/pg/schema/published.d.ts +4 -4
- package/out/zero-cache/src/services/change-streamer/pg/schema/published.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/published.js +14 -19
- package/out/zero-cache/src/services/change-streamer/pg/schema/published.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/shard.d.ts +17 -0
- package/out/zero-cache/src/services/change-streamer/pg/schema/shard.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/pg/schema/shard.js +150 -0
- package/out/zero-cache/src/services/change-streamer/pg/schema/shard.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/pg/sync-schema.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/pg/sync-schema.js +11 -5
- package/out/zero-cache/src/services/change-streamer/pg/sync-schema.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/change.d.ts +325 -26
- package/out/zero-cache/src/services/change-streamer/schema/change.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/change.js +84 -1
- package/out/zero-cache/src/services/change-streamer/schema/change.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/init.d.ts +2 -2
- package/out/zero-cache/src/services/change-streamer/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/init.js +13 -5
- package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.js +6 -6
- package/out/zero-cache/src/services/change-streamer/storer.js +4 -4
- package/out/zero-cache/src/services/dispatcher/connect-params.d.ts +1 -0
- package/out/zero-cache/src/services/dispatcher/connect-params.d.ts.map +1 -1
- package/out/zero-cache/src/services/dispatcher/connect-params.js +5 -2
- package/out/zero-cache/src/services/dispatcher/connect-params.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js +21 -22
- package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/write-authorizer.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/write-authorizer.js +18 -9
- package/out/zero-cache/src/services/mutagen/write-authorizer.js.map +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 +131 -16
- package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/change-log.d.ts +20 -3
- package/out/zero-cache/src/services/replicator/schema/change-log.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/change-log.js +46 -14
- package/out/zero-cache/src/services/replicator/schema/change-log.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 -9
- package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +4 -3
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.js +27 -21
- package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +6 -4
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.js +63 -18
- package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts +11 -8
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.js +22 -13
- package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/database-storage.js +1 -1
- package/out/zero-cache/src/services/view-syncer/database-storage.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts +31 -0
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +53 -0
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +13 -5
- 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 +27 -0
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts +2 -1
- package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/cvr.js +5 -4
- package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/init.d.ts +4 -0
- package/out/zero-cache/src/services/view-syncer/schema/init.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/schema/init.js +16 -0
- package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +8 -216
- package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/types.js +2 -4
- package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +12 -4
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.js +59 -49
- 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 +3 -4
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.js +105 -44
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/lite.d.ts.map +1 -1
- package/out/zero-cache/src/types/lite.js +8 -9
- package/out/zero-cache/src/types/lite.js.map +1 -1
- package/out/zero-cache/src/types/pg.d.ts +10 -4
- package/out/zero-cache/src/types/pg.d.ts.map +1 -1
- package/out/zero-cache/src/types/pg.js +37 -15
- package/out/zero-cache/src/types/pg.js.map +1 -1
- package/out/zero-cache/src/workers/connection.d.ts +4 -2
- package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
- package/out/zero-cache/src/workers/connection.js +21 -2
- package/out/zero-cache/src/workers/connection.js.map +1 -1
- package/out/zero-cache/src/workers/syncer.d.ts +2 -1
- package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/workers/syncer.js +20 -9
- package/out/zero-cache/src/workers/syncer.js.map +1 -1
- package/out/zero-client/src/client/context.d.ts +1 -1
- package/out/zero-client/src/client/context.d.ts.map +1 -1
- package/out/zero-client/src/client/context.js +99 -0
- package/out/zero-client/src/client/context.js.map +1 -0
- package/out/zero-client/src/client/crud.d.ts +8 -10
- package/out/zero-client/src/client/crud.d.ts.map +1 -1
- package/out/zero-client/src/client/crud.js +181 -0
- package/out/zero-client/src/client/crud.js.map +1 -0
- package/out/zero-client/src/client/enable-analytics.js +21 -0
- package/out/zero-client/src/client/enable-analytics.js.map +1 -0
- package/out/zero-client/src/client/http-string.js +14 -0
- package/out/zero-client/src/client/http-string.js.map +1 -0
- package/out/zero-client/src/client/keys.d.ts +3 -2
- package/out/zero-client/src/client/keys.d.ts.map +1 -1
- package/out/zero-client/src/client/keys.js +32 -0
- package/out/zero-client/src/client/keys.js.map +1 -0
- package/out/zero-client/src/client/log-options.js +57 -0
- package/out/zero-client/src/client/log-options.js.map +1 -0
- package/out/zero-client/src/client/metrics.js +268 -0
- package/out/zero-client/src/client/metrics.js.map +1 -0
- package/out/zero-client/src/client/normalized-schema.d.ts +17 -0
- package/out/zero-client/src/client/normalized-schema.d.ts.map +1 -0
- package/out/zero-client/src/client/normalized-schema.js +31 -0
- package/out/zero-client/src/client/normalized-schema.js.map +1 -0
- package/out/zero-client/src/client/options.js +2 -0
- package/out/zero-client/src/client/options.js.map +1 -0
- package/out/zero-client/src/client/query-manager.d.ts +18 -3
- package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/query-manager.js +149 -0
- package/out/zero-client/src/client/query-manager.js.map +1 -0
- package/out/zero-client/src/client/reload-error-handler.js +23 -0
- package/out/zero-client/src/client/reload-error-handler.js.map +1 -0
- package/out/zero-client/src/client/replicache-types.js +2 -0
- package/out/zero-client/src/client/replicache-types.js.map +1 -0
- package/out/zero-client/src/client/server-error.js +22 -0
- package/out/zero-client/src/client/server-error.js.map +1 -0
- package/out/zero-client/src/client/server-option.js +37 -0
- package/out/zero-client/src/client/server-option.js.map +1 -0
- package/out/zero-client/src/client/version.js +5 -0
- package/out/zero-client/src/client/version.js.map +1 -0
- package/out/zero-client/src/client/zero-poke-handler.d.ts +3 -3
- package/out/zero-client/src/client/zero-poke-handler.d.ts.map +1 -1
- package/out/zero-client/src/client/zero-poke-handler.js +240 -0
- package/out/zero-client/src/client/zero-poke-handler.js.map +1 -0
- package/out/zero-client/src/client/zero.d.ts +3 -2
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.js +1212 -0
- package/out/zero-client/src/client/zero.js.map +1 -0
- package/out/zero-client/src/mod.d.ts +1 -0
- package/out/zero-client/src/mod.d.ts.map +1 -1
- package/out/zero-client/src/mod.js +5 -0
- package/out/zero-client/src/mod.js.map +1 -0
- package/out/zero-client/src/util/nanoid.js +34 -0
- package/out/zero-client/src/util/nanoid.js.map +1 -0
- package/out/zero-client/src/util/socket.js +4 -0
- package/out/zero-client/src/util/socket.js.map +1 -0
- package/out/zero-protocol/src/ast.d.ts +87 -1
- package/out/zero-protocol/src/ast.d.ts.map +1 -1
- package/out/zero-protocol/src/ast.js +53 -0
- package/out/zero-protocol/src/ast.js.map +1 -1
- package/out/zero-protocol/src/change-desired-queries.d.ts +6 -6
- package/out/zero-protocol/src/change-desired-queries.d.ts.map +1 -1
- package/out/zero-protocol/src/clients-patch.d.ts +1 -1
- package/out/zero-protocol/src/connect.d.ts +15 -8
- package/out/zero-protocol/src/connect.d.ts.map +1 -1
- package/out/zero-protocol/src/connect.js +21 -0
- package/out/zero-protocol/src/connect.js.map +1 -1
- package/out/zero-protocol/src/data.d.ts +36 -0
- package/out/zero-protocol/src/data.d.ts.map +1 -0
- package/out/zero-protocol/src/data.js +4 -0
- package/out/zero-protocol/src/data.js.map +1 -0
- package/out/zero-protocol/src/delete-clients.d.ts +4 -4
- package/out/zero-protocol/src/delete-clients.d.ts.map +1 -1
- package/out/zero-protocol/src/down.d.ts +18 -16
- package/out/zero-protocol/src/down.d.ts.map +1 -1
- package/out/zero-protocol/src/down.js +2 -1
- package/out/zero-protocol/src/down.js.map +1 -1
- package/out/zero-protocol/src/mod.d.ts +1 -2
- package/out/zero-protocol/src/mod.d.ts.map +1 -1
- package/out/zero-protocol/src/mod.js +2 -2
- package/out/zero-protocol/src/mod.js.map +1 -1
- package/out/zero-protocol/src/ping.d.ts +1 -1
- package/out/zero-protocol/src/ping.d.ts.map +1 -1
- package/out/zero-protocol/src/poke.d.ts +26 -26
- package/out/zero-protocol/src/poke.d.ts.map +1 -1
- package/out/zero-protocol/src/poke.js +8 -5
- package/out/zero-protocol/src/poke.js.map +1 -1
- package/out/zero-protocol/src/pong.d.ts +1 -1
- package/out/zero-protocol/src/pong.d.ts.map +1 -1
- package/out/zero-protocol/src/primary-key.d.ts +2 -3
- package/out/zero-protocol/src/primary-key.d.ts.map +1 -1
- package/out/zero-protocol/src/primary-key.js +1 -3
- package/out/zero-protocol/src/primary-key.js.map +1 -1
- package/out/zero-protocol/src/pull.d.ts +4 -4
- package/out/zero-protocol/src/pull.d.ts.map +1 -1
- package/out/zero-protocol/src/push.d.ts +105 -98
- package/out/zero-protocol/src/push.d.ts.map +1 -1
- package/out/zero-protocol/src/push.js +17 -13
- package/out/zero-protocol/src/push.js.map +1 -1
- package/out/zero-protocol/src/queries-patch.d.ts +4 -4
- package/out/zero-protocol/src/row-patch.d.ts +38 -0
- package/out/zero-protocol/src/row-patch.d.ts.map +1 -0
- package/out/zero-protocol/src/{entities-patch.js → row-patch.js} +10 -11
- package/out/zero-protocol/src/row-patch.js.map +1 -0
- package/out/zero-protocol/src/up.d.ts +28 -27
- package/out/zero-protocol/src/up.d.ts.map +1 -1
- package/out/zero-protocol/src/warm.d.ts +10 -0
- package/out/zero-protocol/src/warm.d.ts.map +1 -0
- package/out/zero-protocol/src/warm.js +6 -0
- package/out/zero-protocol/src/warm.js.map +1 -0
- package/out/zero-react/src/use-query.d.ts.map +1 -1
- package/out/zero.js +522 -217
- package/out/zero.js.map +4 -4
- package/out/zql/src/zql/builder/builder.d.ts +3 -4
- package/out/zql/src/zql/builder/builder.d.ts.map +1 -1
- package/out/zql/src/zql/builder/builder.js +1 -2
- package/out/zql/src/zql/builder/builder.js.map +1 -1
- package/out/zql/src/zql/builder/filter.d.ts +2 -2
- package/out/zql/src/zql/builder/filter.d.ts.map +1 -1
- package/out/zql/src/zql/builder/filter.js.map +1 -1
- package/out/zql/src/zql/ivm/array-view.d.ts +5 -12
- package/out/zql/src/zql/ivm/array-view.d.ts.map +1 -1
- package/out/zql/src/zql/ivm/array-view.js +226 -0
- package/out/zql/src/zql/ivm/array-view.js.map +1 -0
- package/out/zql/src/zql/ivm/change.d.ts +2 -1
- package/out/zql/src/zql/ivm/change.d.ts.map +1 -1
- package/out/zql/src/zql/ivm/data.d.ts +2 -33
- package/out/zql/src/zql/ivm/data.d.ts.map +1 -1
- package/out/zql/src/zql/ivm/data.js.map +1 -1
- package/out/zql/src/zql/ivm/filter.d.ts +2 -1
- package/out/zql/src/zql/ivm/filter.d.ts.map +1 -1
- package/out/zql/src/zql/ivm/filter.js.map +1 -1
- package/out/zql/src/zql/ivm/join.d.ts +1 -1
- package/out/zql/src/zql/ivm/join.d.ts.map +1 -1
- package/out/zql/src/zql/ivm/join.js +68 -24
- package/out/zql/src/zql/ivm/join.js.map +1 -1
- package/out/zql/src/zql/ivm/maybe-split-and-push-edit-change.d.ts +1 -1
- package/out/zql/src/zql/ivm/maybe-split-and-push-edit-change.d.ts.map +1 -1
- package/out/zql/src/zql/ivm/memory-source.d.ts +8 -6
- package/out/zql/src/zql/ivm/memory-source.d.ts.map +1 -1
- package/out/zql/src/zql/ivm/memory-source.js +2 -0
- package/out/zql/src/zql/ivm/memory-source.js.map +1 -1
- package/out/zql/src/zql/ivm/memory-storage.js +33 -0
- package/out/zql/src/zql/ivm/memory-storage.js.map +1 -0
- package/out/zql/src/zql/ivm/operator.d.ts +2 -1
- package/out/zql/src/zql/ivm/operator.d.ts.map +1 -1
- package/out/zql/src/zql/ivm/schema.d.ts +3 -3
- package/out/zql/src/zql/ivm/schema.d.ts.map +1 -1
- package/out/zql/src/zql/ivm/schema.js.map +1 -1
- package/out/zql/src/zql/ivm/skip.d.ts +2 -1
- package/out/zql/src/zql/ivm/skip.d.ts.map +1 -1
- package/out/zql/src/zql/ivm/skip.js.map +1 -1
- package/out/zql/src/zql/ivm/source.d.ts +2 -2
- package/out/zql/src/zql/ivm/source.d.ts.map +1 -1
- package/out/zql/src/zql/ivm/take.d.ts.map +1 -1
- package/out/zql/src/zql/ivm/take.js.map +1 -1
- package/out/zql/src/zql/query/like.d.ts +2 -0
- package/out/zql/src/zql/query/like.d.ts.map +1 -0
- package/out/zql/src/zql/query/like.js +18 -0
- package/out/zql/src/zql/query/like.js.map +1 -0
- package/out/zql/src/zql/query/normalize-table-schema.d.ts +48 -0
- package/out/zql/src/zql/query/normalize-table-schema.d.ts.map +1 -0
- package/out/zql/src/zql/query/normalize-table-schema.js +116 -0
- package/out/zql/src/zql/query/normalize-table-schema.js.map +1 -0
- package/out/zql/src/zql/query/query-impl.d.ts +6 -5
- package/out/zql/src/zql/query/query-impl.d.ts.map +1 -1
- package/out/zql/src/zql/query/query-impl.js +263 -0
- package/out/zql/src/zql/query/query-impl.js.map +1 -0
- package/out/zql/src/zql/query/query.d.ts +1 -1
- package/out/zql/src/zql/query/query.d.ts.map +1 -1
- package/out/zql/src/zql/query/query.js +3 -0
- package/out/zql/src/zql/query/query.js.map +1 -0
- package/out/zql/src/zql/query/schema.d.ts +13 -4
- package/out/zql/src/zql/query/schema.d.ts.map +1 -1
- package/out/zql/src/zql/query/schema.js +7 -0
- package/out/zql/src/zql/query/schema.js.map +1 -0
- package/out/zql/src/zql/query/typed-view.d.ts +5 -2
- package/out/zql/src/zql/query/typed-view.d.ts.map +1 -1
- package/out/zql/src/zql/query/typed-view.js +2 -0
- package/out/zql/src/zql/query/typed-view.js.map +1 -0
- package/out/zqlite/src/db.d.ts +1 -1
- package/out/zqlite/src/db.d.ts.map +1 -1
- package/out/zqlite/src/db.js +1 -1
- package/out/zqlite/src/db.js.map +1 -1
- package/out/zqlite/src/table-source.d.ts +2 -2
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +10 -8
- package/deps/sqlite3/sqlite3.c +0 -260574
- package/deps/sqlite3/sqlite3.h +0 -13572
- package/deps/sqlite3/sqlite3ext.h +0 -719
- package/out/zero-cache/src/services/change-streamer/pg/schema/create.d.ts +0 -6
- package/out/zero-cache/src/services/change-streamer/pg/schema/create.d.ts.map +0 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/create.js +0 -29
- package/out/zero-cache/src/services/change-streamer/pg/schema/create.js.map +0 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/lite.d.ts +0 -6
- package/out/zero-cache/src/services/change-streamer/pg/schema/lite.d.ts.map +0 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/lite.js.map +0 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/zero.d.ts +0 -11
- package/out/zero-cache/src/services/change-streamer/pg/schema/zero.d.ts.map +0 -1
- package/out/zero-cache/src/services/change-streamer/pg/schema/zero.js +0 -86
- package/out/zero-cache/src/services/change-streamer/pg/schema/zero.js.map +0 -1
- package/out/zero-cache/src/services/view-syncer/schema/pg-migrations.d.ts +0 -4
- package/out/zero-cache/src/services/view-syncer/schema/pg-migrations.d.ts.map +0 -1
- package/out/zero-cache/src/services/view-syncer/schema/pg-migrations.js +0 -12
- package/out/zero-cache/src/services/view-syncer/schema/pg-migrations.js.map +0 -1
- package/out/zero-cache/src/types/specs.d.ts +0 -29
- package/out/zero-cache/src/types/specs.d.ts.map +0 -1
- package/out/zero-cache/src/types/specs.js +0 -2
- package/out/zero-cache/src/types/specs.js.map +0 -1
- package/out/zero-client/src/client/make-id-from-primary-key.d.ts +0 -5
- package/out/zero-client/src/client/make-id-from-primary-key.d.ts.map +0 -1
- package/out/zero-protocol/src/entities-patch.d.ts +0 -66
- package/out/zero-protocol/src/entities-patch.d.ts.map +0 -1
- package/out/zero-protocol/src/entities-patch.js.map +0 -1
- package/out/zql/src/zql/ast/ast.d.ts +0 -84
- package/out/zql/src/zql/ast/ast.d.ts.map +0 -1
- package/out/zql/src/zql/ast/ast.js +0 -54
- package/out/zql/src/zql/ast/ast.js.map +0 -1
- package/tool/install-sqlite3.js +0 -37
|
@@ -6,47 +6,45 @@ import { Database } from '../../../zqlite/src/db.js';
|
|
|
6
6
|
* Ensures that the schema is compatible with the current code, updating and
|
|
7
7
|
* migrating the schema if necessary.
|
|
8
8
|
*/
|
|
9
|
-
export async function runSchemaMigrations(log, debugName, dbPath,
|
|
9
|
+
export async function runSchemaMigrations(log, debugName, dbPath, setupMigration, incrementalMigrationMap) {
|
|
10
10
|
log = log.withContext('initSchema', randInt(0, Number.MAX_SAFE_INTEGER).toString(36));
|
|
11
11
|
const db = new Database(log, dbPath);
|
|
12
12
|
db.pragma('foreign_keys = OFF');
|
|
13
13
|
try {
|
|
14
|
-
const versionMigrations = sorted(
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if (codeSchemaVersion < meta.minSafeRollbackVersion) {
|
|
24
|
-
throw new Error(`Cannot run ${debugName} at schema v${codeSchemaVersion} because rollback limit is v${meta.minSafeRollbackVersion}`);
|
|
14
|
+
const versionMigrations = sorted(incrementalMigrationMap);
|
|
15
|
+
assert(versionMigrations.length, `Must specify a at least one version migration`);
|
|
16
|
+
assert(versionMigrations[0][0] > 0, `Versions must be non-zero positive numbers`);
|
|
17
|
+
const codeVersion = versionMigrations[versionMigrations.length - 1][0];
|
|
18
|
+
log.info?.(`Checking schema for compatibility with ${debugName} at schema v${codeVersion}`);
|
|
19
|
+
let versions = await runTransaction(log, db, tx => {
|
|
20
|
+
const versions = getVersionHistory(tx);
|
|
21
|
+
if (codeVersion < versions.minSafeVersion) {
|
|
22
|
+
throw new Error(`Cannot run ${debugName} at schema v${codeVersion} because rollback limit is v${versions.minSafeVersion}`);
|
|
25
23
|
}
|
|
26
|
-
if (
|
|
27
|
-
log.info?.(`
|
|
28
|
-
return
|
|
24
|
+
if (versions.dataVersion > codeVersion) {
|
|
25
|
+
log.info?.(`Data is at v${versions.dataVersion}. Resetting to v${codeVersion}`);
|
|
26
|
+
return updateVersionHistory(log, tx, versions, codeVersion);
|
|
29
27
|
}
|
|
30
|
-
return
|
|
28
|
+
return versions;
|
|
31
29
|
});
|
|
32
|
-
if (
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
if (versions.dataVersion < codeVersion) {
|
|
31
|
+
const migrations = versions.dataVersion === 0
|
|
32
|
+
? // For the empty database v0, only run the setup migration.
|
|
33
|
+
[[codeVersion, setupMigration]]
|
|
34
|
+
: versionMigrations;
|
|
35
|
+
for (const [dest, migration] of migrations) {
|
|
36
|
+
if (versions.dataVersion < dest) {
|
|
37
|
+
log.info?.(`Migrating schema from v${versions.dataVersion} to v${dest}`);
|
|
36
38
|
void log.flush(); // Flush logs before each migration to help debug crash-y migrations.
|
|
37
39
|
db.pragma('synchronous = OFF'); // For schema migrations we'll wait for the disk flush after the migration.
|
|
38
|
-
|
|
39
|
-
if ('pre' in migration) {
|
|
40
|
-
await migration.pre(log, db);
|
|
41
|
-
}
|
|
42
|
-
meta = await runTransaction(log, db, async (tx) => {
|
|
40
|
+
versions = await runTransaction(log, db, async (tx) => {
|
|
43
41
|
// Fetch meta from within the transaction to make the migration atomic.
|
|
44
|
-
let
|
|
45
|
-
if (
|
|
46
|
-
|
|
47
|
-
assert(
|
|
42
|
+
let versions = getVersionHistory(tx);
|
|
43
|
+
if (versions.dataVersion < dest) {
|
|
44
|
+
versions = await runMigration(log, tx, versions, dest, migration);
|
|
45
|
+
assert(versions.dataVersion === dest);
|
|
48
46
|
}
|
|
49
|
-
return
|
|
47
|
+
return versions;
|
|
50
48
|
});
|
|
51
49
|
db.pragma('synchronous = NORMAL');
|
|
52
50
|
db.exec('VACUUM');
|
|
@@ -56,8 +54,8 @@ export async function runSchemaMigrations(log, debugName, dbPath, versionMigrati
|
|
|
56
54
|
}
|
|
57
55
|
}
|
|
58
56
|
}
|
|
59
|
-
assert(
|
|
60
|
-
log.info?.(`Running ${debugName} at schema v${
|
|
57
|
+
assert(versions.dataVersion === codeVersion);
|
|
58
|
+
log.info?.(`Running ${debugName} at schema v${codeVersion}`);
|
|
61
59
|
}
|
|
62
60
|
catch (e) {
|
|
63
61
|
log.error?.('Error in ensureSchemaMigrated', e);
|
|
@@ -68,80 +66,102 @@ export async function runSchemaMigrations(log, debugName, dbPath, versionMigrati
|
|
|
68
66
|
void log.flush(); // Flush the logs but do not block server progress on it.
|
|
69
67
|
}
|
|
70
68
|
}
|
|
71
|
-
function sorted(
|
|
69
|
+
function sorted(incrementalMigrationMap) {
|
|
72
70
|
const versionMigrations = [];
|
|
73
|
-
for (const [v, m] of Object.entries(
|
|
71
|
+
for (const [v, m] of Object.entries(incrementalMigrationMap)) {
|
|
74
72
|
versionMigrations.push([Number(v), m]);
|
|
75
73
|
}
|
|
76
74
|
return versionMigrations.sort(([a], [b]) => a - b);
|
|
77
75
|
}
|
|
78
76
|
// Exposed for tests.
|
|
79
|
-
export const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
77
|
+
export const versionHistory = v.object({
|
|
78
|
+
/**
|
|
79
|
+
* The `schemaVersion` is highest code version that has ever been run
|
|
80
|
+
* on the database, and is used to delineate the structure of the tables
|
|
81
|
+
* in the database. A schemaVersion only moves forward; rolling back to
|
|
82
|
+
* an earlier (safe) code version does not revert schema changes that
|
|
83
|
+
* have already been applied.
|
|
84
|
+
*/
|
|
85
|
+
schemaVersion: v.number(),
|
|
86
|
+
/**
|
|
87
|
+
* The data version is the code version of the latest server that ran.
|
|
88
|
+
* Note that this may be less than the schemaVersion in the case that
|
|
89
|
+
* a server is rolled back to an earlier version after a schema change.
|
|
90
|
+
* In such a case, data (but not schema), may need to be re-migrated
|
|
91
|
+
* when rolling forward again.
|
|
92
|
+
*/
|
|
93
|
+
dataVersion: v.number(),
|
|
94
|
+
/**
|
|
95
|
+
* The minimum code version that is safe to run. This is used when
|
|
96
|
+
* a schema migration is not backwards compatible with an older version
|
|
97
|
+
* of the code.
|
|
98
|
+
*/
|
|
99
|
+
minSafeVersion: v.number(),
|
|
83
100
|
});
|
|
84
101
|
// Exposed for tests
|
|
85
|
-
export function
|
|
102
|
+
export function getVersionHistory(db) {
|
|
86
103
|
// Note: The `lock` column transparently ensures that at most one row exists.
|
|
87
104
|
db.prepare(`
|
|
88
|
-
CREATE TABLE IF NOT EXISTS "_zero.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
105
|
+
CREATE TABLE IF NOT EXISTS "_zero.versionHistory" (
|
|
106
|
+
dataVersion INTEGER NOT NULL,
|
|
107
|
+
schemaVersion INTEGER NOT NULL,
|
|
108
|
+
minSafeVersion INTEGER NOT NULL,
|
|
92
109
|
|
|
93
110
|
lock INTEGER PRIMARY KEY DEFAULT 1 CHECK (lock=1)
|
|
94
111
|
);
|
|
95
112
|
`).run();
|
|
96
113
|
const result = db
|
|
97
|
-
.prepare('SELECT
|
|
114
|
+
.prepare('SELECT dataVersion, schemaVersion, minSafeVersion FROM "_zero.versionHistory"')
|
|
98
115
|
.get();
|
|
99
|
-
return result ?? {
|
|
116
|
+
return result ?? { dataVersion: 0, schemaVersion: 0, minSafeVersion: 0 };
|
|
100
117
|
}
|
|
101
|
-
function
|
|
118
|
+
function updateVersionHistory(log, db, prev, newVersion, minSafeVersion) {
|
|
102
119
|
assert(newVersion > 0);
|
|
103
120
|
const meta = {
|
|
104
121
|
...prev,
|
|
105
|
-
|
|
106
|
-
|
|
122
|
+
dataVersion: newVersion,
|
|
123
|
+
// The schemaVersion never moves backwards.
|
|
124
|
+
schemaVersion: Math.max(newVersion, prev.schemaVersion),
|
|
125
|
+
minSafeVersion: getMinSafeVersion(log, prev, minSafeVersion),
|
|
107
126
|
};
|
|
108
127
|
db.prepare(`
|
|
109
|
-
INSERT INTO "_zero.
|
|
110
|
-
VALUES (@
|
|
128
|
+
INSERT INTO "_zero.versionHistory" (dataVersion, schemaVersion, minSafeVersion, lock)
|
|
129
|
+
VALUES (@dataVersion, @schemaVersion, @minSafeVersion, 1)
|
|
111
130
|
ON CONFLICT (lock) DO UPDATE
|
|
112
|
-
SET
|
|
113
|
-
|
|
114
|
-
|
|
131
|
+
SET dataVersion=@dataVersion,
|
|
132
|
+
schemaVersion=@schemaVersion,
|
|
133
|
+
minSafeVersion=@minSafeVersion
|
|
115
134
|
`).run(meta);
|
|
116
135
|
return meta;
|
|
117
136
|
}
|
|
118
|
-
async function
|
|
119
|
-
if (
|
|
120
|
-
await migration.
|
|
137
|
+
async function runMigration(log, tx, versions, destinationVersion, migration) {
|
|
138
|
+
if (versions.schemaVersion < destinationVersion) {
|
|
139
|
+
await migration.migrateSchema?.(log, tx);
|
|
121
140
|
}
|
|
122
|
-
|
|
123
|
-
|
|
141
|
+
if (versions.dataVersion < destinationVersion) {
|
|
142
|
+
await migration.migrateData?.(log, tx);
|
|
124
143
|
}
|
|
125
|
-
return
|
|
144
|
+
return updateVersionHistory(log, tx, versions, destinationVersion, migration.minSafeVersion);
|
|
126
145
|
}
|
|
127
146
|
/**
|
|
128
147
|
* Bumps the rollback limit [[toAtLeast]] the specified version.
|
|
129
148
|
* Leaves the rollback limit unchanged if it is equal or greater.
|
|
130
149
|
*/
|
|
131
|
-
function
|
|
150
|
+
function getMinSafeVersion(log, current, proposedSafeVersion) {
|
|
151
|
+
if (proposedSafeVersion === undefined) {
|
|
152
|
+
return current.minSafeVersion;
|
|
153
|
+
}
|
|
132
154
|
// Sanity check to maintain the invariant that running code is never
|
|
133
155
|
// earlier than the rollback limit.
|
|
134
|
-
assert(
|
|
135
|
-
if (
|
|
156
|
+
assert(proposedSafeVersion <= current.dataVersion + 1);
|
|
157
|
+
if (current.minSafeVersion >= proposedSafeVersion) {
|
|
136
158
|
// The rollback limit must never move backwards.
|
|
137
|
-
log.debug?.(`rollback limit is already at ${
|
|
138
|
-
|
|
159
|
+
log.debug?.(`rollback limit is already at ${current.minSafeVersion}, ` +
|
|
160
|
+
`don't need to bump to ${proposedSafeVersion}`);
|
|
161
|
+
return current.minSafeVersion;
|
|
139
162
|
}
|
|
140
|
-
log.info?.(`bumping rollback limit from ${
|
|
141
|
-
return
|
|
142
|
-
...meta,
|
|
143
|
-
minSafeRollbackVersion: toAtLeast,
|
|
144
|
-
};
|
|
163
|
+
log.info?.(`bumping rollback limit from ${current.minSafeVersion} to ${proposedSafeVersion}`);
|
|
164
|
+
return proposedSafeVersion;
|
|
145
165
|
}
|
|
146
166
|
// Note: We use a custom transaction wrapper (instead of db.begin(...)) in order
|
|
147
167
|
// to support async operations within the transaction.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration-lite.js","sourceRoot":"","sources":["../../../../../zero-cache/src/db/migration-lite.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,gCAAgC,CAAC;AACtD,OAAO,EAAC,OAAO,EAAC,MAAM,6BAA6B,CAAC;AACpD,OAAO,KAAK,CAAC,MAAM,+BAA+B,CAAC;AAEnD,OAAO,EAAC,QAAQ,EAAC,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"migration-lite.js","sourceRoot":"","sources":["../../../../../zero-cache/src/db/migration-lite.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,gCAAgC,CAAC;AACtD,OAAO,EAAC,OAAO,EAAC,MAAM,6BAA6B,CAAC;AACpD,OAAO,KAAK,CAAC,MAAM,+BAA+B,CAAC;AAEnD,OAAO,EAAC,QAAQ,EAAC,MAAM,2BAA2B,CAAC;AAiDnD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAe,EACf,SAAiB,EACjB,MAAc,EACd,cAAyB,EACzB,uBAAgD;IAEhD,GAAG,GAAG,GAAG,CAAC,WAAW,CACnB,YAAY,EACZ,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CACjD,CAAC;IACF,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACrC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,iBAAiB,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC1D,MAAM,CACJ,iBAAiB,CAAC,MAAM,EACxB,+CAA+C,CAChD,CAAC;QACF,MAAM,CACJ,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAC3B,4CAA4C,CAC7C,CAAC;QACF,MAAM,WAAW,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,GAAG,CAAC,IAAI,EAAE,CACR,0CAA0C,SAAS,eAAe,WAAW,EAAE,CAChF,CAAC;QAEF,IAAI,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;YAChD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CACb,cAAc,SAAS,eAAe,WAAW,+BAA+B,QAAQ,CAAC,cAAc,EAAE,CAC1G,CAAC;YACJ,CAAC;YAED,IAAI,QAAQ,CAAC,WAAW,GAAG,WAAW,EAAE,CAAC;gBACvC,GAAG,CAAC,IAAI,EAAE,CACR,eAAe,QAAQ,CAAC,WAAW,mBAAmB,WAAW,EAAE,CACpE,CAAC;gBACF,OAAO,oBAAoB,CAAC,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC9D,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,WAAW,GAAG,WAAW,EAAE,CAAC;YACvC,MAAM,UAAU,GACd,QAAQ,CAAC,WAAW,KAAK,CAAC;gBACxB,CAAC,CAAC,2DAA2D;oBAC1D,CAAC,CAAC,WAAW,EAAE,cAAc,CAAC,CAAW;gBAC5C,CAAC,CAAC,iBAAiB,CAAC;YAExB,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3C,IAAI,QAAQ,CAAC,WAAW,GAAG,IAAI,EAAE,CAAC;oBAChC,GAAG,CAAC,IAAI,EAAE,CACR,0BAA0B,QAAQ,CAAC,WAAW,QAAQ,IAAI,EAAE,CAC7D,CAAC;oBACF,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,qEAAqE;oBAEvF,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,2EAA2E;oBAE3G,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAC,EAAE,EAAC,EAAE;wBAClD,uEAAuE;wBACvE,IAAI,QAAQ,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;wBACrC,IAAI,QAAQ,CAAC,WAAW,GAAG,IAAI,EAAE,CAAC;4BAChC,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;4BAClE,MAAM,CAAC,QAAQ,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC;wBACxC,CAAC;wBACD,OAAO,QAAQ,CAAC;oBAClB,CAAC,CAAC,CAAC;oBAEH,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;oBAClC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAClB,GAAG,CAAC,IAAI,EAAE,CAAC,kBAAkB,CAAC,CAAC;oBAC/B,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBACxB,GAAG,CAAC,IAAI,EAAE,CAAC,mBAAmB,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC;QAC7C,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,SAAS,eAAe,WAAW,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,KAAK,EAAE,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,CAAC;IACV,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,yDAAyD;IAC7E,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CACb,uBAAgD;IAEhD,MAAM,iBAAiB,GAA0B,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAC7D,iBAAiB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,qBAAqB;AACrB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC;;;;;;OAMG;IACH,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IAEzB;;;;;;OAMG;IACH,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IAEvB;;;;OAIG;IACH,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;CAC3B,CAAC,CAAC;AAKH,oBAAoB;AACpB,MAAM,UAAU,iBAAiB,CAAC,EAAM;IACtC,6EAA6E;IAC7E,EAAE,CAAC,OAAO,CACR;;;;;;;;GAQD,CACA,CAAC,GAAG,EAAE,CAAC;IACR,MAAM,MAAM,GAAG,EAAE;SACd,OAAO,CACN,+EAA+E,CAChF;SACA,GAAG,EAAoB,CAAC;IAC3B,OAAO,MAAM,IAAI,EAAC,WAAW,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAC,CAAC;AACzE,CAAC;AAED,SAAS,oBAAoB,CAC3B,GAAe,EACf,EAAM,EACN,IAAoB,EACpB,UAAkB,EAClB,cAAuB;IAEvB,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG;QACX,GAAG,IAAI;QACP,WAAW,EAAE,UAAU;QACvB,2CAA2C;QAC3C,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;QACvD,cAAc,EAAE,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,cAAc,CAAC;KACpC,CAAC;IAE3B,EAAE,CAAC,OAAO,CACR;;;;;;;GAOD,CACA,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEZ,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,GAAe,EACf,EAAM,EACN,QAAwB,EACxB,kBAA0B,EAC1B,SAAoB;IAEpB,IAAI,QAAQ,CAAC,aAAa,GAAG,kBAAkB,EAAE,CAAC;QAChD,MAAM,SAAS,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,GAAG,kBAAkB,EAAE,CAAC;QAC9C,MAAM,SAAS,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,oBAAoB,CACzB,GAAG,EACH,EAAE,EACF,QAAQ,EACR,kBAAkB,EAClB,SAAS,CAAC,cAAc,CACzB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CACxB,GAAe,EACf,OAAuB,EACvB,mBAA4B;IAE5B,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,OAAO,CAAC,cAAc,CAAC;IAChC,CAAC;IACD,oEAAoE;IACpE,mCAAmC;IACnC,MAAM,CAAC,mBAAmB,IAAI,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;IAEvD,IAAI,OAAO,CAAC,cAAc,IAAI,mBAAmB,EAAE,CAAC;QAClD,gDAAgD;QAChD,GAAG,CAAC,KAAK,EAAE,CACT,gCAAgC,OAAO,CAAC,cAAc,IAAI;YACxD,yBAAyB,mBAAmB,EAAE,CACjD,CAAC;QACF,OAAO,OAAO,CAAC,cAAc,CAAC;IAChC,CAAC;IACD,GAAG,CAAC,IAAI,EAAE,CACR,+BAA+B,OAAO,CAAC,cAAc,OAAO,mBAAmB,EAAE,CAClF,CAAC;IACF,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED,gFAAgF;AAChF,sDAAsD;AACtD,KAAK,UAAU,cAAc,CAC3B,GAAe,EACf,EAAM,EACN,EAA8B;IAE9B,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,GAAG,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5B,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7B,GAAG,CAAC,KAAK,EAAE,CAAC,kCAAkC,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC"}
|
|
@@ -1,38 +1,79 @@
|
|
|
1
1
|
import type { LogContext } from '@rocicorp/logger';
|
|
2
2
|
import type postgres from 'postgres';
|
|
3
3
|
import * as v from '../../../shared/src/valita.js';
|
|
4
|
+
import type { PostgresDB, PostgresTransaction } from '../types/pg.js';
|
|
5
|
+
type Operations = (log: LogContext, tx: PostgresTransaction) => Promise<void>;
|
|
4
6
|
/**
|
|
5
|
-
*
|
|
6
|
-
* suitable for potentially long running polling operations.
|
|
7
|
-
*/
|
|
8
|
-
type PreMigrationFn = (log: LogContext, db: postgres.Sql) => Promise<void>;
|
|
9
|
-
type MigrationFn = (log: LogContext, tx: postgres.TransactionSql) => Promise<void>;
|
|
10
|
-
/**
|
|
11
|
-
* Encapsulates the logic for upgrading to a new schema. After the
|
|
7
|
+
* Encapsulates the logic for setting up or upgrading to a new schema. After the
|
|
12
8
|
* Migration code successfully completes, {@link runSchemaMigrations}
|
|
13
9
|
* will update the schema version and commit the transaction.
|
|
14
10
|
*/
|
|
15
11
|
export type Migration = {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Perform database operations that create or alter table structure. This is
|
|
14
|
+
* called at most once during lifetime of the application. If a `migrateData()`
|
|
15
|
+
* operation is defined, that will be performed after `migrateSchema()` succeeds.
|
|
16
|
+
*/
|
|
17
|
+
migrateSchema?: Operations;
|
|
18
|
+
/**
|
|
19
|
+
* Perform database operations to migrate data to the new schema. This is
|
|
20
|
+
* called after `migrateSchema()` (if defined), and may be called again
|
|
21
|
+
* to re-migrate data after the server was rolled back to an earlier version,
|
|
22
|
+
* and rolled forward again.
|
|
23
|
+
*
|
|
24
|
+
* Consequently, the logic in `migrateData()` must be idempotent.
|
|
25
|
+
*/
|
|
26
|
+
migrateData?: Operations;
|
|
27
|
+
/**
|
|
28
|
+
* Sets the `minSafeVersion` to the specified value, prohibiting running
|
|
29
|
+
* any earlier code versions.
|
|
30
|
+
*/
|
|
31
|
+
minSafeVersion?: number;
|
|
20
32
|
};
|
|
21
|
-
/**
|
|
22
|
-
|
|
33
|
+
/**
|
|
34
|
+
* Mapping of incremental migrations to move from the previous old code
|
|
35
|
+
* version to next one. Versions must be non-zero.
|
|
36
|
+
*
|
|
37
|
+
* The schema resulting from performing incremental migrations should be
|
|
38
|
+
* equivalent to that of the `setupMigration` on a blank database.
|
|
39
|
+
*
|
|
40
|
+
* The highest destinationVersion of this map denotes the current
|
|
41
|
+
* "code version", and is also used as the destination version when
|
|
42
|
+
* running the initial setup migration on a blank database.
|
|
43
|
+
*/
|
|
44
|
+
export type IncrementalMigrationMap = {
|
|
23
45
|
[destinationVersion: number]: Migration;
|
|
24
46
|
};
|
|
25
47
|
/**
|
|
26
48
|
* Ensures that the schema is compatible with the current code, updating and
|
|
27
49
|
* migrating the schema if necessary.
|
|
28
50
|
*/
|
|
29
|
-
export declare function runSchemaMigrations(log: LogContext, debugName: string, schemaName: string, db:
|
|
30
|
-
export declare const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
51
|
+
export declare function runSchemaMigrations(log: LogContext, debugName: string, schemaName: string, db: PostgresDB, setupMigration: Migration, incrementalMigrationMap: IncrementalMigrationMap): Promise<void>;
|
|
52
|
+
export declare const versionHistory: v.ObjectType<{
|
|
53
|
+
/**
|
|
54
|
+
* The `schemaVersion` is highest code version that has ever been run
|
|
55
|
+
* on the database, and is used to delineate the structure of the tables
|
|
56
|
+
* in the database. A schemaVersion only moves forward; rolling back to
|
|
57
|
+
* an earlier (safe) code version does not revert schema changes that
|
|
58
|
+
* have already been applied.
|
|
59
|
+
*/
|
|
60
|
+
schemaVersion: v.Type<number>;
|
|
61
|
+
/**
|
|
62
|
+
* The data version is the code version of the latest server that ran.
|
|
63
|
+
* Note that this may be less than the schemaVersion in the case that
|
|
64
|
+
* a server is rolled back to an earlier version after a schema change.
|
|
65
|
+
* In such a case, data (but not schema), may need to be re-migrated
|
|
66
|
+
* when rolling forward again.
|
|
67
|
+
*/
|
|
68
|
+
dataVersion: v.Type<number>;
|
|
69
|
+
/**
|
|
70
|
+
* The minimum code version that is safe to run. This is used when
|
|
71
|
+
* a schema migration is not backwards compatible with an older version
|
|
72
|
+
* of the code.
|
|
73
|
+
*/
|
|
74
|
+
minSafeVersion: v.Type<number>;
|
|
34
75
|
}, undefined>;
|
|
35
|
-
export type
|
|
36
|
-
export declare function
|
|
76
|
+
export type VersionHistory = v.Infer<typeof versionHistory>;
|
|
77
|
+
export declare function getVersionHistory(sql: postgres.Sql, schemaName: string): Promise<VersionHistory>;
|
|
37
78
|
export {};
|
|
38
79
|
//# sourceMappingURL=migration.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/db/migration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAGrC,OAAO,KAAK,CAAC,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/db/migration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAGrC,OAAO,KAAK,CAAC,MAAM,+BAA+B,CAAC;AACnD,OAAO,KAAK,EAAC,UAAU,EAAE,mBAAmB,EAAC,MAAM,gBAAgB,CAAC;AAEpE,KAAK,UAAU,GAAG,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9E;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB;;;;OAIG;IACH,aAAa,CAAC,EAAE,UAAU,CAAC;IAE3B;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,UAAU,CAAC;IAEzB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC,CAAC;AAEF;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,UAAU,EACd,cAAc,EAAE,SAAS,EACzB,uBAAuB,EAAE,uBAAuB,GAC/C,OAAO,CAAC,IAAI,CAAC,CA+Ef;AAaD,eAAO,MAAM,cAAc;IACzB;;;;;;OAMG;;IAGH;;;;;;OAMG;;IAGH;;;;OAIG;;aAEH,CAAC;AAGH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAG5D,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,QAAQ,CAAC,GAAG,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,CAAC,CAsBzB"}
|
|
@@ -5,50 +5,48 @@ import * as v from '../../../shared/src/valita.js';
|
|
|
5
5
|
* Ensures that the schema is compatible with the current code, updating and
|
|
6
6
|
* migrating the schema if necessary.
|
|
7
7
|
*/
|
|
8
|
-
export async function runSchemaMigrations(log, debugName, schemaName, db,
|
|
8
|
+
export async function runSchemaMigrations(log, debugName, schemaName, db, setupMigration, incrementalMigrationMap) {
|
|
9
9
|
log = log.withContext('initSchema', randInt(0, Number.MAX_SAFE_INTEGER).toString(36));
|
|
10
10
|
try {
|
|
11
|
-
const versionMigrations = sorted(
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
if (codeSchemaVersion < meta.minSafeRollbackVersion) {
|
|
21
|
-
throw new Error(`Cannot run ${debugName} at schema v${codeSchemaVersion} because rollback limit is v${meta.minSafeRollbackVersion}`);
|
|
11
|
+
const versionMigrations = sorted(incrementalMigrationMap);
|
|
12
|
+
assert(versionMigrations.length, `Must specify at least one version migration`);
|
|
13
|
+
assert(versionMigrations[0][0] > 0, `Versions must be non-zero positive numbers`);
|
|
14
|
+
const codeVersion = versionMigrations[versionMigrations.length - 1][0];
|
|
15
|
+
log.info?.(`Checking schema for compatibility with ${debugName} at schema v${codeVersion}`);
|
|
16
|
+
let versions = await db.begin(async (tx) => {
|
|
17
|
+
const versions = await getVersionHistory(tx, schemaName);
|
|
18
|
+
if (codeVersion < versions.minSafeVersion) {
|
|
19
|
+
throw new Error(`Cannot run ${debugName} at schema v${codeVersion} because rollback limit is v${versions.minSafeVersion}`);
|
|
22
20
|
}
|
|
23
|
-
if (
|
|
24
|
-
log.info?.(`
|
|
25
|
-
return
|
|
21
|
+
if (versions.dataVersion > codeVersion) {
|
|
22
|
+
log.info?.(`Data is at v${versions.dataVersion}. Resetting to v${codeVersion}`);
|
|
23
|
+
return updateVersionHistory(log, tx, schemaName, versions, codeVersion);
|
|
26
24
|
}
|
|
27
|
-
return
|
|
25
|
+
return versions;
|
|
28
26
|
});
|
|
29
|
-
if (
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
if (versions.dataVersion < codeVersion) {
|
|
28
|
+
const migrations = versions.dataVersion === 0
|
|
29
|
+
? // For the empty database v0, only run the setup migration.
|
|
30
|
+
[[codeVersion, setupMigration]]
|
|
31
|
+
: versionMigrations;
|
|
32
|
+
for (const [dest, migration] of migrations) {
|
|
33
|
+
if (versions.dataVersion < dest) {
|
|
34
|
+
log.info?.(`Migrating schema from v${versions.dataVersion} to v${dest}`);
|
|
33
35
|
void log.flush(); // Flush logs before each migration to help debug crash-y migrations.
|
|
34
|
-
|
|
35
|
-
if ('pre' in migration) {
|
|
36
|
-
await migration.pre(log, db);
|
|
37
|
-
}
|
|
38
|
-
meta = await db.begin(async (tx) => {
|
|
36
|
+
versions = await db.begin(async (tx) => {
|
|
39
37
|
// Fetch meta from within the transaction to make the migration atomic.
|
|
40
|
-
let
|
|
41
|
-
if (
|
|
42
|
-
|
|
43
|
-
assert(
|
|
38
|
+
let versions = await getVersionHistory(tx, schemaName);
|
|
39
|
+
if (versions.dataVersion < dest) {
|
|
40
|
+
versions = await runMigration(log, schemaName, tx, versions, dest, migration);
|
|
41
|
+
assert(versions.dataVersion === dest);
|
|
44
42
|
}
|
|
45
|
-
return
|
|
43
|
+
return versions;
|
|
46
44
|
});
|
|
47
45
|
}
|
|
48
46
|
}
|
|
49
47
|
}
|
|
50
|
-
assert(
|
|
51
|
-
log.info?.(`Running ${debugName} at schema v${
|
|
48
|
+
assert(versions.dataVersion === codeVersion);
|
|
49
|
+
log.info?.(`Running ${debugName} at schema v${codeVersion}`);
|
|
52
50
|
}
|
|
53
51
|
catch (e) {
|
|
54
52
|
log.error?.('Error in ensureSchemaMigrated', e);
|
|
@@ -58,82 +56,101 @@ export async function runSchemaMigrations(log, debugName, schemaName, db, versio
|
|
|
58
56
|
void log.flush(); // Flush the logs but do not block server progress on it.
|
|
59
57
|
}
|
|
60
58
|
}
|
|
61
|
-
function sorted(
|
|
59
|
+
function sorted(incrementalMigrationMap) {
|
|
62
60
|
const versionMigrations = [];
|
|
63
|
-
for (const [v, m] of Object.entries(
|
|
61
|
+
for (const [v, m] of Object.entries(incrementalMigrationMap)) {
|
|
64
62
|
versionMigrations.push([Number(v), m]);
|
|
65
63
|
}
|
|
66
64
|
return versionMigrations.sort(([a], [b]) => a - b);
|
|
67
65
|
}
|
|
68
66
|
// Exposed for tests.
|
|
69
|
-
export const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
67
|
+
export const versionHistory = v.object({
|
|
68
|
+
/**
|
|
69
|
+
* The `schemaVersion` is highest code version that has ever been run
|
|
70
|
+
* on the database, and is used to delineate the structure of the tables
|
|
71
|
+
* in the database. A schemaVersion only moves forward; rolling back to
|
|
72
|
+
* an earlier (safe) code version does not revert schema changes that
|
|
73
|
+
* have already been applied.
|
|
74
|
+
*/
|
|
75
|
+
schemaVersion: v.number(),
|
|
76
|
+
/**
|
|
77
|
+
* The data version is the code version of the latest server that ran.
|
|
78
|
+
* Note that this may be less than the schemaVersion in the case that
|
|
79
|
+
* a server is rolled back to an earlier version after a schema change.
|
|
80
|
+
* In such a case, data (but not schema), may need to be re-migrated
|
|
81
|
+
* when rolling forward again.
|
|
82
|
+
*/
|
|
83
|
+
dataVersion: v.number(),
|
|
84
|
+
/**
|
|
85
|
+
* The minimum code version that is safe to run. This is used when
|
|
86
|
+
* a schema migration is not backwards compatible with an older version
|
|
87
|
+
* of the code.
|
|
88
|
+
*/
|
|
89
|
+
minSafeVersion: v.number(),
|
|
73
90
|
});
|
|
74
91
|
// Exposed for tests
|
|
75
|
-
export async function
|
|
76
|
-
// Note: The `
|
|
92
|
+
export async function getVersionHistory(sql, schemaName) {
|
|
93
|
+
// Note: The `lock` column transparently ensures that at most one row exists.
|
|
77
94
|
const results = await sql `
|
|
78
95
|
CREATE SCHEMA IF NOT EXISTS ${sql(schemaName)};
|
|
79
|
-
CREATE TABLE IF NOT EXISTS ${sql(schemaName)}."
|
|
80
|
-
|
|
81
|
-
"
|
|
82
|
-
"
|
|
96
|
+
CREATE TABLE IF NOT EXISTS ${sql(schemaName)}."versionHistory" (
|
|
97
|
+
"dataVersion" int NOT NULL,
|
|
98
|
+
"schemaVersion" int NOT NULL,
|
|
99
|
+
"minSafeVersion" int NOT NULL,
|
|
83
100
|
|
|
84
101
|
lock char(1) NOT NULL CONSTRAINT DF_schema_meta_lock DEFAULT 'v',
|
|
85
102
|
CONSTRAINT PK_schema_meta_lock PRIMARY KEY (lock),
|
|
86
103
|
CONSTRAINT CK_schema_meta_lock CHECK (lock='v')
|
|
87
104
|
);
|
|
88
|
-
SELECT
|
|
105
|
+
SELECT "dataVersion", "schemaVersion", "minSafeVersion" FROM ${sql(schemaName)}."versionHistory";
|
|
89
106
|
`.simple();
|
|
90
107
|
const rows = results[1];
|
|
91
108
|
if (rows.length === 0) {
|
|
92
|
-
return {
|
|
109
|
+
return { schemaVersion: 0, dataVersion: 0, minSafeVersion: 0 };
|
|
93
110
|
}
|
|
94
|
-
return v.parse(rows[0],
|
|
111
|
+
return v.parse(rows[0], versionHistory);
|
|
95
112
|
}
|
|
96
|
-
async function
|
|
113
|
+
async function updateVersionHistory(log, sql, schemaName, prev, newVersion, minSafeVersion) {
|
|
97
114
|
assert(newVersion > 0);
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
115
|
+
const versions = {
|
|
116
|
+
dataVersion: newVersion,
|
|
117
|
+
// The schemaVersion never moves backwards.
|
|
118
|
+
schemaVersion: Math.max(newVersion, prev.schemaVersion),
|
|
119
|
+
minSafeVersion: getMinSafeVersion(log, prev, minSafeVersion),
|
|
102
120
|
};
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
109
|
-
return meta;
|
|
121
|
+
await sql `
|
|
122
|
+
INSERT INTO ${sql(schemaName)}."versionHistory" ${sql(versions)}
|
|
123
|
+
ON CONFLICT (lock) DO UPDATE SET ${sql(versions)}
|
|
124
|
+
`;
|
|
125
|
+
return versions;
|
|
110
126
|
}
|
|
111
|
-
async function
|
|
112
|
-
if (
|
|
113
|
-
await migration.
|
|
127
|
+
async function runMigration(log, schemaName, tx, versions, destinationVersion, migration) {
|
|
128
|
+
if (versions.schemaVersion < destinationVersion) {
|
|
129
|
+
await migration.migrateSchema?.(log, tx);
|
|
114
130
|
}
|
|
115
|
-
|
|
116
|
-
|
|
131
|
+
if (versions.dataVersion < destinationVersion) {
|
|
132
|
+
await migration.migrateData?.(log, tx);
|
|
117
133
|
}
|
|
118
|
-
return
|
|
134
|
+
return updateVersionHistory(log, tx, schemaName, versions, destinationVersion, migration.minSafeVersion);
|
|
119
135
|
}
|
|
120
136
|
/**
|
|
121
137
|
* Bumps the rollback limit [[toAtLeast]] the specified version.
|
|
122
138
|
* Leaves the rollback limit unchanged if it is equal or greater.
|
|
123
139
|
*/
|
|
124
|
-
function
|
|
140
|
+
function getMinSafeVersion(log, current, proposedSafeVersion) {
|
|
141
|
+
if (proposedSafeVersion === undefined) {
|
|
142
|
+
return current.minSafeVersion;
|
|
143
|
+
}
|
|
125
144
|
// Sanity check to maintain the invariant that running code is never
|
|
126
145
|
// earlier than the rollback limit.
|
|
127
|
-
assert(
|
|
128
|
-
if (
|
|
146
|
+
assert(proposedSafeVersion <= current.dataVersion + 1);
|
|
147
|
+
if (current.minSafeVersion >= proposedSafeVersion) {
|
|
129
148
|
// The rollback limit must never move backwards.
|
|
130
|
-
log.debug?.(`rollback limit is already at ${
|
|
131
|
-
|
|
149
|
+
log.debug?.(`rollback limit is already at ${current.minSafeVersion}, ` +
|
|
150
|
+
`don't need to bump to ${proposedSafeVersion}`);
|
|
151
|
+
return current.minSafeVersion;
|
|
132
152
|
}
|
|
133
|
-
log.info?.(`bumping rollback limit from ${
|
|
134
|
-
return
|
|
135
|
-
...meta,
|
|
136
|
-
minSafeRollbackVersion: toAtLeast,
|
|
137
|
-
};
|
|
153
|
+
log.info?.(`bumping rollback limit from ${current.minSafeVersion} to ${proposedSafeVersion}`);
|
|
154
|
+
return proposedSafeVersion;
|
|
138
155
|
}
|
|
139
156
|
//# sourceMappingURL=migration.js.map
|