@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/SyncClient.d.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
2
|
+
* Applies model mutations and manages the offline write queue. The
|
|
3
|
+
* SyncClient turns local create, update, delete, and archive calls into
|
|
4
|
+
* optimistic changes, holds them while the client is offline, sends them to
|
|
5
|
+
* the server when connectivity returns, and resolves conflicts when the
|
|
6
|
+
* server's version of a row disagrees with the local one. It sits between the
|
|
7
|
+
* reactive object pool and the {@link TransactionQueue} that delivers writes
|
|
8
|
+
* over the network.
|
|
9
9
|
*/
|
|
10
|
-
import {
|
|
10
|
+
import { InstanceCache } from './InstanceCache.js';
|
|
11
11
|
import { Model } from './Model.js';
|
|
12
12
|
import { EventEmitter } from 'events';
|
|
13
13
|
import { TransactionQueue } from './transactions/TransactionQueue.js';
|
|
14
|
-
import { type
|
|
14
|
+
import { type UnconfirmedWritesMetrics } from './transactions/UnconfirmedWrites.js';
|
|
15
15
|
import type { Database } from './Database.js';
|
|
16
16
|
import type { WriteOptions } from './interfaces/index.js';
|
|
17
17
|
import { SyncPosition } from './sync/syncPosition.js';
|
|
@@ -50,33 +50,29 @@ export declare class SyncClient extends EventEmitter {
|
|
|
50
50
|
private organizationId;
|
|
51
51
|
private pendingMutations;
|
|
52
52
|
/**
|
|
53
|
-
* Tracks
|
|
54
|
-
* the server has not yet confirmed.
|
|
55
|
-
* to recognize
|
|
56
|
-
*
|
|
57
|
-
* because the delta is the authoritative version of the row.
|
|
53
|
+
* Tracks the ids of transactions the client has applied optimistically but
|
|
54
|
+
* the server has not yet confirmed. When a delta arrives, the receive path
|
|
55
|
+
* consults this set to recognize the echo of the client's own mutation and
|
|
56
|
+
* skip the now-redundant pool update; the IndexedDB write still runs,
|
|
57
|
+
* because the delta is the authoritative version of the row. Without this
|
|
58
|
+
* discriminator, an optimistically applied delete followed by a
|
|
59
|
+
* server-confirmed create echo would resurrect the row for the window
|
|
60
|
+
* between the two confirmations.
|
|
58
61
|
*
|
|
59
|
-
* The
|
|
60
|
-
*
|
|
61
|
-
* it, an optimistically-applied DELETE followed by a
|
|
62
|
-
* server-confirming CREATE echo resurrects the row for the window
|
|
63
|
-
* between the two confirmations (the chart-delete flicker).
|
|
64
|
-
*
|
|
65
|
-
* Bounded with FIFO eviction; observability via `getEchoMetrics()`.
|
|
62
|
+
* The set is bounded with first-in-first-out eviction, and
|
|
63
|
+
* {@link SyncClient.getEchoMetrics} exposes its counters.
|
|
66
64
|
*/
|
|
67
65
|
private readonly echoTracker;
|
|
68
66
|
private connectionState;
|
|
69
|
-
private offlineSince?;
|
|
70
|
-
private maxRetries;
|
|
71
67
|
private isDisposed;
|
|
72
68
|
/**
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* `
|
|
76
|
-
*
|
|
69
|
+
* The client's position in the global delta order, held as the single
|
|
70
|
+
* canonical {@link SyncPosition} instance. The store advances `applied` and
|
|
71
|
+
* `persisted` as deltas land, the queue advances `acked` on commit
|
|
72
|
+
* responses, and snapshots and claims read `readFloor`.
|
|
77
73
|
*/
|
|
78
74
|
readonly position: SyncPosition;
|
|
79
|
-
constructor(objectPool:
|
|
75
|
+
constructor(objectPool: InstanceCache, database: Database);
|
|
80
76
|
/**
|
|
81
77
|
* Setup network monitoring handlers
|
|
82
78
|
*/
|
|
@@ -104,20 +100,20 @@ export declare class SyncClient extends EventEmitter {
|
|
|
104
100
|
*/
|
|
105
101
|
private setupTransactionRollbackHandling;
|
|
106
102
|
/**
|
|
107
|
-
* Forward reconciliation requests from TransactionQueue to the
|
|
108
|
-
* When delta confirmation times out,
|
|
109
|
-
* instead of rolling back
|
|
110
|
-
*
|
|
103
|
+
* Forward reconciliation requests from the {@link TransactionQueue} to the
|
|
104
|
+
* sync layer. When delta confirmation times out, the queue emits
|
|
105
|
+
* `reconciliation:needed` instead of rolling back, so optimistic state the
|
|
106
|
+
* server may already have committed is never destroyed.
|
|
111
107
|
*/
|
|
112
108
|
private setupReconciliationForwarding;
|
|
113
109
|
/**
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
110
|
+
* Persist unconfirmed transactions to IndexedDB. When delta-confirmation
|
|
111
|
+
* retries are exhausted, the transaction is cached so it survives a tab
|
|
112
|
+
* close. On the next session, a WebSocket reconnect and delta catch-up
|
|
113
|
+
* deliver the missing deltas and confirm the transaction.
|
|
118
114
|
*/
|
|
119
115
|
private setupAwaitingTransactionPersistence;
|
|
120
|
-
/** Persist an unconfirmed transaction to
|
|
116
|
+
/** Persist an unconfirmed transaction to IndexedDB (never rejects — failures are captured). */
|
|
121
117
|
private persistAwaitingTransaction;
|
|
122
118
|
/** Drop the persisted awaiting-row once confirmed (never rejects). */
|
|
123
119
|
private removeAwaitingTransaction;
|
|
@@ -135,7 +131,7 @@ export declare class SyncClient extends EventEmitter {
|
|
|
135
131
|
* Self-healing helper for individual model records.
|
|
136
132
|
*
|
|
137
133
|
* Two registry-driven repair passes run on every row hydrated from
|
|
138
|
-
*
|
|
134
|
+
* IndexedDB or merged from a delta:
|
|
139
135
|
*
|
|
140
136
|
* 1. **Auto-fill** — for each `autoFill` rule the consumer's schema
|
|
141
137
|
* declares on this model, copy the corresponding identity value
|
|
@@ -156,12 +152,12 @@ export declare class SyncClient extends EventEmitter {
|
|
|
156
152
|
healed: boolean;
|
|
157
153
|
} | null;
|
|
158
154
|
/**
|
|
159
|
-
* Hydrate
|
|
155
|
+
* Hydrate InstanceCache with data from Database
|
|
160
156
|
* Called after bootstrap is complete
|
|
161
157
|
*/
|
|
162
158
|
hydrateFromDatabase(): Promise<void>;
|
|
163
159
|
/**
|
|
164
|
-
* Re-hydrate
|
|
160
|
+
* Re-hydrate InstanceCache from IndexedDB when the pool already has data.
|
|
165
161
|
*
|
|
166
162
|
* Unlike hydrateFromDatabase() (which uses addBatch and skips existing IDs),
|
|
167
163
|
* this method properly:
|
|
@@ -172,13 +168,14 @@ export declare class SyncClient extends EventEmitter {
|
|
|
172
168
|
*/
|
|
173
169
|
rehydrateFromDatabase(): Promise<RehydrationStats>;
|
|
174
170
|
/**
|
|
175
|
-
*
|
|
176
|
-
* IndexedDB is only
|
|
177
|
-
*
|
|
178
|
-
* CRITICAL: Changes are captured BEFORE poolAction to prevent data loss.
|
|
179
|
-
* The captured changes are frozen and passed to queueMutation.
|
|
171
|
+
* Apply a mutation to a model optimistically and queue it for server sync.
|
|
172
|
+
* IndexedDB is updated only once the server confirms the change with a delta
|
|
173
|
+
* packet.
|
|
180
174
|
*
|
|
181
|
-
*
|
|
175
|
+
* A model's changes are captured before the pool action runs, because a pool
|
|
176
|
+
* operation such as an upsert can clear the model's local change set;
|
|
177
|
+
* capturing first ensures those changes are never lost. The captured set is
|
|
178
|
+
* frozen and handed to {@link queueMutation}.
|
|
182
179
|
*/
|
|
183
180
|
private mutate;
|
|
184
181
|
private pendingChangedTypes;
|
|
@@ -210,8 +207,9 @@ export declare class SyncClient extends EventEmitter {
|
|
|
210
207
|
*/
|
|
211
208
|
private clearPendingMutationsForModel;
|
|
212
209
|
/**
|
|
213
|
-
* Upload file and create attachment
|
|
214
|
-
*
|
|
210
|
+
* Upload a file and create its attachment record. The upload runs through
|
|
211
|
+
* the {@link TransactionQueue}, and a model is built from the server's
|
|
212
|
+
* response and added to the pool.
|
|
215
213
|
*/
|
|
216
214
|
uploadFile(file: File, options: {
|
|
217
215
|
id: string;
|
|
@@ -239,16 +237,17 @@ export declare class SyncClient extends EventEmitter {
|
|
|
239
237
|
/** Archive model (ARCHIVE) - works offline */
|
|
240
238
|
archive(model: Model): void;
|
|
241
239
|
/**
|
|
242
|
-
* Append a mutation and schedule its sync work.
|
|
240
|
+
* Append a mutation to the pending queue and schedule its sync work.
|
|
243
241
|
*
|
|
244
|
-
*
|
|
245
|
-
* pushes
|
|
246
|
-
* process call. Without the deferral, queueing
|
|
247
|
-
*
|
|
248
|
-
* growing queue
|
|
242
|
+
* IndexedDB persistence and the server push are deferred to a microtask, so
|
|
243
|
+
* many pushes within the same tick collapse into a single serialization and
|
|
244
|
+
* a single process call. Without the deferral, queueing a hundred mutations
|
|
245
|
+
* at once — a large paste, a document import, bulk layer creation — would
|
|
246
|
+
* reserialize the whole growing queue a hundred times, an O(N²) cost in
|
|
247
|
+
* `model.toJSON()`.
|
|
249
248
|
*
|
|
250
|
-
* @param mutation.capturedChanges - Pre-captured changes
|
|
251
|
-
*
|
|
249
|
+
* @param mutation.capturedChanges - Pre-captured, frozen changes, used to
|
|
250
|
+
* avoid re-reading a model after pool operations that might clear them.
|
|
252
251
|
*/
|
|
253
252
|
private queueMutation;
|
|
254
253
|
private syncScheduled;
|
|
@@ -258,12 +257,13 @@ export declare class SyncClient extends EventEmitter {
|
|
|
258
257
|
*/
|
|
259
258
|
private persistMutationQueue;
|
|
260
259
|
/**
|
|
261
|
-
* Restore mutation queue from IndexedDB.
|
|
260
|
+
* Restore the mutation queue from IndexedDB.
|
|
262
261
|
*
|
|
263
|
-
* The persisted record was written by
|
|
264
|
-
*
|
|
265
|
-
* corrupt entries are dropped
|
|
266
|
-
*
|
|
262
|
+
* The persisted record was written by an earlier session, possibly by an
|
|
263
|
+
* older build of the SDK, so each entry is validated as it is replayed:
|
|
264
|
+
* corrupt entries are dropped and logged at debug level, and a failure is
|
|
265
|
+
* never swallowed silently, because the survival of offline writes must be
|
|
266
|
+
* observable.
|
|
267
267
|
*/
|
|
268
268
|
private restoreMutationQueue;
|
|
269
269
|
/**
|
|
@@ -281,17 +281,16 @@ export declare class SyncClient extends EventEmitter {
|
|
|
281
281
|
*/
|
|
282
282
|
private stageMutation;
|
|
283
283
|
/**
|
|
284
|
-
* Resolve
|
|
285
|
-
*
|
|
286
|
-
*
|
|
287
|
-
*
|
|
288
|
-
* even when there are local changes, to maintain data consistency.
|
|
284
|
+
* Resolve a conflict between the local model and incoming server data,
|
|
285
|
+
* called while processing deltas from the WebSocket. Certain server states,
|
|
286
|
+
* such as deletions and deactivations, always take precedence even when the
|
|
287
|
+
* local model has unsynced changes, so the two sides stay consistent.
|
|
289
288
|
*/
|
|
290
289
|
resolveConflicts(localModel: Model, serverData: Record<string, unknown>): Model;
|
|
291
290
|
/**
|
|
292
|
-
* Extract critical state fields from server data
|
|
293
|
-
*
|
|
294
|
-
*
|
|
291
|
+
* Extract the critical state fields from server data. These are the states
|
|
292
|
+
* that must be honored even when the local model has unsynced changes. The
|
|
293
|
+
* conflict resolver reads exactly these fields and no others.
|
|
295
294
|
*/
|
|
296
295
|
private extractCriticalState;
|
|
297
296
|
/**
|
|
@@ -344,26 +343,26 @@ export declare class SyncClient extends EventEmitter {
|
|
|
344
343
|
*/
|
|
345
344
|
dispose(): void;
|
|
346
345
|
/**
|
|
347
|
-
*
|
|
348
|
-
*
|
|
349
|
-
*
|
|
346
|
+
* Notify the {@link TransactionQueue} of an incoming delta so it can confirm
|
|
347
|
+
* transactions by sync-id threshold. A transaction is confirmed once any
|
|
348
|
+
* delta with an id at or beyond its `lastSyncId` threshold arrives.
|
|
349
|
+
* @param syncId - The sync id of the received delta.
|
|
350
350
|
*/
|
|
351
351
|
onDeltaReceived(syncId: number): void;
|
|
352
352
|
/**
|
|
353
|
-
*
|
|
354
|
-
*
|
|
355
|
-
*
|
|
356
|
-
* Cancels pending transactions for children that reference the deleted parent.
|
|
353
|
+
* Cancel pending transactions for child entities orphaned by a parent's
|
|
354
|
+
* deletion. The store calls this when a delete delta arrives for a parent,
|
|
355
|
+
* cancelling any queued writes on children that reference it.
|
|
357
356
|
*
|
|
358
|
-
* @param childModelName - The child model type (
|
|
359
|
-
* @param foreignKey - The
|
|
360
|
-
* @param parentId - The deleted parent
|
|
361
|
-
* @returns
|
|
357
|
+
* @param childModelName - The child model type (for example, `SlideLayer`).
|
|
358
|
+
* @param foreignKey - The foreign-key property name (for example, `slideId`).
|
|
359
|
+
* @param parentId - The id of the deleted parent.
|
|
360
|
+
* @returns The number of transactions cancelled.
|
|
362
361
|
*/
|
|
363
362
|
cancelTransactionsByForeignKey(childModelName: string, foreignKey: string, parentId: string): number;
|
|
364
363
|
/**
|
|
365
|
-
* Wait for a transaction to be confirmed
|
|
366
|
-
*
|
|
364
|
+
* Wait for a transaction to be confirmed by its delta echo. Delegates to the
|
|
365
|
+
* {@link TransactionQueue}, which handles the confirmation timeout.
|
|
367
366
|
*/
|
|
368
367
|
waitForDeltaConfirmation(transactionId: string): Promise<void>;
|
|
369
368
|
/**
|
|
@@ -373,12 +372,12 @@ export declare class SyncClient extends EventEmitter {
|
|
|
373
372
|
/**
|
|
374
373
|
* Get sync statistics. Return type is inferred from the literal so
|
|
375
374
|
* the call site sees the actual shape — `connectionState` narrowed
|
|
376
|
-
* to its three states, `objectPoolStats` typed by `
|
|
375
|
+
* to its three states, `objectPoolStats` typed by `InstanceCache.getStats`.
|
|
377
376
|
*/
|
|
378
377
|
getSyncStats(): {
|
|
379
378
|
connectionState: 'connected' | 'disconnected' | 'connecting';
|
|
380
379
|
pendingMutations: number;
|
|
381
|
-
objectPoolStats: ReturnType<
|
|
380
|
+
objectPoolStats: ReturnType<InstanceCache['getStats']>;
|
|
382
381
|
};
|
|
383
382
|
/**
|
|
384
383
|
* Get pending transaction count from TransactionQueue
|
|
@@ -396,10 +395,10 @@ export declare class SyncClient extends EventEmitter {
|
|
|
396
395
|
* can render typed UI (toast keyed by `AbloError.type`, route-level
|
|
397
396
|
* "this entity reverted" boundaries, telemetry).
|
|
398
397
|
*
|
|
399
|
-
* Distinct from `onTransactionEvent('failed', cb)`, which
|
|
400
|
-
*
|
|
401
|
-
*
|
|
402
|
-
*
|
|
398
|
+
* Distinct from `onTransactionEvent('failed', cb)`, which serves the
|
|
399
|
+
* parameterless `pendingChanges` counter and intentionally drops the
|
|
400
|
+
* payload. The two coexist: the counter callback stays lightweight, while
|
|
401
|
+
* this typed listener drives user-visible surfaces.
|
|
403
402
|
*/
|
|
404
403
|
onMutationFailure(listener: (payload: {
|
|
405
404
|
transaction: import('./transactions/TransactionQueue.js').Transaction;
|
|
@@ -407,15 +406,16 @@ export declare class SyncClient extends EventEmitter {
|
|
|
407
406
|
permanent?: boolean;
|
|
408
407
|
}) => void): () => void;
|
|
409
408
|
/**
|
|
410
|
-
* Subscribe to
|
|
409
|
+
* Subscribe to local transaction creation with the full {@link Transaction}
|
|
411
410
|
* payload (`type`, `modelName`, `modelId`, `data`, `previousData`). This is
|
|
412
|
-
* the feed
|
|
411
|
+
* the feed the store's local-mutation subscription taps for undo recording.
|
|
413
412
|
*
|
|
414
|
-
*
|
|
415
|
-
*
|
|
416
|
-
* (reached
|
|
417
|
-
* `subscribe('transaction:created')`
|
|
418
|
-
*
|
|
413
|
+
* It subscribes to the {@link TransactionQueue}'s emitter directly, since
|
|
414
|
+
* that is the only emitter that fires `transaction:created`. The SyncClient's
|
|
415
|
+
* own emitter (reached through {@link subscribe}) never rebroadcasts that
|
|
416
|
+
* event, so routing undo through `subscribe('transaction:created')` would
|
|
417
|
+
* record nothing. {@link onMutationFailure} taps the queue for the same
|
|
418
|
+
* reason.
|
|
419
419
|
*/
|
|
420
420
|
onLocalTransaction(listener: (tx: import('./transactions/TransactionQueue.js').Transaction) => void): () => void;
|
|
421
421
|
/**
|
|
@@ -464,9 +464,9 @@ export declare class SyncClient extends EventEmitter {
|
|
|
464
464
|
unassignEntity(entityType: string, entityId: string): Promise<void>;
|
|
465
465
|
reassignEntity(entityType: string, entityId: string, assigneeType: string, assigneeId: string, id?: string): Promise<void>;
|
|
466
466
|
/**
|
|
467
|
-
* Apply a batch of delta results from Database to the
|
|
467
|
+
* Apply a batch of delta results from Database to the InstanceCache.
|
|
468
468
|
* Owns: model creation, upsert, remove, archive, conflict resolution.
|
|
469
|
-
* Returns: nothing —
|
|
469
|
+
* Returns: nothing — InstanceCache is updated in place.
|
|
470
470
|
*/
|
|
471
471
|
/**
|
|
472
472
|
* Mark a local transaction as optimistically applied. The matching
|
|
@@ -482,14 +482,14 @@ export declare class SyncClient extends EventEmitter {
|
|
|
482
482
|
* — a sustained `evictions > 0` rate or `rollbacks` spike is a
|
|
483
483
|
* health signal worth alerting on.
|
|
484
484
|
*/
|
|
485
|
-
getEchoMetrics(): Readonly<
|
|
485
|
+
getEchoMetrics(): Readonly<UnconfirmedWritesMetrics>;
|
|
486
486
|
/**
|
|
487
|
-
* Package-internal accessor for the TransactionQueue. Used by
|
|
488
|
-
* `Ablo.commits.create()` to route raw multi-
|
|
489
|
-
* same retry-on-reconnect lane as the
|
|
490
|
-
*
|
|
491
|
-
* instance the SyncClient subscribes to.
|
|
492
|
-
* consumers
|
|
487
|
+
* Package-internal accessor for the {@link TransactionQueue}. Used by
|
|
488
|
+
* `Ablo.commits.create()` to route raw multi-operation envelopes through the
|
|
489
|
+
* same retry-on-reconnect lane as the model proxy path, and by tests to
|
|
490
|
+
* exercise the queue's interaction with {@link markTransactionPending} on the
|
|
491
|
+
* real instance the SyncClient subscribes to. It is not re-exported to SDK
|
|
492
|
+
* consumers; `Ablo` is the public surface.
|
|
493
493
|
*/
|
|
494
494
|
getTransactionQueue(): TransactionQueue;
|
|
495
495
|
applyDeltaBatchToPool(dbResults: {
|
|
@@ -507,7 +507,7 @@ export declare class SyncClient extends EventEmitter {
|
|
|
507
507
|
transactionId?: string;
|
|
508
508
|
}[], enrichRelations: (modelName: string, data: Record<string, unknown>) => Record<string, unknown>): void;
|
|
509
509
|
/**
|
|
510
|
-
* Apply bootstrap data to the
|
|
510
|
+
* Apply bootstrap data to the InstanceCache with ghost removal.
|
|
511
511
|
* Owns: model creation, batch upsert, ghost detection + removal.
|
|
512
512
|
*/
|
|
513
513
|
applyBootstrapDataToPool(bootstrapData: {
|
|
@@ -515,13 +515,13 @@ export declare class SyncClient extends EventEmitter {
|
|
|
515
515
|
failedModels?: string[];
|
|
516
516
|
}, protectedIds?: ReadonlySet<string>, options?: {
|
|
517
517
|
/**
|
|
518
|
-
*
|
|
519
|
-
* groups just entered,
|
|
520
|
-
*
|
|
521
|
-
*
|
|
522
|
-
*
|
|
523
|
-
*
|
|
524
|
-
*
|
|
518
|
+
* Scoped backfill for the hydrate-on-enter path: the snapshot covers only
|
|
519
|
+
* the groups just entered, not the whole model type. Two behaviors change
|
|
520
|
+
* so the subset cannot corrupt the pool. First, the upsert is
|
|
521
|
+
* version-guarded ({@link InstanceCache.upsertIfNewer}) so a concurrent live
|
|
522
|
+
* delta is not clobbered back to the snapshot version. Second, ghost
|
|
523
|
+
* removal is skipped, because a subset snapshot must never evict rows of
|
|
524
|
+
* the same type that belong to other, unhydrated groups.
|
|
525
525
|
*/
|
|
526
526
|
scoped?: boolean;
|
|
527
527
|
}): {
|