@abloatai/ablo 0.35.0 → 0.37.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 +2 -2
- package/CHANGELOG.md +71 -1929
- package/NOTICE +2 -2
- package/README.md +23 -532
- package/assets/banner.png +0 -0
- package/dist/auth.d.ts +2 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +2 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +3 -0
- package/dist/client.js.map +1 -0
- package/dist/coordination.d.ts +2 -0
- package/dist/coordination.d.ts.map +1 -0
- package/dist/coordination.js +2 -0
- package/dist/coordination.js.map +1 -0
- package/dist/index.d.ts +3 -112
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -161
- package/dist/index.js.map +1 -0
- package/dist/react.d.ts +4 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +3 -0
- package/dist/react.js.map +1 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -0
- package/dist/source-conformance.d.ts +2 -0
- package/dist/source-conformance.d.ts.map +1 -0
- package/dist/source-conformance.js +2 -0
- package/dist/source-conformance.js.map +1 -0
- package/dist/source-drizzle.d.ts +2 -0
- package/dist/source-drizzle.d.ts.map +1 -0
- package/dist/source-drizzle.js +2 -0
- package/dist/source-drizzle.js.map +1 -0
- package/dist/source-kysely.d.ts +2 -0
- package/dist/source-kysely.d.ts.map +1 -0
- package/dist/source-kysely.js +2 -0
- package/dist/source-kysely.js.map +1 -0
- package/dist/source-next.d.ts +2 -0
- package/dist/source-next.d.ts.map +1 -0
- package/dist/source-next.js +2 -0
- package/dist/source-next.js.map +1 -0
- package/dist/source.d.ts +2 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +2 -0
- package/dist/source.js.map +1 -0
- package/dist/wire.d.ts +2 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +2 -0
- package/dist/wire.js.map +1 -0
- package/docs/agents.md +2 -2
- package/docs/api-keys.md +13 -12
- package/docs/api.md +15 -53
- package/docs/audit.md +4 -3
- package/docs/cli.md +11 -11
- package/docs/client-behavior.md +9 -9
- package/docs/concurrency-convention.md +28 -42
- package/docs/coordination.md +228 -86
- package/docs/data-sources.md +5 -5
- package/docs/debugging.md +34 -12
- package/docs/deployment.md +8 -8
- package/docs/examples/agent-human.md +4 -4
- package/docs/examples/ai-sdk-tool.md +1 -1
- package/docs/examples/existing-python-backend.md +15 -4
- package/docs/examples/nextjs.md +27 -6
- package/docs/examples/scoped-agent.md +3 -3
- package/docs/examples/server-agent.md +2 -2
- package/docs/groups.md +57 -3
- package/docs/guarantees.md +37 -10
- package/docs/how-it-works.md +32 -8
- package/docs/idempotency.md +6 -6
- package/docs/identity.md +24 -24
- package/docs/index.md +8 -8
- package/docs/integration-guide.md +38 -16
- package/docs/internal/README.md +18 -0
- package/docs/internal/agent-fleet-coordination-design.md +171 -0
- package/docs/internal/agent-orchestration.md +58 -0
- package/docs/internal/commit-identifiers.md +91 -0
- package/docs/internal/concurrency-open-decisions.md +37 -0
- package/docs/internal/data-source-reverse-channel.md +150 -0
- package/docs/internal/per-field-conflict-detection.md +165 -0
- package/docs/internal/postgres-replication.md +64 -0
- package/docs/internal/serializable-schema.md +119 -0
- package/docs/internal/structure.md +32 -0
- package/docs/mcp.md +9 -9
- package/docs/migration.md +37 -18
- package/docs/projects.md +1 -1
- package/docs/quickstart.md +2 -2
- package/docs/react.md +24 -13
- package/docs/schema-contract.md +3 -3
- package/docs/sessions.md +91 -37
- package/docs/webhooks.md +9 -9
- package/examples/README.md +2 -2
- package/examples/data-source/README.md +1 -1
- package/examples/data-source/ablo-driver.ts +1 -1
- package/examples/data-source/customer-server.ts +1 -1
- package/examples/data-source/run.ts +1 -1
- package/examples/data-source/schema.ts +1 -1
- package/examples/quickstart.ts +2 -2
- package/llms.txt +12 -12
- package/package.json +64 -174
- package/dist/BaseSyncedStore.d.ts +0 -823
- package/dist/BaseSyncedStore.js +0 -1955
- package/dist/Database.d.ts +0 -335
- package/dist/Database.js +0 -1500
- package/dist/InstanceCache.d.ts +0 -233
- package/dist/InstanceCache.js +0 -1164
- package/dist/LazyReferenceCollection.d.ts +0 -177
- package/dist/LazyReferenceCollection.js +0 -461
- package/dist/Model.d.ts +0 -444
- package/dist/Model.js +0 -909
- package/dist/ModelRegistry.d.ts +0 -221
- package/dist/ModelRegistry.js +0 -537
- package/dist/NetworkMonitor.d.ts +0 -26
- package/dist/NetworkMonitor.js +0 -77
- package/dist/RuntimeContext.d.ts +0 -52
- package/dist/RuntimeContext.js +0 -80
- package/dist/SyncClient.d.ts +0 -551
- package/dist/SyncClient.js +0 -2199
- package/dist/adapters/alwaysOnline.d.ts +0 -14
- package/dist/adapters/alwaysOnline.js +0 -17
- package/dist/adapters/inMemoryStorage.d.ts +0 -31
- package/dist/adapters/inMemoryStorage.js +0 -110
- package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
- package/dist/ai-sdk/coordinatedTool.js +0 -134
- package/dist/ai-sdk/coordinationContext.d.ts +0 -46
- package/dist/ai-sdk/coordinationContext.js +0 -106
- package/dist/ai-sdk/index.d.ts +0 -121
- package/dist/ai-sdk/index.js +0 -121
- package/dist/ai-sdk/wrap.d.ts +0 -65
- package/dist/ai-sdk/wrap.js +0 -39
- package/dist/auth/index.d.ts +0 -1
- package/dist/auth/index.js +0 -8
- package/dist/batching/index.d.ts +0 -55
- package/dist/batching/index.js +0 -147
- package/dist/cli.cjs +0 -288600
- package/dist/client/Ablo.d.ts +0 -231
- package/dist/client/Ablo.js +0 -149
- package/dist/client/abloClient.d.ts +0 -309
- package/dist/client/abloClient.js +0 -13
- package/dist/client/clientPrelude.d.ts +0 -52
- package/dist/client/clientPrelude.js +0 -60
- package/dist/client/consoleLogger.d.ts +0 -35
- package/dist/client/consoleLogger.js +0 -44
- package/dist/client/coreClient.d.ts +0 -60
- package/dist/client/coreClient.js +0 -118
- package/dist/client/createInternalComponents.d.ts +0 -46
- package/dist/client/createInternalComponents.js +0 -92
- package/dist/client/createModelProxy.d.ts +0 -228
- package/dist/client/createModelProxy.js +0 -818
- package/dist/client/humans.d.ts +0 -48
- package/dist/client/humans.js +0 -52
- package/dist/client/modelRegistration.d.ts +0 -10
- package/dist/client/modelRegistration.js +0 -312
- package/dist/client/options.d.ts +0 -461
- package/dist/client/options.js +0 -7
- package/dist/client/reactiveEngine.d.ts +0 -48
- package/dist/client/reactiveEngine.js +0 -910
- package/dist/client/resourceTypes.d.ts +0 -12
- package/dist/client/resourceTypes.js +0 -10
- package/dist/client/schemaConfig.d.ts +0 -44
- package/dist/client/schemaConfig.js +0 -185
- package/dist/client/validateAbloOptions.d.ts +0 -42
- package/dist/client/validateAbloOptions.js +0 -43
- package/dist/client/wsMutationExecutor.d.ts +0 -27
- package/dist/client/wsMutationExecutor.js +0 -72
- package/dist/context.d.ts +0 -29
- package/dist/context.js +0 -58
- package/dist/coordination/ClaimLog.d.ts +0 -26
- package/dist/coordination/ClaimLog.js +0 -32
- package/dist/coordination/index.d.ts +0 -1
- package/dist/coordination/index.js +0 -8
- package/dist/core/DatabaseManager.d.ts +0 -105
- package/dist/core/DatabaseManager.js +0 -387
- package/dist/core/QueryProcessor.d.ts +0 -75
- package/dist/core/QueryProcessor.js +0 -255
- package/dist/core/QueryView.d.ts +0 -79
- package/dist/core/QueryView.js +0 -218
- package/dist/core/StoreManager.d.ts +0 -112
- package/dist/core/StoreManager.js +0 -302
- package/dist/core/ViewRegistry.d.ts +0 -20
- package/dist/core/ViewRegistry.js +0 -55
- package/dist/core/index.d.ts +0 -33
- package/dist/core/index.js +0 -48
- package/dist/core/openIDBWithTimeout.d.ts +0 -65
- package/dist/core/openIDBWithTimeout.js +0 -153
- package/dist/core/queryUtils.d.ts +0 -45
- package/dist/core/queryUtils.js +0 -69
- package/dist/core/storeContract.d.ts +0 -145
- package/dist/core/storeContract.js +0 -12
- package/dist/docs/catalog.d.ts +0 -72
- package/dist/docs/catalog.js +0 -227
- package/dist/docs/index.d.ts +0 -10
- package/dist/docs/index.js +0 -10
- package/dist/environment.d.ts +0 -1
- package/dist/environment.js +0 -8
- package/dist/interfaces/index.d.ts +0 -311
- package/dist/interfaces/index.js +0 -9
- package/dist/keys/index.d.ts +0 -1
- package/dist/keys/index.js +0 -8
- package/dist/mutators/RecordingMutation.d.ts +0 -36
- package/dist/mutators/RecordingMutation.js +0 -182
- package/dist/mutators/Transaction.d.ts +0 -40
- package/dist/mutators/Transaction.js +0 -58
- package/dist/mutators/UndoManager.d.ts +0 -258
- package/dist/mutators/UndoManager.js +0 -658
- package/dist/mutators/defineMutators.d.ts +0 -60
- package/dist/mutators/defineMutators.js +0 -18
- package/dist/mutators/inverseOp.d.ts +0 -126
- package/dist/mutators/inverseOp.js +0 -71
- package/dist/mutators/mutateActions.d.ts +0 -45
- package/dist/mutators/mutateActions.js +0 -105
- package/dist/mutators/readerActions.d.ts +0 -33
- package/dist/mutators/readerActions.js +0 -57
- package/dist/mutators/undoApply.d.ts +0 -51
- package/dist/mutators/undoApply.js +0 -117
- package/dist/policy/index.d.ts +0 -21
- package/dist/policy/index.js +0 -20
- package/dist/query/client.d.ts +0 -61
- package/dist/query/client.js +0 -137
- package/dist/query/types.d.ts +0 -85
- package/dist/query/types.js +0 -16
- package/dist/react/AbloProvider.d.ts +0 -230
- package/dist/react/AbloProvider.js +0 -455
- package/dist/react/ClientSideSuspense.d.ts +0 -36
- package/dist/react/ClientSideSuspense.js +0 -17
- package/dist/react/DefaultFallback.d.ts +0 -24
- package/dist/react/DefaultFallback.js +0 -43
- package/dist/react/context.d.ts +0 -55
- package/dist/react/context.js +0 -29
- package/dist/react/index.d.ts +0 -61
- package/dist/react/index.js +0 -66
- package/dist/react/internalContext.d.ts +0 -33
- package/dist/react/internalContext.js +0 -3
- package/dist/react/useAblo.d.ts +0 -75
- package/dist/react/useAblo.js +0 -102
- package/dist/react/useCurrentUserId.d.ts +0 -22
- package/dist/react/useCurrentUserId.js +0 -34
- package/dist/react/useErrorListener.d.ts +0 -20
- package/dist/react/useErrorListener.js +0 -38
- package/dist/react/useMutationFailureListener.d.ts +0 -26
- package/dist/react/useMutationFailureListener.js +0 -38
- package/dist/react/useMutators.d.ts +0 -56
- package/dist/react/useMutators.js +0 -84
- package/dist/react/useReactive.d.ts +0 -35
- package/dist/react/useReactive.js +0 -123
- package/dist/react/useSyncStatus.d.ts +0 -59
- package/dist/react/useSyncStatus.js +0 -76
- package/dist/react/useUndoScope.d.ts +0 -34
- package/dist/react/useUndoScope.js +0 -81
- package/dist/schema/coordination.d.ts +0 -112
- package/dist/schema/coordination.js +0 -129
- package/dist/schema/ddl.d.ts +0 -97
- package/dist/schema/ddl.js +0 -491
- package/dist/schema/ddlLock.d.ts +0 -35
- package/dist/schema/ddlLock.js +0 -46
- package/dist/schema/diff.d.ts +0 -225
- package/dist/schema/diff.js +0 -289
- package/dist/schema/generate.d.ts +0 -19
- package/dist/schema/generate.js +0 -86
- package/dist/schema/index.d.ts +0 -41
- package/dist/schema/index.js +0 -76
- package/dist/schema/queries.d.ts +0 -201
- package/dist/schema/queries.js +0 -144
- package/dist/schema/select.d.ts +0 -40
- package/dist/schema/select.js +0 -87
- package/dist/schema/serialize.d.ts +0 -115
- package/dist/schema/serialize.js +0 -262
- package/dist/schema/sugar.d.ts +0 -109
- package/dist/schema/sugar.js +0 -83
- package/dist/schema/syncDeltaRow.d.ts +0 -6
- package/dist/schema/syncDeltaRow.js +0 -6
- package/dist/server/adapter.d.ts +0 -173
- package/dist/server/adapter.js +0 -18
- package/dist/server/commit.d.ts +0 -107
- package/dist/server/commit.js +0 -1
- package/dist/server/index.d.ts +0 -14
- package/dist/server/index.js +0 -2
- package/dist/server/readConfig.d.ts +0 -80
- package/dist/server/readConfig.js +0 -8
- package/dist/server/storageMode.d.ts +0 -23
- package/dist/server/storageMode.js +0 -17
- package/dist/source/adapter.d.ts +0 -81
- package/dist/source/adapter.js +0 -22
- package/dist/source/adapters/drizzle.d.ts +0 -48
- package/dist/source/adapters/drizzle.js +0 -219
- package/dist/source/adapters/kysely.d.ts +0 -42
- package/dist/source/adapters/kysely.js +0 -205
- package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
- package/dist/source/adapters/kyselyMutationCore.js +0 -125
- package/dist/source/adapters/memory.d.ts +0 -13
- package/dist/source/adapters/memory.js +0 -130
- package/dist/source/adapters/prisma.d.ts +0 -63
- package/dist/source/adapters/prisma.js +0 -202
- package/dist/source/conformance.d.ts +0 -37
- package/dist/source/conformance.js +0 -215
- package/dist/source/connector.d.ts +0 -95
- package/dist/source/connector.js +0 -266
- package/dist/source/connectorProtocol.d.ts +0 -154
- package/dist/source/connectorProtocol.js +0 -163
- package/dist/source/contract.d.ts +0 -195
- package/dist/source/contract.js +0 -164
- package/dist/source/factory.d.ts +0 -92
- package/dist/source/factory.js +0 -286
- package/dist/source/footprint.d.ts +0 -111
- package/dist/source/footprint.js +0 -0
- package/dist/source/idempotency.d.ts +0 -61
- package/dist/source/idempotency.js +0 -144
- package/dist/source/index.d.ts +0 -23
- package/dist/source/index.js +0 -30
- package/dist/source/migrations.d.ts +0 -21
- package/dist/source/migrations.js +0 -103
- package/dist/source/next.d.ts +0 -32
- package/dist/source/next.js +0 -25
- package/dist/source/pushQueue.d.ts +0 -134
- package/dist/source/pushQueue.js +0 -256
- package/dist/source/signing.d.ts +0 -92
- package/dist/source/signing.js +0 -162
- package/dist/source/types.d.ts +0 -401
- package/dist/source/types.js +0 -59
- package/dist/stores/ObjectStore.d.ts +0 -115
- package/dist/stores/ObjectStore.js +0 -393
- package/dist/stores/ObjectStoreContract.d.ts +0 -38
- package/dist/stores/ObjectStoreContract.js +0 -1
- package/dist/stores/SyncActionStore.d.ts +0 -97
- package/dist/stores/SyncActionStore.js +0 -504
- package/dist/stores/syncAction.d.ts +0 -26
- package/dist/stores/syncAction.js +0 -16
- package/dist/surface.d.ts +0 -36
- package/dist/surface.js +0 -75
- package/dist/sync/BootstrapFetcher.d.ts +0 -280
- package/dist/sync/BootstrapFetcher.js +0 -962
- package/dist/sync/ConnectionManager.d.ts +0 -8
- package/dist/sync/ConnectionManager.js +0 -8
- package/dist/sync/OnDemandLoader.d.ts +0 -228
- package/dist/sync/OnDemandLoader.js +0 -742
- package/dist/sync/SubscriptionManager.d.ts +0 -159
- package/dist/sync/SubscriptionManager.js +0 -243
- package/dist/sync/SyncWebSocket.d.ts +0 -173
- package/dist/sync/SyncWebSocket.js +0 -438
- package/dist/sync/awaitClaimGrant.d.ts +0 -6
- package/dist/sync/awaitClaimGrant.js +0 -6
- package/dist/sync/bootstrapApply.d.ts +0 -70
- package/dist/sync/bootstrapApply.js +0 -73
- package/dist/sync/commitFrames.d.ts +0 -8
- package/dist/sync/commitFrames.js +0 -8
- package/dist/sync/contextPorts.d.ts +0 -18
- package/dist/sync/contextPorts.js +0 -31
- package/dist/sync/createClaimStream.d.ts +0 -7
- package/dist/sync/createClaimStream.js +0 -7
- package/dist/sync/createPresenceStream.d.ts +0 -69
- package/dist/sync/createPresenceStream.js +0 -200
- package/dist/sync/createSnapshot.d.ts +0 -29
- package/dist/sync/createSnapshot.js +0 -118
- package/dist/sync/credentialLifecycle.d.ts +0 -7
- package/dist/sync/credentialLifecycle.js +0 -7
- package/dist/sync/deltaPipeline.d.ts +0 -113
- package/dist/sync/deltaPipeline.js +0 -261
- package/dist/sync/groupChange.d.ts +0 -113
- package/dist/sync/groupChange.js +0 -242
- package/dist/sync/participants.d.ts +0 -115
- package/dist/sync/participants.js +0 -344
- package/dist/sync/persistedPrefix.d.ts +0 -12
- package/dist/sync/persistedPrefix.js +0 -22
- package/dist/sync/schemaDrift.d.ts +0 -55
- package/dist/sync/schemaDrift.js +0 -53
- package/dist/sync/schemas.d.ts +0 -70
- package/dist/sync/schemas.js +0 -94
- package/dist/sync/syncCursor.d.ts +0 -40
- package/dist/sync/syncCursor.js +0 -55
- package/dist/sync/syncPlan.d.ts +0 -54
- package/dist/sync/syncPlan.js +0 -50
- package/dist/sync/wsFrameHandlers.d.ts +0 -8
- package/dist/sync/wsFrameHandlers.js +0 -8
- package/dist/testing/fixtures/bootstrap.d.ts +0 -49
- package/dist/testing/fixtures/bootstrap.js +0 -59
- package/dist/testing/fixtures/deltas.d.ts +0 -83
- package/dist/testing/fixtures/deltas.js +0 -136
- package/dist/testing/fixtures/httpResponses.d.ts +0 -70
- package/dist/testing/fixtures/httpResponses.js +0 -90
- package/dist/testing/fixtures/models.d.ts +0 -83
- package/dist/testing/fixtures/models.js +0 -272
- package/dist/testing/helpers/reactWrapper.d.ts +0 -69
- package/dist/testing/helpers/reactWrapper.js +0 -67
- package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
- package/dist/testing/helpers/syncEngineHarness.js +0 -73
- package/dist/testing/helpers/wait.d.ts +0 -30
- package/dist/testing/helpers/wait.js +0 -49
- package/dist/testing/index.d.ts +0 -23
- package/dist/testing/index.js +0 -33
- package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
- package/dist/testing/mocks/FakeDatabase.js +0 -10
- package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
- package/dist/testing/mocks/MockMutationExecutor.js +0 -186
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
- package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
- package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
- package/dist/testing/mocks/MockSyncContext.js +0 -72
- package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
- package/dist/testing/mocks/MockSyncStore.js +0 -171
- package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
- package/dist/testing/mocks/MockWebSocket.js +0 -118
- package/dist/transaction/ablo.d.ts +0 -88
- package/dist/transaction/ablo.js +0 -33
- package/dist/transaction/auth/apiKey.d.ts +0 -152
- package/dist/transaction/auth/apiKey.js +0 -419
- package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
- package/dist/transaction/auth/bootstrapScope.js +0 -1
- package/dist/transaction/auth/capability.d.ts +0 -177
- package/dist/transaction/auth/capability.js +0 -199
- package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
- package/dist/transaction/auth/credentialEndpoint.js +0 -86
- package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
- package/dist/transaction/auth/credentialPolicy.js +0 -125
- package/dist/transaction/auth/credentialSource.d.ts +0 -30
- package/dist/transaction/auth/credentialSource.js +0 -55
- package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
- package/dist/transaction/auth/hostedEndpoints.js +0 -21
- package/dist/transaction/auth/identity.d.ts +0 -55
- package/dist/transaction/auth/identity.js +0 -210
- package/dist/transaction/auth/index.d.ts +0 -162
- package/dist/transaction/auth/index.js +0 -304
- package/dist/transaction/auth/schemas.d.ts +0 -59
- package/dist/transaction/auth/schemas.js +0 -85
- package/dist/transaction/auth/sessionMint.d.ts +0 -28
- package/dist/transaction/auth/sessionMint.js +0 -85
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -49
- package/dist/transaction/coordination/awaitClaimGrant.js +0 -112
- package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -50
- package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -88
- package/dist/transaction/coordination/claimMeta.d.ts +0 -49
- package/dist/transaction/coordination/claimMeta.js +0 -52
- package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
- package/dist/transaction/coordination/createClaimStream.js +0 -475
- package/dist/transaction/coordination/events.d.ts +0 -74
- package/dist/transaction/coordination/events.js +0 -7
- package/dist/transaction/coordination/index.d.ts +0 -19
- package/dist/transaction/coordination/index.js +0 -44
- package/dist/transaction/coordination/locator.d.ts +0 -83
- package/dist/transaction/coordination/locator.js +0 -82
- package/dist/transaction/coordination/schema.d.ts +0 -1473
- package/dist/transaction/coordination/schema.js +0 -1013
- package/dist/transaction/coordination/targetConflict.d.ts +0 -2
- package/dist/transaction/coordination/targetConflict.js +0 -103
- package/dist/transaction/coordination/trace.d.ts +0 -78
- package/dist/transaction/coordination/trace.js +0 -138
- package/dist/transaction/durableWrites.d.ts +0 -62
- package/dist/transaction/durableWrites.js +0 -71
- package/dist/transaction/environment.d.ts +0 -105
- package/dist/transaction/environment.js +0 -108
- package/dist/transaction/errorCodes.d.ts +0 -403
- package/dist/transaction/errorCodes.js +0 -480
- package/dist/transaction/errors.d.ts +0 -428
- package/dist/transaction/errors.js +0 -686
- package/dist/transaction/index.d.ts +0 -20
- package/dist/transaction/index.js +0 -20
- package/dist/transaction/keys/index.d.ts +0 -87
- package/dist/transaction/keys/index.js +0 -207
- package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
- package/dist/transaction/log/syncDeltaRow.js +0 -95
- package/dist/transaction/logPosition.d.ts +0 -97
- package/dist/transaction/logPosition.js +0 -125
- package/dist/transaction/logger.d.ts +0 -16
- package/dist/transaction/logger.js +0 -7
- package/dist/transaction/observability.d.ts +0 -53
- package/dist/transaction/observability.js +0 -19
- package/dist/transaction/persistence.d.ts +0 -12
- package/dist/transaction/persistence.js +0 -11
- package/dist/transaction/plugin.d.ts +0 -192
- package/dist/transaction/plugin.js +0 -87
- package/dist/transaction/policy/types.d.ts +0 -217
- package/dist/transaction/policy/types.js +0 -126
- package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
- package/dist/transaction/resources/functionalUpdate.js +0 -87
- package/dist/transaction/resources/httpResources.d.ts +0 -266
- package/dist/transaction/resources/httpResources.js +0 -7
- package/dist/transaction/resources/modelOperations.d.ts +0 -319
- package/dist/transaction/resources/modelOperations.js +0 -12
- package/dist/transaction/resources/mutationOptions.d.ts +0 -66
- package/dist/transaction/resources/mutationOptions.js +0 -9
- package/dist/transaction/resources/where.d.ts +0 -85
- package/dist/transaction/resources/where.js +0 -70
- package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
- package/dist/transaction/resources/writeOptionsSchema.js +0 -73
- package/dist/transaction/schema/field.d.ts +0 -126
- package/dist/transaction/schema/field.js +0 -265
- package/dist/transaction/schema/loadStrategy.d.ts +0 -45
- package/dist/transaction/schema/loadStrategy.js +0 -46
- package/dist/transaction/schema/model.d.ts +0 -379
- package/dist/transaction/schema/model.js +0 -123
- package/dist/transaction/schema/openapi.d.ts +0 -57
- package/dist/transaction/schema/openapi.js +0 -340
- package/dist/transaction/schema/relation.d.ts +0 -199
- package/dist/transaction/schema/relation.js +0 -104
- package/dist/transaction/schema/residency.d.ts +0 -29
- package/dist/transaction/schema/residency.js +0 -25
- package/dist/transaction/schema/roles.d.ts +0 -249
- package/dist/transaction/schema/roles.js +0 -230
- package/dist/transaction/schema/schema.d.ts +0 -324
- package/dist/transaction/schema/schema.js +0 -305
- package/dist/transaction/schema/tenancy.d.ts +0 -139
- package/dist/transaction/schema/tenancy.js +0 -190
- package/dist/transaction/transactionLayer.d.ts +0 -82
- package/dist/transaction/transactionLayer.js +0 -24
- package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
- package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
- package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
- package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
- package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
- package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
- package/dist/transaction/transport/commitFrames.d.ts +0 -90
- package/dist/transaction/transport/commitFrames.js +0 -134
- package/dist/transaction/transport/connectionManager.d.ts +0 -215
- package/dist/transaction/transport/connectionManager.js +0 -673
- package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
- package/dist/transaction/transport/credentialLifecycle.js +0 -324
- package/dist/transaction/transport/heartbeat.d.ts +0 -65
- package/dist/transaction/transport/heartbeat.js +0 -93
- package/dist/transaction/transport/httpClient.d.ts +0 -123
- package/dist/transaction/transport/httpClient.js +0 -145
- package/dist/transaction/transport/httpOptions.d.ts +0 -33
- package/dist/transaction/transport/httpOptions.js +0 -12
- package/dist/transaction/transport/httpTransport.d.ts +0 -8
- package/dist/transaction/transport/httpTransport.js +0 -1276
- package/dist/transaction/transport/networkProbe.d.ts +0 -84
- package/dist/transaction/transport/networkProbe.js +0 -207
- package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
- package/dist/transaction/transport/wsFrameHandlers.js +0 -429
- package/dist/transaction/transport/wsTransport.d.ts +0 -576
- package/dist/transaction/transport/wsTransport.js +0 -1017
- package/dist/transaction/types/assertExact.d.ts +0 -17
- package/dist/transaction/types/assertExact.js +0 -1
- package/dist/transaction/types/global.d.ts +0 -107
- package/dist/transaction/types/global.js +0 -40
- package/dist/transaction/types/index.d.ts +0 -205
- package/dist/transaction/types/index.js +0 -56
- package/dist/transaction/types/modelData.d.ts +0 -10
- package/dist/transaction/types/modelData.js +0 -9
- package/dist/transaction/types/participant.d.ts +0 -20
- package/dist/transaction/types/participant.js +0 -10
- package/dist/transaction/types/streams.d.ts +0 -540
- package/dist/transaction/types/streams.js +0 -11
- package/dist/transaction/utils/asyncIterator.d.ts +0 -34
- package/dist/transaction/utils/asyncIterator.js +0 -135
- package/dist/transaction/utils/duration.d.ts +0 -25
- package/dist/transaction/utils/duration.js +0 -45
- package/dist/transaction/utils/json.d.ts +0 -57
- package/dist/transaction/utils/json.js +0 -276
- package/dist/transaction/wire/accountResponses.d.ts +0 -351
- package/dist/transaction/wire/accountResponses.js +0 -255
- package/dist/transaction/wire/auth.d.ts +0 -49
- package/dist/transaction/wire/auth.js +0 -57
- package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
- package/dist/transaction/wire/bootstrapReason.js +0 -8
- package/dist/transaction/wire/claimEvent.d.ts +0 -76
- package/dist/transaction/wire/claimEvent.js +0 -73
- package/dist/transaction/wire/claims.d.ts +0 -463
- package/dist/transaction/wire/claims.js +0 -229
- package/dist/transaction/wire/commit.d.ts +0 -603
- package/dist/transaction/wire/commit.js +0 -321
- package/dist/transaction/wire/delta.d.ts +0 -250
- package/dist/transaction/wire/delta.js +0 -147
- package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
- package/dist/transaction/wire/errorEnvelope.js +0 -123
- package/dist/transaction/wire/feedCursor.d.ts +0 -60
- package/dist/transaction/wire/feedCursor.js +0 -82
- package/dist/transaction/wire/feedEvent.d.ts +0 -177
- package/dist/transaction/wire/feedEvent.js +0 -39
- package/dist/transaction/wire/frames.d.ts +0 -194
- package/dist/transaction/wire/frames.js +0 -50
- package/dist/transaction/wire/inboundFrames.d.ts +0 -552
- package/dist/transaction/wire/inboundFrames.js +0 -116
- package/dist/transaction/wire/index.d.ts +0 -50
- package/dist/transaction/wire/index.js +0 -74
- package/dist/transaction/wire/listEnvelope.d.ts +0 -37
- package/dist/transaction/wire/listEnvelope.js +0 -42
- package/dist/transaction/wire/modelResponses.d.ts +0 -85
- package/dist/transaction/wire/modelResponses.js +0 -43
- package/dist/transaction/wire/protocol.d.ts +0 -38
- package/dist/transaction/wire/protocol.js +0 -38
- package/dist/transaction/wire/protocolVersion.d.ts +0 -73
- package/dist/transaction/wire/protocolVersion.js +0 -83
- package/dist/transactions/mutations/MutationQueue.d.ts +0 -655
- package/dist/transactions/mutations/MutationQueue.js +0 -2797
- package/dist/transactions/mutations/MutationStore.d.ts +0 -20
- package/dist/transactions/mutations/MutationStore.js +0 -53
- package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
- package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
- package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
- package/dist/transactions/mutations/coalesceRules.js +0 -140
- package/dist/transactions/mutations/commitLatency.d.ts +0 -52
- package/dist/transactions/mutations/commitLatency.js +0 -130
- package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
- package/dist/transactions/mutations/commitOutboxStore.js +0 -26
- package/dist/transactions/mutations/commitPayload.d.ts +0 -164
- package/dist/transactions/mutations/commitPayload.js +0 -152
- package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -59
- package/dist/transactions/mutations/deltaConfirmation.js +0 -233
- package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
- package/dist/transactions/mutations/durableWriteStore.js +0 -12
- package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
- package/dist/transactions/mutations/optimisticApply.js +0 -65
- package/dist/transactions/mutations/replayValidation.d.ts +0 -186
- package/dist/transactions/mutations/replayValidation.js +0 -163
- package/dist/utils/mobxSetup.d.ts +0 -53
- package/dist/utils/mobxSetup.js +0 -330
- package/dist/webhooks/events.d.ts +0 -43
- package/dist/webhooks/events.js +0 -42
- package/dist/webhooks/index.d.ts +0 -8
- package/dist/webhooks/index.js +0 -8
- package/dist/wire/index.d.ts +0 -1
- package/dist/wire/index.js +0 -8
- package/docs/interaction-model.md +0 -99
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Builds the outgoing frames the sync WebSocket sends on the commit path, and
|
|
3
|
-
* provides the single place claim events are traced. These are stateless
|
|
4
|
-
* helpers that hold no socket state, so both the transport and its frame
|
|
5
|
-
* dispatch can share them.
|
|
6
|
-
*/
|
|
7
|
-
import { claimEventReasonSchema, staleNotificationSchema, } from '../coordination/schema.js';
|
|
8
|
-
import { formatClaim } from '../coordination/trace.js';
|
|
9
|
-
import { modelTarget } from '../coordination/locator.js';
|
|
10
|
-
/**
|
|
11
|
-
* Converts the client's list of {@link CommitFrameOperation} values into the wire
|
|
12
|
-
* {@link CommitMessage} the server accepts. This is the one place the loosely
|
|
13
|
-
* typed operation — its `type` is a string, and it carries client-only
|
|
14
|
-
* `options` the server never reads — becomes the strict wire contract. Mapping
|
|
15
|
-
* each field by hand means a change to {@link WireCommitOperation} fails to compile
|
|
16
|
-
* here; the single `as` cast narrows the validated `type` to the wire union and
|
|
17
|
-
* is the only place that loosening happens.
|
|
18
|
-
*/
|
|
19
|
-
export function buildCommitFrame(operations, clientTxId, reads, track) {
|
|
20
|
-
const payload = {
|
|
21
|
-
operations: operations.map((op) => ({
|
|
22
|
-
type: op.type,
|
|
23
|
-
model: op.model,
|
|
24
|
-
id: op.id,
|
|
25
|
-
input: op.input,
|
|
26
|
-
transactionId: op.transactionId,
|
|
27
|
-
readAt: op.readAt,
|
|
28
|
-
onStale: op.onStale,
|
|
29
|
-
fenceToken: op.fenceToken,
|
|
30
|
-
})),
|
|
31
|
-
clientTxId,
|
|
32
|
-
};
|
|
33
|
-
// The batch premise: the rows or groups the writer read before committing.
|
|
34
|
-
if (reads && reads.length > 0)
|
|
35
|
-
payload.reads = [...reads];
|
|
36
|
-
// Durable premises the writer is registering: the rows or groups it
|
|
37
|
-
// wants to keep hearing about after this commit, delivered on a future receipt.
|
|
38
|
-
if (track && track.length > 0)
|
|
39
|
-
payload.track = [...track];
|
|
40
|
-
return { type: 'commit', payload };
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Defensively validate the optional `notifications` array off a commit ack.
|
|
44
|
-
* Untrusted wire data — a malformed entry is dropped rather than throwing,
|
|
45
|
-
* so a bad notification never sinks an otherwise-successful commit.
|
|
46
|
-
*/
|
|
47
|
-
export function parseNotifications(raw) {
|
|
48
|
-
if (!Array.isArray(raw) || raw.length === 0)
|
|
49
|
-
return undefined;
|
|
50
|
-
const out = [];
|
|
51
|
-
for (const entry of raw) {
|
|
52
|
-
const parsed = staleNotificationSchema.safeParse(entry);
|
|
53
|
-
if (parsed.success)
|
|
54
|
-
out.push(parsed.data);
|
|
55
|
-
}
|
|
56
|
-
return out.length > 0 ? out : undefined;
|
|
57
|
-
}
|
|
58
|
-
// The phases this map covers and the phases a ClaimEvent can report are the
|
|
59
|
-
// same set. Adding one to either without the other stops compiling here.
|
|
60
|
-
const _phaseCoverage = true;
|
|
61
|
-
void _phaseCoverage;
|
|
62
|
-
/**
|
|
63
|
-
* The single place claim events are traced. Every `claim_*` frame passes
|
|
64
|
-
* through here, so a developer debugging a collision gets one consistent record
|
|
65
|
-
* — a console line and a structured capture — without each frame case
|
|
66
|
-
* re-deriving the row and holder shape.
|
|
67
|
-
*
|
|
68
|
-
* The payload arrives already validated against its frame's schema, so this
|
|
69
|
-
* reads it as the shape it is rather than re-narrowing an untyped record. That
|
|
70
|
-
* distinction is not cosmetic: while this took `Record<string, unknown>` it
|
|
71
|
-
* read `actor`, `participantKind`, and `description` off frames that carry none
|
|
72
|
-
* of them, and every one of those reads silently produced `undefined` because a
|
|
73
|
-
* string key never has to exist.
|
|
74
|
-
*/
|
|
75
|
-
export function recordClaim(ports, phase, payload) {
|
|
76
|
-
// Widened so the members can be told apart with `in`. The parameter above
|
|
77
|
-
// stays correlated to `phase`, which is what the widening cannot undo.
|
|
78
|
-
const frame = payload;
|
|
79
|
-
const target = 'target' in frame ? frame.target : undefined;
|
|
80
|
-
// The holder rides on the rejection and queued frames, with a summary of
|
|
81
|
-
// their claim beside it. Collecting it is the whole of "name the
|
|
82
|
-
// counterparty" — the wire has carried it all along and this projection used
|
|
83
|
-
// to flatten it into one string alongside the cause.
|
|
84
|
-
const counterparty = {
|
|
85
|
-
...('heldBy' in frame && frame.heldBy !== undefined
|
|
86
|
-
? { actor: frame.heldBy }
|
|
87
|
-
: {}),
|
|
88
|
-
...('heldByKind' in frame && frame.heldByKind !== undefined
|
|
89
|
-
? { participantKind: frame.heldByKind }
|
|
90
|
-
: {}),
|
|
91
|
-
...('heldByClaimId' in frame && frame.heldByClaimId !== undefined
|
|
92
|
-
? { claimId: frame.heldByClaimId }
|
|
93
|
-
: {}),
|
|
94
|
-
...('heldByExpiresAt' in frame && frame.heldByExpiresAt !== undefined
|
|
95
|
-
? { expiresAt: frame.heldByExpiresAt }
|
|
96
|
-
: {}),
|
|
97
|
-
...('heldByClaim' in frame && frame.heldByClaim?.description !== undefined
|
|
98
|
-
? { description: frame.heldByClaim.description }
|
|
99
|
-
: {}),
|
|
100
|
-
};
|
|
101
|
-
// `reason` is a plain string on the wire, which is frozen, so an older server
|
|
102
|
-
// may send a word the closed set does not list. One that parses becomes the
|
|
103
|
-
// typed reason; one that does not is absent rather than passed off as prose.
|
|
104
|
-
const parsedReason = 'reason' in frame ? claimEventReasonSchema.safeParse(frame.reason) : undefined;
|
|
105
|
-
const event = {
|
|
106
|
-
phase,
|
|
107
|
-
claimId: frame.claimId,
|
|
108
|
-
...(target ? modelTarget(target) : {}),
|
|
109
|
-
...(target?.field !== undefined ? { field: target.field } : {}),
|
|
110
|
-
// No claim frame names an actor of its own; the only participant one
|
|
111
|
-
// carries is the holder that blocked it.
|
|
112
|
-
...('heldBy' in frame && frame.heldBy !== undefined
|
|
113
|
-
? { actor: frame.heldBy }
|
|
114
|
-
: {}),
|
|
115
|
-
...('position' in frame ? { position: frame.position } : {}),
|
|
116
|
-
...(parsedReason?.success ? { reason: parsedReason.data } : {}),
|
|
117
|
-
...('policyReason' in frame && frame.policyReason !== undefined
|
|
118
|
-
? { policyReason: frame.policyReason }
|
|
119
|
-
: {}),
|
|
120
|
-
...(Object.keys(counterparty).length > 0 ? { heldBy: counterparty } : {}),
|
|
121
|
-
};
|
|
122
|
-
const message = formatClaim(event);
|
|
123
|
-
// A rejection or lost lease is the collision a developer is actively
|
|
124
|
-
// debugging → warn (shows at the default log level). The routine events
|
|
125
|
-
// (acquired/queued/granted/expired) are debug-only so they never drown the
|
|
126
|
-
// console until you opt in with `new Ablo({ debug: true })`.
|
|
127
|
-
const isCollision = phase === 'rejected' || phase === 'lost';
|
|
128
|
-
if (isCollision)
|
|
129
|
-
ports.logger.warn(message);
|
|
130
|
-
else
|
|
131
|
-
ports.logger.debug(message);
|
|
132
|
-
ports.observability.breadcrumb(message, 'sync.coordination', isCollision ? 'warning' : 'info');
|
|
133
|
-
ports.observability.captureClaim(event);
|
|
134
|
-
}
|
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Owns the sync engine's connection lifecycle: the state machine that carries a
|
|
3
|
-
* client from a healthy connection, through a dropout, and back to live. It
|
|
4
|
-
* watches the browser's online/offline and visibility events, probes real
|
|
5
|
-
* connectivity and session validity with {@link probeNetwork}, applies retry
|
|
6
|
-
* backoff with a ceiling and jitter, and runs a watchdog for the cases where
|
|
7
|
-
* the browser never fires an event (VPN flips, captive portals). When it
|
|
8
|
-
* decides to recover, it drives the reconnect sequence — bootstrap, then
|
|
9
|
-
* WebSocket connect — through the {@link ConnectionCallbacks.onReconnect}
|
|
10
|
-
* callback and reacts to the outcome.
|
|
11
|
-
*
|
|
12
|
-
* It deliberately does not perform the bootstrap, local-storage, or object-pool
|
|
13
|
-
* work itself; that lives in the embedding store, which the manager reaches
|
|
14
|
-
* only through its callbacks. One manager is created per store, started on the
|
|
15
|
-
* first successful connect and disposed on teardown.
|
|
16
|
-
*
|
|
17
|
-
* This is a plain state machine, not a reactive object: it lives in the
|
|
18
|
-
* settlement core, which carries no reactivity runtime (ADR 0016). A consumer
|
|
19
|
-
* that wants to render recovery progress mirrors the transitions through
|
|
20
|
-
* {@link ConnectionCallbacks.onStateChange} into its own observable state —
|
|
21
|
-
* which is what the reactive engine's store does.
|
|
22
|
-
*
|
|
23
|
-
* CONNECTED ──(socket drop)──► PROBING_NETWORK ──► RECONNECTING ──► CONNECTED
|
|
24
|
-
* │ │ │
|
|
25
|
-
* (network lost) ▼ ▼
|
|
26
|
-
* ▼ SESSION_EXPIRED BACKOFF ──► PROBING_NETWORK
|
|
27
|
-
* OFFLINE ──(online)──► PROBING_NETWORK
|
|
28
|
-
* │
|
|
29
|
-
* ▼
|
|
30
|
-
* WAITING_FOR_NETWORK
|
|
31
|
-
*
|
|
32
|
-
* Three behaviors are worth calling out. A network return or tab focus during a
|
|
33
|
-
* backoff delay jumps straight to probing instead of waiting out the full
|
|
34
|
-
* interval. Reaching the retry ceiling while the browser reports offline parks
|
|
35
|
-
* in `waiting_for_network` rather than hard-reloading a browser that has no
|
|
36
|
-
* network. And a socket drop (close code 1006) goes straight to probing rather
|
|
37
|
-
* than the passive `offline` state — 1006 is generated locally and carries no
|
|
38
|
-
* connectivity signal, so on a healthy machine no online/offline event ever
|
|
39
|
-
* fires; only a genuine operating-system network loss parks in `offline` to
|
|
40
|
-
* wait for the `online` event.
|
|
41
|
-
*/
|
|
42
|
-
import { type ProbeResult } from './networkProbe.js';
|
|
43
|
-
import type { AuthTokenGetter } from '../auth/credentialSource.js';
|
|
44
|
-
import type { CredentialRefreshOutcome } from './credentialLifecycle.js';
|
|
45
|
-
import { type Logger } from '../logger.js';
|
|
46
|
-
import { type TransportObservability } from '../observability.js';
|
|
47
|
-
export type ConnectionState = 'connected' | 'offline' | 'probing_network' | 'validating_session' | 'refreshing_credential' | 'reconnecting' | 'backoff' | 'waiting_for_network' | 'auth_blocked' | 'session_expired';
|
|
48
|
-
export type ConnectionEvent = {
|
|
49
|
-
type: 'NETWORK_LOST';
|
|
50
|
-
} | {
|
|
51
|
-
type: 'NETWORK_ONLINE';
|
|
52
|
-
} | {
|
|
53
|
-
type: 'TAB_VISIBLE';
|
|
54
|
-
} | {
|
|
55
|
-
type: 'WS_CONNECTED';
|
|
56
|
-
} | {
|
|
57
|
-
type: 'WS_DISCONNECTED';
|
|
58
|
-
} | {
|
|
59
|
-
type: 'WS_SESSION_ERROR';
|
|
60
|
-
} | {
|
|
61
|
-
type: 'WS_HANDSHAKE_FAILED';
|
|
62
|
-
} | {
|
|
63
|
-
type: 'PROBE_SUCCESS';
|
|
64
|
-
sessionValid: boolean;
|
|
65
|
-
} | {
|
|
66
|
-
type: 'PROBE_AUTH_BLOCKED';
|
|
67
|
-
}
|
|
68
|
-
/** The probe saw an expired ephemeral access key (`access_credential_expiry`).
|
|
69
|
-
* Recoverable: re-mint a fresh `ek_`/`rk_` and re-probe — never a sign-out. */
|
|
70
|
-
| {
|
|
71
|
-
type: 'PROBE_CREDENTIAL_STALE';
|
|
72
|
-
} | {
|
|
73
|
-
type: 'PROBE_FAILED';
|
|
74
|
-
}
|
|
75
|
-
/** A fresh access credential is available (the re-mint succeeded, or one was
|
|
76
|
-
* pushed in via `setAuthToken`). Re-probe so a parked connection picks it up. */
|
|
77
|
-
| {
|
|
78
|
-
type: 'CREDENTIAL_REFRESHED';
|
|
79
|
-
} | {
|
|
80
|
-
type: 'RECONNECT_SUCCESS';
|
|
81
|
-
} | {
|
|
82
|
-
type: 'RECONNECT_FAILED';
|
|
83
|
-
} | {
|
|
84
|
-
type: 'BACKOFF_ELAPSED';
|
|
85
|
-
} | {
|
|
86
|
-
type: 'BOOTSTRAP_FAILED_SESSION';
|
|
87
|
-
} | {
|
|
88
|
-
type: 'MANUAL_RETRY';
|
|
89
|
-
};
|
|
90
|
-
export interface ConnectionCallbacks {
|
|
91
|
-
/** Run bootstrap + WebSocket reconnect. Returns the outcome. */
|
|
92
|
-
onReconnect: () => Promise<'success' | 'session_error' | 'network_error'>;
|
|
93
|
-
/**
|
|
94
|
-
* Re-mints the short-lived access credential (the `ek_`/`rk_`) and pushes it
|
|
95
|
-
* into the credential source, then reports the outcome. Invoked in the
|
|
96
|
-
* `refreshing_credential` state — that is, when a probe found the access key
|
|
97
|
-
* stale (`PROBE_CREDENTIAL_STALE`). The three outcomes map onto recovery:
|
|
98
|
-
* - `'refreshed'` → a fresh credential is in place; re-probe and reconnect.
|
|
99
|
-
* - `'session_error'` → the long-lived login itself is gone (the mint
|
|
100
|
-
* returned null, a 401/403); terminal, so sign out.
|
|
101
|
-
* - `'network_error'` → the mint endpoint was unreachable (offline, 5xx, or
|
|
102
|
-
* a throw); transient, so back off and retry rather
|
|
103
|
-
* than sign out.
|
|
104
|
-
* Optional: a deployment with no re-mint path (for example a static `apiKey`)
|
|
105
|
-
* omits it, and the state machine falls back to a plain re-probe.
|
|
106
|
-
*/
|
|
107
|
-
onRefreshCredential?: () => Promise<CredentialRefreshOutcome>;
|
|
108
|
-
/** Called when the session is confirmed expired — route to signin. */
|
|
109
|
-
onSessionExpired: () => void;
|
|
110
|
-
/** Called to tear down the WebSocket when entering a dead state. */
|
|
111
|
-
onDisconnectWebSocket: () => void;
|
|
112
|
-
/**
|
|
113
|
-
* Fires on every state transition. It lets the embedding store mirror
|
|
114
|
-
* recovery progress into its visible `syncStatus`, so the UI can show
|
|
115
|
-
* "Reconnecting…" instead of a sticky "offline" while the machine cycles
|
|
116
|
-
* through `probing_network` → `reconnecting` → `backoff`. Optional; when
|
|
117
|
-
* omitted, the state machine is simply opaque to the UI.
|
|
118
|
-
*/
|
|
119
|
-
onStateChange?: (next: ConnectionState, prev: ConnectionState) => void;
|
|
120
|
-
}
|
|
121
|
-
export interface ConnectionManagerOptions {
|
|
122
|
-
/**
|
|
123
|
-
* Sync-server base URL used for probes. Falls back to the env-based
|
|
124
|
-
* default of `probeNetwork`.
|
|
125
|
-
*/
|
|
126
|
-
baseUrl?: string;
|
|
127
|
-
/**
|
|
128
|
-
* Current bearer credential for authenticated probes. Read lazily so token
|
|
129
|
-
* refreshes pushed through `Ablo.setAuthToken()` are used by the next probe
|
|
130
|
-
* without recreating the manager.
|
|
131
|
-
*/
|
|
132
|
-
getAuthToken?: AuthTokenGetter;
|
|
133
|
-
/** Override retry ceilings / jitter. Production should leave defaults. */
|
|
134
|
-
backoff?: Partial<typeof DEFAULT_BACKOFF>;
|
|
135
|
-
/** Where transitions are logged. Defaults to silent. */
|
|
136
|
-
logger?: Logger;
|
|
137
|
-
/** Where dead-end states are reported. Defaults to silent. */
|
|
138
|
-
observability?: TransportObservability;
|
|
139
|
-
}
|
|
140
|
-
declare const DEFAULT_BACKOFF: {
|
|
141
|
-
readonly BASE_MS: 2000;
|
|
142
|
-
readonly MAX_MS: 30000;
|
|
143
|
-
readonly MAX_ATTEMPTS: 8;
|
|
144
|
-
readonly JITTER: 0.15;
|
|
145
|
-
};
|
|
146
|
-
export declare class ConnectionManager {
|
|
147
|
-
state: ConnectionState;
|
|
148
|
-
offlineSince: Date | null;
|
|
149
|
-
attempt: number;
|
|
150
|
-
lastProbeResult: ProbeResult | null;
|
|
151
|
-
private callbacks;
|
|
152
|
-
private backoffTimer;
|
|
153
|
-
private debounceTimer;
|
|
154
|
-
private watchdogTimer;
|
|
155
|
-
private stuckCycles;
|
|
156
|
-
/** Consecutive access-key re-mints in the current recovery cycle; reset on
|
|
157
|
-
* reaching `connected`. See {@link MAX_CREDENTIAL_REFRESH_ATTEMPTS}. */
|
|
158
|
-
private credentialRefreshAttempts;
|
|
159
|
-
private disposed;
|
|
160
|
-
private readonly baseUrl?;
|
|
161
|
-
private readonly getAuthToken?;
|
|
162
|
-
private readonly backoff;
|
|
163
|
-
private readonly logger;
|
|
164
|
-
private readonly observability;
|
|
165
|
-
private handleBrowserOnline;
|
|
166
|
-
private handleBrowserOffline;
|
|
167
|
-
private handleVisibilityChange;
|
|
168
|
-
constructor(options?: ConnectionManagerOptions);
|
|
169
|
-
start(callbacks: ConnectionCallbacks): void;
|
|
170
|
-
dispose(): void;
|
|
171
|
-
send(event: ConnectionEvent): void;
|
|
172
|
-
private transition;
|
|
173
|
-
private onEnterState;
|
|
174
|
-
/**
|
|
175
|
-
* FSM effects are fire-and-forget by design (`onEnterState` is sync). Each
|
|
176
|
-
* effect catches its own operational failures and maps them onto an FSM
|
|
177
|
-
* event, so a rejection here means the machine wedged mid-transition
|
|
178
|
-
* (`send()` or a transition listener threw) with no retry timer armed past
|
|
179
|
-
* it — capture it instead of losing the reconnect loop silently.
|
|
180
|
-
*/
|
|
181
|
-
private captureEffectFailure;
|
|
182
|
-
private runProbe;
|
|
183
|
-
/**
|
|
184
|
-
* Re-mint the short-lived access key on `refreshing_credential`. Delegates to
|
|
185
|
-
* the `onRefreshCredential` callback (which mints a fresh `ek_`/`rk_` from the
|
|
186
|
-
* still-valid login and pushes it into the credential source) and maps its
|
|
187
|
-
* tri-state outcome onto the FSM:
|
|
188
|
-
* - `refreshed` → `CREDENTIAL_REFRESHED` → re-probe & reconnect.
|
|
189
|
-
* - `session_error` → `BOOTSTRAP_FAILED_SESSION` → sign out (login is gone).
|
|
190
|
-
* - `network_error` → `RECONNECT_FAILED` → back off & retry (never sign out).
|
|
191
|
-
*
|
|
192
|
-
* A bounded attempt counter guards against a hot loop where the server keeps
|
|
193
|
-
* reporting the key stale even after a "successful" re-mint (e.g. a clock skew
|
|
194
|
-
* or a mint that returns an already-rejected key): after
|
|
195
|
-
* `MAX_CREDENTIAL_REFRESH_ATTEMPTS` we fall through to `auth_blocked` (stop,
|
|
196
|
-
* no sign-out) rather than spin. The counter resets once we reach `connected`.
|
|
197
|
-
*
|
|
198
|
-
* When no refresher is wired (e.g. a static `apiKey` deployment), we re-probe
|
|
199
|
-
* directly — the credential source's own scheduler owns refresh there.
|
|
200
|
-
*/
|
|
201
|
-
private runRefreshCredential;
|
|
202
|
-
private runReconnect;
|
|
203
|
-
private scheduleBackoff;
|
|
204
|
-
private setupBrowserListeners;
|
|
205
|
-
private removeBrowserListeners;
|
|
206
|
-
private startWatchdog;
|
|
207
|
-
get isConnected(): boolean;
|
|
208
|
-
get isOffline(): boolean;
|
|
209
|
-
get isReconnecting(): boolean;
|
|
210
|
-
get isSessionExpired(): boolean;
|
|
211
|
-
get offlineDuration(): string | null;
|
|
212
|
-
private clearBackoffTimer;
|
|
213
|
-
private clearDebounceTimer;
|
|
214
|
-
}
|
|
215
|
-
export {};
|