@abloatai/ablo 0.34.1 → 0.35.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 -1
- package/CHANGELOG.md +674 -5
- package/README.md +39 -22
- package/dist/BaseSyncedStore.d.ts +152 -44
- package/dist/BaseSyncedStore.js +300 -184
- package/dist/Database.d.ts +9 -24
- package/dist/Database.js +37 -22
- package/dist/InstanceCache.d.ts +25 -4
- package/dist/InstanceCache.js +48 -15
- package/dist/LazyReferenceCollection.d.ts +3 -3
- package/dist/LazyReferenceCollection.js +4 -4
- package/dist/Model.d.ts +6 -6
- package/dist/Model.js +10 -10
- package/dist/ModelRegistry.d.ts +4 -4
- package/dist/ModelRegistry.js +3 -3
- package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
- package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
- package/dist/SyncClient.d.ts +42 -32
- package/dist/SyncClient.js +166 -110
- package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
- package/dist/ai-sdk/coordinatedTool.js +1 -1
- package/dist/ai-sdk/coordinationContext.d.ts +2 -2
- package/dist/ai-sdk/coordinationContext.js +1 -1
- package/dist/ai-sdk/wrap.d.ts +3 -3
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/index.d.ts +1 -156
- package/dist/auth/index.js +8 -301
- package/dist/cli.cjs +3344 -1073
- package/dist/client/Ablo.d.ts +42 -287
- package/dist/client/Ablo.js +118 -963
- package/dist/client/abloClient.d.ts +309 -0
- package/dist/client/abloClient.js +13 -0
- package/dist/client/clientPrelude.d.ts +52 -0
- package/dist/client/clientPrelude.js +60 -0
- package/dist/client/consoleLogger.d.ts +2 -2
- package/dist/client/coreClient.d.ts +60 -0
- package/dist/client/coreClient.js +118 -0
- package/dist/client/createInternalComponents.d.ts +4 -4
- package/dist/client/createInternalComponents.js +9 -8
- package/dist/client/createModelProxy.d.ts +78 -373
- package/dist/client/createModelProxy.js +114 -86
- package/dist/client/humans.d.ts +48 -0
- package/dist/client/humans.js +52 -0
- package/dist/client/modelRegistration.d.ts +1 -1
- package/dist/client/modelRegistration.js +9 -9
- package/dist/client/options.d.ts +73 -17
- package/dist/client/reactiveEngine.d.ts +48 -0
- package/dist/client/reactiveEngine.js +910 -0
- package/dist/client/resourceTypes.d.ts +9 -250
- package/dist/client/resourceTypes.js +8 -5
- package/dist/client/schemaConfig.d.ts +4 -4
- package/dist/client/schemaConfig.js +6 -2
- package/dist/client/validateAbloOptions.d.ts +3 -2
- package/dist/client/validateAbloOptions.js +1 -1
- package/dist/client/wsMutationExecutor.d.ts +3 -3
- package/dist/client/wsMutationExecutor.js +3 -3
- package/dist/context.d.ts +9 -9
- package/dist/context.js +10 -9
- package/dist/coordination/ClaimLog.d.ts +26 -0
- package/dist/coordination/ClaimLog.js +32 -0
- package/dist/coordination/index.d.ts +1 -15
- package/dist/coordination/index.js +8 -31
- package/dist/core/DatabaseManager.js +1 -1
- package/dist/core/QueryView.d.ts +1 -1
- package/dist/core/QueryView.js +1 -1
- package/dist/core/StoreManager.d.ts +4 -23
- package/dist/core/StoreManager.js +5 -55
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js +2 -2
- package/dist/core/storeContract.d.ts +2 -2
- package/dist/docs/catalog.d.ts +72 -0
- package/dist/docs/catalog.js +227 -0
- package/dist/docs/index.d.ts +10 -0
- package/dist/docs/index.js +10 -0
- package/dist/environment.d.ts +1 -40
- package/dist/environment.js +8 -37
- package/dist/index.d.ts +40 -34
- package/dist/index.js +26 -20
- package/dist/interfaces/index.d.ts +44 -134
- package/dist/keys/index.d.ts +1 -77
- package/dist/keys/index.js +8 -190
- package/dist/mutators/{RecordingTransaction.d.ts → RecordingMutation.d.ts} +4 -4
- package/dist/mutators/{RecordingTransaction.js → RecordingMutation.js} +2 -2
- package/dist/mutators/Transaction.d.ts +1 -1
- package/dist/mutators/Transaction.js +1 -1
- package/dist/mutators/UndoManager.d.ts +6 -6
- package/dist/mutators/UndoManager.js +5 -5
- package/dist/mutators/defineMutators.d.ts +3 -3
- package/dist/mutators/defineMutators.js +1 -1
- package/dist/mutators/inverseOp.js +2 -2
- package/dist/mutators/mutateActions.d.ts +3 -3
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +1 -1
- package/dist/mutators/undoApply.d.ts +1 -1
- package/dist/mutators/undoApply.js +1 -1
- package/dist/policy/index.d.ts +2 -2
- package/dist/policy/index.js +1 -1
- package/dist/query/client.d.ts +2 -2
- package/dist/query/client.js +4 -4
- package/dist/query/types.d.ts +6 -41
- package/dist/query/types.js +2 -2
- package/dist/react/AbloProvider.d.ts +6 -8
- package/dist/react/AbloProvider.js +5 -7
- package/dist/react/context.d.ts +1 -1
- package/dist/react/context.js +1 -1
- package/dist/react/index.d.ts +5 -5
- package/dist/react/index.js +3 -3
- package/dist/react/internalContext.d.ts +1 -1
- package/dist/react/useAblo.d.ts +3 -3
- package/dist/react/useAblo.js +1 -1
- package/dist/react/useCurrentUserId.js +1 -1
- package/dist/react/useErrorListener.js +1 -1
- package/dist/react/useMutationFailureListener.d.ts +2 -2
- package/dist/react/useMutationFailureListener.js +1 -1
- package/dist/react/useMutators.d.ts +3 -3
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useUndoScope.d.ts +5 -5
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +69 -10
- package/dist/schema/coordination.js +86 -9
- package/dist/schema/ddl.js +2 -2
- package/dist/schema/diff.d.ts +1 -1
- package/dist/schema/generate.js +1 -1
- package/dist/schema/index.d.ts +10 -10
- package/dist/schema/index.js +18 -18
- package/dist/schema/queries.d.ts +27 -27
- package/dist/schema/queries.js +23 -23
- package/dist/schema/select.d.ts +3 -3
- package/dist/schema/select.js +3 -3
- package/dist/schema/serialize.d.ts +15 -6
- package/dist/schema/serialize.js +17 -3
- package/dist/schema/sugar.d.ts +6 -7
- package/dist/schema/sugar.js +9 -12
- package/dist/schema/syncDeltaRow.d.ts +4 -152
- package/dist/schema/syncDeltaRow.js +4 -105
- package/dist/server/adapter.d.ts +18 -1
- package/dist/server/commit.d.ts +10 -16
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +1 -1
- package/dist/source/adapters/drizzle.d.ts +1 -1
- package/dist/source/adapters/drizzle.js +2 -2
- package/dist/source/adapters/kysely.d.ts +1 -1
- package/dist/source/adapters/kysely.js +1 -1
- package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
- package/dist/source/adapters/kyselyMutationCore.js +2 -2
- package/dist/source/adapters/memory.js +1 -1
- package/dist/source/adapters/prisma.d.ts +8 -3
- package/dist/source/adapters/prisma.js +1 -1
- package/dist/source/connector.js +1 -1
- package/dist/source/connectorProtocol.d.ts +2 -8
- package/dist/source/connectorProtocol.js +3 -2
- package/dist/source/contract.d.ts +29 -17
- package/dist/source/contract.js +27 -22
- package/dist/source/factory.d.ts +1 -1
- package/dist/source/footprint.d.ts +111 -0
- package/dist/source/footprint.js +0 -0
- package/dist/source/idempotency.js +2 -2
- package/dist/source/index.d.ts +1 -0
- package/dist/source/index.js +3 -0
- package/dist/source/next.d.ts +1 -1
- package/dist/source/signing.d.ts +9 -2
- package/dist/source/signing.js +4 -1
- package/dist/source/types.d.ts +6 -4
- package/dist/source/types.js +1 -1
- package/dist/stores/ObjectStore.d.ts +1 -1
- package/dist/stores/SyncActionStore.d.ts +1 -1
- package/dist/stores/SyncActionStore.js +2 -10
- package/dist/stores/syncAction.d.ts +26 -0
- package/dist/stores/syncAction.js +16 -0
- package/dist/surface.d.ts +3 -3
- package/dist/surface.js +6 -4
- package/dist/sync/BootstrapFetcher.d.ts +123 -6
- package/dist/sync/BootstrapFetcher.js +492 -66
- package/dist/sync/ConnectionManager.d.ts +6 -198
- package/dist/sync/ConnectionManager.js +6 -677
- package/dist/sync/OnDemandLoader.d.ts +2 -2
- package/dist/sync/OnDemandLoader.js +60 -21
- package/dist/sync/SubscriptionManager.d.ts +13 -2
- package/dist/sync/SubscriptionManager.js +23 -5
- package/dist/sync/SyncWebSocket.d.ts +27 -510
- package/dist/sync/SyncWebSocket.js +76 -954
- package/dist/sync/awaitClaimGrant.d.ts +4 -44
- package/dist/sync/awaitClaimGrant.js +4 -109
- package/dist/sync/commitFrames.d.ts +6 -40
- package/dist/sync/commitFrames.js +6 -97
- package/dist/sync/contextPorts.d.ts +18 -0
- package/dist/sync/contextPorts.js +31 -0
- package/dist/sync/createClaimStream.d.ts +5 -49
- package/dist/sync/createClaimStream.js +5 -469
- package/dist/sync/createPresenceStream.d.ts +26 -4
- package/dist/sync/createPresenceStream.js +28 -20
- package/dist/sync/createSnapshot.d.ts +2 -2
- package/dist/sync/createSnapshot.js +1 -1
- package/dist/sync/credentialLifecycle.d.ts +5 -173
- package/dist/sync/credentialLifecycle.js +5 -320
- package/dist/sync/deltaPipeline.d.ts +1 -1
- package/dist/sync/participants.d.ts +5 -4
- package/dist/sync/participants.js +29 -22
- package/dist/sync/schemaDrift.d.ts +55 -0
- package/dist/sync/schemaDrift.js +53 -0
- package/dist/sync/schemas.d.ts +21 -32
- package/dist/sync/schemas.js +26 -17
- package/dist/sync/syncPlan.d.ts +3 -3
- package/dist/sync/wsFrameHandlers.d.ts +6 -114
- package/dist/sync/wsFrameHandlers.js +6 -392
- package/dist/testing/fixtures/bootstrap.d.ts +1 -1
- package/dist/testing/fixtures/deltas.d.ts +1 -1
- package/dist/testing/fixtures/httpResponses.d.ts +70 -0
- package/dist/testing/fixtures/httpResponses.js +90 -0
- package/dist/testing/fixtures/models.js +1 -1
- package/dist/testing/helpers/wait.js +1 -1
- package/dist/testing/mocks/MockMutationExecutor.d.ts +2 -2
- package/dist/testing/mocks/MockMutationExecutor.js +8 -14
- package/dist/testing/mocks/MockSyncContext.d.ts +11 -11
- package/dist/testing/mocks/MockSyncContext.js +10 -9
- package/dist/testing/mocks/MockSyncStore.js +1 -1
- package/dist/testing/mocks/MockWebSocket.d.ts +2 -2
- package/dist/transaction/ablo.d.ts +88 -0
- package/dist/transaction/ablo.js +33 -0
- package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
- package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
- package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
- package/dist/transaction/auth/bootstrapScope.js +1 -0
- package/dist/transaction/auth/capability.d.ts +177 -0
- package/dist/transaction/auth/capability.js +199 -0
- package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
- package/dist/{client → transaction/auth}/identity.d.ts +8 -7
- package/dist/{client → transaction/auth}/identity.js +1 -1
- package/dist/transaction/auth/index.d.ts +162 -0
- package/dist/transaction/auth/index.js +304 -0
- package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
- package/dist/{auth → transaction/auth}/schemas.js +13 -13
- package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
- package/dist/{client → transaction/auth}/sessionMint.js +4 -7
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +49 -0
- package/dist/transaction/coordination/awaitClaimGrant.js +112 -0
- package/dist/transaction/coordination/claimMeta.d.ts +49 -0
- package/dist/transaction/coordination/claimMeta.js +52 -0
- package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
- package/dist/transaction/coordination/createClaimStream.js +475 -0
- package/dist/transaction/coordination/events.d.ts +74 -0
- package/dist/transaction/coordination/events.js +7 -0
- package/dist/transaction/coordination/index.d.ts +19 -0
- package/dist/transaction/coordination/index.js +44 -0
- package/dist/transaction/coordination/locator.d.ts +83 -0
- package/dist/transaction/coordination/locator.js +82 -0
- package/dist/transaction/coordination/schema.d.ts +1473 -0
- package/dist/{coordination → transaction/coordination}/schema.js +490 -55
- package/dist/transaction/coordination/targetConflict.d.ts +2 -0
- package/dist/transaction/coordination/targetConflict.js +103 -0
- package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
- package/dist/{coordination → transaction/coordination}/trace.js +18 -25
- package/dist/transaction/durableWrites.d.ts +62 -0
- package/dist/{client → transaction}/durableWrites.js +28 -3
- package/dist/transaction/environment.d.ts +105 -0
- package/dist/transaction/environment.js +108 -0
- package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +11 -11
- package/dist/{errorCodes.js → transaction/errorCodes.js} +35 -12
- package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
- package/dist/{errors.js → transaction/errors.js} +85 -16
- package/dist/transaction/index.d.ts +20 -0
- package/dist/transaction/index.js +20 -0
- package/dist/transaction/keys/index.d.ts +87 -0
- package/dist/transaction/keys/index.js +207 -0
- package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
- package/dist/transaction/log/syncDeltaRow.js +95 -0
- package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
- package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
- package/dist/transaction/logger.d.ts +16 -0
- package/dist/transaction/logger.js +7 -0
- package/dist/transaction/observability.d.ts +53 -0
- package/dist/transaction/observability.js +19 -0
- package/dist/transaction/plugin.d.ts +192 -0
- package/dist/transaction/plugin.js +87 -0
- package/dist/{policy → transaction/policy}/types.d.ts +3 -3
- package/dist/{policy → transaction/policy}/types.js +2 -0
- package/dist/transaction/resources/httpResources.d.ts +266 -0
- package/dist/transaction/resources/httpResources.js +7 -0
- package/dist/transaction/resources/modelOperations.d.ts +319 -0
- package/dist/transaction/resources/modelOperations.js +12 -0
- package/dist/transaction/resources/mutationOptions.d.ts +66 -0
- package/dist/transaction/resources/mutationOptions.js +9 -0
- package/dist/transaction/resources/where.d.ts +85 -0
- package/dist/transaction/resources/where.js +70 -0
- package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
- package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
- package/dist/{schema → transaction/schema}/field.d.ts +5 -5
- package/dist/{schema → transaction/schema}/field.js +5 -5
- package/dist/transaction/schema/loadStrategy.d.ts +45 -0
- package/dist/transaction/schema/loadStrategy.js +46 -0
- package/dist/{schema → transaction/schema}/model.d.ts +50 -35
- package/dist/{schema → transaction/schema}/model.js +30 -20
- package/dist/transaction/schema/openapi.d.ts +57 -0
- package/dist/transaction/schema/openapi.js +340 -0
- package/dist/{schema → transaction/schema}/relation.d.ts +14 -14
- package/dist/{schema → transaction/schema}/relation.js +7 -7
- package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
- package/dist/{schema → transaction/schema}/residency.js +0 -5
- package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
- package/dist/{schema → transaction/schema}/roles.js +5 -5
- package/dist/{schema → transaction/schema}/schema.d.ts +12 -10
- package/dist/{schema → transaction/schema}/schema.js +4 -3
- package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
- package/dist/{schema → transaction/schema}/tenancy.js +7 -4
- package/dist/transaction/transactionLayer.d.ts +82 -0
- package/dist/transaction/transactionLayer.js +24 -0
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +4 -5
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
- package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +10 -36
- package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
- package/dist/transaction/transport/commitFrames.d.ts +90 -0
- package/dist/transaction/transport/commitFrames.js +134 -0
- package/dist/transaction/transport/connectionManager.d.ts +215 -0
- package/dist/transaction/transport/connectionManager.js +673 -0
- package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
- package/dist/transaction/transport/credentialLifecycle.js +324 -0
- package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
- package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
- package/dist/{client → transaction/transport}/httpClient.d.ts +59 -16
- package/dist/{client → transaction/transport}/httpClient.js +5 -5
- package/dist/transaction/transport/httpOptions.d.ts +33 -0
- package/dist/transaction/transport/httpOptions.js +12 -0
- package/dist/{client → transaction/transport}/httpTransport.js +171 -85
- package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
- package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
- package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
- package/dist/transaction/transport/wsFrameHandlers.js +429 -0
- package/dist/transaction/transport/wsTransport.d.ts +576 -0
- package/dist/transaction/transport/wsTransport.js +1017 -0
- package/dist/transaction/types/assertExact.d.ts +17 -0
- package/dist/transaction/types/assertExact.js +1 -0
- package/dist/{types → transaction/types}/global.d.ts +17 -2
- package/dist/{types → transaction/types}/global.js +2 -1
- package/dist/{types → transaction/types}/index.d.ts +14 -46
- package/dist/{types → transaction/types}/index.js +7 -16
- package/dist/{types → transaction/types}/streams.d.ts +63 -45
- package/dist/{utils → transaction/utils}/json.d.ts +18 -0
- package/dist/transaction/utils/json.js +276 -0
- package/dist/transaction/wire/accountResponses.d.ts +351 -0
- package/dist/transaction/wire/accountResponses.js +255 -0
- package/dist/transaction/wire/auth.d.ts +49 -0
- package/dist/transaction/wire/auth.js +57 -0
- package/dist/transaction/wire/claimEvent.d.ts +76 -0
- package/dist/transaction/wire/claimEvent.js +73 -0
- package/dist/transaction/wire/claims.d.ts +463 -0
- package/dist/transaction/wire/claims.js +229 -0
- package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
- package/dist/{wire → transaction/wire}/commit.js +68 -47
- package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
- package/dist/{wire → transaction/wire}/delta.js +37 -13
- package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
- package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
- package/dist/transaction/wire/feedCursor.d.ts +60 -0
- package/dist/transaction/wire/feedCursor.js +82 -0
- package/dist/transaction/wire/feedEvent.d.ts +177 -0
- package/dist/transaction/wire/feedEvent.js +39 -0
- package/dist/transaction/wire/frames.d.ts +194 -0
- package/dist/transaction/wire/frames.js +50 -0
- package/dist/transaction/wire/inboundFrames.d.ts +552 -0
- package/dist/transaction/wire/inboundFrames.js +116 -0
- package/dist/transaction/wire/index.d.ts +50 -0
- package/dist/transaction/wire/index.js +74 -0
- package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
- package/dist/transaction/wire/listEnvelope.js +42 -0
- package/dist/transaction/wire/modelResponses.d.ts +85 -0
- package/dist/transaction/wire/modelResponses.js +43 -0
- package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +79 -38
- package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +110 -59
- package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
- package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
- package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
- package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
- package/dist/transactions/mutations/commitLatency.d.ts +52 -0
- package/dist/transactions/mutations/commitLatency.js +130 -0
- package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
- package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
- package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +16 -15
- package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +12 -12
- package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +11 -11
- package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +7 -7
- package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
- package/dist/transactions/mutations/durableWriteStore.js +12 -0
- package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
- package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +3 -3
- package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +4 -3
- package/dist/utils/mobxSetup.d.ts +1 -1
- package/dist/utils/mobxSetup.js +5 -2
- package/dist/webhooks/events.d.ts +2 -2
- package/dist/wire/index.d.ts +1 -34
- package/dist/wire/index.js +8 -49
- package/docs/agent-messaging.md +3 -3
- package/docs/agents.md +19 -12
- package/docs/api-keys.md +8 -4
- package/docs/api.md +22 -18
- package/docs/audit.md +2 -0
- package/docs/cli.md +31 -3
- package/docs/client-behavior.md +8 -6
- package/docs/concurrency-convention.md +30 -24
- package/docs/coordination.md +48 -38
- package/docs/data-sources.md +3 -1
- package/docs/debugging.md +5 -3
- package/docs/deployment.md +267 -0
- package/docs/examples/agent-human.md +49 -42
- package/docs/examples/ai-sdk-tool.md +69 -44
- package/docs/examples/existing-python-backend.md +8 -6
- package/docs/examples/nextjs.md +129 -47
- package/docs/examples/scoped-agent.md +45 -44
- package/docs/examples/server-agent.md +46 -26
- package/docs/groups.md +32 -29
- package/docs/guarantees.md +4 -2
- package/docs/how-it-works.md +9 -7
- package/docs/idempotency.md +126 -0
- package/docs/identity.md +58 -54
- package/docs/index.md +172 -86
- package/docs/integration-guide.md +17 -16
- package/docs/interaction-model.md +6 -4
- package/docs/mcp.md +41 -16
- package/docs/migration.md +63 -5
- package/docs/operating-on-your-database.md +3 -1
- package/docs/projects.md +2 -0
- package/docs/quickstart.md +22 -5
- package/docs/react.md +12 -10
- package/docs/schema-contract.md +5 -3
- package/docs/session-settings.md +108 -0
- package/docs/sessions.md +3 -1
- package/docs/webhooks.md +3 -1
- package/llms.txt +47 -17
- package/package.json +10 -8
- package/dist/agent/Agent.d.ts +0 -366
- package/dist/agent/Agent.js +0 -514
- package/dist/agent/index.d.ts +0 -115
- package/dist/agent/index.js +0 -128
- package/dist/agent/session.d.ts +0 -93
- package/dist/agent/session.js +0 -149
- package/dist/agent/types.d.ts +0 -68
- package/dist/agent/types.js +0 -9
- package/dist/client/durableWrites.d.ts +0 -21
- package/dist/coordination/schema.d.ts +0 -722
- package/dist/schema/openapi.d.ts +0 -29
- package/dist/schema/openapi.js +0 -124
- package/dist/transactions/durableWriteStore.js +0 -30
- package/dist/utils/json.js +0 -88
- package/dist/wire/errorEnvelope.d.ts +0 -55
- package/dist/wire/frames.d.ts +0 -197
- package/dist/wire/frames.js +0 -49
- package/dist/wire/listEnvelope.js +0 -18
- /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
- /package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +0 -0
- /package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +0 -0
- /package/dist/{client → transaction}/persistence.d.ts +0 -0
- /package/dist/{client → transaction}/persistence.js +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
- /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.js +0 -0
- /package/dist/{types → transaction/types}/participant.d.ts +0 -0
- /package/dist/{types → transaction/types}/participant.js +0 -0
- /package/dist/{types → transaction/types}/streams.js +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
- /package/dist/{utils → transaction/utils}/duration.d.ts +0 -0
- /package/dist/{utils → transaction/utils}/duration.js +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
- /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocol.js +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
- /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
- /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
- /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
2
|
+
* The reactive engine's connection to the sync server: the settlement core's
|
|
3
|
+
* duplex transport ({@link WsTransport}, ADR 0016) plus everything that turns
|
|
4
|
+
* the stream into a local, watchable copy — wire-delta validation, the resume
|
|
5
|
+
* cursor and its persistence-gated ack discipline, incremental sync and
|
|
6
|
+
* bootstrap requests, the catch-up poll, and presence. The socket lifecycle,
|
|
7
|
+
* reconnect backoff, heartbeat, and the commit/claim/release/subscription
|
|
8
|
+
* frames all live in the transport; this subclass overrides its frame hooks
|
|
9
|
+
* and open/close hooks with the materialisation the transport deliberately
|
|
10
|
+
* does not do.
|
|
8
11
|
*/
|
|
9
|
-
import {
|
|
10
|
-
import type
|
|
11
|
-
import { type ClientSyncDelta } from '../wire/delta.js';
|
|
12
|
-
import type { BootstrapReason } from '../wire/bootstrapReason.js';
|
|
13
|
-
import type { ClaimRejection, StaleNotification, ReadDependency, TrackDependency, WireClaim } from '../coordination/schema.js';
|
|
14
|
-
import { type CommitAck } from './commitFrames.js';
|
|
12
|
+
import { type ClientSyncDelta } from '../transaction/wire/delta.js';
|
|
13
|
+
import { WsTransport, type WsTransportOptions, type EventMap, type DefaultCollaborationEvents } from '../transaction/transport/wsTransport.js';
|
|
15
14
|
export type { CommitAck } from './commitFrames.js';
|
|
16
|
-
|
|
15
|
+
export type { SyncCapabilities, BootstrapHint, BootstrapDataEvent, PresenceUpdate, CoreSyncEventMap, DefaultCollaborationEvents, EventMap, SyncWebSocketEventMap, } from '../transaction/transport/wsTransport.js';
|
|
17
16
|
/**
|
|
18
17
|
* The wire delta the client receives. It is inferred from the canonical
|
|
19
18
|
* `clientSyncDeltaSchema` so the client and server share one contract rather
|
|
@@ -49,342 +48,31 @@ export interface GroupRemovedPayload {
|
|
|
49
48
|
group: string;
|
|
50
49
|
userId: string;
|
|
51
50
|
}
|
|
52
|
-
export interface SyncCapabilities {
|
|
53
|
-
partialBootstrap?: boolean;
|
|
54
|
-
compressedDeltas?: boolean;
|
|
55
|
-
streamingBootstrap?: boolean;
|
|
56
|
-
batchedDeltas?: boolean;
|
|
57
|
-
}
|
|
58
|
-
export interface SyncWebSocketOptions {
|
|
59
|
-
/** Base HTTP URL of the sync server */
|
|
60
|
-
baseUrl?: string;
|
|
61
|
-
url?: string;
|
|
62
|
-
userId: string;
|
|
63
|
-
organizationId: string;
|
|
64
|
-
lastSyncId?: number;
|
|
65
|
-
syncGroups?: string[];
|
|
66
|
-
capabilities?: SyncCapabilities;
|
|
67
|
-
reconnectDelay?: number;
|
|
68
|
-
maxReconnectDelay?: number;
|
|
69
|
-
/**
|
|
70
|
-
* Collaboration event type keys to listen for (e.g., ['sheet:selection', 'slide:cursor']).
|
|
71
|
-
* Wire messages with matching types (underscore format) will be emitted as events.
|
|
72
|
-
*/
|
|
73
|
-
collaborationEvents?: string[];
|
|
74
|
-
/**
|
|
75
|
-
* The participant kind declared on the WebSocket upgrade. Defaults to
|
|
76
|
-
* `'user'` (session auth, the web app). Agent runtimes pass `'agent'` so the
|
|
77
|
-
* server verifies them by capability token instead of session auth. The
|
|
78
|
-
* server reads this as the `kind` query parameter.
|
|
79
|
-
*/
|
|
80
|
-
kind?: 'user' | 'agent' | 'system';
|
|
81
|
-
/**
|
|
82
|
-
* The agent's bearer credential — a restricted (`rk_`) API key. When set, it
|
|
83
|
-
* is sent in the `ablo.bearer.<token>` WebSocket subprotocol so the credential
|
|
84
|
-
* stays out of URLs and proxy logs. Required for `kind: 'agent'` and ignored
|
|
85
|
-
* for `kind: 'user'`.
|
|
86
|
-
*/
|
|
87
|
-
capabilityToken?: string;
|
|
88
|
-
/**
|
|
89
|
-
* Getter for the current credential. When provided, the WebSocket upgrade
|
|
90
|
-
* reads it instead of a copied `capabilityToken`, so reconnects always use
|
|
91
|
-
* the freshest token from the SDK's single credential source. Preferred over
|
|
92
|
-
* `getCapabilityToken`.
|
|
93
|
-
*/
|
|
94
|
-
getAuthToken?: AuthTokenGetter;
|
|
95
|
-
/** @deprecated Use `getAuthToken`. Kept for direct low-level callers. */
|
|
96
|
-
getCapabilityToken?: AuthTokenGetter;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Bootstrap hint from server indicating full or partial bootstrap is needed.
|
|
100
|
-
* Properties are optional since server payload structure may vary.
|
|
101
|
-
*/
|
|
102
|
-
export interface BootstrapHint {
|
|
103
|
-
tables?: string[];
|
|
104
|
-
reason?: BootstrapReason;
|
|
105
|
-
staleTables?: string[];
|
|
106
|
-
totalDeltaCount?: number;
|
|
107
|
-
}
|
|
108
|
-
/** Bootstrap data event payload */
|
|
109
|
-
export interface BootstrapDataEvent {
|
|
110
|
-
entityType: string;
|
|
111
|
-
data: unknown;
|
|
112
|
-
isComplete: boolean;
|
|
113
|
-
cursor?: string;
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Payload of a presence-update event, mirroring the `payload` field of the wire
|
|
117
|
-
* frame. This type is the union of everything the server may send; each
|
|
118
|
-
* consumer reads its own subset. Forwarding the full shape, rather than
|
|
119
|
-
* stripping fields here, is deliberate — presence consumers rely on `kind`,
|
|
120
|
-
* `activity`, and `isAgent` to dispatch correctly.
|
|
121
|
-
*/
|
|
122
|
-
export interface PresenceUpdateEvent {
|
|
123
|
-
/** Server-stamped transition: 'enter' on join + roster snapshot,
|
|
124
|
-
* 'update' on activity change, 'leave' on disconnect. */
|
|
125
|
-
kind?: 'enter' | 'update' | 'leave';
|
|
126
|
-
userId: string;
|
|
127
|
-
status: string;
|
|
128
|
-
syncGroups?: string[];
|
|
129
|
-
activity?: {
|
|
130
|
-
entityType: string;
|
|
131
|
-
entityId: string;
|
|
132
|
-
path?: string;
|
|
133
|
-
range?: {
|
|
134
|
-
startLine: number;
|
|
135
|
-
endLine: number;
|
|
136
|
-
startColumn?: number;
|
|
137
|
-
endColumn?: number;
|
|
138
|
-
};
|
|
139
|
-
field?: string;
|
|
140
|
-
meta?: Record<string, unknown>;
|
|
141
|
-
action: string;
|
|
142
|
-
detail?: string;
|
|
143
|
-
};
|
|
144
|
-
/** Server-derived from the connection's userId prefix. Clients must
|
|
145
|
-
* not self-declare — server is the source of truth. */
|
|
146
|
-
isAgent?: boolean;
|
|
147
|
-
/**
|
|
148
|
-
* The canonical participant kind (`'user' | 'agent' | 'system'`), stamped by
|
|
149
|
-
* the server. Some servers omit it, in which case readers fall back to the
|
|
150
|
-
* lossy `isAgent` boolean, which cannot express `'system'`. Typed as `string`
|
|
151
|
-
* because it is raw wire input — normalize it via `participantKindFromWire`.
|
|
152
|
-
*/
|
|
153
|
-
participantKind?: string;
|
|
154
|
-
timestamp?: number;
|
|
155
|
-
/** Every presence frame carries this participant's open claims, stamped by
|
|
156
|
-
* the server, so peers see them without a separate channel. The claim shape
|
|
157
|
-
* is the canonical {@link WireClaim} — one declaration in
|
|
158
|
-
* `coordination/schema.ts`, not a hand-kept copy. */
|
|
159
|
-
activeClaims?: WireClaim[];
|
|
160
|
-
localTime?: string;
|
|
161
|
-
type?: string;
|
|
162
|
-
timezone?: string;
|
|
163
|
-
socketId?: string;
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Core event map — transport-level events that every SyncWebSocket emits.
|
|
167
|
-
* SDK consumers extend this with app-specific collaboration events.
|
|
168
|
-
*/
|
|
169
|
-
export interface CoreSyncEventMap {
|
|
170
|
-
connected: [];
|
|
171
|
-
disconnected: [CloseEvent];
|
|
172
|
-
reconnecting: [{
|
|
173
|
-
attempt: number;
|
|
174
|
-
delay: number;
|
|
175
|
-
}];
|
|
176
|
-
delta: [SyncDelta];
|
|
177
|
-
delta_batch: [SyncDelta[]];
|
|
178
|
-
bootstrap_required: [BootstrapHint];
|
|
179
|
-
bootstrap_data: [BootstrapDataEvent];
|
|
180
|
-
presence_update: [PresenceUpdateEvent];
|
|
181
|
-
error: [Error];
|
|
182
|
-
session_error: [Error];
|
|
183
|
-
/**
|
|
184
|
-
* The WebSocket `onclose` fired before `onopen` — the handshake itself
|
|
185
|
-
* failed. The browser cannot expose the HTTP status (it shows as code
|
|
186
|
-
* 1006 with no reason), so the consumer should run an authenticated
|
|
187
|
-
* HTTP probe to distinguish auth failure (session expired) from a
|
|
188
|
-
* generic network issue.
|
|
189
|
-
*/
|
|
190
|
-
handshake_failed: [CloseEvent];
|
|
191
|
-
reconnect_failed: [{
|
|
192
|
-
attempts: number;
|
|
193
|
-
}];
|
|
194
|
-
/**
|
|
195
|
-
* Server-initiated notification that a previously-active claim's
|
|
196
|
-
* TTL has expired. Consumers (e.g., the participant SDK) re-mint
|
|
197
|
-
* a fresh capability and re-claim, OR accept the drop. The claim
|
|
198
|
-
* is already inactive on the server side by the time this fires —
|
|
199
|
-
* no client-side action needed unless re-claiming.
|
|
200
|
-
*/
|
|
201
|
-
claim_expired: [{
|
|
202
|
-
claimId: string;
|
|
203
|
-
}];
|
|
204
|
-
/**
|
|
205
|
-
* Server rejected an `claim_begin` because another participant
|
|
206
|
-
* already holds an open claim on the same target (cooperative
|
|
207
|
-
* mutex enforced server-side). Surfaces to the participant-level
|
|
208
|
-
* ClaimStream so the caller knows their announce was denied.
|
|
209
|
-
* Payload mirrors the wire frame's `payload`.
|
|
210
|
-
*/
|
|
211
|
-
claim_rejected: [ClaimRejection];
|
|
212
|
-
/**
|
|
213
|
-
* Fair-queue frames (opt-in `queue: true` on `claim_begin`). `claim_acquired`
|
|
214
|
-
* means the target was free and the lease is ours immediately; `claim_queued`
|
|
215
|
-
* means the claim is waiting in line (carries `position`); `claim_granted`
|
|
216
|
-
* means it reached the head and the lease is now ours; `claim_lost` means a
|
|
217
|
-
* held/granted claim was taken away (TTL lapse on disconnect, revoke).
|
|
218
|
-
*/
|
|
219
|
-
/**
|
|
220
|
-
* Per-entity wait-queue snapshot: `{ target, queue: Claim[] }` with each
|
|
221
|
-
* entry `status: 'queued'` + `position`. Broadcast to entity peers on every
|
|
222
|
-
* queue mutation — powers the reactive `ablo.<model>.claim.queue({ id })` read.
|
|
223
|
-
*/
|
|
224
|
-
claim_queue: [Record<string, unknown>];
|
|
225
|
-
claim_acquired: [Record<string, unknown>];
|
|
226
|
-
claim_queued: [Record<string, unknown>];
|
|
227
|
-
claim_granted: [Record<string, unknown>];
|
|
228
|
-
claim_lost: [Record<string, unknown>];
|
|
229
|
-
/**
|
|
230
|
-
* Reply to an outbound `claim_heartbeat` — the lease's fate: `held` with
|
|
231
|
-
* the extended `expiresAt`, `queued` with the current `position`, or
|
|
232
|
-
* `lost`. Correlated back to the awaiting caller by `claimId` in the
|
|
233
|
-
* claim stream.
|
|
234
|
-
*/
|
|
235
|
-
claim_heartbeat_ack: [Record<string, unknown>];
|
|
236
|
-
/**
|
|
237
|
-
* A committed write guarded with `onStale: 'notify'` collided with a
|
|
238
|
-
* concurrent change. Rather than forcing an outcome, the engine returns the
|
|
239
|
-
* conflicting field's current value so the actor — an agent reasoning over the
|
|
240
|
-
* change, or a person watching the row — can reconcile it. The commit itself
|
|
241
|
-
* succeeded; the held operations were not written, and the actor re-issues
|
|
242
|
-
* them once it has reconciled.
|
|
243
|
-
*/
|
|
244
|
-
'conflict:notified': [{
|
|
245
|
-
clientTxId: string;
|
|
246
|
-
notifications: StaleNotification[];
|
|
247
|
-
}];
|
|
248
|
-
}
|
|
249
51
|
/**
|
|
250
|
-
*
|
|
251
|
-
*
|
|
52
|
+
* The reactive engine's connection options — the transport's options under
|
|
53
|
+
* the name consumers have always imported.
|
|
252
54
|
*/
|
|
253
|
-
export type
|
|
254
|
-
|
|
255
|
-
* Constraint for event maps: every value must be a tuple of handler args.
|
|
256
|
-
*
|
|
257
|
-
* Why a mapped type and not `Record<string, unknown[]>`?
|
|
258
|
-
* `Record<string, ...>` requires an implicit string index signature, which
|
|
259
|
-
* TypeScript interfaces don't have. So a closed interface like Ablo's
|
|
260
|
-
* `AbloCollaborationEvents` would fail to satisfy `Record<string, unknown[]>`,
|
|
261
|
-
* even though every one of its values is a tuple. This mapped form iterates
|
|
262
|
-
* over `keyof T` instead of demanding a string index, so it accepts both
|
|
263
|
-
* closed interfaces and open Record types — while still enforcing
|
|
264
|
-
* "every value is an array."
|
|
265
|
-
*/
|
|
266
|
-
export type EventMap<T> = {
|
|
267
|
-
[K in keyof T]: unknown[];
|
|
268
|
-
};
|
|
269
|
-
/**
|
|
270
|
-
* Full event map = core + collaboration events.
|
|
271
|
-
* Pass your own TCollaboration to add app-specific events.
|
|
272
|
-
*/
|
|
273
|
-
export type SyncWebSocketEventMap<TCollaboration extends EventMap<TCollaboration> = DefaultCollaborationEvents> = CoreSyncEventMap & TCollaboration;
|
|
274
|
-
export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboration> = DefaultCollaborationEvents> extends EventEmitter {
|
|
275
|
-
/**
|
|
276
|
-
* Subscribe to events with automatic cleanup.
|
|
277
|
-
* Returns unsubscribe function for clean disposal.
|
|
278
|
-
*/
|
|
279
|
-
subscribe<K extends keyof SyncWebSocketEventMap<TCollaboration>>(event: K, handler: (...args: SyncWebSocketEventMap<TCollaboration>[K]) => void): () => void;
|
|
280
|
-
/**
|
|
281
|
-
* Send a collaboration event (app-specific real-time message).
|
|
282
|
-
* The wire format is `{ type: messageType, payload: { ...payload, timestamp } }`.
|
|
283
|
-
*/
|
|
284
|
-
sendCollaborationEvent<K extends string & keyof TCollaboration>(messageType: K, payload: TCollaboration[K] extends [infer P] ? Omit<P & Record<string, unknown>, 'timestamp'> : never): void;
|
|
285
|
-
private ws;
|
|
286
|
-
private options;
|
|
287
|
-
private reconnectAttempts;
|
|
288
|
-
/** Stop retrying after this many consecutive failures (backoff caps at 30s, so ~7.5 min total) */
|
|
289
|
-
private static readonly MAX_RECONNECT_ATTEMPTS;
|
|
290
|
-
private reconnectTimer;
|
|
55
|
+
export type SyncWebSocketOptions = WsTransportOptions;
|
|
56
|
+
export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboration> = DefaultCollaborationEvents> extends WsTransport<TCollaboration> {
|
|
291
57
|
/** Periodic catchup interval — polls for missed deltas every 30s while connected */
|
|
292
58
|
private catchupInterval;
|
|
293
|
-
/**
|
|
294
|
-
* Application-level heartbeat: ping every 30 seconds and force-close after a
|
|
295
|
-
* 10-second silence. The {@link HeartbeatController} holds the timing and the
|
|
296
|
-
* zombie-socket rationale; the closures below are the only socket access it
|
|
297
|
-
* gets.
|
|
298
|
-
*/
|
|
299
|
-
private readonly heartbeat;
|
|
300
|
-
private isConnecting;
|
|
301
|
-
private isManualClose;
|
|
302
|
-
/** When true, a session error has been detected (from any path — WS close or HTTP bootstrap).
|
|
303
|
-
* Suppresses reconnection and Sentry error capture to avoid cascading noise. */
|
|
304
|
-
private _sessionErrorDetected;
|
|
305
|
-
/** True once `onopen` has fired at least once on the current socket. Reset each
|
|
306
|
-
* time a new socket is created in `connect()`. Used by `onclose` to detect
|
|
307
|
-
* handshake failures (close before open) — the one signal we have for "the
|
|
308
|
-
* server rejected the upgrade" since browsers hide the HTTP status (e.g.
|
|
309
|
-
* 401) behind the opaque 1006 close code. */
|
|
310
|
-
private _everOpened;
|
|
311
|
-
/**
|
|
312
|
-
* Diagnostic snapshot of the last connection lifecycle. Persisted across
|
|
313
|
-
* the lifetime of the SyncWebSocket so that any subsequent "not connected"
|
|
314
|
-
* rejection can quote the actual root cause (close code + reason + when)
|
|
315
|
-
* instead of bottoming out at a generic error string. Browser WS code 1006
|
|
316
|
-
* hides the real reason, so we layer on our own signals: `forceCloseReason`
|
|
317
|
-
* captures heartbeat trips / send failures, `everOpened` distinguishes
|
|
318
|
-
* handshake reject from mid-session drop, and `sessionErrorAt` tells us
|
|
319
|
-
* whether reconnect is suppressed.
|
|
320
|
-
*/
|
|
321
|
-
private lastOpenAt;
|
|
322
|
-
private lastCloseAt;
|
|
323
|
-
private lastCloseCode;
|
|
324
|
-
private lastCloseReason;
|
|
325
|
-
private lastForceCloseReason;
|
|
326
|
-
private sessionErrorAt;
|
|
327
59
|
/**
|
|
328
60
|
* Sync-position state: the lastSyncId watermark, version vector, and server
|
|
329
61
|
* cursor. The advance discipline is documented at `sendAck` and `handleDelta`;
|
|
330
62
|
* the state itself lives in {@link SyncCursor}.
|
|
331
63
|
*/
|
|
332
64
|
private readonly cursor;
|
|
333
|
-
/** Registered collaboration event keys (colon format) for dispatch in onmessage */
|
|
334
|
-
private collaborationEventTypes;
|
|
335
|
-
/**
|
|
336
|
-
* A minimal session adapter handed to the inbound frame dispatch table
|
|
337
|
-
* ({@link dispatchWsFrame}). It exposes only the members the handlers touch;
|
|
338
|
-
* the closure members read live state so a reassignment here (for example the
|
|
339
|
-
* `pendingSubscriptions` reset on close) cannot strand a handler on a stale
|
|
340
|
-
* reference. Built in the constructor, after the state it captures exists.
|
|
341
|
-
*/
|
|
342
|
-
private readonly frameSession;
|
|
343
|
-
/**
|
|
344
|
-
* In-flight `commit` mutation requests keyed by clientTxId. Resolved when
|
|
345
|
-
* a matching `mutation_result` frame arrives from the server, or rejected on
|
|
346
|
-
* timeout / disconnect. Lets consumers await a server ack for mutations
|
|
347
|
-
* sent over the same socket that streams deltas.
|
|
348
|
-
*/
|
|
349
|
-
private pendingMutations;
|
|
350
|
-
/**
|
|
351
|
-
* In-flight `claim` requests keyed by claimId. Resolved when the matching
|
|
352
|
-
* `claim_ack` arrives, or rejected on timeout or disconnect — the same
|
|
353
|
-
* request/response pattern as `pendingMutations`, multiplexed over the one
|
|
354
|
-
* connection.
|
|
355
|
-
*/
|
|
356
|
-
private pendingClaims;
|
|
357
|
-
/**
|
|
358
|
-
* In-flight `update_subscription` frames awaiting `subscription_ack`.
|
|
359
|
-
* A FIFO queue rather than a keyed Map because the wire ack carries no
|
|
360
|
-
* correlation id — the server applies subscription updates in receive
|
|
361
|
-
* order and acks in the same order, so `shift()` on ack matches the
|
|
362
|
-
* oldest pending request. (Read-interest changes are infrequent and
|
|
363
|
-
* usually settle before the next one, so depth is ~1 in practice.)
|
|
364
|
-
*/
|
|
365
|
-
private pendingSubscriptions;
|
|
366
65
|
constructor(options: SyncWebSocketOptions);
|
|
66
|
+
/** The persisted resume position, sent on the upgrade URL. */
|
|
67
|
+
protected resumeCursor(): string;
|
|
367
68
|
/**
|
|
368
|
-
*
|
|
369
|
-
*
|
|
370
|
-
|
|
371
|
-
setSessionErrorDetected(): void;
|
|
372
|
-
/**
|
|
373
|
-
* Clear the session-error latch so `connect()` / `scheduleReconnect()`
|
|
374
|
-
* work again. Called by the store's access-credential recovery path when
|
|
375
|
-
* the close was a re-mintable `ek_`/`rk_` expiry (`4001 credential_expired`),
|
|
376
|
-
* not a login loss — see `isAccessCredentialExpiryCloseReason`. Genuine
|
|
377
|
-
* session losses never clear the latch; re-auth builds a fresh client.
|
|
378
|
-
*/
|
|
379
|
-
clearSessionError(): void;
|
|
380
|
-
/**
|
|
381
|
-
* Connect to the sync engine WebSocket
|
|
382
|
-
*/
|
|
383
|
-
connect(): void;
|
|
384
|
-
/**
|
|
385
|
-
* Setup WebSocket event handlers
|
|
69
|
+
* The open ritual, run by the transport between its `connected` emit and the
|
|
70
|
+
* heartbeat start: announce presence, tell the server where we left off,
|
|
71
|
+
* request the deltas we missed, and start the catch-up poll.
|
|
386
72
|
*/
|
|
387
|
-
|
|
73
|
+
protected onOpened(): void;
|
|
74
|
+
/** The transport clears its socket reference before this runs. */
|
|
75
|
+
protected onClosed(): void;
|
|
388
76
|
/**
|
|
389
77
|
* Validates and normalizes a wire delta at the receive boundary — the single
|
|
390
78
|
* seam every inbound delta (a `delta` frame, a batch element, a `sync_response`
|
|
@@ -411,7 +99,7 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
|
|
|
411
99
|
* Handle incoming sync delta (untrusted wire input — validated and
|
|
412
100
|
* normalized by {@link normalizeWireDelta}; malformed deltas are dropped).
|
|
413
101
|
*/
|
|
414
|
-
|
|
102
|
+
protected handleDelta(rawDelta: unknown): void;
|
|
415
103
|
/**
|
|
416
104
|
* Acknowledges received deltas up to the given syncId. This is the only place
|
|
417
105
|
* `this.cursor.lastSyncId` moves forward for live deltas. The store calls it
|
|
@@ -426,112 +114,6 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
|
|
|
426
114
|
* Public wrapper for sending ack from outside the class
|
|
427
115
|
*/
|
|
428
116
|
acknowledge(syncId: number): void;
|
|
429
|
-
/**
|
|
430
|
-
* Send message to server
|
|
431
|
-
*/
|
|
432
|
-
send(message: any): void;
|
|
433
|
-
/**
|
|
434
|
-
* Sends a `commit` mutation request over the existing WebSocket and resolves
|
|
435
|
-
* when the server's `mutation_result` frame comes back with the same
|
|
436
|
-
* `clientTxId`. The wire frame is `{ type: 'commit', payload: { operations,
|
|
437
|
-
* clientTxId } }`.
|
|
438
|
-
*
|
|
439
|
-
* Times out after 15 seconds of silence from the server. The socket may close
|
|
440
|
-
* during an in-flight mutation (a network flap, a server restart); this does
|
|
441
|
-
* not auto-retry — the caller's transaction queue owns retry and offline
|
|
442
|
-
* replay, and the SDK does not duplicate that logic.
|
|
443
|
-
*/
|
|
444
|
-
sendCommit(operations: readonly MutationOperation[], clientTxId: string, timeoutMs?: number, causedByTaskId?: string | null, reads?: readonly ReadDependency[] | null, track?: readonly TrackDependency[] | null): Promise<CommitAck>;
|
|
445
|
-
/**
|
|
446
|
-
* Send a commit frame without waiting for `mutation_result`.
|
|
447
|
-
*
|
|
448
|
-
* This backs the public `wait: 'queued'` API: the socket accepted the
|
|
449
|
-
* frame for delivery, but the server has not confirmed it yet. The
|
|
450
|
-
* eventual `mutation_result` frame is intentionally ignored by this
|
|
451
|
-
* instance because no pending resolver is registered.
|
|
452
|
-
*/
|
|
453
|
-
sendCommitQueued(operations: readonly MutationOperation[], clientTxId: string, causedByTaskId?: string | null, reads?: readonly ReadDependency[] | null, track?: readonly TrackDependency[] | null): void;
|
|
454
|
-
/**
|
|
455
|
-
* Activates a participant claim on this connection. One connection can hold
|
|
456
|
-
* several concurrent claims at once, each scoped to a different set of sync
|
|
457
|
-
* groups, so the SDK reuses the existing connection instead of opening a
|
|
458
|
-
* separate socket per scope.
|
|
459
|
-
*
|
|
460
|
-
* Returns a promise that resolves with the server-canonicalized `syncGroups`
|
|
461
|
-
* and effective `ttlSeconds` once `claim_ack` arrives, or rejects with a typed
|
|
462
|
-
* error on a failed ack, a timeout, or a disconnect.
|
|
463
|
-
*/
|
|
464
|
-
sendClaim(claimId: string, syncGroups: readonly string[], options?: {
|
|
465
|
-
capabilityToken?: string;
|
|
466
|
-
ttlSeconds?: number;
|
|
467
|
-
timeoutMs?: number;
|
|
468
|
-
}): Promise<{
|
|
469
|
-
syncGroups: string[];
|
|
470
|
-
ttlSeconds?: number;
|
|
471
|
-
}>;
|
|
472
|
-
/**
|
|
473
|
-
* Drop a previously-active claim. Idempotent — `release` is
|
|
474
|
-
* fire-and-forget per the wire contract; the server accepts
|
|
475
|
-
* unknown claimIds silently so disconnect-time release storms
|
|
476
|
-
* never error. No ack is expected.
|
|
477
|
-
*
|
|
478
|
-
* If a claim's send promise is still pending (no claim_ack yet),
|
|
479
|
-
* we reject it locally — the user explicitly chose to release.
|
|
480
|
-
*/
|
|
481
|
-
sendRelease(claimId: string): void;
|
|
482
|
-
/**
|
|
483
|
-
* Moves this connection's read interest — replaces the connection-level sync
|
|
484
|
-
* groups mid-session as the user opens and closes entities. This is the
|
|
485
|
-
* area-of-interest navigation primitive: the server fans out deltas only for
|
|
486
|
-
* the groups currently in view, rather than the fixed set chosen at connect.
|
|
487
|
-
*
|
|
488
|
-
* This is a full-set replace: pass the complete new group list, not a delta.
|
|
489
|
-
* Resolves with the server's effective set once `subscription_ack` arrives;
|
|
490
|
-
* rejects (with a typed error) on a scope denial (a restricted `rk_` key
|
|
491
|
-
* requesting a group outside its allowlist), a timeout, or a disconnect. On
|
|
492
|
-
* success the new set is recorded as `options.syncGroups`, so a later reconnect
|
|
493
|
-
* re-subscribes to the current interest rather than the connect-time set.
|
|
494
|
-
*
|
|
495
|
-
* Distinct from {@link sendClaim} (a write claim, per operation, with a TTL):
|
|
496
|
-
* this is the read side, carries no capability token of its own, and is
|
|
497
|
-
* bounded by the connection credential's grant.
|
|
498
|
-
*/
|
|
499
|
-
updateSubscription(syncGroups: readonly string[], options?: {
|
|
500
|
-
timeoutMs?: number;
|
|
501
|
-
}): Promise<{
|
|
502
|
-
syncGroups: string[];
|
|
503
|
-
}>;
|
|
504
|
-
/**
|
|
505
|
-
* Sets a fixed credential for callers that construct the socket directly. The
|
|
506
|
-
* SDK instead supplies `getAuthToken`, so reconnects read the shared
|
|
507
|
-
* credential source rather than this copied value.
|
|
508
|
-
*/
|
|
509
|
-
setCapabilityToken(token: string): void;
|
|
510
|
-
getAuthToken(): string | undefined;
|
|
511
|
-
/**
|
|
512
|
-
* Return the credential that will be used by the next WebSocket upgrade.
|
|
513
|
-
* ConnectionManager reads this for HTTP auth probes so visibility/network
|
|
514
|
-
* checks authenticate the same way reconnects do.
|
|
515
|
-
*/
|
|
516
|
-
getCapabilityToken(): string | undefined;
|
|
517
|
-
private resolveAuthToken;
|
|
518
|
-
/**
|
|
519
|
-
* Send spreadsheet selection presence
|
|
520
|
-
*/
|
|
521
|
-
sendSheetSelection(sheetId: string, selectedCells: {
|
|
522
|
-
ref: string;
|
|
523
|
-
}[]): void;
|
|
524
|
-
/**
|
|
525
|
-
* Send slide layer selection presence
|
|
526
|
-
*/
|
|
527
|
-
sendSlideSelection(deckId: string, slideId: string, selectedLayers: {
|
|
528
|
-
layerId: string;
|
|
529
|
-
}[]): void;
|
|
530
|
-
/**
|
|
531
|
-
* Send slide cursor position for real-time collaboration
|
|
532
|
-
* Note: Throttling should be handled by the caller (e.g., useSlideCursorBroadcast hook)
|
|
533
|
-
*/
|
|
534
|
-
sendSlideCursor(deckId: string, slideId: string, x: number, y: number): void;
|
|
535
117
|
/**
|
|
536
118
|
* Send presence update to server.
|
|
537
119
|
* Use this for:
|
|
@@ -545,15 +127,6 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
|
|
|
545
127
|
* @param customStatus - Optional custom status message
|
|
546
128
|
*/
|
|
547
129
|
sendPresenceUpdate(status?: 'online' | 'away' | 'offline', customStatus?: string): void;
|
|
548
|
-
/**
|
|
549
|
-
* Schedule reconnection with exponential backoff
|
|
550
|
-
*/
|
|
551
|
-
private scheduleReconnect;
|
|
552
|
-
/**
|
|
553
|
-
* Reset reconnect attempt counter. Called when network comes back online
|
|
554
|
-
* to allow a fresh reconnect cycle after the max was previously reached.
|
|
555
|
-
*/
|
|
556
|
-
resetReconnectAttempts(): void;
|
|
557
130
|
/**
|
|
558
131
|
* Stop the periodic catchup interval
|
|
559
132
|
*/
|
|
@@ -562,51 +135,6 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
|
|
|
562
135
|
* Disconnect from WebSocket
|
|
563
136
|
*/
|
|
564
137
|
disconnect(): void;
|
|
565
|
-
/**
|
|
566
|
-
* Force-close the socket from the client side using a private 4xxx
|
|
567
|
-
* code. Callers expect `onclose` to fire; that handler runs the
|
|
568
|
-
* existing reconnect / handshake-failed dispatch. Wrapped in
|
|
569
|
-
* try/catch because `close()` on a CLOSING/CLOSED socket throws on
|
|
570
|
-
* some browsers.
|
|
571
|
-
*/
|
|
572
|
-
private forceClose;
|
|
573
|
-
/**
|
|
574
|
-
* Get connection state
|
|
575
|
-
*/
|
|
576
|
-
isConnected(): boolean;
|
|
577
|
-
/**
|
|
578
|
-
* Snapshot of recent connection lifecycle state, for diagnostic logs
|
|
579
|
-
* and error messages. Cheap to call (no I/O); safe to log every time
|
|
580
|
-
* a send is rejected so we can attribute "not connected" rejections
|
|
581
|
-
* to the actual root cause (handshake reject vs heartbeat zombie vs
|
|
582
|
-
* session expiry vs explicit close).
|
|
583
|
-
*/
|
|
584
|
-
getConnectionDiagnostics(): {
|
|
585
|
-
readyState: number | null;
|
|
586
|
-
isConnecting: boolean;
|
|
587
|
-
isManualClose: boolean;
|
|
588
|
-
sessionErrorDetected: boolean;
|
|
589
|
-
everOpened: boolean;
|
|
590
|
-
reconnectAttempts: number;
|
|
591
|
-
maxReconnectAttempts: number;
|
|
592
|
-
lastOpenAt: number | null;
|
|
593
|
-
lastCloseAt: number | null;
|
|
594
|
-
lastCloseCode: number | null;
|
|
595
|
-
lastCloseReason: string | null;
|
|
596
|
-
lastForceCloseReason: string | null;
|
|
597
|
-
sessionErrorAt: number | null;
|
|
598
|
-
msSinceLastOpen: number | null;
|
|
599
|
-
msSinceLastClose: number | null;
|
|
600
|
-
};
|
|
601
|
-
/**
|
|
602
|
-
* Build a richly-diagnosed "not connected" error so callers (and the
|
|
603
|
-
* logs they emit) can attribute the rejection. The message embeds the
|
|
604
|
-
* dominant signal in human-readable form; the structured detail is
|
|
605
|
-
* also attached as `error.diagnostics` for log scrapers.
|
|
606
|
-
*/
|
|
607
|
-
private notConnectedError;
|
|
608
|
-
/** Returns the sync groups this connection is subscribed to. */
|
|
609
|
-
getSyncGroups(): string[];
|
|
610
138
|
/**
|
|
611
139
|
* Update last sync ID (for persistence)
|
|
612
140
|
*/
|
|
@@ -637,20 +165,9 @@ export declare class SyncWebSocket<TCollaboration extends EventMap<TCollaboratio
|
|
|
637
165
|
* {@link normalizeWireDelta} (exactly once each; malformed ones drop out
|
|
638
166
|
* of the batch).
|
|
639
167
|
*/
|
|
640
|
-
|
|
168
|
+
protected handleSyncResponse(rawPayload: unknown): void;
|
|
641
169
|
/**
|
|
642
170
|
* Handle bootstrap response from server
|
|
643
171
|
*/
|
|
644
|
-
|
|
645
|
-
/**
|
|
646
|
-
* Handles a presence update from the server. The wire frame's payload is
|
|
647
|
-
* forwarded as-is, so every consumer reads the same shape; stripping fields
|
|
648
|
-
* here would drop `kind`, `activity`, `syncGroups`, and `isAgent` for
|
|
649
|
-
* consumers that need them.
|
|
650
|
-
*
|
|
651
|
-
* The wire frame is:
|
|
652
|
-
* { type: 'presence_update', payload: { kind, userId, status,
|
|
653
|
-
* syncGroups, activity, isAgent, timestamp, activeClaims } }
|
|
654
|
-
*/
|
|
655
|
-
private handlePresenceUpdate;
|
|
172
|
+
protected handleBootstrapResponse(payload: unknown): void;
|
|
656
173
|
}
|