@abloatai/humans 0.37.0
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/README.md +52 -0
- package/dist/Ablo.d.ts +208 -0
- package/dist/Ablo.js +120 -0
- package/dist/client.d.ts +317 -0
- package/dist/client.js +13 -0
- package/dist/core.d.ts +35 -0
- package/dist/core.js +48 -0
- package/dist/humans.d.ts +28 -0
- package/dist/humans.js +34 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +6 -0
- package/dist/local/BaseSyncedStore.d.ts +807 -0
- package/dist/local/BaseSyncedStore.js +1516 -0
- package/dist/local/Database.d.ts +322 -0
- package/dist/local/Database.js +1589 -0
- package/dist/local/InstanceCache.d.ts +255 -0
- package/dist/local/InstanceCache.js +1263 -0
- package/dist/local/LazyReferenceCollection.d.ts +177 -0
- package/dist/local/LazyReferenceCollection.js +461 -0
- package/dist/local/Model.d.ts +475 -0
- package/dist/local/Model.js +950 -0
- package/dist/local/ModelRegistry.d.ts +225 -0
- package/dist/local/ModelRegistry.js +539 -0
- package/dist/local/NetworkMonitor.d.ts +28 -0
- package/dist/local/NetworkMonitor.js +79 -0
- package/dist/local/RuntimeContext.d.ts +52 -0
- package/dist/local/RuntimeContext.js +80 -0
- package/dist/local/SyncClient.d.ts +516 -0
- package/dist/local/SyncClient.js +1754 -0
- package/dist/local/adapters/alwaysOnline.d.ts +14 -0
- package/dist/local/adapters/alwaysOnline.js +17 -0
- package/dist/local/adapters/inMemoryStorage.d.ts +37 -0
- package/dist/local/adapters/inMemoryStorage.js +122 -0
- package/dist/local/client/clientPrelude.d.ts +52 -0
- package/dist/local/client/clientPrelude.js +60 -0
- package/dist/local/client/consoleLogger.d.ts +35 -0
- package/dist/local/client/consoleLogger.js +44 -0
- package/dist/local/client/createInternalComponents.d.ts +50 -0
- package/dist/local/client/createInternalComponents.js +98 -0
- package/dist/local/client/createModelProxy.d.ts +248 -0
- package/dist/local/client/createModelProxy.js +880 -0
- package/dist/local/client/modelRegistration.d.ts +10 -0
- package/dist/local/client/modelRegistration.js +316 -0
- package/dist/local/client/options.d.ts +440 -0
- package/dist/local/client/options.js +7 -0
- package/dist/local/client/reactiveEngine.d.ts +53 -0
- package/dist/local/client/reactiveEngine.js +705 -0
- package/dist/local/client/resourceTypes.d.ts +12 -0
- package/dist/local/client/resourceTypes.js +10 -0
- package/dist/local/client/schemaConfig.d.ts +44 -0
- package/dist/local/client/schemaConfig.js +185 -0
- package/dist/local/client/storeCluster.d.ts +46 -0
- package/dist/local/client/storeCluster.js +133 -0
- package/dist/local/client/storeLifecycle.d.ts +61 -0
- package/dist/local/client/storeLifecycle.js +236 -0
- package/dist/local/client/validateAbloOptions.d.ts +42 -0
- package/dist/local/client/validateAbloOptions.js +43 -0
- package/dist/local/client/wsMutationExecutor.d.ts +27 -0
- package/dist/local/client/wsMutationExecutor.js +72 -0
- package/dist/local/context.d.ts +42 -0
- package/dist/local/context.js +81 -0
- package/dist/local/coordination/ClaimLog.d.ts +26 -0
- package/dist/local/coordination/ClaimLog.js +32 -0
- package/dist/local/interfaces/index.d.ts +311 -0
- package/dist/local/interfaces/index.js +9 -0
- package/dist/local/localModelContract.d.ts +14 -0
- package/dist/local/localModelContract.js +1 -0
- package/dist/local/logPosition.d.ts +31 -0
- package/dist/local/logPosition.js +53 -0
- package/dist/local/mutationPersistence.d.ts +6 -0
- package/dist/local/mutationPersistence.js +1 -0
- package/dist/local/mutators/RecordingMutation.d.ts +36 -0
- package/dist/local/mutators/RecordingMutation.js +182 -0
- package/dist/local/mutators/Transaction.d.ts +40 -0
- package/dist/local/mutators/Transaction.js +58 -0
- package/dist/local/mutators/UndoManager.d.ts +258 -0
- package/dist/local/mutators/UndoManager.js +665 -0
- package/dist/local/mutators/defineMutators.d.ts +60 -0
- package/dist/local/mutators/defineMutators.js +18 -0
- package/dist/local/mutators/inverseOp.d.ts +126 -0
- package/dist/local/mutators/inverseOp.js +71 -0
- package/dist/local/mutators/mutateActions.d.ts +45 -0
- package/dist/local/mutators/mutateActions.js +105 -0
- package/dist/local/mutators/readerActions.d.ts +33 -0
- package/dist/local/mutators/readerActions.js +57 -0
- package/dist/local/mutators/undoApply.d.ts +51 -0
- package/dist/local/mutators/undoApply.js +117 -0
- package/dist/local/persistence.d.ts +7 -0
- package/dist/local/persistence.js +9 -0
- package/dist/local/query/QueryProcessor.d.ts +75 -0
- package/dist/local/query/QueryProcessor.js +255 -0
- package/dist/local/query/client.d.ts +64 -0
- package/dist/local/query/client.js +138 -0
- package/dist/local/query/types.d.ts +85 -0
- package/dist/local/query/types.js +16 -0
- package/dist/local/schema/serialize.d.ts +1 -0
- package/dist/local/schema/serialize.js +1 -0
- package/dist/local/store/queryApi.d.ts +13 -0
- package/dist/local/store/queryApi.js +35 -0
- package/dist/local/storeContract.d.ts +145 -0
- package/dist/local/storeContract.js +12 -0
- package/dist/local/stores/DatabaseManager.d.ts +112 -0
- package/dist/local/stores/DatabaseManager.js +400 -0
- package/dist/local/stores/ObjectStore.d.ts +115 -0
- package/dist/local/stores/ObjectStore.js +393 -0
- package/dist/local/stores/ObjectStoreContract.d.ts +38 -0
- package/dist/local/stores/ObjectStoreContract.js +1 -0
- package/dist/local/stores/StoreManager.d.ts +114 -0
- package/dist/local/stores/StoreManager.js +304 -0
- package/dist/local/stores/SyncActionStore.d.ts +99 -0
- package/dist/local/stores/SyncActionStore.js +506 -0
- package/dist/local/stores/openIDBWithTimeout.d.ts +65 -0
- package/dist/local/stores/openIDBWithTimeout.js +153 -0
- package/dist/local/stores/persistenceCleanup.d.ts +7 -0
- package/dist/local/stores/persistenceCleanup.js +26 -0
- package/dist/local/stores/persistenceIdentity.d.ts +27 -0
- package/dist/local/stores/persistenceIdentity.js +38 -0
- package/dist/local/stores/syncAction.d.ts +26 -0
- package/dist/local/stores/syncAction.js +16 -0
- package/dist/local/stores/v1PersistenceDeletion.d.ts +8 -0
- package/dist/local/stores/v1PersistenceDeletion.js +16 -0
- package/dist/local/sync/BootstrapFetcher.d.ts +284 -0
- package/dist/local/sync/BootstrapFetcher.js +964 -0
- package/dist/local/sync/ConnectionManager.d.ts +8 -0
- package/dist/local/sync/ConnectionManager.js +8 -0
- package/dist/local/sync/OnDemandLoader.d.ts +231 -0
- package/dist/local/sync/OnDemandLoader.js +743 -0
- package/dist/local/sync/SubscriptionManager.d.ts +159 -0
- package/dist/local/sync/SubscriptionManager.js +243 -0
- package/dist/local/sync/SyncWebSocket.d.ts +173 -0
- package/dist/local/sync/SyncWebSocket.js +438 -0
- package/dist/local/sync/bootstrapApply.d.ts +73 -0
- package/dist/local/sync/bootstrapApply.js +73 -0
- package/dist/local/sync/commitFrames.d.ts +8 -0
- package/dist/local/sync/commitFrames.js +8 -0
- package/dist/local/sync/connectionManagerLifecycle.d.ts +23 -0
- package/dist/local/sync/connectionManagerLifecycle.js +126 -0
- package/dist/local/sync/contextPorts.d.ts +18 -0
- package/dist/local/sync/contextPorts.js +31 -0
- package/dist/local/sync/createClaimStream.d.ts +64 -0
- package/dist/local/sync/createClaimStream.js +475 -0
- package/dist/local/sync/createSnapshot.d.ts +29 -0
- package/dist/local/sync/createSnapshot.js +116 -0
- package/dist/local/sync/credentialLifecycle.d.ts +7 -0
- package/dist/local/sync/credentialLifecycle.js +7 -0
- package/dist/local/sync/deltaPipeline.d.ts +116 -0
- package/dist/local/sync/deltaPipeline.js +357 -0
- package/dist/local/sync/groupChange.d.ts +116 -0
- package/dist/local/sync/groupChange.js +244 -0
- package/dist/local/sync/initialize.d.ts +27 -0
- package/dist/local/sync/initialize.js +137 -0
- package/dist/local/sync/participants.d.ts +132 -0
- package/dist/local/sync/participants.js +342 -0
- package/dist/local/sync/persistedPrefix.d.ts +12 -0
- package/dist/local/sync/persistedPrefix.js +22 -0
- package/dist/local/sync/reconnect.d.ts +23 -0
- package/dist/local/sync/reconnect.js +55 -0
- package/dist/local/sync/schemaDrift.d.ts +55 -0
- package/dist/local/sync/schemaDrift.js +53 -0
- package/dist/local/sync/schemas.d.ts +71 -0
- package/dist/local/sync/schemas.js +94 -0
- package/dist/local/sync/socketEventWiring.d.ts +31 -0
- package/dist/local/sync/socketEventWiring.js +130 -0
- package/dist/local/sync/syncCursor.d.ts +40 -0
- package/dist/local/sync/syncCursor.js +55 -0
- package/dist/local/sync/syncPlan.d.ts +54 -0
- package/dist/local/sync/syncPlan.js +50 -0
- package/dist/local/sync/terminalSessionLifecycle.d.ts +20 -0
- package/dist/local/sync/terminalSessionLifecycle.js +50 -0
- package/dist/local/sync/wsFrameHandlers.d.ts +8 -0
- package/dist/local/sync/wsFrameHandlers.js +8 -0
- package/dist/local/transactions/databaseCommitOutbox.d.ts +15 -0
- package/dist/local/transactions/databaseCommitOutbox.js +16 -0
- package/dist/local/transactions/localMutation.d.ts +10 -0
- package/dist/local/transactions/localMutation.js +37 -0
- package/dist/local/transactions/mutations/MutationQueue.d.ts +511 -0
- package/dist/local/transactions/mutations/MutationQueue.js +1498 -0
- package/dist/local/transactions/mutations/MutationStore.d.ts +20 -0
- package/dist/local/transactions/mutations/MutationStore.js +53 -0
- package/dist/local/transactions/mutations/UnconfirmedWrites.d.ts +82 -0
- package/dist/local/transactions/mutations/UnconfirmedWrites.js +104 -0
- package/dist/local/transactions/mutations/batchProcessing.d.ts +64 -0
- package/dist/local/transactions/mutations/batchProcessing.js +349 -0
- package/dist/local/transactions/mutations/coalesceRules.d.ts +58 -0
- package/dist/local/transactions/mutations/coalesceRules.js +140 -0
- package/dist/local/transactions/mutations/commitApi.d.ts +19 -0
- package/dist/local/transactions/mutations/commitApi.js +74 -0
- package/dist/local/transactions/mutations/commitLane.d.ts +70 -0
- package/dist/local/transactions/mutations/commitLane.js +140 -0
- package/dist/local/transactions/mutations/commitLatency.d.ts +52 -0
- package/dist/local/transactions/mutations/commitLatency.js +130 -0
- package/dist/local/transactions/mutations/commitPayload.d.ts +165 -0
- package/dist/local/transactions/mutations/commitPayload.js +152 -0
- package/dist/local/transactions/mutations/commitTransport.d.ts +36 -0
- package/dist/local/transactions/mutations/commitTransport.js +104 -0
- package/dist/local/transactions/mutations/deltaConfirmation.d.ts +63 -0
- package/dist/local/transactions/mutations/deltaConfirmation.js +235 -0
- package/dist/local/transactions/mutations/durableCommitRestore.d.ts +17 -0
- package/dist/local/transactions/mutations/durableCommitRestore.js +95 -0
- package/dist/local/transactions/mutations/durableWriteStore.d.ts +14 -0
- package/dist/local/transactions/mutations/durableWriteStore.js +12 -0
- package/dist/local/transactions/mutations/executionSelection.d.ts +6 -0
- package/dist/local/transactions/mutations/executionSelection.js +42 -0
- package/dist/local/transactions/mutations/failureHandling.d.ts +16 -0
- package/dist/local/transactions/mutations/failureHandling.js +130 -0
- package/dist/local/transactions/mutations/failurePolicy.d.ts +13 -0
- package/dist/local/transactions/mutations/failurePolicy.js +48 -0
- package/dist/local/transactions/mutations/localMutation.d.ts +58 -0
- package/dist/local/transactions/mutations/localMutation.js +75 -0
- package/dist/local/transactions/mutations/modelOperations.d.ts +44 -0
- package/dist/local/transactions/mutations/modelOperations.js +144 -0
- package/dist/local/transactions/mutations/mutationPersistence.d.ts +25 -0
- package/dist/local/transactions/mutations/mutationPersistence.js +188 -0
- package/dist/local/transactions/mutations/pendingDrain.d.ts +33 -0
- package/dist/local/transactions/mutations/pendingDrain.js +112 -0
- package/dist/local/transactions/mutations/processingScheduler.d.ts +14 -0
- package/dist/local/transactions/mutations/processingScheduler.js +24 -0
- package/dist/local/transactions/mutations/queueCoalescing.d.ts +13 -0
- package/dist/local/transactions/mutations/queueCoalescing.js +35 -0
- package/dist/local/transactions/mutations/replayValidation.d.ts +187 -0
- package/dist/local/transactions/mutations/replayValidation.js +164 -0
- package/dist/local/transactions/reconnectDrain.d.ts +11 -0
- package/dist/local/transactions/reconnectDrain.js +13 -0
- package/dist/local/utils/mobxSetup.d.ts +53 -0
- package/dist/local/utils/mobxSetup.js +330 -0
- package/dist/local/views/QueryView.d.ts +79 -0
- package/dist/local/views/QueryView.js +218 -0
- package/dist/local/views/ViewRegistry.d.ts +20 -0
- package/dist/local/views/ViewRegistry.js +57 -0
- package/dist/local/views/incrementalView.d.ts +45 -0
- package/dist/local/views/incrementalView.js +69 -0
- package/dist/plugin.d.ts +285 -0
- package/dist/plugin.js +106 -0
- package/dist/presenceStream.d.ts +69 -0
- package/dist/presenceStream.js +200 -0
- package/dist/react/AbloProvider.d.ts +242 -0
- package/dist/react/AbloProvider.js +456 -0
- package/dist/react/ClientSideSuspense.d.ts +36 -0
- package/dist/react/ClientSideSuspense.js +17 -0
- package/dist/react/DefaultFallback.d.ts +24 -0
- package/dist/react/DefaultFallback.js +43 -0
- package/dist/react/context.d.ts +55 -0
- package/dist/react/context.js +29 -0
- package/dist/react/createAbloReact.d.ts +50 -0
- package/dist/react/createAbloReact.js +48 -0
- package/dist/react/internalContext.d.ts +33 -0
- package/dist/react/internalContext.js +3 -0
- package/dist/react/useAblo.d.ts +96 -0
- package/dist/react/useAblo.js +120 -0
- package/dist/react/useCurrentUserId.d.ts +2 -0
- package/dist/react/useCurrentUserId.js +12 -0
- package/dist/react/useErrorListener.d.ts +2 -0
- package/dist/react/useErrorListener.js +14 -0
- package/dist/react/useMutationFailureListener.d.ts +8 -0
- package/dist/react/useMutationFailureListener.js +19 -0
- package/dist/react/useMutators.d.ts +56 -0
- package/dist/react/useMutators.js +84 -0
- package/dist/react/useSyncStatus.d.ts +19 -0
- package/dist/react/useSyncStatus.js +37 -0
- package/dist/react/useUndoScope.d.ts +34 -0
- package/dist/react/useUndoScope.js +73 -0
- package/dist/react.d.ts +18 -0
- package/dist/react.js +14 -0
- package/dist/reactRuntime.d.ts +4 -0
- package/dist/reactRuntime.js +2 -0
- package/dist/surface.d.ts +36 -0
- package/dist/surface.js +77 -0
- package/dist/useReactive.d.ts +6 -0
- package/dist/useReactive.js +43 -0
- package/package.json +119 -0
- package/src/Ablo.ts +456 -0
- package/src/client.ts +374 -0
- package/src/core.ts +104 -0
- package/src/humans.ts +61 -0
- package/src/index.ts +40 -0
- package/src/local/BaseSyncedStore.ts +1991 -0
- package/src/local/Database.ts +2052 -0
- package/src/local/InstanceCache.ts +1503 -0
- package/src/local/LazyReferenceCollection.ts +563 -0
- package/src/local/Model.ts +1124 -0
- package/src/local/ModelRegistry.ts +762 -0
- package/src/local/NetworkMonitor.ts +88 -0
- package/src/local/RuntimeContext.ts +141 -0
- package/src/local/SyncClient.ts +2131 -0
- package/src/local/adapters/alwaysOnline.ts +20 -0
- package/src/local/adapters/inMemoryStorage.ts +141 -0
- package/src/local/client/clientPrelude.ts +112 -0
- package/src/local/client/consoleLogger.ts +60 -0
- package/src/local/client/createInternalComponents.ts +163 -0
- package/src/local/client/createModelProxy.ts +1390 -0
- package/src/local/client/modelRegistration.ts +350 -0
- package/src/local/client/options.ts +526 -0
- package/src/local/client/reactiveEngine.ts +935 -0
- package/src/local/client/resourceTypes.ts +37 -0
- package/src/local/client/schemaConfig.ts +194 -0
- package/src/local/client/storeCluster.ts +172 -0
- package/src/local/client/storeLifecycle.ts +343 -0
- package/src/local/client/validateAbloOptions.ts +95 -0
- package/src/local/client/wsMutationExecutor.ts +110 -0
- package/src/local/context.ts +96 -0
- package/src/local/coordination/ClaimLog.ts +39 -0
- package/src/local/interfaces/index.ts +468 -0
- package/src/local/localModelContract.ts +15 -0
- package/src/local/logPosition.ts +84 -0
- package/src/local/mutationPersistence.ts +7 -0
- package/src/local/mutators/RecordingMutation.ts +222 -0
- package/src/local/mutators/Transaction.ts +97 -0
- package/src/local/mutators/UndoManager.ts +741 -0
- package/src/local/mutators/defineMutators.ts +76 -0
- package/src/local/mutators/inverseOp.ts +83 -0
- package/src/local/mutators/mutateActions.ts +167 -0
- package/src/local/mutators/readerActions.ts +99 -0
- package/src/local/mutators/undoApply.ts +141 -0
- package/src/local/persistence.ts +16 -0
- package/src/local/query/QueryProcessor.ts +347 -0
- package/src/local/query/client.ts +197 -0
- package/src/local/query/types.ts +102 -0
- package/src/local/schema/serialize.ts +1 -0
- package/src/local/store/queryApi.ts +56 -0
- package/src/local/storeContract.ts +146 -0
- package/src/local/stores/DatabaseManager.ts +507 -0
- package/src/local/stores/ObjectStore.ts +449 -0
- package/src/local/stores/ObjectStoreContract.ts +48 -0
- package/src/local/stores/StoreManager.ts +388 -0
- package/src/local/stores/SyncActionStore.ts +579 -0
- package/src/local/stores/openIDBWithTimeout.ts +195 -0
- package/src/local/stores/persistenceCleanup.ts +43 -0
- package/src/local/stores/persistenceIdentity.ts +83 -0
- package/src/local/stores/syncAction.ts +21 -0
- package/src/local/stores/v1PersistenceDeletion.ts +21 -0
- package/src/local/sync/BootstrapFetcher.ts +1224 -0
- package/src/local/sync/ConnectionManager.ts +15 -0
- package/src/local/sync/OnDemandLoader.ts +927 -0
- package/src/local/sync/SubscriptionManager.ts +300 -0
- package/src/local/sync/SyncWebSocket.ts +584 -0
- package/src/local/sync/bootstrapApply.ts +130 -0
- package/src/local/sync/commitFrames.ts +16 -0
- package/src/local/sync/connectionManagerLifecycle.ts +158 -0
- package/src/local/sync/contextPorts.ts +37 -0
- package/src/local/sync/createClaimStream.ts +668 -0
- package/src/local/sync/createSnapshot.ts +160 -0
- package/src/local/sync/credentialLifecycle.ts +18 -0
- package/src/local/sync/deltaPipeline.ts +473 -0
- package/src/local/sync/groupChange.ts +343 -0
- package/src/local/sync/initialize.ts +205 -0
- package/src/local/sync/participants.ts +564 -0
- package/src/local/sync/persistedPrefix.ts +27 -0
- package/src/local/sync/reconnect.ts +88 -0
- package/src/local/sync/schemaDrift.ts +86 -0
- package/src/local/sync/schemas.ts +118 -0
- package/src/local/sync/socketEventWiring.ts +196 -0
- package/src/local/sync/syncCursor.ts +62 -0
- package/src/local/sync/syncPlan.ts +89 -0
- package/src/local/sync/terminalSessionLifecycle.ts +66 -0
- package/src/local/sync/wsFrameHandlers.ts +20 -0
- package/src/local/transactions/databaseCommitOutbox.ts +33 -0
- package/src/local/transactions/localMutation.ts +58 -0
- package/src/local/transactions/mutations/MutationQueue.ts +1998 -0
- package/src/local/transactions/mutations/MutationStore.ts +65 -0
- package/src/local/transactions/mutations/UnconfirmedWrites.ts +133 -0
- package/src/local/transactions/mutations/batchProcessing.ts +469 -0
- package/src/local/transactions/mutations/coalesceRules.ts +192 -0
- package/src/local/transactions/mutations/commitApi.ts +97 -0
- package/src/local/transactions/mutations/commitLane.ts +191 -0
- package/src/local/transactions/mutations/commitLatency.ts +164 -0
- package/src/local/transactions/mutations/commitPayload.ts +281 -0
- package/src/local/transactions/mutations/commitTransport.ts +174 -0
- package/src/local/transactions/mutations/deltaConfirmation.ts +298 -0
- package/src/local/transactions/mutations/durableCommitRestore.ts +128 -0
- package/src/local/transactions/mutations/durableWriteStore.ts +21 -0
- package/src/local/transactions/mutations/executionSelection.ts +42 -0
- package/src/local/transactions/mutations/failureHandling.ts +154 -0
- package/src/local/transactions/mutations/failurePolicy.ts +61 -0
- package/src/local/transactions/mutations/localMutation.ts +135 -0
- package/src/local/transactions/mutations/modelOperations.ts +210 -0
- package/src/local/transactions/mutations/mutationPersistence.ts +231 -0
- package/src/local/transactions/mutations/pendingDrain.ts +160 -0
- package/src/local/transactions/mutations/processingScheduler.ts +35 -0
- package/src/local/transactions/mutations/queueCoalescing.ts +45 -0
- package/src/local/transactions/mutations/replayValidation.ts +192 -0
- package/src/local/transactions/reconnectDrain.ts +24 -0
- package/src/local/utils/mobxSetup.ts +388 -0
- package/src/local/views/QueryView.ts +311 -0
- package/src/local/views/ViewRegistry.ts +61 -0
- package/src/local/views/incrementalView.ts +92 -0
- package/src/plugin.ts +396 -0
- package/src/presenceStream.ts +279 -0
- package/src/react/AbloProvider.tsx +744 -0
- package/src/react/ClientSideSuspense.tsx +57 -0
- package/src/react/DefaultFallback.tsx +60 -0
- package/src/react/context.ts +89 -0
- package/src/react/createAbloReact.ts +116 -0
- package/src/react/internalContext.ts +38 -0
- package/src/react/useAblo.ts +280 -0
- package/src/react/useCurrentUserId.ts +17 -0
- package/src/react/useErrorListener.ts +22 -0
- package/src/react/useMutationFailureListener.ts +34 -0
- package/src/react/useMutators.ts +184 -0
- package/src/react/useSyncStatus.ts +42 -0
- package/src/react/useUndoScope.ts +143 -0
- package/src/react.ts +69 -0
- package/src/reactRuntime.ts +10 -0
- package/src/surface.ts +106 -0
- package/src/useReactive.ts +51 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manages the client-side IndexedDB databases the sync engine keeps in the
|
|
3
|
+
* browser. There are two tiers. A single registry database, `ablo_databases`,
|
|
4
|
+
* records metadata about every workspace database. Each user-and-workspace pair
|
|
5
|
+
* then gets its own data database, named `ablo_<hash>`, that holds the synced
|
|
6
|
+
* rows. {@link DatabaseManager} creates, versions, and deletes both tiers.
|
|
7
|
+
*/
|
|
8
|
+
import { globalRuntime } from '../context.js';
|
|
9
|
+
import { openIDBWithTimeout, deleteIDBWithTimeout, IDBOpenTimeoutError, } from './openIDBWithTimeout.js';
|
|
10
|
+
import { AbloConnectionError } from '@abloatai/transaction/errors';
|
|
11
|
+
import { getActiveRegistry, hasActiveRegistry } from '../ModelRegistry.js';
|
|
12
|
+
import { PERSISTENCE_NAMESPACE_VERSION, persistenceDatabaseName, persistenceIdentityMatches, } from './persistenceIdentity.js';
|
|
13
|
+
function indexedDbError(error, operation) {
|
|
14
|
+
return error ?? new Error(`IndexedDB ${operation} failed`);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* DatabaseManager - Manages Ablo's two-tier database architecture
|
|
18
|
+
*
|
|
19
|
+
* Key responsibilities:
|
|
20
|
+
* - Manages ablo_databases (database registry)
|
|
21
|
+
* - Creates workspace-specific databases (ablo_hash)
|
|
22
|
+
* - Handles database migration and versioning
|
|
23
|
+
* - Provides database info and metadata management
|
|
24
|
+
*/
|
|
25
|
+
export class DatabaseManager {
|
|
26
|
+
runtime;
|
|
27
|
+
metaDb = null;
|
|
28
|
+
metaDbName = 'ablo_databases';
|
|
29
|
+
constructor(runtime = globalRuntime) {
|
|
30
|
+
this.runtime = runtime;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Initialize the meta database (ablo_databases)
|
|
34
|
+
*/
|
|
35
|
+
async initializeMetaDatabase() {
|
|
36
|
+
const open = () => openIDBWithTimeout(this.metaDbName, 1, {
|
|
37
|
+
onUpgrade: (request) => {
|
|
38
|
+
const db = request.result;
|
|
39
|
+
if (!db.objectStoreNames.contains('databases')) {
|
|
40
|
+
const store = db.createObjectStore('databases', { keyPath: 'name' });
|
|
41
|
+
store.createIndex('userId', 'userId');
|
|
42
|
+
store.createIndex('workspaceId', 'workspaceId');
|
|
43
|
+
store.createIndex('schemaHash', 'schemaHash');
|
|
44
|
+
store.createIndex('updatedAt', 'updatedAt');
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
try {
|
|
49
|
+
this.metaDb = await open();
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
// Self-heal a wedged meta DB. When `ablo_databases`'s backing store gets
|
|
53
|
+
// stuck (a corrupted store, or a leaked connection from a prior
|
|
54
|
+
// timed-out open), every open of that name hangs with no event and the
|
|
55
|
+
// app is permanently bricked until the user manually clears site data —
|
|
56
|
+
// the "open did not resolve within 10000ms" dead end. The registry this
|
|
57
|
+
// DB holds is rebuildable from the server on the next bootstrap, so it is
|
|
58
|
+
// safe to delete and re-create. Try exactly once: delete, then re-open.
|
|
59
|
+
if (!(error instanceof IDBOpenTimeoutError))
|
|
60
|
+
throw error;
|
|
61
|
+
this.runtime.logger.debug('[sync-engine] meta DB open timed out — attempting self-heal (delete + retry)', { db: this.metaDbName, reason: error.reason });
|
|
62
|
+
this.runtime.observability.captureBootstrapFailure(error, {
|
|
63
|
+
type: 'meta-db-open-timeout',
|
|
64
|
+
});
|
|
65
|
+
const deleted = await deleteIDBWithTimeout(this.metaDbName);
|
|
66
|
+
if (!deleted) {
|
|
67
|
+
// The delete itself was blocked/stuck — a live connection in another
|
|
68
|
+
// window or a deadlocked backing store. We cannot recover in-page;
|
|
69
|
+
// rethrow so the provider surfaces the real (now actionable) error.
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
// Fresh store — this open creates `ablo_databases` from scratch.
|
|
73
|
+
this.metaDb = await open();
|
|
74
|
+
this.runtime.logger.info('[sync-engine] meta DB self-heal succeeded');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Calculate database info for a user/workspace combination
|
|
79
|
+
*/
|
|
80
|
+
async calculateDatabaseInfo(identity, userVersion = 1) {
|
|
81
|
+
// Get schema hash from the active ModelRegistry
|
|
82
|
+
const schemaHash = hasActiveRegistry()
|
|
83
|
+
? getActiveRegistry().getSchemaHash()
|
|
84
|
+
: 'no-registry-hash';
|
|
85
|
+
// Generate database name from userId, workspaceId, and versions
|
|
86
|
+
const dbName = await persistenceDatabaseName(identity, userVersion);
|
|
87
|
+
// Check if we need to increment schema version
|
|
88
|
+
const existingInfo = await this.getDatabaseInfo(dbName);
|
|
89
|
+
if (existingInfo && !persistenceIdentityMatches(existingInfo, identity)) {
|
|
90
|
+
throw new AbloConnectionError('Local database identity mismatch. Refusing to open persisted data ' +
|
|
91
|
+
'owned by a different authenticated plane.', { code: 'db_identity_mismatch' });
|
|
92
|
+
}
|
|
93
|
+
let schemaVersion = 1;
|
|
94
|
+
if (existingInfo && existingInfo.schemaHash !== schemaHash) {
|
|
95
|
+
schemaVersion = (existingInfo.schemaVersion || 1) + 1;
|
|
96
|
+
}
|
|
97
|
+
else if (existingInfo) {
|
|
98
|
+
schemaVersion = existingInfo.schemaVersion || 1;
|
|
99
|
+
}
|
|
100
|
+
// Record the existing databases for this user so duplicates can be detected.
|
|
101
|
+
const allUserDatabases = await this.getDatabasesForUser(identity.participantId);
|
|
102
|
+
const allIndexedDBs = (await indexedDB.databases?.()) || [];
|
|
103
|
+
const abloDatabases = allIndexedDBs.filter((db) => db.name?.startsWith('ablo_'));
|
|
104
|
+
this.runtime.observability.breadcrumb('Database info calculated', 'sync.database', 'info', {
|
|
105
|
+
dbName,
|
|
106
|
+
schemaVersion,
|
|
107
|
+
existingDbCount: allUserDatabases.length,
|
|
108
|
+
abloDbCount: abloDatabases.length,
|
|
109
|
+
});
|
|
110
|
+
return {
|
|
111
|
+
name: dbName,
|
|
112
|
+
namespaceVersion: PERSISTENCE_NAMESPACE_VERSION,
|
|
113
|
+
userId: identity.participantId,
|
|
114
|
+
workspaceId: identity.organizationId,
|
|
115
|
+
participantKind: identity.participantKind,
|
|
116
|
+
projectId: identity.projectId,
|
|
117
|
+
environment: identity.environment,
|
|
118
|
+
sandboxId: identity.sandboxId,
|
|
119
|
+
schemaHash,
|
|
120
|
+
schemaVersion,
|
|
121
|
+
userVersion,
|
|
122
|
+
createdAt: existingInfo?.createdAt ?? new Date(),
|
|
123
|
+
updatedAt: new Date(),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Register database info in ablo_databases
|
|
128
|
+
*/
|
|
129
|
+
async registerDatabase(info) {
|
|
130
|
+
const metaDb = this.metaDb;
|
|
131
|
+
if (!metaDb) {
|
|
132
|
+
throw new AbloConnectionError('Meta database not initialized', {
|
|
133
|
+
code: 'meta_db_not_initialized',
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return new Promise((resolve, reject) => {
|
|
137
|
+
const tx = metaDb.transaction(['databases'], 'readwrite');
|
|
138
|
+
const store = tx.objectStore('databases');
|
|
139
|
+
const request = store.put(info);
|
|
140
|
+
tx.oncomplete = () => {
|
|
141
|
+
resolve();
|
|
142
|
+
};
|
|
143
|
+
tx.onerror = () => { reject(indexedDbError(tx.error, 'registry transaction')); };
|
|
144
|
+
request.onerror = () => { reject(indexedDbError(request.error, 'registry write')); };
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get database info by name
|
|
149
|
+
*/
|
|
150
|
+
async getDatabaseInfo(name) {
|
|
151
|
+
const metaDb = this.metaDb;
|
|
152
|
+
if (!metaDb)
|
|
153
|
+
return null;
|
|
154
|
+
return new Promise((resolve, reject) => {
|
|
155
|
+
const tx = metaDb.transaction(['databases'], 'readonly');
|
|
156
|
+
const store = tx.objectStore('databases');
|
|
157
|
+
const request = store.get(name);
|
|
158
|
+
request.onsuccess = () => { resolve(request.result ?? null); };
|
|
159
|
+
request.onerror = () => { reject(indexedDbError(request.error, 'registry read')); };
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/** Remove only the named ownership records; the shared registry stays live. */
|
|
163
|
+
async unregisterDatabases(names) {
|
|
164
|
+
const metaDb = this.metaDb;
|
|
165
|
+
if (!metaDb || names.length === 0)
|
|
166
|
+
return;
|
|
167
|
+
return new Promise((resolve, reject) => {
|
|
168
|
+
const tx = metaDb.transaction(['databases'], 'readwrite');
|
|
169
|
+
const store = tx.objectStore('databases');
|
|
170
|
+
for (const name of new Set(names))
|
|
171
|
+
store.delete(name);
|
|
172
|
+
tx.oncomplete = () => { resolve(); };
|
|
173
|
+
tx.onerror = () => { reject(indexedDbError(tx.error, 'registry cleanup')); };
|
|
174
|
+
tx.onabort = () => { reject(indexedDbError(tx.error, 'registry cleanup')); };
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get all databases for a user
|
|
179
|
+
*/
|
|
180
|
+
async getDatabasesForUser(userId) {
|
|
181
|
+
const metaDb = this.metaDb;
|
|
182
|
+
if (!metaDb)
|
|
183
|
+
return [];
|
|
184
|
+
return new Promise((resolve, reject) => {
|
|
185
|
+
const tx = metaDb.transaction(['databases'], 'readonly');
|
|
186
|
+
const store = tx.objectStore('databases');
|
|
187
|
+
const index = store.index('userId');
|
|
188
|
+
const request = index.getAll(userId);
|
|
189
|
+
request.onsuccess = () => { resolve(request.result || []); };
|
|
190
|
+
request.onerror = () => { reject(indexedDbError(request.error, 'user database lookup')); };
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Open workspace-specific database
|
|
195
|
+
*/
|
|
196
|
+
async openWorkspaceDatabase(dbInfo, createStoresFn) {
|
|
197
|
+
try {
|
|
198
|
+
return await openIDBWithTimeout(dbInfo.name, dbInfo.schemaVersion, {
|
|
199
|
+
onUpgrade: (request, event) => {
|
|
200
|
+
const db = request.result;
|
|
201
|
+
const tx = event.target.transaction;
|
|
202
|
+
// IndexedDB rule: only awaits on IndexedDB requests keep an upgrade
|
|
203
|
+
// transaction alive. Any other await — a fetch, a timer — commits the
|
|
204
|
+
// transaction early, and later operations then throw
|
|
205
|
+
// `TransactionInactiveError`. StoreManager.createStores runs only
|
|
206
|
+
// synchronous createObjectStore / createIndex calls under an `async`
|
|
207
|
+
// keyword, so calling it without awaiting is safe here.
|
|
208
|
+
if (createStoresFn && tx) {
|
|
209
|
+
try {
|
|
210
|
+
void createStoresFn(db, tx).catch((err) => {
|
|
211
|
+
this.runtime.observability.captureBootstrapFailure(err, {
|
|
212
|
+
type: 'store-creation',
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
this.runtime.observability.captureBootstrapFailure(err, {
|
|
218
|
+
type: 'store-creation',
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
this.runtime.observability.captureBootstrapFailure(error, {
|
|
227
|
+
type: 'database-open',
|
|
228
|
+
});
|
|
229
|
+
throw error;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Read workspace metadata from __meta table
|
|
234
|
+
*/
|
|
235
|
+
async getWorkspaceMetadata(db) {
|
|
236
|
+
return new Promise((resolve, reject) => {
|
|
237
|
+
const tx = db.transaction(['__meta'], 'readonly');
|
|
238
|
+
const store = tx.objectStore('__meta');
|
|
239
|
+
const request = store.get('metadata');
|
|
240
|
+
request.onsuccess = () => {
|
|
241
|
+
const data = request.result;
|
|
242
|
+
if (!data) {
|
|
243
|
+
resolve(null);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
const meta = {
|
|
247
|
+
lastSyncId: data.lastSyncId ?? 0,
|
|
248
|
+
firstSyncId: data.firstSyncId ?? 0,
|
|
249
|
+
backendDatabaseVersion: data.backendDatabaseVersion ?? 1,
|
|
250
|
+
subscribedSyncGroups: data.subscribedSyncGroups ?? [],
|
|
251
|
+
updatedAt: data.updatedAt ? new Date(data.updatedAt) : new Date(),
|
|
252
|
+
schemaHash: data.schemaHash,
|
|
253
|
+
syncGroups: data.syncGroups,
|
|
254
|
+
// Older persisted records may still carry an extra `versions` key
|
|
255
|
+
// that is no longer used; it is tolerated by simply not reading it here.
|
|
256
|
+
};
|
|
257
|
+
resolve(meta);
|
|
258
|
+
};
|
|
259
|
+
request.onerror = () => { reject(indexedDbError(request.error, 'workspace metadata read')); };
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Write workspace metadata to __meta table
|
|
264
|
+
*/
|
|
265
|
+
async setWorkspaceMetadata(db, metadata) {
|
|
266
|
+
return new Promise((resolve, reject) => {
|
|
267
|
+
const tx = db.transaction(['__meta'], 'readwrite');
|
|
268
|
+
const store = tx.objectStore('__meta');
|
|
269
|
+
const request = store.put(metadata, 'metadata');
|
|
270
|
+
tx.oncomplete = () => { resolve(); };
|
|
271
|
+
tx.onerror = () => { reject(indexedDbError(tx.error, 'workspace metadata transaction')); };
|
|
272
|
+
request.onerror = () => { reject(indexedDbError(request.error, 'workspace metadata write')); };
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Check if a model is persisted (all instances loaded)
|
|
277
|
+
*/
|
|
278
|
+
async isModelPersisted(db, modelName) {
|
|
279
|
+
return new Promise((resolve, reject) => {
|
|
280
|
+
const tx = db.transaction(['__meta'], 'readonly');
|
|
281
|
+
const store = tx.objectStore('__meta');
|
|
282
|
+
const request = store.get(modelName);
|
|
283
|
+
request.onsuccess = () => {
|
|
284
|
+
const data = request.result;
|
|
285
|
+
resolve(data?.persisted === true);
|
|
286
|
+
};
|
|
287
|
+
request.onerror = () => { reject(indexedDbError(request.error, 'model persistence read')); };
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Mark a model as persisted
|
|
292
|
+
*/
|
|
293
|
+
async setModelPersisted(db, modelName, persisted) {
|
|
294
|
+
return new Promise((resolve, reject) => {
|
|
295
|
+
const tx = db.transaction(['__meta'], 'readwrite');
|
|
296
|
+
const store = tx.objectStore('__meta');
|
|
297
|
+
const persistenceData = {
|
|
298
|
+
persisted,
|
|
299
|
+
modelName,
|
|
300
|
+
timestamp: Date.now(),
|
|
301
|
+
updatedAt: new Date().toISOString(),
|
|
302
|
+
};
|
|
303
|
+
const request = store.put(persistenceData, modelName);
|
|
304
|
+
tx.oncomplete = () => { resolve(); };
|
|
305
|
+
tx.onerror = () => { reject(indexedDbError(tx.error, 'model persistence transaction')); };
|
|
306
|
+
request.onerror = () => { reject(indexedDbError(request.error, 'model persistence write')); };
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Get all model persistence states
|
|
311
|
+
*/
|
|
312
|
+
async getAllModelPersistenceStates(db) {
|
|
313
|
+
return new Promise((resolve, reject) => {
|
|
314
|
+
const tx = db.transaction(['__meta'], 'readonly');
|
|
315
|
+
const store = tx.objectStore('__meta');
|
|
316
|
+
const request = store.getAll();
|
|
317
|
+
request.onsuccess = () => {
|
|
318
|
+
const states = {};
|
|
319
|
+
for (const item of request.result) {
|
|
320
|
+
// Skip metadata entry
|
|
321
|
+
if (item.key === 'metadata')
|
|
322
|
+
continue;
|
|
323
|
+
if (item.modelName) {
|
|
324
|
+
states[item.modelName] = item.persisted === true;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
resolve(states);
|
|
328
|
+
};
|
|
329
|
+
request.onerror = () => { reject(indexedDbError(request.error, 'model persistence scan')); };
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Delete a workspace database
|
|
334
|
+
*/
|
|
335
|
+
async deleteWorkspaceDatabase(dbInfo) {
|
|
336
|
+
const deleted = await deleteIDBWithTimeout(dbInfo.name);
|
|
337
|
+
if (!deleted) {
|
|
338
|
+
this.runtime.observability.breadcrumb(`Database deletion failed or was blocked: ${dbInfo.name}`, 'sync.database', 'error');
|
|
339
|
+
return false;
|
|
340
|
+
}
|
|
341
|
+
if (this.metaDb) {
|
|
342
|
+
const metaDb = this.metaDb;
|
|
343
|
+
await new Promise((resolve, reject) => {
|
|
344
|
+
const tx = metaDb.transaction(['databases'], 'readwrite');
|
|
345
|
+
tx.objectStore('databases').delete(dbInfo.name);
|
|
346
|
+
tx.oncomplete = () => { resolve(); };
|
|
347
|
+
tx.onerror = () => { reject(indexedDbError(tx.error, 'registry delete')); };
|
|
348
|
+
tx.onabort = () => { reject(indexedDbError(tx.error, 'registry delete')); };
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
return true;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Get comprehensive database statistics
|
|
355
|
+
*/
|
|
356
|
+
async getDatabaseStatistics() {
|
|
357
|
+
const metaDb = this.metaDb;
|
|
358
|
+
if (!metaDb) {
|
|
359
|
+
return {
|
|
360
|
+
metaDatabaseSize: 0,
|
|
361
|
+
totalWorkspaceDatabases: 0,
|
|
362
|
+
databasesByUser: {},
|
|
363
|
+
schemaVersions: {},
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
return new Promise((resolve, reject) => {
|
|
367
|
+
const tx = metaDb.transaction(['databases'], 'readonly');
|
|
368
|
+
const store = tx.objectStore('databases');
|
|
369
|
+
const request = store.getAll();
|
|
370
|
+
request.onsuccess = () => {
|
|
371
|
+
const databases = request.result;
|
|
372
|
+
const databasesByUser = {};
|
|
373
|
+
const schemaVersions = {};
|
|
374
|
+
for (const db of databases) {
|
|
375
|
+
// Count by user
|
|
376
|
+
databasesByUser[db.userId] = (databasesByUser[db.userId] ?? 0) + 1;
|
|
377
|
+
// Count schema versions
|
|
378
|
+
const versionKey = `v${db.schemaVersion}`;
|
|
379
|
+
schemaVersions[versionKey] = (schemaVersions[versionKey] ?? 0) + 1;
|
|
380
|
+
}
|
|
381
|
+
resolve({
|
|
382
|
+
metaDatabaseSize: databases.length,
|
|
383
|
+
totalWorkspaceDatabases: databases.length,
|
|
384
|
+
databasesByUser,
|
|
385
|
+
schemaVersions,
|
|
386
|
+
});
|
|
387
|
+
};
|
|
388
|
+
request.onerror = () => { reject(indexedDbError(request.error, 'registry statistics read')); };
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Close all database connections
|
|
393
|
+
*/
|
|
394
|
+
async close() {
|
|
395
|
+
if (this.metaDb) {
|
|
396
|
+
this.metaDb.close();
|
|
397
|
+
this.metaDb = null;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The IndexedDB-backed object store: durable, per-model record storage for
|
|
3
|
+
* the browser. See {@link ObjectStore}.
|
|
4
|
+
*/
|
|
5
|
+
import type { ModelMetadata } from '@abloatai/transaction/types';
|
|
6
|
+
import type { ObjectStoreContract } from './ObjectStoreContract.js';
|
|
7
|
+
/**
|
|
8
|
+
* IDB transaction options type (TypeScript's lib.dom.d.ts may be outdated)
|
|
9
|
+
* durability: 'relaxed' provides ~16x write performance improvement
|
|
10
|
+
* by not requiring fsync on each transaction commit.
|
|
11
|
+
* Safe for optimistic sync engines that can recover from server state.
|
|
12
|
+
*/
|
|
13
|
+
interface IDBTransactionOptionsWithDurability {
|
|
14
|
+
durability?: 'default' | 'relaxed' | 'strict';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* An IndexedDB-backed store holding the records of a single model.
|
|
18
|
+
*
|
|
19
|
+
* It implements {@link ObjectStoreContract}, the shared surface that
|
|
20
|
+
* {@link InMemoryObjectStore} also satisfies, so callers can hold either
|
|
21
|
+
* implementation behind one type. Because both are checked against the same
|
|
22
|
+
* interface, any drift between them surfaces as a typecheck error rather
|
|
23
|
+
* than a runtime surprise.
|
|
24
|
+
*
|
|
25
|
+
* The store talks to the native IndexedDB API directly and uses relaxed
|
|
26
|
+
* transaction durability on writes.
|
|
27
|
+
*/
|
|
28
|
+
export declare class ObjectStore implements ObjectStoreContract {
|
|
29
|
+
protected db: IDBDatabase;
|
|
30
|
+
protected modelName: string;
|
|
31
|
+
protected storeName: string;
|
|
32
|
+
protected metadata: ModelMetadata;
|
|
33
|
+
private readonly writeDurability;
|
|
34
|
+
private isClosing;
|
|
35
|
+
constructor(db: IDBDatabase, modelName: string, storeName: string, metadata: ModelMetadata, writeDurability?: NonNullable<IDBTransactionOptionsWithDurability['durability']>);
|
|
36
|
+
/** Insert without replacing an existing key (used by the commit outbox). */
|
|
37
|
+
add(data: Record<string, unknown>): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Mark this store as closing to prevent new operations
|
|
40
|
+
*/
|
|
41
|
+
markAsClosing(): void;
|
|
42
|
+
/**
|
|
43
|
+
* Check if database is available for operations
|
|
44
|
+
*/
|
|
45
|
+
private checkDatabaseAvailable;
|
|
46
|
+
/**
|
|
47
|
+
* Store a model in IndexedDB.
|
|
48
|
+
* Matches the {@link InMemoryObjectStore.put} signature so both
|
|
49
|
+
* stores satisfy the same caller-visible contract.
|
|
50
|
+
*/
|
|
51
|
+
put(data: Record<string, unknown>): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Get a model by ID
|
|
54
|
+
*/
|
|
55
|
+
get(id: string): Promise<Record<string, unknown> | undefined>;
|
|
56
|
+
/**
|
|
57
|
+
* Batch get multiple models by IDs in a single IDB transaction.
|
|
58
|
+
* Much faster than N sequential get() calls (1 transaction vs N).
|
|
59
|
+
*/
|
|
60
|
+
getMany(ids: string[]): Promise<Map<string, Record<string, unknown>>>;
|
|
61
|
+
/**
|
|
62
|
+
* Get all models
|
|
63
|
+
*/
|
|
64
|
+
getAll(): Promise<Record<string, unknown>[]>;
|
|
65
|
+
/**
|
|
66
|
+
* Delete a model by ID
|
|
67
|
+
*/
|
|
68
|
+
delete(id: string): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Check if store is ready (has data)
|
|
71
|
+
*/
|
|
72
|
+
checkIsReady(): Promise<boolean>;
|
|
73
|
+
/**
|
|
74
|
+
* Clear all data in store
|
|
75
|
+
*/
|
|
76
|
+
clear(): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Get count of models in store
|
|
79
|
+
*/
|
|
80
|
+
count(): Promise<number>;
|
|
81
|
+
/**
|
|
82
|
+
* Get models by indexed property
|
|
83
|
+
*/
|
|
84
|
+
getAllFromIndex(indexName: string, value: IDBValidKey): Promise<Record<string, unknown>[]>;
|
|
85
|
+
/**
|
|
86
|
+
* Get models by indexed key (supports compound keys)
|
|
87
|
+
*/
|
|
88
|
+
getAllForIndexedKey(indexedKey: string, keyValue: IDBValidKey): Promise<Record<string, unknown>[]>;
|
|
89
|
+
/**
|
|
90
|
+
* Get first model matching index
|
|
91
|
+
*/
|
|
92
|
+
getFromIndex(indexName: string, value: IDBValidKey): Promise<Record<string, unknown> | undefined>;
|
|
93
|
+
/**
|
|
94
|
+
* Get count from index
|
|
95
|
+
*/
|
|
96
|
+
countFromIndex(indexName: string, value: IDBValidKey): Promise<number>;
|
|
97
|
+
/**
|
|
98
|
+
* Check if any models exist for index value
|
|
99
|
+
*/
|
|
100
|
+
hasModelsForIndex(indexName: string, value: IDBValidKey): Promise<boolean>;
|
|
101
|
+
/**
|
|
102
|
+
* Get store statistics
|
|
103
|
+
*/
|
|
104
|
+
getStats(): Promise<{
|
|
105
|
+
count: number;
|
|
106
|
+
ready: boolean;
|
|
107
|
+
loadStrategy: string;
|
|
108
|
+
indexes: string[];
|
|
109
|
+
}>;
|
|
110
|
+
/**
|
|
111
|
+
* Perform maintenance (override in subclasses for specific needs)
|
|
112
|
+
*/
|
|
113
|
+
performMaintenance(): Promise<void>;
|
|
114
|
+
}
|
|
115
|
+
export {};
|