@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/ModelRegistry.js
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ModelRegistry
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* - Comprehensive error reporting
|
|
10
|
-
* - Best practices from Linear Sync Engine
|
|
2
|
+
* ModelRegistry is the source of truth for model metadata: which model classes
|
|
3
|
+
* exist, the properties and references declared on each, the back-references
|
|
4
|
+
* used for cascade handling, and a stable hash of the whole schema.
|
|
5
|
+
* {@link Model} instances resolve their metadata through the active registry,
|
|
6
|
+
* and {@link InstanceCache} uses it to map between model names and constructor
|
|
7
|
+
* classes. References resolve lazily, so a model may declare a reference to
|
|
8
|
+
* another model that is registered later.
|
|
11
9
|
*/
|
|
12
10
|
// Removed Node.js crypto import for browser compatibility
|
|
13
11
|
import { PropertyType, LoadStrategy, } from './types/index.js';
|
|
@@ -43,19 +41,17 @@ export class ModelRegistry {
|
|
|
43
41
|
properties = new Map();
|
|
44
42
|
references = new Map();
|
|
45
43
|
pendingReferences = new Map();
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
//
|
|
44
|
+
// Maps a constructor back to its model name. Keyed as `unknown` on purpose:
|
|
45
|
+
// lookups arrive both as `this.constructor` (a Function) and as typed model
|
|
46
|
+
// classes, and both are accepted without a cast.
|
|
49
47
|
constructorToModelName = new Map();
|
|
50
|
-
//
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
// is derived on demand by `getChildModels`, populated only here.
|
|
48
|
+
// Back-references for cascade-aware transaction handling. Maps a child model
|
|
49
|
+
// name to the parent models it references. The inverse direction (parent to
|
|
50
|
+
// children) is derived on demand by `getChildModels`; it is populated here.
|
|
54
51
|
backReferences = new Map();
|
|
55
52
|
schemaHash;
|
|
56
53
|
config;
|
|
57
54
|
registeredModels = new Set();
|
|
58
|
-
batchMode = false;
|
|
59
55
|
pendingHashUpdate = false;
|
|
60
56
|
constructor(config = {}) {
|
|
61
57
|
this.config = {
|
|
@@ -169,7 +165,7 @@ export class ModelRegistry {
|
|
|
169
165
|
const modelClass = constructor;
|
|
170
166
|
this.models.set(name, modelClass);
|
|
171
167
|
this.modelMetadata.set(name, metadata);
|
|
172
|
-
//
|
|
168
|
+
// Record the reverse mapping from constructor to model name
|
|
173
169
|
this.constructorToModelName.set(constructor, name);
|
|
174
170
|
// Initialize property maps
|
|
175
171
|
if (!this.properties.has(name)) {
|
|
@@ -246,13 +242,14 @@ export class ModelRegistry {
|
|
|
246
242
|
this.completeReferenceRegistration(modelName, propertyName, metadata);
|
|
247
243
|
}
|
|
248
244
|
/**
|
|
249
|
-
*
|
|
245
|
+
* Register a back-reference for cascade-aware transaction handling.
|
|
250
246
|
*
|
|
251
|
-
* When a parent model is deleted, the
|
|
252
|
-
* transactions for
|
|
247
|
+
* When a parent model is deleted, the transaction queue cancels pending
|
|
248
|
+
* transactions for every child model that declares a back-reference to that
|
|
249
|
+
* parent.
|
|
253
250
|
*
|
|
254
|
-
* @param childModelName - The model that
|
|
255
|
-
* @param metadata -
|
|
251
|
+
* @param childModelName - The model that holds a foreign key to the parent (e.g., 'Slide')
|
|
252
|
+
* @param metadata - The back-reference configuration
|
|
256
253
|
*/
|
|
257
254
|
registerBackReference(childModelName, metadata) {
|
|
258
255
|
// Add to instance map
|
|
@@ -345,7 +342,9 @@ export class ModelRegistry {
|
|
|
345
342
|
return children;
|
|
346
343
|
}
|
|
347
344
|
/**
|
|
348
|
-
*
|
|
345
|
+
* Compute a stable hash of the registered schema — model names, property
|
|
346
|
+
* types, and their indexed and optional flags. Memoized until the schema
|
|
347
|
+
* changes.
|
|
349
348
|
*/
|
|
350
349
|
getSchemaHash() {
|
|
351
350
|
if (this.schemaHash)
|
|
@@ -428,7 +427,6 @@ export class ModelRegistry {
|
|
|
428
427
|
* Start batch registration mode to optimize performance
|
|
429
428
|
*/
|
|
430
429
|
startBatch() {
|
|
431
|
-
this.batchMode = true;
|
|
432
430
|
this.pendingHashUpdate = false;
|
|
433
431
|
}
|
|
434
432
|
/**
|
|
@@ -438,7 +436,6 @@ export class ModelRegistry {
|
|
|
438
436
|
* End batch registration mode and update schema hash if needed
|
|
439
437
|
*/
|
|
440
438
|
endBatch() {
|
|
441
|
-
this.batchMode = false;
|
|
442
439
|
if (this.pendingHashUpdate) {
|
|
443
440
|
this.getSchemaHash(); // This will recalculate if needed
|
|
444
441
|
this.pendingHashUpdate = false;
|
|
@@ -460,7 +457,6 @@ export class ModelRegistry {
|
|
|
460
457
|
this.backReferences.clear();
|
|
461
458
|
this.constructorToModelName.clear();
|
|
462
459
|
this.schemaHash = undefined;
|
|
463
|
-
this.batchMode = false;
|
|
464
460
|
this.pendingHashUpdate = false;
|
|
465
461
|
getContext().logger.info('ModelRegistry cleared');
|
|
466
462
|
}
|
package/dist/NetworkMonitor.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* NetworkMonitor
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* the
|
|
7
|
-
* The visibility handler detects this and emits 'online' to trigger recovery.
|
|
2
|
+
* NetworkMonitor tracks network connectivity and reports it through events.
|
|
3
|
+
* It listens to the browser's online and offline events, and it also watches
|
|
4
|
+
* for a tab becoming visible again: after a laptop sleep/wake or a long spell
|
|
5
|
+
* in the background, the WebSocket can die silently without an offline event
|
|
6
|
+
* firing, so returning to the tab emits a recovery signal the store can act on.
|
|
8
7
|
*/
|
|
9
8
|
import { EventEmitter } from 'events';
|
|
10
9
|
export declare class NetworkMonitor extends EventEmitter {
|
package/dist/NetworkMonitor.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* NetworkMonitor
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* the
|
|
7
|
-
* The visibility handler detects this and emits 'online' to trigger recovery.
|
|
2
|
+
* NetworkMonitor tracks network connectivity and reports it through events.
|
|
3
|
+
* It listens to the browser's online and offline events, and it also watches
|
|
4
|
+
* for a tab becoming visible again: after a laptop sleep/wake or a long spell
|
|
5
|
+
* in the background, the WebSocket can die silently without an offline event
|
|
6
|
+
* firing, so returning to the tab emits a recovery signal the store can act on.
|
|
8
7
|
*/
|
|
9
8
|
import { EventEmitter } from 'events';
|
|
10
9
|
import { getContext } from './context.js';
|
package/dist/SyncClient.d.ts
CHANGED
|
@@ -1,20 +1,21 @@
|
|
|
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';
|
|
18
|
+
import { type CommitOutboxStore } from './transactions/commitOutboxStore.js';
|
|
18
19
|
interface SyncObserver {
|
|
19
20
|
onSync?: (event: SyncEvent) => void;
|
|
20
21
|
}
|
|
@@ -44,39 +45,38 @@ export declare class SyncClient extends EventEmitter {
|
|
|
44
45
|
private database;
|
|
45
46
|
private get mutationExecutor();
|
|
46
47
|
private networkMonitor;
|
|
47
|
-
private transactionQueue;
|
|
48
48
|
private observers;
|
|
49
49
|
private userId;
|
|
50
50
|
private organizationId;
|
|
51
51
|
private pendingMutations;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
52
|
+
private readonly stagedMutationIds;
|
|
53
|
+
private pendingJournalBatch;
|
|
54
|
+
private journalFlushScheduled;
|
|
55
|
+
private readonly commitOutboxNamespace;
|
|
56
|
+
/**
|
|
57
|
+
* Tracks the ids of transactions the client has applied optimistically but
|
|
58
|
+
* the server has not yet confirmed. When a delta arrives, the receive path
|
|
59
|
+
* consults this set to recognize the echo of the client's own mutation and
|
|
60
|
+
* skip the now-redundant pool update; the IndexedDB write still runs,
|
|
61
|
+
* because the delta is the authoritative version of the row. Without this
|
|
62
|
+
* discriminator, an optimistically applied delete followed by a
|
|
63
|
+
* server-confirmed create echo would resurrect the row for the window
|
|
64
|
+
* between the two confirmations.
|
|
64
65
|
*
|
|
65
|
-
*
|
|
66
|
+
* The set is bounded with first-in-first-out eviction, and
|
|
67
|
+
* {@link SyncClient.getEchoMetrics} exposes its counters.
|
|
66
68
|
*/
|
|
67
69
|
private readonly echoTracker;
|
|
68
70
|
private connectionState;
|
|
69
|
-
private offlineSince?;
|
|
70
|
-
private maxRetries;
|
|
71
71
|
private isDisposed;
|
|
72
72
|
/**
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* `
|
|
76
|
-
*
|
|
73
|
+
* The client's position in the global delta order, held as the single
|
|
74
|
+
* canonical {@link SyncPosition} instance. The store advances `applied` and
|
|
75
|
+
* `persisted` as deltas land, the queue advances `acked` on commit
|
|
76
|
+
* responses, and snapshots and claims read `readFloor`.
|
|
77
77
|
*/
|
|
78
78
|
readonly position: SyncPosition;
|
|
79
|
-
constructor(objectPool:
|
|
79
|
+
constructor(objectPool: InstanceCache, database: Database, commitOutbox?: CommitOutboxStore, commitOutboxNamespace?: string);
|
|
80
80
|
/**
|
|
81
81
|
* Setup network monitoring handlers
|
|
82
82
|
*/
|
|
@@ -104,20 +104,20 @@ export declare class SyncClient extends EventEmitter {
|
|
|
104
104
|
*/
|
|
105
105
|
private setupTransactionRollbackHandling;
|
|
106
106
|
/**
|
|
107
|
-
* Forward reconciliation requests from TransactionQueue to the
|
|
108
|
-
* When delta confirmation times out,
|
|
109
|
-
* instead of rolling back
|
|
110
|
-
*
|
|
107
|
+
* Forward reconciliation requests from the {@link TransactionQueue} to the
|
|
108
|
+
* sync layer. When delta confirmation times out, the queue emits
|
|
109
|
+
* `reconciliation:needed` instead of rolling back, so optimistic state the
|
|
110
|
+
* server may already have committed is never destroyed.
|
|
111
111
|
*/
|
|
112
112
|
private setupReconciliationForwarding;
|
|
113
113
|
/**
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
114
|
+
* Persist unconfirmed transactions to IndexedDB. When delta-confirmation
|
|
115
|
+
* retries are exhausted, the transaction is cached so it survives a tab
|
|
116
|
+
* close. On the next session, a WebSocket reconnect and delta catch-up
|
|
117
|
+
* deliver the missing deltas and confirm the transaction.
|
|
118
118
|
*/
|
|
119
119
|
private setupAwaitingTransactionPersistence;
|
|
120
|
-
/** Persist an unconfirmed transaction to
|
|
120
|
+
/** Persist an unconfirmed transaction to IndexedDB (never rejects — failures are captured). */
|
|
121
121
|
private persistAwaitingTransaction;
|
|
122
122
|
/** Drop the persisted awaiting-row once confirmed (never rejects). */
|
|
123
123
|
private removeAwaitingTransaction;
|
|
@@ -135,7 +135,7 @@ export declare class SyncClient extends EventEmitter {
|
|
|
135
135
|
* Self-healing helper for individual model records.
|
|
136
136
|
*
|
|
137
137
|
* Two registry-driven repair passes run on every row hydrated from
|
|
138
|
-
*
|
|
138
|
+
* IndexedDB or merged from a delta:
|
|
139
139
|
*
|
|
140
140
|
* 1. **Auto-fill** — for each `autoFill` rule the consumer's schema
|
|
141
141
|
* declares on this model, copy the corresponding identity value
|
|
@@ -156,12 +156,12 @@ export declare class SyncClient extends EventEmitter {
|
|
|
156
156
|
healed: boolean;
|
|
157
157
|
} | null;
|
|
158
158
|
/**
|
|
159
|
-
* Hydrate
|
|
159
|
+
* Hydrate InstanceCache with data from Database
|
|
160
160
|
* Called after bootstrap is complete
|
|
161
161
|
*/
|
|
162
162
|
hydrateFromDatabase(): Promise<void>;
|
|
163
163
|
/**
|
|
164
|
-
* Re-hydrate
|
|
164
|
+
* Re-hydrate InstanceCache from IndexedDB when the pool already has data.
|
|
165
165
|
*
|
|
166
166
|
* Unlike hydrateFromDatabase() (which uses addBatch and skips existing IDs),
|
|
167
167
|
* this method properly:
|
|
@@ -172,13 +172,14 @@ export declare class SyncClient extends EventEmitter {
|
|
|
172
172
|
*/
|
|
173
173
|
rehydrateFromDatabase(): Promise<RehydrationStats>;
|
|
174
174
|
/**
|
|
175
|
-
*
|
|
176
|
-
* IndexedDB is only
|
|
175
|
+
* Apply a mutation to a model optimistically and queue it for server sync.
|
|
176
|
+
* IndexedDB is updated only once the server confirms the change with a delta
|
|
177
|
+
* packet.
|
|
177
178
|
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
179
|
+
* A model's changes are captured before the pool action runs, because a pool
|
|
180
|
+
* operation such as an upsert can clear the model's local change set;
|
|
181
|
+
* capturing first ensures those changes are never lost. The captured set is
|
|
182
|
+
* frozen and handed to {@link queueMutation}.
|
|
182
183
|
*/
|
|
183
184
|
private mutate;
|
|
184
185
|
private pendingChangedTypes;
|
|
@@ -210,8 +211,9 @@ export declare class SyncClient extends EventEmitter {
|
|
|
210
211
|
*/
|
|
211
212
|
private clearPendingMutationsForModel;
|
|
212
213
|
/**
|
|
213
|
-
* Upload file and create attachment
|
|
214
|
-
*
|
|
214
|
+
* Upload a file and create its attachment record. The upload runs through
|
|
215
|
+
* the {@link TransactionQueue}, and a model is built from the server's
|
|
216
|
+
* response and added to the pool.
|
|
215
217
|
*/
|
|
216
218
|
uploadFile(file: File, options: {
|
|
217
219
|
id: string;
|
|
@@ -239,31 +241,33 @@ export declare class SyncClient extends EventEmitter {
|
|
|
239
241
|
/** Archive model (ARCHIVE) - works offline */
|
|
240
242
|
archive(model: Model): void;
|
|
241
243
|
/**
|
|
242
|
-
* Append a mutation and schedule its sync work.
|
|
244
|
+
* Append a mutation to the pending queue and schedule its sync work.
|
|
243
245
|
*
|
|
244
|
-
*
|
|
245
|
-
* pushes
|
|
246
|
-
* process call. Without the deferral, queueing
|
|
247
|
-
*
|
|
248
|
-
* growing queue
|
|
246
|
+
* IndexedDB persistence and the server push are deferred to a microtask, so
|
|
247
|
+
* many pushes within the same tick collapse into a single serialization and
|
|
248
|
+
* a single process call. Without the deferral, queueing a hundred mutations
|
|
249
|
+
* at once — a large paste, a document import, bulk layer creation — would
|
|
250
|
+
* reserialize the whole growing queue a hundred times, an O(N²) cost in
|
|
251
|
+
* `model.toJSON()`.
|
|
249
252
|
*
|
|
250
|
-
* @param mutation.capturedChanges - Pre-captured changes
|
|
251
|
-
*
|
|
253
|
+
* @param mutation.capturedChanges - Pre-captured, frozen changes, used to
|
|
254
|
+
* avoid re-reading a model after pool operations that might clear them.
|
|
252
255
|
*/
|
|
253
256
|
private queueMutation;
|
|
257
|
+
private scheduleJournalFlush;
|
|
258
|
+
private flushPendingMutationJournal;
|
|
254
259
|
private syncScheduled;
|
|
255
260
|
private scheduleSync;
|
|
261
|
+
private pendingMutationRecord;
|
|
262
|
+
private persistPendingMutation;
|
|
256
263
|
/**
|
|
257
|
-
*
|
|
258
|
-
*/
|
|
259
|
-
private persistMutationQueue;
|
|
260
|
-
/**
|
|
261
|
-
* Restore mutation queue from IndexedDB.
|
|
264
|
+
* Restore the mutation queue from IndexedDB.
|
|
262
265
|
*
|
|
263
|
-
* The persisted record was written by
|
|
264
|
-
*
|
|
265
|
-
* corrupt entries are dropped
|
|
266
|
-
*
|
|
266
|
+
* The persisted record was written by an earlier session, possibly by an
|
|
267
|
+
* older build of the SDK, so each entry is validated as it is replayed:
|
|
268
|
+
* corrupt entries are dropped and logged at debug level, and a failure is
|
|
269
|
+
* never swallowed silently, because the survival of offline writes must be
|
|
270
|
+
* observable.
|
|
267
271
|
*/
|
|
268
272
|
private restoreMutationQueue;
|
|
269
273
|
/**
|
|
@@ -281,17 +285,16 @@ export declare class SyncClient extends EventEmitter {
|
|
|
281
285
|
*/
|
|
282
286
|
private stageMutation;
|
|
283
287
|
/**
|
|
284
|
-
* Resolve
|
|
285
|
-
*
|
|
286
|
-
*
|
|
287
|
-
*
|
|
288
|
-
* even when there are local changes, to maintain data consistency.
|
|
288
|
+
* Resolve a conflict between the local model and incoming server data,
|
|
289
|
+
* called while processing deltas from the WebSocket. Certain server states,
|
|
290
|
+
* such as deletions and deactivations, always take precedence even when the
|
|
291
|
+
* local model has unsynced changes, so the two sides stay consistent.
|
|
289
292
|
*/
|
|
290
293
|
resolveConflicts(localModel: Model, serverData: Record<string, unknown>): Model;
|
|
291
294
|
/**
|
|
292
|
-
* Extract critical state fields from server data
|
|
293
|
-
*
|
|
294
|
-
*
|
|
295
|
+
* Extract the critical state fields from server data. These are the states
|
|
296
|
+
* that must be honored even when the local model has unsynced changes. The
|
|
297
|
+
* conflict resolver reads exactly these fields and no others.
|
|
295
298
|
*/
|
|
296
299
|
private extractCriticalState;
|
|
297
300
|
/**
|
|
@@ -344,26 +347,26 @@ export declare class SyncClient extends EventEmitter {
|
|
|
344
347
|
*/
|
|
345
348
|
dispose(): void;
|
|
346
349
|
/**
|
|
347
|
-
*
|
|
348
|
-
*
|
|
349
|
-
*
|
|
350
|
+
* Notify the {@link TransactionQueue} of an incoming delta so it can confirm
|
|
351
|
+
* transactions by sync-id threshold. A transaction is confirmed once any
|
|
352
|
+
* delta with an id at or beyond its `lastSyncId` threshold arrives.
|
|
353
|
+
* @param syncId - The sync id of the received delta.
|
|
350
354
|
*/
|
|
351
355
|
onDeltaReceived(syncId: number): void;
|
|
352
356
|
/**
|
|
353
|
-
*
|
|
354
|
-
*
|
|
355
|
-
*
|
|
356
|
-
* Cancels pending transactions for children that reference the deleted parent.
|
|
357
|
+
* Cancel pending transactions for child entities orphaned by a parent's
|
|
358
|
+
* deletion. The store calls this when a delete delta arrives for a parent,
|
|
359
|
+
* cancelling any queued writes on children that reference it.
|
|
357
360
|
*
|
|
358
|
-
* @param childModelName - The child model type (
|
|
359
|
-
* @param foreignKey - The
|
|
360
|
-
* @param parentId - The deleted parent
|
|
361
|
-
* @returns
|
|
361
|
+
* @param childModelName - The child model type (for example, `SlideLayer`).
|
|
362
|
+
* @param foreignKey - The foreign-key property name (for example, `slideId`).
|
|
363
|
+
* @param parentId - The id of the deleted parent.
|
|
364
|
+
* @returns The number of transactions cancelled.
|
|
362
365
|
*/
|
|
363
366
|
cancelTransactionsByForeignKey(childModelName: string, foreignKey: string, parentId: string): number;
|
|
364
367
|
/**
|
|
365
|
-
* Wait for a transaction to be confirmed
|
|
366
|
-
*
|
|
368
|
+
* Wait for a transaction to be confirmed by its delta echo. Delegates to the
|
|
369
|
+
* {@link TransactionQueue}, which handles the confirmation timeout.
|
|
367
370
|
*/
|
|
368
371
|
waitForDeltaConfirmation(transactionId: string): Promise<void>;
|
|
369
372
|
/**
|
|
@@ -373,12 +376,12 @@ export declare class SyncClient extends EventEmitter {
|
|
|
373
376
|
/**
|
|
374
377
|
* Get sync statistics. Return type is inferred from the literal so
|
|
375
378
|
* the call site sees the actual shape — `connectionState` narrowed
|
|
376
|
-
* to its three states, `objectPoolStats` typed by `
|
|
379
|
+
* to its three states, `objectPoolStats` typed by `InstanceCache.getStats`.
|
|
377
380
|
*/
|
|
378
381
|
getSyncStats(): {
|
|
379
382
|
connectionState: 'connected' | 'disconnected' | 'connecting';
|
|
380
383
|
pendingMutations: number;
|
|
381
|
-
objectPoolStats: ReturnType<
|
|
384
|
+
objectPoolStats: ReturnType<InstanceCache['getStats']>;
|
|
382
385
|
};
|
|
383
386
|
/**
|
|
384
387
|
* Get pending transaction count from TransactionQueue
|
|
@@ -396,10 +399,10 @@ export declare class SyncClient extends EventEmitter {
|
|
|
396
399
|
* can render typed UI (toast keyed by `AbloError.type`, route-level
|
|
397
400
|
* "this entity reverted" boundaries, telemetry).
|
|
398
401
|
*
|
|
399
|
-
* Distinct from `onTransactionEvent('failed', cb)`, which
|
|
400
|
-
*
|
|
401
|
-
*
|
|
402
|
-
*
|
|
402
|
+
* Distinct from `onTransactionEvent('failed', cb)`, which serves the
|
|
403
|
+
* parameterless `pendingChanges` counter and intentionally drops the
|
|
404
|
+
* payload. The two coexist: the counter callback stays lightweight, while
|
|
405
|
+
* this typed listener drives user-visible surfaces.
|
|
403
406
|
*/
|
|
404
407
|
onMutationFailure(listener: (payload: {
|
|
405
408
|
transaction: import('./transactions/TransactionQueue.js').Transaction;
|
|
@@ -407,15 +410,16 @@ export declare class SyncClient extends EventEmitter {
|
|
|
407
410
|
permanent?: boolean;
|
|
408
411
|
}) => void): () => void;
|
|
409
412
|
/**
|
|
410
|
-
* Subscribe to
|
|
413
|
+
* Subscribe to local transaction creation with the full {@link Transaction}
|
|
411
414
|
* payload (`type`, `modelName`, `modelId`, `data`, `previousData`). This is
|
|
412
|
-
* the feed
|
|
415
|
+
* the feed the store's local-mutation subscription taps for undo recording.
|
|
413
416
|
*
|
|
414
|
-
*
|
|
415
|
-
*
|
|
416
|
-
* (reached
|
|
417
|
-
* `subscribe('transaction:created')`
|
|
418
|
-
*
|
|
417
|
+
* It subscribes to the {@link TransactionQueue}'s emitter directly, since
|
|
418
|
+
* that is the only emitter that fires `transaction:created`. The SyncClient's
|
|
419
|
+
* own emitter (reached through {@link subscribe}) never rebroadcasts that
|
|
420
|
+
* event, so routing undo through `subscribe('transaction:created')` would
|
|
421
|
+
* record nothing. {@link onMutationFailure} taps the queue for the same
|
|
422
|
+
* reason.
|
|
419
423
|
*/
|
|
420
424
|
onLocalTransaction(listener: (tx: import('./transactions/TransactionQueue.js').Transaction) => void): () => void;
|
|
421
425
|
/**
|
|
@@ -464,9 +468,9 @@ export declare class SyncClient extends EventEmitter {
|
|
|
464
468
|
unassignEntity(entityType: string, entityId: string): Promise<void>;
|
|
465
469
|
reassignEntity(entityType: string, entityId: string, assigneeType: string, assigneeId: string, id?: string): Promise<void>;
|
|
466
470
|
/**
|
|
467
|
-
* Apply a batch of delta results from Database to the
|
|
471
|
+
* Apply a batch of delta results from Database to the InstanceCache.
|
|
468
472
|
* Owns: model creation, upsert, remove, archive, conflict resolution.
|
|
469
|
-
* Returns: nothing —
|
|
473
|
+
* Returns: nothing — InstanceCache is updated in place.
|
|
470
474
|
*/
|
|
471
475
|
/**
|
|
472
476
|
* Mark a local transaction as optimistically applied. The matching
|
|
@@ -482,14 +486,14 @@ export declare class SyncClient extends EventEmitter {
|
|
|
482
486
|
* — a sustained `evictions > 0` rate or `rollbacks` spike is a
|
|
483
487
|
* health signal worth alerting on.
|
|
484
488
|
*/
|
|
485
|
-
getEchoMetrics(): Readonly<
|
|
489
|
+
getEchoMetrics(): Readonly<UnconfirmedWritesMetrics>;
|
|
486
490
|
/**
|
|
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
|
|
491
|
+
* Package-internal accessor for the {@link TransactionQueue}. Used by
|
|
492
|
+
* `Ablo.commits.create()` to route raw multi-operation envelopes through the
|
|
493
|
+
* same retry-on-reconnect lane as the model proxy path, and by tests to
|
|
494
|
+
* exercise the queue's interaction with {@link markTransactionPending} on the
|
|
495
|
+
* real instance the SyncClient subscribes to. It is not re-exported to SDK
|
|
496
|
+
* consumers; `Ablo` is the public surface.
|
|
493
497
|
*/
|
|
494
498
|
getTransactionQueue(): TransactionQueue;
|
|
495
499
|
applyDeltaBatchToPool(dbResults: {
|
|
@@ -507,7 +511,7 @@ export declare class SyncClient extends EventEmitter {
|
|
|
507
511
|
transactionId?: string;
|
|
508
512
|
}[], enrichRelations: (modelName: string, data: Record<string, unknown>) => Record<string, unknown>): void;
|
|
509
513
|
/**
|
|
510
|
-
* Apply bootstrap data to the
|
|
514
|
+
* Apply bootstrap data to the InstanceCache with ghost removal.
|
|
511
515
|
* Owns: model creation, batch upsert, ghost detection + removal.
|
|
512
516
|
*/
|
|
513
517
|
applyBootstrapDataToPool(bootstrapData: {
|
|
@@ -515,13 +519,13 @@ export declare class SyncClient extends EventEmitter {
|
|
|
515
519
|
failedModels?: string[];
|
|
516
520
|
}, protectedIds?: ReadonlySet<string>, options?: {
|
|
517
521
|
/**
|
|
518
|
-
*
|
|
519
|
-
* groups just entered,
|
|
520
|
-
*
|
|
521
|
-
*
|
|
522
|
-
*
|
|
523
|
-
*
|
|
524
|
-
*
|
|
522
|
+
* Scoped backfill for the hydrate-on-enter path: the snapshot covers only
|
|
523
|
+
* the groups just entered, not the whole model type. Two behaviors change
|
|
524
|
+
* so the subset cannot corrupt the pool. First, the upsert is
|
|
525
|
+
* version-guarded ({@link InstanceCache.upsertIfNewer}) so a concurrent live
|
|
526
|
+
* delta is not clobbered back to the snapshot version. Second, ghost
|
|
527
|
+
* removal is skipped, because a subset snapshot must never evict rows of
|
|
528
|
+
* the same type that belong to other, unhydrated groups.
|
|
525
529
|
*/
|
|
526
530
|
scoped?: boolean;
|
|
527
531
|
}): {
|