@abloatai/ablo 0.35.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -2
- package/CHANGELOG.md +71 -1929
- package/NOTICE +2 -2
- package/README.md +23 -532
- package/assets/banner.png +0 -0
- package/dist/auth.d.ts +2 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +2 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +3 -0
- package/dist/client.js.map +1 -0
- package/dist/coordination.d.ts +2 -0
- package/dist/coordination.d.ts.map +1 -0
- package/dist/coordination.js +2 -0
- package/dist/coordination.js.map +1 -0
- package/dist/index.d.ts +3 -112
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -161
- package/dist/index.js.map +1 -0
- package/dist/react.d.ts +4 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +3 -0
- package/dist/react.js.map +1 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -0
- package/dist/source-conformance.d.ts +2 -0
- package/dist/source-conformance.d.ts.map +1 -0
- package/dist/source-conformance.js +2 -0
- package/dist/source-conformance.js.map +1 -0
- package/dist/source-drizzle.d.ts +2 -0
- package/dist/source-drizzle.d.ts.map +1 -0
- package/dist/source-drizzle.js +2 -0
- package/dist/source-drizzle.js.map +1 -0
- package/dist/source-kysely.d.ts +2 -0
- package/dist/source-kysely.d.ts.map +1 -0
- package/dist/source-kysely.js +2 -0
- package/dist/source-kysely.js.map +1 -0
- package/dist/source-next.d.ts +2 -0
- package/dist/source-next.d.ts.map +1 -0
- package/dist/source-next.js +2 -0
- package/dist/source-next.js.map +1 -0
- package/dist/source.d.ts +2 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +2 -0
- package/dist/source.js.map +1 -0
- package/dist/wire.d.ts +2 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +2 -0
- package/dist/wire.js.map +1 -0
- package/docs/agents.md +2 -2
- package/docs/api-keys.md +13 -12
- package/docs/api.md +15 -53
- package/docs/audit.md +4 -3
- package/docs/cli.md +11 -11
- package/docs/client-behavior.md +9 -9
- package/docs/concurrency-convention.md +28 -42
- package/docs/coordination.md +228 -86
- package/docs/data-sources.md +5 -5
- package/docs/debugging.md +34 -12
- package/docs/deployment.md +8 -8
- package/docs/examples/agent-human.md +4 -4
- package/docs/examples/ai-sdk-tool.md +1 -1
- package/docs/examples/existing-python-backend.md +15 -4
- package/docs/examples/nextjs.md +27 -6
- package/docs/examples/scoped-agent.md +3 -3
- package/docs/examples/server-agent.md +2 -2
- package/docs/groups.md +57 -3
- package/docs/guarantees.md +37 -10
- package/docs/how-it-works.md +32 -8
- package/docs/idempotency.md +6 -6
- package/docs/identity.md +24 -24
- package/docs/index.md +8 -8
- package/docs/integration-guide.md +38 -16
- package/docs/internal/README.md +18 -0
- package/docs/internal/agent-fleet-coordination-design.md +171 -0
- package/docs/internal/agent-orchestration.md +58 -0
- package/docs/internal/commit-identifiers.md +91 -0
- package/docs/internal/concurrency-open-decisions.md +37 -0
- package/docs/internal/data-source-reverse-channel.md +150 -0
- package/docs/internal/per-field-conflict-detection.md +165 -0
- package/docs/internal/postgres-replication.md +64 -0
- package/docs/internal/serializable-schema.md +119 -0
- package/docs/internal/structure.md +32 -0
- package/docs/mcp.md +9 -9
- package/docs/migration.md +37 -18
- package/docs/projects.md +1 -1
- package/docs/quickstart.md +2 -2
- package/docs/react.md +24 -13
- package/docs/schema-contract.md +3 -3
- package/docs/sessions.md +91 -37
- package/docs/webhooks.md +9 -9
- package/examples/README.md +2 -2
- package/examples/data-source/README.md +1 -1
- package/examples/data-source/ablo-driver.ts +1 -1
- package/examples/data-source/customer-server.ts +1 -1
- package/examples/data-source/run.ts +1 -1
- package/examples/data-source/schema.ts +1 -1
- package/examples/quickstart.ts +2 -2
- package/llms.txt +12 -12
- package/package.json +64 -174
- package/dist/BaseSyncedStore.d.ts +0 -823
- package/dist/BaseSyncedStore.js +0 -1955
- package/dist/Database.d.ts +0 -335
- package/dist/Database.js +0 -1500
- package/dist/InstanceCache.d.ts +0 -233
- package/dist/InstanceCache.js +0 -1164
- package/dist/LazyReferenceCollection.d.ts +0 -177
- package/dist/LazyReferenceCollection.js +0 -461
- package/dist/Model.d.ts +0 -444
- package/dist/Model.js +0 -909
- package/dist/ModelRegistry.d.ts +0 -221
- package/dist/ModelRegistry.js +0 -537
- package/dist/NetworkMonitor.d.ts +0 -26
- package/dist/NetworkMonitor.js +0 -77
- package/dist/RuntimeContext.d.ts +0 -52
- package/dist/RuntimeContext.js +0 -80
- package/dist/SyncClient.d.ts +0 -551
- package/dist/SyncClient.js +0 -2199
- package/dist/adapters/alwaysOnline.d.ts +0 -14
- package/dist/adapters/alwaysOnline.js +0 -17
- package/dist/adapters/inMemoryStorage.d.ts +0 -31
- package/dist/adapters/inMemoryStorage.js +0 -110
- package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
- package/dist/ai-sdk/coordinatedTool.js +0 -134
- package/dist/ai-sdk/coordinationContext.d.ts +0 -46
- package/dist/ai-sdk/coordinationContext.js +0 -106
- package/dist/ai-sdk/index.d.ts +0 -121
- package/dist/ai-sdk/index.js +0 -121
- package/dist/ai-sdk/wrap.d.ts +0 -65
- package/dist/ai-sdk/wrap.js +0 -39
- package/dist/auth/index.d.ts +0 -1
- package/dist/auth/index.js +0 -8
- package/dist/batching/index.d.ts +0 -55
- package/dist/batching/index.js +0 -147
- package/dist/cli.cjs +0 -288600
- package/dist/client/Ablo.d.ts +0 -231
- package/dist/client/Ablo.js +0 -149
- package/dist/client/abloClient.d.ts +0 -309
- package/dist/client/abloClient.js +0 -13
- package/dist/client/clientPrelude.d.ts +0 -52
- package/dist/client/clientPrelude.js +0 -60
- package/dist/client/consoleLogger.d.ts +0 -35
- package/dist/client/consoleLogger.js +0 -44
- package/dist/client/coreClient.d.ts +0 -60
- package/dist/client/coreClient.js +0 -118
- package/dist/client/createInternalComponents.d.ts +0 -46
- package/dist/client/createInternalComponents.js +0 -92
- package/dist/client/createModelProxy.d.ts +0 -228
- package/dist/client/createModelProxy.js +0 -818
- package/dist/client/humans.d.ts +0 -48
- package/dist/client/humans.js +0 -52
- package/dist/client/modelRegistration.d.ts +0 -10
- package/dist/client/modelRegistration.js +0 -312
- package/dist/client/options.d.ts +0 -461
- package/dist/client/options.js +0 -7
- package/dist/client/reactiveEngine.d.ts +0 -48
- package/dist/client/reactiveEngine.js +0 -910
- package/dist/client/resourceTypes.d.ts +0 -12
- package/dist/client/resourceTypes.js +0 -10
- package/dist/client/schemaConfig.d.ts +0 -44
- package/dist/client/schemaConfig.js +0 -185
- package/dist/client/validateAbloOptions.d.ts +0 -42
- package/dist/client/validateAbloOptions.js +0 -43
- package/dist/client/wsMutationExecutor.d.ts +0 -27
- package/dist/client/wsMutationExecutor.js +0 -72
- package/dist/context.d.ts +0 -29
- package/dist/context.js +0 -58
- package/dist/coordination/ClaimLog.d.ts +0 -26
- package/dist/coordination/ClaimLog.js +0 -32
- package/dist/coordination/index.d.ts +0 -1
- package/dist/coordination/index.js +0 -8
- package/dist/core/DatabaseManager.d.ts +0 -105
- package/dist/core/DatabaseManager.js +0 -387
- package/dist/core/QueryProcessor.d.ts +0 -75
- package/dist/core/QueryProcessor.js +0 -255
- package/dist/core/QueryView.d.ts +0 -79
- package/dist/core/QueryView.js +0 -218
- package/dist/core/StoreManager.d.ts +0 -112
- package/dist/core/StoreManager.js +0 -302
- package/dist/core/ViewRegistry.d.ts +0 -20
- package/dist/core/ViewRegistry.js +0 -55
- package/dist/core/index.d.ts +0 -33
- package/dist/core/index.js +0 -48
- package/dist/core/openIDBWithTimeout.d.ts +0 -65
- package/dist/core/openIDBWithTimeout.js +0 -153
- package/dist/core/queryUtils.d.ts +0 -45
- package/dist/core/queryUtils.js +0 -69
- package/dist/core/storeContract.d.ts +0 -145
- package/dist/core/storeContract.js +0 -12
- package/dist/docs/catalog.d.ts +0 -72
- package/dist/docs/catalog.js +0 -227
- package/dist/docs/index.d.ts +0 -10
- package/dist/docs/index.js +0 -10
- package/dist/environment.d.ts +0 -1
- package/dist/environment.js +0 -8
- package/dist/interfaces/index.d.ts +0 -311
- package/dist/interfaces/index.js +0 -9
- package/dist/keys/index.d.ts +0 -1
- package/dist/keys/index.js +0 -8
- package/dist/mutators/RecordingMutation.d.ts +0 -36
- package/dist/mutators/RecordingMutation.js +0 -182
- package/dist/mutators/Transaction.d.ts +0 -40
- package/dist/mutators/Transaction.js +0 -58
- package/dist/mutators/UndoManager.d.ts +0 -258
- package/dist/mutators/UndoManager.js +0 -658
- package/dist/mutators/defineMutators.d.ts +0 -60
- package/dist/mutators/defineMutators.js +0 -18
- package/dist/mutators/inverseOp.d.ts +0 -126
- package/dist/mutators/inverseOp.js +0 -71
- package/dist/mutators/mutateActions.d.ts +0 -45
- package/dist/mutators/mutateActions.js +0 -105
- package/dist/mutators/readerActions.d.ts +0 -33
- package/dist/mutators/readerActions.js +0 -57
- package/dist/mutators/undoApply.d.ts +0 -51
- package/dist/mutators/undoApply.js +0 -117
- package/dist/policy/index.d.ts +0 -21
- package/dist/policy/index.js +0 -20
- package/dist/query/client.d.ts +0 -61
- package/dist/query/client.js +0 -137
- package/dist/query/types.d.ts +0 -85
- package/dist/query/types.js +0 -16
- package/dist/react/AbloProvider.d.ts +0 -230
- package/dist/react/AbloProvider.js +0 -455
- package/dist/react/ClientSideSuspense.d.ts +0 -36
- package/dist/react/ClientSideSuspense.js +0 -17
- package/dist/react/DefaultFallback.d.ts +0 -24
- package/dist/react/DefaultFallback.js +0 -43
- package/dist/react/context.d.ts +0 -55
- package/dist/react/context.js +0 -29
- package/dist/react/index.d.ts +0 -61
- package/dist/react/index.js +0 -66
- package/dist/react/internalContext.d.ts +0 -33
- package/dist/react/internalContext.js +0 -3
- package/dist/react/useAblo.d.ts +0 -75
- package/dist/react/useAblo.js +0 -102
- package/dist/react/useCurrentUserId.d.ts +0 -22
- package/dist/react/useCurrentUserId.js +0 -34
- package/dist/react/useErrorListener.d.ts +0 -20
- package/dist/react/useErrorListener.js +0 -38
- package/dist/react/useMutationFailureListener.d.ts +0 -26
- package/dist/react/useMutationFailureListener.js +0 -38
- package/dist/react/useMutators.d.ts +0 -56
- package/dist/react/useMutators.js +0 -84
- package/dist/react/useReactive.d.ts +0 -35
- package/dist/react/useReactive.js +0 -123
- package/dist/react/useSyncStatus.d.ts +0 -59
- package/dist/react/useSyncStatus.js +0 -76
- package/dist/react/useUndoScope.d.ts +0 -34
- package/dist/react/useUndoScope.js +0 -81
- package/dist/schema/coordination.d.ts +0 -112
- package/dist/schema/coordination.js +0 -129
- package/dist/schema/ddl.d.ts +0 -97
- package/dist/schema/ddl.js +0 -491
- package/dist/schema/ddlLock.d.ts +0 -35
- package/dist/schema/ddlLock.js +0 -46
- package/dist/schema/diff.d.ts +0 -225
- package/dist/schema/diff.js +0 -289
- package/dist/schema/generate.d.ts +0 -19
- package/dist/schema/generate.js +0 -86
- package/dist/schema/index.d.ts +0 -41
- package/dist/schema/index.js +0 -76
- package/dist/schema/queries.d.ts +0 -201
- package/dist/schema/queries.js +0 -144
- package/dist/schema/select.d.ts +0 -40
- package/dist/schema/select.js +0 -87
- package/dist/schema/serialize.d.ts +0 -115
- package/dist/schema/serialize.js +0 -262
- package/dist/schema/sugar.d.ts +0 -109
- package/dist/schema/sugar.js +0 -83
- package/dist/schema/syncDeltaRow.d.ts +0 -6
- package/dist/schema/syncDeltaRow.js +0 -6
- package/dist/server/adapter.d.ts +0 -173
- package/dist/server/adapter.js +0 -18
- package/dist/server/commit.d.ts +0 -107
- package/dist/server/commit.js +0 -1
- package/dist/server/index.d.ts +0 -14
- package/dist/server/index.js +0 -2
- package/dist/server/readConfig.d.ts +0 -80
- package/dist/server/readConfig.js +0 -8
- package/dist/server/storageMode.d.ts +0 -23
- package/dist/server/storageMode.js +0 -17
- package/dist/source/adapter.d.ts +0 -81
- package/dist/source/adapter.js +0 -22
- package/dist/source/adapters/drizzle.d.ts +0 -48
- package/dist/source/adapters/drizzle.js +0 -219
- package/dist/source/adapters/kysely.d.ts +0 -42
- package/dist/source/adapters/kysely.js +0 -205
- package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
- package/dist/source/adapters/kyselyMutationCore.js +0 -125
- package/dist/source/adapters/memory.d.ts +0 -13
- package/dist/source/adapters/memory.js +0 -130
- package/dist/source/adapters/prisma.d.ts +0 -63
- package/dist/source/adapters/prisma.js +0 -202
- package/dist/source/conformance.d.ts +0 -37
- package/dist/source/conformance.js +0 -215
- package/dist/source/connector.d.ts +0 -95
- package/dist/source/connector.js +0 -266
- package/dist/source/connectorProtocol.d.ts +0 -154
- package/dist/source/connectorProtocol.js +0 -163
- package/dist/source/contract.d.ts +0 -195
- package/dist/source/contract.js +0 -164
- package/dist/source/factory.d.ts +0 -92
- package/dist/source/factory.js +0 -286
- package/dist/source/footprint.d.ts +0 -111
- package/dist/source/footprint.js +0 -0
- package/dist/source/idempotency.d.ts +0 -61
- package/dist/source/idempotency.js +0 -144
- package/dist/source/index.d.ts +0 -23
- package/dist/source/index.js +0 -30
- package/dist/source/migrations.d.ts +0 -21
- package/dist/source/migrations.js +0 -103
- package/dist/source/next.d.ts +0 -32
- package/dist/source/next.js +0 -25
- package/dist/source/pushQueue.d.ts +0 -134
- package/dist/source/pushQueue.js +0 -256
- package/dist/source/signing.d.ts +0 -92
- package/dist/source/signing.js +0 -162
- package/dist/source/types.d.ts +0 -401
- package/dist/source/types.js +0 -59
- package/dist/stores/ObjectStore.d.ts +0 -115
- package/dist/stores/ObjectStore.js +0 -393
- package/dist/stores/ObjectStoreContract.d.ts +0 -38
- package/dist/stores/ObjectStoreContract.js +0 -1
- package/dist/stores/SyncActionStore.d.ts +0 -97
- package/dist/stores/SyncActionStore.js +0 -504
- package/dist/stores/syncAction.d.ts +0 -26
- package/dist/stores/syncAction.js +0 -16
- package/dist/surface.d.ts +0 -36
- package/dist/surface.js +0 -75
- package/dist/sync/BootstrapFetcher.d.ts +0 -280
- package/dist/sync/BootstrapFetcher.js +0 -962
- package/dist/sync/ConnectionManager.d.ts +0 -8
- package/dist/sync/ConnectionManager.js +0 -8
- package/dist/sync/OnDemandLoader.d.ts +0 -228
- package/dist/sync/OnDemandLoader.js +0 -742
- package/dist/sync/SubscriptionManager.d.ts +0 -159
- package/dist/sync/SubscriptionManager.js +0 -243
- package/dist/sync/SyncWebSocket.d.ts +0 -173
- package/dist/sync/SyncWebSocket.js +0 -438
- package/dist/sync/awaitClaimGrant.d.ts +0 -6
- package/dist/sync/awaitClaimGrant.js +0 -6
- package/dist/sync/bootstrapApply.d.ts +0 -70
- package/dist/sync/bootstrapApply.js +0 -73
- package/dist/sync/commitFrames.d.ts +0 -8
- package/dist/sync/commitFrames.js +0 -8
- package/dist/sync/contextPorts.d.ts +0 -18
- package/dist/sync/contextPorts.js +0 -31
- package/dist/sync/createClaimStream.d.ts +0 -7
- package/dist/sync/createClaimStream.js +0 -7
- package/dist/sync/createPresenceStream.d.ts +0 -69
- package/dist/sync/createPresenceStream.js +0 -200
- package/dist/sync/createSnapshot.d.ts +0 -29
- package/dist/sync/createSnapshot.js +0 -118
- package/dist/sync/credentialLifecycle.d.ts +0 -7
- package/dist/sync/credentialLifecycle.js +0 -7
- package/dist/sync/deltaPipeline.d.ts +0 -113
- package/dist/sync/deltaPipeline.js +0 -261
- package/dist/sync/groupChange.d.ts +0 -113
- package/dist/sync/groupChange.js +0 -242
- package/dist/sync/participants.d.ts +0 -115
- package/dist/sync/participants.js +0 -344
- package/dist/sync/persistedPrefix.d.ts +0 -12
- package/dist/sync/persistedPrefix.js +0 -22
- package/dist/sync/schemaDrift.d.ts +0 -55
- package/dist/sync/schemaDrift.js +0 -53
- package/dist/sync/schemas.d.ts +0 -70
- package/dist/sync/schemas.js +0 -94
- package/dist/sync/syncCursor.d.ts +0 -40
- package/dist/sync/syncCursor.js +0 -55
- package/dist/sync/syncPlan.d.ts +0 -54
- package/dist/sync/syncPlan.js +0 -50
- package/dist/sync/wsFrameHandlers.d.ts +0 -8
- package/dist/sync/wsFrameHandlers.js +0 -8
- package/dist/testing/fixtures/bootstrap.d.ts +0 -49
- package/dist/testing/fixtures/bootstrap.js +0 -59
- package/dist/testing/fixtures/deltas.d.ts +0 -83
- package/dist/testing/fixtures/deltas.js +0 -136
- package/dist/testing/fixtures/httpResponses.d.ts +0 -70
- package/dist/testing/fixtures/httpResponses.js +0 -90
- package/dist/testing/fixtures/models.d.ts +0 -83
- package/dist/testing/fixtures/models.js +0 -272
- package/dist/testing/helpers/reactWrapper.d.ts +0 -69
- package/dist/testing/helpers/reactWrapper.js +0 -67
- package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
- package/dist/testing/helpers/syncEngineHarness.js +0 -73
- package/dist/testing/helpers/wait.d.ts +0 -30
- package/dist/testing/helpers/wait.js +0 -49
- package/dist/testing/index.d.ts +0 -23
- package/dist/testing/index.js +0 -33
- package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
- package/dist/testing/mocks/FakeDatabase.js +0 -10
- package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
- package/dist/testing/mocks/MockMutationExecutor.js +0 -186
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
- package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
- package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
- package/dist/testing/mocks/MockSyncContext.js +0 -72
- package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
- package/dist/testing/mocks/MockSyncStore.js +0 -171
- package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
- package/dist/testing/mocks/MockWebSocket.js +0 -118
- package/dist/transaction/ablo.d.ts +0 -88
- package/dist/transaction/ablo.js +0 -33
- package/dist/transaction/auth/apiKey.d.ts +0 -152
- package/dist/transaction/auth/apiKey.js +0 -419
- package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
- package/dist/transaction/auth/bootstrapScope.js +0 -1
- package/dist/transaction/auth/capability.d.ts +0 -177
- package/dist/transaction/auth/capability.js +0 -199
- package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
- package/dist/transaction/auth/credentialEndpoint.js +0 -86
- package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
- package/dist/transaction/auth/credentialPolicy.js +0 -125
- package/dist/transaction/auth/credentialSource.d.ts +0 -30
- package/dist/transaction/auth/credentialSource.js +0 -55
- package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
- package/dist/transaction/auth/hostedEndpoints.js +0 -21
- package/dist/transaction/auth/identity.d.ts +0 -55
- package/dist/transaction/auth/identity.js +0 -210
- package/dist/transaction/auth/index.d.ts +0 -162
- package/dist/transaction/auth/index.js +0 -304
- package/dist/transaction/auth/schemas.d.ts +0 -59
- package/dist/transaction/auth/schemas.js +0 -85
- package/dist/transaction/auth/sessionMint.d.ts +0 -28
- package/dist/transaction/auth/sessionMint.js +0 -85
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -49
- package/dist/transaction/coordination/awaitClaimGrant.js +0 -112
- package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -50
- package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -88
- package/dist/transaction/coordination/claimMeta.d.ts +0 -49
- package/dist/transaction/coordination/claimMeta.js +0 -52
- package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
- package/dist/transaction/coordination/createClaimStream.js +0 -475
- package/dist/transaction/coordination/events.d.ts +0 -74
- package/dist/transaction/coordination/events.js +0 -7
- package/dist/transaction/coordination/index.d.ts +0 -19
- package/dist/transaction/coordination/index.js +0 -44
- package/dist/transaction/coordination/locator.d.ts +0 -83
- package/dist/transaction/coordination/locator.js +0 -82
- package/dist/transaction/coordination/schema.d.ts +0 -1473
- package/dist/transaction/coordination/schema.js +0 -1013
- package/dist/transaction/coordination/targetConflict.d.ts +0 -2
- package/dist/transaction/coordination/targetConflict.js +0 -103
- package/dist/transaction/coordination/trace.d.ts +0 -78
- package/dist/transaction/coordination/trace.js +0 -138
- package/dist/transaction/durableWrites.d.ts +0 -62
- package/dist/transaction/durableWrites.js +0 -71
- package/dist/transaction/environment.d.ts +0 -105
- package/dist/transaction/environment.js +0 -108
- package/dist/transaction/errorCodes.d.ts +0 -403
- package/dist/transaction/errorCodes.js +0 -480
- package/dist/transaction/errors.d.ts +0 -428
- package/dist/transaction/errors.js +0 -686
- package/dist/transaction/index.d.ts +0 -20
- package/dist/transaction/index.js +0 -20
- package/dist/transaction/keys/index.d.ts +0 -87
- package/dist/transaction/keys/index.js +0 -207
- package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
- package/dist/transaction/log/syncDeltaRow.js +0 -95
- package/dist/transaction/logPosition.d.ts +0 -97
- package/dist/transaction/logPosition.js +0 -125
- package/dist/transaction/logger.d.ts +0 -16
- package/dist/transaction/logger.js +0 -7
- package/dist/transaction/observability.d.ts +0 -53
- package/dist/transaction/observability.js +0 -19
- package/dist/transaction/persistence.d.ts +0 -12
- package/dist/transaction/persistence.js +0 -11
- package/dist/transaction/plugin.d.ts +0 -192
- package/dist/transaction/plugin.js +0 -87
- package/dist/transaction/policy/types.d.ts +0 -217
- package/dist/transaction/policy/types.js +0 -126
- package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
- package/dist/transaction/resources/functionalUpdate.js +0 -87
- package/dist/transaction/resources/httpResources.d.ts +0 -266
- package/dist/transaction/resources/httpResources.js +0 -7
- package/dist/transaction/resources/modelOperations.d.ts +0 -319
- package/dist/transaction/resources/modelOperations.js +0 -12
- package/dist/transaction/resources/mutationOptions.d.ts +0 -66
- package/dist/transaction/resources/mutationOptions.js +0 -9
- package/dist/transaction/resources/where.d.ts +0 -85
- package/dist/transaction/resources/where.js +0 -70
- package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
- package/dist/transaction/resources/writeOptionsSchema.js +0 -73
- package/dist/transaction/schema/field.d.ts +0 -126
- package/dist/transaction/schema/field.js +0 -265
- package/dist/transaction/schema/loadStrategy.d.ts +0 -45
- package/dist/transaction/schema/loadStrategy.js +0 -46
- package/dist/transaction/schema/model.d.ts +0 -379
- package/dist/transaction/schema/model.js +0 -123
- package/dist/transaction/schema/openapi.d.ts +0 -57
- package/dist/transaction/schema/openapi.js +0 -340
- package/dist/transaction/schema/relation.d.ts +0 -199
- package/dist/transaction/schema/relation.js +0 -104
- package/dist/transaction/schema/residency.d.ts +0 -29
- package/dist/transaction/schema/residency.js +0 -25
- package/dist/transaction/schema/roles.d.ts +0 -249
- package/dist/transaction/schema/roles.js +0 -230
- package/dist/transaction/schema/schema.d.ts +0 -324
- package/dist/transaction/schema/schema.js +0 -305
- package/dist/transaction/schema/tenancy.d.ts +0 -139
- package/dist/transaction/schema/tenancy.js +0 -190
- package/dist/transaction/transactionLayer.d.ts +0 -82
- package/dist/transaction/transactionLayer.js +0 -24
- package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
- package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
- package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
- package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
- package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
- package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
- package/dist/transaction/transport/commitFrames.d.ts +0 -90
- package/dist/transaction/transport/commitFrames.js +0 -134
- package/dist/transaction/transport/connectionManager.d.ts +0 -215
- package/dist/transaction/transport/connectionManager.js +0 -673
- package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
- package/dist/transaction/transport/credentialLifecycle.js +0 -324
- package/dist/transaction/transport/heartbeat.d.ts +0 -65
- package/dist/transaction/transport/heartbeat.js +0 -93
- package/dist/transaction/transport/httpClient.d.ts +0 -123
- package/dist/transaction/transport/httpClient.js +0 -145
- package/dist/transaction/transport/httpOptions.d.ts +0 -33
- package/dist/transaction/transport/httpOptions.js +0 -12
- package/dist/transaction/transport/httpTransport.d.ts +0 -8
- package/dist/transaction/transport/httpTransport.js +0 -1276
- package/dist/transaction/transport/networkProbe.d.ts +0 -84
- package/dist/transaction/transport/networkProbe.js +0 -207
- package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
- package/dist/transaction/transport/wsFrameHandlers.js +0 -429
- package/dist/transaction/transport/wsTransport.d.ts +0 -576
- package/dist/transaction/transport/wsTransport.js +0 -1017
- package/dist/transaction/types/assertExact.d.ts +0 -17
- package/dist/transaction/types/assertExact.js +0 -1
- package/dist/transaction/types/global.d.ts +0 -107
- package/dist/transaction/types/global.js +0 -40
- package/dist/transaction/types/index.d.ts +0 -205
- package/dist/transaction/types/index.js +0 -56
- package/dist/transaction/types/modelData.d.ts +0 -10
- package/dist/transaction/types/modelData.js +0 -9
- package/dist/transaction/types/participant.d.ts +0 -20
- package/dist/transaction/types/participant.js +0 -10
- package/dist/transaction/types/streams.d.ts +0 -540
- package/dist/transaction/types/streams.js +0 -11
- package/dist/transaction/utils/asyncIterator.d.ts +0 -34
- package/dist/transaction/utils/asyncIterator.js +0 -135
- package/dist/transaction/utils/duration.d.ts +0 -25
- package/dist/transaction/utils/duration.js +0 -45
- package/dist/transaction/utils/json.d.ts +0 -57
- package/dist/transaction/utils/json.js +0 -276
- package/dist/transaction/wire/accountResponses.d.ts +0 -351
- package/dist/transaction/wire/accountResponses.js +0 -255
- package/dist/transaction/wire/auth.d.ts +0 -49
- package/dist/transaction/wire/auth.js +0 -57
- package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
- package/dist/transaction/wire/bootstrapReason.js +0 -8
- package/dist/transaction/wire/claimEvent.d.ts +0 -76
- package/dist/transaction/wire/claimEvent.js +0 -73
- package/dist/transaction/wire/claims.d.ts +0 -463
- package/dist/transaction/wire/claims.js +0 -229
- package/dist/transaction/wire/commit.d.ts +0 -603
- package/dist/transaction/wire/commit.js +0 -321
- package/dist/transaction/wire/delta.d.ts +0 -250
- package/dist/transaction/wire/delta.js +0 -147
- package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
- package/dist/transaction/wire/errorEnvelope.js +0 -123
- package/dist/transaction/wire/feedCursor.d.ts +0 -60
- package/dist/transaction/wire/feedCursor.js +0 -82
- package/dist/transaction/wire/feedEvent.d.ts +0 -177
- package/dist/transaction/wire/feedEvent.js +0 -39
- package/dist/transaction/wire/frames.d.ts +0 -194
- package/dist/transaction/wire/frames.js +0 -50
- package/dist/transaction/wire/inboundFrames.d.ts +0 -552
- package/dist/transaction/wire/inboundFrames.js +0 -116
- package/dist/transaction/wire/index.d.ts +0 -50
- package/dist/transaction/wire/index.js +0 -74
- package/dist/transaction/wire/listEnvelope.d.ts +0 -37
- package/dist/transaction/wire/listEnvelope.js +0 -42
- package/dist/transaction/wire/modelResponses.d.ts +0 -85
- package/dist/transaction/wire/modelResponses.js +0 -43
- package/dist/transaction/wire/protocol.d.ts +0 -38
- package/dist/transaction/wire/protocol.js +0 -38
- package/dist/transaction/wire/protocolVersion.d.ts +0 -73
- package/dist/transaction/wire/protocolVersion.js +0 -83
- package/dist/transactions/mutations/MutationQueue.d.ts +0 -655
- package/dist/transactions/mutations/MutationQueue.js +0 -2797
- package/dist/transactions/mutations/MutationStore.d.ts +0 -20
- package/dist/transactions/mutations/MutationStore.js +0 -53
- package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
- package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
- package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
- package/dist/transactions/mutations/coalesceRules.js +0 -140
- package/dist/transactions/mutations/commitLatency.d.ts +0 -52
- package/dist/transactions/mutations/commitLatency.js +0 -130
- package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
- package/dist/transactions/mutations/commitOutboxStore.js +0 -26
- package/dist/transactions/mutations/commitPayload.d.ts +0 -164
- package/dist/transactions/mutations/commitPayload.js +0 -152
- package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -59
- package/dist/transactions/mutations/deltaConfirmation.js +0 -233
- package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
- package/dist/transactions/mutations/durableWriteStore.js +0 -12
- package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
- package/dist/transactions/mutations/optimisticApply.js +0 -65
- package/dist/transactions/mutations/replayValidation.d.ts +0 -186
- package/dist/transactions/mutations/replayValidation.js +0 -163
- package/dist/utils/mobxSetup.d.ts +0 -53
- package/dist/utils/mobxSetup.js +0 -330
- package/dist/webhooks/events.d.ts +0 -43
- package/dist/webhooks/events.js +0 -42
- package/dist/webhooks/index.d.ts +0 -8
- package/dist/webhooks/index.js +0 -8
- package/dist/wire/index.d.ts +0 -1
- package/dist/wire/index.js +0 -8
- package/docs/interaction-model.md +0 -99
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The core client over the socket: the stateless surface plus the live feed
|
|
3
|
-
* (ADR 0016). `Ablo({ ..., plugins: [] })` returns this — the empty list says
|
|
4
|
-
* it plainly: nothing beyond the core. Reads and writes travel over
|
|
5
|
-
* request-response, exactly as they do for the `transport: 'http'` client;
|
|
6
|
-
* the socket adds push — deltas, presence frames, and the claim lifecycle
|
|
7
|
-
* (granted, queued, lost) — without a local copy of anything.
|
|
8
|
-
*
|
|
9
|
-
* This is the membership test made constructible: a caller with no socket
|
|
10
|
-
* loses only push, and polls instead; a caller with this client gets the
|
|
11
|
-
* push back and still never holds a store it did not ask for. It also
|
|
12
|
-
* satisfies the core coordination ports structurally — `awaitClaimGrant`
|
|
13
|
-
* needs only `subscribe`, which this client has.
|
|
14
|
-
*/
|
|
15
|
-
import { createAbloHttpClient, } from '../transaction/transport/httpClient.js';
|
|
16
|
-
import { WsTransport } from '../transaction/transport/wsTransport.js';
|
|
17
|
-
import { createClaimStream } from '../sync/createClaimStream.js';
|
|
18
|
-
import { AbloConnectionError } from '../transaction/errors.js';
|
|
19
|
-
/** How long `connect()` waits before reporting the feed did not come up. */
|
|
20
|
-
const CONNECT_TIMEOUT_MS = 10_000;
|
|
21
|
-
export function createCoreClient(args) {
|
|
22
|
-
const { options } = args;
|
|
23
|
-
// The stateless surface — the same construction `transport: 'http'` uses,
|
|
24
|
-
// fed the same option slice. The endpoint-form `apiKey` (or the legacy
|
|
25
|
-
// `authEndpoint`) mints and renews exactly as it does there.
|
|
26
|
-
const http = createAbloHttpClient({
|
|
27
|
-
schema: options.schema,
|
|
28
|
-
apiKey: options.apiKey ?? options.authEndpoint,
|
|
29
|
-
baseURL: args.baseUrl,
|
|
30
|
-
fetch: options.fetch,
|
|
31
|
-
defaultHeaders: options.defaultHeaders,
|
|
32
|
-
defaultQuery: options.defaultQuery,
|
|
33
|
-
dangerouslyAllowBrowser: options.dangerouslyAllowBrowser,
|
|
34
|
-
observability: args.observability,
|
|
35
|
-
durableWrites: options.durableWrites,
|
|
36
|
-
// Forwarding the compatibility aliases IS the compatibility: a caller still
|
|
37
|
-
// on the old pair reaches the HTTP client only through here, so this hand-off
|
|
38
|
-
// has to outlive the deprecation notice. It goes when the aliases do.
|
|
39
|
-
// eslint-disable-next-line @typescript-eslint/no-deprecated -- see above
|
|
40
|
-
commitOutbox: options.commitOutbox,
|
|
41
|
-
// eslint-disable-next-line @typescript-eslint/no-deprecated -- see above
|
|
42
|
-
commitOutboxScope: options.commitOutboxScope,
|
|
43
|
-
});
|
|
44
|
-
// The live feed. Constructed eagerly (a socket object holds no connection
|
|
45
|
-
// until `connect()`), with identity riding the bearer — the server never
|
|
46
|
-
// reads identity fields from the client.
|
|
47
|
-
const socket = new WsTransport({
|
|
48
|
-
baseUrl: args.baseUrl,
|
|
49
|
-
kind: args.kind,
|
|
50
|
-
getAuthToken: args.getAuthToken,
|
|
51
|
-
syncGroups: [...args.syncGroups],
|
|
52
|
-
collaborationEvents: [...(options.collaborationEvents ?? [])],
|
|
53
|
-
logger: args.logger,
|
|
54
|
-
observability: args.observability,
|
|
55
|
-
});
|
|
56
|
-
// Claim push is core coordination: the stream attaches to the socket now
|
|
57
|
-
// and starts reporting the moment the feed opens.
|
|
58
|
-
const claims = createClaimStream({ participantId: args.participantId, logger: args.logger }, socket);
|
|
59
|
-
function connect(opts) {
|
|
60
|
-
if (socket.isConnected())
|
|
61
|
-
return Promise.resolve();
|
|
62
|
-
const timeoutMs = opts?.timeoutMs ?? CONNECT_TIMEOUT_MS;
|
|
63
|
-
return new Promise((resolve, reject) => {
|
|
64
|
-
const offs = [];
|
|
65
|
-
let done = false;
|
|
66
|
-
const settle = (fn) => {
|
|
67
|
-
if (done)
|
|
68
|
-
return;
|
|
69
|
-
done = true;
|
|
70
|
-
clearTimeout(timer);
|
|
71
|
-
for (const off of offs)
|
|
72
|
-
off();
|
|
73
|
-
fn();
|
|
74
|
-
};
|
|
75
|
-
offs.push(socket.subscribe('connected', () => { settle(resolve); }));
|
|
76
|
-
offs.push(socket.subscribe('handshake_failed', (event) => {
|
|
77
|
-
settle(() => {
|
|
78
|
-
reject(new AbloConnectionError(`The live feed's connection was refused (close code ${event.code}). ` +
|
|
79
|
-
'Check the credential and the server URL; reads and writes still work without the feed.', { code: 'ws_not_ready' }));
|
|
80
|
-
});
|
|
81
|
-
}));
|
|
82
|
-
offs.push(socket.subscribe('reconnect_failed', ({ attempts }) => {
|
|
83
|
-
settle(() => {
|
|
84
|
-
reject(new AbloConnectionError(`The live feed did not come up after ${attempts} attempts. ` +
|
|
85
|
-
'Reads and writes still work without it; call connect() again to retry.', { code: 'ws_not_ready' }));
|
|
86
|
-
});
|
|
87
|
-
}));
|
|
88
|
-
const timer = setTimeout(() => {
|
|
89
|
-
settle(() => {
|
|
90
|
-
reject(new AbloConnectionError(`The live feed did not connect within ${timeoutMs}ms. ` +
|
|
91
|
-
'Reads and writes still work without it; call connect() again to retry.', { code: 'ws_not_ready' }));
|
|
92
|
-
});
|
|
93
|
-
}, timeoutMs);
|
|
94
|
-
socket.connect();
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
// The feed members layered over the stateless surface. `dispose` is
|
|
98
|
-
// deliberately shadowed: closing the client closes the feed too.
|
|
99
|
-
const feed = {
|
|
100
|
-
connect,
|
|
101
|
-
disconnect: () => { socket.disconnect(); },
|
|
102
|
-
isConnected: () => socket.isConnected(),
|
|
103
|
-
subscribe: socket.subscribe.bind(socket),
|
|
104
|
-
claims,
|
|
105
|
-
dispose: async () => {
|
|
106
|
-
claims.dispose();
|
|
107
|
-
socket.disconnect();
|
|
108
|
-
await http.dispose();
|
|
109
|
-
},
|
|
110
|
-
};
|
|
111
|
-
return new Proxy(http, {
|
|
112
|
-
get(target, prop, receiver) {
|
|
113
|
-
if (typeof prop === 'string' && prop in feed)
|
|
114
|
-
return feed[prop];
|
|
115
|
-
return Reflect.get(target, prop, receiver);
|
|
116
|
-
},
|
|
117
|
-
});
|
|
118
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Builds the internal component graph the client runs on.
|
|
3
|
-
*
|
|
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.
|
|
9
|
-
*/
|
|
10
|
-
import { Database } from '../Database.js';
|
|
11
|
-
import { ModelRegistry } from '../ModelRegistry.js';
|
|
12
|
-
import { InstanceCache } from '../InstanceCache.js';
|
|
13
|
-
import { SyncClient } from '../SyncClient.js';
|
|
14
|
-
import { OnDemandLoader } from '../sync/OnDemandLoader.js';
|
|
15
|
-
import { BootstrapFetcher } from '../sync/BootstrapFetcher.js';
|
|
16
|
-
import type { AuthCredentialSource } from '../transaction/auth/credentialSource.js';
|
|
17
|
-
import type { Schema, SchemaRecord } from '../transaction/schema/schema.js';
|
|
18
|
-
import { type AbloPersistence } from '../transaction/persistence.js';
|
|
19
|
-
import type { DurableWriteStore, DurableWritesConfig } from '../transactions/mutations/durableWriteStore.js';
|
|
20
|
-
export interface InternalComponentsInput<S extends SchemaRecord> {
|
|
21
|
-
readonly schema: Schema<S>;
|
|
22
|
-
/** The WebSocket URL. Used to derive the bootstrap HTTP base URL when the
|
|
23
|
-
* caller has not overridden `bootstrapBaseUrl`. */
|
|
24
|
-
readonly url: string;
|
|
25
|
-
readonly options: {
|
|
26
|
-
readonly maxPoolSize?: number;
|
|
27
|
-
readonly bootstrapBaseUrl?: string;
|
|
28
|
-
readonly syncGroups?: string[];
|
|
29
|
-
readonly persistence?: AbloPersistence;
|
|
30
|
-
readonly offline?: boolean;
|
|
31
|
-
readonly inMemory?: boolean;
|
|
32
|
-
readonly durableWrites?: DurableWritesConfig;
|
|
33
|
-
/** @deprecated Use `durableWrites`. */
|
|
34
|
-
readonly commitOutbox?: DurableWriteStore;
|
|
35
|
-
};
|
|
36
|
-
readonly auth?: AuthCredentialSource;
|
|
37
|
-
}
|
|
38
|
-
export interface InternalComponents {
|
|
39
|
-
readonly modelRegistry: ModelRegistry;
|
|
40
|
-
readonly objectPool: InstanceCache;
|
|
41
|
-
readonly bootstrapHelper: BootstrapFetcher;
|
|
42
|
-
readonly database: Database;
|
|
43
|
-
readonly syncClient: SyncClient;
|
|
44
|
-
readonly hydration: OnDemandLoader;
|
|
45
|
-
}
|
|
46
|
-
export declare function createInternalComponents<S extends SchemaRecord>(input: InternalComponentsInput<S>): InternalComponents;
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Builds the internal component graph the client runs on.
|
|
3
|
-
*
|
|
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.
|
|
9
|
-
*/
|
|
10
|
-
import { Database } from '../Database.js';
|
|
11
|
-
import { ModelRegistry, setActiveRegistry } from '../ModelRegistry.js';
|
|
12
|
-
import { InstanceCache } from '../InstanceCache.js';
|
|
13
|
-
import { SyncClient } from '../SyncClient.js';
|
|
14
|
-
import { OnDemandLoader } from '../sync/OnDemandLoader.js';
|
|
15
|
-
import { BootstrapFetcher } from '../sync/BootstrapFetcher.js';
|
|
16
|
-
import { loadsAtBootstrap } from '../transaction/schema/loadStrategy.js';
|
|
17
|
-
import { resolveBootstrapBaseUrl } from '../transaction/auth/apiKey.js';
|
|
18
|
-
import { shouldUseInMemoryPersistence } from '../transaction/persistence.js';
|
|
19
|
-
import { resolveDurableWrites } from '../transaction/durableWrites.js';
|
|
20
|
-
export function createInternalComponents(input) {
|
|
21
|
-
const { schema, url, options, auth } = input;
|
|
22
|
-
// The registry is created here, but model registration happens in the caller,
|
|
23
|
-
// which owns the schema-to-class translation.
|
|
24
|
-
const modelRegistry = new ModelRegistry({
|
|
25
|
-
validateOnRegister: false,
|
|
26
|
-
allowLateReferences: true,
|
|
27
|
-
});
|
|
28
|
-
setActiveRegistry(modelRegistry);
|
|
29
|
-
const objectPool = new InstanceCache({ maxSize: options.maxPoolSize ?? 10000 }, modelRegistry);
|
|
30
|
-
const bootstrapBaseUrl = resolveBootstrapBaseUrl({
|
|
31
|
-
url,
|
|
32
|
-
bootstrapBaseUrl: options.bootstrapBaseUrl,
|
|
33
|
-
});
|
|
34
|
-
const bootstrapHelper = new BootstrapFetcher({
|
|
35
|
-
baseUrl: bootstrapBaseUrl,
|
|
36
|
-
syncGroups: options.syncGroups,
|
|
37
|
-
instantModels: deriveInstantModels(schema),
|
|
38
|
-
getAuthToken: auth?.getAuthToken,
|
|
39
|
-
});
|
|
40
|
-
const database = new Database(modelRegistry, bootstrapHelper, {
|
|
41
|
-
// By default there is no browser-local durable store unless the caller asks
|
|
42
|
-
// for one. Node and edge runtimes always use the in-memory store because
|
|
43
|
-
// IndexedDB is unavailable there.
|
|
44
|
-
inMemory: shouldUseInMemoryPersistence(options),
|
|
45
|
-
});
|
|
46
|
-
const durableWrites = resolveDurableWrites(options);
|
|
47
|
-
const syncClient = new SyncClient(objectPool, database, durableWrites.store, durableWrites.namespace ?? url);
|
|
48
|
-
// Lazy-load lane: hydrates the object pool and IndexedDB on demand for
|
|
49
|
-
// entities not in scope at bootstrap (`load: 'lazy'` models, or an entity
|
|
50
|
-
// reached by deep link before the pool warmed up). Single-flight, with
|
|
51
|
-
// write-through to IndexedDB.
|
|
52
|
-
const hydration = new OnDemandLoader({
|
|
53
|
-
objectPool,
|
|
54
|
-
database,
|
|
55
|
-
registry: modelRegistry,
|
|
56
|
-
schema,
|
|
57
|
-
baseUrl: bootstrapBaseUrl,
|
|
58
|
-
getAuthToken: auth?.getAuthToken,
|
|
59
|
-
});
|
|
60
|
-
// Drop the lazy-lane hydration ledger on reconnect. While connected, the
|
|
61
|
-
// WebSocket delta stream keeps hydrated rows fresh so repeat reads serve
|
|
62
|
-
// pure-local with no network; after a drop, deltas may have been missed, so
|
|
63
|
-
// the next read of each query must re-confirm with the server once.
|
|
64
|
-
syncClient.on('sync:reconnecting', () => { hydration.invalidate(); });
|
|
65
|
-
return {
|
|
66
|
-
modelRegistry,
|
|
67
|
-
objectPool,
|
|
68
|
-
bootstrapHelper,
|
|
69
|
-
database,
|
|
70
|
-
syncClient,
|
|
71
|
-
hydration,
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Derives the set of models to fetch in the initial bootstrap request from each
|
|
76
|
-
* model's load strategy. Models declared `load: 'lazy'` are left out of the
|
|
77
|
-
* bootstrap and fetched on demand instead. The default strategy is
|
|
78
|
-
* `'instant'`, which includes the model.
|
|
79
|
-
*/
|
|
80
|
-
function deriveInstantModels(schema) {
|
|
81
|
-
const schemaModels = schema.models ?? schema;
|
|
82
|
-
return Object.entries(schemaModels).flatMap(([key, def]) => {
|
|
83
|
-
if (!def || typeof def !== 'object' || !('load' in def)) {
|
|
84
|
-
return [key]; // no load → the default strategy
|
|
85
|
-
}
|
|
86
|
-
const load = def.load;
|
|
87
|
-
if (loadsAtBootstrap(load)) {
|
|
88
|
-
return [def.typename ?? key];
|
|
89
|
-
}
|
|
90
|
-
return [];
|
|
91
|
-
});
|
|
92
|
-
}
|
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Builds the typed client for a single schema model — the object reached as
|
|
3
|
-
* `ablo.<model>`.
|
|
4
|
-
*
|
|
5
|
-
* Each schema model gets one {@link ModelOperations}: the async server reads
|
|
6
|
-
* `retrieve` and `list`, the same verbs restricted to the local graph under
|
|
7
|
-
* `local`, the writes `create`, `update`, and `delete`, the coordination
|
|
8
|
-
* namespace `claim` (callable as `claim({ id })`, plus `claim.state`,
|
|
9
|
-
* `claim.queue`, `claim.release`, and `claim.reorder`), `join`, and `onChange`.
|
|
10
|
-
* The factory returns a plain object; the client assembles the `ablo.<model>`
|
|
11
|
-
* lookup table from one of these per model.
|
|
12
|
-
*/
|
|
13
|
-
import type { ModelTarget } from '../transaction/coordination/schema.js';
|
|
14
|
-
import type { ModelRegistry } from '../ModelRegistry.js';
|
|
15
|
-
import type { InstanceCache } from '../InstanceCache.js';
|
|
16
|
-
import type { SyncClient } from '../SyncClient.js';
|
|
17
|
-
import type { OnDemandLoader } from '../sync/OnDemandLoader.js';
|
|
18
|
-
import type { JoinedParticipant } from '../sync/participants.js';
|
|
19
|
-
import type { Duration, Claim, ClaimHeartbeat, ClaimHeartbeatOptions, HeldClaim, HeldLease, ClaimWaitOptions, Snapshot } from '../transaction/types/streams.js';
|
|
20
|
-
export type { ModelListScope, ModelTrackParams, ModelTrackResult, LocalReadOptions, LocalCountOptions, ServerReadOptions, ServerRetrieveOptions, ClaimTargetOptions, ClaimParams, ClaimLookupParams, ClaimReorderParams, ClaimOptions, ClaimReadApi, AwaitedClaimMethod, ClaimApi, ModelRetrieveParams, ModelCreateParams, ModelUpdateParams, ModelDeleteParams, JoinOptions, } from '../transaction/resources/modelOperations.js';
|
|
21
|
-
export type { Claim, ClaimHeartbeat, ClaimHeartbeatOptions, HeldClaim, HeldLease };
|
|
22
|
-
import type { ClaimApi, JoinOptions, LocalCountOptions, LocalReadOptions } from '../transaction/resources/modelOperations.js';
|
|
23
|
-
import type { HttpModelClient } from '../transaction/transport/httpClient.js';
|
|
24
|
-
import type { ParticipantKind } from '../transaction/types/participant.js';
|
|
25
|
-
export interface ModelClientMeta {
|
|
26
|
-
readonly key: string;
|
|
27
|
-
readonly typename: string;
|
|
28
|
-
}
|
|
29
|
-
export declare function getModelClientMeta(modelClient: unknown): ModelClientMeta | undefined;
|
|
30
|
-
/**
|
|
31
|
-
* The entity a coordination read names, without the sub-entity narrowing —
|
|
32
|
-
* projected from {@link ModelTarget} so the two members are spelled once.
|
|
33
|
-
*/
|
|
34
|
-
type EntityHalf = Pick<ModelTarget, 'model' | 'id'>;
|
|
35
|
-
export interface ModelCollaboration {
|
|
36
|
-
createClaim(options: {
|
|
37
|
-
/**
|
|
38
|
-
* The locator, in the spelling the SDK surface and the HTTP routes use.
|
|
39
|
-
* The canonical {@link ModelTarget} rather than a shape spelled here: this
|
|
40
|
-
* boundary is what a claim's narrowing has to cross, and a member missing
|
|
41
|
-
* from it dies before the socket sees it.
|
|
42
|
-
*/
|
|
43
|
-
target: ModelTarget;
|
|
44
|
-
/** Peer-visible description of the work (`'rewriting the risk section'`). */
|
|
45
|
-
description?: string;
|
|
46
|
-
ttl?: Duration;
|
|
47
|
-
/**
|
|
48
|
-
* Block on the server's fair FIFO queue when the target is held, rather
|
|
49
|
-
* than failing. Resolves only once the lease is genuinely ours (the head
|
|
50
|
-
* of the line). `takeClaim` sets this so writers serialize on contention.
|
|
51
|
-
*/
|
|
52
|
-
queue?: boolean;
|
|
53
|
-
/** Reject (don't wait) if the queue is already this deep when we join. */
|
|
54
|
-
maxQueueDepth?: number;
|
|
55
|
-
}): Promise<Claim>;
|
|
56
|
-
createSnapshot(modelKey: string, id: string): Snapshot;
|
|
57
|
-
/**
|
|
58
|
-
* Current coordination state on a target — who (if anyone) holds it.
|
|
59
|
-
* Synchronous reactive snapshot read off the presence/claim stream;
|
|
60
|
-
* `null` when the target is free. The wiring site computes it because
|
|
61
|
-
* only it knows the local participant id (needed to distinguish "I
|
|
62
|
-
* hold it" from "someone else holds it").
|
|
63
|
-
*
|
|
64
|
-
* Named `state` to match the public `ablo.<model>.claim.state({ id })` read —
|
|
65
|
-
* one verb for "who holds this" across every claim surface; the only
|
|
66
|
-
* difference is this internal contract takes an explicit `{ model, id }`
|
|
67
|
-
* target because it isn't bound to a single model.
|
|
68
|
-
*/
|
|
69
|
-
state(target: EntityHalf): Claim | null;
|
|
70
|
-
/**
|
|
71
|
-
* The reactive wait queue on a target — the FIFO line of queued claims
|
|
72
|
-
* behind the holder. Synchronous snapshot off the synced claim stream.
|
|
73
|
-
*/
|
|
74
|
-
queue(target: EntityHalf): readonly Claim[];
|
|
75
|
-
/**
|
|
76
|
-
* Re-rank the wait queue on a target (privileged — server-gated). `order` is
|
|
77
|
-
* the desired front-of-line ordering, taken from `queue(target)`.
|
|
78
|
-
*/
|
|
79
|
-
reorder(target: EntityHalf, order: readonly Claim[]): void;
|
|
80
|
-
/**
|
|
81
|
-
* Resolve once no participant holds an active claim on the target.
|
|
82
|
-
* The contender's "wait until it's free" — delegates to the claim
|
|
83
|
-
* stream's `waitFor`.
|
|
84
|
-
*/
|
|
85
|
-
waitFor(target: EntityHalf, options?: ClaimWaitOptions): Promise<void>;
|
|
86
|
-
/**
|
|
87
|
-
* The local participant's id. Used to distinguish "I already hold this"
|
|
88
|
-
* from "someone else holds it" in `claimOrWait`.
|
|
89
|
-
*/
|
|
90
|
-
readonly selfParticipantId: string;
|
|
91
|
-
/**
|
|
92
|
-
* The local participant's kind (`'user' | 'agent' | 'system'`). Used to stamp
|
|
93
|
-
* the synthesized self-claim returned from `claim.state` when this client
|
|
94
|
-
* holds the lease: server presence frames exclude a holder's own claims, so
|
|
95
|
-
* the holder builds its own view.
|
|
96
|
-
*/
|
|
97
|
-
readonly selfParticipantKind?: ParticipantKind;
|
|
98
|
-
/**
|
|
99
|
-
* Subscribes the connection to a scope's sync group(s) — read interest. The
|
|
100
|
-
* typed surface calls this on single-entity reads and claim observation so a
|
|
101
|
-
* client lands in the same entity-scoped group the holder's claim presence
|
|
102
|
-
* fans out on; a peer subscribed only to broader `org:` or `user:` groups
|
|
103
|
-
* would otherwise never see claim broadcasts. Fire-and-forget and best-effort:
|
|
104
|
-
* read interest must never make a read reject or stall. Optional so minimal
|
|
105
|
-
* test doubles can omit it.
|
|
106
|
-
*/
|
|
107
|
-
enterScope?(scope: Record<string, string>): void | Promise<void>;
|
|
108
|
-
/**
|
|
109
|
-
* Pins a scope's sync group(s) — write intent: a row this client holds an
|
|
110
|
-
* active claim on stays subscribed regardless of navigation. Same
|
|
111
|
-
* fire-and-forget, best-effort semantics as `enterScope`.
|
|
112
|
-
*/
|
|
113
|
-
pinScope?(scope: Record<string, string>): void | Promise<void>;
|
|
114
|
-
/**
|
|
115
|
-
* Opens a presence and claim subscription on this model's sync group(s) and
|
|
116
|
-
* returns the live participant handle. Backs `ablo.<model>.join(ids)`.
|
|
117
|
-
* WebSocket only, since presence needs a live socket; it is absent on other
|
|
118
|
-
* client constructions, where the proxy throws a clear error.
|
|
119
|
-
*/
|
|
120
|
-
createJoin?(modelKey: string, ids: string | readonly string[], options?: JoinOptions): Promise<JoinedParticipant>;
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* The synchronous, local-only reads — reached as `ablo.<model>.local.*`.
|
|
124
|
-
*
|
|
125
|
-
* Every verb mirrors its asynchronous sibling on the base surface, and the one
|
|
126
|
-
* word in front is the whole difference. It is a narrowing, not a claim about
|
|
127
|
-
* the other side: `retrieve` consults the local graph and then the network,
|
|
128
|
-
* while `local.retrieve` is restricted to what is already resident — which is
|
|
129
|
-
* also why it can return a value instead of a promise. There is nothing to
|
|
130
|
-
* await.
|
|
131
|
-
*
|
|
132
|
-
* These reads exist only here. Exposing them at the top level too would undo
|
|
133
|
-
* the distinction the namespace draws.
|
|
134
|
-
*/
|
|
135
|
-
export interface LocalReads<T> {
|
|
136
|
-
/**
|
|
137
|
-
* Snapshot of a single row from the local graph. `undefined` when the row is
|
|
138
|
-
* not resident — a graph that is still empty, or a `lazy` model not yet
|
|
139
|
-
* loaded. Pairs with reactive selectors:
|
|
140
|
-
* `useAblo((ablo) => ablo.<model>.local.retrieve(id))`.
|
|
141
|
-
*/
|
|
142
|
-
retrieve(id: string): T | undefined;
|
|
143
|
-
/**
|
|
144
|
-
* Snapshot of a filtered collection from the local graph. Empty until
|
|
145
|
-
* `retrieve`, `list`, or bootstrap has warmed the graph.
|
|
146
|
-
*/
|
|
147
|
-
list(options?: LocalReadOptions<T>): T[];
|
|
148
|
-
/** Count rows in the local graph. */
|
|
149
|
-
count(options?: LocalCountOptions<T>): number;
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* What a reactive client adds on top of the base per-model surface: a live
|
|
153
|
-
* graph to read (`local`), the synchronous projection of the claim reads, and
|
|
154
|
-
* the two subscriptions a persistent socket makes possible.
|
|
155
|
-
*
|
|
156
|
-
* `claim` is here rather than inherited because the two transports carry
|
|
157
|
-
* deliberately different claim types, and the difference is load-bearing: a
|
|
158
|
-
* stateless client has no local copy, so `state`/`queue`/`reorder` must be
|
|
159
|
-
* awaited, while a reactive client resolves them synchronously — which is
|
|
160
|
-
* precisely what lets a React render read claim state inline. The stateless
|
|
161
|
-
* form is *derived* from this one through {@link AwaitedClaimMethod}, so the
|
|
162
|
-
* only permitted difference between them is that promise wrapper.
|
|
163
|
-
*/
|
|
164
|
-
interface ReactiveModelSurface<T> {
|
|
165
|
-
/** The synchronous local-graph reads. */
|
|
166
|
-
local: LocalReads<T>;
|
|
167
|
-
/**
|
|
168
|
-
* Claim a row so other writers wait or are rejected until you're done, and
|
|
169
|
-
* inspect or manage that coordination through the same namespace. Call it to
|
|
170
|
-
* take a claim handle; reach for its members to observe and steer the wait line:
|
|
171
|
-
*
|
|
172
|
-
* - `claim.state({ id })` — who holds the row now, or `null` when free
|
|
173
|
-
* - `claim.queue({ id })` — who's lined up behind the holder
|
|
174
|
-
* - `claim.release({ id })` — drop a claim early (usually implicit on scope exit)
|
|
175
|
-
* - `claim.reorder({ id, order })` — re-rank the wait line
|
|
176
|
-
*
|
|
177
|
-
* ```ts
|
|
178
|
-
* const claim = await ablo.weatherReports.claim({
|
|
179
|
-
* id: 'report_stockholm',
|
|
180
|
-
* description: 'Fetching fresh weather before updating the report.',
|
|
181
|
-
* });
|
|
182
|
-
* const weather = await getWeather(claim.data.location);
|
|
183
|
-
* await ablo.weatherReports.update({
|
|
184
|
-
* id: claim.target.id,
|
|
185
|
-
* data: { forecast: weather },
|
|
186
|
-
* claim,
|
|
187
|
-
* });
|
|
188
|
-
* await claim.release();
|
|
189
|
-
*
|
|
190
|
-
* const holder = ablo.weatherReports.claim.state({ id: 'report_stockholm' });
|
|
191
|
-
* ```
|
|
192
|
-
*/
|
|
193
|
-
claim: ClaimApi<T>;
|
|
194
|
-
/**
|
|
195
|
-
* Joins the sync group(s) for one or more rows of this model and returns a
|
|
196
|
-
* live participant handle — presence (`.peers`), the scoped claim stream
|
|
197
|
-
* (`.claims`), and `.leave()` / `await using` disposal. This is a presence
|
|
198
|
-
* subscription: it reports who else is here and what they hold, not row
|
|
199
|
-
* values changing — for the latter, use `onChange`.
|
|
200
|
-
*
|
|
201
|
-
* WebSocket only: presence needs a live socket, so this is absent on HTTP
|
|
202
|
-
* clients and throws on any non-WebSocket construction.
|
|
203
|
-
*
|
|
204
|
-
* ```ts
|
|
205
|
-
* await using participant = await ablo.sections.join(sectionIds, { ttl: '5m' });
|
|
206
|
-
* participant.peers; // who else is here
|
|
207
|
-
* ```
|
|
208
|
-
*/
|
|
209
|
-
join(ids: string | readonly string[], options?: JoinOptions): Promise<JoinedParticipant>;
|
|
210
|
-
/** Subscribe to changes; the callback runs on every change. */
|
|
211
|
-
onChange(callback: (entities: T[]) => void, options?: LocalReadOptions<T>): () => void;
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Everything reachable as `ablo.<model>` on a reactive client.
|
|
215
|
-
*
|
|
216
|
-
* The base is not written here — it is the transport-independent per-model
|
|
217
|
-
* surface, taken whole. A reactive client is that surface plus what a live
|
|
218
|
-
* graph makes possible, so this type states the relationship instead of
|
|
219
|
-
* restating the members, and a verb added to the base arrives here on its own.
|
|
220
|
-
*
|
|
221
|
-
* `claim` is the one member the base cannot supply directly: the two forms
|
|
222
|
-
* differ by an awaitedness transform, so it is replaced rather than inherited.
|
|
223
|
-
* See {@link ReactiveModelSurface}.
|
|
224
|
-
*/
|
|
225
|
-
export type ModelOperations<T, CreateInput> = Omit<HttpModelClient<T, CreateInput>, 'claim'> & ReactiveModelSurface<T>;
|
|
226
|
-
export declare function createModelProxy<T, C>(schemaKey: string, registeredModelName: string, objectPool: InstanceCache, syncClient: SyncClient, registry: ModelRegistry, hydration: OnDemandLoader, collaboration?: ModelCollaboration,
|
|
227
|
-
/** The client-wide `wait` default; a per-call `wait` still wins over it. */
|
|
228
|
-
defaultWait?: 'queued' | 'confirmed'): ModelOperations<T, C>;
|