@abloatai/ablo 0.25.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +5 -3
- package/CHANGELOG.md +34 -0
- package/README.md +104 -88
- package/dist/BaseSyncedStore.d.ts +140 -266
- package/dist/BaseSyncedStore.js +338 -739
- package/dist/Database.d.ts +62 -77
- package/dist/Database.js +106 -127
- package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
- package/dist/{ObjectPool.js → InstanceCache.js} +91 -83
- package/dist/LazyReferenceCollection.d.ts +11 -15
- package/dist/LazyReferenceCollection.js +16 -15
- package/dist/Model.d.ts +37 -52
- package/dist/Model.js +52 -69
- package/dist/ModelRegistry.d.ts +46 -25
- package/dist/ModelRegistry.js +32 -30
- package/dist/NetworkMonitor.d.ts +5 -6
- package/dist/NetworkMonitor.js +6 -7
- package/dist/SyncClient.d.ts +119 -109
- package/dist/SyncClient.js +303 -224
- package/dist/SyncEngineContext.d.ts +1 -3
- package/dist/SyncEngineContext.js +1 -2
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +9 -9
- package/dist/adapters/inMemoryStorage.js +9 -9
- package/dist/agent/Agent.d.ts +39 -31
- package/dist/agent/Agent.js +35 -23
- package/dist/agent/index.d.ts +4 -4
- package/dist/agent/index.js +5 -5
- package/dist/agent/session.d.ts +47 -44
- package/dist/agent/session.js +37 -48
- package/dist/agent/types.d.ts +26 -31
- package/dist/agent/types.js +6 -7
- package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
- package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
- package/dist/ai-sdk/coordinationContext.d.ts +46 -0
- package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +30 -31
- package/dist/ai-sdk/index.d.ts +25 -22
- package/dist/ai-sdk/index.js +25 -22
- package/dist/ai-sdk/wrap.d.ts +7 -8
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/credentialPolicy.d.ts +74 -71
- package/dist/auth/credentialPolicy.js +51 -56
- package/dist/auth/credentialSource.d.ts +7 -18
- package/dist/auth/credentialSource.js +10 -18
- package/dist/auth/index.d.ts +59 -58
- package/dist/auth/index.js +34 -40
- package/dist/auth/schemas.d.ts +5 -4
- package/dist/auth/schemas.js +5 -4
- package/dist/batching/index.d.ts +19 -21
- package/dist/batching/index.js +14 -17
- package/dist/cli.cjs +483 -369
- package/dist/client/Ablo.d.ts +107 -836
- package/dist/client/Ablo.js +174 -833
- package/dist/client/ApiClient.d.ts +44 -20
- package/dist/client/ApiClient.js +193 -44
- package/dist/client/auth.d.ts +51 -60
- package/dist/client/auth.js +137 -110
- package/dist/client/claimHeartbeatLoop.d.ts +50 -0
- package/dist/client/claimHeartbeatLoop.js +88 -0
- package/dist/client/consoleLogger.d.ts +35 -0
- package/dist/client/consoleLogger.js +44 -0
- package/dist/client/createInternalComponents.d.ts +14 -17
- package/dist/client/createInternalComponents.js +26 -31
- package/dist/client/createModelProxy.d.ts +130 -120
- package/dist/client/createModelProxy.js +158 -124
- package/dist/client/credentialEndpoint.d.ts +61 -0
- package/dist/client/credentialEndpoint.js +86 -0
- package/dist/client/functionalUpdate.d.ts +29 -27
- package/dist/client/functionalUpdate.js +21 -21
- package/dist/client/hostedEndpoints.d.ts +21 -0
- package/dist/client/hostedEndpoints.js +21 -0
- package/dist/client/httpClient.d.ts +58 -54
- package/dist/client/httpClient.js +29 -31
- package/dist/client/identity.d.ts +15 -20
- package/dist/client/identity.js +49 -59
- package/dist/client/modelRegistration.d.ts +10 -0
- package/dist/client/modelRegistration.js +301 -0
- package/dist/client/options.d.ts +373 -0
- package/dist/client/options.js +6 -0
- package/dist/client/registerDataSource.d.ts +9 -9
- package/dist/client/registerDataSource.js +15 -16
- package/dist/client/resourceTypes.d.ts +333 -0
- package/dist/client/resourceTypes.js +7 -0
- package/dist/client/schemaConfig.d.ts +44 -0
- package/dist/client/schemaConfig.js +176 -0
- package/dist/client/sessionMint.d.ts +17 -13
- package/dist/client/sessionMint.js +26 -31
- package/dist/client/validateAbloOptions.d.ts +12 -14
- package/dist/client/validateAbloOptions.js +9 -10
- package/dist/client/writeOptionsSchema.d.ts +18 -16
- package/dist/client/writeOptionsSchema.js +23 -20
- package/dist/client/wsMutationExecutor.d.ts +28 -0
- package/dist/client/wsMutationExecutor.js +71 -0
- package/dist/context.d.ts +6 -4
- package/dist/context.js +6 -7
- package/dist/coordination/index.d.ts +13 -4
- package/dist/coordination/index.js +29 -4
- package/dist/coordination/schema.d.ts +176 -128
- package/dist/coordination/schema.js +197 -133
- package/dist/coordination/trace.d.ts +9 -11
- package/dist/coordination/trace.js +13 -15
- package/dist/core/DatabaseManager.d.ts +5 -8
- package/dist/core/DatabaseManager.js +38 -40
- package/dist/core/QueryProcessor.d.ts +7 -9
- package/dist/core/QueryProcessor.js +27 -34
- package/dist/core/QueryView.d.ts +17 -5
- package/dist/core/QueryView.js +6 -7
- package/dist/core/StoreManager.d.ts +14 -16
- package/dist/core/StoreManager.js +26 -25
- package/dist/core/ViewRegistry.d.ts +5 -5
- package/dist/core/ViewRegistry.js +4 -4
- package/dist/core/index.d.ts +18 -13
- package/dist/core/index.js +32 -26
- package/dist/core/openIDBWithTimeout.d.ts +38 -36
- package/dist/core/openIDBWithTimeout.js +57 -54
- package/dist/core/queryUtils.d.ts +45 -0
- package/dist/core/queryUtils.js +69 -0
- package/dist/core/storeContract.d.ts +145 -0
- package/dist/core/storeContract.js +12 -0
- package/dist/environment.d.ts +28 -0
- package/dist/environment.js +21 -0
- package/dist/errorCodes.d.ts +118 -101
- package/dist/errorCodes.js +277 -260
- package/dist/errors.d.ts +170 -165
- package/dist/errors.js +161 -151
- package/dist/index.d.ts +30 -27
- package/dist/index.js +90 -82
- package/dist/interfaces/index.d.ts +108 -133
- package/dist/interfaces/index.js +5 -4
- package/dist/keys/index.d.ts +27 -29
- package/dist/keys/index.js +59 -49
- package/dist/mutators/RecordingTransaction.d.ts +16 -16
- package/dist/mutators/RecordingTransaction.js +31 -37
- package/dist/mutators/Transaction.d.ts +18 -26
- package/dist/mutators/Transaction.js +14 -20
- package/dist/mutators/UndoManager.d.ts +122 -131
- package/dist/mutators/UndoManager.js +149 -155
- package/dist/mutators/defineMutators.d.ts +24 -37
- package/dist/mutators/defineMutators.js +14 -20
- package/dist/mutators/inverseOp.d.ts +12 -15
- package/dist/mutators/inverseOp.js +12 -15
- package/dist/mutators/mutateActions.d.ts +10 -9
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +9 -8
- package/dist/mutators/readerActions.js +2 -2
- package/dist/mutators/undoApply.d.ts +31 -27
- package/dist/mutators/undoApply.js +26 -24
- package/dist/policy/index.d.ts +5 -3
- package/dist/policy/index.js +5 -3
- package/dist/policy/types.d.ts +105 -101
- package/dist/policy/types.js +67 -66
- package/dist/query/client.d.ts +32 -16
- package/dist/query/client.js +103 -72
- package/dist/query/types.d.ts +37 -60
- package/dist/query/types.js +13 -33
- package/dist/react/AbloProvider.d.ts +7 -11
- package/dist/react/AbloProvider.js +24 -17
- package/dist/react/context.d.ts +27 -146
- package/dist/react/context.js +9 -10
- package/dist/react/index.d.ts +41 -42
- package/dist/react/index.js +37 -38
- package/dist/react/internalContext.d.ts +17 -19
- package/dist/react/useAblo.d.ts +23 -22
- package/dist/react/useAblo.js +17 -15
- package/dist/react/useCurrentUserId.d.ts +8 -7
- package/dist/react/useCurrentUserId.js +8 -7
- package/dist/react/useErrorListener.d.ts +7 -7
- package/dist/react/useErrorListener.js +11 -12
- package/dist/react/useMutationFailureListener.d.ts +8 -8
- package/dist/react/useMutationFailureListener.js +9 -9
- package/dist/react/useMutators.d.ts +11 -11
- package/dist/react/useMutators.js +10 -4
- package/dist/react/useReactive.js +2 -3
- package/dist/react/useSyncStatus.d.ts +4 -6
- package/dist/react/useUndoScope.d.ts +7 -9
- package/dist/react/useUndoScope.js +3 -3
- package/dist/schema/coordination.d.ts +21 -25
- package/dist/schema/coordination.js +21 -25
- package/dist/schema/ddl.d.ts +43 -39
- package/dist/schema/ddl.js +75 -68
- package/dist/schema/ddlLock.d.ts +35 -0
- package/dist/schema/ddlLock.js +46 -0
- package/dist/schema/diff.d.ts +99 -61
- package/dist/schema/diff.js +43 -34
- package/dist/schema/field.d.ts +37 -42
- package/dist/schema/field.js +36 -49
- package/dist/schema/generate.d.ts +12 -12
- package/dist/schema/generate.js +12 -12
- package/dist/schema/index.d.ts +5 -4
- package/dist/schema/index.js +29 -21
- package/dist/schema/model.d.ts +121 -146
- package/dist/schema/model.js +24 -35
- package/dist/schema/openapi.d.ts +10 -9
- package/dist/schema/openapi.js +7 -1
- package/dist/schema/queries.d.ts +30 -32
- package/dist/schema/queries.js +24 -25
- package/dist/schema/relation.d.ts +89 -99
- package/dist/schema/relation.js +13 -13
- package/dist/schema/residency.d.ts +38 -0
- package/dist/schema/residency.js +30 -0
- package/dist/schema/roles.d.ts +45 -27
- package/dist/schema/roles.js +52 -21
- package/dist/schema/schema.d.ts +36 -45
- package/dist/schema/schema.js +42 -39
- package/dist/schema/select.d.ts +13 -13
- package/dist/schema/select.js +13 -13
- package/dist/schema/serialize.d.ts +36 -39
- package/dist/schema/serialize.js +27 -31
- package/dist/schema/sugar.d.ts +17 -32
- package/dist/schema/sugar.js +14 -29
- package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +27 -50
- package/dist/schema/syncDeltaRow.js +89 -0
- package/dist/schema/tenancy.d.ts +44 -46
- package/dist/schema/tenancy.js +46 -48
- package/dist/server/adapter.d.ts +58 -58
- package/dist/server/adapter.js +13 -14
- package/dist/server/commit.d.ts +60 -64
- package/dist/server/index.d.ts +9 -10
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +70 -0
- package/dist/server/readConfig.js +8 -0
- package/dist/server/storageMode.d.ts +23 -0
- package/dist/server/storageMode.js +17 -0
- package/dist/source/adapter.d.ts +31 -26
- package/dist/source/adapter.js +10 -10
- package/dist/source/adapters/drizzle.d.ts +28 -23
- package/dist/source/adapters/drizzle.js +34 -28
- package/dist/source/adapters/kysely.d.ts +27 -25
- package/dist/source/adapters/kysely.js +28 -26
- package/dist/source/adapters/memory.d.ts +8 -7
- package/dist/source/adapters/memory.js +10 -9
- package/dist/source/adapters/prisma.d.ts +13 -12
- package/dist/source/adapters/prisma.js +27 -29
- package/dist/source/conformance.d.ts +18 -11
- package/dist/source/conformance.js +27 -19
- package/dist/source/connector.d.ts +31 -32
- package/dist/source/connector.js +30 -28
- package/dist/source/connectorProtocol.d.ts +160 -0
- package/dist/source/connectorProtocol.js +162 -0
- package/dist/source/contract.d.ts +26 -27
- package/dist/source/contract.js +28 -29
- package/dist/source/factory.d.ts +94 -0
- package/dist/source/factory.js +268 -0
- package/dist/source/index.d.ts +10 -462
- package/dist/source/index.js +17 -421
- package/dist/source/migrations.d.ts +9 -9
- package/dist/source/migrations.js +9 -9
- package/dist/source/next.d.ts +10 -11
- package/dist/source/next.js +7 -8
- package/dist/source/pushQueue.d.ts +70 -48
- package/dist/source/pushQueue.js +36 -29
- package/dist/source/signing.d.ts +88 -0
- package/dist/source/signing.js +159 -0
- package/dist/source/types.d.ts +351 -0
- package/dist/source/types.js +43 -0
- package/dist/stores/ObjectStore.d.ts +11 -12
- package/dist/stores/ObjectStore.js +34 -35
- package/dist/stores/ObjectStoreContract.d.ts +12 -15
- package/dist/stores/SyncActionStore.d.ts +8 -12
- package/dist/stores/SyncActionStore.js +77 -46
- package/dist/surface.d.ts +28 -21
- package/dist/surface.js +28 -20
- package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +37 -45
- package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +101 -80
- package/dist/sync/ConnectionManager.d.ts +47 -50
- package/dist/sync/ConnectionManager.js +74 -70
- package/dist/sync/NetworkProbe.d.ts +27 -31
- package/dist/sync/NetworkProbe.js +67 -72
- package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +49 -36
- package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +79 -54
- package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +45 -59
- package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +44 -52
- package/dist/sync/SyncWebSocket.d.ts +175 -250
- package/dist/sync/SyncWebSocket.js +431 -769
- package/dist/sync/awaitClaimGrant.d.ts +18 -18
- package/dist/sync/awaitClaimGrant.js +38 -30
- package/dist/sync/bootstrapApply.d.ts +70 -0
- package/dist/sync/bootstrapApply.js +73 -0
- package/dist/sync/commitFrames.d.ts +44 -0
- package/dist/sync/commitFrames.js +94 -0
- package/dist/sync/createClaimStream.d.ts +23 -22
- package/dist/sync/createClaimStream.js +108 -25
- package/dist/sync/createPresenceStream.d.ts +19 -18
- package/dist/sync/createPresenceStream.js +25 -26
- package/dist/sync/createSnapshot.d.ts +13 -17
- package/dist/sync/createSnapshot.js +20 -26
- package/dist/sync/credentialLifecycle.d.ts +175 -0
- package/dist/sync/credentialLifecycle.js +322 -0
- package/dist/sync/deltaPipeline.d.ts +113 -0
- package/dist/sync/deltaPipeline.js +261 -0
- package/dist/sync/groupChange.d.ts +113 -0
- package/dist/sync/groupChange.js +242 -0
- package/dist/sync/heartbeat.d.ts +63 -0
- package/dist/sync/heartbeat.js +91 -0
- package/dist/sync/participants.d.ts +27 -27
- package/dist/sync/schemas.d.ts +3 -2
- package/dist/sync/schemas.js +14 -10
- package/dist/sync/syncCursor.d.ts +40 -0
- package/dist/sync/syncCursor.js +55 -0
- package/dist/sync/syncPlan.d.ts +54 -0
- package/dist/sync/syncPlan.js +50 -0
- package/dist/sync/syncPosition.d.ts +54 -49
- package/dist/sync/syncPosition.js +57 -52
- package/dist/sync/wsFrameHandlers.d.ts +116 -0
- package/dist/sync/wsFrameHandlers.js +374 -0
- package/dist/testing/fixtures/bootstrap.d.ts +21 -17
- package/dist/testing/fixtures/bootstrap.js +12 -6
- package/dist/testing/fixtures/deltas.d.ts +31 -34
- package/dist/testing/fixtures/deltas.js +30 -33
- package/dist/testing/fixtures/models.d.ts +11 -10
- package/dist/testing/fixtures/models.js +12 -10
- package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
- package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
- package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -18
- package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +14 -11
- package/dist/testing/helpers/wait.d.ts +13 -8
- package/dist/testing/helpers/wait.js +13 -8
- package/dist/testing/index.d.ts +4 -4
- package/dist/testing/index.js +3 -3
- package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
- package/dist/testing/mocks/MockMutationExecutor.js +15 -14
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
- package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
- package/dist/testing/mocks/MockSyncContext.d.ts +21 -34
- package/dist/testing/mocks/MockSyncContext.js +16 -45
- package/dist/testing/mocks/MockSyncStore.d.ts +14 -14
- package/dist/testing/mocks/MockSyncStore.js +11 -11
- package/dist/testing/mocks/MockWebSocket.d.ts +28 -24
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +190 -221
- package/dist/transactions/TransactionQueue.js +424 -822
- package/dist/transactions/TransactionStore.d.ts +20 -0
- package/dist/transactions/TransactionStore.js +53 -0
- package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
- package/dist/transactions/UnconfirmedWrites.js +104 -0
- package/dist/transactions/coalesceRules.d.ts +58 -0
- package/dist/transactions/coalesceRules.js +140 -0
- package/dist/transactions/commitPayload.d.ts +130 -0
- package/dist/transactions/commitPayload.js +143 -0
- package/dist/transactions/deltaConfirmation.d.ts +58 -0
- package/dist/transactions/deltaConfirmation.js +215 -0
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/replayValidation.d.ts +99 -0
- package/dist/transactions/replayValidation.js +111 -0
- package/dist/types/global.d.ts +46 -41
- package/dist/types/global.js +20 -19
- package/dist/types/index.d.ts +74 -80
- package/dist/types/index.js +22 -27
- package/dist/types/modelData.d.ts +10 -0
- package/dist/types/modelData.js +9 -0
- package/dist/types/participant.d.ts +20 -0
- package/dist/types/participant.js +10 -0
- package/dist/types/streams.d.ts +216 -209
- package/dist/types/streams.js +7 -7
- package/dist/utils/asyncIterator.d.ts +25 -32
- package/dist/utils/asyncIterator.js +25 -32
- package/dist/utils/duration.d.ts +12 -15
- package/dist/utils/duration.js +12 -15
- package/dist/utils/mobxSetup.d.ts +53 -0
- package/dist/utils/{mobx-setup.js → mobxSetup.js} +44 -100
- package/dist/webhooks/events.d.ts +21 -16
- package/dist/webhooks/events.js +10 -8
- package/dist/webhooks/index.d.ts +5 -7
- package/dist/webhooks/index.js +5 -7
- package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
- package/dist/wire/delta.js +114 -0
- package/dist/wire/errorEnvelope.d.ts +35 -27
- package/dist/wire/errorEnvelope.js +38 -32
- package/dist/wire/frames.d.ts +150 -67
- package/dist/wire/frames.js +48 -1
- package/dist/wire/index.d.ts +18 -13
- package/dist/wire/index.js +36 -13
- package/dist/wire/listEnvelope.d.ts +16 -23
- package/dist/wire/listEnvelope.js +7 -6
- package/dist/wire/protocol.d.ts +38 -0
- package/dist/wire/protocol.js +38 -0
- package/dist/wire/protocolVersion.d.ts +60 -0
- package/dist/wire/protocolVersion.js +67 -0
- package/docs/api-keys.md +4 -3
- package/docs/coordination.md +59 -0
- package/docs/examples/existing-python-backend.md +3 -3
- package/docs/identity.md +4 -4
- package/docs/integration-guide.md +1 -1
- package/docs/react.md +1 -1
- package/docs/sessions.md +5 -7
- package/package.json +24 -21
- package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
- package/dist/ai-sdk/coordination-context.d.ts +0 -52
- package/dist/client/index.d.ts +0 -36
- package/dist/client/index.js +0 -33
- package/dist/config/index.d.ts +0 -10
- package/dist/config/index.js +0 -12
- package/dist/core/query-utils.d.ts +0 -34
- package/dist/core/query-utils.js +0 -59
- package/dist/interfaces/headless.d.ts +0 -95
- package/dist/interfaces/headless.js +0 -41
- package/dist/query/index.d.ts +0 -6
- package/dist/query/index.js +0 -5
- package/dist/realtime/index.d.ts +0 -10
- package/dist/realtime/index.js +0 -9
- package/dist/schema/plane.d.ts +0 -23
- package/dist/schema/plane.js +0 -19
- package/dist/schema/sync-delta-row.js +0 -103
- package/dist/schema/sync-delta-wire.js +0 -102
- package/dist/server/next.d.ts +0 -51
- package/dist/server/next.js +0 -47
- package/dist/server/read-config.d.ts +0 -67
- package/dist/server/read-config.js +0 -8
- package/dist/server/storage-mode.d.ts +0 -1
- package/dist/server/storage-mode.js +0 -18
- package/dist/source/connector-protocol.d.ts +0 -159
- package/dist/source/connector-protocol.js +0 -161
- package/dist/sync/OfflineFlush.d.ts +0 -9
- package/dist/sync/OfflineFlush.js +0 -22
- package/dist/sync/OfflineTransactionStore.d.ts +0 -37
- package/dist/sync/OfflineTransactionStore.js +0 -263
- package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
- package/dist/transactions/OptimisticEchoTracker.js +0 -104
- package/dist/transactions/index.d.ts +0 -16
- package/dist/transactions/index.js +0 -7
- package/dist/transactions/mutation-error-handler.d.ts +0 -5
- package/dist/transactions/mutation-error-handler.js +0 -39
- package/dist/utils/mobx-setup.d.ts +0 -42
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* TransactionQueue
|
|
2
|
+
* TransactionQueue manages the lifecycle of local writes on their way to the
|
|
3
|
+
* server: it applies each change optimistically, batches the writes made in one
|
|
4
|
+
* event-loop tick into a single commit, retries transient failures, and rolls
|
|
5
|
+
* back on permanent rejection.
|
|
3
6
|
*
|
|
4
|
-
* Key
|
|
5
|
-
* - Optimistic updates with rollback
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
8
|
-
*
|
|
7
|
+
* Key behaviours:
|
|
8
|
+
* - Optimistic updates with rollback on failure.
|
|
9
|
+
* - Configurable conflict resolution.
|
|
10
|
+
* - Microtask batching: transactions created in the same event-loop tick share
|
|
11
|
+
* a batch id and commit together in one round trip.
|
|
12
|
+
* - A dependency-injected executor, so several queues can coexist.
|
|
9
13
|
*/
|
|
10
14
|
import { EventEmitter } from 'events';
|
|
11
15
|
import type { Database } from '../Database.js';
|
|
@@ -13,59 +17,21 @@ import { Model } from '../Model.js';
|
|
|
13
17
|
import { SyncPosition } from '../sync/syncPosition.js';
|
|
14
18
|
import type { WriteOptions } from '../interfaces/index.js';
|
|
15
19
|
import type { StaleNotification, ReadDependency } from '../coordination/schema.js';
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
organizationId: string;
|
|
19
|
-
role?: string;
|
|
20
|
-
teamIds?: string[];
|
|
21
|
-
}
|
|
22
|
-
/** Wire-format mutation payload (post-projection). */
|
|
23
|
-
type MutationInput = Record<string, unknown>;
|
|
24
|
-
export interface Transaction {
|
|
25
|
-
id: string;
|
|
26
|
-
type: 'create' | 'update' | 'delete' | 'archive' | 'unarchive';
|
|
27
|
-
modelName: string;
|
|
28
|
-
modelId: string;
|
|
29
|
-
modelKey: string;
|
|
30
|
-
data?: MutationInput;
|
|
31
|
-
previousData?: MutationInput | null;
|
|
32
|
-
context: UserContext;
|
|
33
|
-
status: 'pending' | 'executing' | 'awaiting_delta' | 'completed' | 'failed' | 'rolled_back';
|
|
34
|
-
createdAt: number;
|
|
35
|
-
attempts: number;
|
|
36
|
-
priority: 'normal' | 'high';
|
|
37
|
-
priorityScore: number;
|
|
38
|
-
writeOptions?: WriteOptions;
|
|
39
|
-
batchId?: string;
|
|
40
|
-
/** Completed locally without a server operation; no sync echo will arrive. */
|
|
41
|
-
localOnly?: boolean;
|
|
42
|
-
/** LINEAR PATTERN: syncId threshold - transaction confirms when delta.id >= this value */
|
|
43
|
-
syncIdNeededForCompletion?: number;
|
|
44
|
-
/**
|
|
45
|
-
* Resolves when the server has confirmed this transaction (delta arrived
|
|
46
|
-
* or HTTP ack). Rejects with the originating error if the transaction is
|
|
47
|
-
* permanently rolled back. Name matches the queue's existing `'confirmed'`
|
|
48
|
-
* status vocabulary (`commits.create({wait:'confirmed'})`,
|
|
49
|
-
* `waitForConfirmation`) — gives call sites a single `await` point for
|
|
50
|
-
* "did my write land?", so failures surface at the source instead of
|
|
51
|
-
* leaking via silent pool rollback. The rejection error is the same
|
|
52
|
-
* `AbloError` recorded on the queue's `transaction:failed` event.
|
|
53
|
-
*/
|
|
54
|
-
confirmation?: Promise<void>;
|
|
55
|
-
}
|
|
20
|
+
import { type MutationInput, type Transaction, type UserContext } from './commitPayload.js';
|
|
21
|
+
export type { Transaction, UserContext } from './commitPayload.js';
|
|
56
22
|
/**
|
|
57
|
-
* A
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
* same `mutationExecutor.commit()`
|
|
63
|
-
*
|
|
23
|
+
* A pre-built, multi-operation commit submitted through
|
|
24
|
+
* `ablo.commits.create()`. Unlike the per-model {@link Transaction} (see
|
|
25
|
+
* `./commitPayload.js`), the caller supplies the operations and the whole
|
|
26
|
+
* envelope commits atomically: the queue does not coalesce it, reorder its
|
|
27
|
+
* operations for foreign keys, or apply it optimistically. It runs through the
|
|
28
|
+
* same `mutationExecutor.commit()` as the model batch path, so its
|
|
29
|
+
* retry-on-reconnect behaviour is identical.
|
|
64
30
|
*/
|
|
65
31
|
interface CommitTransaction {
|
|
66
32
|
id: string;
|
|
67
33
|
kind: 'commit';
|
|
68
|
-
operations:
|
|
34
|
+
operations: {
|
|
69
35
|
type: string;
|
|
70
36
|
model: string;
|
|
71
37
|
id: string;
|
|
@@ -73,9 +39,9 @@ interface CommitTransaction {
|
|
|
73
39
|
transactionId?: string;
|
|
74
40
|
readAt?: number | null;
|
|
75
41
|
onStale?: 'reject' | 'overwrite' | 'notify' | null;
|
|
76
|
-
}
|
|
42
|
+
}[];
|
|
77
43
|
causedByTaskId?: string | null;
|
|
78
|
-
/**
|
|
44
|
+
/** Read dependencies for the whole batch, forwarded to the executor so the server can detect stale-context writes. */
|
|
79
45
|
reads?: ReadDependency[] | null;
|
|
80
46
|
status: 'pending' | 'executing' | 'completed' | 'failed';
|
|
81
47
|
createdAt: number;
|
|
@@ -109,17 +75,16 @@ interface TransactionQueueConfig {
|
|
|
109
75
|
capMs: number;
|
|
110
76
|
};
|
|
111
77
|
/**
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
* jitter
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
* batch workers (e.g. 60s for agent-worker).
|
|
78
|
+
* How long, in milliseconds, to wait after the connection drops before
|
|
79
|
+
* failing any in-flight commit-lane transaction with an
|
|
80
|
+
* {@link AbloConnectionError}. Brief disconnects, such as a server restart
|
|
81
|
+
* or mobile network jitter, are absorbed transparently; only a disconnect
|
|
82
|
+
* that outlasts this window surfaces as a failure. Set it lower for
|
|
83
|
+
* interactive use (for example 10 seconds for chat) and higher for
|
|
84
|
+
* background batch work. Defaults to 30 seconds.
|
|
120
85
|
*
|
|
121
|
-
* Without this deadline, `commits.create({wait:'confirmed'})`
|
|
122
|
-
* forever
|
|
86
|
+
* Without this deadline, `commits.create({ wait: 'confirmed' })` would wait
|
|
87
|
+
* forever if the connection died while a commit was in flight.
|
|
123
88
|
*/
|
|
124
89
|
commitOfflineGraceMs: number;
|
|
125
90
|
}
|
|
@@ -143,7 +108,6 @@ export declare class TransactionQueue extends EventEmitter {
|
|
|
143
108
|
private computePriorityScore;
|
|
144
109
|
private ensureDerivedFields;
|
|
145
110
|
private entityKey;
|
|
146
|
-
private isTransactionForModel;
|
|
147
111
|
private resolveConfirmation;
|
|
148
112
|
private takeUnsentCreateForModel;
|
|
149
113
|
private cancelUnsentCreateForDelete;
|
|
@@ -151,29 +115,24 @@ export declare class TransactionQueue extends EventEmitter {
|
|
|
151
115
|
private completeLocalDelete;
|
|
152
116
|
private deferDeleteUntilCreateSettles;
|
|
153
117
|
private releaseDeferredDeletesForCreate;
|
|
154
|
-
private mergeUpdateData;
|
|
155
118
|
private config;
|
|
156
119
|
private executingCount;
|
|
157
120
|
private optimisticUpdates;
|
|
158
121
|
private commitNotifications;
|
|
159
|
-
private
|
|
160
|
-
private deltaConfirmationRetries;
|
|
122
|
+
private readonly deltaConfirmation;
|
|
161
123
|
private isConnectedFn;
|
|
162
124
|
private commitOfflineGraceTimer;
|
|
163
125
|
/**
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
* queue advances `acked`
|
|
167
|
-
* `applied
|
|
168
|
-
*
|
|
126
|
+
* This client's place in the global order of sync deltas. The instance is
|
|
127
|
+
* shared: the client injects one, and a standalone queue creates its own. The
|
|
128
|
+
* queue advances the `acked` cursor as commit responses arrive, the store
|
|
129
|
+
* advances `applied` and `persisted`, and snapshots and claims read
|
|
130
|
+
* `readFloor`. See `../sync/syncPosition.js` for the full contract.
|
|
169
131
|
*/
|
|
170
132
|
readonly position: SyncPosition;
|
|
171
133
|
/** Applied-cursor alias, kept so the many internal read sites stay legible. */
|
|
172
134
|
private get lastSeenSyncId();
|
|
173
135
|
private noteAck;
|
|
174
|
-
private static readonly DELTA_MAX_RETRIES;
|
|
175
|
-
private static readonly DELTA_INITIAL_TIMEOUT_MS;
|
|
176
|
-
private static readonly DELTA_MAX_TIMEOUT_MS;
|
|
177
136
|
private batchIndex;
|
|
178
137
|
/**
|
|
179
138
|
* Resolvers for per-transaction `confirmation` promises. Populated in
|
|
@@ -185,99 +144,104 @@ export declare class TransactionQueue extends EventEmitter {
|
|
|
185
144
|
private confirmationResolvers;
|
|
186
145
|
constructor(config?: Partial<TransactionQueueConfig>);
|
|
187
146
|
/**
|
|
188
|
-
*
|
|
189
|
-
*
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
* outcomes for the routing-helper grace-window use case).
|
|
193
|
-
*
|
|
194
|
-
* Looks across `pending`, `executing`, and `awaiting_delta` — these
|
|
195
|
-
* are the three non-terminal statuses where rollback is still
|
|
196
|
-
* possible. Skips `completed` (already settled) and `failed` /
|
|
197
|
-
* `rolled_back` (already rejected; the call site missed the
|
|
198
|
-
* `confirmation` window and should rely on `onMutationFailure` toast
|
|
199
|
-
* instead).
|
|
147
|
+
* Returns the in-flight confirmation promise for a given model and id. When
|
|
148
|
+
* several transactions match, it returns the most recent one's promise; when
|
|
149
|
+
* none is open it resolves immediately, which covers both "already confirmed"
|
|
150
|
+
* and "never staged".
|
|
200
151
|
*
|
|
201
|
-
*
|
|
202
|
-
*
|
|
203
|
-
* `
|
|
152
|
+
* It considers the three non-terminal statuses in which the write can still
|
|
153
|
+
* be rolled back — `pending`, `executing`, and `awaiting_delta` — and ignores
|
|
154
|
+
* `completed` (already settled) and `failed`/`rolled_back` (already
|
|
155
|
+
* rejected). This complements the `confirmation` promise carried on a known
|
|
156
|
+
* {@link Transaction}: use this method at call sites that hold a model
|
|
157
|
+
* returned by `ablo.<model>.create()` but never see the underlying
|
|
158
|
+
* transaction.
|
|
204
159
|
*/
|
|
205
160
|
confirmationFor(modelName: string, modelId: string): Promise<void>;
|
|
206
161
|
/**
|
|
207
|
-
*
|
|
208
|
-
*
|
|
209
|
-
*
|
|
210
|
-
*
|
|
162
|
+
* Attaches a `confirmation` promise to a newly created transaction. Call this
|
|
163
|
+
* before the transaction is staged so a caller can `await tx.confirmation`
|
|
164
|
+
* immediately after a create, update, or delete returns. It is idempotent and
|
|
165
|
+
* returns early if one is already attached.
|
|
211
166
|
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
* rejection.
|
|
215
|
-
* `.then`/`.catch
|
|
167
|
+
* It also attaches a no-op rejection handler. Most callers never await the
|
|
168
|
+
* confirmation, and without this the runtime would report an unhandled
|
|
169
|
+
* rejection when a write fails. Callers that do want to observe failure simply
|
|
170
|
+
* attach their own `.then`/`.catch`.
|
|
216
171
|
*/
|
|
217
172
|
private attachConfirmation;
|
|
218
173
|
/**
|
|
219
|
-
*
|
|
220
|
-
*
|
|
174
|
+
* Registers a predicate the queue uses to check whether it is connected.
|
|
175
|
+
* While disconnected, confirmation timeouts re-schedule themselves instead of
|
|
176
|
+
* escalating, so a transaction is never rolled back merely because the client
|
|
177
|
+
* was briefly offline.
|
|
221
178
|
*/
|
|
222
179
|
setConnectionChecker(fn: () => boolean): void;
|
|
223
180
|
/**
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
* On `'disconnected'`: start a one-shot timer of
|
|
227
|
-
* `config.commitOfflineGraceMs`. If the timer fires (disconnect
|
|
228
|
-
* persisted past grace), iterate every commit-lane transaction with
|
|
229
|
-
* `status ∈ {'pending', 'executing'}` and emit
|
|
230
|
-
* `transaction:failed:${id}` with an `AbloConnectionError`. That
|
|
231
|
-
* lets `waitForCommitReceipt` reject in seconds instead of hanging
|
|
232
|
-
* forever — which is what wedged the 2026-05-15 subagent run.
|
|
181
|
+
* Drives the offline-grace timer for in-flight commit-lane transactions.
|
|
233
182
|
*
|
|
234
|
-
* On `'
|
|
235
|
-
*
|
|
236
|
-
*
|
|
183
|
+
* On `'disconnected'` it starts a one-shot timer of
|
|
184
|
+
* `config.commitOfflineGraceMs`. If that timer fires — meaning the disconnect
|
|
185
|
+
* outlasted the grace window — every commit-lane transaction still `pending`
|
|
186
|
+
* or `executing` is failed with an {@link AbloConnectionError}, so
|
|
187
|
+
* {@link waitForCommitReceipt} rejects within seconds instead of hanging.
|
|
237
188
|
*
|
|
238
|
-
*
|
|
239
|
-
*
|
|
189
|
+
* On `'connected'` it clears any pending grace timer. Brief disconnects are
|
|
190
|
+
* absorbed transparently; {@link processCommitLane} and
|
|
191
|
+
* {@link flushOfflineQueue} resume the work on reconnect.
|
|
240
192
|
*/
|
|
241
193
|
setConnectionState(state: 'connected' | 'disconnected'): void;
|
|
242
194
|
private failInFlightCommitsOnOffline;
|
|
243
195
|
/**
|
|
244
|
-
*
|
|
245
|
-
* right after
|
|
246
|
-
*
|
|
247
|
-
*
|
|
196
|
+
* Binds the mutation executor for this queue instance. The owning client
|
|
197
|
+
* calls this right after construction, so commits made here always dispatch
|
|
198
|
+
* through this instance's connection even when several client instances exist
|
|
199
|
+
* in the same process.
|
|
248
200
|
*/
|
|
249
201
|
setMutationExecutor(executor: import('../interfaces/index.js').MutationExecutor): void;
|
|
250
202
|
/**
|
|
251
|
-
*
|
|
252
|
-
*
|
|
203
|
+
* Stages a transaction for commit. Transactions staged within the same
|
|
204
|
+
* event-loop tick are committed together.
|
|
253
205
|
*/
|
|
254
206
|
private stageTransaction;
|
|
255
207
|
/**
|
|
256
|
-
*
|
|
257
|
-
*
|
|
208
|
+
* Schedules the staged transactions to commit on a microtask, so all
|
|
209
|
+
* transactions created synchronously within one tick are batched together.
|
|
258
210
|
*/
|
|
259
211
|
private scheduleCommit;
|
|
260
212
|
/**
|
|
261
|
-
*
|
|
262
|
-
*
|
|
213
|
+
* Moves all staged transactions onto the execution queue, assigning them a
|
|
214
|
+
* single shared batch index so they commit together.
|
|
263
215
|
*/
|
|
264
216
|
private commitCreatedTransactions;
|
|
217
|
+
/**
|
|
218
|
+
* Flushes every pending transaction in one commit, the fast path taken on
|
|
219
|
+
* reconnect. If the batch fails, each transaction falls back to normal,
|
|
220
|
+
* one-by-one processing.
|
|
221
|
+
*/
|
|
265
222
|
flushOfflineQueue(): Promise<void>;
|
|
266
223
|
/**
|
|
267
|
-
*
|
|
224
|
+
* Records a create and applies it optimistically, then stages it for the next
|
|
225
|
+
* batched commit. Returns the {@link Transaction}, whose `confirmation`
|
|
226
|
+
* promise settles once the server confirms the write.
|
|
268
227
|
*/
|
|
269
228
|
create(model: Model, context: UserContext, writeOptions?: WriteOptions): Promise<Transaction>;
|
|
270
229
|
/**
|
|
271
|
-
*
|
|
272
|
-
*
|
|
230
|
+
* Records an update and applies it optimistically, then stages it for the next
|
|
231
|
+
* batched commit. Rapid updates to the same entity coalesce into a single wire
|
|
232
|
+
* operation.
|
|
233
|
+
* @param precomputedChanges - Optional pre-captured changes, used instead of re-reading them from the model.
|
|
273
234
|
*/
|
|
274
235
|
update(model: Model, context: UserContext, precomputedChanges?: Record<string, unknown>, writeOptions?: WriteOptions): Promise<Transaction>;
|
|
275
236
|
/**
|
|
276
|
-
*
|
|
237
|
+
* Records a delete and applies it optimistically. If the row's own create has
|
|
238
|
+
* not yet been sent, both are cancelled locally rather than sending a create
|
|
239
|
+
* followed by a delete; if the create is already in flight, the delete waits
|
|
240
|
+
* until it settles so the server never sees a delete before the create.
|
|
277
241
|
*/
|
|
278
242
|
delete(model: Model, context: UserContext, writeOptions?: WriteOptions): Promise<Transaction>;
|
|
279
243
|
/**
|
|
280
|
-
*
|
|
244
|
+
* Uploads a single attachment, delegating to the mutation executor.
|
|
281
245
|
*/
|
|
282
246
|
uploadAttachment(_file: File, options: {
|
|
283
247
|
id: string;
|
|
@@ -286,76 +250,79 @@ export declare class TransactionQueue extends EventEmitter {
|
|
|
286
250
|
url: string;
|
|
287
251
|
} | null>;
|
|
288
252
|
/**
|
|
289
|
-
*
|
|
253
|
+
* Uploads several attachments in one call, delegating to the mutation executor.
|
|
290
254
|
*/
|
|
291
|
-
batchUploadAttachments(_files: File[], items:
|
|
255
|
+
batchUploadAttachments(_files: File[], items: {
|
|
292
256
|
id: string;
|
|
293
257
|
[key: string]: unknown;
|
|
294
|
-
}
|
|
258
|
+
}[], _context: UserContext): Promise<{
|
|
295
259
|
id: string;
|
|
296
260
|
url: string;
|
|
297
|
-
}
|
|
261
|
+
}[]>;
|
|
298
262
|
/**
|
|
299
|
-
*
|
|
263
|
+
* Records an archive and applies it optimistically, then stages it for the
|
|
264
|
+
* next batched commit.
|
|
300
265
|
*/
|
|
301
266
|
archive(model: Model, context: UserContext, writeOptions?: WriteOptions): Promise<Transaction>;
|
|
302
267
|
/**
|
|
303
|
-
*
|
|
268
|
+
* Records an unarchive and applies it optimistically, then stages it for the
|
|
269
|
+
* next batched commit.
|
|
304
270
|
*/
|
|
305
271
|
unarchive(model: Model, context: UserContext): Promise<Transaction>;
|
|
306
272
|
/**
|
|
307
|
-
*
|
|
273
|
+
* Places a transaction on the execution queue, coalescing it into an existing
|
|
274
|
+
* same-entity update where possible so redundant writes collapse.
|
|
308
275
|
*/
|
|
309
276
|
private enqueue;
|
|
310
277
|
private scheduleProcessing;
|
|
311
278
|
/**
|
|
312
|
-
*
|
|
313
|
-
*
|
|
314
|
-
*
|
|
315
|
-
*
|
|
316
|
-
*
|
|
317
|
-
*
|
|
318
|
-
* This reduces N round-trips to 1, dramatically improving batch latency.
|
|
279
|
+
* Processes one batch of transactions in a single commit. Rather than calling
|
|
280
|
+
* the server once per operation type or model, it collects every batchable
|
|
281
|
+
* operation and sends them together; the server applies the mixed operations
|
|
282
|
+
* atomically within one transaction. This turns many round trips into one and
|
|
283
|
+
* greatly reduces batch latency.
|
|
319
284
|
*/
|
|
320
285
|
private processBatch;
|
|
321
286
|
/**
|
|
322
|
-
*
|
|
323
|
-
*
|
|
324
|
-
* @
|
|
287
|
+
* Confirms every awaiting transaction whose sync-id threshold this delta meets
|
|
288
|
+
* or exceeds. The confirmation policy and timeout tracking live in
|
|
289
|
+
* {@link DeltaConfirmationTracker} (`./deltaConfirmation.js`).
|
|
290
|
+
* @param syncId - The sync id of the received delta.
|
|
325
291
|
*/
|
|
326
292
|
onDeltaReceived(syncId: number): void;
|
|
327
293
|
private scheduleDeltaConfirmationTimeout;
|
|
328
|
-
private cancelDeltaConfirmationTimeout;
|
|
329
294
|
/**
|
|
330
|
-
*
|
|
331
|
-
*
|
|
295
|
+
* Resolves once the given transaction is confirmed and rejects if it fails.
|
|
296
|
+
* The confirming delta's timeout is handled by
|
|
297
|
+
* {@link scheduleDeltaConfirmationTimeout}.
|
|
332
298
|
*/
|
|
333
299
|
waitForConfirmation(transactionId: string): Promise<void>;
|
|
334
300
|
hasClientMutationId(id: string): boolean;
|
|
335
301
|
/**
|
|
336
|
-
*
|
|
337
|
-
* path
|
|
338
|
-
*
|
|
339
|
-
*
|
|
340
|
-
*
|
|
341
|
-
*
|
|
302
|
+
* Enqueues a pre-built, multi-operation atomic commit — the
|
|
303
|
+
* `ablo.commits.create()` path. The caller supplies the operations; the queue
|
|
304
|
+
* only retries on reconnect and de-duplicates, and does not apply the change
|
|
305
|
+
* optimistically or reorder for foreign keys. A duplicate `clientTxId`
|
|
306
|
+
* already in flight is ignored: the server's `mutation_log` de-duplicates
|
|
307
|
+
* across sessions, and this guard covers a double-enqueue within one session.
|
|
342
308
|
*/
|
|
343
309
|
enqueueCommit(clientTxId: string, operations: CommitTransaction['operations'], options?: {
|
|
344
310
|
causedByTaskId?: string | null;
|
|
345
311
|
reads?: ReadDependency[] | null;
|
|
346
312
|
}): void;
|
|
347
313
|
/**
|
|
348
|
-
*
|
|
349
|
-
*
|
|
350
|
-
*
|
|
351
|
-
*
|
|
314
|
+
* Drains the pending commit-lane envelopes one at a time. A transient
|
|
315
|
+
* failure, such as a network error, leaves the envelope at the head of the
|
|
316
|
+
* lane in `pending` and stops; reconnect re-kicks it through
|
|
317
|
+
* {@link flushOfflineQueue}. A permanent failure emits
|
|
318
|
+
* `transaction:failed:<id>` and drops the envelope.
|
|
352
319
|
*/
|
|
353
320
|
private processCommitLane;
|
|
354
321
|
/**
|
|
355
|
-
*
|
|
356
|
-
*
|
|
357
|
-
*
|
|
358
|
-
*
|
|
322
|
+
* Resolves once a commit-lane transaction is confirmed, returning the server's
|
|
323
|
+
* `lastSyncId` and any stale-context notifications; rejects on permanent
|
|
324
|
+
* failure. This backs the `wait: 'confirmed'` semantics of
|
|
325
|
+
* `ablo.commits.create()`.
|
|
359
326
|
*/
|
|
360
327
|
waitForCommitReceipt(clientTxId: string): Promise<{
|
|
361
328
|
lastSyncId: number;
|
|
@@ -363,80 +330,84 @@ export declare class TransactionQueue extends EventEmitter {
|
|
|
363
330
|
}>;
|
|
364
331
|
private isReorderPayload;
|
|
365
332
|
/**
|
|
366
|
-
*
|
|
367
|
-
*
|
|
368
|
-
*
|
|
369
|
-
*
|
|
333
|
+
* Classifies an error as transient (worth retrying) or permanent. The
|
|
334
|
+
* approach is deliberately conservative: only known-transient errors are
|
|
335
|
+
* retried, and anything unrecognized is treated as permanent so a failing
|
|
336
|
+
* write cannot loop forever.
|
|
370
337
|
*
|
|
371
|
-
* Transient
|
|
372
|
-
* - Network failures, connection errors, timeouts
|
|
373
|
-
* - Server errors (5xx
|
|
374
|
-
* - Rate limiting (429)
|
|
338
|
+
* Transient (retried):
|
|
339
|
+
* - Network failures, connection errors, and timeouts.
|
|
340
|
+
* - Server errors (HTTP 5xx).
|
|
341
|
+
* - Rate limiting (HTTP 429).
|
|
375
342
|
*
|
|
376
|
-
* Permanent
|
|
377
|
-
* - Validation errors
|
|
378
|
-
* - Not found, unauthorized, forbidden
|
|
379
|
-
* - Any other business
|
|
343
|
+
* Permanent (not retried), among others:
|
|
344
|
+
* - Validation errors and constraint violations.
|
|
345
|
+
* - Not found, unauthorized, and forbidden.
|
|
346
|
+
* - Any other business-logic error from the server.
|
|
380
347
|
*/
|
|
381
348
|
private isPermanentError;
|
|
382
349
|
/**
|
|
383
|
-
*
|
|
350
|
+
* Handles a failed transaction: retries transient failures with backoff and
|
|
351
|
+
* rolls back permanent ones, settling the transaction's confirmation promise
|
|
352
|
+
* either way.
|
|
384
353
|
*/
|
|
385
354
|
private handleFailure;
|
|
386
355
|
/**
|
|
387
|
-
*
|
|
356
|
+
* Resolves a conflict against server data using the configured strategy:
|
|
357
|
+
* last-write-wins rolls the local change back, merge and reject re-enqueue it,
|
|
358
|
+
* and custom applies the caller's resolver.
|
|
388
359
|
*/
|
|
389
360
|
handleConflict(transaction: Transaction, serverData: MutationInput): Promise<void>;
|
|
390
361
|
/**
|
|
391
|
-
* Optimistic updates
|
|
362
|
+
* Optimistic updates. The apply and rollback rules live in `./optimisticApply.js`;
|
|
363
|
+
* these methods bind them to the queue's own tracking map and event emitter.
|
|
392
364
|
*/
|
|
393
365
|
private applyOptimisticCreate;
|
|
394
366
|
private applyOptimisticUpdate;
|
|
395
367
|
private applyOptimisticDelete;
|
|
396
368
|
private rollbackOptimistic;
|
|
397
369
|
/**
|
|
398
|
-
*
|
|
370
|
+
* Loads transactions persisted from a previous session and re-enqueues them,
|
|
371
|
+
* so writes made while offline survive a restart. Does nothing when
|
|
372
|
+
* persistence is disabled.
|
|
399
373
|
*/
|
|
400
|
-
|
|
374
|
+
loadPersistedTransactions(database: Database): Promise<void>;
|
|
401
375
|
/**
|
|
402
|
-
*
|
|
376
|
+
* Validates and rehydrates one persisted row. Rows written to the same store
|
|
377
|
+
* by other subsystems are skipped, and rows that fail the persisted
|
|
378
|
+
* transaction schema — from an older version or corruption — are dropped and
|
|
379
|
+
* reported rather than replayed as commits.
|
|
403
380
|
*/
|
|
404
|
-
loadPersistedTransactions(database: Database): Promise<void>;
|
|
405
381
|
private deserializeTransaction;
|
|
406
382
|
/**
|
|
407
|
-
*
|
|
383
|
+
* Cancels every pending or executing transaction for a given model id,
|
|
384
|
+
* optionally limited to one operation type, rolling back their optimistic
|
|
385
|
+
* state. Returns the cancelled transactions.
|
|
408
386
|
*/
|
|
409
387
|
cancelTransactionsForModel(modelId: string, transactionType?: string): Transaction[];
|
|
410
388
|
/**
|
|
411
|
-
*
|
|
412
|
-
*
|
|
413
|
-
*
|
|
414
|
-
* This keeps FK relationship knowledge in ModelRegistry/SyncedStore,
|
|
415
|
-
* while TransactionQueue just handles the cancellation mechanics.
|
|
389
|
+
* Cancels pending transactions for child rows that reference a deleted parent,
|
|
390
|
+
* used to cascade a parent deletion. The caller supplies the foreign-key
|
|
391
|
+
* relationship; this method performs the cancellation.
|
|
416
392
|
*
|
|
417
|
-
* @param childModelName - The child model type (
|
|
418
|
-
* @param foreignKey - The
|
|
419
|
-
* @param parentId - The deleted parent's
|
|
420
|
-
* @returns
|
|
393
|
+
* @param childModelName - The child model type (for example 'SlideLayer').
|
|
394
|
+
* @param foreignKey - The foreign-key property name (for example 'slideId').
|
|
395
|
+
* @param parentId - The deleted parent's id.
|
|
396
|
+
* @returns The number of transactions cancelled.
|
|
421
397
|
*/
|
|
422
398
|
cancelTransactionsByForeignKey(childModelName: string, foreignKey: string, parentId: string): number;
|
|
423
399
|
/**
|
|
424
|
-
*
|
|
400
|
+
* Returns the number of transactions still pending or executing.
|
|
425
401
|
*/
|
|
426
402
|
getOutstandingTransactionCount(): number;
|
|
427
|
-
/**
|
|
428
|
-
* Utilities
|
|
429
|
-
*/
|
|
403
|
+
/** Generates a unique local transaction id. */
|
|
430
404
|
private generateId;
|
|
431
405
|
private mergeData;
|
|
432
406
|
private extractCreateData;
|
|
433
407
|
private mapChangesToInput;
|
|
434
408
|
private extractUpdateData;
|
|
435
|
-
private buildUpdateInput;
|
|
436
409
|
private extractPreviousData;
|
|
437
|
-
/**
|
|
438
|
-
* Public API
|
|
439
|
-
*/
|
|
410
|
+
/** Returns a snapshot of queue counts and the current configuration. */
|
|
440
411
|
getStats(): {
|
|
441
412
|
pending: number;
|
|
442
413
|
executing: number;
|
|
@@ -467,24 +438,23 @@ export declare class TransactionQueue extends EventEmitter {
|
|
|
467
438
|
capMs: number;
|
|
468
439
|
};
|
|
469
440
|
/**
|
|
470
|
-
*
|
|
471
|
-
*
|
|
472
|
-
*
|
|
473
|
-
* jitter
|
|
474
|
-
*
|
|
475
|
-
*
|
|
476
|
-
*
|
|
477
|
-
* batch workers (e.g. 60s for agent-worker).
|
|
441
|
+
* How long, in milliseconds, to wait after the connection drops before
|
|
442
|
+
* failing any in-flight commit-lane transaction with an
|
|
443
|
+
* {@link AbloConnectionError}. Brief disconnects, such as a server restart
|
|
444
|
+
* or mobile network jitter, are absorbed transparently; only a disconnect
|
|
445
|
+
* that outlasts this window surfaces as a failure. Set it lower for
|
|
446
|
+
* interactive use (for example 10 seconds for chat) and higher for
|
|
447
|
+
* background batch work. Defaults to 30 seconds.
|
|
478
448
|
*
|
|
479
|
-
* Without this deadline, `commits.create({wait:'confirmed'})`
|
|
480
|
-
* forever
|
|
449
|
+
* Without this deadline, `commits.create({ wait: 'confirmed' })` would wait
|
|
450
|
+
* forever if the connection died while a commit was in flight.
|
|
481
451
|
*/
|
|
482
452
|
commitOfflineGraceMs: number;
|
|
483
453
|
};
|
|
484
454
|
};
|
|
485
455
|
/**
|
|
486
|
-
*
|
|
487
|
-
*
|
|
456
|
+
* Returns detailed internal state — pending, executing, and awaiting-delta
|
|
457
|
+
* transactions — to help diagnose delta-confirmation issues.
|
|
488
458
|
*/
|
|
489
459
|
getDebugInfo(): {
|
|
490
460
|
lastSeenSyncId: number;
|
|
@@ -511,12 +481,11 @@ export declare class TransactionQueue extends EventEmitter {
|
|
|
511
481
|
modelId: string;
|
|
512
482
|
}[];
|
|
513
483
|
};
|
|
514
|
-
/**
|
|
515
|
-
* Set configuration
|
|
516
|
-
*/
|
|
484
|
+
/** Merges the given options into the queue's configuration. */
|
|
517
485
|
setConfig(config: Partial<TransactionQueueConfig>): void;
|
|
518
486
|
/**
|
|
519
|
-
*
|
|
487
|
+
* Re-emits an incoming sync delta on the `sync:delta` event for the store to
|
|
488
|
+
* apply. Because rows use stable ids, no id reconciliation is needed here.
|
|
520
489
|
*/
|
|
521
490
|
handleSyncDelta(delta: {
|
|
522
491
|
id: string;
|
|
@@ -525,8 +494,8 @@ export declare class TransactionQueue extends EventEmitter {
|
|
|
525
494
|
data: any;
|
|
526
495
|
}): boolean;
|
|
527
496
|
/**
|
|
528
|
-
*
|
|
497
|
+
* Releases the queue's resources: rolls back outstanding optimistic updates,
|
|
498
|
+
* clears all timers and stored transactions, and removes event listeners.
|
|
529
499
|
*/
|
|
530
500
|
dispose(): void;
|
|
531
501
|
}
|
|
532
|
-
export {};
|