@abloatai/ablo 0.26.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -2
- package/README.md +102 -86
- package/dist/BaseSyncedStore.d.ts +85 -88
- package/dist/BaseSyncedStore.js +134 -151
- package/dist/Database.d.ts +68 -69
- package/dist/Database.js +316 -135
- package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
- package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
- package/dist/LazyReferenceCollection.d.ts +11 -15
- package/dist/LazyReferenceCollection.js +12 -16
- package/dist/Model.d.ts +54 -52
- package/dist/Model.js +78 -62
- package/dist/ModelRegistry.d.ts +21 -19
- package/dist/ModelRegistry.js +23 -27
- package/dist/NetworkMonitor.d.ts +5 -6
- package/dist/NetworkMonitor.js +5 -6
- package/dist/SyncClient.d.ts +122 -118
- package/dist/SyncClient.js +541 -245
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +10 -9
- package/dist/adapters/inMemoryStorage.js +21 -9
- package/dist/agent/Agent.d.ts +27 -32
- package/dist/agent/Agent.js +18 -19
- package/dist/agent/index.d.ts +4 -4
- package/dist/agent/index.js +5 -5
- package/dist/agent/session.d.ts +47 -44
- package/dist/agent/session.js +37 -48
- package/dist/agent/types.d.ts +26 -31
- package/dist/agent/types.js +6 -7
- package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
- package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
- package/dist/ai-sdk/coordinationContext.d.ts +46 -0
- package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +26 -33
- package/dist/ai-sdk/index.d.ts +25 -22
- package/dist/ai-sdk/index.js +25 -22
- package/dist/ai-sdk/wrap.d.ts +6 -7
- package/dist/ai-sdk/wrap.js +1 -1
- package/dist/auth/credentialPolicy.d.ts +69 -74
- package/dist/auth/credentialPolicy.js +51 -56
- package/dist/auth/credentialSource.d.ts +6 -5
- package/dist/auth/credentialSource.js +9 -10
- package/dist/auth/index.d.ts +59 -58
- package/dist/auth/index.js +31 -37
- package/dist/auth/schemas.d.ts +5 -4
- package/dist/auth/schemas.js +5 -4
- package/dist/batching/index.d.ts +19 -21
- package/dist/batching/index.js +14 -17
- package/dist/cli.cjs +173 -121
- package/dist/client/Ablo.d.ts +97 -74
- package/dist/client/Ablo.js +129 -163
- package/dist/client/ApiClient.d.ts +30 -19
- package/dist/client/ApiClient.js +442 -81
- package/dist/client/auth.d.ts +47 -47
- package/dist/client/auth.js +108 -117
- package/dist/client/claimHeartbeatLoop.d.ts +50 -0
- package/dist/client/claimHeartbeatLoop.js +88 -0
- package/dist/client/consoleLogger.d.ts +5 -6
- package/dist/client/consoleLogger.js +5 -6
- package/dist/client/createInternalComponents.d.ts +16 -17
- package/dist/client/createInternalComponents.js +26 -31
- package/dist/client/createModelProxy.d.ts +130 -120
- package/dist/client/createModelProxy.js +152 -122
- package/dist/client/credentialEndpoint.d.ts +40 -42
- package/dist/client/credentialEndpoint.js +35 -36
- package/dist/client/functionalUpdate.d.ts +29 -27
- package/dist/client/functionalUpdate.js +21 -21
- package/dist/client/hostedEndpoints.d.ts +9 -12
- package/dist/client/hostedEndpoints.js +9 -12
- package/dist/client/httpClient.d.ts +59 -53
- package/dist/client/httpClient.js +29 -31
- package/dist/client/identity.d.ts +15 -20
- package/dist/client/identity.js +47 -58
- package/dist/client/modelRegistration.d.ts +5 -9
- package/dist/client/modelRegistration.js +78 -87
- package/dist/client/options.d.ts +157 -157
- package/dist/client/options.js +3 -7
- package/dist/client/registerDataSource.d.ts +9 -9
- package/dist/client/registerDataSource.js +15 -16
- package/dist/client/resourceTypes.d.ts +64 -75
- package/dist/client/resourceTypes.js +4 -10
- package/dist/client/schemaConfig.d.ts +31 -43
- package/dist/client/schemaConfig.js +38 -50
- package/dist/client/sessionMint.d.ts +16 -12
- package/dist/client/sessionMint.js +26 -31
- package/dist/client/validateAbloOptions.d.ts +12 -14
- package/dist/client/validateAbloOptions.js +8 -9
- package/dist/client/writeOptionsSchema.d.ts +18 -16
- package/dist/client/writeOptionsSchema.js +23 -20
- package/dist/client/wsMutationExecutor.d.ts +16 -20
- package/dist/client/wsMutationExecutor.js +18 -23
- package/dist/commit/contract.d.ts +493 -0
- package/dist/commit/contract.js +187 -0
- package/dist/commit/index.d.ts +6 -0
- package/dist/commit/index.js +5 -0
- package/dist/context.d.ts +6 -4
- package/dist/context.js +6 -4
- package/dist/coordination/index.d.ts +10 -8
- package/dist/coordination/index.js +14 -12
- package/dist/coordination/schema.d.ts +176 -128
- package/dist/coordination/schema.js +197 -133
- package/dist/coordination/trace.d.ts +9 -10
- package/dist/coordination/trace.js +13 -14
- package/dist/core/DatabaseManager.d.ts +5 -7
- package/dist/core/DatabaseManager.js +15 -19
- package/dist/core/QueryProcessor.d.ts +7 -9
- package/dist/core/QueryProcessor.js +22 -28
- package/dist/core/QueryView.d.ts +8 -8
- package/dist/core/QueryView.js +2 -2
- package/dist/core/StoreManager.d.ts +14 -14
- package/dist/core/StoreManager.js +33 -24
- package/dist/core/ViewRegistry.d.ts +5 -5
- package/dist/core/ViewRegistry.js +4 -4
- package/dist/core/index.d.ts +17 -12
- package/dist/core/index.js +32 -26
- package/dist/core/openIDBWithTimeout.d.ts +38 -36
- package/dist/core/openIDBWithTimeout.js +42 -43
- package/dist/core/queryUtils.d.ts +45 -0
- package/dist/core/queryUtils.js +69 -0
- package/dist/core/storeContract.d.ts +63 -61
- package/dist/core/storeContract.js +8 -12
- package/dist/environment.d.ts +28 -0
- package/dist/environment.js +21 -0
- package/dist/errorCodes.d.ts +107 -99
- package/dist/errorCodes.js +137 -134
- package/dist/errors.d.ts +160 -166
- package/dist/errors.js +155 -158
- package/dist/index.d.ts +36 -27
- package/dist/index.js +91 -86
- package/dist/interfaces/index.d.ts +102 -113
- package/dist/interfaces/index.js +5 -4
- package/dist/keys/index.d.ts +27 -29
- package/dist/keys/index.js +41 -40
- package/dist/mutators/RecordingTransaction.d.ts +16 -16
- package/dist/mutators/RecordingTransaction.js +31 -37
- package/dist/mutators/Transaction.d.ts +18 -26
- package/dist/mutators/Transaction.js +14 -20
- package/dist/mutators/UndoManager.d.ts +124 -131
- package/dist/mutators/UndoManager.js +177 -156
- package/dist/mutators/defineMutators.d.ts +23 -34
- package/dist/mutators/defineMutators.js +14 -20
- package/dist/mutators/inverseOp.d.ts +12 -15
- package/dist/mutators/inverseOp.js +12 -15
- package/dist/mutators/mutateActions.d.ts +10 -9
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +9 -8
- package/dist/mutators/readerActions.js +2 -2
- package/dist/mutators/undoApply.d.ts +31 -27
- package/dist/mutators/undoApply.js +26 -24
- package/dist/policy/index.d.ts +5 -3
- package/dist/policy/index.js +5 -3
- package/dist/policy/types.d.ts +104 -100
- package/dist/policy/types.js +67 -66
- package/dist/query/client.d.ts +28 -23
- package/dist/query/client.js +45 -43
- package/dist/query/types.d.ts +37 -60
- package/dist/query/types.js +13 -33
- package/dist/react/AbloProvider.d.ts +1 -1
- package/dist/react/AbloProvider.js +2 -2
- package/dist/react/context.d.ts +25 -28
- package/dist/react/context.js +9 -10
- package/dist/react/index.d.ts +41 -42
- package/dist/react/index.js +37 -38
- package/dist/react/internalContext.d.ts +17 -19
- package/dist/react/useAblo.d.ts +28 -25
- package/dist/react/useAblo.js +41 -17
- package/dist/react/useCurrentUserId.d.ts +8 -7
- package/dist/react/useCurrentUserId.js +8 -7
- package/dist/react/useErrorListener.d.ts +7 -7
- package/dist/react/useErrorListener.js +10 -11
- package/dist/react/useMutationFailureListener.d.ts +8 -8
- package/dist/react/useMutationFailureListener.js +8 -8
- package/dist/react/useMutators.d.ts +11 -11
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useReactive.js +2 -2
- package/dist/react/useSyncStatus.d.ts +4 -6
- package/dist/react/useUndoScope.d.ts +7 -9
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +21 -25
- package/dist/schema/coordination.js +21 -25
- package/dist/schema/ddl.d.ts +43 -39
- package/dist/schema/ddl.js +75 -68
- package/dist/schema/ddlLock.d.ts +20 -24
- package/dist/schema/ddlLock.js +18 -23
- package/dist/schema/diff.d.ts +99 -61
- package/dist/schema/diff.js +43 -34
- package/dist/schema/field.d.ts +37 -42
- package/dist/schema/field.js +35 -48
- package/dist/schema/generate.d.ts +12 -12
- package/dist/schema/generate.js +12 -12
- package/dist/schema/index.d.ts +3 -3
- package/dist/schema/index.js +21 -23
- package/dist/schema/model.d.ts +118 -143
- package/dist/schema/model.js +22 -33
- package/dist/schema/openapi.d.ts +10 -9
- package/dist/schema/openapi.js +5 -3
- package/dist/schema/queries.d.ts +29 -31
- package/dist/schema/queries.js +23 -25
- package/dist/schema/relation.d.ts +89 -99
- package/dist/schema/relation.js +13 -13
- package/dist/schema/residency.d.ts +16 -13
- package/dist/schema/residency.js +16 -13
- package/dist/schema/roles.d.ts +36 -43
- package/dist/schema/roles.js +31 -37
- package/dist/schema/schema.d.ts +64 -43
- package/dist/schema/schema.js +31 -32
- package/dist/schema/select.d.ts +13 -13
- package/dist/schema/select.js +13 -13
- package/dist/schema/serialize.d.ts +28 -31
- package/dist/schema/serialize.js +27 -31
- package/dist/schema/sugar.d.ts +17 -32
- package/dist/schema/sugar.js +14 -29
- package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
- package/dist/schema/syncDeltaRow.js +89 -0
- package/dist/schema/tenancy.d.ts +44 -46
- package/dist/schema/tenancy.js +46 -48
- package/dist/server/adapter.d.ts +58 -58
- package/dist/server/adapter.js +13 -14
- package/dist/server/commit.d.ts +60 -64
- package/dist/server/index.d.ts +9 -10
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +70 -0
- package/dist/server/readConfig.js +8 -0
- package/dist/server/storageMode.d.ts +23 -0
- package/dist/server/storageMode.js +17 -0
- package/dist/source/adapter.d.ts +30 -25
- package/dist/source/adapter.js +10 -10
- package/dist/source/adapters/drizzle.d.ts +28 -23
- package/dist/source/adapters/drizzle.js +30 -25
- package/dist/source/adapters/kysely.d.ts +27 -25
- package/dist/source/adapters/kysely.js +24 -23
- package/dist/source/adapters/memory.d.ts +8 -7
- package/dist/source/adapters/memory.js +9 -8
- package/dist/source/adapters/prisma.d.ts +13 -12
- package/dist/source/adapters/prisma.js +22 -25
- package/dist/source/conformance.d.ts +18 -11
- package/dist/source/conformance.js +17 -11
- package/dist/source/connector.d.ts +31 -32
- package/dist/source/connector.js +28 -28
- package/dist/source/connectorProtocol.d.ts +160 -0
- package/dist/source/connectorProtocol.js +162 -0
- package/dist/source/contract.d.ts +26 -27
- package/dist/source/contract.js +28 -29
- package/dist/source/factory.d.ts +46 -58
- package/dist/source/factory.js +22 -27
- package/dist/source/index.d.ts +7 -9
- package/dist/source/index.js +12 -14
- package/dist/source/migrations.d.ts +9 -9
- package/dist/source/migrations.js +9 -9
- package/dist/source/next.d.ts +9 -10
- package/dist/source/next.js +6 -7
- package/dist/source/pushQueue.d.ts +69 -47
- package/dist/source/pushQueue.js +32 -28
- package/dist/source/signing.d.ts +46 -17
- package/dist/source/signing.js +28 -11
- package/dist/source/types.d.ts +121 -104
- package/dist/source/types.js +13 -14
- package/dist/stores/ObjectStore.d.ts +24 -12
- package/dist/stores/ObjectStore.js +38 -16
- package/dist/stores/ObjectStoreContract.d.ts +14 -15
- package/dist/stores/SyncActionStore.d.ts +7 -11
- package/dist/stores/SyncActionStore.js +13 -17
- package/dist/surface.d.ts +28 -21
- package/dist/surface.js +29 -20
- package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
- package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
- package/dist/sync/ConnectionManager.d.ts +39 -50
- package/dist/sync/ConnectionManager.js +55 -66
- package/dist/sync/NetworkProbe.d.ts +24 -29
- package/dist/sync/NetworkProbe.js +63 -69
- package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
- package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
- package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
- package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
- package/dist/sync/SyncWebSocket.d.ts +141 -166
- package/dist/sync/SyncWebSocket.js +191 -223
- package/dist/sync/awaitClaimGrant.d.ts +18 -18
- package/dist/sync/awaitClaimGrant.js +11 -11
- package/dist/sync/bootstrapApply.d.ts +34 -24
- package/dist/sync/bootstrapApply.js +27 -19
- package/dist/sync/commitFrames.d.ts +21 -20
- package/dist/sync/commitFrames.js +18 -18
- package/dist/sync/createClaimStream.d.ts +23 -22
- package/dist/sync/createClaimStream.js +105 -23
- package/dist/sync/createPresenceStream.d.ts +19 -18
- package/dist/sync/createPresenceStream.js +25 -26
- package/dist/sync/createSnapshot.d.ts +12 -14
- package/dist/sync/createSnapshot.js +20 -26
- package/dist/sync/credentialLifecycle.d.ts +104 -104
- package/dist/sync/credentialLifecycle.js +140 -147
- package/dist/sync/deltaPipeline.d.ts +36 -34
- package/dist/sync/deltaPipeline.js +64 -65
- package/dist/sync/groupChange.d.ts +63 -61
- package/dist/sync/groupChange.js +74 -78
- package/dist/sync/heartbeat.d.ts +34 -33
- package/dist/sync/heartbeat.js +31 -31
- package/dist/sync/participants.d.ts +19 -19
- package/dist/sync/persistedPrefix.d.ts +12 -0
- package/dist/sync/persistedPrefix.js +22 -0
- package/dist/sync/schemas.d.ts +3 -2
- package/dist/sync/schemas.js +14 -10
- package/dist/sync/syncCursor.d.ts +17 -21
- package/dist/sync/syncCursor.js +17 -21
- package/dist/sync/syncPlan.d.ts +28 -36
- package/dist/sync/syncPlan.js +18 -19
- package/dist/sync/syncPosition.d.ts +54 -49
- package/dist/sync/syncPosition.js +57 -52
- package/dist/sync/wsFrameHandlers.d.ts +35 -36
- package/dist/sync/wsFrameHandlers.js +63 -67
- package/dist/testing/fixtures/bootstrap.d.ts +12 -6
- package/dist/testing/fixtures/bootstrap.js +12 -6
- package/dist/testing/fixtures/deltas.d.ts +30 -33
- package/dist/testing/fixtures/deltas.js +30 -33
- package/dist/testing/fixtures/models.d.ts +11 -10
- package/dist/testing/fixtures/models.js +11 -10
- package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
- package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
- package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
- package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
- package/dist/testing/helpers/wait.d.ts +13 -8
- package/dist/testing/helpers/wait.js +13 -8
- package/dist/testing/index.d.ts +5 -3
- package/dist/testing/index.js +3 -2
- package/dist/testing/mocks/FakeDatabase.d.ts +18 -0
- package/dist/testing/mocks/FakeDatabase.js +10 -0
- package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
- package/dist/testing/mocks/MockMutationExecutor.js +15 -14
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
- package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
- package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
- package/dist/testing/mocks/MockSyncContext.js +15 -13
- package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
- package/dist/testing/mocks/MockSyncStore.js +11 -11
- package/dist/testing/mocks/MockWebSocket.d.ts +28 -23
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +244 -181
- package/dist/transactions/TransactionQueue.js +929 -423
- package/dist/transactions/TransactionStore.d.ts +6 -4
- package/dist/transactions/TransactionStore.js +6 -4
- package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
- package/dist/transactions/UnconfirmedWrites.js +104 -0
- package/dist/transactions/coalesceRules.d.ts +41 -17
- package/dist/transactions/coalesceRules.js +40 -17
- package/dist/transactions/commitEnvelope.d.ts +132 -0
- package/dist/transactions/commitEnvelope.js +139 -0
- package/dist/transactions/commitOutboxStore.d.ts +32 -0
- package/dist/transactions/commitOutboxStore.js +26 -0
- package/dist/transactions/commitPayload.d.ts +63 -52
- package/dist/transactions/commitPayload.js +54 -57
- package/dist/transactions/deltaConfirmation.d.ts +20 -22
- package/dist/transactions/deltaConfirmation.js +37 -45
- package/dist/transactions/httpCommitEnvelope.d.ts +43 -0
- package/dist/transactions/httpCommitEnvelope.js +179 -0
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/replayValidation.d.ts +182 -0
- package/dist/transactions/replayValidation.js +156 -0
- package/dist/types/global.d.ts +46 -41
- package/dist/types/global.js +20 -19
- package/dist/types/index.d.ts +71 -77
- package/dist/types/index.js +22 -22
- package/dist/types/modelData.d.ts +6 -8
- package/dist/types/modelData.js +5 -7
- package/dist/types/participant.d.ts +10 -11
- package/dist/types/participant.js +6 -8
- package/dist/types/streams.d.ts +208 -195
- package/dist/types/streams.js +7 -7
- package/dist/utils/asyncIterator.d.ts +25 -32
- package/dist/utils/asyncIterator.js +25 -32
- package/dist/utils/duration.d.ts +12 -15
- package/dist/utils/duration.js +12 -15
- package/dist/utils/mobxSetup.d.ts +53 -0
- package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
- package/dist/webhooks/events.d.ts +21 -16
- package/dist/webhooks/events.js +10 -8
- package/dist/webhooks/index.d.ts +5 -7
- package/dist/webhooks/index.js +5 -7
- package/dist/wire/bootstrapReason.d.ts +9 -0
- package/dist/wire/bootstrapReason.js +8 -0
- package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
- package/dist/wire/delta.js +114 -0
- package/dist/wire/errorEnvelope.d.ts +30 -31
- package/dist/wire/errorEnvelope.js +34 -40
- package/dist/wire/frames.d.ts +315 -86
- package/dist/wire/frames.js +47 -33
- package/dist/wire/index.d.ts +18 -14
- package/dist/wire/index.js +32 -27
- package/dist/wire/listEnvelope.d.ts +16 -23
- package/dist/wire/listEnvelope.js +7 -6
- package/dist/wire/protocol.d.ts +25 -32
- package/dist/wire/protocol.js +25 -32
- package/dist/wire/protocolVersion.d.ts +44 -40
- package/dist/wire/protocolVersion.js +44 -40
- package/docs/api.md +10 -10
- package/docs/coordination.md +59 -0
- package/docs/mcp.md +1 -1
- package/package.json +17 -11
- package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
- package/dist/ai-sdk/coordination-context.d.ts +0 -52
- package/dist/core/query-utils.d.ts +0 -34
- package/dist/core/query-utils.js +0 -59
- package/dist/schema/sync-delta-row.js +0 -103
- package/dist/schema/sync-delta-wire.js +0 -102
- package/dist/server/read-config.d.ts +0 -67
- package/dist/server/read-config.js +0 -8
- package/dist/server/storage-mode.d.ts +0 -8
- package/dist/server/storage-mode.js +0 -28
- package/dist/source/connector-protocol.d.ts +0 -159
- package/dist/source/connector-protocol.js +0 -161
- package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
- package/dist/transactions/OptimisticEchoTracker.js +0 -104
- package/dist/transactions/mutation-error-handler.d.ts +0 -5
- package/dist/transactions/mutation-error-handler.js +0 -39
- package/dist/transactions/optimistic.d.ts +0 -24
- package/dist/transactions/optimistic.js +0 -45
- package/dist/transactions/persistedReplay.d.ts +0 -93
- package/dist/transactions/persistedReplay.js +0 -105
- package/dist/utils/mobx-setup.d.ts +0 -42
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `startCredentialLifecycle`) so its published surface is unchanged, and
|
|
9
|
-
* talks back through the minimal {@link CredentialLifecycleContext} —
|
|
10
|
-
* never the store's class type — so no module cycle forms.
|
|
2
|
+
* Keeps the short-lived access credential fresh. It owns the re-mint hook, a
|
|
3
|
+
* single-flight guard that stops concurrent triggers from minting more than
|
|
4
|
+
* once, and a browser-only proactive refresh — a timer plus an OS-wake listener
|
|
5
|
+
* — that renews the credential ahead of expiry. It reaches the rest of the
|
|
6
|
+
* client only through the small {@link CredentialLifecycleContext} interface,
|
|
7
|
+
* so the two can reference each other without an import cycle.
|
|
11
8
|
*/
|
|
12
9
|
import type { RecoveryClass } from '../errorCodes.js';
|
|
13
10
|
/**
|
|
@@ -16,19 +13,19 @@ import type { RecoveryClass } from '../errorCodes.js';
|
|
|
16
13
|
*/
|
|
17
14
|
export type CredentialRefreshOutcome = 'refreshed' | 'session_error' | 'network_error';
|
|
18
15
|
/**
|
|
19
|
-
* What an auth-rejected transport should do after
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* a re-mint can't cure, or
|
|
23
|
-
* retry
|
|
16
|
+
* What an auth-rejected transport should do after recovery has run. `'retry'`
|
|
17
|
+
* means a fresh credential is now in place — replay the request once. `'stop'`
|
|
18
|
+
* means don't replay: either the session is gone for good, the rejection is one
|
|
19
|
+
* a re-mint can't cure, or the mint failed transiently and the caller's own
|
|
20
|
+
* retry path will recover later.
|
|
24
21
|
*/
|
|
25
22
|
export type CredentialRecoveryOutcome = 'retry' | 'stop';
|
|
26
23
|
/**
|
|
27
|
-
* What a credential refresher may resolve with. The plain-string form
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* pre-roll
|
|
31
|
-
*
|
|
24
|
+
* What a credential refresher may resolve with. The plain-string form returns
|
|
25
|
+
* just the token. The object form also carries the mint response's `expiresAt`
|
|
26
|
+
* (an ISO string, epoch milliseconds, or a `Date`), which lets the proactive
|
|
27
|
+
* pre-roll schedule against the credential's real lifetime rather than assume
|
|
28
|
+
* the server's default expiry.
|
|
32
29
|
*/
|
|
33
30
|
export type CredentialRefreshResult = string | {
|
|
34
31
|
readonly token: string;
|
|
@@ -37,135 +34,138 @@ export type CredentialRefreshResult = string | {
|
|
|
37
34
|
/** A credential re-mint hook. `Promise<string | null>` resolvers remain
|
|
38
35
|
* assignable — the widened result type is a superset. */
|
|
39
36
|
export type CredentialRefresher = () => Promise<CredentialRefreshResult>;
|
|
40
|
-
/**
|
|
41
|
-
* comfortably inside the server's
|
|
42
|
-
* the refresher reports no expiry. */
|
|
37
|
+
/** The fallback pre-roll interval, and also its ceiling: 10 minutes, which sits
|
|
38
|
+
* comfortably inside the server's 15-minute default credential lifetime. Used
|
|
39
|
+
* as-is when the refresher reports no expiry. */
|
|
43
40
|
export declare const DEFAULT_PREROLL_INTERVAL_MS: number;
|
|
44
41
|
/** Floor so a very short (or already-elapsed) TTL can't hot-loop the mint. */
|
|
45
42
|
export declare const MIN_PREROLL_DELAY_MS: number;
|
|
46
43
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
44
|
+
* Computes how long to wait before pre-rolling a credential that expires at
|
|
45
|
+
* `expiresAtMs`: about two-thirds of the remaining lifetime (a 15-minute
|
|
46
|
+
* credential yields 10 minutes), clamped to
|
|
47
|
+
* [{@link MIN_PREROLL_DELAY_MS}, {@link DEFAULT_PREROLL_INTERVAL_MS}]. An
|
|
48
|
+
* unknown expiry (`null`) falls back to the 10-minute interval. Exported for
|
|
49
|
+
* unit tests.
|
|
51
50
|
*/
|
|
52
51
|
export declare function computePrerollDelayMs(expiresAtMs: number | null, nowMs: number): number;
|
|
53
52
|
/**
|
|
54
|
-
*
|
|
55
|
-
* three callbacks,
|
|
56
|
-
* behind two of them
|
|
53
|
+
* The callbacks this lifecycle needs back from the surrounding client. It is
|
|
54
|
+
* deliberately minimal — three callbacks, each resolved lazily at call time,
|
|
55
|
+
* because the connection machinery behind two of them isn't constructed until
|
|
56
|
+
* the sync connection is set up.
|
|
57
57
|
*/
|
|
58
58
|
export interface CredentialLifecycleContext {
|
|
59
59
|
/** Push a freshly-minted access token into the shared credential source
|
|
60
60
|
* (no-op when the deployment wired no credential source). */
|
|
61
61
|
setAuthToken(token: string): void;
|
|
62
|
-
/** Nudge the connection
|
|
63
|
-
* the host's `nudgeReconnect()` (`CREDENTIAL_REFRESHED`). */
|
|
62
|
+
/** Nudge the connection to re-probe using the credential now in place. */
|
|
64
63
|
nudgeReconnect(): void;
|
|
65
|
-
/**
|
|
66
|
-
*
|
|
64
|
+
/** Report that the long-lived login is gone, so the connection can move to
|
|
65
|
+
* its signed-out state. */
|
|
67
66
|
reportSessionExpired(): void;
|
|
68
67
|
}
|
|
69
68
|
export declare class CredentialLifecycle {
|
|
70
69
|
private readonly ctx;
|
|
71
70
|
/**
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
* resolves a token string on success, `null` when
|
|
77
|
-
* gone (terminal), and
|
|
78
|
-
* {@link refresh}.
|
|
79
|
-
* `apiKey`
|
|
71
|
+
* The hook that mints a fresh short-lived access credential (the `ek_`/`rk_`
|
|
72
|
+
* key). An integrator wires it from their own token endpoint: this lifecycle
|
|
73
|
+
* decides when to refresh (a stale-credential probe or an external nudge),
|
|
74
|
+
* and the hook decides how to mint. It follows the same contract as a
|
|
75
|
+
* `getToken` function — it resolves a token string on success, `null` when
|
|
76
|
+
* the long-lived login is gone (a terminal state), and throws on a transient
|
|
77
|
+
* or offline failure. Used by {@link refresh}. When it is absent there is no
|
|
78
|
+
* silent re-mint, as with a static `apiKey` whose credential source is
|
|
79
|
+
* refreshed elsewhere.
|
|
80
80
|
*/
|
|
81
81
|
private credentialRefresher;
|
|
82
82
|
/** Single-flight guard so a wake nudge + an in-flight request + a probe don't
|
|
83
83
|
* all mint at once (the classic "token thrash → random logout" bug). */
|
|
84
84
|
private inFlightCredentialRefresh;
|
|
85
|
-
/**
|
|
86
|
-
*
|
|
87
|
-
*
|
|
85
|
+
/** Tears down the proactive credential lifecycle (the refresh timer and the
|
|
86
|
+
* OS-wake listener) installed by {@link start}; cleared when the client
|
|
87
|
+
* disconnects. Null when no refresher is wired. */
|
|
88
88
|
private credentialLifecycleTeardown;
|
|
89
|
-
/** Epoch
|
|
90
|
-
* (object
|
|
91
|
-
* string-form resolver
|
|
89
|
+
/** Epoch milliseconds at which the current credential expires, when the
|
|
90
|
+
* refresher reports it (the object form of {@link CredentialRefreshResult}).
|
|
91
|
+
* `null` for the string-form resolver, in which case the pre-roll uses its
|
|
92
|
+
* fixed interval. */
|
|
92
93
|
private credentialExpiresAtMs;
|
|
93
|
-
/** Re-
|
|
94
|
-
*
|
|
95
|
-
* the
|
|
96
|
-
*
|
|
94
|
+
/** Re-arms the proactive pre-roll timer (set by {@link start}). Called after
|
|
95
|
+
* every successful mint, so a refresh triggered reactively (by a probe, an
|
|
96
|
+
* OS wake, or the first mint) re-anchors the schedule to the fresh
|
|
97
|
+
* credential's real expiry instead of a stale fixed delay. */
|
|
97
98
|
private prerollReschedule;
|
|
98
99
|
constructor(ctx: CredentialLifecycleContext);
|
|
99
100
|
/**
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
101
|
+
* Registers the re-mint hook for the access credential — a function that
|
|
102
|
+
* mints a fresh `ek_`/`rk_` key, typically the integrator's `getToken`. See
|
|
103
|
+
* {@link credentialRefresher}.
|
|
103
104
|
*/
|
|
104
105
|
setRefresher(refresher: CredentialRefresher | null): void;
|
|
105
106
|
/**
|
|
106
|
-
* Re-
|
|
107
|
-
* source,
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
* - token string → `'refreshed'` (fresh key in place; re-probe & reconnect)
|
|
112
|
-
* - `null` → `'session_error'` (login itself is gone → terminal, sign out)
|
|
113
|
-
* - throw → `'network_error'` (couldn't reach the mint endpoint → transient)
|
|
107
|
+
* Re-mints the short-lived access credential, pushes it into the credential
|
|
108
|
+
* source, and reports a three-way outcome the connection layer acts on:
|
|
109
|
+
* - a token string → `'refreshed'` (the fresh key is in place; re-probe and reconnect)
|
|
110
|
+
* - `null` → `'session_error'` (the login itself is gone — terminal, sign out)
|
|
111
|
+
* - a thrown error → `'network_error'` (the mint endpoint was unreachable — transient)
|
|
114
112
|
*
|
|
115
|
-
*
|
|
116
|
-
* probe) share one in-flight promise so
|
|
117
|
-
*
|
|
113
|
+
* The call is single-flight: concurrent triggers (an OS wake, an in-flight
|
|
114
|
+
* request, a probe) share one in-flight promise, so the credential is never
|
|
115
|
+
* minted twice at once. This avoids the failure where every rejected request
|
|
116
|
+
* mints a new token and the resulting thrash logs the user out.
|
|
118
117
|
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
*
|
|
118
|
+
* With no refresher wired, it resolves `'refreshed'` as a no-op re-probe: a
|
|
119
|
+
* static-`apiKey` client has no session to mint from and its credential
|
|
120
|
+
* source is refreshed elsewhere, so it simply re-probes with what it holds.
|
|
122
121
|
*/
|
|
123
122
|
refresh(): Promise<CredentialRefreshOutcome>;
|
|
124
123
|
/**
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
* HTTP auth-recovery path so every
|
|
124
|
+
* Interprets a refresh outcome and drives the connection accordingly. This is
|
|
125
|
+
* the single place the three-way outcome is acted on, shared by the proactive
|
|
126
|
+
* pre-roll, the OS-wake nudge, and the HTTP auth-recovery path, so every
|
|
127
|
+
* trigger converges on the same behavior.
|
|
128
128
|
*/
|
|
129
129
|
private routeRefreshOutcome;
|
|
130
130
|
/**
|
|
131
|
-
*
|
|
132
|
-
* The
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
131
|
+
* The shared recovery path for a request rejected on authentication, over any
|
|
132
|
+
* transport. The WebSocket probe already routes its own 401s; HTTP callers
|
|
133
|
+
* call this instead of inventing their own handling, so every path shares one
|
|
134
|
+
* single-flight mint, one outcome routing, and one taxonomy. It classifies
|
|
135
|
+
* the same recovery codes the connection probe does:
|
|
136
|
+
* - `access_credential_expiry` — the routine case, an expired `ek_`/`rk_`:
|
|
137
|
+
* silently re-mint through the single-flight {@link refresh} and tell the
|
|
138
|
+
* caller to replay once on success. This never signs out on its own; the
|
|
139
|
+
* only terminal path is the mint resolving `null`.
|
|
140
|
+
* - `session_expiry` — the login is gone: report it (which drives sign-out)
|
|
141
|
+
* and stop, since replaying is pointless.
|
|
142
|
+
* - `auth_blocked`, `permission`, and everything else — re-minting would
|
|
143
|
+
* produce the same rejected credential, so stop and leave the connection
|
|
144
|
+
* alone.
|
|
145
145
|
*/
|
|
146
146
|
recoverFromAuthRejection(recovery: RecoveryClass): Promise<CredentialRecoveryOutcome>;
|
|
147
147
|
/**
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
148
|
+
* Installs the credential lifecycle. It has two parts:
|
|
149
|
+
* 1. Reactive — registers `getToken` as the re-mint hook the connection
|
|
150
|
+
* calls when a probe finds the key stale, or on a nudge.
|
|
151
|
+
* 2. Proactive — keeps the short-lived key fresh ahead of expiry with a
|
|
152
|
+
* refresh timer inside the credential's lifetime, plus a re-mint on OS
|
|
153
|
+
* wake. The whole proactive block is browser-gated on `typeof window`,
|
|
154
|
+
* because a server render has no socket to keep warm and the resolver is
|
|
155
|
+
* browser-oriented; arming it under Node would fire a relative-URL fetch
|
|
156
|
+
* and throw. (Agents pass a static `apiKey` with no resolver, so this
|
|
157
|
+
* method is never called for them.)
|
|
158
158
|
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
159
|
+
* Refreshing is automatic — a consumer never calls a refresh method. The call
|
|
160
|
+
* is idempotent: a second call replaces the first, and it is torn down when
|
|
161
|
+
* the client disconnects.
|
|
162
162
|
*
|
|
163
|
-
* `opts.proactiveInNode` arms the refresh
|
|
164
|
-
*
|
|
165
|
-
* `rk_`/`ek_` must renew
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
163
|
+
* `opts.proactiveInNode` arms the refresh timer on a windowless host as well.
|
|
164
|
+
* Set it for agent or system participants — long-lived server sockets whose
|
|
165
|
+
* `rk_`/`ek_` must renew before the server's keepalive check closes them.
|
|
166
|
+
* Node timers are `unref`ed, so a finishing script is never held alive by the
|
|
167
|
+
* pre-roll. The OS-wake listener stays browser-only regardless, since there
|
|
168
|
+
* is no `window` to listen on.
|
|
169
169
|
*/
|
|
170
170
|
start(getToken: CredentialRefresher, opts?: {
|
|
171
171
|
proactiveInNode?: boolean;
|