@abloatai/ablo 0.25.0 → 0.27.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/AGENTS.md +5 -3
- package/CHANGELOG.md +34 -0
- package/README.md +104 -88
- package/dist/BaseSyncedStore.d.ts +140 -266
- package/dist/BaseSyncedStore.js +338 -739
- package/dist/Database.d.ts +62 -77
- package/dist/Database.js +106 -127
- package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
- package/dist/{ObjectPool.js → InstanceCache.js} +91 -83
- package/dist/LazyReferenceCollection.d.ts +11 -15
- package/dist/LazyReferenceCollection.js +16 -15
- package/dist/Model.d.ts +37 -52
- package/dist/Model.js +52 -69
- package/dist/ModelRegistry.d.ts +46 -25
- package/dist/ModelRegistry.js +32 -30
- package/dist/NetworkMonitor.d.ts +5 -6
- package/dist/NetworkMonitor.js +6 -7
- package/dist/SyncClient.d.ts +119 -109
- package/dist/SyncClient.js +303 -224
- package/dist/SyncEngineContext.d.ts +1 -3
- package/dist/SyncEngineContext.js +1 -2
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +9 -9
- package/dist/adapters/inMemoryStorage.js +9 -9
- package/dist/agent/Agent.d.ts +39 -31
- package/dist/agent/Agent.js +35 -23
- package/dist/agent/index.d.ts +4 -4
- package/dist/agent/index.js +5 -5
- package/dist/agent/session.d.ts +47 -44
- package/dist/agent/session.js +37 -48
- package/dist/agent/types.d.ts +26 -31
- package/dist/agent/types.js +6 -7
- package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
- package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
- package/dist/ai-sdk/coordinationContext.d.ts +46 -0
- package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +30 -31
- package/dist/ai-sdk/index.d.ts +25 -22
- package/dist/ai-sdk/index.js +25 -22
- package/dist/ai-sdk/wrap.d.ts +7 -8
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/credentialPolicy.d.ts +74 -71
- package/dist/auth/credentialPolicy.js +51 -56
- package/dist/auth/credentialSource.d.ts +7 -18
- package/dist/auth/credentialSource.js +10 -18
- package/dist/auth/index.d.ts +59 -58
- package/dist/auth/index.js +34 -40
- package/dist/auth/schemas.d.ts +5 -4
- package/dist/auth/schemas.js +5 -4
- package/dist/batching/index.d.ts +19 -21
- package/dist/batching/index.js +14 -17
- package/dist/cli.cjs +483 -369
- package/dist/client/Ablo.d.ts +107 -836
- package/dist/client/Ablo.js +174 -833
- package/dist/client/ApiClient.d.ts +44 -20
- package/dist/client/ApiClient.js +193 -44
- package/dist/client/auth.d.ts +51 -60
- package/dist/client/auth.js +137 -110
- package/dist/client/claimHeartbeatLoop.d.ts +50 -0
- package/dist/client/claimHeartbeatLoop.js +88 -0
- package/dist/client/consoleLogger.d.ts +35 -0
- package/dist/client/consoleLogger.js +44 -0
- package/dist/client/createInternalComponents.d.ts +14 -17
- package/dist/client/createInternalComponents.js +26 -31
- package/dist/client/createModelProxy.d.ts +130 -120
- package/dist/client/createModelProxy.js +158 -124
- package/dist/client/credentialEndpoint.d.ts +61 -0
- package/dist/client/credentialEndpoint.js +86 -0
- package/dist/client/functionalUpdate.d.ts +29 -27
- package/dist/client/functionalUpdate.js +21 -21
- package/dist/client/hostedEndpoints.d.ts +21 -0
- package/dist/client/hostedEndpoints.js +21 -0
- package/dist/client/httpClient.d.ts +58 -54
- package/dist/client/httpClient.js +29 -31
- package/dist/client/identity.d.ts +15 -20
- package/dist/client/identity.js +49 -59
- package/dist/client/modelRegistration.d.ts +10 -0
- package/dist/client/modelRegistration.js +301 -0
- package/dist/client/options.d.ts +373 -0
- package/dist/client/options.js +6 -0
- package/dist/client/registerDataSource.d.ts +9 -9
- package/dist/client/registerDataSource.js +15 -16
- package/dist/client/resourceTypes.d.ts +333 -0
- package/dist/client/resourceTypes.js +7 -0
- package/dist/client/schemaConfig.d.ts +44 -0
- package/dist/client/schemaConfig.js +176 -0
- package/dist/client/sessionMint.d.ts +17 -13
- package/dist/client/sessionMint.js +26 -31
- package/dist/client/validateAbloOptions.d.ts +12 -14
- package/dist/client/validateAbloOptions.js +9 -10
- package/dist/client/writeOptionsSchema.d.ts +18 -16
- package/dist/client/writeOptionsSchema.js +23 -20
- package/dist/client/wsMutationExecutor.d.ts +28 -0
- package/dist/client/wsMutationExecutor.js +71 -0
- package/dist/context.d.ts +6 -4
- package/dist/context.js +6 -7
- package/dist/coordination/index.d.ts +13 -4
- package/dist/coordination/index.js +29 -4
- package/dist/coordination/schema.d.ts +176 -128
- package/dist/coordination/schema.js +197 -133
- package/dist/coordination/trace.d.ts +9 -11
- package/dist/coordination/trace.js +13 -15
- package/dist/core/DatabaseManager.d.ts +5 -8
- package/dist/core/DatabaseManager.js +38 -40
- package/dist/core/QueryProcessor.d.ts +7 -9
- package/dist/core/QueryProcessor.js +27 -34
- package/dist/core/QueryView.d.ts +17 -5
- package/dist/core/QueryView.js +6 -7
- package/dist/core/StoreManager.d.ts +14 -16
- package/dist/core/StoreManager.js +26 -25
- package/dist/core/ViewRegistry.d.ts +5 -5
- package/dist/core/ViewRegistry.js +4 -4
- package/dist/core/index.d.ts +18 -13
- package/dist/core/index.js +32 -26
- package/dist/core/openIDBWithTimeout.d.ts +38 -36
- package/dist/core/openIDBWithTimeout.js +57 -54
- package/dist/core/queryUtils.d.ts +45 -0
- package/dist/core/queryUtils.js +69 -0
- package/dist/core/storeContract.d.ts +145 -0
- package/dist/core/storeContract.js +12 -0
- package/dist/environment.d.ts +28 -0
- package/dist/environment.js +21 -0
- package/dist/errorCodes.d.ts +118 -101
- package/dist/errorCodes.js +277 -260
- package/dist/errors.d.ts +170 -165
- package/dist/errors.js +161 -151
- package/dist/index.d.ts +30 -27
- package/dist/index.js +90 -82
- package/dist/interfaces/index.d.ts +108 -133
- package/dist/interfaces/index.js +5 -4
- package/dist/keys/index.d.ts +27 -29
- package/dist/keys/index.js +59 -49
- package/dist/mutators/RecordingTransaction.d.ts +16 -16
- package/dist/mutators/RecordingTransaction.js +31 -37
- package/dist/mutators/Transaction.d.ts +18 -26
- package/dist/mutators/Transaction.js +14 -20
- package/dist/mutators/UndoManager.d.ts +122 -131
- package/dist/mutators/UndoManager.js +149 -155
- package/dist/mutators/defineMutators.d.ts +24 -37
- package/dist/mutators/defineMutators.js +14 -20
- package/dist/mutators/inverseOp.d.ts +12 -15
- package/dist/mutators/inverseOp.js +12 -15
- package/dist/mutators/mutateActions.d.ts +10 -9
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +9 -8
- package/dist/mutators/readerActions.js +2 -2
- package/dist/mutators/undoApply.d.ts +31 -27
- package/dist/mutators/undoApply.js +26 -24
- package/dist/policy/index.d.ts +5 -3
- package/dist/policy/index.js +5 -3
- package/dist/policy/types.d.ts +105 -101
- package/dist/policy/types.js +67 -66
- package/dist/query/client.d.ts +32 -16
- package/dist/query/client.js +103 -72
- package/dist/query/types.d.ts +37 -60
- package/dist/query/types.js +13 -33
- package/dist/react/AbloProvider.d.ts +7 -11
- package/dist/react/AbloProvider.js +24 -17
- package/dist/react/context.d.ts +27 -146
- package/dist/react/context.js +9 -10
- package/dist/react/index.d.ts +41 -42
- package/dist/react/index.js +37 -38
- package/dist/react/internalContext.d.ts +17 -19
- package/dist/react/useAblo.d.ts +23 -22
- package/dist/react/useAblo.js +17 -15
- package/dist/react/useCurrentUserId.d.ts +8 -7
- package/dist/react/useCurrentUserId.js +8 -7
- package/dist/react/useErrorListener.d.ts +7 -7
- package/dist/react/useErrorListener.js +11 -12
- package/dist/react/useMutationFailureListener.d.ts +8 -8
- package/dist/react/useMutationFailureListener.js +9 -9
- package/dist/react/useMutators.d.ts +11 -11
- package/dist/react/useMutators.js +10 -4
- package/dist/react/useReactive.js +2 -3
- package/dist/react/useSyncStatus.d.ts +4 -6
- package/dist/react/useUndoScope.d.ts +7 -9
- package/dist/react/useUndoScope.js +3 -3
- package/dist/schema/coordination.d.ts +21 -25
- package/dist/schema/coordination.js +21 -25
- package/dist/schema/ddl.d.ts +43 -39
- package/dist/schema/ddl.js +75 -68
- package/dist/schema/ddlLock.d.ts +35 -0
- package/dist/schema/ddlLock.js +46 -0
- package/dist/schema/diff.d.ts +99 -61
- package/dist/schema/diff.js +43 -34
- package/dist/schema/field.d.ts +37 -42
- package/dist/schema/field.js +36 -49
- package/dist/schema/generate.d.ts +12 -12
- package/dist/schema/generate.js +12 -12
- package/dist/schema/index.d.ts +5 -4
- package/dist/schema/index.js +29 -21
- package/dist/schema/model.d.ts +121 -146
- package/dist/schema/model.js +24 -35
- package/dist/schema/openapi.d.ts +10 -9
- package/dist/schema/openapi.js +7 -1
- package/dist/schema/queries.d.ts +30 -32
- package/dist/schema/queries.js +24 -25
- package/dist/schema/relation.d.ts +89 -99
- package/dist/schema/relation.js +13 -13
- package/dist/schema/residency.d.ts +38 -0
- package/dist/schema/residency.js +30 -0
- package/dist/schema/roles.d.ts +45 -27
- package/dist/schema/roles.js +52 -21
- package/dist/schema/schema.d.ts +36 -45
- package/dist/schema/schema.js +42 -39
- package/dist/schema/select.d.ts +13 -13
- package/dist/schema/select.js +13 -13
- package/dist/schema/serialize.d.ts +36 -39
- package/dist/schema/serialize.js +27 -31
- package/dist/schema/sugar.d.ts +17 -32
- package/dist/schema/sugar.js +14 -29
- package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +27 -50
- package/dist/schema/syncDeltaRow.js +89 -0
- package/dist/schema/tenancy.d.ts +44 -46
- package/dist/schema/tenancy.js +46 -48
- package/dist/server/adapter.d.ts +58 -58
- package/dist/server/adapter.js +13 -14
- package/dist/server/commit.d.ts +60 -64
- package/dist/server/index.d.ts +9 -10
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +70 -0
- package/dist/server/readConfig.js +8 -0
- package/dist/server/storageMode.d.ts +23 -0
- package/dist/server/storageMode.js +17 -0
- package/dist/source/adapter.d.ts +31 -26
- package/dist/source/adapter.js +10 -10
- package/dist/source/adapters/drizzle.d.ts +28 -23
- package/dist/source/adapters/drizzle.js +34 -28
- package/dist/source/adapters/kysely.d.ts +27 -25
- package/dist/source/adapters/kysely.js +28 -26
- package/dist/source/adapters/memory.d.ts +8 -7
- package/dist/source/adapters/memory.js +10 -9
- package/dist/source/adapters/prisma.d.ts +13 -12
- package/dist/source/adapters/prisma.js +27 -29
- package/dist/source/conformance.d.ts +18 -11
- package/dist/source/conformance.js +27 -19
- package/dist/source/connector.d.ts +31 -32
- package/dist/source/connector.js +30 -28
- package/dist/source/connectorProtocol.d.ts +160 -0
- package/dist/source/connectorProtocol.js +162 -0
- package/dist/source/contract.d.ts +26 -27
- package/dist/source/contract.js +28 -29
- package/dist/source/factory.d.ts +94 -0
- package/dist/source/factory.js +268 -0
- package/dist/source/index.d.ts +10 -462
- package/dist/source/index.js +17 -421
- package/dist/source/migrations.d.ts +9 -9
- package/dist/source/migrations.js +9 -9
- package/dist/source/next.d.ts +10 -11
- package/dist/source/next.js +7 -8
- package/dist/source/pushQueue.d.ts +70 -48
- package/dist/source/pushQueue.js +36 -29
- package/dist/source/signing.d.ts +88 -0
- package/dist/source/signing.js +159 -0
- package/dist/source/types.d.ts +351 -0
- package/dist/source/types.js +43 -0
- package/dist/stores/ObjectStore.d.ts +11 -12
- package/dist/stores/ObjectStore.js +34 -35
- package/dist/stores/ObjectStoreContract.d.ts +12 -15
- package/dist/stores/SyncActionStore.d.ts +8 -12
- package/dist/stores/SyncActionStore.js +77 -46
- package/dist/surface.d.ts +28 -21
- package/dist/surface.js +28 -20
- package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +37 -45
- package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +101 -80
- package/dist/sync/ConnectionManager.d.ts +47 -50
- package/dist/sync/ConnectionManager.js +74 -70
- package/dist/sync/NetworkProbe.d.ts +27 -31
- package/dist/sync/NetworkProbe.js +67 -72
- package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +49 -36
- package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +79 -54
- package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +45 -59
- package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +44 -52
- package/dist/sync/SyncWebSocket.d.ts +175 -250
- package/dist/sync/SyncWebSocket.js +431 -769
- package/dist/sync/awaitClaimGrant.d.ts +18 -18
- package/dist/sync/awaitClaimGrant.js +38 -30
- package/dist/sync/bootstrapApply.d.ts +70 -0
- package/dist/sync/bootstrapApply.js +73 -0
- package/dist/sync/commitFrames.d.ts +44 -0
- package/dist/sync/commitFrames.js +94 -0
- package/dist/sync/createClaimStream.d.ts +23 -22
- package/dist/sync/createClaimStream.js +108 -25
- package/dist/sync/createPresenceStream.d.ts +19 -18
- package/dist/sync/createPresenceStream.js +25 -26
- package/dist/sync/createSnapshot.d.ts +13 -17
- package/dist/sync/createSnapshot.js +20 -26
- package/dist/sync/credentialLifecycle.d.ts +175 -0
- package/dist/sync/credentialLifecycle.js +322 -0
- package/dist/sync/deltaPipeline.d.ts +113 -0
- package/dist/sync/deltaPipeline.js +261 -0
- package/dist/sync/groupChange.d.ts +113 -0
- package/dist/sync/groupChange.js +242 -0
- package/dist/sync/heartbeat.d.ts +63 -0
- package/dist/sync/heartbeat.js +91 -0
- package/dist/sync/participants.d.ts +27 -27
- package/dist/sync/schemas.d.ts +3 -2
- package/dist/sync/schemas.js +14 -10
- package/dist/sync/syncCursor.d.ts +40 -0
- package/dist/sync/syncCursor.js +55 -0
- package/dist/sync/syncPlan.d.ts +54 -0
- package/dist/sync/syncPlan.js +50 -0
- package/dist/sync/syncPosition.d.ts +54 -49
- package/dist/sync/syncPosition.js +57 -52
- package/dist/sync/wsFrameHandlers.d.ts +116 -0
- package/dist/sync/wsFrameHandlers.js +374 -0
- package/dist/testing/fixtures/bootstrap.d.ts +21 -17
- package/dist/testing/fixtures/bootstrap.js +12 -6
- package/dist/testing/fixtures/deltas.d.ts +31 -34
- package/dist/testing/fixtures/deltas.js +30 -33
- package/dist/testing/fixtures/models.d.ts +11 -10
- package/dist/testing/fixtures/models.js +12 -10
- package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
- package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
- package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -18
- package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +14 -11
- package/dist/testing/helpers/wait.d.ts +13 -8
- package/dist/testing/helpers/wait.js +13 -8
- package/dist/testing/index.d.ts +4 -4
- package/dist/testing/index.js +3 -3
- package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
- package/dist/testing/mocks/MockMutationExecutor.js +15 -14
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
- package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
- package/dist/testing/mocks/MockSyncContext.d.ts +21 -34
- package/dist/testing/mocks/MockSyncContext.js +16 -45
- package/dist/testing/mocks/MockSyncStore.d.ts +14 -14
- package/dist/testing/mocks/MockSyncStore.js +11 -11
- package/dist/testing/mocks/MockWebSocket.d.ts +28 -24
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +190 -221
- package/dist/transactions/TransactionQueue.js +424 -822
- package/dist/transactions/TransactionStore.d.ts +20 -0
- package/dist/transactions/TransactionStore.js +53 -0
- package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
- package/dist/transactions/UnconfirmedWrites.js +104 -0
- package/dist/transactions/coalesceRules.d.ts +58 -0
- package/dist/transactions/coalesceRules.js +140 -0
- package/dist/transactions/commitPayload.d.ts +130 -0
- package/dist/transactions/commitPayload.js +143 -0
- package/dist/transactions/deltaConfirmation.d.ts +58 -0
- package/dist/transactions/deltaConfirmation.js +215 -0
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/replayValidation.d.ts +99 -0
- package/dist/transactions/replayValidation.js +111 -0
- package/dist/types/global.d.ts +46 -41
- package/dist/types/global.js +20 -19
- package/dist/types/index.d.ts +74 -80
- package/dist/types/index.js +22 -27
- package/dist/types/modelData.d.ts +10 -0
- package/dist/types/modelData.js +9 -0
- package/dist/types/participant.d.ts +20 -0
- package/dist/types/participant.js +10 -0
- package/dist/types/streams.d.ts +216 -209
- package/dist/types/streams.js +7 -7
- package/dist/utils/asyncIterator.d.ts +25 -32
- package/dist/utils/asyncIterator.js +25 -32
- package/dist/utils/duration.d.ts +12 -15
- package/dist/utils/duration.js +12 -15
- package/dist/utils/mobxSetup.d.ts +53 -0
- package/dist/utils/{mobx-setup.js → mobxSetup.js} +44 -100
- package/dist/webhooks/events.d.ts +21 -16
- package/dist/webhooks/events.js +10 -8
- package/dist/webhooks/index.d.ts +5 -7
- package/dist/webhooks/index.js +5 -7
- package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
- package/dist/wire/delta.js +114 -0
- package/dist/wire/errorEnvelope.d.ts +35 -27
- package/dist/wire/errorEnvelope.js +38 -32
- package/dist/wire/frames.d.ts +150 -67
- package/dist/wire/frames.js +48 -1
- package/dist/wire/index.d.ts +18 -13
- package/dist/wire/index.js +36 -13
- package/dist/wire/listEnvelope.d.ts +16 -23
- package/dist/wire/listEnvelope.js +7 -6
- package/dist/wire/protocol.d.ts +38 -0
- package/dist/wire/protocol.js +38 -0
- package/dist/wire/protocolVersion.d.ts +60 -0
- package/dist/wire/protocolVersion.js +67 -0
- package/docs/api-keys.md +4 -3
- package/docs/coordination.md +59 -0
- package/docs/examples/existing-python-backend.md +3 -3
- package/docs/identity.md +4 -4
- package/docs/integration-guide.md +1 -1
- package/docs/react.md +1 -1
- package/docs/sessions.md +5 -7
- package/package.json +24 -21
- package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
- package/dist/ai-sdk/coordination-context.d.ts +0 -52
- package/dist/client/index.d.ts +0 -36
- package/dist/client/index.js +0 -33
- package/dist/config/index.d.ts +0 -10
- package/dist/config/index.js +0 -12
- package/dist/core/query-utils.d.ts +0 -34
- package/dist/core/query-utils.js +0 -59
- package/dist/interfaces/headless.d.ts +0 -95
- package/dist/interfaces/headless.js +0 -41
- package/dist/query/index.d.ts +0 -6
- package/dist/query/index.js +0 -5
- package/dist/realtime/index.d.ts +0 -10
- package/dist/realtime/index.js +0 -9
- package/dist/schema/plane.d.ts +0 -23
- package/dist/schema/plane.js +0 -19
- package/dist/schema/sync-delta-row.js +0 -103
- package/dist/schema/sync-delta-wire.js +0 -102
- package/dist/server/next.d.ts +0 -51
- package/dist/server/next.js +0 -47
- package/dist/server/read-config.d.ts +0 -67
- package/dist/server/read-config.js +0 -8
- package/dist/server/storage-mode.d.ts +0 -1
- package/dist/server/storage-mode.js +0 -18
- package/dist/source/connector-protocol.d.ts +0 -159
- package/dist/source/connector-protocol.js +0 -161
- package/dist/sync/OfflineFlush.d.ts +0 -9
- package/dist/sync/OfflineFlush.js +0 -22
- package/dist/sync/OfflineTransactionStore.d.ts +0 -37
- package/dist/sync/OfflineTransactionStore.js +0 -263
- package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
- package/dist/transactions/OptimisticEchoTracker.js +0 -104
- package/dist/transactions/index.d.ts +0 -16
- package/dist/transactions/index.js +0 -7
- package/dist/transactions/mutation-error-handler.d.ts +0 -5
- package/dist/transactions/mutation-error-handler.js +0 -39
- package/dist/utils/mobx-setup.d.ts +0 -42
package/dist/react/context.d.ts
CHANGED
|
@@ -1,174 +1,55 @@
|
|
|
1
1
|
import { type ReactNode } from 'react';
|
|
2
|
-
import type { Model } from '../Model.js';
|
|
3
|
-
import type { ModelScope } from '../types/index.js';
|
|
4
|
-
import type { QueryView, QueryViewOptions } from '../core/QueryView.js';
|
|
5
|
-
import type { ViewRegistry } from '../core/ViewRegistry.js';
|
|
6
2
|
import type { Schema } from '../schema/schema.js';
|
|
7
|
-
import type {
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* A single LOCAL mutation as observed off the commit stream — the substrate
|
|
11
|
-
* the undo system records from. One is emitted per local create/update/
|
|
12
|
-
* delete/archive (remote/collaborator deltas never appear here: they apply
|
|
13
|
-
* through a separate pool path that doesn't queue mutations). `previousData`
|
|
14
|
-
* holds the pre-edit field values (captured from the model's
|
|
15
|
-
* `modifiedProperties` first-old-wins baseline), so an inverse op is fully
|
|
16
|
-
* derivable from the event alone — no separate snapshot pass.
|
|
17
|
-
*
|
|
18
|
-
* This mirrors how Yjs's `UndoManager` derives reverse-ops by observing the
|
|
19
|
-
* doc and Liveblocks' `room.history` records room ops: undo listens to the
|
|
20
|
-
* one place all local writes converge, rather than wrapping the write call.
|
|
21
|
-
*/
|
|
22
|
-
export interface LocalMutation {
|
|
23
|
-
type: 'create' | 'update' | 'delete' | 'archive' | 'unarchive';
|
|
24
|
-
/** Registered model name (e.g. `'SlideLayer'`); resolved to a schema key by the recorder. */
|
|
25
|
-
modelName: string;
|
|
26
|
-
modelId: string;
|
|
27
|
-
/** New field values (create/update). */
|
|
28
|
-
data?: Record<string, unknown> | null;
|
|
29
|
-
/** Pre-edit field values (update → inverse patch; delete → full re-create row). */
|
|
30
|
-
previousData?: Record<string, unknown> | null;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Minimal store interface that the SDK hooks need.
|
|
34
|
-
* Consumers provide their concrete store (e.g., SyncedStore) that implements this.
|
|
35
|
-
*/
|
|
36
|
-
export interface SyncStoreContract {
|
|
37
|
-
/**
|
|
38
|
-
* Subscribe to the LOCAL mutation stream (optimistic, pre-ack) for undo
|
|
39
|
-
* recording. Optional so minimal test doubles can omit it — when absent,
|
|
40
|
-
* undo scopes simply record nothing. The concrete store
|
|
41
|
-
* (`BaseSyncedStore`) wires this to the TransactionQueue's
|
|
42
|
-
* `transaction:created` event. Returns an unsubscribe function.
|
|
43
|
-
*/
|
|
44
|
-
subscribeLocalMutations?(handler: (mutation: LocalMutation) => void): () => void;
|
|
45
|
-
retrieve(modelClass: abstract new (...args: never[]) => Model, id: string): Model | undefined;
|
|
46
|
-
queryByClass(modelClass: abstract new (...args: never[]) => Model, options?: {
|
|
47
|
-
predicate?: (model: Model) => boolean;
|
|
48
|
-
scope?: ModelScope;
|
|
49
|
-
orderBy?: keyof Model;
|
|
50
|
-
order?: 'asc' | 'desc';
|
|
51
|
-
limit?: number;
|
|
52
|
-
offset?: number;
|
|
53
|
-
}): {
|
|
54
|
-
data: Model[];
|
|
55
|
-
};
|
|
56
|
-
/**
|
|
57
|
-
* Save (create or update) one entity. Calling `save` in a tight loop
|
|
58
|
-
* produces a single wire commit with one `batchIndex`: the SyncClient
|
|
59
|
-
* debounces IDB persistence and the server push to one microtask, and
|
|
60
|
-
* TransactionQueue coalesces every transaction staged in the tick into
|
|
61
|
-
* one batch. There is intentionally no `saveMany` — Zero, Replicache,
|
|
62
|
-
* and the rest of the local-first lineage all expose one-row writes
|
|
63
|
-
* and rely on the implicit tick boundary.
|
|
64
|
-
*
|
|
65
|
-
* `skipValidation` exists for trusted bulk paths (AI sandbox layer
|
|
66
|
-
* generation, PPTX import, hydration) where the producer has already
|
|
67
|
-
* type-checked and per-row Zod is a measurable cost.
|
|
68
|
-
*/
|
|
69
|
-
save(model: Model, options?: {
|
|
70
|
-
skipValidation?: boolean;
|
|
71
|
-
}): Promise<void>;
|
|
72
|
-
delete(model: Model): Promise<void>;
|
|
73
|
-
archive(model: Model): Promise<void>;
|
|
74
|
-
unarchive(model: Model): Promise<void>;
|
|
75
|
-
/** The ObjectPool — for entity/collection lookups by ID or typename. */
|
|
76
|
-
pool: {
|
|
77
|
-
get(id: string): Model | undefined;
|
|
78
|
-
getByTypeName(typename: string, scope?: ModelScope): Model[];
|
|
79
|
-
getByForeignKey(modelName: string, fieldName: string, fieldValue: string): Model[];
|
|
80
|
-
createFromData(data: Record<string, unknown>): Model | null;
|
|
81
|
-
hasForeignKeyIndex(typename: string, fieldName: string): boolean;
|
|
82
|
-
createView<T extends Record<string, unknown>>(typename: string, options?: QueryViewOptions<T>): QueryView<T>;
|
|
83
|
-
viewRegistry: ViewRegistry;
|
|
84
|
-
};
|
|
85
|
-
/**
|
|
86
|
-
* Reactive sync-status getters. Powered by MobX `computed` inside
|
|
87
|
-
* `BaseSyncedStore`, so they're safe to read in `observer` components
|
|
88
|
-
* and inside `reaction(() => store.isReady, ...)`. Consumers that
|
|
89
|
-
* don't want to touch MobX should prefer the `useSyncStatus()` hook.
|
|
90
|
-
*/
|
|
91
|
-
readonly isReady: boolean;
|
|
92
|
-
readonly isSyncing: boolean;
|
|
93
|
-
readonly isOffline: boolean;
|
|
94
|
-
readonly isReconnecting: boolean;
|
|
95
|
-
readonly isError: boolean;
|
|
96
|
-
readonly hasUnsyncedChanges: boolean;
|
|
97
|
-
/**
|
|
98
|
-
* Area-of-interest (dynamic read subscription). `enterScope`/`leaveScope`
|
|
99
|
-
* move the connection's read interest as the user navigates (open/close a
|
|
100
|
-
* deck, sheet, doc); `pinScope`/`unpinScope` express prominence (an active
|
|
101
|
-
* claim keeps a group subscribed). Each resolves the scope through the same
|
|
102
|
-
* resolver the claim path uses, so read interest and write claims agree on
|
|
103
|
-
* the sync-group string. Optional so minimal test doubles can omit them;
|
|
104
|
-
* no-ops before the socket exists. The concrete store (`BaseSyncedStore`)
|
|
105
|
-
* forwards to its `AreaOfInterestManager`.
|
|
106
|
-
*/
|
|
107
|
-
enterScope?(scope: ParticipantScope, opts?: {
|
|
108
|
-
hydrate?: boolean;
|
|
109
|
-
}): Promise<void>;
|
|
110
|
-
leaveScope?(scope: ParticipantScope): Promise<void>;
|
|
111
|
-
pinScope?(scope: ParticipantScope): Promise<void>;
|
|
112
|
-
unpinScope?(scope: ParticipantScope): Promise<void>;
|
|
113
|
-
/**
|
|
114
|
-
* Raw MobX-observable `SyncStatus` record. `useSyncStatus()` reads
|
|
115
|
-
* `state`, `progress`, `pendingChanges`, `isSessionError`, `error`
|
|
116
|
-
* from this to build its tagged union. Exposed on the contract so
|
|
117
|
-
* consumer-facing hooks and test doubles can manipulate it directly.
|
|
118
|
-
*/
|
|
119
|
-
readonly syncStatus: SyncStatus;
|
|
120
|
-
}
|
|
3
|
+
import type { SyncStoreContract } from '../core/storeContract.js';
|
|
4
|
+
export type { SyncStoreContract, LocalMutation } from '../core/storeContract.js';
|
|
121
5
|
export interface SyncReactContext {
|
|
122
6
|
store: SyncStoreContract;
|
|
123
|
-
/**
|
|
7
|
+
/** The organization id used as the default scope for reads and writes. */
|
|
124
8
|
organizationId: string;
|
|
125
9
|
/**
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
* `(schema, modelKey, …)` signatures so non-opting consumers keep
|
|
131
|
-
* working unchanged.
|
|
10
|
+
* An optional schema. When provided, hooks that take a model by name (such as
|
|
11
|
+
* `useQuery('tasks')`) read that model's metadata from this schema, so
|
|
12
|
+
* callers don't pass a schema at every call site. When omitted, those hooks
|
|
13
|
+
* require the schema as an argument instead.
|
|
132
14
|
*
|
|
133
|
-
* The
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
15
|
+
* The field is loosely typed here because a single runtime context value is
|
|
16
|
+
* shared by every hook. Precise per-model types come from your `Register`
|
|
17
|
+
* module augmentation
|
|
18
|
+
* (`declare module '@abloatai/ablo' { interface Register { Schema: typeof schema } }`),
|
|
19
|
+
* not from this reference.
|
|
138
20
|
*/
|
|
139
21
|
schema?: Schema;
|
|
140
22
|
}
|
|
141
23
|
export declare const SyncContext: import("react").Context<SyncReactContext | null>;
|
|
142
24
|
/**
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
25
|
+
* Reads the sync store context from inside a provider subtree, throwing a clear
|
|
26
|
+
* error when no provider is mounted above. `<AbloProvider>` supplies this
|
|
27
|
+
* context by rendering the internal {@link SyncProvider}; you wire
|
|
28
|
+
* `<AbloProvider client={ablo}>` rather than touching this directly.
|
|
146
29
|
*/
|
|
147
30
|
export declare function useSyncContext(): SyncReactContext;
|
|
148
31
|
/**
|
|
149
32
|
* Props for SyncProvider.
|
|
150
33
|
*/
|
|
151
34
|
export interface SyncProviderProps {
|
|
152
|
-
/** The sync store
|
|
35
|
+
/** The sync store, which must implement {@link SyncStoreContract}. */
|
|
153
36
|
store: SyncStoreContract;
|
|
154
|
-
/**
|
|
37
|
+
/** The organization id used as the default scope for reads and writes. */
|
|
155
38
|
organizationId: string;
|
|
156
39
|
/**
|
|
157
|
-
*
|
|
158
|
-
* (`useQuery('tasks')`)
|
|
159
|
-
*
|
|
160
|
-
*
|
|
40
|
+
* An optional schema. Provide it to enable hooks that take a model by name
|
|
41
|
+
* (such as `useQuery('tasks')`); the model types also narrow through your
|
|
42
|
+
* `Register` augmentation. Omit it to pass the schema to those hooks directly
|
|
43
|
+
* instead.
|
|
161
44
|
*/
|
|
162
45
|
schema?: Schema;
|
|
163
46
|
children?: ReactNode;
|
|
164
47
|
}
|
|
165
48
|
/**
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
* store from your `Ablo({ schema, apiKey })` client and renders this provider
|
|
172
|
-
* underneath — reach for `<AbloProvider>`.
|
|
49
|
+
* A low-level provider that places a built sync store on React context so the
|
|
50
|
+
* data hooks can reach it. This is an internal building block: it is not part
|
|
51
|
+
* of the package's public entry point. Reach for `<AbloProvider>` instead,
|
|
52
|
+
* which builds the store from your `Ablo({ schema, apiKey })` client and
|
|
53
|
+
* renders this provider underneath.
|
|
173
54
|
*/
|
|
174
55
|
export declare function SyncProvider({ store, organizationId, schema, children, }: SyncProviderProps): import("react").FunctionComponentElement<import("react").ProviderProps<SyncReactContext | null>>;
|
package/dist/react/context.js
CHANGED
|
@@ -3,9 +3,10 @@ import { createContext, createElement, useContext } from 'react';
|
|
|
3
3
|
import { AbloValidationError } from '../errors.js';
|
|
4
4
|
export const SyncContext = createContext(null);
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* Reads the sync store context from inside a provider subtree, throwing a clear
|
|
7
|
+
* error when no provider is mounted above. `<AbloProvider>` supplies this
|
|
8
|
+
* context by rendering the internal {@link SyncProvider}; you wire
|
|
9
|
+
* `<AbloProvider client={ablo}>` rather than touching this directly.
|
|
9
10
|
*/
|
|
10
11
|
export function useSyncContext() {
|
|
11
12
|
const ctx = useContext(SyncContext);
|
|
@@ -17,13 +18,11 @@ export function useSyncContext() {
|
|
|
17
18
|
return ctx;
|
|
18
19
|
}
|
|
19
20
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* store from your `Ablo({ schema, apiKey })` client and renders this provider
|
|
26
|
-
* underneath — reach for `<AbloProvider>`.
|
|
21
|
+
* A low-level provider that places a built sync store on React context so the
|
|
22
|
+
* data hooks can reach it. This is an internal building block: it is not part
|
|
23
|
+
* of the package's public entry point. Reach for `<AbloProvider>` instead,
|
|
24
|
+
* which builds the store from your `Ablo({ schema, apiKey })` client and
|
|
25
|
+
* renders this provider underneath.
|
|
27
26
|
*/
|
|
28
27
|
export function SyncProvider({ store, organizationId, schema, children, }) {
|
|
29
28
|
return createElement(SyncContext.Provider, { value: { store, organizationId, schema } }, children);
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,48 +1,47 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* React bindings for `@abloatai/ablo`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* # Provider
|
|
5
|
+
*
|
|
6
|
+
* Build a client once — at module scope or with `useMemo` — and wrap your tree:
|
|
7
|
+
*
|
|
8
|
+
* const ablo = Ablo({ schema, apiKey })
|
|
6
9
|
* <AbloProvider client={ablo} fallback={<Skeleton/>}>
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* Removed: withSync (no-op alias of observer). Import observer
|
|
43
|
-
* from mobx-react-lite directly if you still need it.
|
|
44
|
-
* Changed: useSyncStatus() now returns a discriminated union. See the
|
|
45
|
-
* migration notes in CHANGELOG.md.
|
|
10
|
+
*
|
|
11
|
+
* `client` is the only required prop; you construct it, and the provider is the
|
|
12
|
+
* thin reactive binding around it. The provider owns the sync-engine and
|
|
13
|
+
* multiplayer lifecycle. Its `fallback` gates children until the first sync
|
|
14
|
+
* bootstrap completes — pass `fallback="passthrough"` to render children
|
|
15
|
+
* immediately. `userId` is optional and informational.
|
|
16
|
+
*
|
|
17
|
+
* {@link ClientSideSuspense} adds a nested gate inside an already-ready
|
|
18
|
+
* provider. Reach for it only when a heavy subtree, such as a canvas, needs its
|
|
19
|
+
* own gate while the rest of the app renders right away; the provider-level
|
|
20
|
+
* `fallback` is the usual path.
|
|
21
|
+
*
|
|
22
|
+
* # Data hooks
|
|
23
|
+
*
|
|
24
|
+
* useAblo((ablo) => ablo.tasks.get(id)) — subscribe to a local snapshot (the main read API)
|
|
25
|
+
* useAblo() — the typed client, for callbacks and effects:
|
|
26
|
+
* synchronous local reads (`ablo.<model>.get`/`getAll`),
|
|
27
|
+
* async server reads (`retrieve`/`list`),
|
|
28
|
+
* and writes (`create`/`update`/`delete`)
|
|
29
|
+
* useMutators(defs, opts?) — define custom mutators
|
|
30
|
+
* useUndoScope(name) — per-surface undo and redo
|
|
31
|
+
*
|
|
32
|
+
* # Status and errors
|
|
33
|
+
*
|
|
34
|
+
* useSyncStatus() — a discriminated-union snapshot of the sync lifecycle
|
|
35
|
+
* useErrorListener(cb) — an imperative error callback, for telemetry or toasts
|
|
36
|
+
* useCurrentUserId() — the provider's `userId` prop
|
|
37
|
+
*
|
|
38
|
+
* # Multiplayer
|
|
39
|
+
*
|
|
40
|
+
* Multiplayer is always available, because `<AbloProvider>` always constructs a
|
|
41
|
+
* client:
|
|
42
|
+
*
|
|
43
|
+
* useAblo((ablo) => ablo.<model>.claim.state(...)) — reactive coordination reads
|
|
44
|
+
* useWatch({ scope }) — join a scope to get its peers and claims
|
|
46
45
|
*/
|
|
47
46
|
export type { DefaultSyncShape, ResolveSchema, ResolvePresence, ResolveClaims, ResolveUserMeta, ResolveModelKey, } from '../types/global.js';
|
|
48
47
|
export { AbloProvider, useWatch, usePeers, useSync, useSyncStore, type AbloProviderProps, type ParticipantScope, type ParticipantStatus, type UseWatchOptions, type UseWatchReturn, type MeshParticipantStatus, } from './AbloProvider.js';
|
package/dist/react/index.js
CHANGED
|
@@ -1,48 +1,47 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* React bindings for `@abloatai/ablo`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* # Provider
|
|
5
|
+
*
|
|
6
|
+
* Build a client once — at module scope or with `useMemo` — and wrap your tree:
|
|
7
|
+
*
|
|
8
|
+
* const ablo = Ablo({ schema, apiKey })
|
|
6
9
|
* <AbloProvider client={ablo} fallback={<Skeleton/>}>
|
|
7
|
-
* — `client` is the only required prop (construct it yourself; the provider
|
|
8
|
-
* is the thin reactive binding, like `<Elements stripe={...}>`). `userId`
|
|
9
|
-
* is optional + informational. Owns sync engine + multiplayer lifecycle;
|
|
10
|
-
* the `fallback` prop
|
|
11
|
-
* gates children on first bootstrap. Pass `fallback="passthrough"`
|
|
12
|
-
* to disable the gate.
|
|
13
|
-
* <ClientSideSuspense fallback={<Skeleton/>}> — NESTED gate inside an
|
|
14
|
-
* already-ready provider. Use only when you need a separate gate
|
|
15
|
-
* for a heavy subtree (e.g. a canvas) while app chrome renders
|
|
16
|
-
* immediately. The provider-level `fallback` is the default path.
|
|
17
10
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
11
|
+
* `client` is the only required prop; you construct it, and the provider is the
|
|
12
|
+
* thin reactive binding around it. The provider owns the sync-engine and
|
|
13
|
+
* multiplayer lifecycle. Its `fallback` gates children until the first sync
|
|
14
|
+
* bootstrap completes — pass `fallback="passthrough"` to render children
|
|
15
|
+
* immediately. `userId` is optional and informational.
|
|
16
|
+
*
|
|
17
|
+
* {@link ClientSideSuspense} adds a nested gate inside an already-ready
|
|
18
|
+
* provider. Reach for it only when a heavy subtree, such as a canvas, needs its
|
|
19
|
+
* own gate while the rest of the app renders right away; the provider-level
|
|
20
|
+
* `fallback` is the usual path.
|
|
21
|
+
*
|
|
22
|
+
* # Data hooks
|
|
23
|
+
*
|
|
24
|
+
* useAblo((ablo) => ablo.tasks.get(id)) — subscribe to a local snapshot (the main read API)
|
|
25
|
+
* useAblo() — the typed client, for callbacks and effects:
|
|
26
|
+
* synchronous local reads (`ablo.<model>.get`/`getAll`),
|
|
27
|
+
* async server reads (`retrieve`/`list`),
|
|
28
|
+
* and writes (`create`/`update`/`delete`)
|
|
29
|
+
* useMutators(defs, opts?) — define custom mutators
|
|
30
|
+
* useUndoScope(name) — per-surface undo and redo
|
|
31
|
+
*
|
|
32
|
+
* # Status and errors
|
|
33
|
+
*
|
|
34
|
+
* useSyncStatus() — a discriminated-union snapshot of the sync lifecycle
|
|
35
|
+
* useErrorListener(cb) — an imperative error callback, for telemetry or toasts
|
|
36
|
+
* useCurrentUserId() — the provider's `userId` prop
|
|
26
37
|
*
|
|
27
|
-
*
|
|
28
|
-
* useSyncStatus() — tagged-union lifecycle snapshot
|
|
29
|
-
* useErrorListener(cb) — imperative error callback (Sentry/Datadog)
|
|
30
|
-
* useCurrentUserId() — the provider's userId prop
|
|
38
|
+
* # Multiplayer
|
|
31
39
|
*
|
|
32
|
-
* Multiplayer
|
|
33
|
-
*
|
|
34
|
-
* useWatch({ scope }) — join multiplayer for a scope, get peers/claims
|
|
40
|
+
* Multiplayer is always available, because `<AbloProvider>` always constructs a
|
|
41
|
+
* client:
|
|
35
42
|
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* <AbloProvider>. Access the raw engine with `useSync()`.
|
|
39
|
-
* Removed: createAbloContext() factory + its returned AbloProvider —
|
|
40
|
-
* multiplayer is now always-on inside <AbloProvider>. Schema-typed
|
|
41
|
-
* participant hooks ship in a follow-up release.
|
|
42
|
-
* Removed: withSync (no-op alias of observer). Import observer
|
|
43
|
-
* from mobx-react-lite directly if you still need it.
|
|
44
|
-
* Changed: useSyncStatus() now returns a discriminated union. See the
|
|
45
|
-
* migration notes in CHANGELOG.md.
|
|
43
|
+
* useAblo((ablo) => ablo.<model>.claim.state(...)) — reactive coordination reads
|
|
44
|
+
* useWatch({ scope }) — join a scope to get its peers and claims
|
|
46
45
|
*/
|
|
47
46
|
// ── Umbrella provider + lifecycle hooks ────────────────────────────
|
|
48
47
|
export { AbloProvider, useWatch, usePeers, useSync, useSyncStore, } from './AbloProvider.js';
|
|
@@ -1,34 +1,32 @@
|
|
|
1
1
|
import type { Ablo } from '../client/Ablo.js';
|
|
2
2
|
import type { SchemaRecord } from '../schema/schema.js';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* Consumers should NOT use this directly — access the fields via
|
|
10
|
-
* the typed hooks (`useCurrentUserId`, `useErrorListener`, etc.).
|
|
4
|
+
* The context that `<AbloProvider>` populates for its own hooks. It is kept
|
|
5
|
+
* separate from the data-hook context, which carries the store and schema,
|
|
6
|
+
* because these fields belong to the provider rather than to the store. Read
|
|
7
|
+
* them through the typed hooks such as `useCurrentUserId` and
|
|
8
|
+
* `useErrorListener` rather than reaching into this context directly.
|
|
11
9
|
*/
|
|
12
10
|
export interface AbloInternalContextValue {
|
|
13
11
|
/**
|
|
14
|
-
*
|
|
15
|
-
* identity is server
|
|
12
|
+
* The application user id, when your app passed one to `<AbloProvider>`. Sync
|
|
13
|
+
* identity is derived on the server from the API key, so this is `null`
|
|
14
|
+
* unless you set it, and it is not required for sync to work.
|
|
16
15
|
*/
|
|
17
16
|
currentUserId: string | null;
|
|
18
|
-
/** Subscribe to provider-level errors
|
|
17
|
+
/** Subscribe to provider-level errors: engine errors, bootstrap failures, and session issues. */
|
|
19
18
|
subscribeError: (listener: (error: Error) => void) => () => void;
|
|
20
|
-
/**
|
|
19
|
+
/** Emit an error to every subscribed listener. The provider calls this for you. */
|
|
21
20
|
emitError: (error: Error) => void;
|
|
22
21
|
/**
|
|
23
|
-
* The
|
|
24
|
-
* resolves.
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* and shouldn't be coerced through each other.
|
|
22
|
+
* The typed `Ablo` client for this provider, or `null` until the first sync
|
|
23
|
+
* bootstrap resolves. It is held here so `useSync()` can return it without
|
|
24
|
+
* reaching into the store; the client and the store are sibling objects, and
|
|
25
|
+
* neither is derived from the other.
|
|
28
26
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
27
|
+
* It is typed loosely as `Ablo<SchemaRecord>` because generics do not flow
|
|
28
|
+
* through React context. `useSync<R>()` restores the precise type through its
|
|
29
|
+
* own generic; the runtime value is the fully typed client.
|
|
32
30
|
*/
|
|
33
31
|
engine: Ablo<SchemaRecord> | null;
|
|
34
32
|
}
|
package/dist/react/useAblo.d.ts
CHANGED
|
@@ -3,11 +3,10 @@ import type { ModelOperations } from '../client/createModelProxy.js';
|
|
|
3
3
|
import type { SchemaRecord } from '../schema/schema.js';
|
|
4
4
|
import type { ResolveSchema } from '../types/global.js';
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* `<(typeof schema)['models']>` at every call site.
|
|
6
|
+
* The app's resolved schema-record type. It reads your `Register` module
|
|
7
|
+
* augmentation when you declare one and falls back to the loose
|
|
8
|
+
* {@link SchemaRecord} otherwise, so `useAblo()` returns a fully typed client
|
|
9
|
+
* without you passing `<(typeof schema)['models']>` at every call site.
|
|
11
10
|
*/
|
|
12
11
|
type DefaultModels = ResolveSchema extends {
|
|
13
12
|
models: infer M;
|
|
@@ -16,48 +15,50 @@ type ModelClientSelector<R extends SchemaRecord, T, C> = (ablo: Ablo<R>) => Mode
|
|
|
16
15
|
type AbloSelector<R extends SchemaRecord, T> = (ablo: Ablo<R>) => T;
|
|
17
16
|
export interface UseAbloModelOptions<T> {
|
|
18
17
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
18
|
+
* An initial row, usually from a server component or a route loader. The hook
|
|
19
|
+
* returns it until sync delivers a newer row for the same id.
|
|
21
20
|
*/
|
|
22
21
|
readonly initial?: T;
|
|
23
22
|
}
|
|
24
23
|
export interface UseAbloModelResult<T> {
|
|
25
|
-
/**
|
|
24
|
+
/** The current row for the id, or `initial` until the row has synced. */
|
|
26
25
|
readonly data: T | undefined;
|
|
27
|
-
/**
|
|
26
|
+
/** The work claims currently held on this row by any participant. */
|
|
28
27
|
readonly claims: readonly ModelClaim[];
|
|
29
|
-
/**
|
|
28
|
+
/** True while another participant holds a claim — handy for disabling UI. */
|
|
30
29
|
readonly claimed: boolean;
|
|
31
30
|
}
|
|
32
31
|
export type UseAbloHydratedModelResult<T> = Omit<UseAbloModelResult<T>, 'data'> & {
|
|
33
32
|
readonly data: T;
|
|
34
33
|
};
|
|
35
34
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
35
|
+
* Reads Ablo from inside an `<AbloProvider>` subtree. Called with no arguments
|
|
36
|
+
* it returns the typed client for use in callbacks and effects; called with a
|
|
37
|
+
* selector it subscribes the component to a reactive read — such as one
|
|
38
|
+
* `ablo.<model>` row — and re-renders when that read changes.
|
|
38
39
|
*
|
|
39
|
-
*
|
|
40
|
-
* augmentation (`declare module '@abloatai/ablo' { interface Register {
|
|
41
|
-
* typeof schema } }`)
|
|
42
|
-
*
|
|
40
|
+
* You can call it with no type arguments once you declare the `Register` module
|
|
41
|
+
* augmentation (`declare module '@abloatai/ablo' { interface Register {
|
|
42
|
+
* Schema: typeof schema } }`); the default type then resolves through your
|
|
43
|
+
* schema's models, so call sites stay clean:
|
|
43
44
|
*
|
|
44
45
|
* ```ts
|
|
45
|
-
* // With Register augmentation (recommended):
|
|
46
|
+
* // With the Register augmentation (recommended):
|
|
46
47
|
* const ablo = useAblo();
|
|
47
48
|
* if (!ablo) return <Loading />;
|
|
48
49
|
* const doc = await ablo.documents.retrieve({ id }); // async server read
|
|
49
50
|
*
|
|
50
|
-
* // Reactive selector (
|
|
51
|
+
* // Reactive selector (a synchronous local snapshot):
|
|
51
52
|
* const doc = useAblo((ablo) => ablo.documents.get(id)) ?? serverDoc;
|
|
52
53
|
* const active = useAblo((ablo) => ablo.documents.claim.state({ id }));
|
|
53
54
|
*
|
|
54
|
-
* // Without augmentation, pass the schema
|
|
55
|
+
* // Without the augmentation, pass the schema as a type argument:
|
|
55
56
|
* const ablo = useAblo<(typeof schema)['models']>();
|
|
56
57
|
* ```
|
|
57
58
|
*
|
|
58
|
-
*
|
|
59
|
-
* and render a loading state
|
|
60
|
-
* `'connected'`
|
|
59
|
+
* The no-argument form returns `null` while the engine is still bootstrapping.
|
|
60
|
+
* Branch on `null` and render a loading state — or gate on `useSyncStatus()`
|
|
61
|
+
* reaching `'connected'` — before calling model methods.
|
|
61
62
|
*/
|
|
62
63
|
export declare function useAblo<R extends SchemaRecord = DefaultModels>(): Ablo<R> | null;
|
|
63
64
|
export declare function useAblo<R extends SchemaRecord = DefaultModels, T = unknown>(select: AbloSelector<R, T>): T | undefined;
|
package/dist/react/useAblo.js
CHANGED
|
@@ -17,14 +17,15 @@ function readModelResult(engine, modelClient, id, initial) {
|
|
|
17
17
|
return { data, claims, claimed: claims.length > 0 };
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
|
-
*
|
|
20
|
+
* Projects a reactive read into the value that `useReactive` caches and
|
|
21
|
+
* returns.
|
|
21
22
|
*
|
|
22
|
-
* For a `Model`, this
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
23
|
+
* For a `Model`, this reads the row's fields through `toReactiveSnapshot`
|
|
24
|
+
* rather than returning the instance itself. Property access is what subscribes
|
|
25
|
+
* the reaction to those fields, so the read has to happen inside this tracked
|
|
26
|
+
* function; returning the live instance without reading its fields would leave
|
|
27
|
+
* the component blind to later edits. The fresh object it produces also lets
|
|
28
|
+
* `useReactive`'s equality check detect an in-place update.
|
|
28
29
|
*/
|
|
29
30
|
function snapshotValue(value) {
|
|
30
31
|
if (value instanceof Model) {
|
|
@@ -47,18 +48,19 @@ export function useAblo(modelOrSelect, id, options) {
|
|
|
47
48
|
: typeof modelOrSelect === 'function'
|
|
48
49
|
? undefined
|
|
49
50
|
: modelOrSelect;
|
|
50
|
-
// Claims
|
|
51
|
-
// reactions below cannot track them
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
//
|
|
55
|
-
// re-render
|
|
56
|
-
// storm during AI editing
|
|
51
|
+
// Claims arrive through an event emitter (engine.claims), not through MobX, so
|
|
52
|
+
// the useReactive reactions below cannot track them; we bridge changes with a
|
|
53
|
+
// setState bump instead. Only the model-row form (`id !== undefined`) reads
|
|
54
|
+
// claims, so we subscribe only when `id` is set. The selector-only form never
|
|
55
|
+
// reads claims, and subscribing it to the workspace-wide claim stream would
|
|
56
|
+
// re-render and recompute it on every claim or presence change anywhere — a
|
|
57
|
+
// real storm during AI editing or live collaboration — for a value that cannot
|
|
58
|
+
// change.
|
|
57
59
|
const [claimVersion, setClaimVersion] = useState(0);
|
|
58
60
|
useEffect(() => {
|
|
59
61
|
if (!engine || id === undefined)
|
|
60
62
|
return;
|
|
61
|
-
return engine.claims.onChange(() => setClaimVersion((version) => version + 1));
|
|
63
|
+
return engine.claims.onChange(() => { setClaimVersion((version) => version + 1); });
|
|
62
64
|
}, [engine, id]);
|
|
63
65
|
const selected = useReactive(() => {
|
|
64
66
|
if (!engine || !isSelectorOnly || typeof modelOrSelect !== 'function') {
|