@abloatai/ablo 0.25.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +5 -3
- package/CHANGELOG.md +34 -0
- package/README.md +104 -88
- package/dist/BaseSyncedStore.d.ts +140 -266
- package/dist/BaseSyncedStore.js +338 -739
- package/dist/Database.d.ts +62 -77
- package/dist/Database.js +106 -127
- package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
- package/dist/{ObjectPool.js → InstanceCache.js} +91 -83
- package/dist/LazyReferenceCollection.d.ts +11 -15
- package/dist/LazyReferenceCollection.js +16 -15
- package/dist/Model.d.ts +37 -52
- package/dist/Model.js +52 -69
- package/dist/ModelRegistry.d.ts +46 -25
- package/dist/ModelRegistry.js +32 -30
- package/dist/NetworkMonitor.d.ts +5 -6
- package/dist/NetworkMonitor.js +6 -7
- package/dist/SyncClient.d.ts +119 -109
- package/dist/SyncClient.js +303 -224
- package/dist/SyncEngineContext.d.ts +1 -3
- package/dist/SyncEngineContext.js +1 -2
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +9 -9
- package/dist/adapters/inMemoryStorage.js +9 -9
- package/dist/agent/Agent.d.ts +39 -31
- package/dist/agent/Agent.js +35 -23
- package/dist/agent/index.d.ts +4 -4
- package/dist/agent/index.js +5 -5
- package/dist/agent/session.d.ts +47 -44
- package/dist/agent/session.js +37 -48
- package/dist/agent/types.d.ts +26 -31
- package/dist/agent/types.js +6 -7
- package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
- package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
- package/dist/ai-sdk/coordinationContext.d.ts +46 -0
- package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +30 -31
- package/dist/ai-sdk/index.d.ts +25 -22
- package/dist/ai-sdk/index.js +25 -22
- package/dist/ai-sdk/wrap.d.ts +7 -8
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/credentialPolicy.d.ts +74 -71
- package/dist/auth/credentialPolicy.js +51 -56
- package/dist/auth/credentialSource.d.ts +7 -18
- package/dist/auth/credentialSource.js +10 -18
- package/dist/auth/index.d.ts +59 -58
- package/dist/auth/index.js +34 -40
- package/dist/auth/schemas.d.ts +5 -4
- package/dist/auth/schemas.js +5 -4
- package/dist/batching/index.d.ts +19 -21
- package/dist/batching/index.js +14 -17
- package/dist/cli.cjs +483 -369
- package/dist/client/Ablo.d.ts +107 -836
- package/dist/client/Ablo.js +174 -833
- package/dist/client/ApiClient.d.ts +44 -20
- package/dist/client/ApiClient.js +193 -44
- package/dist/client/auth.d.ts +51 -60
- package/dist/client/auth.js +137 -110
- package/dist/client/claimHeartbeatLoop.d.ts +50 -0
- package/dist/client/claimHeartbeatLoop.js +88 -0
- package/dist/client/consoleLogger.d.ts +35 -0
- package/dist/client/consoleLogger.js +44 -0
- package/dist/client/createInternalComponents.d.ts +14 -17
- package/dist/client/createInternalComponents.js +26 -31
- package/dist/client/createModelProxy.d.ts +130 -120
- package/dist/client/createModelProxy.js +158 -124
- package/dist/client/credentialEndpoint.d.ts +61 -0
- package/dist/client/credentialEndpoint.js +86 -0
- package/dist/client/functionalUpdate.d.ts +29 -27
- package/dist/client/functionalUpdate.js +21 -21
- package/dist/client/hostedEndpoints.d.ts +21 -0
- package/dist/client/hostedEndpoints.js +21 -0
- package/dist/client/httpClient.d.ts +58 -54
- package/dist/client/httpClient.js +29 -31
- package/dist/client/identity.d.ts +15 -20
- package/dist/client/identity.js +49 -59
- package/dist/client/modelRegistration.d.ts +10 -0
- package/dist/client/modelRegistration.js +301 -0
- package/dist/client/options.d.ts +373 -0
- package/dist/client/options.js +6 -0
- package/dist/client/registerDataSource.d.ts +9 -9
- package/dist/client/registerDataSource.js +15 -16
- package/dist/client/resourceTypes.d.ts +333 -0
- package/dist/client/resourceTypes.js +7 -0
- package/dist/client/schemaConfig.d.ts +44 -0
- package/dist/client/schemaConfig.js +176 -0
- package/dist/client/sessionMint.d.ts +17 -13
- package/dist/client/sessionMint.js +26 -31
- package/dist/client/validateAbloOptions.d.ts +12 -14
- package/dist/client/validateAbloOptions.js +9 -10
- package/dist/client/writeOptionsSchema.d.ts +18 -16
- package/dist/client/writeOptionsSchema.js +23 -20
- package/dist/client/wsMutationExecutor.d.ts +28 -0
- package/dist/client/wsMutationExecutor.js +71 -0
- package/dist/context.d.ts +6 -4
- package/dist/context.js +6 -7
- package/dist/coordination/index.d.ts +13 -4
- package/dist/coordination/index.js +29 -4
- package/dist/coordination/schema.d.ts +176 -128
- package/dist/coordination/schema.js +197 -133
- package/dist/coordination/trace.d.ts +9 -11
- package/dist/coordination/trace.js +13 -15
- package/dist/core/DatabaseManager.d.ts +5 -8
- package/dist/core/DatabaseManager.js +38 -40
- package/dist/core/QueryProcessor.d.ts +7 -9
- package/dist/core/QueryProcessor.js +27 -34
- package/dist/core/QueryView.d.ts +17 -5
- package/dist/core/QueryView.js +6 -7
- package/dist/core/StoreManager.d.ts +14 -16
- package/dist/core/StoreManager.js +26 -25
- package/dist/core/ViewRegistry.d.ts +5 -5
- package/dist/core/ViewRegistry.js +4 -4
- package/dist/core/index.d.ts +18 -13
- package/dist/core/index.js +32 -26
- package/dist/core/openIDBWithTimeout.d.ts +38 -36
- package/dist/core/openIDBWithTimeout.js +57 -54
- package/dist/core/queryUtils.d.ts +45 -0
- package/dist/core/queryUtils.js +69 -0
- package/dist/core/storeContract.d.ts +145 -0
- package/dist/core/storeContract.js +12 -0
- package/dist/environment.d.ts +28 -0
- package/dist/environment.js +21 -0
- package/dist/errorCodes.d.ts +118 -101
- package/dist/errorCodes.js +277 -260
- package/dist/errors.d.ts +170 -165
- package/dist/errors.js +161 -151
- package/dist/index.d.ts +30 -27
- package/dist/index.js +90 -82
- package/dist/interfaces/index.d.ts +108 -133
- package/dist/interfaces/index.js +5 -4
- package/dist/keys/index.d.ts +27 -29
- package/dist/keys/index.js +59 -49
- package/dist/mutators/RecordingTransaction.d.ts +16 -16
- package/dist/mutators/RecordingTransaction.js +31 -37
- package/dist/mutators/Transaction.d.ts +18 -26
- package/dist/mutators/Transaction.js +14 -20
- package/dist/mutators/UndoManager.d.ts +122 -131
- package/dist/mutators/UndoManager.js +149 -155
- package/dist/mutators/defineMutators.d.ts +24 -37
- package/dist/mutators/defineMutators.js +14 -20
- package/dist/mutators/inverseOp.d.ts +12 -15
- package/dist/mutators/inverseOp.js +12 -15
- package/dist/mutators/mutateActions.d.ts +10 -9
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +9 -8
- package/dist/mutators/readerActions.js +2 -2
- package/dist/mutators/undoApply.d.ts +31 -27
- package/dist/mutators/undoApply.js +26 -24
- package/dist/policy/index.d.ts +5 -3
- package/dist/policy/index.js +5 -3
- package/dist/policy/types.d.ts +105 -101
- package/dist/policy/types.js +67 -66
- package/dist/query/client.d.ts +32 -16
- package/dist/query/client.js +103 -72
- package/dist/query/types.d.ts +37 -60
- package/dist/query/types.js +13 -33
- package/dist/react/AbloProvider.d.ts +7 -11
- package/dist/react/AbloProvider.js +24 -17
- package/dist/react/context.d.ts +27 -146
- package/dist/react/context.js +9 -10
- package/dist/react/index.d.ts +41 -42
- package/dist/react/index.js +37 -38
- package/dist/react/internalContext.d.ts +17 -19
- package/dist/react/useAblo.d.ts +23 -22
- package/dist/react/useAblo.js +17 -15
- package/dist/react/useCurrentUserId.d.ts +8 -7
- package/dist/react/useCurrentUserId.js +8 -7
- package/dist/react/useErrorListener.d.ts +7 -7
- package/dist/react/useErrorListener.js +11 -12
- package/dist/react/useMutationFailureListener.d.ts +8 -8
- package/dist/react/useMutationFailureListener.js +9 -9
- package/dist/react/useMutators.d.ts +11 -11
- package/dist/react/useMutators.js +10 -4
- package/dist/react/useReactive.js +2 -3
- package/dist/react/useSyncStatus.d.ts +4 -6
- package/dist/react/useUndoScope.d.ts +7 -9
- package/dist/react/useUndoScope.js +3 -3
- package/dist/schema/coordination.d.ts +21 -25
- package/dist/schema/coordination.js +21 -25
- package/dist/schema/ddl.d.ts +43 -39
- package/dist/schema/ddl.js +75 -68
- package/dist/schema/ddlLock.d.ts +35 -0
- package/dist/schema/ddlLock.js +46 -0
- package/dist/schema/diff.d.ts +99 -61
- package/dist/schema/diff.js +43 -34
- package/dist/schema/field.d.ts +37 -42
- package/dist/schema/field.js +36 -49
- package/dist/schema/generate.d.ts +12 -12
- package/dist/schema/generate.js +12 -12
- package/dist/schema/index.d.ts +5 -4
- package/dist/schema/index.js +29 -21
- package/dist/schema/model.d.ts +121 -146
- package/dist/schema/model.js +24 -35
- package/dist/schema/openapi.d.ts +10 -9
- package/dist/schema/openapi.js +7 -1
- package/dist/schema/queries.d.ts +30 -32
- package/dist/schema/queries.js +24 -25
- package/dist/schema/relation.d.ts +89 -99
- package/dist/schema/relation.js +13 -13
- package/dist/schema/residency.d.ts +38 -0
- package/dist/schema/residency.js +30 -0
- package/dist/schema/roles.d.ts +45 -27
- package/dist/schema/roles.js +52 -21
- package/dist/schema/schema.d.ts +36 -45
- package/dist/schema/schema.js +42 -39
- package/dist/schema/select.d.ts +13 -13
- package/dist/schema/select.js +13 -13
- package/dist/schema/serialize.d.ts +36 -39
- package/dist/schema/serialize.js +27 -31
- package/dist/schema/sugar.d.ts +17 -32
- package/dist/schema/sugar.js +14 -29
- package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +27 -50
- package/dist/schema/syncDeltaRow.js +89 -0
- package/dist/schema/tenancy.d.ts +44 -46
- package/dist/schema/tenancy.js +46 -48
- package/dist/server/adapter.d.ts +58 -58
- package/dist/server/adapter.js +13 -14
- package/dist/server/commit.d.ts +60 -64
- package/dist/server/index.d.ts +9 -10
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +70 -0
- package/dist/server/readConfig.js +8 -0
- package/dist/server/storageMode.d.ts +23 -0
- package/dist/server/storageMode.js +17 -0
- package/dist/source/adapter.d.ts +31 -26
- package/dist/source/adapter.js +10 -10
- package/dist/source/adapters/drizzle.d.ts +28 -23
- package/dist/source/adapters/drizzle.js +34 -28
- package/dist/source/adapters/kysely.d.ts +27 -25
- package/dist/source/adapters/kysely.js +28 -26
- package/dist/source/adapters/memory.d.ts +8 -7
- package/dist/source/adapters/memory.js +10 -9
- package/dist/source/adapters/prisma.d.ts +13 -12
- package/dist/source/adapters/prisma.js +27 -29
- package/dist/source/conformance.d.ts +18 -11
- package/dist/source/conformance.js +27 -19
- package/dist/source/connector.d.ts +31 -32
- package/dist/source/connector.js +30 -28
- package/dist/source/connectorProtocol.d.ts +160 -0
- package/dist/source/connectorProtocol.js +162 -0
- package/dist/source/contract.d.ts +26 -27
- package/dist/source/contract.js +28 -29
- package/dist/source/factory.d.ts +94 -0
- package/dist/source/factory.js +268 -0
- package/dist/source/index.d.ts +10 -462
- package/dist/source/index.js +17 -421
- package/dist/source/migrations.d.ts +9 -9
- package/dist/source/migrations.js +9 -9
- package/dist/source/next.d.ts +10 -11
- package/dist/source/next.js +7 -8
- package/dist/source/pushQueue.d.ts +70 -48
- package/dist/source/pushQueue.js +36 -29
- package/dist/source/signing.d.ts +88 -0
- package/dist/source/signing.js +159 -0
- package/dist/source/types.d.ts +351 -0
- package/dist/source/types.js +43 -0
- package/dist/stores/ObjectStore.d.ts +11 -12
- package/dist/stores/ObjectStore.js +34 -35
- package/dist/stores/ObjectStoreContract.d.ts +12 -15
- package/dist/stores/SyncActionStore.d.ts +8 -12
- package/dist/stores/SyncActionStore.js +77 -46
- package/dist/surface.d.ts +28 -21
- package/dist/surface.js +28 -20
- package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +37 -45
- package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +101 -80
- package/dist/sync/ConnectionManager.d.ts +47 -50
- package/dist/sync/ConnectionManager.js +74 -70
- package/dist/sync/NetworkProbe.d.ts +27 -31
- package/dist/sync/NetworkProbe.js +67 -72
- package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +49 -36
- package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +79 -54
- package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +45 -59
- package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +44 -52
- package/dist/sync/SyncWebSocket.d.ts +175 -250
- package/dist/sync/SyncWebSocket.js +431 -769
- package/dist/sync/awaitClaimGrant.d.ts +18 -18
- package/dist/sync/awaitClaimGrant.js +38 -30
- package/dist/sync/bootstrapApply.d.ts +70 -0
- package/dist/sync/bootstrapApply.js +73 -0
- package/dist/sync/commitFrames.d.ts +44 -0
- package/dist/sync/commitFrames.js +94 -0
- package/dist/sync/createClaimStream.d.ts +23 -22
- package/dist/sync/createClaimStream.js +108 -25
- package/dist/sync/createPresenceStream.d.ts +19 -18
- package/dist/sync/createPresenceStream.js +25 -26
- package/dist/sync/createSnapshot.d.ts +13 -17
- package/dist/sync/createSnapshot.js +20 -26
- package/dist/sync/credentialLifecycle.d.ts +175 -0
- package/dist/sync/credentialLifecycle.js +322 -0
- package/dist/sync/deltaPipeline.d.ts +113 -0
- package/dist/sync/deltaPipeline.js +261 -0
- package/dist/sync/groupChange.d.ts +113 -0
- package/dist/sync/groupChange.js +242 -0
- package/dist/sync/heartbeat.d.ts +63 -0
- package/dist/sync/heartbeat.js +91 -0
- package/dist/sync/participants.d.ts +27 -27
- package/dist/sync/schemas.d.ts +3 -2
- package/dist/sync/schemas.js +14 -10
- package/dist/sync/syncCursor.d.ts +40 -0
- package/dist/sync/syncCursor.js +55 -0
- package/dist/sync/syncPlan.d.ts +54 -0
- package/dist/sync/syncPlan.js +50 -0
- package/dist/sync/syncPosition.d.ts +54 -49
- package/dist/sync/syncPosition.js +57 -52
- package/dist/sync/wsFrameHandlers.d.ts +116 -0
- package/dist/sync/wsFrameHandlers.js +374 -0
- package/dist/testing/fixtures/bootstrap.d.ts +21 -17
- package/dist/testing/fixtures/bootstrap.js +12 -6
- package/dist/testing/fixtures/deltas.d.ts +31 -34
- package/dist/testing/fixtures/deltas.js +30 -33
- package/dist/testing/fixtures/models.d.ts +11 -10
- package/dist/testing/fixtures/models.js +12 -10
- package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
- package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
- package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -18
- package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +14 -11
- package/dist/testing/helpers/wait.d.ts +13 -8
- package/dist/testing/helpers/wait.js +13 -8
- package/dist/testing/index.d.ts +4 -4
- package/dist/testing/index.js +3 -3
- package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
- package/dist/testing/mocks/MockMutationExecutor.js +15 -14
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
- package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
- package/dist/testing/mocks/MockSyncContext.d.ts +21 -34
- package/dist/testing/mocks/MockSyncContext.js +16 -45
- package/dist/testing/mocks/MockSyncStore.d.ts +14 -14
- package/dist/testing/mocks/MockSyncStore.js +11 -11
- package/dist/testing/mocks/MockWebSocket.d.ts +28 -24
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +190 -221
- package/dist/transactions/TransactionQueue.js +424 -822
- package/dist/transactions/TransactionStore.d.ts +20 -0
- package/dist/transactions/TransactionStore.js +53 -0
- package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
- package/dist/transactions/UnconfirmedWrites.js +104 -0
- package/dist/transactions/coalesceRules.d.ts +58 -0
- package/dist/transactions/coalesceRules.js +140 -0
- package/dist/transactions/commitPayload.d.ts +130 -0
- package/dist/transactions/commitPayload.js +143 -0
- package/dist/transactions/deltaConfirmation.d.ts +58 -0
- package/dist/transactions/deltaConfirmation.js +215 -0
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/replayValidation.d.ts +99 -0
- package/dist/transactions/replayValidation.js +111 -0
- package/dist/types/global.d.ts +46 -41
- package/dist/types/global.js +20 -19
- package/dist/types/index.d.ts +74 -80
- package/dist/types/index.js +22 -27
- package/dist/types/modelData.d.ts +10 -0
- package/dist/types/modelData.js +9 -0
- package/dist/types/participant.d.ts +20 -0
- package/dist/types/participant.js +10 -0
- package/dist/types/streams.d.ts +216 -209
- package/dist/types/streams.js +7 -7
- package/dist/utils/asyncIterator.d.ts +25 -32
- package/dist/utils/asyncIterator.js +25 -32
- package/dist/utils/duration.d.ts +12 -15
- package/dist/utils/duration.js +12 -15
- package/dist/utils/mobxSetup.d.ts +53 -0
- package/dist/utils/{mobx-setup.js → mobxSetup.js} +44 -100
- package/dist/webhooks/events.d.ts +21 -16
- package/dist/webhooks/events.js +10 -8
- package/dist/webhooks/index.d.ts +5 -7
- package/dist/webhooks/index.js +5 -7
- package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
- package/dist/wire/delta.js +114 -0
- package/dist/wire/errorEnvelope.d.ts +35 -27
- package/dist/wire/errorEnvelope.js +38 -32
- package/dist/wire/frames.d.ts +150 -67
- package/dist/wire/frames.js +48 -1
- package/dist/wire/index.d.ts +18 -13
- package/dist/wire/index.js +36 -13
- package/dist/wire/listEnvelope.d.ts +16 -23
- package/dist/wire/listEnvelope.js +7 -6
- package/dist/wire/protocol.d.ts +38 -0
- package/dist/wire/protocol.js +38 -0
- package/dist/wire/protocolVersion.d.ts +60 -0
- package/dist/wire/protocolVersion.js +67 -0
- package/docs/api-keys.md +4 -3
- package/docs/coordination.md +59 -0
- package/docs/examples/existing-python-backend.md +3 -3
- package/docs/identity.md +4 -4
- package/docs/integration-guide.md +1 -1
- package/docs/react.md +1 -1
- package/docs/sessions.md +5 -7
- package/package.json +24 -21
- package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
- package/dist/ai-sdk/coordination-context.d.ts +0 -52
- package/dist/client/index.d.ts +0 -36
- package/dist/client/index.js +0 -33
- package/dist/config/index.d.ts +0 -10
- package/dist/config/index.js +0 -12
- package/dist/core/query-utils.d.ts +0 -34
- package/dist/core/query-utils.js +0 -59
- package/dist/interfaces/headless.d.ts +0 -95
- package/dist/interfaces/headless.js +0 -41
- package/dist/query/index.d.ts +0 -6
- package/dist/query/index.js +0 -5
- package/dist/realtime/index.d.ts +0 -10
- package/dist/realtime/index.js +0 -9
- package/dist/schema/plane.d.ts +0 -23
- package/dist/schema/plane.js +0 -19
- package/dist/schema/sync-delta-row.js +0 -103
- package/dist/schema/sync-delta-wire.js +0 -102
- package/dist/server/next.d.ts +0 -51
- package/dist/server/next.js +0 -47
- package/dist/server/read-config.d.ts +0 -67
- package/dist/server/read-config.js +0 -8
- package/dist/server/storage-mode.d.ts +0 -1
- package/dist/server/storage-mode.js +0 -18
- package/dist/source/connector-protocol.d.ts +0 -159
- package/dist/source/connector-protocol.js +0 -161
- package/dist/sync/OfflineFlush.d.ts +0 -9
- package/dist/sync/OfflineFlush.js +0 -22
- package/dist/sync/OfflineTransactionStore.d.ts +0 -37
- package/dist/sync/OfflineTransactionStore.js +0 -263
- package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
- package/dist/transactions/OptimisticEchoTracker.js +0 -104
- package/dist/transactions/index.d.ts +0 -16
- package/dist/transactions/index.js +0 -7
- package/dist/transactions/mutation-error-handler.d.ts +0 -5
- package/dist/transactions/mutation-error-handler.js +0 -39
- package/dist/utils/mobx-setup.d.ts +0 -42
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The default `[Ablo]` console logger and its level resolution.
|
|
3
|
+
*
|
|
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.
|
|
6
|
+
*/
|
|
7
|
+
import type { SyncLogger } from '../interfaces/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Level threshold for the default console logger.
|
|
10
|
+
*
|
|
11
|
+
* The SDK emits a `debug` line per model and per property during schema
|
|
12
|
+
* registration (see `ModelRegistry`), plus assorted lifecycle chatter. That
|
|
13
|
+
* is verbose by design but carries no actionable signal for app consumers, so
|
|
14
|
+
* the default threshold is `warn` — `debug`/`info` are dropped unless a
|
|
15
|
+
* consumer opts in.
|
|
16
|
+
*
|
|
17
|
+
* Opt back in with `ABLO_LOG_LEVEL=debug` (or `info`/`warn`/`error`/`silent`).
|
|
18
|
+
* Passing a custom `logger` to `Ablo({ logger })` bypasses this entirely.
|
|
19
|
+
*/
|
|
20
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';
|
|
21
|
+
/**
|
|
22
|
+
* Resolve the effective level. Precedence: explicit `logLevel` option →
|
|
23
|
+
* `debug: true` (⇒ debug) → `ABLO_LOG_LEVEL` env → default `warn`. `debug: false`
|
|
24
|
+
* / omitted just means "don't raise the level" — it falls through to env/default
|
|
25
|
+
* rather than force-silencing an ops-set env override.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveLogLevel(opts?: {
|
|
28
|
+
debug?: boolean;
|
|
29
|
+
logLevel?: LogLevel;
|
|
30
|
+
}): LogLevel;
|
|
31
|
+
/**
|
|
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.
|
|
34
|
+
*/
|
|
35
|
+
export declare function createConsoleLogger(level: LogLevel): SyncLogger;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The default `[Ablo]` console logger and its level resolution.
|
|
3
|
+
*
|
|
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.
|
|
6
|
+
*/
|
|
7
|
+
const LOG_LEVEL_RANK = { debug: 10, info: 20, warn: 30, error: 40, silent: 99 };
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the effective level. Precedence: explicit `logLevel` option →
|
|
10
|
+
* `debug: true` (⇒ debug) → `ABLO_LOG_LEVEL` env → default `warn`. `debug: false`
|
|
11
|
+
* / omitted just means "don't raise the level" — it falls through to env/default
|
|
12
|
+
* rather than force-silencing an ops-set env override.
|
|
13
|
+
*/
|
|
14
|
+
export function resolveLogLevel(opts) {
|
|
15
|
+
if (opts?.logLevel && opts.logLevel in LOG_LEVEL_RANK)
|
|
16
|
+
return opts.logLevel;
|
|
17
|
+
if (opts?.debug === true)
|
|
18
|
+
return 'debug';
|
|
19
|
+
// `globalThis.process` guard keeps this safe in browser/edge runtimes that
|
|
20
|
+
// have no `process` binding — there we fall through to the default.
|
|
21
|
+
const raw = globalThis.process?.env?.ABLO_LOG_LEVEL;
|
|
22
|
+
const normalized = raw?.toLowerCase();
|
|
23
|
+
if (normalized && normalized in LOG_LEVEL_RANK)
|
|
24
|
+
return normalized;
|
|
25
|
+
return 'warn';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
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.
|
|
30
|
+
*/
|
|
31
|
+
export function createConsoleLogger(level) {
|
|
32
|
+
const threshold = LOG_LEVEL_RANK[level];
|
|
33
|
+
const emit = (lvl, fn, args) => {
|
|
34
|
+
if (typeof console === 'undefined' || LOG_LEVEL_RANK[lvl] < threshold)
|
|
35
|
+
return;
|
|
36
|
+
fn('[Ablo]', ...args);
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
debug: (...args) => { emit('debug', console.debug, args); },
|
|
40
|
+
info: (...args) => { emit('info', console.info, args); },
|
|
41
|
+
warn: (...args) => { emit('warn', console.warn, args); },
|
|
42
|
+
error: (...args) => { emit('error', console.error, args); },
|
|
43
|
+
};
|
|
44
|
+
}
|
|
@@ -1,28 +1,25 @@
|
|
|
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';
|
|
22
19
|
export interface InternalComponentsInput<S extends SchemaRecord> {
|
|
23
20
|
readonly schema: Schema<S>;
|
|
24
|
-
/** WebSocket URL
|
|
25
|
-
* caller
|
|
21
|
+
/** The WebSocket URL. Used to derive the bootstrap HTTP base URL when the
|
|
22
|
+
* caller has not overridden `bootstrapBaseUrl`. */
|
|
26
23
|
readonly url: string;
|
|
27
24
|
readonly options: {
|
|
28
25
|
readonly maxPoolSize?: number;
|
|
@@ -36,10 +33,10 @@ export interface InternalComponentsInput<S extends SchemaRecord> {
|
|
|
36
33
|
}
|
|
37
34
|
export interface InternalComponents {
|
|
38
35
|
readonly modelRegistry: ModelRegistry;
|
|
39
|
-
readonly objectPool:
|
|
40
|
-
readonly bootstrapHelper:
|
|
36
|
+
readonly objectPool: InstanceCache;
|
|
37
|
+
readonly bootstrapHelper: BootstrapFetcher;
|
|
41
38
|
readonly database: Database;
|
|
42
39
|
readonly syncClient: SyncClient;
|
|
43
|
-
readonly hydration:
|
|
40
|
+
readonly hydration: OnDemandLoader;
|
|
44
41
|
}
|
|
45
42
|
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
44
|
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
|
|
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,
|
|
@@ -62,7 +58,7 @@ export function createInternalComponents(input) {
|
|
|
62
58
|
// WebSocket delta stream keeps hydrated rows fresh so repeat reads serve
|
|
63
59
|
// pure-local with no network; after a drop, deltas may have been missed, so
|
|
64
60
|
// the next read of each query must re-confirm with the server once.
|
|
65
|
-
syncClient.on('sync:reconnecting', () => hydration.invalidate());
|
|
61
|
+
syncClient.on('sync:reconnecting', () => { hydration.invalidate(); });
|
|
66
62
|
return {
|
|
67
63
|
modelRegistry,
|
|
68
64
|
objectPool,
|
|
@@ -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;
|