@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,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a {@link PresenceStream} over a live sync connection. Presence is the
|
|
3
|
+
* lightweight, ephemeral "who's here and what are they doing" view: each
|
|
4
|
+
* participant broadcasts a status and an activity, and sees everyone else's.
|
|
5
|
+
* The stream is built directly on the sync WebSocket and adds no second
|
|
6
|
+
* connection. It is the sibling of {@link createClaimStream}, which reuses the
|
|
7
|
+
* same presence frames.
|
|
8
|
+
*
|
|
9
|
+
* There are two ways to construct it:
|
|
10
|
+
*
|
|
11
|
+
* 1. Direct — pass an already-open `transport`, for example an agent worker
|
|
12
|
+
* or a test.
|
|
13
|
+
* 2. Deferred — construct without a transport and call `attach(transport)`
|
|
14
|
+
* once the connection is ready. The returned stream object is stable from
|
|
15
|
+
* construction, so callers can hold the reference and let attachment
|
|
16
|
+
* happen later.
|
|
17
|
+
*
|
|
18
|
+
* Wire frames:
|
|
19
|
+
* • Outbound `presence_update` — `{ status, activity? }`. The server stamps
|
|
20
|
+
* `userId`, `kind`, `timestamp`, and `isAgent`, then broadcasts to the
|
|
21
|
+
* other participants on the same sync groups.
|
|
22
|
+
* • Inbound — the same frame, with `kind` one of `enter`, `update`, or
|
|
23
|
+
* `leave`.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import type { WsTransport } from '@abloatai/transaction/transport/wsTransport';
|
|
27
|
+
import type { PresenceUpdate } from '@abloatai/transaction/transport/wsTransport';
|
|
28
|
+
import type {
|
|
29
|
+
Activity,
|
|
30
|
+
Peer,
|
|
31
|
+
PresenceStream,
|
|
32
|
+
PresenceTarget,
|
|
33
|
+
} from '@abloatai/transaction/types/streams';
|
|
34
|
+
|
|
35
|
+
import { asyncIteratorFrom } from '@abloatai/transaction/utils/asyncIterator';
|
|
36
|
+
import { participantKindFromWire } from '@abloatai/transaction/coordination/schema';
|
|
37
|
+
import { isTargetTuple, subTarget, wireTarget } from '@abloatai/transaction/coordination';
|
|
38
|
+
import type { ParticipantKind } from '@abloatai/transaction/types/participant';
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The wire capability the presence stream actually uses: subscribe to typed
|
|
42
|
+
* inbound frames, check liveness, and send outbound frames. The duplex
|
|
43
|
+
* `WsTransport` satisfies it — the same port shape the claim stream depends
|
|
44
|
+
* on — so the stream can attach to whatever connection the host built,
|
|
45
|
+
* without naming the engine's subclass.
|
|
46
|
+
*/
|
|
47
|
+
export type PresenceTransport = Pick<WsTransport, 'subscribe' | 'isConnected' | 'send'>;
|
|
48
|
+
|
|
49
|
+
export interface PresenceStreamConfig {
|
|
50
|
+
/** Identity used to filter our own echoed frames out of `others`. */
|
|
51
|
+
participantId: string;
|
|
52
|
+
/** Optional human label for the self entry. */
|
|
53
|
+
label?: string;
|
|
54
|
+
/** Sync groups the participant is broadcasting on. Used for the
|
|
55
|
+
* initial `self` entry and for `othersIn(...)` filtering. */
|
|
56
|
+
syncGroups: readonly string[];
|
|
57
|
+
/** Marks `self` as an agent. Server is the source of truth for
|
|
58
|
+
* peers' `isAgent`, but `self` is local — caller decides. */
|
|
59
|
+
isAgent?: boolean;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** PresenceStream extended with engine-lifecycle hooks. */
|
|
63
|
+
export interface AttachablePresenceStream extends PresenceStream {
|
|
64
|
+
/** Wire the stream to a now-ready transport. Calls before this are
|
|
65
|
+
* buffered (self mutations only — no wire send). Idempotent. */
|
|
66
|
+
attach(transport: PresenceTransport): void;
|
|
67
|
+
/**
|
|
68
|
+
* Seeds the participant identity once the host resolves it. The stream can
|
|
69
|
+
* be built before identity is known — a hosted client learns who it is
|
|
70
|
+
* from its credential's scope during connect — and until then the
|
|
71
|
+
* construction-time values (possibly empty) would leave the `self` entry
|
|
72
|
+
* blank and let the participant's own echoed frames into `others`. Updates
|
|
73
|
+
* the `self` entry in place, so held references see the resolved identity.
|
|
74
|
+
*/
|
|
75
|
+
setParticipant(participant: {
|
|
76
|
+
id: string;
|
|
77
|
+
kind?: ParticipantKind;
|
|
78
|
+
syncGroups?: readonly string[];
|
|
79
|
+
}): void;
|
|
80
|
+
/** Tear down listeners. Stream object stays usable as a no-op. */
|
|
81
|
+
dispose(): void;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function createPresenceStream(
|
|
85
|
+
config: PresenceStreamConfig,
|
|
86
|
+
transport: PresenceTransport | null = null,
|
|
87
|
+
): AttachablePresenceStream {
|
|
88
|
+
const { label, syncGroups, isAgent = false } = config;
|
|
89
|
+
// Mutable: the host seeds the resolved identity via `setParticipant` once
|
|
90
|
+
// it is known; the own-echo filter always reads the current value.
|
|
91
|
+
let participantId = config.participantId;
|
|
92
|
+
|
|
93
|
+
// ── Self ─────────────────────────────────────────────────────────
|
|
94
|
+
const self: Peer = {
|
|
95
|
+
participantKind: isAgent ? 'agent' : 'user',
|
|
96
|
+
participantId,
|
|
97
|
+
label,
|
|
98
|
+
syncGroups: [...syncGroups],
|
|
99
|
+
activity: { entityType: 'Unknown', entityId: '', action: 'idle' },
|
|
100
|
+
lastActive: new Date().toISOString(),
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
// ── Others ───────────────────────────────────────────────────────
|
|
104
|
+
const othersById = new Map<string, Peer>();
|
|
105
|
+
let othersSnapshot: readonly Peer[] = Object.freeze([]);
|
|
106
|
+
const listeners = new Set<() => void>();
|
|
107
|
+
|
|
108
|
+
const notifyListeners = () => {
|
|
109
|
+
othersSnapshot = Object.freeze(Array.from(othersById.values()));
|
|
110
|
+
for (const l of listeners) {
|
|
111
|
+
try {
|
|
112
|
+
l();
|
|
113
|
+
} catch {
|
|
114
|
+
/* one bad listener doesn't break the others */
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
// ── Wire wiring ──────────────────────────────────────────────────
|
|
120
|
+
let attached: PresenceTransport | null = null;
|
|
121
|
+
const unsubs: (() => void)[] = [];
|
|
122
|
+
|
|
123
|
+
function attach(t: PresenceTransport): void {
|
|
124
|
+
if (attached) return; // idempotent
|
|
125
|
+
attached = t;
|
|
126
|
+
|
|
127
|
+
// Reconnect: clear roster (Hub sends fresh snapshot), re-announce
|
|
128
|
+
// own activity (peers don't auto-learn about us across reconnects).
|
|
129
|
+
unsubs.push(
|
|
130
|
+
t.subscribe('connected', () => {
|
|
131
|
+
if (othersById.size > 0) {
|
|
132
|
+
othersById.clear();
|
|
133
|
+
othersSnapshot = Object.freeze([]);
|
|
134
|
+
notifyListeners();
|
|
135
|
+
}
|
|
136
|
+
if (self.activity.entityId) sendUpdate(self.activity);
|
|
137
|
+
}),
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
// Inbound presence frames arrive in the wire vocabulary
|
|
141
|
+
// (userId / isAgent / timestamp); translate them into the shape this
|
|
142
|
+
// stream exposes (participantId / participantKind / lastActive).
|
|
143
|
+
unsubs.push(
|
|
144
|
+
t.subscribe('presence_update', (event: PresenceUpdate) => {
|
|
145
|
+
if (event.userId === participantId) return; // own echo
|
|
146
|
+
if (!event.userId) return;
|
|
147
|
+
|
|
148
|
+
switch (event.kind) {
|
|
149
|
+
case 'leave':
|
|
150
|
+
if (othersById.delete(event.userId)) notifyListeners();
|
|
151
|
+
return;
|
|
152
|
+
// No `undefined` arm: every site that builds a presence frame stamps
|
|
153
|
+
// `kind`, and the schema now says so, so an unlabelled frame is not a
|
|
154
|
+
// shape the transport can hand us.
|
|
155
|
+
case 'enter':
|
|
156
|
+
case 'update': {
|
|
157
|
+
const entry: Peer = {
|
|
158
|
+
participantKind: participantKindFromWire(
|
|
159
|
+
event.participantKind,
|
|
160
|
+
event.isAgent,
|
|
161
|
+
),
|
|
162
|
+
participantId: event.userId,
|
|
163
|
+
syncGroups: event.syncGroups ?? [],
|
|
164
|
+
activity: event.activity
|
|
165
|
+
? {
|
|
166
|
+
...wireTarget(event.activity),
|
|
167
|
+
...subTarget(event.activity),
|
|
168
|
+
action: event.activity.action,
|
|
169
|
+
...(event.activity.detail !== undefined
|
|
170
|
+
? { detail: event.activity.detail }
|
|
171
|
+
: {}),
|
|
172
|
+
}
|
|
173
|
+
: { entityType: 'Unknown', entityId: '', action: event.status },
|
|
174
|
+
lastActive: event.timestamp
|
|
175
|
+
? new Date(event.timestamp).toISOString()
|
|
176
|
+
: new Date().toISOString(),
|
|
177
|
+
};
|
|
178
|
+
othersById.set(event.userId, entry);
|
|
179
|
+
notifyListeners();
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}),
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
// If self was already mutated before attach, broadcast it now.
|
|
187
|
+
if (self.activity.entityId) sendUpdate(self.activity);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if (transport) attach(transport);
|
|
191
|
+
|
|
192
|
+
// ── Outbound ────────────────────────────────────────────────────
|
|
193
|
+
// Do not include `isAgent` in the payload. The server derives it
|
|
194
|
+
// authoritatively from the connection's identity, and letting a client
|
|
195
|
+
// self-declare it once caused human sessions to broadcast as agents to peers.
|
|
196
|
+
function sendUpdate(activity: Activity): void {
|
|
197
|
+
if (!attached?.isConnected()) return; // no-op until connected
|
|
198
|
+
attached.send({
|
|
199
|
+
type: 'presence_update',
|
|
200
|
+
payload: { status: 'online', activity },
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function doUpdate(activity: Activity): void {
|
|
205
|
+
(self as { activity: Activity }).activity = activity;
|
|
206
|
+
(self as { lastActive: string }).lastActive = new Date().toISOString();
|
|
207
|
+
sendUpdate(activity);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function resolveTarget(target: PresenceTarget): Activity {
|
|
211
|
+
if (isTargetTuple(target)) {
|
|
212
|
+
return { entityType: target[0], entityId: target[1], action: 'unknown' };
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
...wireTarget(target),
|
|
216
|
+
...subTarget(target),
|
|
217
|
+
action: 'unknown',
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const withVerb =
|
|
222
|
+
(action: string) =>
|
|
223
|
+
(target: PresenceTarget, detail?: string): void => {
|
|
224
|
+
doUpdate({ ...resolveTarget(target), action, detail });
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
return {
|
|
228
|
+
self,
|
|
229
|
+
update: doUpdate,
|
|
230
|
+
editing: withVerb('editing'),
|
|
231
|
+
reading: withVerb('reading'),
|
|
232
|
+
viewing: withVerb('viewing'),
|
|
233
|
+
idle: () => {
|
|
234
|
+
doUpdate({ entityType: 'Unknown', entityId: '', action: 'idle' });
|
|
235
|
+
},
|
|
236
|
+
get others() {
|
|
237
|
+
return othersSnapshot;
|
|
238
|
+
},
|
|
239
|
+
othersIn: (syncGroup: string) =>
|
|
240
|
+
othersSnapshot.filter((e) => e.syncGroups.includes(syncGroup)),
|
|
241
|
+
onChange: (listener: () => void) => {
|
|
242
|
+
listeners.add(listener);
|
|
243
|
+
return () => {
|
|
244
|
+
listeners.delete(listener);
|
|
245
|
+
};
|
|
246
|
+
},
|
|
247
|
+
[Symbol.asyncIterator]() {
|
|
248
|
+
return asyncIteratorFrom<readonly Peer[]>(
|
|
249
|
+
(onChange) => {
|
|
250
|
+
listeners.add(onChange);
|
|
251
|
+
return () => {
|
|
252
|
+
listeners.delete(onChange);
|
|
253
|
+
};
|
|
254
|
+
},
|
|
255
|
+
() => othersSnapshot,
|
|
256
|
+
);
|
|
257
|
+
},
|
|
258
|
+
attach,
|
|
259
|
+
setParticipant(participant): void {
|
|
260
|
+
participantId = participant.id;
|
|
261
|
+
const writable = self as {
|
|
262
|
+
participantId: string;
|
|
263
|
+
participantKind: Peer['participantKind'];
|
|
264
|
+
syncGroups: readonly string[];
|
|
265
|
+
};
|
|
266
|
+
writable.participantId = participant.id;
|
|
267
|
+
if (participant.kind) writable.participantKind = participant.kind;
|
|
268
|
+
if (participant.syncGroups) writable.syncGroups = [...participant.syncGroups];
|
|
269
|
+
},
|
|
270
|
+
dispose(): void {
|
|
271
|
+
for (const off of unsubs) off();
|
|
272
|
+
unsubs.length = 0;
|
|
273
|
+
listeners.clear();
|
|
274
|
+
othersById.clear();
|
|
275
|
+
othersSnapshot = Object.freeze([]);
|
|
276
|
+
attached = null;
|
|
277
|
+
},
|
|
278
|
+
};
|
|
279
|
+
}
|