@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,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Applies a bootstrap result to the in-memory object pool. When a client
|
|
3
|
+
* connects, the server sends either a full snapshot of the models it can see or
|
|
4
|
+
* a partial catch-up of the deltas it missed. These functions route that result
|
|
5
|
+
* into the pool, protect entities that arrived mid-bootstrap from being swept
|
|
6
|
+
* away as stale, and replay any deltas that queued while the bootstrap was in
|
|
7
|
+
* flight.
|
|
8
|
+
*
|
|
9
|
+
* The functions here reach their host store only through the small
|
|
10
|
+
* {@link PoolContext} interface, not the store's concrete class, so the two can
|
|
11
|
+
* reference each other without forming an import cycle. The pool writes
|
|
12
|
+
* themselves — creating models, healing partial rows, upserting, and removing
|
|
13
|
+
* stale local copies the server no longer reports — are performed by the sync
|
|
14
|
+
* client behind that interface.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { globalRuntime } from '../context.js';
|
|
18
|
+
import type { RuntimeContext } from '../RuntimeContext.js';
|
|
19
|
+
import type { BootstrapResult } from '../Database.js';
|
|
20
|
+
import type { SyncDelta } from './SyncWebSocket.js';
|
|
21
|
+
|
|
22
|
+
/** Counts describing what applying a bootstrap changed in the pool: entities
|
|
23
|
+
* added, updated, removed, skipped, and healed, plus the elapsed time. */
|
|
24
|
+
export interface RehydrationStats {
|
|
25
|
+
added: number;
|
|
26
|
+
updated: number;
|
|
27
|
+
removed: number;
|
|
28
|
+
skipped: number;
|
|
29
|
+
healed: number;
|
|
30
|
+
elapsedMs: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The methods the bootstrap-apply functions call back into on the host store.
|
|
35
|
+
* The two data-application methods arrive with relation enrichment already
|
|
36
|
+
* bound by the host, so a subclass override of how relations are enriched still
|
|
37
|
+
* takes effect through this interface.
|
|
38
|
+
*/
|
|
39
|
+
export interface PoolContext {
|
|
40
|
+
/** The owning client's runtime. Defaults to the module-global bridge. */
|
|
41
|
+
readonly runtime?: RuntimeContext;
|
|
42
|
+
/** Applies persisted delta results to the in-memory pool, with the host's relation enrichment bound. */
|
|
43
|
+
applyDeltaBatchToPool(results: NonNullable<BootstrapResult['deltaResults']>): void;
|
|
44
|
+
/** Writes bootstrap data into the pool: creates models, heals partial rows, upserts, and removes stale local copies the server no longer reports. */
|
|
45
|
+
applyBootstrapDataToPool(
|
|
46
|
+
bootstrapData: { models?: Record<string, unknown[]>; failedModels?: string[] },
|
|
47
|
+
protectedIds?: ReadonlySet<string>,
|
|
48
|
+
): { added: number; updated: number; removed: number; skipped: number; healed: number };
|
|
49
|
+
/** Pool size — for the completion log line. */
|
|
50
|
+
getPoolSize(): number;
|
|
51
|
+
/** Every id currently in the pool, used to work out which entities must survive the stale-sweep (see {@link collectDeltaProtectedIds}). */
|
|
52
|
+
getAllPoolIds(): string[];
|
|
53
|
+
/** Deltas that queued while a bootstrap was in flight; null when no bootstrap
|
|
54
|
+
* is running. The host backs this with a field exposed through accessors. */
|
|
55
|
+
bootstrapDeltaQueue: SyncDelta[] | null;
|
|
56
|
+
/** Applies a complete set of deltas to the pool atomically — one write, one
|
|
57
|
+
* re-render. This entry point lives on the host, not in this module. */
|
|
58
|
+
applyDeltaFrame(deltas: SyncDelta[]): void;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Applies a bootstrap result to the in-memory pool and returns what changed.
|
|
63
|
+
* A full bootstrap creates, heals, and upserts models and removes stale local
|
|
64
|
+
* copies the server no longer reports; a partial bootstrap routes the missed
|
|
65
|
+
* deltas through the delta-apply path so deletions evict their entities. See
|
|
66
|
+
* {@link RehydrationStats} for the returned counts.
|
|
67
|
+
*/
|
|
68
|
+
export function applyBootstrapToPool(
|
|
69
|
+
ctx: PoolContext,
|
|
70
|
+
bootstrapResult: BootstrapResult,
|
|
71
|
+
protectedIds?: ReadonlySet<string>,
|
|
72
|
+
): RehydrationStats {
|
|
73
|
+
const { bootstrapData } = bootstrapResult;
|
|
74
|
+
|
|
75
|
+
// Partial bootstrap: the missed deltas are already written to the local
|
|
76
|
+
// store. Route the same results through the delta-apply path so the
|
|
77
|
+
// in-memory pool also evicts deleted entities and updates modified ones.
|
|
78
|
+
// Without this, a reconnect delete persists locally but its stale copy
|
|
79
|
+
// lingers in the pool until a full reload.
|
|
80
|
+
if (bootstrapData.type === 'partial') {
|
|
81
|
+
const deltaResults = bootstrapResult.deltaResults;
|
|
82
|
+
if (deltaResults && deltaResults.length > 0) {
|
|
83
|
+
ctx.applyDeltaBatchToPool(deltaResults);
|
|
84
|
+
}
|
|
85
|
+
return { added: 0, updated: 0, removed: 0, skipped: 0, healed: 0, elapsedMs: 0 };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (!bootstrapData.models) {
|
|
89
|
+
return { added: 0, updated: 0, removed: 0, skipped: 0, healed: 0, elapsedMs: 0 };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const start = typeof performance !== 'undefined' ? performance.now() : Date.now();
|
|
93
|
+
|
|
94
|
+
// Creates models, heals partial rows, upserts, and removes stale local copies.
|
|
95
|
+
const stats = ctx.applyBootstrapDataToPool(bootstrapData, protectedIds);
|
|
96
|
+
|
|
97
|
+
const elapsedMs = Math.round((typeof performance !== 'undefined' ? performance.now() : Date.now()) - start);
|
|
98
|
+
|
|
99
|
+
(ctx.runtime ?? globalRuntime).logger.info('[BaseSyncedStore] Bootstrap applied', {
|
|
100
|
+
...stats, elapsedMs, poolSize: ctx.getPoolSize(),
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
return { ...stats, elapsedMs };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Collects the ids that must survive the post-bootstrap stale-sweep: entities added by deltas that arrived while the bootstrap was in flight. */
|
|
107
|
+
export function collectDeltaProtectedIds(
|
|
108
|
+
ctx: PoolContext,
|
|
109
|
+
preBootstrapIds: ReadonlySet<string>,
|
|
110
|
+
): Set<string> {
|
|
111
|
+
const protectedIds = new Set<string>();
|
|
112
|
+
for (const id of ctx.getAllPoolIds()) {
|
|
113
|
+
if (!preBootstrapIds.has(id)) protectedIds.add(id);
|
|
114
|
+
}
|
|
115
|
+
for (const delta of ctx.bootstrapDeltaQueue ?? []) {
|
|
116
|
+
if (delta.actionType !== 'D' && delta.modelId) protectedIds.add(delta.modelId);
|
|
117
|
+
}
|
|
118
|
+
return protectedIds;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** Replays the deltas that queued while a bootstrap was in flight, applying them as one atomic frame. */
|
|
122
|
+
export function replayQueuedDeltas(ctx: PoolContext): void {
|
|
123
|
+
const queue = ctx.bootstrapDeltaQueue;
|
|
124
|
+
ctx.bootstrapDeltaQueue = null;
|
|
125
|
+
if (!queue || queue.length === 0) return;
|
|
126
|
+
// Deltas that landed during bootstrap are a complete frame — apply
|
|
127
|
+
// them atomically (one flush, one re-render) rather than dribbling
|
|
128
|
+
// each back through the live debounce path.
|
|
129
|
+
ctx.applyDeltaFrame(queue);
|
|
130
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Moved to the settlement core with the duplex transport (ADR 0016): the
|
|
3
|
+
* commit-path frame builders are stateless wire helpers. This path re-exports
|
|
4
|
+
* them so existing importers stay unchanged. The core's `buildCommitFrame`
|
|
5
|
+
* takes the structural `CommitFrameOperation` slice, which this package's
|
|
6
|
+
* `MutationOperation` satisfies.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export {
|
|
10
|
+
buildCommitFrame,
|
|
11
|
+
parseNotifications,
|
|
12
|
+
recordClaim,
|
|
13
|
+
type CommitAck,
|
|
14
|
+
type CommitFrameOperation,
|
|
15
|
+
type ClaimTracePorts,
|
|
16
|
+
} from '@abloatai/transaction/transport/commitFrames';
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { AbloSessionError } from '@abloatai/transaction/errors';
|
|
2
|
+
import type { ParticipantKind } from '@abloatai/transaction/types/participant';
|
|
3
|
+
import { ConnectionManager } from './ConnectionManager.js';
|
|
4
|
+
import type { DefaultCollaborationEvents, EventMap, SyncWebSocket } from './SyncWebSocket.js';
|
|
5
|
+
import type { SyncStatus } from '../storeContract.js';
|
|
6
|
+
import type { AuthCredentialSource } from '@abloatai/transaction/auth/credentialSource';
|
|
7
|
+
import type { RuntimeContext } from '../RuntimeContext.js';
|
|
8
|
+
import { contextLogger, contextSocketObservability } from './contextPorts.js';
|
|
9
|
+
|
|
10
|
+
export interface ConnectionManagerHost<
|
|
11
|
+
TCollaboration extends EventMap<TCollaboration> = DefaultCollaborationEvents,
|
|
12
|
+
> {
|
|
13
|
+
connectionManager: ConnectionManager | null;
|
|
14
|
+
onConnectionEvent?: (event: string) => void;
|
|
15
|
+
syncWebSocket: SyncWebSocket<TCollaboration>;
|
|
16
|
+
syncStatus: SyncStatus;
|
|
17
|
+
createConnectionManager(kind?: ParticipantKind): ConnectionManager | null;
|
|
18
|
+
performReconnect(): Promise<'success' | 'session_error' | 'network_error'>;
|
|
19
|
+
performCredentialRefresh(): Promise<'refreshed' | 'session_error' | 'network_error'>;
|
|
20
|
+
handleTerminalSessionError(error: Error): void;
|
|
21
|
+
updateSyncStatus(updates: Partial<SyncStatus>): void;
|
|
22
|
+
syncServerUrl?: string;
|
|
23
|
+
auth?: AuthCredentialSource;
|
|
24
|
+
runtime: RuntimeContext;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function createConnectionManager<TCollaboration extends EventMap<TCollaboration>>(
|
|
28
|
+
host: Pick<ConnectionManagerHost<TCollaboration>, 'syncServerUrl' | 'auth' | 'syncWebSocket'>,
|
|
29
|
+
kind?: ParticipantKind,
|
|
30
|
+
): ConnectionManager | null {
|
|
31
|
+
if (kind === 'agent') return null;
|
|
32
|
+
return new ConnectionManager({
|
|
33
|
+
baseUrl: host.syncServerUrl,
|
|
34
|
+
getAuthToken: () => host.auth?.getAuthToken() ?? host.syncWebSocket.getAuthToken() ?? null,
|
|
35
|
+
logger: contextLogger,
|
|
36
|
+
observability: contextSocketObservability,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export async function waitForWebSocketConnected<TCollaboration extends EventMap<TCollaboration>>(
|
|
41
|
+
host: Pick<ConnectionManagerHost<TCollaboration>, 'syncWebSocket' | 'runtime'>,
|
|
42
|
+
timeoutMs: number,
|
|
43
|
+
): Promise<boolean> {
|
|
44
|
+
const ws = host.syncWebSocket;
|
|
45
|
+
if (ws.isConnected()) return true;
|
|
46
|
+
return new Promise<boolean>((resolve) => {
|
|
47
|
+
let resolved = false;
|
|
48
|
+
const unsubscribe = ws.subscribe('connected', () => {
|
|
49
|
+
if (resolved) return;
|
|
50
|
+
resolved = true;
|
|
51
|
+
unsubscribe();
|
|
52
|
+
clearTimeout(timer);
|
|
53
|
+
resolve(true);
|
|
54
|
+
});
|
|
55
|
+
const timer = setTimeout(() => {
|
|
56
|
+
if (resolved) return;
|
|
57
|
+
resolved = true;
|
|
58
|
+
unsubscribe();
|
|
59
|
+
host.runtime.logger.debug(
|
|
60
|
+
`[BaseSyncedStore] waitForWebSocketConnected timed out after ${timeoutMs}ms — initialize() will return but the next mutation may race the upgrade.`,
|
|
61
|
+
);
|
|
62
|
+
resolve(false);
|
|
63
|
+
}, timeoutMs);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function startConnectionManager<TCollaboration extends EventMap<TCollaboration>>(
|
|
68
|
+
host: ConnectionManagerHost<TCollaboration>,
|
|
69
|
+
kind?: ParticipantKind,
|
|
70
|
+
): void {
|
|
71
|
+
host.connectionManager = host.createConnectionManager(kind);
|
|
72
|
+
if (host.connectionManager) {
|
|
73
|
+
const manager = host.connectionManager;
|
|
74
|
+
// Preserve any externally-set onConnectionEvent — chain rather
|
|
75
|
+
// than overwrite, so subclasses that wire a secondary consumer
|
|
76
|
+
// still receive events.
|
|
77
|
+
const priorHook = host.onConnectionEvent;
|
|
78
|
+
host.onConnectionEvent = (event: string) => {
|
|
79
|
+
try { priorHook?.(event); } catch { /* don't let subclass crash the FSM */ }
|
|
80
|
+
switch (event) {
|
|
81
|
+
case 'WS_CONNECTED':
|
|
82
|
+
manager.send({ type: 'WS_CONNECTED' });
|
|
83
|
+
break;
|
|
84
|
+
case 'WS_DISCONNECTED':
|
|
85
|
+
manager.send({ type: 'WS_DISCONNECTED' });
|
|
86
|
+
break;
|
|
87
|
+
case 'WS_SESSION_ERROR':
|
|
88
|
+
manager.send({ type: 'WS_SESSION_ERROR' });
|
|
89
|
+
break;
|
|
90
|
+
case 'WS_HANDSHAKE_FAILED':
|
|
91
|
+
manager.send({ type: 'WS_HANDSHAKE_FAILED' });
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
manager.start({
|
|
97
|
+
onReconnect: () => host.performReconnect(),
|
|
98
|
+
onRefreshCredential: () => host.performCredentialRefresh(),
|
|
99
|
+
onSessionExpired: () => {
|
|
100
|
+
const err = new AbloSessionError('Session expired');
|
|
101
|
+
host.handleTerminalSessionError(err);
|
|
102
|
+
},
|
|
103
|
+
onDisconnectWebSocket: () => {
|
|
104
|
+
host.syncWebSocket.disconnect();
|
|
105
|
+
},
|
|
106
|
+
// Mirror FSM transitions into the visible `syncStatus.state` so
|
|
107
|
+
// the UI can show "Reconnecting…" while the FSM cycles through
|
|
108
|
+
// probing / reconnecting / backoff. Previously these states
|
|
109
|
+
// were opaque to the UI, leaving the sidebar pinned to
|
|
110
|
+
// "offline" for the entire recovery window — exactly the
|
|
111
|
+
// confusing UX the warning log was trying to surface.
|
|
112
|
+
//
|
|
113
|
+
// We only override `state` here; `error` / `progress` / etc.
|
|
114
|
+
// continue to be set by the WebSocket subscription handlers
|
|
115
|
+
// and bootstrap pipeline, which know more than the FSM does.
|
|
116
|
+
onStateChange: (next) => {
|
|
117
|
+
switch (next) {
|
|
118
|
+
case 'connected':
|
|
119
|
+
// Don't clobber an in-flight 'syncing' / 'idle' update
|
|
120
|
+
// that the bootstrap pipeline might be midway through —
|
|
121
|
+
// those handlers run their own `updateSyncStatus`. Only
|
|
122
|
+
// promote out of an offline / reconnecting / error label.
|
|
123
|
+
if (
|
|
124
|
+
host.syncStatus.state === 'offline' ||
|
|
125
|
+
host.syncStatus.state === 'reconnecting' ||
|
|
126
|
+
host.syncStatus.state === 'error'
|
|
127
|
+
) {
|
|
128
|
+
host.updateSyncStatus({ state: 'idle', offlineSince: undefined });
|
|
129
|
+
}
|
|
130
|
+
break;
|
|
131
|
+
case 'probing_network':
|
|
132
|
+
case 'refreshing_credential':
|
|
133
|
+
case 'reconnecting':
|
|
134
|
+
case 'backoff':
|
|
135
|
+
// Active recovery — the UI should reflect that the FSM
|
|
136
|
+
// is doing work, not that we've given up. (Re-minting a stale
|
|
137
|
+
// access key is just another recovery step, surfaced the same
|
|
138
|
+
// way; the user never sees a credential-level distinction.)
|
|
139
|
+
if (host.syncStatus.state !== 'reconnecting') {
|
|
140
|
+
host.updateSyncStatus({ state: 'reconnecting' });
|
|
141
|
+
}
|
|
142
|
+
break;
|
|
143
|
+
case 'waiting_for_network':
|
|
144
|
+
case 'offline':
|
|
145
|
+
if (host.syncStatus.state !== 'offline') {
|
|
146
|
+
host.updateSyncStatus({
|
|
147
|
+
state: 'offline',
|
|
148
|
+
offlineSince: host.syncStatus.offlineSince ?? new Date(),
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
// 'session_expired' / 'validating_session' are handled by
|
|
153
|
+
// the existing session-error / WS subscription paths.
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The runtime context, sliced into the ports the settlement core's transport
|
|
3
|
+
* takes. The core is injected, never service-located (ADR 0016), while this
|
|
4
|
+
* package resolves its shared dependencies through `getContext()` — so these
|
|
5
|
+
* adapters bridge the two: each method reads the context at call time, which
|
|
6
|
+
* preserves the lazy semantics of `getContext()` (a context installed after
|
|
7
|
+
* construction is still picked up, and the pre-init fallback still applies).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { getContext } from '../context.js';
|
|
11
|
+
import type { Logger } from '@abloatai/transaction/logger';
|
|
12
|
+
import type { SocketObservability } from '@abloatai/transaction/observability';
|
|
13
|
+
|
|
14
|
+
/** The context's logger, resolved at call time. */
|
|
15
|
+
export const contextLogger: Logger = {
|
|
16
|
+
debug: (message, ...args) => { getContext().logger.debug(message, ...args); },
|
|
17
|
+
info: (message, ...args) => { getContext().logger.info(message, ...args); },
|
|
18
|
+
warn: (message, ...args) => { getContext().logger.warn(message, ...args); },
|
|
19
|
+
error: (message, ...args) => { getContext().logger.error(message, ...args); },
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/** The context's observability, resolved at call time, in the transport's shape. */
|
|
23
|
+
export const contextSocketObservability: SocketObservability = {
|
|
24
|
+
breadcrumb: (message, category, level, data) => {
|
|
25
|
+
getContext().observability.breadcrumb(message, category, level, data);
|
|
26
|
+
},
|
|
27
|
+
captureWebSocketError: (details) => {
|
|
28
|
+
getContext().observability.captureWebSocketError(details);
|
|
29
|
+
},
|
|
30
|
+
captureClaim: (event) => { getContext().observability.captureClaim(event); },
|
|
31
|
+
captureConflict: (event) => { getContext().observability.captureConflict(event); },
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/** The context's online-status provider, resolved at call time. */
|
|
35
|
+
export const contextOnlineStatus = {
|
|
36
|
+
isOnline: (): boolean => getContext().onlineStatus.isOnline(),
|
|
37
|
+
};
|