@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
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The auto-heartbeat loop behind `claim({ id, heartbeat: true })` — one
|
|
3
|
+
* implementation shared by both transports (the WebSocket claim stream and the
|
|
4
|
+
* HTTP `ApiClient`), so the cadence and failure semantics cannot drift.
|
|
5
|
+
*
|
|
6
|
+
* A beat is the "still working" signal that keeps a lease alive for the
|
|
7
|
+
* duration of real work. The loop's failure handling follows the lease-system
|
|
8
|
+
* convention (SQS visibility heartbeats, Kubernetes leases): a beat that fails
|
|
9
|
+
* for a transient reason — the network blipped, the server was briefly
|
|
10
|
+
* unavailable — is simply retried on the next tick, because the lease has
|
|
11
|
+
* runway to spare by construction (the default cadence is a third of the TTL,
|
|
12
|
+
* so two consecutive beats can fail before the lease is even at risk). Only a
|
|
13
|
+
* definitive answer from the server — the lease lapsed and may have been
|
|
14
|
+
* granted to the next in line ({@link AbloClaimedError}) — stops the loop and
|
|
15
|
+
* surfaces the loss, because for a caller with no push channel the failed beat
|
|
16
|
+
* IS the loss notification.
|
|
17
|
+
*/
|
|
18
|
+
import { AbloClaimedError } from '../errors.js';
|
|
19
|
+
import { toMs } from '../utils/duration.js';
|
|
20
|
+
/**
|
|
21
|
+
* Normalize the public `heartbeat(options?)` argument — a bare Duration is
|
|
22
|
+
* shorthand for `{ ttl }`. Shared by both transports' handle assembly so the
|
|
23
|
+
* shorthand cannot drift.
|
|
24
|
+
*/
|
|
25
|
+
export function resolveHeartbeatOptions(input) {
|
|
26
|
+
if (input === undefined)
|
|
27
|
+
return {};
|
|
28
|
+
if (typeof input === 'string' || typeof input === 'number') {
|
|
29
|
+
return { ttl: input };
|
|
30
|
+
}
|
|
31
|
+
return input;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The beat cadence for a lease of `ttlMs`: an explicit duration when the
|
|
35
|
+
* caller set one, otherwise a third of the TTL (floored at 1s) — the
|
|
36
|
+
* DynamoDB-lock-client rule, leaving two missed beats of runway before the
|
|
37
|
+
* lease is at risk while keeping crash recovery within one beat window.
|
|
38
|
+
*/
|
|
39
|
+
export function heartbeatCadenceMs(ttlMs, heartbeat) {
|
|
40
|
+
if (heartbeat !== true)
|
|
41
|
+
return toMs(heartbeat);
|
|
42
|
+
return Math.max(Math.floor(ttlMs / 3), 1_000);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Start beating. Returns a stop function; callers stop the loop when the
|
|
46
|
+
* claim is released (all held-claim assembly sites tie this to `release`).
|
|
47
|
+
* Beats never overlap: a tick that fires while the previous beat is still
|
|
48
|
+
* in flight is skipped rather than stacked.
|
|
49
|
+
*/
|
|
50
|
+
export function startClaimHeartbeatLoop(options) {
|
|
51
|
+
let stopped = false;
|
|
52
|
+
let inFlight = false;
|
|
53
|
+
const stop = () => {
|
|
54
|
+
if (stopped)
|
|
55
|
+
return;
|
|
56
|
+
stopped = true;
|
|
57
|
+
clearInterval(timer);
|
|
58
|
+
};
|
|
59
|
+
const timer = setInterval(() => {
|
|
60
|
+
if (stopped || inFlight)
|
|
61
|
+
return;
|
|
62
|
+
inFlight = true;
|
|
63
|
+
options
|
|
64
|
+
.beat()
|
|
65
|
+
.catch((error) => {
|
|
66
|
+
if (stopped)
|
|
67
|
+
return;
|
|
68
|
+
if (error instanceof AbloClaimedError) {
|
|
69
|
+
stop();
|
|
70
|
+
options.onLost?.(error);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// Transient (connection, brief server unavailability): the next tick
|
|
74
|
+
// is the retry — the ttl/3 cadence leaves runway for missed beats.
|
|
75
|
+
})
|
|
76
|
+
.finally(() => {
|
|
77
|
+
inFlight = false;
|
|
78
|
+
});
|
|
79
|
+
}, options.intervalMs);
|
|
80
|
+
// The loop must never be what keeps a Node process alive — the held work
|
|
81
|
+
// is. A worker that finishes without releasing exits anyway, and the lease
|
|
82
|
+
// lapses on schedule. No-op in browsers (where setInterval returns a number
|
|
83
|
+
// without `unref`), which is why the call is optional even though the Node
|
|
84
|
+
// timer type always has it.
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
86
|
+
timer.unref?.();
|
|
87
|
+
return stop;
|
|
88
|
+
}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The default `[Ablo]` console logger
|
|
2
|
+
* The default `[Ablo]` console logger and its level resolution.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* of hand-rolling a console shim.
|
|
4
|
+
* These helpers are exported so any entry point that needs a default logger can
|
|
5
|
+
* reuse the same level gating rather than hand-rolling a console wrapper.
|
|
7
6
|
*/
|
|
8
7
|
import type { SyncLogger } from '../interfaces/index.js';
|
|
9
8
|
/**
|
|
@@ -30,7 +29,7 @@ export declare function resolveLogLevel(opts?: {
|
|
|
30
29
|
logLevel?: LogLevel;
|
|
31
30
|
}): LogLevel;
|
|
32
31
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
32
|
+
* Builds the default logger, gated at `level` and prefixed `[Ablo]` so its lines
|
|
33
|
+
* stand out in a console full of other tools' output.
|
|
35
34
|
*/
|
|
36
35
|
export declare function createConsoleLogger(level: LogLevel): SyncLogger;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The default `[Ablo]` console logger
|
|
2
|
+
* The default `[Ablo]` console logger and its level resolution.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* of hand-rolling a console shim.
|
|
4
|
+
* These helpers are exported so any entry point that needs a default logger can
|
|
5
|
+
* reuse the same level gating rather than hand-rolling a console wrapper.
|
|
7
6
|
*/
|
|
8
7
|
const LOG_LEVEL_RANK = { debug: 10, info: 20, warn: 30, error: 40, silent: 99 };
|
|
9
8
|
/**
|
|
@@ -26,8 +25,8 @@ export function resolveLogLevel(opts) {
|
|
|
26
25
|
return 'warn';
|
|
27
26
|
}
|
|
28
27
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
28
|
+
* Builds the default logger, gated at `level` and prefixed `[Ablo]` so its lines
|
|
29
|
+
* stand out in a console full of other tools' output.
|
|
31
30
|
*/
|
|
32
31
|
export function createConsoleLogger(level) {
|
|
33
32
|
const threshold = LOG_LEVEL_RANK[level];
|
|
@@ -1,28 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Builds the internal component graph the client runs on.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* Mirrors the pattern Anthropic uses: their client constructor wires
|
|
11
|
-
* endpoint modules. Ours wires the sync-engine components instead.
|
|
4
|
+
* From the caller's options and schema this wires together the model registry,
|
|
5
|
+
* object pool, bootstrap helper, database, sync client, and hydration
|
|
6
|
+
* coordinator. Each component depends on the one before it, so construction
|
|
7
|
+
* order matters; keeping it here means the client constructor does not have to
|
|
8
|
+
* know that order.
|
|
12
9
|
*/
|
|
13
10
|
import { Database } from '../Database.js';
|
|
14
11
|
import { ModelRegistry } from '../ModelRegistry.js';
|
|
15
|
-
import {
|
|
12
|
+
import { InstanceCache } from '../InstanceCache.js';
|
|
16
13
|
import { SyncClient } from '../SyncClient.js';
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
14
|
+
import { OnDemandLoader } from '../sync/OnDemandLoader.js';
|
|
15
|
+
import { BootstrapFetcher } from '../sync/BootstrapFetcher.js';
|
|
19
16
|
import type { AuthCredentialSource } from '../auth/credentialSource.js';
|
|
20
17
|
import type { Schema, SchemaRecord } from '../schema/schema.js';
|
|
21
18
|
import { type AbloPersistence } from './persistence.js';
|
|
19
|
+
import type { CommitOutboxStore } from '../transactions/commitOutboxStore.js';
|
|
22
20
|
export interface InternalComponentsInput<S extends SchemaRecord> {
|
|
23
21
|
readonly schema: Schema<S>;
|
|
24
|
-
/** WebSocket URL
|
|
25
|
-
* caller
|
|
22
|
+
/** The WebSocket URL. Used to derive the bootstrap HTTP base URL when the
|
|
23
|
+
* caller has not overridden `bootstrapBaseUrl`. */
|
|
26
24
|
readonly url: string;
|
|
27
25
|
readonly options: {
|
|
28
26
|
readonly maxPoolSize?: number;
|
|
@@ -31,15 +29,16 @@ export interface InternalComponentsInput<S extends SchemaRecord> {
|
|
|
31
29
|
readonly persistence?: AbloPersistence;
|
|
32
30
|
readonly offline?: boolean;
|
|
33
31
|
readonly inMemory?: boolean;
|
|
32
|
+
readonly commitOutbox?: CommitOutboxStore;
|
|
34
33
|
};
|
|
35
34
|
readonly auth?: AuthCredentialSource;
|
|
36
35
|
}
|
|
37
36
|
export interface InternalComponents {
|
|
38
37
|
readonly modelRegistry: ModelRegistry;
|
|
39
|
-
readonly objectPool:
|
|
40
|
-
readonly bootstrapHelper:
|
|
38
|
+
readonly objectPool: InstanceCache;
|
|
39
|
+
readonly bootstrapHelper: BootstrapFetcher;
|
|
41
40
|
readonly database: Database;
|
|
42
41
|
readonly syncClient: SyncClient;
|
|
43
|
-
readonly hydration:
|
|
42
|
+
readonly hydration: OnDemandLoader;
|
|
44
43
|
}
|
|
45
44
|
export declare function createInternalComponents<S extends SchemaRecord>(input: InternalComponentsInput<S>): InternalComponents;
|
|
@@ -1,56 +1,52 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Builds the internal component graph the client runs on.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* Mirrors the pattern Anthropic uses: their client constructor wires
|
|
11
|
-
* endpoint modules. Ours wires the sync-engine components instead.
|
|
4
|
+
* From the caller's options and schema this wires together the model registry,
|
|
5
|
+
* object pool, bootstrap helper, database, sync client, and hydration
|
|
6
|
+
* coordinator. Each component depends on the one before it, so construction
|
|
7
|
+
* order matters; keeping it here means the client constructor does not have to
|
|
8
|
+
* know that order.
|
|
12
9
|
*/
|
|
13
10
|
import { Database } from '../Database.js';
|
|
14
11
|
import { ModelRegistry, setActiveRegistry } from '../ModelRegistry.js';
|
|
15
|
-
import {
|
|
12
|
+
import { InstanceCache } from '../InstanceCache.js';
|
|
16
13
|
import { SyncClient } from '../SyncClient.js';
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
14
|
+
import { OnDemandLoader } from '../sync/OnDemandLoader.js';
|
|
15
|
+
import { BootstrapFetcher } from '../sync/BootstrapFetcher.js';
|
|
19
16
|
import { resolveBootstrapBaseUrl } from './auth.js';
|
|
20
17
|
import { shouldUseInMemoryPersistence } from './persistence.js';
|
|
21
18
|
export function createInternalComponents(input) {
|
|
22
19
|
const { schema, url, options, auth } = input;
|
|
23
|
-
// The registry is created here but model registration happens in
|
|
24
|
-
//
|
|
25
|
-
// schema-to-class translation depends on private helpers there).
|
|
20
|
+
// The registry is created here, but model registration happens in the caller,
|
|
21
|
+
// which owns the schema-to-class translation.
|
|
26
22
|
const modelRegistry = new ModelRegistry({
|
|
27
23
|
validateOnRegister: false,
|
|
28
24
|
allowLateReferences: true,
|
|
29
25
|
});
|
|
30
26
|
setActiveRegistry(modelRegistry);
|
|
31
|
-
const objectPool = new
|
|
27
|
+
const objectPool = new InstanceCache({ maxSize: options.maxPoolSize ?? 10000 }, modelRegistry);
|
|
32
28
|
const bootstrapBaseUrl = resolveBootstrapBaseUrl({
|
|
33
29
|
url,
|
|
34
30
|
bootstrapBaseUrl: options.bootstrapBaseUrl,
|
|
35
31
|
});
|
|
36
|
-
const bootstrapHelper = new
|
|
32
|
+
const bootstrapHelper = new BootstrapFetcher({
|
|
37
33
|
baseUrl: bootstrapBaseUrl,
|
|
38
34
|
syncGroups: options.syncGroups,
|
|
39
35
|
instantModels: deriveInstantModels(schema),
|
|
40
36
|
getAuthToken: auth?.getAuthToken,
|
|
41
37
|
});
|
|
42
38
|
const database = new Database(modelRegistry, bootstrapHelper, {
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
//
|
|
39
|
+
// By default there is no browser-local durable store unless the caller asks
|
|
40
|
+
// for one. Node and edge runtimes always use the in-memory store because
|
|
41
|
+
// IndexedDB is unavailable there.
|
|
46
42
|
inMemory: shouldUseInMemoryPersistence(options),
|
|
47
43
|
});
|
|
48
|
-
const syncClient = new SyncClient(objectPool, database);
|
|
49
|
-
// Lazy-load lane: hydrates pool
|
|
50
|
-
// entities not in scope at bootstrap (`load: 'lazy'` models, or
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
const hydration = new
|
|
44
|
+
const syncClient = new SyncClient(objectPool, database, options.commitOutbox, url);
|
|
45
|
+
// Lazy-load lane: hydrates the object pool and IndexedDB on demand for
|
|
46
|
+
// entities not in scope at bootstrap (`load: 'lazy'` models, or an entity
|
|
47
|
+
// reached by deep link before the pool warmed up). Single-flight, with
|
|
48
|
+
// write-through to IndexedDB.
|
|
49
|
+
const hydration = new OnDemandLoader({
|
|
54
50
|
objectPool,
|
|
55
51
|
database,
|
|
56
52
|
registry: modelRegistry,
|
|
@@ -73,11 +69,10 @@ export function createInternalComponents(input) {
|
|
|
73
69
|
};
|
|
74
70
|
}
|
|
75
71
|
/**
|
|
76
|
-
*
|
|
77
|
-
* Models
|
|
78
|
-
*
|
|
79
|
-
* `
|
|
80
|
-
* mechanism. Default load strategy is `'instant'`.
|
|
72
|
+
* Derives the set of models to fetch in the initial bootstrap request from each
|
|
73
|
+
* model's load strategy. Models declared `load: 'lazy'` or `'manual'` are left
|
|
74
|
+
* out of the bootstrap and fetched on demand instead. The default strategy is
|
|
75
|
+
* `'instant'`, which includes the model.
|
|
81
76
|
*/
|
|
82
77
|
function deriveInstantModels(schema) {
|
|
83
78
|
const schemaModels = schema.models ?? schema;
|