@abloatai/ablo 0.26.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/CHANGELOG.md +14 -0
- package/README.md +101 -85
- package/dist/BaseSyncedStore.d.ts +85 -88
- package/dist/BaseSyncedStore.js +131 -147
- package/dist/Database.d.ts +54 -68
- package/dist/Database.js +97 -113
- 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 +37 -52
- package/dist/Model.js +46 -61
- 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 +112 -112
- package/dist/SyncClient.js +165 -172
- 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 +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 +167 -119
- package/dist/client/Ablo.d.ts +73 -73
- package/dist/client/Ablo.js +125 -160
- package/dist/client/ApiClient.d.ts +30 -19
- package/dist/client/ApiClient.js +133 -38
- 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 +14 -17
- package/dist/client/createInternalComponents.js +25 -30
- 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 +57 -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 +67 -87
- package/dist/client/options.d.ts +134 -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 +15 -20
- package/dist/client/wsMutationExecutor.js +17 -23
- 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 +12 -14
- package/dist/core/StoreManager.js +21 -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 +131 -132
- package/dist/errors.d.ts +160 -166
- package/dist/errors.js +155 -158
- package/dist/index.d.ts +30 -27
- package/dist/index.js +89 -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 +122 -131
- package/dist/mutators/UndoManager.js +145 -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 +23 -22
- package/dist/react/useAblo.js +16 -14
- 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 +2 -2
- 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 +33 -42
- 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 +10 -11
- package/dist/stores/ObjectStore.js +11 -12
- package/dist/stores/ObjectStoreContract.d.ts +12 -15
- package/dist/stores/SyncActionStore.d.ts +7 -11
- package/dist/stores/SyncActionStore.js +13 -17
- package/dist/surface.d.ts +27 -20
- package/dist/surface.js +27 -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 +139 -165
- 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/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 +3 -3
- package/dist/testing/index.js +2 -2
- 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 +26 -22
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +181 -176
- package/dist/transactions/TransactionQueue.js +338 -350
- 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/commitPayload.d.ts +48 -52
- package/dist/transactions/commitPayload.js +48 -57
- package/dist/transactions/deltaConfirmation.d.ts +20 -22
- package/dist/transactions/deltaConfirmation.js +37 -45
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/{persistedReplay.d.ts → replayValidation.d.ts} +28 -22
- package/dist/transactions/{persistedReplay.js → replayValidation.js} +33 -27
- 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/{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 +79 -86
- package/dist/wire/frames.js +26 -33
- package/dist/wire/index.d.ts +14 -12
- package/dist/wire/index.js +30 -26
- 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/coordination.md +59 -0
- package/package.json +11 -10
- 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/utils/mobx-setup.d.ts +0 -42
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @abloatai/ablo —
|
|
2
|
+
* @abloatai/ablo — the collaboration layer for AI agents and people.
|
|
3
3
|
*
|
|
4
4
|
* ```ts
|
|
5
5
|
* import Ablo from '@abloatai/ablo';
|
|
@@ -14,52 +14,53 @@
|
|
|
14
14
|
* type Entry = Ablo.Peer;
|
|
15
15
|
* ```
|
|
16
16
|
*
|
|
17
|
-
* `Ablo({ schema, apiKey })`
|
|
18
|
-
*
|
|
19
|
-
* runtimes.
|
|
17
|
+
* `Ablo({ schema, apiKey })` returns typed model clients. `Ablo({ apiKey })`
|
|
18
|
+
* returns the stateless HTTP model and commit client, which suits agents, MCP
|
|
19
|
+
* route handlers, and custom runtimes.
|
|
20
20
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
21
|
+
* The whole package reaches you through one name: `Ablo` is at once a factory
|
|
22
|
+
* function, a type, and a namespace. You call model clients with dot access on
|
|
23
|
+
* the instance (`ablo.reports.retrieve(...)`) and reach every supporting type
|
|
24
|
+
* through the namespace (`Ablo.Peer`, `Ablo.Claim`).
|
|
23
25
|
*
|
|
24
|
-
*
|
|
26
|
+
* Related surfaces live on their own import subpaths:
|
|
25
27
|
* @abloatai/ablo/schema — defineSchema, model, z (Zod)
|
|
26
28
|
* @abloatai/ablo/react — <AbloProvider>, useQuery, useMutate
|
|
27
|
-
* @abloatai/ablo/testing — test harnesses
|
|
29
|
+
* @abloatai/ablo/testing — test harnesses and fixtures
|
|
28
30
|
*
|
|
29
|
-
* Reads
|
|
30
|
-
* `.list({ where })` are
|
|
31
|
-
* the
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
31
|
+
* Reads come in two flavors, distinguished by where the data is fetched from.
|
|
32
|
+
* `ablo.<model>.retrieve({ id })` and `.list({ where })` are asynchronous reads
|
|
33
|
+
* that consult the local cache first and fall back to the network, de-duplicating
|
|
34
|
+
* concurrent requests for the same row. They are the default, and the right
|
|
35
|
+
* choice for stateless callers whose local graph starts empty.
|
|
36
|
+
* `ablo.<model>.get(id)`, `.getAll(...)`, and `.getCount(...)` are synchronous
|
|
37
|
+
* snapshots of the already-loaded local graph with no network round-trip — use
|
|
38
|
+
* them in reactive React selectors (`useAblo((ablo) => ablo.<model>.get(id))`)
|
|
39
|
+
* once the graph is warm.
|
|
36
40
|
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* • the `Ablo*Error` classes
|
|
41
|
-
* That's it. If you're reaching past those, you're in advanced territory.
|
|
41
|
+
* What to import, in short:
|
|
42
|
+
* • `Ablo` (the default export), `AbloOptions`, and the `Model*Params` option
|
|
43
|
+
* bags cover what most applications and agents ever need.
|
|
44
|
+
* • the `Ablo*Error` classes let you discriminate failures in catch blocks.
|
|
42
45
|
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* • `dataSource` / `abloSource` —
|
|
46
|
-
* • `defaultPolicy` —
|
|
47
|
-
* • `defineMutators` / `createTransaction` —
|
|
48
|
-
* If you don't recognize one, you don't need it
|
|
46
|
+
* A handful of exports are for advanced use and are marked "Advanced" at their
|
|
47
|
+
* declaration below, each with the one situation it is for:
|
|
48
|
+
* • `dataSource` / `abloSource` — when your own database stays canonical.
|
|
49
|
+
* • `defaultPolicy` — when you customize conflict resolution.
|
|
50
|
+
* • `defineMutators` / `createTransaction` — when you write custom mutators.
|
|
51
|
+
* If you don't recognize one of these, you don't need it.
|
|
49
52
|
*/
|
|
50
53
|
// ── Consumer API ──────────────────────────────────────────────────────────
|
|
51
54
|
// These are the only symbols external consumers should need from this path.
|
|
52
55
|
// Everything else is in a subpath.
|
|
53
|
-
// The
|
|
54
|
-
// one name.
|
|
55
|
-
// `import Ablo
|
|
56
|
-
// `import { Ablo }` also compiles.
|
|
56
|
+
// The primary surface. `Ablo` is a function, a type, and a namespace sharing
|
|
57
|
+
// one name. It is the default export, so `import Ablo from '@abloatai/ablo'`
|
|
58
|
+
// works, and a named export, so `import { Ablo }` compiles too.
|
|
57
59
|
export { Ablo } from './client/Ablo.js';
|
|
58
60
|
export { DEFAULT_CONTENTION_RETRIES } from './client/functionalUpdate.js';
|
|
59
|
-
// The stateless HTTP client is constructed
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
// annotate with the `AbloHttpClient` type (the narrowed return of `transport:'http'`).
|
|
61
|
+
// The stateless HTTP client is constructed through `Ablo({ transport: 'http' })`.
|
|
62
|
+
// There is no separate constructor to import; annotate values with the
|
|
63
|
+
// `AbloHttpClient` type, which is the return type of that call.
|
|
63
64
|
export {} from './client/httpClient.js';
|
|
64
65
|
export { ABLO_DEFAULT_BASE_URL, ABLO_HOSTED_API_DOMAIN, ABLO_HOSTED_HTTP_BASE_URL, normalizeAbloHostedBaseUrl, } from './client/auth.js';
|
|
65
66
|
// Participant types live under `Ablo.Participant.*` —
|
|
@@ -68,81 +69,83 @@ export { ABLO_DEFAULT_BASE_URL, ABLO_HOSTED_API_DOMAIN, ABLO_HOSTED_HTTP_BASE_UR
|
|
|
68
69
|
// `Ablo.Peer`, `Ablo.Claim`. No flat re-exports.
|
|
69
70
|
import { Ablo } from './client/Ablo.js';
|
|
70
71
|
export default Ablo;
|
|
71
|
-
// Advanced
|
|
72
|
-
//
|
|
73
|
-
//
|
|
74
|
-
//
|
|
75
|
-
//
|
|
76
|
-
// `Ablo.Source.*` (`Ablo.Source.Operation`, `Ablo.Source.Commit.Params`).
|
|
72
|
+
// Advanced, and rarely imported. The storage adapter for Data Source mode,
|
|
73
|
+
// where Ablo coordinates state while the canonical rows stay in your own
|
|
74
|
+
// database. The default is Ablo-managed storage; reach for this only when you
|
|
75
|
+
// have deliberately chosen to keep your database canonical. The matching types
|
|
76
|
+
// live under `Ablo.Source.*` (`Ablo.Source.Operation`, `Ablo.Source.Commit.Params`).
|
|
77
77
|
export { dataSource, abloSource, sourceEventForOperation, signAbloSourceRequest, verifyAbloSourceRequest, } from './source/index.js';
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
//
|
|
78
|
+
// Serves the Data Source `commit`, `load`, and `list` operations over an
|
|
79
|
+
// outbound WebSocket, so a database with no public inbound URL (running on a
|
|
80
|
+
// developer's machine or inside a locked-down network) can still be reached by
|
|
81
|
+
// dialing out to Ablo rather than accepting an inbound connection.
|
|
81
82
|
export { createSourceConnector, } from './source/connector.js';
|
|
82
83
|
// Schema DSL is intentionally published from `@abloatai/ablo/schema`.
|
|
83
84
|
// Keeping it out of the root import preserves one clean runtime surface:
|
|
84
85
|
// `import Ablo from '@abloatai/ablo'`.
|
|
85
|
-
// Advanced
|
|
86
|
-
//
|
|
87
|
-
// to
|
|
88
|
-
//
|
|
86
|
+
// Advanced, and rarely imported. The default conflict policy rejects writes
|
|
87
|
+
// premised on stale data and is already applied on the server, so import
|
|
88
|
+
// `defaultPolicy` only to build a custom policy on top of it. Leave it be and
|
|
89
|
+
// stale writes are rejected safely. The matching types live under `Ablo.Conflict.*`.
|
|
89
90
|
export { defaultPolicy, capabilityPreemptPolicy, interpretConflictAxis } from './policy/index.js';
|
|
90
|
-
//
|
|
91
|
-
//
|
|
92
|
-
//
|
|
91
|
+
// The typed error hierarchy. One import brings in every class you need to
|
|
92
|
+
// tell failures apart — by `e instanceof AbloX` or `e.type === 'AbloX'` — along
|
|
93
|
+
// with the helper that translates an HTTP response into the right class.
|
|
93
94
|
export { SyncSessionError, AbloError, AbloAuthenticationError, AbloPermissionError, AbloRateLimitError, AbloIdempotencyError, AbloConnectionError, AbloValidationError, AbloNotFoundError, AbloServerError, AbloStaleContextError, AbloClaimedError, AbloContentionError, CapabilityError, translateHttpError, hasWireCode, errorFromWire, toAbloError, ERROR_CODES, ERROR_CONTRACT_VERSION, errorCodeSpec, isRetryableCode, classifyRecovery, recoveryClassSchema, RECOVERY_CLASSES, } from './errors.js';
|
|
94
|
-
//
|
|
95
|
-
// the AbloError
|
|
96
|
-
//
|
|
97
|
-
//
|
|
95
|
+
// The wire contract for errors, with no dependencies: the JSON envelope shape
|
|
96
|
+
// plus the table mapping each AbloError subclass to an HTTP status. A server
|
|
97
|
+
// that returns Ablo errors can assert against these so its responses never
|
|
98
|
+
// drift from what the client expects.
|
|
98
99
|
export { errorEnvelope, statusForType } from './wire/errorEnvelope.js';
|
|
99
100
|
export { WS_BEARER_SUBPROTOCOL_PREFIX, WS_SYNC_SUBPROTOCOL } from './auth/credentialSource.js';
|
|
100
101
|
export { ENVIRONMENTS, environmentSchema, normalizeEnvironment, environmentFromKeyPrefix, environmentToKeyPrefix, isSandboxEnvironment, } from './environment.js';
|
|
101
|
-
//
|
|
102
|
-
// write
|
|
103
|
-
//
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
//
|
|
102
|
+
// The write-options contract: the single Zod schema for the option bag every
|
|
103
|
+
// write accepts (`ablo.<model>.create/update/delete`, `commits.create`, and the
|
|
104
|
+
// HTTP model routes). The SDK validates against it at each boundary, and it is
|
|
105
|
+
// exported so you can validate or assemble options before a call — for example,
|
|
106
|
+
// as the input schema of an agent tool. It is the runtime counterpart of the
|
|
107
|
+
// `MutationOptions` type.
|
|
107
108
|
export { writeOptionsSchema, onStaleModeSchema, assertWriteOptions, } from './client/writeOptionsSchema.js';
|
|
108
|
-
//
|
|
109
|
-
//
|
|
110
|
-
//
|
|
111
|
-
//
|
|
109
|
+
// The value handed back to a writer whose change hit a stale-context conflict
|
|
110
|
+
// under `onStale: 'notify'`. Instead of throwing, the commit succeeds and
|
|
111
|
+
// returns this notification so the caller can reconcile against the current
|
|
112
|
+
// value and retry rather than discard its work.
|
|
112
113
|
export { staleNotificationSchema, readDependencySchema } from './coordination/schema.js';
|
|
113
|
-
//
|
|
114
|
-
//
|
|
115
|
-
// `new ClaimLog()`
|
|
114
|
+
// Collects claim events and stale-write collisions into an ordered list you can
|
|
115
|
+
// print to inspect coordination, or read through `collisions()` to assert on in
|
|
116
|
+
// tests. Pass `new ClaimLog()` as `Ablo({ observability })`.
|
|
116
117
|
export { ClaimLog, formatClaim, formatConflict } from './coordination/trace.js';
|
|
117
118
|
// Spread this to provide a custom `observability` that overrides only the hooks
|
|
118
119
|
// you care about (e.g. captureClaim) and no-ops the rest.
|
|
119
120
|
export { noopObservability } from './SyncEngineContext.js';
|
|
120
|
-
//
|
|
121
|
-
// IndexedDB backing store
|
|
121
|
+
// Detects a stuck local store: use these to recognize when the browser's
|
|
122
|
+
// IndexedDB backing store fails to open in time, so your app can show a
|
|
123
|
+
// recovery screen instead of hanging.
|
|
122
124
|
export { IDBOpenTimeoutError, isStorageOpenTimeout } from './core/openIDBWithTimeout.js';
|
|
123
|
-
//
|
|
124
|
-
//
|
|
125
|
-
//
|
|
125
|
+
// A machine-readable manifest of the SDK's public verb and option names, bound
|
|
126
|
+
// at compile time to the real types so the lists can never name a method or
|
|
127
|
+
// option the API doesn't have. Useful for generating documentation or tooling
|
|
128
|
+
// that needs to enumerate the surface.
|
|
126
129
|
export { PUBLIC_MODEL_VERBS, PUBLIC_LIST_OPTION_KEYS, PUBLIC_ABLO_OPTION_KEYS, } from './surface.js';
|
|
127
|
-
// Advanced
|
|
128
|
-
// `ablo.<model>.create/update/delete
|
|
129
|
-
//
|
|
130
|
-
//
|
|
130
|
+
// Advanced, and rarely imported. Custom mutators. Ordinary writes go through
|
|
131
|
+
// `ablo.<model>.create/update/delete`; reach for `defineMutators` only when you
|
|
132
|
+
// need a named, multi-step mutation with its own undo behavior. The matching
|
|
133
|
+
// types live under the `Ablo` namespace:
|
|
131
134
|
// Ablo.Mutator.Fn, Ablo.Transaction
|
|
132
135
|
// Ablo.Mutator.UndoEntry, Ablo.Mutator.InverseOp
|
|
133
136
|
// Ablo.Query, Ablo.QueryBatch, Ablo.QueryBatchResult
|
|
134
137
|
export { defineMutators } from './mutators/defineMutators.js';
|
|
135
|
-
// `createTransaction`
|
|
136
|
-
//
|
|
137
|
-
//
|
|
138
|
-
//
|
|
139
|
-
// pass it as `{ tx, args }` to the mutator function.
|
|
138
|
+
// `createTransaction` lets callers outside React — server-side workers, agent
|
|
139
|
+
// runtimes — run custom mutators without the `useMutators` hook. Build a
|
|
140
|
+
// transaction from the client's schema, store, and organization id, then pass
|
|
141
|
+
// it to your mutator function as `{ tx, args }`.
|
|
140
142
|
export { createTransaction } from './mutators/Transaction.js';
|
|
141
143
|
// Undo runtime is intentionally not part of the public root surface. App code
|
|
142
144
|
// uses `useUndoScope` from `@abloatai/ablo/react`.
|
|
143
|
-
// JSON comparison helpers. A `field.json()` value
|
|
144
|
-
// column
|
|
145
|
-
// order
|
|
146
|
-
//
|
|
147
|
-
//
|
|
145
|
+
// JSON comparison helpers. A `field.json()` value stored in a Postgres `jsonb`
|
|
146
|
+
// column can come back with its object keys reordered, because jsonb does not
|
|
147
|
+
// preserve key order. A naive `JSON.stringify(a) === JSON.stringify(b)` check
|
|
148
|
+
// then reports a difference that isn't real — a common trap when reconciling an
|
|
149
|
+
// Ablo row against external editor state. These compare independent of key
|
|
150
|
+
// order, so use them instead.
|
|
148
151
|
export { deepEqual, stableStringify } from './utils/json.js';
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* The interfaces you implement to plug the SDK into your own environment.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* The SDK depends on these contracts rather than any specific framework, so you
|
|
5
|
+
* provide the concrete implementations — logging, observability, analytics,
|
|
6
|
+
* session-error detection, online-status checks, and the transport that carries
|
|
7
|
+
* mutations to your backend. The SDK ships sensible no-op defaults where it can.
|
|
7
8
|
*/
|
|
8
9
|
import type { StaleNotification, ReadDependency, ParticipantKind } from '../coordination/schema.js';
|
|
9
10
|
export interface SyncLogger {
|
|
@@ -69,10 +70,11 @@ export interface CommitZeroSyncIdDetails {
|
|
|
69
70
|
operations: string[];
|
|
70
71
|
}
|
|
71
72
|
/**
|
|
72
|
-
*
|
|
73
|
-
* entered
|
|
74
|
-
* who asked, who waited behind whom, who
|
|
75
|
-
* Each phase
|
|
73
|
+
* A single event in the life of a claim. `phase` is the state the claim has just
|
|
74
|
+
* entered, and the sequence of phases is the trail you follow to see how two
|
|
75
|
+
* participants collided on a row — who asked for it, who waited behind whom, who
|
|
76
|
+
* was turned away, and whose lease lapsed. Each phase corresponds to a `claim_*`
|
|
77
|
+
* frame on the wire.
|
|
76
78
|
*/
|
|
77
79
|
export interface ClaimEvent {
|
|
78
80
|
phase: 'acquired' | 'queued' | 'granted' | 'lost' | 'rejected' | 'expired';
|
|
@@ -91,10 +93,10 @@ export interface ClaimEvent {
|
|
|
91
93
|
reason?: string;
|
|
92
94
|
}
|
|
93
95
|
/**
|
|
94
|
-
* A committed `onStale: 'notify'` write whose premise moved
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
96
|
+
* A committed `onStale: 'notify'` write whose premise had moved. The commit
|
|
97
|
+
* succeeded, but the guarded operations were not written because the row had
|
|
98
|
+
* changed since the caller's `readAt`, and the engine returned the current value
|
|
99
|
+
* so the caller can reconcile. Records which rows and fields collided.
|
|
98
100
|
*/
|
|
99
101
|
export interface ConflictEvent {
|
|
100
102
|
/** The client idempotency key whose write was notified. */
|
|
@@ -110,8 +112,9 @@ export interface ConflictEvent {
|
|
|
110
112
|
/** Span attributes for performance monitoring */
|
|
111
113
|
export type SpanAttributes = Record<string, string | number | boolean | undefined>;
|
|
112
114
|
/**
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
+
* The observability hooks the SDK calls to report its own lifecycle. The SDK
|
|
116
|
+
* ships a no-op default; provide your own to forward these events to a monitoring
|
|
117
|
+
* tool such as Sentry, Datadog, or OpenTelemetry.
|
|
115
118
|
*/
|
|
116
119
|
export interface SyncObservabilityProvider {
|
|
117
120
|
/** Set user/org context for error grouping */
|
|
@@ -178,30 +181,29 @@ export interface ModelDebugLoggerContract {
|
|
|
178
181
|
export interface CommitResult {
|
|
179
182
|
lastSyncId: number;
|
|
180
183
|
/**
|
|
181
|
-
* Stale-context notifications
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
*
|
|
184
|
+
* Stale-context notifications. Present only when a write guarded with
|
|
185
|
+
* `onStale: 'notify'` collided with a concurrent change: rather than throwing
|
|
186
|
+
* an `AbloStaleContextError`, the commit succeeds and reports the collision
|
|
187
|
+
* here so the caller can reconcile. See {@link StaleNotification}.
|
|
185
188
|
*/
|
|
186
189
|
notifications?: StaleNotification[];
|
|
187
190
|
/**
|
|
188
|
-
* Ids of
|
|
189
|
-
*
|
|
191
|
+
* Ids of update or delete targets that matched no rows. Present, and non-empty,
|
|
192
|
+
* only when a write missed the row it addressed.
|
|
190
193
|
*/
|
|
191
194
|
missingIds?: string[];
|
|
192
195
|
}
|
|
193
196
|
/**
|
|
194
|
-
* Per-call
|
|
195
|
-
*
|
|
196
|
-
* everywhere; omitted fields fall back to sensible defaults.
|
|
197
|
+
* Per-call options accepted by any mutation, passed as the last argument.
|
|
198
|
+
* Every field is optional; omitted fields fall back to sensible defaults.
|
|
197
199
|
*
|
|
198
|
-
* - `idempotencyKey` — when set, the server caches the response for
|
|
199
|
-
*
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
*
|
|
203
|
-
* - `label` — human-readable
|
|
204
|
-
*
|
|
200
|
+
* - `idempotencyKey` — when set, the server caches the response for 24 hours and
|
|
201
|
+
* returns the cached result on any retry using the same key. When omitted, the
|
|
202
|
+
* SDK generates a fresh UUID per mutation, so every call is retry-safe by
|
|
203
|
+
* default. Pass `{ idempotencyKey: null }` for the rare case where you want a
|
|
204
|
+
* write that is not retry-safe.
|
|
205
|
+
* - `label` — a human-readable tag recorded with the mutation for debugging, such
|
|
206
|
+
* as "nightly cleanup" or "user click".
|
|
205
207
|
*/
|
|
206
208
|
export interface MutationOptions {
|
|
207
209
|
idempotencyKey?: string | null;
|
|
@@ -209,86 +211,76 @@ export interface MutationOptions {
|
|
|
209
211
|
wait?: 'queued' | 'confirmed';
|
|
210
212
|
readAt?: number | null;
|
|
211
213
|
onStale?: 'reject' | 'overwrite' | 'notify' | null;
|
|
212
|
-
/**
|
|
213
|
-
*
|
|
214
|
-
*
|
|
215
|
-
*
|
|
214
|
+
/** The id (or `{ id }`) of the claim this write belongs to. This is the
|
|
215
|
+
* low-level reference the commit carries so the write is attributed to a claim
|
|
216
|
+
* and can pass the holder's own lock. It is distinct from the `claim` handle on
|
|
217
|
+
* the model write parameters, which is the higher-level object you usually pass. */
|
|
216
218
|
claimRef?: string | {
|
|
217
219
|
readonly id: string;
|
|
218
220
|
} | null;
|
|
219
221
|
/**
|
|
220
|
-
*
|
|
221
|
-
* `
|
|
222
|
-
* populates this anymore (write attribution rides on the claim
|
|
223
|
-
* id). Kept optional for wire-compat; always `null` from the client.
|
|
222
|
+
* Reserved lineage field, forwarded on the wire as `causedByTaskId`. The client
|
|
223
|
+
* always sends `null`; write attribution now travels on the claim id instead.
|
|
224
224
|
*/
|
|
225
225
|
causedByTaskId?: string | null;
|
|
226
226
|
/**
|
|
227
|
-
* Batch-level read dependencies
|
|
228
|
-
*
|
|
229
|
-
* (`{group,readAt}`) this write was premised on
|
|
230
|
-
* moved since `readAt` and
|
|
231
|
-
*
|
|
227
|
+
* Batch-level read dependencies — the answer to "did anything I looked at
|
|
228
|
+
* change?" Each entry is a row (`{ model, id, readAt, fields? }`) or a sync
|
|
229
|
+
* group (`{ group, readAt }`) that this write was premised on. The server
|
|
230
|
+
* checks that none of them moved since their `readAt` and applies the entry's
|
|
231
|
+
* `onStale` behavior to the whole batch. This is distinct from the per-operation
|
|
232
|
+
* `readAt`, which guards only the row being written.
|
|
232
233
|
*/
|
|
233
234
|
reads?: ReadDependency[] | null;
|
|
234
235
|
}
|
|
235
236
|
/**
|
|
236
|
-
* The
|
|
237
|
-
*
|
|
238
|
-
*
|
|
239
|
-
*
|
|
240
|
-
*
|
|
241
|
-
* (`wait` at the proxy's confirmation await, `claim` server-side via
|
|
242
|
-
* the active lease on the entity).
|
|
237
|
+
* The subset of {@link MutationOptions} that travels with each write as it is
|
|
238
|
+
* queued offline and sent on the wire. A single shared type keeps the public
|
|
239
|
+
* parameters, the offline queue, and the wire format from diverging. `wait` and
|
|
240
|
+
* `claim` are deliberately absent: both are resolved on the client before a write
|
|
241
|
+
* is staged, so neither reaches this layer.
|
|
243
242
|
*/
|
|
244
243
|
export type WriteOptions = Pick<MutationOptions, 'readAt' | 'onStale' | 'idempotencyKey' | 'label'>;
|
|
245
|
-
/** A single mutation
|
|
246
|
-
*
|
|
244
|
+
/** A single mutation within a batch. Its `options` travel with it so the server
|
|
245
|
+
* can cache and replay the operation for idempotent retries. */
|
|
247
246
|
export interface MutationOperation {
|
|
248
247
|
type: string;
|
|
249
248
|
model: string;
|
|
250
249
|
id: string;
|
|
251
250
|
input?: Record<string, unknown>;
|
|
252
251
|
/**
|
|
253
|
-
*
|
|
254
|
-
*
|
|
255
|
-
*
|
|
256
|
-
* optimistic
|
|
257
|
-
* the matching id via `OptimisticEchoTracker` and skips the pool
|
|
258
|
-
* mutation — see `SyncClient.applyDeltaBatchToPool`).
|
|
252
|
+
* A client-side id for this single operation. The server stamps it onto the
|
|
253
|
+
* resulting `sync_deltas.transaction_id`, so when the confirming delta arrives
|
|
254
|
+
* back over the sync stream the client can recognize it as an echo of its own
|
|
255
|
+
* optimistic write and skip re-applying it locally.
|
|
259
256
|
*
|
|
260
|
-
*
|
|
261
|
-
*
|
|
262
|
-
*
|
|
263
|
-
*
|
|
264
|
-
* for echo matching). Both can coexist on the wire.
|
|
257
|
+
* This is distinct from the batch-level `client_tx_id` that idempotency uses:
|
|
258
|
+
* that key de-duplicates a retried batch (a request-level cache), whereas this
|
|
259
|
+
* id identifies one row within a batch (for echo matching). Both can appear on
|
|
260
|
+
* the wire at once.
|
|
265
261
|
*/
|
|
266
262
|
transactionId?: string;
|
|
267
263
|
readAt?: number | null;
|
|
268
264
|
onStale?: 'reject' | 'overwrite' | 'notify' | null;
|
|
269
265
|
/**
|
|
270
|
-
* Per-
|
|
271
|
-
* the
|
|
272
|
-
*
|
|
273
|
-
* fields carried over the wire.
|
|
266
|
+
* Per-operation idempotency and audit metadata. `idempotencyKey` is also the
|
|
267
|
+
* cache key the server uses to de-duplicate retries; `label` is stored for
|
|
268
|
+
* debugging. These are the only {@link MutationOptions} fields sent on the wire.
|
|
274
269
|
*/
|
|
275
270
|
options?: Pick<MutationOptions, 'idempotencyKey' | 'label'>;
|
|
276
271
|
}
|
|
277
272
|
/**
|
|
278
|
-
*
|
|
279
|
-
*
|
|
280
|
-
*
|
|
273
|
+
* The transport that carries mutations to your backend. The SDK calls the
|
|
274
|
+
* methods on this interface; you implement them over whatever transport you use —
|
|
275
|
+
* an HTTP API, a WebSocket, or something else.
|
|
281
276
|
*/
|
|
282
277
|
export interface MutationExecutor {
|
|
283
278
|
/**
|
|
284
|
-
*
|
|
285
|
-
* `options`
|
|
286
|
-
* idempotencyKey
|
|
287
|
-
*
|
|
288
|
-
*
|
|
289
|
-
* universal mental model for atomic writes (DB transactions, git,
|
|
290
|
-
* Firestore). Replaces the older `batchAck` name from the retired
|
|
291
|
-
* GraphQL path.
|
|
279
|
+
* Commits a batch of mutations atomically and returns the sync
|
|
280
|
+
* acknowledgement. The `options` argument applies to the whole batch, while
|
|
281
|
+
* per-operation `idempotencyKey` and `label` live on each
|
|
282
|
+
* {@link MutationOperation}. The method name matches the `{ type: 'commit' }`
|
|
283
|
+
* frame on the wire.
|
|
292
284
|
*/
|
|
293
285
|
commit(operations: MutationOperation[], options?: MutationOptions): Promise<CommitResult>;
|
|
294
286
|
/** Execute a create mutation for a specific model */
|
|
@@ -321,63 +313,60 @@ export interface MutationExecutor {
|
|
|
321
313
|
onSessionExpired?(callback: () => void): void;
|
|
322
314
|
}
|
|
323
315
|
/**
|
|
324
|
-
* Application-specific configuration for the sync engine
|
|
325
|
-
*
|
|
326
|
-
* embedded in TransactionQueue, Database, and Model.
|
|
316
|
+
* Application-specific configuration for the sync engine, describing how your
|
|
317
|
+
* models relate so the engine can order and merge writes correctly.
|
|
327
318
|
*/
|
|
328
319
|
export interface SyncEngineConfig {
|
|
329
320
|
/**
|
|
330
|
-
*
|
|
331
|
-
*
|
|
332
|
-
*
|
|
333
|
-
*
|
|
334
|
-
*
|
|
335
|
-
*
|
|
336
|
-
*
|
|
337
|
-
*
|
|
338
|
-
* for consumer overrides). Apps rarely need to touch this — override
|
|
339
|
-
* through `configOverrides.modelCreatePriority` only when the schema's
|
|
340
|
-
* declared relations don't reflect an operational constraint (e.g. a
|
|
341
|
-
* polymorphic FK the SDK can't see).
|
|
321
|
+
* The order in which to create models, so a row is never inserted before the
|
|
322
|
+
* parent row its foreign key points at. Keyed by each model's type name, with
|
|
323
|
+
* lower numbers created first, so parents precede children. The engine fills
|
|
324
|
+
* this in automatically by walking the schema's `belongsTo` relations — a model
|
|
325
|
+
* with no parents gets 10, its children 20, their children 30, and so on,
|
|
326
|
+
* stepping by 10 to leave room for overrides. You rarely set this by hand;
|
|
327
|
+
* override it only when a relation the schema can't see (such as a polymorphic
|
|
328
|
+
* foreign key) imposes an ordering the engine wouldn't otherwise know about.
|
|
342
329
|
*/
|
|
343
330
|
modelCreatePriority: ReadonlyMap<string, number>;
|
|
344
331
|
/**
|
|
345
|
-
*
|
|
346
|
-
*
|
|
347
|
-
*
|
|
348
|
-
* parents but earlier than declared grandchildren — a safe middle.
|
|
332
|
+
* The create priority for a model not listed in {@link modelCreatePriority}.
|
|
333
|
+
* It sits in the middle of the range, so an unlisted model is created after
|
|
334
|
+
* declared parents but before declared grandchildren — a safe default.
|
|
349
335
|
*/
|
|
350
336
|
defaultCreatePriority: number;
|
|
351
337
|
/**
|
|
352
|
-
*
|
|
353
|
-
* ordering
|
|
354
|
-
* than any
|
|
338
|
+
* The priority for update, delete, archive, and unarchive operations. These
|
|
339
|
+
* need no ordering among themselves — the row already exists when they run —
|
|
340
|
+
* so this is set higher than any create priority to ensure creates go first.
|
|
355
341
|
*/
|
|
356
342
|
defaultNonCreatePriority: number;
|
|
357
343
|
/**
|
|
358
|
-
*
|
|
359
|
-
*
|
|
360
|
-
*
|
|
344
|
+
* Fields to preserve when merging a partial update into the local store. A
|
|
345
|
+
* change usually carries only the fields that changed; listing a model's
|
|
346
|
+
* essential fields here keeps them from being dropped during that merge.
|
|
347
|
+
* For example: `{ Task: ['title', 'projectId'], Slide: ['deckId', 'order'] }`.
|
|
361
348
|
*/
|
|
362
349
|
essentialFields: Readonly<Record<string, readonly string[]>>;
|
|
363
350
|
/**
|
|
364
|
-
*
|
|
365
|
-
*
|
|
366
|
-
*
|
|
351
|
+
* A fallback map from class name to model name, used to resolve a model's name
|
|
352
|
+
* when the usual lookup fails — for instance, when a bundler has minified the
|
|
353
|
+
* class names. For example: `{ TaskModel: 'Task', ProjectModel: 'Project' }`.
|
|
367
354
|
*/
|
|
368
355
|
classNameFallbackMap: Readonly<Record<string, string>>;
|
|
369
356
|
/**
|
|
370
|
-
*
|
|
371
|
-
* `
|
|
372
|
-
* schema drift:
|
|
373
|
-
* the SDK warns
|
|
374
|
-
*
|
|
357
|
+
* The content hash of the schema this client was built against — the same hash
|
|
358
|
+
* the `ablo push` command and the server compute. It exists only to detect
|
|
359
|
+
* schema drift: if the server reports a different active hash when the client
|
|
360
|
+
* connects, the SDK warns you to run `ablo push`, so drift surfaces as a clear
|
|
361
|
+
* message rather than a confusing database error later. It is advisory, not
|
|
362
|
+
* enforced.
|
|
375
363
|
*/
|
|
376
364
|
expectedSchemaHash?: string;
|
|
377
365
|
}
|
|
378
366
|
/**
|
|
379
|
-
*
|
|
380
|
-
*
|
|
367
|
+
* Extends the WebSocket event map with your own collaboration events, such as
|
|
368
|
+
* cursor positions or selections, beyond the core delta, presence, and
|
|
369
|
+
* bootstrap events.
|
|
381
370
|
*/
|
|
382
371
|
export interface WebSocketEventConfig {
|
|
383
372
|
/** Additional event type names beyond the core delta/presence/bootstrap events */
|
package/dist/interfaces/index.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* The interfaces you implement to plug the SDK into your own environment.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* The SDK depends on these contracts rather than any specific framework, so you
|
|
5
|
+
* provide the concrete implementations — logging, observability, analytics,
|
|
6
|
+
* session-error detection, online-status checks, and the transport that carries
|
|
7
|
+
* mutations to your backend. The SDK ships sensible no-op defaults where it can.
|
|
7
8
|
*/
|
|
8
9
|
export {};
|