@abloatai/ablo 0.26.0 → 0.28.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/CHANGELOG.md +42 -2
- package/README.md +102 -86
- package/dist/BaseSyncedStore.d.ts +85 -88
- package/dist/BaseSyncedStore.js +134 -151
- package/dist/Database.d.ts +68 -69
- package/dist/Database.js +316 -135
- package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
- package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
- package/dist/LazyReferenceCollection.d.ts +11 -15
- package/dist/LazyReferenceCollection.js +12 -16
- package/dist/Model.d.ts +54 -52
- package/dist/Model.js +78 -62
- package/dist/ModelRegistry.d.ts +21 -19
- package/dist/ModelRegistry.js +23 -27
- package/dist/NetworkMonitor.d.ts +5 -6
- package/dist/NetworkMonitor.js +5 -6
- package/dist/SyncClient.d.ts +122 -118
- package/dist/SyncClient.js +541 -245
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +10 -9
- package/dist/adapters/inMemoryStorage.js +21 -9
- package/dist/agent/Agent.d.ts +27 -32
- package/dist/agent/Agent.js +18 -19
- 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} +26 -33
- package/dist/ai-sdk/index.d.ts +25 -22
- package/dist/ai-sdk/index.js +25 -22
- package/dist/ai-sdk/wrap.d.ts +6 -7
- package/dist/ai-sdk/wrap.js +1 -1
- package/dist/auth/credentialPolicy.d.ts +69 -74
- package/dist/auth/credentialPolicy.js +51 -56
- package/dist/auth/credentialSource.d.ts +6 -5
- package/dist/auth/credentialSource.js +9 -10
- package/dist/auth/index.d.ts +59 -58
- package/dist/auth/index.js +31 -37
- 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 +173 -121
- package/dist/client/Ablo.d.ts +97 -74
- package/dist/client/Ablo.js +129 -163
- package/dist/client/ApiClient.d.ts +30 -19
- package/dist/client/ApiClient.js +442 -81
- package/dist/client/auth.d.ts +47 -47
- package/dist/client/auth.js +108 -117
- package/dist/client/claimHeartbeatLoop.d.ts +50 -0
- package/dist/client/claimHeartbeatLoop.js +88 -0
- package/dist/client/consoleLogger.d.ts +5 -6
- package/dist/client/consoleLogger.js +5 -6
- package/dist/client/createInternalComponents.d.ts +16 -17
- package/dist/client/createInternalComponents.js +26 -31
- package/dist/client/createModelProxy.d.ts +130 -120
- package/dist/client/createModelProxy.js +152 -122
- package/dist/client/credentialEndpoint.d.ts +40 -42
- package/dist/client/credentialEndpoint.js +35 -36
- package/dist/client/functionalUpdate.d.ts +29 -27
- package/dist/client/functionalUpdate.js +21 -21
- package/dist/client/hostedEndpoints.d.ts +9 -12
- package/dist/client/hostedEndpoints.js +9 -12
- package/dist/client/httpClient.d.ts +59 -53
- package/dist/client/httpClient.js +29 -31
- package/dist/client/identity.d.ts +15 -20
- package/dist/client/identity.js +47 -58
- package/dist/client/modelRegistration.d.ts +5 -9
- package/dist/client/modelRegistration.js +78 -87
- package/dist/client/options.d.ts +157 -157
- package/dist/client/options.js +3 -7
- package/dist/client/registerDataSource.d.ts +9 -9
- package/dist/client/registerDataSource.js +15 -16
- package/dist/client/resourceTypes.d.ts +64 -75
- package/dist/client/resourceTypes.js +4 -10
- package/dist/client/schemaConfig.d.ts +31 -43
- package/dist/client/schemaConfig.js +38 -50
- package/dist/client/sessionMint.d.ts +16 -12
- package/dist/client/sessionMint.js +26 -31
- package/dist/client/validateAbloOptions.d.ts +12 -14
- package/dist/client/validateAbloOptions.js +8 -9
- package/dist/client/writeOptionsSchema.d.ts +18 -16
- package/dist/client/writeOptionsSchema.js +23 -20
- package/dist/client/wsMutationExecutor.d.ts +16 -20
- package/dist/client/wsMutationExecutor.js +18 -23
- package/dist/commit/contract.d.ts +493 -0
- package/dist/commit/contract.js +187 -0
- package/dist/commit/index.d.ts +6 -0
- package/dist/commit/index.js +5 -0
- package/dist/context.d.ts +6 -4
- package/dist/context.js +6 -4
- package/dist/coordination/index.d.ts +10 -8
- package/dist/coordination/index.js +14 -12
- package/dist/coordination/schema.d.ts +176 -128
- package/dist/coordination/schema.js +197 -133
- package/dist/coordination/trace.d.ts +9 -10
- package/dist/coordination/trace.js +13 -14
- package/dist/core/DatabaseManager.d.ts +5 -7
- package/dist/core/DatabaseManager.js +15 -19
- package/dist/core/QueryProcessor.d.ts +7 -9
- package/dist/core/QueryProcessor.js +22 -28
- package/dist/core/QueryView.d.ts +8 -8
- package/dist/core/QueryView.js +2 -2
- package/dist/core/StoreManager.d.ts +14 -14
- package/dist/core/StoreManager.js +33 -24
- package/dist/core/ViewRegistry.d.ts +5 -5
- package/dist/core/ViewRegistry.js +4 -4
- package/dist/core/index.d.ts +17 -12
- package/dist/core/index.js +32 -26
- package/dist/core/openIDBWithTimeout.d.ts +38 -36
- package/dist/core/openIDBWithTimeout.js +42 -43
- package/dist/core/queryUtils.d.ts +45 -0
- package/dist/core/queryUtils.js +69 -0
- package/dist/core/storeContract.d.ts +63 -61
- package/dist/core/storeContract.js +8 -12
- package/dist/environment.d.ts +28 -0
- package/dist/environment.js +21 -0
- package/dist/errorCodes.d.ts +107 -99
- package/dist/errorCodes.js +137 -134
- package/dist/errors.d.ts +160 -166
- package/dist/errors.js +155 -158
- package/dist/index.d.ts +36 -27
- package/dist/index.js +91 -86
- package/dist/interfaces/index.d.ts +102 -113
- package/dist/interfaces/index.js +5 -4
- package/dist/keys/index.d.ts +27 -29
- package/dist/keys/index.js +41 -40
- 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 +124 -131
- package/dist/mutators/UndoManager.js +177 -156
- package/dist/mutators/defineMutators.d.ts +23 -34
- 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 +104 -100
- package/dist/policy/types.js +67 -66
- package/dist/query/client.d.ts +28 -23
- package/dist/query/client.js +45 -43
- package/dist/query/types.d.ts +37 -60
- package/dist/query/types.js +13 -33
- package/dist/react/AbloProvider.d.ts +1 -1
- package/dist/react/AbloProvider.js +2 -2
- package/dist/react/context.d.ts +25 -28
- 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 +28 -25
- package/dist/react/useAblo.js +41 -17
- 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 +10 -11
- package/dist/react/useMutationFailureListener.d.ts +8 -8
- package/dist/react/useMutationFailureListener.js +8 -8
- package/dist/react/useMutators.d.ts +11 -11
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useReactive.js +2 -2
- package/dist/react/useSyncStatus.d.ts +4 -6
- package/dist/react/useUndoScope.d.ts +7 -9
- package/dist/react/useUndoScope.js +1 -1
- 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 +20 -24
- package/dist/schema/ddlLock.js +18 -23
- 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 +35 -48
- package/dist/schema/generate.d.ts +12 -12
- package/dist/schema/generate.js +12 -12
- package/dist/schema/index.d.ts +3 -3
- package/dist/schema/index.js +21 -23
- package/dist/schema/model.d.ts +118 -143
- package/dist/schema/model.js +22 -33
- package/dist/schema/openapi.d.ts +10 -9
- package/dist/schema/openapi.js +5 -3
- package/dist/schema/queries.d.ts +29 -31
- package/dist/schema/queries.js +23 -25
- package/dist/schema/relation.d.ts +89 -99
- package/dist/schema/relation.js +13 -13
- package/dist/schema/residency.d.ts +16 -13
- package/dist/schema/residency.js +16 -13
- package/dist/schema/roles.d.ts +36 -43
- package/dist/schema/roles.js +31 -37
- package/dist/schema/schema.d.ts +64 -43
- package/dist/schema/schema.js +31 -32
- package/dist/schema/select.d.ts +13 -13
- package/dist/schema/select.js +13 -13
- package/dist/schema/serialize.d.ts +28 -31
- 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} +26 -49
- 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 +30 -25
- package/dist/source/adapter.js +10 -10
- package/dist/source/adapters/drizzle.d.ts +28 -23
- package/dist/source/adapters/drizzle.js +30 -25
- package/dist/source/adapters/kysely.d.ts +27 -25
- package/dist/source/adapters/kysely.js +24 -23
- package/dist/source/adapters/memory.d.ts +8 -7
- package/dist/source/adapters/memory.js +9 -8
- package/dist/source/adapters/prisma.d.ts +13 -12
- package/dist/source/adapters/prisma.js +22 -25
- package/dist/source/conformance.d.ts +18 -11
- package/dist/source/conformance.js +17 -11
- package/dist/source/connector.d.ts +31 -32
- package/dist/source/connector.js +28 -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 +46 -58
- package/dist/source/factory.js +22 -27
- package/dist/source/index.d.ts +7 -9
- package/dist/source/index.js +12 -14
- package/dist/source/migrations.d.ts +9 -9
- package/dist/source/migrations.js +9 -9
- package/dist/source/next.d.ts +9 -10
- package/dist/source/next.js +6 -7
- package/dist/source/pushQueue.d.ts +69 -47
- package/dist/source/pushQueue.js +32 -28
- package/dist/source/signing.d.ts +46 -17
- package/dist/source/signing.js +28 -11
- package/dist/source/types.d.ts +121 -104
- package/dist/source/types.js +13 -14
- package/dist/stores/ObjectStore.d.ts +24 -12
- package/dist/stores/ObjectStore.js +38 -16
- package/dist/stores/ObjectStoreContract.d.ts +14 -15
- package/dist/stores/SyncActionStore.d.ts +7 -11
- package/dist/stores/SyncActionStore.js +13 -17
- package/dist/surface.d.ts +28 -21
- package/dist/surface.js +29 -20
- package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
- package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
- package/dist/sync/ConnectionManager.d.ts +39 -50
- package/dist/sync/ConnectionManager.js +55 -66
- package/dist/sync/NetworkProbe.d.ts +24 -29
- package/dist/sync/NetworkProbe.js +63 -69
- package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
- package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
- package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
- package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
- package/dist/sync/SyncWebSocket.d.ts +141 -166
- package/dist/sync/SyncWebSocket.js +191 -223
- package/dist/sync/awaitClaimGrant.d.ts +18 -18
- package/dist/sync/awaitClaimGrant.js +11 -11
- package/dist/sync/bootstrapApply.d.ts +34 -24
- package/dist/sync/bootstrapApply.js +27 -19
- package/dist/sync/commitFrames.d.ts +21 -20
- package/dist/sync/commitFrames.js +18 -18
- package/dist/sync/createClaimStream.d.ts +23 -22
- package/dist/sync/createClaimStream.js +105 -23
- package/dist/sync/createPresenceStream.d.ts +19 -18
- package/dist/sync/createPresenceStream.js +25 -26
- package/dist/sync/createSnapshot.d.ts +12 -14
- package/dist/sync/createSnapshot.js +20 -26
- package/dist/sync/credentialLifecycle.d.ts +104 -104
- package/dist/sync/credentialLifecycle.js +140 -147
- package/dist/sync/deltaPipeline.d.ts +36 -34
- package/dist/sync/deltaPipeline.js +64 -65
- package/dist/sync/groupChange.d.ts +63 -61
- package/dist/sync/groupChange.js +74 -78
- package/dist/sync/heartbeat.d.ts +34 -33
- package/dist/sync/heartbeat.js +31 -31
- package/dist/sync/participants.d.ts +19 -19
- package/dist/sync/persistedPrefix.d.ts +12 -0
- package/dist/sync/persistedPrefix.js +22 -0
- package/dist/sync/schemas.d.ts +3 -2
- package/dist/sync/schemas.js +14 -10
- package/dist/sync/syncCursor.d.ts +17 -21
- package/dist/sync/syncCursor.js +17 -21
- package/dist/sync/syncPlan.d.ts +28 -36
- package/dist/sync/syncPlan.js +18 -19
- package/dist/sync/syncPosition.d.ts +54 -49
- package/dist/sync/syncPosition.js +57 -52
- package/dist/sync/wsFrameHandlers.d.ts +35 -36
- package/dist/sync/wsFrameHandlers.js +63 -67
- package/dist/testing/fixtures/bootstrap.d.ts +12 -6
- package/dist/testing/fixtures/bootstrap.js +12 -6
- package/dist/testing/fixtures/deltas.d.ts +30 -33
- package/dist/testing/fixtures/deltas.js +30 -33
- package/dist/testing/fixtures/models.d.ts +11 -10
- package/dist/testing/fixtures/models.js +11 -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 -15
- package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
- package/dist/testing/helpers/wait.d.ts +13 -8
- package/dist/testing/helpers/wait.js +13 -8
- package/dist/testing/index.d.ts +5 -3
- package/dist/testing/index.js +3 -2
- package/dist/testing/mocks/FakeDatabase.d.ts +18 -0
- package/dist/testing/mocks/FakeDatabase.js +10 -0
- 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 +20 -17
- package/dist/testing/mocks/MockSyncContext.js +15 -13
- package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
- package/dist/testing/mocks/MockSyncStore.js +11 -11
- package/dist/testing/mocks/MockWebSocket.d.ts +28 -23
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +244 -181
- package/dist/transactions/TransactionQueue.js +929 -423
- package/dist/transactions/TransactionStore.d.ts +6 -4
- package/dist/transactions/TransactionStore.js +6 -4
- package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
- package/dist/transactions/UnconfirmedWrites.js +104 -0
- package/dist/transactions/coalesceRules.d.ts +41 -17
- package/dist/transactions/coalesceRules.js +40 -17
- package/dist/transactions/commitEnvelope.d.ts +132 -0
- package/dist/transactions/commitEnvelope.js +139 -0
- package/dist/transactions/commitOutboxStore.d.ts +32 -0
- package/dist/transactions/commitOutboxStore.js +26 -0
- package/dist/transactions/commitPayload.d.ts +63 -52
- package/dist/transactions/commitPayload.js +54 -57
- package/dist/transactions/deltaConfirmation.d.ts +20 -22
- package/dist/transactions/deltaConfirmation.js +37 -45
- package/dist/transactions/httpCommitEnvelope.d.ts +43 -0
- package/dist/transactions/httpCommitEnvelope.js +179 -0
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/replayValidation.d.ts +182 -0
- package/dist/transactions/replayValidation.js +156 -0
- package/dist/types/global.d.ts +46 -41
- package/dist/types/global.js +20 -19
- package/dist/types/index.d.ts +71 -77
- package/dist/types/index.js +22 -22
- package/dist/types/modelData.d.ts +6 -8
- package/dist/types/modelData.js +5 -7
- package/dist/types/participant.d.ts +10 -11
- package/dist/types/participant.js +6 -8
- package/dist/types/streams.d.ts +208 -195
- 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} +42 -98
- 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/wire/bootstrapReason.d.ts +9 -0
- package/dist/wire/bootstrapReason.js +8 -0
- 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 +30 -31
- package/dist/wire/errorEnvelope.js +34 -40
- package/dist/wire/frames.d.ts +315 -86
- package/dist/wire/frames.js +47 -33
- package/dist/wire/index.d.ts +18 -14
- package/dist/wire/index.js +32 -27
- package/dist/wire/listEnvelope.d.ts +16 -23
- package/dist/wire/listEnvelope.js +7 -6
- package/dist/wire/protocol.d.ts +25 -32
- package/dist/wire/protocol.js +25 -32
- package/dist/wire/protocolVersion.d.ts +44 -40
- package/dist/wire/protocolVersion.js +44 -40
- package/docs/api.md +10 -10
- package/docs/coordination.md +59 -0
- package/docs/mcp.md +1 -1
- package/package.json +17 -11
- package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
- package/dist/ai-sdk/coordination-context.d.ts +0 -52
- package/dist/core/query-utils.d.ts +0 -34
- package/dist/core/query-utils.js +0 -59
- package/dist/schema/sync-delta-row.js +0 -103
- package/dist/schema/sync-delta-wire.js +0 -102
- 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 -8
- package/dist/server/storage-mode.js +0 -28
- package/dist/source/connector-protocol.d.ts +0 -159
- package/dist/source/connector-protocol.js +0 -161
- package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
- package/dist/transactions/OptimisticEchoTracker.js +0 -104
- package/dist/transactions/mutation-error-handler.d.ts +0 -5
- package/dist/transactions/mutation-error-handler.js +0 -39
- package/dist/transactions/optimistic.d.ts +0 -24
- package/dist/transactions/optimistic.js +0 -45
- package/dist/transactions/persistedReplay.d.ts +0 -93
- package/dist/transactions/persistedReplay.js +0 -105
- package/dist/utils/mobx-setup.d.ts +0 -42
package/dist/query/client.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* HTTP client for the
|
|
2
|
+
* The HTTP client for the sync query endpoint.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* {@link postQuery} is a small wrapper over `fetch` that POSTs a
|
|
5
|
+
* {@link QueryBatch} as JSON to `/sync/query`, attaches the bearer credential
|
|
6
|
+
* as an `Authorization` header, and parses the response into a typed
|
|
7
|
+
* {@link QueryBatchResult}. An HTTP failure is not thrown: it is logged, and
|
|
8
|
+
* every query in the batch comes back with an empty result, so a
|
|
9
|
+
* fire-and-forget caller cannot crash on an unhandled rejection.
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* without duplicating the fetch boilerplate.
|
|
11
|
+
* Higher-level query helpers build on this to issue structured queries without
|
|
12
|
+
* repeating the fetch and error-handling boilerplate.
|
|
13
13
|
*/
|
|
14
14
|
import { z } from 'zod';
|
|
15
15
|
import { translateHttpError } from '../errors.js';
|
|
@@ -18,12 +18,11 @@ import { withAuthHeaders } from '../auth/credentialSource.js';
|
|
|
18
18
|
import { getContext } from '../context.js';
|
|
19
19
|
// ── Response validation ─────────────────────────────────────────────────
|
|
20
20
|
//
|
|
21
|
-
// Each result slot is an array of rows
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
// null.
|
|
21
|
+
// Each result slot is an array of rows, or an object for a bundled response.
|
|
22
|
+
// A per-query failure on the server surfaces here as an empty array rather
|
|
23
|
+
// than an error, so emptiness alone does not distinguish "no rows" from
|
|
24
|
+
// "the query failed." Parsing through Zod normalizes a `null` slot into an
|
|
25
|
+
// empty array, so callers never receive a raw null.
|
|
27
26
|
const QueryResultSchema = z
|
|
28
27
|
.union([z.array(z.unknown()), z.record(z.string(), z.unknown()), z.null()])
|
|
29
28
|
.transform((val) => {
|
|
@@ -37,20 +36,24 @@ const QueryBatchResultSchema = z
|
|
|
37
36
|
})
|
|
38
37
|
.passthrough();
|
|
39
38
|
/**
|
|
40
|
-
*
|
|
41
|
-
* QueryBatchResult.
|
|
39
|
+
* Sends a batch of queries to `/sync/query` and returns the parsed
|
|
40
|
+
* {@link QueryBatchResult}. An HTTP failure is not thrown: it is logged, and
|
|
41
|
+
* every query in the batch comes back with an empty result, which keeps a
|
|
42
|
+
* fire-and-forget caller from crashing on an unhandled rejection. A 401 may
|
|
43
|
+
* first be handed to {@link PostQueryOptions.recoverCredential} for a single
|
|
44
|
+
* retry.
|
|
42
45
|
*
|
|
43
|
-
* The
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
+
* The response preserves order: `results[i]` corresponds to the query at
|
|
47
|
+
* `queries[i]`, so callers can rely on index alignment to pull typed results
|
|
48
|
+
* out of a multi-query batch.
|
|
46
49
|
*/
|
|
47
50
|
export async function postQuery(options, batch) {
|
|
48
51
|
const url = `${options.baseUrl}/sync/query`;
|
|
49
52
|
const timeout = options.fetchTimeout ?? 30_000;
|
|
50
|
-
// At most
|
|
51
|
-
// successful credential recovery (see `recoverCredential`).
|
|
52
|
-
//
|
|
53
|
-
//
|
|
53
|
+
// At most two attempts: the original request, plus one replay after a
|
|
54
|
+
// successful credential recovery (see `recoverCredential`). A second auth
|
|
55
|
+
// rejection falls through to the log-and-empty path, so a wedged credential
|
|
56
|
+
// can never retry-loop.
|
|
54
57
|
for (let attempt = 0;; attempt++) {
|
|
55
58
|
// Race the fetch against a timeout so hung requests don't block
|
|
56
59
|
// the calling helper indefinitely. Fresh controller per attempt.
|
|
@@ -67,13 +70,13 @@ export async function postQuery(options, batch) {
|
|
|
67
70
|
signal: controller.signal,
|
|
68
71
|
});
|
|
69
72
|
if (!response.ok) {
|
|
70
|
-
// Build the typed AbloError for this HTTP failure (same
|
|
71
|
-
// map the throwing paths use) so the log
|
|
72
|
-
// registry `code`
|
|
73
|
-
// 401
|
|
74
|
-
//
|
|
75
|
-
// unhandled rejection
|
|
76
|
-
//
|
|
73
|
+
// Build the typed AbloError for this HTTP failure (the same
|
|
74
|
+
// code-to-class map the throwing paths use) so the log carries a
|
|
75
|
+
// registry `code` — for example an authentication error with
|
|
76
|
+
// `session_expired` on a 401 — rather than a bare status. This path
|
|
77
|
+
// deliberately does not throw, since a fire-and-forget caller could
|
|
78
|
+
// crash on an unhandled rejection. It returns empty slots while still
|
|
79
|
+
// logging a legible Ablo error.
|
|
77
80
|
let body = null;
|
|
78
81
|
try {
|
|
79
82
|
body = await response.clone().json();
|
|
@@ -82,13 +85,12 @@ export async function postQuery(options, batch) {
|
|
|
82
85
|
// non-JSON error page — translateHttpError falls back to status text
|
|
83
86
|
}
|
|
84
87
|
const err = translateHttpError(response.status, body);
|
|
85
|
-
// 401
|
|
86
|
-
// class routes the
|
|
87
|
-
//
|
|
88
|
-
//
|
|
89
|
-
//
|
|
90
|
-
//
|
|
91
|
-
// re-mint itself resolving null, never an ambiguous status.
|
|
88
|
+
// On a 401, hand the failure to the recovery hook once. The recovery
|
|
89
|
+
// class routes the outcome: an expired access credential is re-minted
|
|
90
|
+
// and the request replays; a lost session is terminal and stops here;
|
|
91
|
+
// anything else stops. A bare 401 with no readable code is treated as
|
|
92
|
+
// an expired access credential, so the only terminal path is the
|
|
93
|
+
// re-mint itself coming back empty, never an ambiguous status.
|
|
92
94
|
if (attempt === 0 && response.status === 401 && options.recoverCredential) {
|
|
93
95
|
const recovery = typeof err.code === 'string'
|
|
94
96
|
? classifyRecovery(err.code)
|
|
@@ -101,11 +103,11 @@ export async function postQuery(options, batch) {
|
|
|
101
103
|
continue;
|
|
102
104
|
}
|
|
103
105
|
}
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
//
|
|
107
|
-
//
|
|
108
|
-
//
|
|
106
|
+
// Logged through the level-gated logger, so it honors ABLO_LOG_LEVEL:
|
|
107
|
+
// a `warn` line the app developer can read (the models, the typed
|
|
108
|
+
// message, and a wire `code`), with the forensic detail on a companion
|
|
109
|
+
// `debug` line. The read stays empty until the underlying cause, such
|
|
110
|
+
// as auth or network, is resolved.
|
|
109
111
|
const models = batch.queries.map((q) => q.model).join(', ');
|
|
110
112
|
getContext().logger.warn(`Could not load ${models} — ${err.message} (code: ${err.code ?? response.status}). No results were returned.`);
|
|
111
113
|
getContext().logger.debug('[postQuery.error] query http failure', {
|
package/dist/query/types.d.ts
CHANGED
|
@@ -1,44 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Structured query types for the
|
|
2
|
+
* Structured query types for the `/sync/query` endpoint.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* A query describes a filtered read in a compact wire format. `where` is a flat
|
|
5
|
+
* list of `[column, operator, value]` conditions combined with AND, and
|
|
6
|
+
* `related` names the schema relations to fetch alongside each row. The server
|
|
7
|
+
* compiles a query against your schema: it reads the model's relation metadata
|
|
8
|
+
* to turn `related: ['layers']` into the right join, and turns each condition
|
|
9
|
+
* into a WHERE fragment. The protocol carries no model-specific logic, so
|
|
10
|
+
* adding a model or relation is a schema change rather than a server change.
|
|
8
11
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* plus a PK-only `ids: string[]` batch field. That worked for simple cases
|
|
13
|
-
* but collapsed on two real workloads:
|
|
14
|
-
*
|
|
15
|
-
* 1. "Fetch all layers for these slide IDs" — the IDs are foreign keys
|
|
16
|
-
* (`SlideLayer.slideId`), not primary keys. The old `ids` field
|
|
17
|
-
* filtered on `id`, silently returning empty.
|
|
18
|
-
*
|
|
19
|
-
* 2. "Fetch all layers for this deck" — needs a JOIN through
|
|
20
|
-
* `slides.deck_id → slide_layers.slide_id`. Equality-only `where` had
|
|
21
|
-
* no way to express it, so the Go server hardcoded a dispatch case.
|
|
22
|
-
*
|
|
23
|
-
* Both are generic patterns ("batch by FK column", "filter via relation")
|
|
24
|
-
* that should be first-class in the protocol, not model-specific escape
|
|
25
|
-
* hatches on the server. This shape matches Zero's ZQL:
|
|
26
|
-
*
|
|
27
|
-
* - `where('slideId', 'IN', ids)` → `['slideId', 'IN', ids]`
|
|
28
|
-
* - `.related('layers')` → `related: ['layers']`
|
|
29
|
-
*
|
|
30
|
-
* The server's compiler stays schema-driven: given a model name, it reads
|
|
31
|
-
* the schema's declared relations to emit JOIN SQL, and given a `[col, op,
|
|
32
|
-
* val]` tuple it emits a WHERE fragment — never a switch on specific model
|
|
33
|
-
* names. Adding a new model or relation is a schema change, not a server
|
|
34
|
-
* change.
|
|
12
|
+
* The `IN` operator lets you batch a read by any column, including a foreign
|
|
13
|
+
* key — for example, fetching every layer whose `slideId` falls in a set of
|
|
14
|
+
* ids.
|
|
35
15
|
*/
|
|
36
16
|
/** Primitive operand types allowed in a where clause. */
|
|
37
17
|
export type WherePrimitive = string | number | boolean | null;
|
|
38
18
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
19
|
+
* The comparison operators a {@link WhereClause} may use: equality and
|
|
20
|
+
* inequality, ordering, set membership (`IN` / `NOT IN`), null checks
|
|
21
|
+
* (`IS` / `IS NOT`), and case-sensitive or case-insensitive pattern
|
|
22
|
+
* matching (`LIKE`, `ILIKE`, and their negations).
|
|
42
23
|
*/
|
|
43
24
|
export type WhereOp = '=' | '!=' | '<' | '<=' | '>' | '>=' | 'IN' | 'NOT IN' | 'IS' | 'IS NOT' | 'LIKE' | 'NOT LIKE' | 'ILIKE' | 'NOT ILIKE';
|
|
44
25
|
/**
|
|
@@ -77,20 +58,17 @@ export interface Query {
|
|
|
77
58
|
*/
|
|
78
59
|
model: string;
|
|
79
60
|
/**
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* primary-key-only `ids` field is subsumed by this form.
|
|
61
|
+
* The conditions to filter by, combined with AND. Empty or omitted returns
|
|
62
|
+
* every row the caller may see; reads are still scoped to the caller's
|
|
63
|
+
* organization on the server. Use `['col', 'IN', values]` to batch a read by
|
|
64
|
+
* any column.
|
|
85
65
|
*/
|
|
86
66
|
where?: readonly WhereClause[];
|
|
87
67
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
* Results come back as nested objects under the relation key:
|
|
68
|
+
* The relations to fetch with each row, named as they are declared on this
|
|
69
|
+
* model in the schema. The server resolves each name from the schema's
|
|
70
|
+
* relation metadata and joins the related rows in. They come back nested
|
|
71
|
+
* under the relation key:
|
|
94
72
|
*
|
|
95
73
|
* { __typename: 'Slide', id: '…', layers: [{ __typename: 'SlideLayer', … }] }
|
|
96
74
|
*/
|
|
@@ -119,25 +97,24 @@ export interface QueryBatch {
|
|
|
119
97
|
/** Response body from POST /sync/query. */
|
|
120
98
|
export interface QueryBatchResult {
|
|
121
99
|
/**
|
|
122
|
-
*
|
|
123
|
-
* `queries[i]`. Each element is an array of rows
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
* any `related` keys nested under the row.
|
|
100
|
+
* The result of each query, in request order: `results[i]` corresponds to
|
|
101
|
+
* `queries[i]`. Each element is an array of rows, or an object bundling
|
|
102
|
+
* several named row collections when the source returns more than one. Every
|
|
103
|
+
* row carries a `__typename` field naming its model, so callers can dispatch
|
|
104
|
+
* on it, along with any requested `related` rows nested under their relation
|
|
105
|
+
* key.
|
|
129
106
|
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
107
|
+
* A query that fails on the server comes back as an empty array, which is
|
|
108
|
+
* indistinguishable from a query that simply matched nothing — treat an empty
|
|
109
|
+
* result as "no rows", not as proof the query succeeded. The element type is
|
|
110
|
+
* `unknown` because one batch can mix row shapes, so narrow each result
|
|
111
|
+
* before use.
|
|
135
112
|
*/
|
|
136
113
|
results: unknown[];
|
|
137
114
|
/**
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
115
|
+
* The server watermark observed after the batch ran. Model reads expose this
|
|
116
|
+
* as `stamp`, and callers thread it into `commits.create({ readAt })` so the
|
|
117
|
+
* server can reject a write built on stale data.
|
|
141
118
|
*/
|
|
142
119
|
lastSyncId?: number;
|
|
143
120
|
}
|
package/dist/query/types.js
CHANGED
|
@@ -1,36 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Structured query types for the
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* 1. "Fetch all layers for these slide IDs" — the IDs are foreign keys
|
|
16
|
-
* (`SlideLayer.slideId`), not primary keys. The old `ids` field
|
|
17
|
-
* filtered on `id`, silently returning empty.
|
|
18
|
-
*
|
|
19
|
-
* 2. "Fetch all layers for this deck" — needs a JOIN through
|
|
20
|
-
* `slides.deck_id → slide_layers.slide_id`. Equality-only `where` had
|
|
21
|
-
* no way to express it, so the Go server hardcoded a dispatch case.
|
|
22
|
-
*
|
|
23
|
-
* Both are generic patterns ("batch by FK column", "filter via relation")
|
|
24
|
-
* that should be first-class in the protocol, not model-specific escape
|
|
25
|
-
* hatches on the server. This shape matches Zero's ZQL:
|
|
26
|
-
*
|
|
27
|
-
* - `where('slideId', 'IN', ids)` → `['slideId', 'IN', ids]`
|
|
28
|
-
* - `.related('layers')` → `related: ['layers']`
|
|
29
|
-
*
|
|
30
|
-
* The server's compiler stays schema-driven: given a model name, it reads
|
|
31
|
-
* the schema's declared relations to emit JOIN SQL, and given a `[col, op,
|
|
32
|
-
* val]` tuple it emits a WHERE fragment — never a switch on specific model
|
|
33
|
-
* names. Adding a new model or relation is a schema change, not a server
|
|
34
|
-
* change.
|
|
2
|
+
* Structured query types for the `/sync/query` endpoint.
|
|
3
|
+
*
|
|
4
|
+
* A query describes a filtered read in a compact wire format. `where` is a flat
|
|
5
|
+
* list of `[column, operator, value]` conditions combined with AND, and
|
|
6
|
+
* `related` names the schema relations to fetch alongside each row. The server
|
|
7
|
+
* compiles a query against your schema: it reads the model's relation metadata
|
|
8
|
+
* to turn `related: ['layers']` into the right join, and turns each condition
|
|
9
|
+
* into a WHERE fragment. The protocol carries no model-specific logic, so
|
|
10
|
+
* adding a model or relation is a schema change rather than a server change.
|
|
11
|
+
*
|
|
12
|
+
* The `IN` operator lets you batch a read by any column, including a foreign
|
|
13
|
+
* key — for example, fetching every layer whose `slideId` falls in a set of
|
|
14
|
+
* ids.
|
|
35
15
|
*/
|
|
36
16
|
export {};
|
|
@@ -213,7 +213,7 @@ export declare function useSync<R extends SchemaRecord = SchemaRecord>(): Ablo<R
|
|
|
213
213
|
/**
|
|
214
214
|
* Returns the underlying `SyncStoreContract` (the BaseSyncedStore).
|
|
215
215
|
* Most consumers should prefer the typed hooks (`useQuery` etc.); this
|
|
216
|
-
* is for advanced cases like direct
|
|
216
|
+
* is for advanced cases like direct InstanceCache access or custom
|
|
217
217
|
* reactive bridges. Throws if the provider hasn't mounted the store
|
|
218
218
|
* yet — wrap consumers in `<ClientSideSuspense>` to gate correctly.
|
|
219
219
|
*
|
|
@@ -266,7 +266,7 @@ export function useWatch(opts) {
|
|
|
266
266
|
// Subscribe the connection to the scope's sync groups while mounted +
|
|
267
267
|
// connected — the area-of-interest navigation primitive. No claim, no
|
|
268
268
|
// TTL: a viewer just receives the scope's deltas. Hysteresis (warm TTL)
|
|
269
|
-
// lives in the store's
|
|
269
|
+
// lives in the store's SubscriptionManager, so a quick unmount/remount
|
|
270
270
|
// (tab flip) doesn't re-bootstrap.
|
|
271
271
|
useEffect(() => {
|
|
272
272
|
const scope = opts.scope;
|
|
@@ -431,7 +431,7 @@ export function useSync() {
|
|
|
431
431
|
/**
|
|
432
432
|
* Returns the underlying `SyncStoreContract` (the BaseSyncedStore).
|
|
433
433
|
* Most consumers should prefer the typed hooks (`useQuery` etc.); this
|
|
434
|
-
* is for advanced cases like direct
|
|
434
|
+
* is for advanced cases like direct InstanceCache access or custom
|
|
435
435
|
* reactive bridges. Throws if the provider hasn't mounted the store
|
|
436
436
|
* yet — wrap consumers in `<ClientSideSuspense>` to gate correctly.
|
|
437
437
|
*
|
package/dist/react/context.d.ts
CHANGED
|
@@ -4,55 +4,52 @@ import type { SyncStoreContract } from '../core/storeContract.js';
|
|
|
4
4
|
export type { SyncStoreContract, LocalMutation } from '../core/storeContract.js';
|
|
5
5
|
export interface SyncReactContext {
|
|
6
6
|
store: SyncStoreContract;
|
|
7
|
-
/**
|
|
7
|
+
/** The organization id used as the default scope for reads and writes. */
|
|
8
8
|
organizationId: string;
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* `(schema, modelKey, …)` signatures so non-opting consumers keep
|
|
15
|
-
* 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.
|
|
16
14
|
*
|
|
17
|
-
* The
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
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.
|
|
22
20
|
*/
|
|
23
21
|
schema?: Schema;
|
|
24
22
|
}
|
|
25
23
|
export declare const SyncContext: import("react").Context<SyncReactContext | null>;
|
|
26
24
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
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.
|
|
30
29
|
*/
|
|
31
30
|
export declare function useSyncContext(): SyncReactContext;
|
|
32
31
|
/**
|
|
33
32
|
* Props for SyncProvider.
|
|
34
33
|
*/
|
|
35
34
|
export interface SyncProviderProps {
|
|
36
|
-
/** The sync store
|
|
35
|
+
/** The sync store, which must implement {@link SyncStoreContract}. */
|
|
37
36
|
store: SyncStoreContract;
|
|
38
|
-
/**
|
|
37
|
+
/** The organization id used as the default scope for reads and writes. */
|
|
39
38
|
organizationId: string;
|
|
40
39
|
/**
|
|
41
|
-
*
|
|
42
|
-
* (`useQuery('tasks')`)
|
|
43
|
-
*
|
|
44
|
-
*
|
|
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.
|
|
45
44
|
*/
|
|
46
45
|
schema?: Schema;
|
|
47
46
|
children?: ReactNode;
|
|
48
47
|
}
|
|
49
48
|
/**
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* store from your `Ablo({ schema, apiKey })` client and renders this provider
|
|
56
|
-
* 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.
|
|
57
54
|
*/
|
|
58
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';
|