@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
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { initBgIntervalProcess } from '../bg-interval.js';
|
|
2
|
+
import { withWrite } from '../with-transactions.js';
|
|
3
|
+
import { getClients, setClients } from './clients.js';
|
|
4
|
+
/**
|
|
5
|
+
* The maximum time a client can be inactive before it is garbage collected.
|
|
6
|
+
* This means that this is the maximum time a tab can be in the background
|
|
7
|
+
* (frozen) and still be able to sync when it comes back to the foreground.
|
|
8
|
+
*/
|
|
9
|
+
export const CLIENT_MAX_INACTIVE_TIME = 24 * 60 * 60 * 1000; // 24 hours
|
|
10
|
+
/**
|
|
11
|
+
* How frequently to try to garbage collect clients.
|
|
12
|
+
*/
|
|
13
|
+
export const GC_INTERVAL = 5 * 60 * 1000; // 5 minutes
|
|
14
|
+
let latestGCUpdate;
|
|
15
|
+
export function getLatestGCUpdate() {
|
|
16
|
+
return latestGCUpdate;
|
|
17
|
+
}
|
|
18
|
+
export function initClientGC(clientID, dagStore, clientMaxInactiveTime, gcInterval, lc, signal) {
|
|
19
|
+
initBgIntervalProcess('ClientGC', () => {
|
|
20
|
+
latestGCUpdate = gcClients(clientID, dagStore, clientMaxInactiveTime);
|
|
21
|
+
return latestGCUpdate;
|
|
22
|
+
}, () => gcInterval, lc, signal);
|
|
23
|
+
}
|
|
24
|
+
function gcClients(clientID, dagStore, clientMaxInactiveTime) {
|
|
25
|
+
return withWrite(dagStore, async (dagWrite) => {
|
|
26
|
+
const now = Date.now();
|
|
27
|
+
const clients = await getClients(dagWrite);
|
|
28
|
+
const clientsAfterGC = Array.from(clients).filter(([id, client]) => id === clientID /* never collect ourself */ ||
|
|
29
|
+
now - client.heartbeatTimestampMs <= clientMaxInactiveTime);
|
|
30
|
+
if (clientsAfterGC.length === clients.size) {
|
|
31
|
+
return clients;
|
|
32
|
+
}
|
|
33
|
+
const newClients = new Map(clientsAfterGC);
|
|
34
|
+
await setClients(newClients, dagWrite);
|
|
35
|
+
return newClients;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=client-gc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-gc.js","sourceRoot":"","sources":["../../../../../replicache/src/persist/client-gc.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AAGxD,OAAO,EAAC,SAAS,EAAC,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAiB,UAAU,EAAE,UAAU,EAAC,MAAM,cAAc,CAAC;AAEpE;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;AAExE;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAEtD,IAAI,cAA8C,CAAC;AACnD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAAkB,EAClB,QAAe,EACf,qBAA6B,EAC7B,UAAkB,EAClB,EAAc,EACd,MAAmB;IAEnB,qBAAqB,CACnB,UAAU,EACV,GAAG,EAAE;QACH,cAAc,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;QACtE,OAAO,cAAc,CAAC;IACxB,CAAC,EACD,GAAG,EAAE,CAAC,UAAU,EAChB,EAAE,EACF,MAAM,CACP,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAChB,QAAkB,EAClB,QAAe,EACf,qBAA6B;IAE7B,OAAO,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAC,QAAQ,EAAC,EAAE;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAC/C,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CACf,EAAE,KAAK,QAAQ,CAAC,2BAA2B;YAC3C,GAAG,GAAG,MAAM,CAAC,oBAAoB,IAAI,qBAAqB,CAC7D,CAAC;QACF,IAAI,cAAc,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC;YAC3C,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACvC,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { initBgIntervalProcess } from '../bg-interval.js';
|
|
2
|
+
import { withWrite } from '../with-transactions.js';
|
|
3
|
+
import { clientGroupHasPendingMutations, getClientGroups, setClientGroups, } from './client-groups.js';
|
|
4
|
+
import { assertClientV6, getClients } from './clients.js';
|
|
5
|
+
const GC_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
|
|
6
|
+
let latestGCUpdate;
|
|
7
|
+
export function getLatestGCUpdate() {
|
|
8
|
+
return latestGCUpdate;
|
|
9
|
+
}
|
|
10
|
+
export function initClientGroupGC(dagStore, lc, signal) {
|
|
11
|
+
initBgIntervalProcess('ClientGroupGC', () => {
|
|
12
|
+
latestGCUpdate = gcClientGroups(dagStore);
|
|
13
|
+
return latestGCUpdate;
|
|
14
|
+
}, () => GC_INTERVAL_MS, lc, signal);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* This removes client groups that have no clients and no pending mutations.
|
|
18
|
+
*/
|
|
19
|
+
export function gcClientGroups(dagStore) {
|
|
20
|
+
return withWrite(dagStore, async (tx) => {
|
|
21
|
+
const clients = await getClients(tx);
|
|
22
|
+
const clientGroupIDs = new Set();
|
|
23
|
+
for (const client of clients.values()) {
|
|
24
|
+
assertClientV6(client);
|
|
25
|
+
clientGroupIDs.add(client.clientGroupID);
|
|
26
|
+
}
|
|
27
|
+
const clientGroups = new Map();
|
|
28
|
+
for (const [clientGroupID, clientGroup] of await getClientGroups(tx)) {
|
|
29
|
+
if (clientGroupIDs.has(clientGroupID) ||
|
|
30
|
+
clientGroupHasPendingMutations(clientGroup)) {
|
|
31
|
+
clientGroups.set(clientGroupID, clientGroup);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
await setClientGroups(clientGroups, tx);
|
|
35
|
+
return clientGroups;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=client-group-gc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-group-gc.js","sourceRoot":"","sources":["../../../../../replicache/src/persist/client-group-gc.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAC,SAAS,EAAC,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAEL,8BAA8B,EAC9B,eAAe,EACf,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,cAAc,EAAE,UAAU,EAAC,MAAM,cAAc,CAAC;AAExD,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAElD,IAAI,cAAmD,CAAC;AACxD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAAe,EACf,EAAc,EACd,MAAmB;IAEnB,qBAAqB,CACnB,eAAe,EACf,GAAG,EAAE;QACH,cAAc,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,cAAc,CAAC;IACxB,CAAC,EACD,GAAG,EAAE,CAAC,cAAc,EACpB,EAAE,EACF,MAAM,CACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAe;IAC5C,OAAO,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAC,EAAE,EAAC,EAAE;QACpC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;QACjC,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,cAAc,CAAC,MAAM,CAAC,CAAC;YACvB,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,IAAI,MAAM,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC;YACrE,IACE,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC;gBACjC,8BAA8B,CAAC,WAAW,CAAC,EAC3C,CAAC;gBACD,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QACD,MAAM,eAAe,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACxC,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { assert, assertObject } from '../../../shared/src/asserts.js';
|
|
2
|
+
import * as valita from '../../../shared/src/valita.js';
|
|
3
|
+
import { toRefs } from '../dag/chunk.js';
|
|
4
|
+
import { deepFreeze } from '../frozen-json.js';
|
|
5
|
+
import { hashSchema } from '../hash.js';
|
|
6
|
+
import { indexDefinitionsEqual, indexDefinitionsSchema } from '../index-defs.js';
|
|
7
|
+
const clientGroupSchema = valita.readonlyObject({
|
|
8
|
+
/**
|
|
9
|
+
* The hash of the commit in the perdag last persisted to this client group.
|
|
10
|
+
* Should only be updated by clients assigned to this client group.
|
|
11
|
+
*/
|
|
12
|
+
headHash: hashSchema,
|
|
13
|
+
/**
|
|
14
|
+
* Set of mutator names common to all clients assigned to this client group.
|
|
15
|
+
*/
|
|
16
|
+
mutatorNames: valita.readonlyArray(valita.string()),
|
|
17
|
+
/**
|
|
18
|
+
* Index definitions common to all clients assigned to this client group.
|
|
19
|
+
*/
|
|
20
|
+
indexes: indexDefinitionsSchema,
|
|
21
|
+
/**
|
|
22
|
+
* The highest mutation ID of every client assigned to this client group.
|
|
23
|
+
* Should only be updated by clients assigned to this client group. Read by
|
|
24
|
+
* other clients to determine if there are unacknowledged pending mutations
|
|
25
|
+
* for them to try to recover. This is redundant with information in the
|
|
26
|
+
* commit graph at `headHash`, but allows other clients to determine if there
|
|
27
|
+
* are unacknowledged pending mutations without having to load the commit
|
|
28
|
+
* graph.
|
|
29
|
+
*/
|
|
30
|
+
mutationIDs: valita.readonlyRecord(valita.number()),
|
|
31
|
+
/**
|
|
32
|
+
* The highest lastMutationID received from the server for every client
|
|
33
|
+
* assigned to this client group.
|
|
34
|
+
*
|
|
35
|
+
* Should be updated by the clients assigned to this client group whenever
|
|
36
|
+
* they persist to this client group. Read by other clients to determine if
|
|
37
|
+
* there are unacknowledged pending mutations for them to recover and
|
|
38
|
+
* *updated* by other clients upon successfully recovering pending mutations
|
|
39
|
+
* to avoid redundant pushes of pending mutations.
|
|
40
|
+
*
|
|
41
|
+
* Note: This will be the same as the `lastMutationIDs` of the base snapshot
|
|
42
|
+
* of the client group's commit graph when written by clients assigned to this
|
|
43
|
+
* client group. However, when written by another client recovering mutations
|
|
44
|
+
* it may be different because the other client does not update the commit
|
|
45
|
+
* graph.
|
|
46
|
+
*/
|
|
47
|
+
lastServerAckdMutationIDs: valita.record(valita.number()),
|
|
48
|
+
/**
|
|
49
|
+
* If the server deletes this client group it can signal that the client group
|
|
50
|
+
* was deleted. If that happens we mark this client group as disabled so that
|
|
51
|
+
* we do not use it again when creating new clients.
|
|
52
|
+
*/
|
|
53
|
+
disabled: valita.boolean(),
|
|
54
|
+
});
|
|
55
|
+
export const CLIENT_GROUPS_HEAD_NAME = 'client-groups';
|
|
56
|
+
function assertClientGroup(value) {
|
|
57
|
+
valita.assert(value, clientGroupSchema);
|
|
58
|
+
}
|
|
59
|
+
function chunkDataToClientGroupMap(chunkData) {
|
|
60
|
+
assertObject(chunkData);
|
|
61
|
+
const clientGroups = new Map();
|
|
62
|
+
for (const [key, value] of Object.entries(chunkData)) {
|
|
63
|
+
if (value !== undefined) {
|
|
64
|
+
assertClientGroup(value);
|
|
65
|
+
clientGroups.set(key, value);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return clientGroups;
|
|
69
|
+
}
|
|
70
|
+
function clientGroupMapToChunkData(clientGroups, dagWrite) {
|
|
71
|
+
const chunkData = {};
|
|
72
|
+
for (const [clientGroupID, clientGroup] of clientGroups.entries()) {
|
|
73
|
+
dagWrite.assertValidHash(clientGroup.headHash);
|
|
74
|
+
chunkData[clientGroupID] = {
|
|
75
|
+
...clientGroup,
|
|
76
|
+
mutatorNames: [...clientGroup.mutatorNames.values()],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return deepFreeze(chunkData);
|
|
80
|
+
}
|
|
81
|
+
async function getClientGroupsAtHash(hash, dagRead) {
|
|
82
|
+
const chunk = await dagRead.getChunk(hash);
|
|
83
|
+
return chunkDataToClientGroupMap(chunk?.data);
|
|
84
|
+
}
|
|
85
|
+
export async function getClientGroups(dagRead) {
|
|
86
|
+
const hash = await dagRead.getHead(CLIENT_GROUPS_HEAD_NAME);
|
|
87
|
+
if (!hash) {
|
|
88
|
+
return new Map();
|
|
89
|
+
}
|
|
90
|
+
return getClientGroupsAtHash(hash, dagRead);
|
|
91
|
+
}
|
|
92
|
+
export async function setClientGroups(clientGroups, dagWrite) {
|
|
93
|
+
const currClientGroups = await getClientGroups(dagWrite);
|
|
94
|
+
for (const [clientGroupID, clientGroup] of clientGroups) {
|
|
95
|
+
const currClientGroup = currClientGroups.get(clientGroupID);
|
|
96
|
+
validateClientGroupUpdate(clientGroup, currClientGroup);
|
|
97
|
+
}
|
|
98
|
+
return setValidatedClientGroups(clientGroups, dagWrite);
|
|
99
|
+
}
|
|
100
|
+
export async function setClientGroup(clientGroupID, clientGroup, dagWrite) {
|
|
101
|
+
const currClientGroups = await getClientGroups(dagWrite);
|
|
102
|
+
const currClientGroup = currClientGroups.get(clientGroupID);
|
|
103
|
+
validateClientGroupUpdate(clientGroup, currClientGroup);
|
|
104
|
+
const newClientGroups = new Map(currClientGroups);
|
|
105
|
+
newClientGroups.set(clientGroupID, clientGroup);
|
|
106
|
+
return setValidatedClientGroups(newClientGroups, dagWrite);
|
|
107
|
+
}
|
|
108
|
+
export async function deleteClientGroup(clientGroupID, dagWrite) {
|
|
109
|
+
const currClientGroups = await getClientGroups(dagWrite);
|
|
110
|
+
if (!currClientGroups.has(clientGroupID)) {
|
|
111
|
+
return currClientGroups;
|
|
112
|
+
}
|
|
113
|
+
const newClientGroups = new Map(currClientGroups.entries());
|
|
114
|
+
newClientGroups.delete(clientGroupID);
|
|
115
|
+
return setValidatedClientGroups(newClientGroups, dagWrite);
|
|
116
|
+
}
|
|
117
|
+
function validateClientGroupUpdate(clientGroup, currClientGroup) {
|
|
118
|
+
const mutatorNamesSet = new Set(clientGroup.mutatorNames);
|
|
119
|
+
assert(mutatorNamesSet.size === clientGroup.mutatorNames.length, "A client group's mutatorNames must be a set.");
|
|
120
|
+
if (currClientGroup !== undefined) {
|
|
121
|
+
assert(indexDefinitionsEqual(currClientGroup.indexes, clientGroup.indexes), "A client group's index definitions must never change.");
|
|
122
|
+
assert(mutatorNamesEqual(mutatorNamesSet, currClientGroup.mutatorNames), "A client group's mutatorNames must never change.");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async function setValidatedClientGroups(clientGroups, dagWrite) {
|
|
126
|
+
const chunkData = clientGroupMapToChunkData(clientGroups, dagWrite);
|
|
127
|
+
const refs = new Set();
|
|
128
|
+
for (const clientGroup of clientGroups.values()) {
|
|
129
|
+
refs.add(clientGroup.headHash);
|
|
130
|
+
}
|
|
131
|
+
const chunk = dagWrite.createChunk(chunkData, toRefs(refs));
|
|
132
|
+
await dagWrite.putChunk(chunk);
|
|
133
|
+
await dagWrite.setHead(CLIENT_GROUPS_HEAD_NAME, chunk.hash);
|
|
134
|
+
return clientGroups;
|
|
135
|
+
}
|
|
136
|
+
export function mutatorNamesEqual(mutatorNamesSet, mutatorNames) {
|
|
137
|
+
if (mutatorNames.length !== mutatorNamesSet.size) {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
for (const mutatorName of mutatorNames) {
|
|
141
|
+
if (!mutatorNamesSet.has(mutatorName)) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
export async function getClientGroup(id, dagRead) {
|
|
148
|
+
const clientGroups = await getClientGroups(dagRead);
|
|
149
|
+
return clientGroups.get(id);
|
|
150
|
+
}
|
|
151
|
+
export function clientGroupHasPendingMutations(clientGroup) {
|
|
152
|
+
for (const [clientID, mutationID] of Object.entries(clientGroup.mutationIDs)) {
|
|
153
|
+
const lastServerAckdMutationID = clientGroup.lastServerAckdMutationIDs[clientID];
|
|
154
|
+
if ((lastServerAckdMutationID === undefined && mutationID !== 0) ||
|
|
155
|
+
lastServerAckdMutationID < mutationID) {
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Marks a client group as disabled. This can happen if the server deletes the
|
|
163
|
+
* client group (servers should not delete clients or client groups but it often
|
|
164
|
+
* happens in practice when developing).
|
|
165
|
+
*
|
|
166
|
+
* A disabled client group prevents pulls and pushes from happening.
|
|
167
|
+
*/
|
|
168
|
+
export async function disableClientGroup(clientGroupID, dagWrite) {
|
|
169
|
+
const clientGroup = await getClientGroup(clientGroupID, dagWrite);
|
|
170
|
+
if (!clientGroup) {
|
|
171
|
+
// No client group matching in the database, so nothing to do.
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const disabledClientGroup = {
|
|
175
|
+
...clientGroup,
|
|
176
|
+
disabled: true,
|
|
177
|
+
};
|
|
178
|
+
await setClientGroup(clientGroupID, disabledClientGroup, dagWrite);
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=client-groups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-groups.js","sourceRoot":"","sources":["../../../../../replicache/src/persist/client-groups.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
import { assert, assertObject } from '../../../shared/src/asserts.js';
|
|
2
|
+
import { hasOwn } from '../../../shared/src/has-own.js';
|
|
3
|
+
import * as valita from '../../../shared/src/valita.js';
|
|
4
|
+
import { emptyDataNode } from '../btree/node.js';
|
|
5
|
+
import { BTreeRead } from '../btree/read.js';
|
|
6
|
+
import { compareCookies } from '../cookies.js';
|
|
7
|
+
import { toRefs } from '../dag/chunk.js';
|
|
8
|
+
import { Commit, assertSnapshotCommitDD31, baseSnapshotFromHash, chunkIndexDefinitionEqualIgnoreName, getRefs, newSnapshotCommitDataDD31, toChunkIndexDefinition, } from '../db/commit.js';
|
|
9
|
+
import { createIndexBTree } from '../db/write.js';
|
|
10
|
+
import { deepFreeze } from '../frozen-json.js';
|
|
11
|
+
import { hashSchema } from '../hash.js';
|
|
12
|
+
import { indexDefinitionsEqual } from '../index-defs.js';
|
|
13
|
+
import { clientGroupIDSchema, } from '../sync/ids.js';
|
|
14
|
+
import { withWriteNoImplicitCommit } from '../with-transactions.js';
|
|
15
|
+
import { getClientGroup, getClientGroups, mutatorNamesEqual, setClientGroup, } from './client-groups.js';
|
|
16
|
+
import { makeClientID } from './make-client-id.js';
|
|
17
|
+
const clientV4Schema = valita.readonlyObject({
|
|
18
|
+
/**
|
|
19
|
+
* A UNIX timestamp in milliseconds updated by the client once a minute
|
|
20
|
+
* while it is active and every time the client persists its state to
|
|
21
|
+
* the perdag.
|
|
22
|
+
* Should only be updated by the client represented by this structure.
|
|
23
|
+
*/
|
|
24
|
+
heartbeatTimestampMs: valita.number(),
|
|
25
|
+
/**
|
|
26
|
+
* The hash of the commit in the perdag this client last persisted.
|
|
27
|
+
* Should only be updated by the client represented by this structure.
|
|
28
|
+
*/
|
|
29
|
+
headHash: hashSchema,
|
|
30
|
+
/**
|
|
31
|
+
* The mutationID of the commit at headHash (mutationID if it is a
|
|
32
|
+
* local commit, lastMutationID if it is an index change or snapshot commit).
|
|
33
|
+
* Should only be updated by the client represented by this structure.
|
|
34
|
+
* Read by other clients to determine if there are unacknowledged pending
|
|
35
|
+
* mutations for them to push on behalf of the client represented by this
|
|
36
|
+
* structure.
|
|
37
|
+
* This is redundant with information in the commit graph at headHash,
|
|
38
|
+
* but allows other clients to determine if there are unacknowledged pending
|
|
39
|
+
* mutations without having to load the commit graph at headHash.
|
|
40
|
+
*/
|
|
41
|
+
mutationID: valita.number(),
|
|
42
|
+
/**
|
|
43
|
+
* The highest lastMutationID received from the server for this client.
|
|
44
|
+
*
|
|
45
|
+
* Should be updated by the client represented by this structure whenever
|
|
46
|
+
* it persists its state to the perdag.
|
|
47
|
+
* Read by other clients to determine if there are unacknowledged pending
|
|
48
|
+
* mutations for them to push on behalf of the client represented by this
|
|
49
|
+
* structure, and *updated* by other clients upon successfully pushing
|
|
50
|
+
* pending mutations to avoid redundant pushes of those mutations.
|
|
51
|
+
*
|
|
52
|
+
* Note: This will be the same as the lastMutationID of the base snapshot of
|
|
53
|
+
* the commit graph at headHash when written by the client represented by this
|
|
54
|
+
* structure. However, when written by another client pushing pending
|
|
55
|
+
* mutations on this client's behalf it will be different. This is because
|
|
56
|
+
* the other client does not update the commit graph (it is unsafe to update
|
|
57
|
+
* another client's commit graph).
|
|
58
|
+
*/
|
|
59
|
+
lastServerAckdMutationID: valita.number(),
|
|
60
|
+
});
|
|
61
|
+
const clientV5Schema = valita.readonlyObject({
|
|
62
|
+
heartbeatTimestampMs: valita.number(),
|
|
63
|
+
headHash: hashSchema,
|
|
64
|
+
/**
|
|
65
|
+
* The hash of a commit we are in the middle of refreshing into this client's
|
|
66
|
+
* memdag.
|
|
67
|
+
*/
|
|
68
|
+
tempRefreshHash: hashSchema.nullable(),
|
|
69
|
+
/**
|
|
70
|
+
* ID of this client's perdag client group. This needs to be sent in pull
|
|
71
|
+
* request (to enable syncing all last mutation ids in the client group).
|
|
72
|
+
*/
|
|
73
|
+
clientGroupID: clientGroupIDSchema,
|
|
74
|
+
});
|
|
75
|
+
const clientV6Schema = valita.readonlyObject({
|
|
76
|
+
heartbeatTimestampMs: valita.number(),
|
|
77
|
+
/**
|
|
78
|
+
* A set of hashes, which contains:
|
|
79
|
+
* 1. The hash of the last commit this client refreshed from its client group
|
|
80
|
+
* (this is the commit it bootstrapped from until it completes its first
|
|
81
|
+
* refresh).
|
|
82
|
+
* 2. One or more hashes that were added to retain chunks of a commit while it
|
|
83
|
+
* was being refreshed into this client's memdag. (This can be one or more
|
|
84
|
+
* because refresh's cleanup step is a separate transaction and can fail).
|
|
85
|
+
* Upon refresh completing and successfully running its clean up step, this
|
|
86
|
+
* set will contain a single hash: the hash of the last commit this client
|
|
87
|
+
* refreshed.
|
|
88
|
+
*/
|
|
89
|
+
refreshHashes: valita.readonlyArray(hashSchema),
|
|
90
|
+
/**
|
|
91
|
+
* The hash of the last snapshot commit persisted by this client to this
|
|
92
|
+
* client's client group, or null if has never persisted a snapshot.
|
|
93
|
+
*/
|
|
94
|
+
persistHash: hashSchema.nullable(),
|
|
95
|
+
/**
|
|
96
|
+
* ID of this client's perdag client group. This needs to be sent in pull
|
|
97
|
+
* request (to enable syncing all last mutation ids in the client group).
|
|
98
|
+
*/
|
|
99
|
+
clientGroupID: clientGroupIDSchema,
|
|
100
|
+
});
|
|
101
|
+
function isClientV6(client) {
|
|
102
|
+
return client.refreshHashes !== undefined;
|
|
103
|
+
}
|
|
104
|
+
function isClientV5(client) {
|
|
105
|
+
return client.clientGroupID !== undefined;
|
|
106
|
+
}
|
|
107
|
+
export function isClientV4(client) {
|
|
108
|
+
return client.lastServerAckdMutationID !== undefined;
|
|
109
|
+
}
|
|
110
|
+
export const CLIENTS_HEAD_NAME = 'clients';
|
|
111
|
+
const clientSchema = valita.union(clientV4Schema, clientV5Schema, clientV6Schema);
|
|
112
|
+
function assertClient(value) {
|
|
113
|
+
valita.assert(value, clientSchema);
|
|
114
|
+
}
|
|
115
|
+
export function assertClientV4(value) {
|
|
116
|
+
valita.assert(value, clientV4Schema);
|
|
117
|
+
}
|
|
118
|
+
export function assertClientV5(value) {
|
|
119
|
+
valita.assert(value, clientV5Schema);
|
|
120
|
+
}
|
|
121
|
+
export function assertClientV6(value) {
|
|
122
|
+
valita.assert(value, clientV6Schema);
|
|
123
|
+
}
|
|
124
|
+
function chunkDataToClientMap(chunkData) {
|
|
125
|
+
assertObject(chunkData);
|
|
126
|
+
const clients = new Map();
|
|
127
|
+
for (const key in chunkData) {
|
|
128
|
+
if (hasOwn(chunkData, key)) {
|
|
129
|
+
const value = chunkData[key];
|
|
130
|
+
if (value !== undefined) {
|
|
131
|
+
assertClient(value);
|
|
132
|
+
clients.set(key, value);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return clients;
|
|
137
|
+
}
|
|
138
|
+
function clientMapToChunkData(clients, dagWrite) {
|
|
139
|
+
for (const client of clients.values()) {
|
|
140
|
+
if (isClientV6(client)) {
|
|
141
|
+
client.refreshHashes.forEach(dagWrite.assertValidHash);
|
|
142
|
+
if (client.persistHash) {
|
|
143
|
+
dagWrite.assertValidHash(client.persistHash);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
dagWrite.assertValidHash(client.headHash);
|
|
148
|
+
if (isClientV5(client) && client.tempRefreshHash) {
|
|
149
|
+
dagWrite.assertValidHash(client.tempRefreshHash);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return deepFreeze(Object.fromEntries(clients));
|
|
154
|
+
}
|
|
155
|
+
export async function getClients(dagRead) {
|
|
156
|
+
const hash = await dagRead.getHead(CLIENTS_HEAD_NAME);
|
|
157
|
+
return getClientsAtHash(hash, dagRead);
|
|
158
|
+
}
|
|
159
|
+
async function getClientsAtHash(hash, dagRead) {
|
|
160
|
+
if (!hash) {
|
|
161
|
+
return new Map();
|
|
162
|
+
}
|
|
163
|
+
const chunk = await dagRead.getChunk(hash);
|
|
164
|
+
return chunkDataToClientMap(chunk?.data);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Used to signal that a client does not exist. Maybe it was garbage collected?
|
|
168
|
+
*/
|
|
169
|
+
export class ClientStateNotFoundError extends Error {
|
|
170
|
+
name = 'ClientStateNotFoundError';
|
|
171
|
+
id;
|
|
172
|
+
constructor(id) {
|
|
173
|
+
super(`Client state not found, id: ${id}`);
|
|
174
|
+
this.id = id;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Throws a `ClientStateNotFoundError` if the client does not exist.
|
|
179
|
+
*/
|
|
180
|
+
export async function assertHasClientState(id, dagRead) {
|
|
181
|
+
if (!(await hasClientState(id, dagRead))) {
|
|
182
|
+
throw new ClientStateNotFoundError(id);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
export async function hasClientState(id, dagRead) {
|
|
186
|
+
return !!(await getClient(id, dagRead));
|
|
187
|
+
}
|
|
188
|
+
export async function getClient(id, dagRead) {
|
|
189
|
+
const clients = await getClients(dagRead);
|
|
190
|
+
return clients.get(id);
|
|
191
|
+
}
|
|
192
|
+
export async function mustGetClient(id, dagRead) {
|
|
193
|
+
const client = await getClient(id, dagRead);
|
|
194
|
+
if (!client) {
|
|
195
|
+
throw new ClientStateNotFoundError(id);
|
|
196
|
+
}
|
|
197
|
+
return client;
|
|
198
|
+
}
|
|
199
|
+
export function initClientV6(newClientID, lc, perdag, mutatorNames, indexes, formatVersion, enableClientGroupForking) {
|
|
200
|
+
return withWriteNoImplicitCommit(perdag, async (dagWrite) => {
|
|
201
|
+
async function setClientsAndClientGroupAndCommit(basisHash, cookieJSON, valueHash, indexRecords) {
|
|
202
|
+
const newSnapshotData = newSnapshotCommitDataDD31(basisHash, {}, cookieJSON, valueHash, indexRecords);
|
|
203
|
+
const chunk = dagWrite.createChunk(newSnapshotData, getRefs(newSnapshotData));
|
|
204
|
+
const newClientGroupID = makeClientID();
|
|
205
|
+
const newClient = {
|
|
206
|
+
heartbeatTimestampMs: Date.now(),
|
|
207
|
+
refreshHashes: [chunk.hash],
|
|
208
|
+
persistHash: null,
|
|
209
|
+
clientGroupID: newClientGroupID,
|
|
210
|
+
};
|
|
211
|
+
const newClients = new Map(clients).set(newClientID, newClient);
|
|
212
|
+
const clientGroup = {
|
|
213
|
+
headHash: chunk.hash,
|
|
214
|
+
mutatorNames,
|
|
215
|
+
indexes,
|
|
216
|
+
mutationIDs: {},
|
|
217
|
+
lastServerAckdMutationIDs: {},
|
|
218
|
+
disabled: false,
|
|
219
|
+
};
|
|
220
|
+
await Promise.all([
|
|
221
|
+
dagWrite.putChunk(chunk),
|
|
222
|
+
setClients(newClients, dagWrite),
|
|
223
|
+
setClientGroup(newClientGroupID, clientGroup, dagWrite),
|
|
224
|
+
]);
|
|
225
|
+
await dagWrite.commit();
|
|
226
|
+
return [newClient, chunk.hash, newClients, true];
|
|
227
|
+
}
|
|
228
|
+
const clients = await getClients(dagWrite);
|
|
229
|
+
const res = await findMatchingClient(dagWrite, mutatorNames, indexes);
|
|
230
|
+
if (res.type === FIND_MATCHING_CLIENT_TYPE_HEAD) {
|
|
231
|
+
// We found a client group with matching mutators and indexes. We can
|
|
232
|
+
// reuse it.
|
|
233
|
+
const { clientGroupID, headHash } = res;
|
|
234
|
+
const newClient = {
|
|
235
|
+
clientGroupID,
|
|
236
|
+
refreshHashes: [headHash],
|
|
237
|
+
heartbeatTimestampMs: Date.now(),
|
|
238
|
+
persistHash: null,
|
|
239
|
+
};
|
|
240
|
+
const newClients = new Map(clients).set(newClientID, newClient);
|
|
241
|
+
await setClients(newClients, dagWrite);
|
|
242
|
+
await dagWrite.commit();
|
|
243
|
+
return [newClient, headHash, newClients, false];
|
|
244
|
+
}
|
|
245
|
+
if (!enableClientGroupForking ||
|
|
246
|
+
res.type === FIND_MATCHING_CLIENT_TYPE_NEW) {
|
|
247
|
+
// No client group to fork from. Create empty snapshot.
|
|
248
|
+
const emptyBTreeChunk = dagWrite.createChunk(emptyDataNode, []);
|
|
249
|
+
await dagWrite.putChunk(emptyBTreeChunk);
|
|
250
|
+
// Create indexes
|
|
251
|
+
const indexRecords = [];
|
|
252
|
+
// At this point the value of replicache is the empty tree so all index
|
|
253
|
+
// maps will also be the empty tree.
|
|
254
|
+
for (const [name, indexDefinition] of Object.entries(indexes)) {
|
|
255
|
+
const chunkIndexDefinition = toChunkIndexDefinition(name, indexDefinition);
|
|
256
|
+
indexRecords.push({
|
|
257
|
+
definition: chunkIndexDefinition,
|
|
258
|
+
valueHash: emptyBTreeChunk.hash,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
return setClientsAndClientGroupAndCommit(null, null, emptyBTreeChunk.hash, indexRecords);
|
|
262
|
+
}
|
|
263
|
+
// Now we create a new client and client group that we fork from the found
|
|
264
|
+
// snapshot.
|
|
265
|
+
assert(res.type === FIND_MATCHING_CLIENT_TYPE_FORK);
|
|
266
|
+
const { snapshot } = res;
|
|
267
|
+
// Create indexes
|
|
268
|
+
const indexRecords = [];
|
|
269
|
+
const { valueHash, indexes: oldIndexes } = snapshot;
|
|
270
|
+
const map = new BTreeRead(dagWrite, formatVersion, valueHash);
|
|
271
|
+
for (const [name, indexDefinition] of Object.entries(indexes)) {
|
|
272
|
+
const { prefix = '', jsonPointer, allowEmpty = false } = indexDefinition;
|
|
273
|
+
const chunkIndexDefinition = {
|
|
274
|
+
name,
|
|
275
|
+
keyPrefix: prefix,
|
|
276
|
+
jsonPointer,
|
|
277
|
+
allowEmpty,
|
|
278
|
+
};
|
|
279
|
+
const oldIndex = findMatchingOldIndex(oldIndexes, chunkIndexDefinition);
|
|
280
|
+
if (oldIndex) {
|
|
281
|
+
indexRecords.push({
|
|
282
|
+
definition: chunkIndexDefinition,
|
|
283
|
+
valueHash: oldIndex.valueHash,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
const indexBTree = await createIndexBTree(lc, dagWrite, map, prefix, jsonPointer, allowEmpty, formatVersion);
|
|
288
|
+
indexRecords.push({
|
|
289
|
+
definition: chunkIndexDefinition,
|
|
290
|
+
valueHash: await indexBTree.flush(),
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return setClientsAndClientGroupAndCommit(snapshot.meta.basisHash, snapshot.meta.cookieJSON, snapshot.valueHash, indexRecords);
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
function findMatchingOldIndex(oldIndexes, chunkIndexDefinition) {
|
|
298
|
+
return oldIndexes.find(index => chunkIndexDefinitionEqualIgnoreName(index.definition, chunkIndexDefinition));
|
|
299
|
+
}
|
|
300
|
+
export const FIND_MATCHING_CLIENT_TYPE_NEW = 0;
|
|
301
|
+
export const FIND_MATCHING_CLIENT_TYPE_FORK = 1;
|
|
302
|
+
export const FIND_MATCHING_CLIENT_TYPE_HEAD = 2;
|
|
303
|
+
export async function findMatchingClient(dagRead, mutatorNames, indexes) {
|
|
304
|
+
let newestCookie;
|
|
305
|
+
let bestSnapshot;
|
|
306
|
+
const mutatorNamesSet = new Set(mutatorNames);
|
|
307
|
+
const clientGroups = await getClientGroups(dagRead);
|
|
308
|
+
for (const [clientGroupID, clientGroup] of clientGroups) {
|
|
309
|
+
if (!clientGroup.disabled &&
|
|
310
|
+
mutatorNamesEqual(mutatorNamesSet, clientGroup.mutatorNames) &&
|
|
311
|
+
indexDefinitionsEqual(indexes, clientGroup.indexes)) {
|
|
312
|
+
// exact match
|
|
313
|
+
return {
|
|
314
|
+
type: FIND_MATCHING_CLIENT_TYPE_HEAD,
|
|
315
|
+
clientGroupID,
|
|
316
|
+
headHash: clientGroup.headHash,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
const clientGroupSnapshotCommit = await baseSnapshotFromHash(clientGroup.headHash, dagRead);
|
|
320
|
+
assertSnapshotCommitDD31(clientGroupSnapshotCommit);
|
|
321
|
+
const { cookieJSON } = clientGroupSnapshotCommit.meta;
|
|
322
|
+
if (newestCookie === undefined ||
|
|
323
|
+
compareCookies(cookieJSON, newestCookie) > 0) {
|
|
324
|
+
newestCookie = cookieJSON;
|
|
325
|
+
bestSnapshot = clientGroupSnapshotCommit;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
if (bestSnapshot) {
|
|
329
|
+
return {
|
|
330
|
+
type: FIND_MATCHING_CLIENT_TYPE_FORK,
|
|
331
|
+
snapshot: bestSnapshot,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
return { type: FIND_MATCHING_CLIENT_TYPE_NEW };
|
|
335
|
+
}
|
|
336
|
+
function getRefsForClients(clients) {
|
|
337
|
+
const refs = new Set();
|
|
338
|
+
for (const client of clients.values()) {
|
|
339
|
+
if (isClientV6(client)) {
|
|
340
|
+
for (const hash of client.refreshHashes) {
|
|
341
|
+
refs.add(hash);
|
|
342
|
+
}
|
|
343
|
+
if (client.persistHash) {
|
|
344
|
+
refs.add(client.persistHash);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
refs.add(client.headHash);
|
|
349
|
+
if (isClientV5(client) && client.tempRefreshHash) {
|
|
350
|
+
refs.add(client.tempRefreshHash);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
return toRefs(refs);
|
|
355
|
+
}
|
|
356
|
+
export async function getClientGroupForClient(clientID, read) {
|
|
357
|
+
const clientGroupID = await getClientGroupIDForClient(clientID, read);
|
|
358
|
+
if (!clientGroupID) {
|
|
359
|
+
return undefined;
|
|
360
|
+
}
|
|
361
|
+
return getClientGroup(clientGroupID, read);
|
|
362
|
+
}
|
|
363
|
+
export async function getClientGroupIDForClient(clientID, read) {
|
|
364
|
+
const client = await getClient(clientID, read);
|
|
365
|
+
if (!client || !isClientV5(client)) {
|
|
366
|
+
return undefined;
|
|
367
|
+
}
|
|
368
|
+
return client.clientGroupID;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Adds a Client to the ClientMap and updates the 'clients' head to point at
|
|
372
|
+
* the updated clients.
|
|
373
|
+
*/
|
|
374
|
+
export async function setClient(clientID, client, dagWrite) {
|
|
375
|
+
const clients = await getClients(dagWrite);
|
|
376
|
+
const newClients = new Map(clients).set(clientID, client);
|
|
377
|
+
return setClients(newClients, dagWrite);
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Sets the ClientMap and updates the 'clients' head top point at the new
|
|
381
|
+
* clients.
|
|
382
|
+
*/
|
|
383
|
+
export async function setClients(clients, dagWrite) {
|
|
384
|
+
const chunkData = clientMapToChunkData(clients, dagWrite);
|
|
385
|
+
const chunk = dagWrite.createChunk(chunkData, getRefsForClients(clients));
|
|
386
|
+
await dagWrite.putChunk(chunk);
|
|
387
|
+
await dagWrite.setHead(CLIENTS_HEAD_NAME, chunk.hash);
|
|
388
|
+
return chunk.hash;
|
|
389
|
+
}
|
|
390
|
+
//# sourceMappingURL=clients.js.map
|