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