@abloatai/transaction 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/CONVENTIONS.md +83 -0
- package/README.md +48 -0
- package/dist/ablo.d.ts +90 -0
- package/dist/ablo.d.ts.map +1 -0
- package/dist/ablo.js +34 -0
- package/dist/ablo.js.map +1 -0
- package/dist/ai-sdk/coordinatedTool.d.ts +123 -0
- package/dist/ai-sdk/coordinatedTool.d.ts.map +1 -0
- package/dist/ai-sdk/coordinatedTool.js +135 -0
- package/dist/ai-sdk/coordinatedTool.js.map +1 -0
- package/dist/ai-sdk/index.d.ts +2 -0
- package/dist/ai-sdk/index.d.ts.map +1 -0
- package/dist/ai-sdk/index.js +2 -0
- package/dist/ai-sdk/index.js.map +1 -0
- package/dist/auth/apiKey.d.ts +154 -0
- package/dist/auth/apiKey.d.ts.map +1 -0
- package/dist/auth/apiKey.js +408 -0
- package/dist/auth/apiKey.js.map +1 -0
- package/dist/auth/bootstrapScope.d.ts +16 -0
- package/dist/auth/bootstrapScope.d.ts.map +1 -0
- package/dist/auth/bootstrapScope.js +2 -0
- package/dist/auth/bootstrapScope.js.map +1 -0
- package/dist/auth/browserCredentialSafety.d.ts +7 -0
- package/dist/auth/browserCredentialSafety.d.ts.map +1 -0
- package/dist/auth/browserCredentialSafety.js +29 -0
- package/dist/auth/browserCredentialSafety.js.map +1 -0
- package/dist/auth/capability.d.ts +241 -0
- package/dist/auth/capability.d.ts.map +1 -0
- package/dist/auth/capability.js +253 -0
- package/dist/auth/capability.js.map +1 -0
- package/dist/auth/capabilityLifecycle.d.ts +47 -0
- package/dist/auth/capabilityLifecycle.d.ts.map +1 -0
- package/dist/auth/capabilityLifecycle.js +108 -0
- package/dist/auth/capabilityLifecycle.js.map +1 -0
- package/dist/auth/credentialEndpoint.d.ts +10 -0
- package/dist/auth/credentialEndpoint.d.ts.map +1 -0
- package/dist/auth/credentialEndpoint.js +58 -0
- package/dist/auth/credentialEndpoint.js.map +1 -0
- package/dist/auth/credentialEndpointProtocol.d.ts +24 -0
- package/dist/auth/credentialEndpointProtocol.d.ts.map +1 -0
- package/dist/auth/credentialEndpointProtocol.js +34 -0
- package/dist/auth/credentialEndpointProtocol.js.map +1 -0
- package/dist/auth/credentialKind.d.ts +4 -0
- package/dist/auth/credentialKind.d.ts.map +1 -0
- package/dist/auth/credentialKind.js +15 -0
- package/dist/auth/credentialKind.js.map +1 -0
- package/dist/auth/credentialPolicy.d.ts +141 -0
- package/dist/auth/credentialPolicy.d.ts.map +1 -0
- package/dist/auth/credentialPolicy.js +113 -0
- package/dist/auth/credentialPolicy.js.map +1 -0
- package/dist/auth/credentialResult.d.ts +7 -0
- package/dist/auth/credentialResult.d.ts.map +1 -0
- package/dist/auth/credentialResult.js +9 -0
- package/dist/auth/credentialResult.js.map +1 -0
- package/dist/auth/credentialSource.d.ts +31 -0
- package/dist/auth/credentialSource.d.ts.map +1 -0
- package/dist/auth/credentialSource.js +56 -0
- package/dist/auth/credentialSource.js.map +1 -0
- package/dist/auth/hostedEndpoints.d.ts +22 -0
- package/dist/auth/hostedEndpoints.d.ts.map +1 -0
- package/dist/auth/hostedEndpoints.js +22 -0
- package/dist/auth/hostedEndpoints.js.map +1 -0
- package/dist/auth/identity.d.ts +62 -0
- package/dist/auth/identity.d.ts.map +1 -0
- package/dist/auth/identity.js +224 -0
- package/dist/auth/identity.js.map +1 -0
- package/dist/auth/index.d.ts +189 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +312 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/schemas.d.ts +41 -0
- package/dist/auth/schemas.d.ts.map +1 -0
- package/dist/auth/schemas.js +69 -0
- package/dist/auth/schemas.js.map +1 -0
- package/dist/auth/sessionMint.d.ts +29 -0
- package/dist/auth/sessionMint.d.ts.map +1 -0
- package/dist/auth/sessionMint.js +92 -0
- package/dist/auth/sessionMint.js.map +1 -0
- package/dist/auth/token.d.ts +4 -0
- package/dist/auth/token.d.ts.map +1 -0
- package/dist/auth/token.js +4 -0
- package/dist/auth/token.js.map +1 -0
- package/dist/batching/index.d.ts +56 -0
- package/dist/batching/index.d.ts.map +1 -0
- package/dist/batching/index.js +148 -0
- package/dist/batching/index.js.map +1 -0
- package/dist/coordination/awaitClaimGrant.d.ts +57 -0
- package/dist/coordination/awaitClaimGrant.d.ts.map +1 -0
- package/dist/coordination/awaitClaimGrant.js +138 -0
- package/dist/coordination/awaitClaimGrant.js.map +1 -0
- package/dist/coordination/claimHeartbeatLoop.d.ts +85 -0
- package/dist/coordination/claimHeartbeatLoop.d.ts.map +1 -0
- package/dist/coordination/claimHeartbeatLoop.js +109 -0
- package/dist/coordination/claimHeartbeatLoop.js.map +1 -0
- package/dist/coordination/claimMeta.d.ts +50 -0
- package/dist/coordination/claimMeta.d.ts.map +1 -0
- package/dist/coordination/claimMeta.js +53 -0
- package/dist/coordination/claimMeta.js.map +1 -0
- package/dist/coordination/events.d.ts +75 -0
- package/dist/coordination/events.d.ts.map +1 -0
- package/dist/coordination/events.js +8 -0
- package/dist/coordination/events.js.map +1 -0
- package/dist/coordination/index.d.ts +20 -0
- package/dist/coordination/index.d.ts.map +1 -0
- package/dist/coordination/index.js +46 -0
- package/dist/coordination/index.js.map +1 -0
- package/dist/coordination/locator.d.ts +106 -0
- package/dist/coordination/locator.d.ts.map +1 -0
- package/dist/coordination/locator.js +110 -0
- package/dist/coordination/locator.js.map +1 -0
- package/dist/coordination/schema.d.ts +1332 -0
- package/dist/coordination/schema.d.ts.map +1 -0
- package/dist/coordination/schema.js +1137 -0
- package/dist/coordination/schema.js.map +1 -0
- package/dist/coordination/targetConflict.d.ts +3 -0
- package/dist/coordination/targetConflict.d.ts.map +1 -0
- package/dist/coordination/targetConflict.js +74 -0
- package/dist/coordination/targetConflict.js.map +1 -0
- package/dist/coordination/trace.d.ts +79 -0
- package/dist/coordination/trace.d.ts.map +1 -0
- package/dist/coordination/trace.js +139 -0
- package/dist/coordination/trace.js.map +1 -0
- package/dist/docs/catalog.d.ts +73 -0
- package/dist/docs/catalog.d.ts.map +1 -0
- package/dist/docs/catalog.js +231 -0
- package/dist/docs/catalog.js.map +1 -0
- package/dist/docs/index.d.ts +11 -0
- package/dist/docs/index.d.ts.map +1 -0
- package/dist/docs/index.js +11 -0
- package/dist/docs/index.js.map +1 -0
- package/dist/durableWrites.d.ts +63 -0
- package/dist/durableWrites.d.ts.map +1 -0
- package/dist/durableWrites.js +72 -0
- package/dist/durableWrites.js.map +1 -0
- package/dist/environment.d.ts +106 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js +109 -0
- package/dist/environment.js.map +1 -0
- package/dist/errorCodes.d.ts +411 -0
- package/dist/errorCodes.d.ts.map +1 -0
- package/dist/errorCodes.js +500 -0
- package/dist/errorCodes.js.map +1 -0
- package/dist/errors.d.ts +429 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +687 -0
- package/dist/errors.js.map +1 -0
- package/dist/footprint.d.ts +112 -0
- package/dist/footprint.d.ts.map +1 -0
- package/dist/footprint.js +0 -0
- package/dist/footprint.js.map +1 -0
- package/dist/headlessClient.d.ts +10 -0
- package/dist/headlessClient.d.ts.map +1 -0
- package/dist/headlessClient.js +114 -0
- package/dist/headlessClient.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/keys/index.d.ts +88 -0
- package/dist/keys/index.d.ts.map +1 -0
- package/dist/keys/index.js +208 -0
- package/dist/keys/index.js.map +1 -0
- package/dist/log/syncDeltaRow.d.ts +159 -0
- package/dist/log/syncDeltaRow.d.ts.map +1 -0
- package/dist/log/syncDeltaRow.js +96 -0
- package/dist/log/syncDeltaRow.js.map +1 -0
- package/dist/logger.d.ts +17 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +8 -0
- package/dist/logger.js.map +1 -0
- package/dist/observability.d.ts +54 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +20 -0
- package/dist/observability.js.map +1 -0
- package/dist/policy/types.d.ts +218 -0
- package/dist/policy/types.d.ts.map +1 -0
- package/dist/policy/types.js +127 -0
- package/dist/policy/types.js.map +1 -0
- package/dist/resources/functionalUpdate.d.ts +80 -0
- package/dist/resources/functionalUpdate.d.ts.map +1 -0
- package/dist/resources/functionalUpdate.js +88 -0
- package/dist/resources/functionalUpdate.js.map +1 -0
- package/dist/resources/httpResources.d.ts +449 -0
- package/dist/resources/httpResources.d.ts.map +1 -0
- package/dist/resources/httpResources.js +8 -0
- package/dist/resources/httpResources.js.map +1 -0
- package/dist/resources/modelOperations.d.ts +380 -0
- package/dist/resources/modelOperations.d.ts.map +1 -0
- package/dist/resources/modelOperations.js +13 -0
- package/dist/resources/modelOperations.js.map +1 -0
- package/dist/resources/mutationOptions.d.ts +67 -0
- package/dist/resources/mutationOptions.d.ts.map +1 -0
- package/dist/resources/mutationOptions.js +10 -0
- package/dist/resources/mutationOptions.js.map +1 -0
- package/dist/resources/where.d.ts +102 -0
- package/dist/resources/where.d.ts.map +1 -0
- package/dist/resources/where.js +116 -0
- package/dist/resources/where.js.map +1 -0
- package/dist/resources/writeOptionsSchema.d.ts +48 -0
- package/dist/resources/writeOptionsSchema.d.ts.map +1 -0
- package/dist/resources/writeOptionsSchema.js +74 -0
- package/dist/resources/writeOptionsSchema.js.map +1 -0
- package/dist/schema/coordination.d.ts +113 -0
- package/dist/schema/coordination.d.ts.map +1 -0
- package/dist/schema/coordination.js +134 -0
- package/dist/schema/coordination.js.map +1 -0
- package/dist/schema/ddl.d.ts +98 -0
- package/dist/schema/ddl.d.ts.map +1 -0
- package/dist/schema/ddl.js +492 -0
- package/dist/schema/ddl.js.map +1 -0
- package/dist/schema/ddlLock.d.ts +36 -0
- package/dist/schema/ddlLock.d.ts.map +1 -0
- package/dist/schema/ddlLock.js +47 -0
- package/dist/schema/ddlLock.js.map +1 -0
- package/dist/schema/diff.d.ts +226 -0
- package/dist/schema/diff.d.ts.map +1 -0
- package/dist/schema/diff.js +290 -0
- package/dist/schema/diff.js.map +1 -0
- package/dist/schema/field.d.ts +121 -0
- package/dist/schema/field.d.ts.map +1 -0
- package/dist/schema/field.js +266 -0
- package/dist/schema/field.js.map +1 -0
- package/dist/schema/fieldRef.d.ts +58 -0
- package/dist/schema/fieldRef.d.ts.map +1 -0
- package/dist/schema/fieldRef.js +26 -0
- package/dist/schema/fieldRef.js.map +1 -0
- package/dist/schema/generate.d.ts +20 -0
- package/dist/schema/generate.d.ts.map +1 -0
- package/dist/schema/generate.js +87 -0
- package/dist/schema/generate.js.map +1 -0
- package/dist/schema/index.d.ts +43 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +81 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/loadStrategy.d.ts +46 -0
- package/dist/schema/loadStrategy.d.ts.map +1 -0
- package/dist/schema/loadStrategy.js +47 -0
- package/dist/schema/loadStrategy.js.map +1 -0
- package/dist/schema/model.d.ts +380 -0
- package/dist/schema/model.d.ts.map +1 -0
- package/dist/schema/model.js +124 -0
- package/dist/schema/model.js.map +1 -0
- package/dist/schema/openapi.d.ts +59 -0
- package/dist/schema/openapi.d.ts.map +1 -0
- package/dist/schema/openapi.js +508 -0
- package/dist/schema/openapi.js.map +1 -0
- package/dist/schema/queries.d.ts +202 -0
- package/dist/schema/queries.d.ts.map +1 -0
- package/dist/schema/queries.js +144 -0
- package/dist/schema/queries.js.map +1 -0
- package/dist/schema/relation.d.ts +205 -0
- package/dist/schema/relation.d.ts.map +1 -0
- package/dist/schema/relation.js +105 -0
- package/dist/schema/relation.js.map +1 -0
- package/dist/schema/residency.d.ts +30 -0
- package/dist/schema/residency.d.ts.map +1 -0
- package/dist/schema/residency.js +26 -0
- package/dist/schema/residency.js.map +1 -0
- package/dist/schema/roles.d.ts +250 -0
- package/dist/schema/roles.d.ts.map +1 -0
- package/dist/schema/roles.js +231 -0
- package/dist/schema/roles.js.map +1 -0
- package/dist/schema/schema.d.ts +352 -0
- package/dist/schema/schema.d.ts.map +1 -0
- package/dist/schema/schema.js +326 -0
- package/dist/schema/schema.js.map +1 -0
- package/dist/schema/select.d.ts +41 -0
- package/dist/schema/select.d.ts.map +1 -0
- package/dist/schema/select.js +91 -0
- package/dist/schema/select.js.map +1 -0
- package/dist/schema/serialize.d.ts +116 -0
- package/dist/schema/serialize.d.ts.map +1 -0
- package/dist/schema/serialize.js +278 -0
- package/dist/schema/serialize.js.map +1 -0
- package/dist/schema/sugar.d.ts +110 -0
- package/dist/schema/sugar.d.ts.map +1 -0
- package/dist/schema/sugar.js +84 -0
- package/dist/schema/sugar.js.map +1 -0
- package/dist/schema/tenancy.d.ts +140 -0
- package/dist/schema/tenancy.d.ts.map +1 -0
- package/dist/schema/tenancy.js +191 -0
- package/dist/schema/tenancy.js.map +1 -0
- package/dist/server/adapter.d.ts +174 -0
- package/dist/server/adapter.d.ts.map +1 -0
- package/dist/server/adapter.js +19 -0
- package/dist/server/adapter.js.map +1 -0
- package/dist/server/commit.d.ts +108 -0
- package/dist/server/commit.d.ts.map +1 -0
- package/dist/server/commit.js +2 -0
- package/dist/server/commit.js.map +1 -0
- package/dist/server/index.d.ts +15 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +3 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/readConfig.d.ts +81 -0
- package/dist/server/readConfig.d.ts.map +1 -0
- package/dist/server/readConfig.js +9 -0
- package/dist/server/readConfig.js.map +1 -0
- package/dist/server/storageMode.d.ts +24 -0
- package/dist/server/storageMode.d.ts.map +1 -0
- package/dist/server/storageMode.js +18 -0
- package/dist/server/storageMode.js.map +1 -0
- package/dist/source/adapter.d.ts +84 -0
- package/dist/source/adapter.d.ts.map +1 -0
- package/dist/source/adapter.js +25 -0
- package/dist/source/adapter.js.map +1 -0
- package/dist/source/adapters/drizzle.d.ts +49 -0
- package/dist/source/adapters/drizzle.d.ts.map +1 -0
- package/dist/source/adapters/drizzle.js +220 -0
- package/dist/source/adapters/drizzle.js.map +1 -0
- package/dist/source/adapters/kysely.d.ts +43 -0
- package/dist/source/adapters/kysely.d.ts.map +1 -0
- package/dist/source/adapters/kysely.js +206 -0
- package/dist/source/adapters/kysely.js.map +1 -0
- package/dist/source/adapters/kyselyMutationCore.d.ts +77 -0
- package/dist/source/adapters/kyselyMutationCore.d.ts.map +1 -0
- package/dist/source/adapters/kyselyMutationCore.js +126 -0
- package/dist/source/adapters/kyselyMutationCore.js.map +1 -0
- package/dist/source/adapters/memory.d.ts +14 -0
- package/dist/source/adapters/memory.d.ts.map +1 -0
- package/dist/source/adapters/memory.js +131 -0
- package/dist/source/adapters/memory.js.map +1 -0
- package/dist/source/adapters/prisma.d.ts +64 -0
- package/dist/source/adapters/prisma.d.ts.map +1 -0
- package/dist/source/adapters/prisma.js +203 -0
- package/dist/source/adapters/prisma.js.map +1 -0
- package/dist/source/conformance.d.ts +38 -0
- package/dist/source/conformance.d.ts.map +1 -0
- package/dist/source/conformance.js +216 -0
- package/dist/source/conformance.js.map +1 -0
- package/dist/source/connector.d.ts +96 -0
- package/dist/source/connector.d.ts.map +1 -0
- package/dist/source/connector.js +267 -0
- package/dist/source/connector.js.map +1 -0
- package/dist/source/connectorProtocol.d.ts +155 -0
- package/dist/source/connectorProtocol.d.ts.map +1 -0
- package/dist/source/connectorProtocol.js +164 -0
- package/dist/source/connectorProtocol.js.map +1 -0
- package/dist/source/contract.d.ts +196 -0
- package/dist/source/contract.d.ts.map +1 -0
- package/dist/source/contract.js +165 -0
- package/dist/source/contract.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/factory.d.ts +93 -0
- package/dist/source/factory.d.ts.map +1 -0
- package/dist/source/factory.js +287 -0
- package/dist/source/factory.js.map +1 -0
- package/dist/source/idempotency.d.ts +62 -0
- package/dist/source/idempotency.d.ts.map +1 -0
- package/dist/source/idempotency.js +145 -0
- package/dist/source/idempotency.js.map +1 -0
- package/dist/source/index.d.ts +24 -0
- package/dist/source/index.d.ts.map +1 -0
- package/dist/source/index.js +29 -0
- package/dist/source/index.js.map +1 -0
- package/dist/source/kysely.d.ts +3 -0
- package/dist/source/kysely.d.ts.map +1 -0
- package/dist/source/kysely.js +3 -0
- package/dist/source/kysely.js.map +1 -0
- package/dist/source/migrations.d.ts +22 -0
- package/dist/source/migrations.d.ts.map +1 -0
- package/dist/source/migrations.js +104 -0
- package/dist/source/migrations.js.map +1 -0
- package/dist/source/next.d.ts +33 -0
- package/dist/source/next.d.ts.map +1 -0
- package/dist/source/next.js +26 -0
- package/dist/source/next.js.map +1 -0
- package/dist/source/pushQueue.d.ts +135 -0
- package/dist/source/pushQueue.d.ts.map +1 -0
- package/dist/source/pushQueue.js +257 -0
- package/dist/source/pushQueue.js.map +1 -0
- package/dist/source/signing.d.ts +93 -0
- package/dist/source/signing.d.ts.map +1 -0
- package/dist/source/signing.js +163 -0
- package/dist/source/signing.js.map +1 -0
- package/dist/source/types.d.ts +402 -0
- package/dist/source/types.d.ts.map +1 -0
- package/dist/source/types.js +60 -0
- package/dist/source/types.js.map +1 -0
- package/dist/syncLog/contract.d.ts +21 -0
- package/dist/syncLog/contract.d.ts.map +1 -0
- package/dist/syncLog/contract.js +20 -0
- package/dist/syncLog/contract.js.map +1 -0
- package/dist/syncLog/index.d.ts +2 -0
- package/dist/syncLog/index.d.ts.map +1 -0
- package/dist/syncLog/index.js +2 -0
- package/dist/syncLog/index.js.map +1 -0
- package/dist/testing/fixtures/httpResponses.d.ts +74 -0
- package/dist/testing/fixtures/httpResponses.d.ts.map +1 -0
- package/dist/testing/fixtures/httpResponses.js +102 -0
- package/dist/testing/fixtures/httpResponses.js.map +1 -0
- package/dist/transactionLayer.d.ts +110 -0
- package/dist/transactionLayer.d.ts.map +1 -0
- package/dist/transactionLayer.js +25 -0
- package/dist/transactionLayer.js.map +1 -0
- package/dist/transactions/settlement/commitEnvelope.d.ts +144 -0
- package/dist/transactions/settlement/commitEnvelope.d.ts.map +1 -0
- package/dist/transactions/settlement/commitEnvelope.js +162 -0
- package/dist/transactions/settlement/commitEnvelope.js.map +1 -0
- package/dist/transactions/settlement/httpCommitEnvelope.d.ts +54 -0
- package/dist/transactions/settlement/httpCommitEnvelope.d.ts.map +1 -0
- package/dist/transactions/settlement/httpCommitEnvelope.js +208 -0
- package/dist/transactions/settlement/httpCommitEnvelope.js.map +1 -0
- package/dist/transactions/settlement/idempotencyKey.d.ts +11 -0
- package/dist/transactions/settlement/idempotencyKey.d.ts.map +1 -0
- package/dist/transactions/settlement/idempotencyKey.js +10 -0
- package/dist/transactions/settlement/idempotencyKey.js.map +1 -0
- package/dist/transactions/settlement/pendingWrite.d.ts +113 -0
- package/dist/transactions/settlement/pendingWrite.d.ts.map +1 -0
- package/dist/transactions/settlement/pendingWrite.js +21 -0
- package/dist/transactions/settlement/pendingWrite.js.map +1 -0
- package/dist/transport/commitFrames.d.ts +91 -0
- package/dist/transport/commitFrames.d.ts.map +1 -0
- package/dist/transport/commitFrames.js +135 -0
- package/dist/transport/commitFrames.js.map +1 -0
- package/dist/transport/connectionManager.d.ts +216 -0
- package/dist/transport/connectionManager.d.ts.map +1 -0
- package/dist/transport/connectionManager.js +674 -0
- package/dist/transport/connectionManager.js.map +1 -0
- package/dist/transport/credentialLifecycle.d.ts +178 -0
- package/dist/transport/credentialLifecycle.d.ts.map +1 -0
- package/dist/transport/credentialLifecycle.js +324 -0
- package/dist/transport/credentialLifecycle.js.map +1 -0
- package/dist/transport/heartbeat.d.ts +66 -0
- package/dist/transport/heartbeat.d.ts.map +1 -0
- package/dist/transport/heartbeat.js +94 -0
- package/dist/transport/heartbeat.js.map +1 -0
- package/dist/transport/httpClient.d.ts +143 -0
- package/dist/transport/httpClient.d.ts.map +1 -0
- package/dist/transport/httpClient.js +150 -0
- package/dist/transport/httpClient.js.map +1 -0
- package/dist/transport/httpFeed.d.ts +4 -0
- package/dist/transport/httpFeed.d.ts.map +1 -0
- package/dist/transport/httpFeed.js +94 -0
- package/dist/transport/httpFeed.js.map +1 -0
- package/dist/transport/httpOptions.d.ts +34 -0
- package/dist/transport/httpOptions.d.ts.map +1 -0
- package/dist/transport/httpOptions.js +13 -0
- package/dist/transport/httpOptions.js.map +1 -0
- package/dist/transport/httpTransport.d.ts +68 -0
- package/dist/transport/httpTransport.d.ts.map +1 -0
- package/dist/transport/httpTransport.js +1433 -0
- package/dist/transport/httpTransport.js.map +1 -0
- package/dist/transport/networkProbe.d.ts +85 -0
- package/dist/transport/networkProbe.d.ts.map +1 -0
- package/dist/transport/networkProbe.js +208 -0
- package/dist/transport/networkProbe.js.map +1 -0
- package/dist/transport/wsFrameHandlers.d.ts +129 -0
- package/dist/transport/wsFrameHandlers.d.ts.map +1 -0
- package/dist/transport/wsFrameHandlers.js +429 -0
- package/dist/transport/wsFrameHandlers.js.map +1 -0
- package/dist/transport/wsTransport.d.ts +575 -0
- package/dist/transport/wsTransport.d.ts.map +1 -0
- package/dist/transport/wsTransport.js +1024 -0
- package/dist/transport/wsTransport.js.map +1 -0
- package/dist/types/assertExact.d.ts +18 -0
- package/dist/types/assertExact.d.ts.map +1 -0
- package/dist/types/assertExact.js +2 -0
- package/dist/types/assertExact.js.map +1 -0
- package/dist/types/global.d.ts +108 -0
- package/dist/types/global.d.ts.map +1 -0
- package/dist/types/global.js +41 -0
- package/dist/types/global.js.map +1 -0
- package/dist/types/index.d.ts +206 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +57 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/modelData.d.ts +11 -0
- package/dist/types/modelData.d.ts.map +1 -0
- package/dist/types/modelData.js +10 -0
- package/dist/types/modelData.js.map +1 -0
- package/dist/types/participant.d.ts +21 -0
- package/dist/types/participant.d.ts.map +1 -0
- package/dist/types/participant.js +11 -0
- package/dist/types/participant.js.map +1 -0
- package/dist/types/streams.d.ts +545 -0
- package/dist/types/streams.d.ts.map +1 -0
- package/dist/types/streams.js +12 -0
- package/dist/types/streams.js.map +1 -0
- package/dist/utils/asyncIterator.d.ts +35 -0
- package/dist/utils/asyncIterator.d.ts.map +1 -0
- package/dist/utils/asyncIterator.js +136 -0
- package/dist/utils/asyncIterator.js.map +1 -0
- package/dist/utils/duration.d.ts +51 -0
- package/dist/utils/duration.d.ts.map +1 -0
- package/dist/utils/duration.js +78 -0
- package/dist/utils/duration.js.map +1 -0
- package/dist/utils/json.d.ts +58 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +277 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/webhooks/events.d.ts +44 -0
- package/dist/webhooks/events.d.ts.map +1 -0
- package/dist/webhooks/events.js +43 -0
- package/dist/webhooks/events.js.map +1 -0
- package/dist/webhooks/index.d.ts +9 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +9 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/wire/accountResponses.d.ts +463 -0
- package/dist/wire/accountResponses.d.ts.map +1 -0
- package/dist/wire/accountResponses.js +294 -0
- package/dist/wire/accountResponses.js.map +1 -0
- package/dist/wire/auth.d.ts +57 -0
- package/dist/wire/auth.d.ts.map +1 -0
- package/dist/wire/auth.js +71 -0
- package/dist/wire/auth.js.map +1 -0
- package/dist/wire/bootstrapReason.d.ts +10 -0
- package/dist/wire/bootstrapReason.d.ts.map +1 -0
- package/dist/wire/bootstrapReason.js +9 -0
- package/dist/wire/bootstrapReason.js.map +1 -0
- package/dist/wire/claimEvent.d.ts +70 -0
- package/dist/wire/claimEvent.d.ts.map +1 -0
- package/dist/wire/claimEvent.js +74 -0
- package/dist/wire/claimEvent.js.map +1 -0
- package/dist/wire/claims.d.ts +475 -0
- package/dist/wire/claims.d.ts.map +1 -0
- package/dist/wire/claims.js +326 -0
- package/dist/wire/claims.js.map +1 -0
- package/dist/wire/commit.d.ts +604 -0
- package/dist/wire/commit.d.ts.map +1 -0
- package/dist/wire/commit.js +322 -0
- package/dist/wire/commit.js.map +1 -0
- package/dist/wire/delta.d.ts +251 -0
- package/dist/wire/delta.d.ts.map +1 -0
- package/dist/wire/delta.js +148 -0
- package/dist/wire/delta.js.map +1 -0
- package/dist/wire/errorEnvelope.d.ts +73 -0
- package/dist/wire/errorEnvelope.d.ts.map +1 -0
- package/dist/wire/errorEnvelope.js +124 -0
- package/dist/wire/errorEnvelope.js.map +1 -0
- package/dist/wire/feedCursor.d.ts +61 -0
- package/dist/wire/feedCursor.d.ts.map +1 -0
- package/dist/wire/feedCursor.js +83 -0
- package/dist/wire/feedCursor.js.map +1 -0
- package/dist/wire/feedEvent.d.ts +264 -0
- package/dist/wire/feedEvent.d.ts.map +1 -0
- package/dist/wire/feedEvent.js +66 -0
- package/dist/wire/feedEvent.js.map +1 -0
- package/dist/wire/frames.d.ts +195 -0
- package/dist/wire/frames.d.ts.map +1 -0
- package/dist/wire/frames.js +51 -0
- package/dist/wire/frames.js.map +1 -0
- package/dist/wire/inboundFrames.d.ts +490 -0
- package/dist/wire/inboundFrames.d.ts.map +1 -0
- package/dist/wire/inboundFrames.js +117 -0
- package/dist/wire/inboundFrames.js.map +1 -0
- package/dist/wire/index.d.ts +55 -0
- package/dist/wire/index.d.ts.map +1 -0
- package/dist/wire/index.js +84 -0
- package/dist/wire/index.js.map +1 -0
- package/dist/wire/listEnvelope.d.ts +38 -0
- package/dist/wire/listEnvelope.d.ts.map +1 -0
- package/dist/wire/listEnvelope.js +43 -0
- package/dist/wire/listEnvelope.js.map +1 -0
- package/dist/wire/modelMutations.d.ts +32 -0
- package/dist/wire/modelMutations.d.ts.map +1 -0
- package/dist/wire/modelMutations.js +53 -0
- package/dist/wire/modelMutations.js.map +1 -0
- package/dist/wire/modelResponses.d.ts +79 -0
- package/dist/wire/modelResponses.d.ts.map +1 -0
- package/dist/wire/modelResponses.js +44 -0
- package/dist/wire/modelResponses.js.map +1 -0
- package/dist/wire/modelShape.d.ts +79 -0
- package/dist/wire/modelShape.d.ts.map +1 -0
- package/dist/wire/modelShape.js +75 -0
- package/dist/wire/modelShape.js.map +1 -0
- package/dist/wire/protocol.d.ts +39 -0
- package/dist/wire/protocol.d.ts.map +1 -0
- package/dist/wire/protocol.js +39 -0
- package/dist/wire/protocol.js.map +1 -0
- package/dist/wire/protocolVersion.d.ts +74 -0
- package/dist/wire/protocolVersion.d.ts.map +1 -0
- package/dist/wire/protocolVersion.js +84 -0
- package/dist/wire/protocolVersion.js.map +1 -0
- package/package.json +187 -0
- package/src/ablo.ts +139 -0
- package/src/ai-sdk/coordinatedTool.ts +214 -0
- package/src/ai-sdk/index.ts +7 -0
- package/src/auth/apiKey.ts +540 -0
- package/src/auth/bootstrapScope.ts +15 -0
- package/src/auth/browserCredentialSafety.ts +48 -0
- package/src/auth/capability.ts +326 -0
- package/src/auth/capabilityLifecycle.ts +174 -0
- package/src/auth/credentialEndpoint.ts +79 -0
- package/src/auth/credentialEndpointProtocol.ts +51 -0
- package/src/auth/credentialKind.ts +20 -0
- package/src/auth/credentialPolicy.ts +244 -0
- package/src/auth/credentialResult.ts +23 -0
- package/src/auth/credentialSource.ts +99 -0
- package/src/auth/hostedEndpoints.ts +24 -0
- package/src/auth/identity.ts +330 -0
- package/src/auth/index.ts +592 -0
- package/src/auth/schemas.ts +94 -0
- package/src/auth/sessionMint.ts +126 -0
- package/src/auth/token.ts +4 -0
- package/src/batching/index.ts +200 -0
- package/src/coordination/awaitClaimGrant.ts +243 -0
- package/src/coordination/claimHeartbeatLoop.ts +165 -0
- package/src/coordination/claimMeta.ts +56 -0
- package/src/coordination/events.ts +86 -0
- package/src/coordination/index.ts +181 -0
- package/src/coordination/locator.ts +200 -0
- package/src/coordination/schema.ts +1346 -0
- package/src/coordination/targetConflict.ts +85 -0
- package/src/coordination/trace.ts +173 -0
- package/src/docs/catalog.ts +274 -0
- package/src/docs/index.ts +18 -0
- package/src/durableWrites.ts +134 -0
- package/src/environment.ts +132 -0
- package/src/errorCodes.ts +1591 -0
- package/src/errors.ts +918 -0
- package/src/footprint.ts +0 -0
- package/src/headlessClient.ts +161 -0
- package/src/index.ts +52 -0
- package/src/keys/index.ts +254 -0
- package/src/log/syncDeltaRow.ts +119 -0
- package/src/logger.ts +22 -0
- package/src/observability.ts +85 -0
- package/src/policy/types.ts +292 -0
- package/src/resources/functionalUpdate.ts +151 -0
- package/src/resources/httpResources.ts +520 -0
- package/src/resources/modelOperations.ts +444 -0
- package/src/resources/mutationOptions.ts +66 -0
- package/src/resources/where.ts +160 -0
- package/src/resources/writeOptionsSchema.ts +91 -0
- package/src/schema/coordination.ts +161 -0
- package/src/schema/ddl.ts +593 -0
- package/src/schema/ddlLock.ts +53 -0
- package/src/schema/diff.ts +489 -0
- package/src/schema/field.ts +321 -0
- package/src/schema/fieldRef.ts +88 -0
- package/src/schema/generate.ts +95 -0
- package/src/schema/index.ts +278 -0
- package/src/schema/loadStrategy.ts +52 -0
- package/src/schema/model.ts +476 -0
- package/src/schema/openapi.ts +658 -0
- package/src/schema/queries.ts +273 -0
- package/src/schema/relation.ts +291 -0
- package/src/schema/residency.ts +30 -0
- package/src/schema/roles.ts +325 -0
- package/src/schema/schema.ts +825 -0
- package/src/schema/select.ts +115 -0
- package/src/schema/serialize.ts +373 -0
- package/src/schema/sugar.ts +194 -0
- package/src/schema/tenancy.ts +221 -0
- package/src/server/adapter.ts +203 -0
- package/src/server/commit.ts +109 -0
- package/src/server/index.ts +26 -0
- package/src/server/readConfig.ts +82 -0
- package/src/server/storageMode.ts +20 -0
- package/src/source/adapter.ts +85 -0
- package/src/source/adapters/drizzle.ts +291 -0
- package/src/source/adapters/kysely.ts +346 -0
- package/src/source/adapters/kyselyMutationCore.ts +220 -0
- package/src/source/adapters/memory.ts +154 -0
- package/src/source/adapters/prisma.ts +282 -0
- package/src/source/conformance.ts +287 -0
- package/src/source/connector.ts +394 -0
- package/src/source/connectorProtocol.ts +189 -0
- package/src/source/contract.ts +221 -0
- package/src/source/drizzle.ts +1 -0
- package/src/source/factory.ts +444 -0
- package/src/source/idempotency.ts +189 -0
- package/src/source/index.ts +182 -0
- package/src/source/kysely.ts +2 -0
- package/src/source/migrations.ts +109 -0
- package/src/source/next.ts +38 -0
- package/src/source/pushQueue.ts +368 -0
- package/src/source/signing.ts +279 -0
- package/src/source/types.ts +502 -0
- package/src/syncLog/contract.ts +32 -0
- package/src/syncLog/index.ts +1 -0
- package/src/testing/fixtures/httpResponses.ts +155 -0
- package/src/transactionLayer.ts +122 -0
- package/src/transactions/settlement/commitEnvelope.ts +192 -0
- package/src/transactions/settlement/httpCommitEnvelope.ts +250 -0
- package/src/transactions/settlement/idempotencyKey.ts +11 -0
- package/src/transactions/settlement/pendingWrite.ts +24 -0
- package/src/transport/commitFrames.ts +225 -0
- package/src/transport/connectionManager.ts +856 -0
- package/src/transport/credentialLifecycle.ts +389 -0
- package/src/transport/heartbeat.ts +118 -0
- package/src/transport/httpClient.ts +354 -0
- package/src/transport/httpFeed.ts +111 -0
- package/src/transport/httpOptions.ts +41 -0
- package/src/transport/httpTransport.ts +1976 -0
- package/src/transport/networkProbe.ts +249 -0
- package/src/transport/wsFrameHandlers.ts +619 -0
- package/src/transport/wsTransport.ts +1491 -0
- package/src/types/assertExact.ts +17 -0
- package/src/types/global.ts +123 -0
- package/src/types/index.ts +270 -0
- package/src/types/modelData.ts +11 -0
- package/src/types/participant.ts +22 -0
- package/src/types/streams.ts +702 -0
- package/src/utils/asyncIterator.ts +141 -0
- package/src/utils/duration.ts +88 -0
- package/src/utils/json.ts +281 -0
- package/src/webhooks/events.ts +96 -0
- package/src/webhooks/index.ts +12 -0
- package/src/wire/accountResponses.ts +328 -0
- package/src/wire/auth.ts +86 -0
- package/src/wire/bootstrapReason.ts +10 -0
- package/src/wire/claimEvent.ts +85 -0
- package/src/wire/claims.ts +370 -0
- package/src/wire/commit.ts +379 -0
- package/src/wire/delta.ts +173 -0
- package/src/wire/errorEnvelope.ts +133 -0
- package/src/wire/feedCursor.ts +91 -0
- package/src/wire/feedEvent.ts +74 -0
- package/src/wire/frames.ts +77 -0
- package/src/wire/inboundFrames.ts +182 -0
- package/src/wire/index.ts +328 -0
- package/src/wire/listEnvelope.ts +51 -0
- package/src/wire/modelMutations.ts +55 -0
- package/src/wire/modelResponses.ts +48 -0
- package/src/wire/modelShape.ts +83 -0
- package/src/wire/protocol.ts +39 -0
- package/src/wire/protocolVersion.ts +97 -0
|
@@ -0,0 +1,165 @@
|
|
|
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
|
+
* private HTTP transport), 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
|
+
|
|
19
|
+
import { AbloClaimedError } from '../errors.js';
|
|
20
|
+
import type {
|
|
21
|
+
ClaimHeartbeat,
|
|
22
|
+
ClaimHeartbeatOptions,
|
|
23
|
+
Duration,
|
|
24
|
+
} from '../types/streams.js';
|
|
25
|
+
import { toMs } from '../utils/duration.js';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Normalize the public `heartbeat(options?)` argument — a bare Duration is
|
|
29
|
+
* shorthand for `{ ttl }`. Shared by both transports' handle assembly so the
|
|
30
|
+
* shorthand cannot drift.
|
|
31
|
+
*/
|
|
32
|
+
export function resolveHeartbeatOptions(
|
|
33
|
+
input: Duration | ClaimHeartbeatOptions | undefined,
|
|
34
|
+
): ClaimHeartbeatOptions {
|
|
35
|
+
if (input === undefined) return {};
|
|
36
|
+
if (typeof input === 'string' || typeof input === 'number') {
|
|
37
|
+
return { ttl: input };
|
|
38
|
+
}
|
|
39
|
+
return input;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The structured spelling of the auto-heartbeat — cadence and both callbacks
|
|
44
|
+
* in one place, so the lease axis of a claim is two members (`ttl`,
|
|
45
|
+
* `heartbeat`) rather than four. `true` and a bare Duration remain the
|
|
46
|
+
* shorthands: `heartbeat: '2m'` ≡ `heartbeat: { every: '2m' }`.
|
|
47
|
+
*/
|
|
48
|
+
export interface ClaimHeartbeatPlan {
|
|
49
|
+
/** Cadence between beats. Omitted: a third of the TTL, so two beats can
|
|
50
|
+
* fail before the lease is at risk. */
|
|
51
|
+
readonly every?: Duration;
|
|
52
|
+
/** Called after every successful beat (auto or manual) with the server's
|
|
53
|
+
* answer — chiefly `queueDepth`, the cooperative-yield pressure signal. */
|
|
54
|
+
readonly onBeat?: (beat: ClaimHeartbeat) => void;
|
|
55
|
+
/** Called once when a beat learns the lease is no longer yours. The loop
|
|
56
|
+
* has already stopped; abandon the work or re-claim. */
|
|
57
|
+
readonly onLost?: (error: AbloClaimedError) => void;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** What the handle assembly reads, whichever spelling the caller used. */
|
|
61
|
+
export interface ResolvedHeartbeatPlan {
|
|
62
|
+
/** Whether the auto-beat loop runs at all. */
|
|
63
|
+
readonly loop: boolean;
|
|
64
|
+
/** Feed for {@link heartbeatCadenceMs} — `true` means the TTL-derived default. */
|
|
65
|
+
readonly cadence: true | Duration;
|
|
66
|
+
readonly onBeat?: (beat: ClaimHeartbeat) => void;
|
|
67
|
+
readonly onLost?: (error: AbloClaimedError) => void;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* One reading of the heartbeat option, shared by both transports' handle
|
|
72
|
+
* assembly — cadence and callbacks from whichever spelling the caller used
|
|
73
|
+
* (`true`, a bare Duration, or the structured plan).
|
|
74
|
+
*/
|
|
75
|
+
export function resolveHeartbeatPlan(options: {
|
|
76
|
+
readonly heartbeat?: true | Duration | ClaimHeartbeatPlan;
|
|
77
|
+
}): ResolvedHeartbeatPlan {
|
|
78
|
+
const { heartbeat } = options;
|
|
79
|
+
if (heartbeat !== undefined && typeof heartbeat === 'object') {
|
|
80
|
+
return {
|
|
81
|
+
loop: true,
|
|
82
|
+
cadence: heartbeat.every ?? true,
|
|
83
|
+
...(heartbeat.onBeat ? { onBeat: heartbeat.onBeat } : {}),
|
|
84
|
+
...(heartbeat.onLost ? { onLost: heartbeat.onLost } : {}),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
loop: Boolean(heartbeat),
|
|
89
|
+
cadence: heartbeat === undefined || heartbeat === true ? true : heartbeat,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The beat cadence for a lease of `ttlMs`: an explicit duration when the
|
|
95
|
+
* caller set one, otherwise a third of the TTL (floored at 1s) — the
|
|
96
|
+
* DynamoDB-lock-client rule, leaving two missed beats of runway before the
|
|
97
|
+
* lease is at risk while keeping crash recovery within one beat window.
|
|
98
|
+
*/
|
|
99
|
+
export function heartbeatCadenceMs(
|
|
100
|
+
ttlMs: number,
|
|
101
|
+
heartbeat: true | Duration,
|
|
102
|
+
): number {
|
|
103
|
+
if (heartbeat !== true) return toMs(heartbeat);
|
|
104
|
+
return Math.max(Math.floor(ttlMs / 3), 1_000);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export interface ClaimHeartbeatLoopOptions {
|
|
108
|
+
/** Send one beat; resolves while the lease is still ours. */
|
|
109
|
+
beat(): Promise<ClaimHeartbeat>;
|
|
110
|
+
/** Cadence between beats. Callers default this to a third of the TTL. */
|
|
111
|
+
intervalMs: number;
|
|
112
|
+
/**
|
|
113
|
+
* Called once when a beat comes back with a definitive loss — the lease
|
|
114
|
+
* expired or was taken. The loop has already stopped by the time this runs.
|
|
115
|
+
*/
|
|
116
|
+
onLost?(error: AbloClaimedError): void;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Start beating. Returns a stop function; callers stop the loop when the
|
|
121
|
+
* claim is released (all held-claim assembly sites tie this to `release`).
|
|
122
|
+
* Beats never overlap: a tick that fires while the previous beat is still
|
|
123
|
+
* in flight is skipped rather than stacked.
|
|
124
|
+
*/
|
|
125
|
+
export function startClaimHeartbeatLoop(
|
|
126
|
+
options: ClaimHeartbeatLoopOptions,
|
|
127
|
+
): () => void {
|
|
128
|
+
let stopped = false;
|
|
129
|
+
let inFlight = false;
|
|
130
|
+
|
|
131
|
+
const stop = (): void => {
|
|
132
|
+
if (stopped) return;
|
|
133
|
+
stopped = true;
|
|
134
|
+
clearInterval(timer);
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const timer = setInterval(() => {
|
|
138
|
+
if (stopped || inFlight) return;
|
|
139
|
+
inFlight = true;
|
|
140
|
+
options
|
|
141
|
+
.beat()
|
|
142
|
+
.catch((error: unknown) => {
|
|
143
|
+
if (stopped) return;
|
|
144
|
+
if (error instanceof AbloClaimedError) {
|
|
145
|
+
stop();
|
|
146
|
+
options.onLost?.(error);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
// Transient (connection, brief server unavailability): the next tick
|
|
150
|
+
// is the retry — the ttl/3 cadence leaves runway for missed beats.
|
|
151
|
+
})
|
|
152
|
+
.finally(() => {
|
|
153
|
+
inFlight = false;
|
|
154
|
+
});
|
|
155
|
+
}, options.intervalMs);
|
|
156
|
+
// The loop must never be what keeps a Node process alive — the held work
|
|
157
|
+
// is. A worker that finishes without releasing exits anyway, and the lease
|
|
158
|
+
// lapses on schedule. No-op in browsers (where setInterval returns a number
|
|
159
|
+
// without `unref`), which is why the call is optional even though the Node
|
|
160
|
+
// timer type always has it.
|
|
161
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
162
|
+
timer.unref?.();
|
|
163
|
+
|
|
164
|
+
return stop;
|
|
165
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A claim's application metadata, crossing between the wire and the shape the
|
|
3
|
+
* program declared for it.
|
|
4
|
+
*
|
|
5
|
+
* The wire contract for `meta` is deliberately permissive — `targetRefSchema`
|
|
6
|
+
* parses it as `z.record(z.string(), z.unknown())` and always will, because a
|
|
7
|
+
* newer peer must be able to send a field this build has never heard of and
|
|
8
|
+
* still be understood. The read surface is the opposite: `Register`'s
|
|
9
|
+
* `ClaimMeta` slot names the one shape this program's claims carry, so
|
|
10
|
+
* `claim.state({ id })?.target.meta` reads without a guard.
|
|
11
|
+
*
|
|
12
|
+
* Those two facts meet here, and only here, in both directions. A decode calls
|
|
13
|
+
* {@link declaredMeta} on its way from a parsed record to a public `Claim`; the
|
|
14
|
+
* locator projection calls {@link wireMeta} on the way back out, where a
|
|
15
|
+
* caller's declared value is put on the socket or in the HTTP body. Between
|
|
16
|
+
* them they are the one place the SDK takes the caller's word for a shape it
|
|
17
|
+
* did not check — written down once, with the reason, instead of being asserted
|
|
18
|
+
* at each crossing.
|
|
19
|
+
*
|
|
20
|
+
* The two directions are not symmetric in cost. Losing the declared shape on
|
|
21
|
+
* the way out is harmless, because the wire has always accepted any record;
|
|
22
|
+
* gaining it on the way in is the promise the read surface makes, so
|
|
23
|
+
* `declaredMeta` is the one to audit when a claim reads back a shape its holder
|
|
24
|
+
* never wrote.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import type { ResolveClaimMeta } from '../types/global.js';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Read a parsed `meta` as the declared shape. Call it only where a decode hands
|
|
31
|
+
* a wire value to a public claim, and only for a value already known present —
|
|
32
|
+
* the absent case is an omitted member, not a declared-shaped `undefined`.
|
|
33
|
+
*
|
|
34
|
+
* The exported names are `declaredMeta` and `wireMeta` rather than a `claimMeta`
|
|
35
|
+
* pair because two claim surfaces already read a caller's `meta` back off the
|
|
36
|
+
* options it passed in, and spell that local reader `claimMeta`.
|
|
37
|
+
*/
|
|
38
|
+
export function declaredMeta(raw: unknown): ResolveClaimMeta {
|
|
39
|
+
return raw as ResolveClaimMeta;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Write a declared `meta` as the permissive record the wire carries. Every path
|
|
44
|
+
* from a caller's target to a frame or request body goes through `subTarget`,
|
|
45
|
+
* so this has exactly one caller — widening it is how the declared shape stops
|
|
46
|
+
* being a compile error at the edge of the protocol instead of stopping there.
|
|
47
|
+
*
|
|
48
|
+
* The parameter is `unknown` rather than {@link ResolveClaimMeta} on purpose: a
|
|
49
|
+
* program may register an `interface` for its claim metadata, and an interface
|
|
50
|
+
* carries no implicit index signature, so a directly-typed parameter would make
|
|
51
|
+
* the conversion itself unrepresentable at the one site that needs it. Widening
|
|
52
|
+
* the input is what keeps the assertion single.
|
|
53
|
+
*/
|
|
54
|
+
export function wireMeta(meta: unknown): Record<string, unknown> {
|
|
55
|
+
return meta as Record<string, unknown>;
|
|
56
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-process observation events emitted by the transaction layer's
|
|
3
|
+
* coordination protocol. The wire claim and stale-write contracts live in
|
|
4
|
+
* `coordination/schema.ts`; these two projections are the stable event shapes
|
|
5
|
+
* an observer receives after those frames have been interpreted.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { ParticipantKind } from '../types/participant.js';
|
|
9
|
+
|
|
10
|
+
export type { ClaimEventReason } from './schema.js';
|
|
11
|
+
import type { ClaimEventReason } from './schema.js';
|
|
12
|
+
|
|
13
|
+
/** The participant that blocked a claim — present on `rejected`. */
|
|
14
|
+
export interface ClaimCounterparty {
|
|
15
|
+
/** Who holds it. */
|
|
16
|
+
actor?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Whether the holder is a person, an agent, or the system — the distinction
|
|
19
|
+
* a caller acts on, since yielding to a person and queueing behind an agent
|
|
20
|
+
* are different decisions. It lives here rather than on the event because
|
|
21
|
+
* only a counterparty has a kind worth reporting: on an acquisition the
|
|
22
|
+
* participant is you, and you already know what you are.
|
|
23
|
+
*/
|
|
24
|
+
participantKind?: ParticipantKind;
|
|
25
|
+
/** The lease they hold, so a caller can poll or wait on it by id. */
|
|
26
|
+
claimId?: string;
|
|
27
|
+
/** When their lease lapses without a heartbeat. */
|
|
28
|
+
expiresAt?: number;
|
|
29
|
+
/** What they said they were doing — prose, for a person to read. */
|
|
30
|
+
description?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** A single state transition in the lifecycle of a claim. */
|
|
34
|
+
export interface ClaimEvent {
|
|
35
|
+
phase:
|
|
36
|
+
| 'acquired'
|
|
37
|
+
| 'queued'
|
|
38
|
+
| 'granted'
|
|
39
|
+
| 'lost'
|
|
40
|
+
| 'rejected'
|
|
41
|
+
| 'expired';
|
|
42
|
+
claimId?: string;
|
|
43
|
+
model?: string;
|
|
44
|
+
id?: string;
|
|
45
|
+
field?: string;
|
|
46
|
+
actor?: string;
|
|
47
|
+
position?: number;
|
|
48
|
+
/**
|
|
49
|
+
* What this claim's holder said they were doing — prose, written for a
|
|
50
|
+
* person. Separate from {@link ClaimEvent.reason}, which is machine-readable
|
|
51
|
+
* and only ever says why a claim ended. One field used to carry both, so an
|
|
52
|
+
* `acquired` event's "reason" was really a description and a `rejected`
|
|
53
|
+
* event's was really a cause.
|
|
54
|
+
*/
|
|
55
|
+
description?: string;
|
|
56
|
+
/** Why the claim ended or was refused. Absent while it is simply alive. */
|
|
57
|
+
reason?: ClaimEventReason;
|
|
58
|
+
/**
|
|
59
|
+
* A policy's own words when a policy decided the outcome — free text by
|
|
60
|
+
* nature, and kept beside the closed {@link ClaimEvent.reason} rather than
|
|
61
|
+
* collapsed into it.
|
|
62
|
+
*/
|
|
63
|
+
policyReason?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Who blocked this claim. Present on `rejected`, where the wire already
|
|
66
|
+
* carried the holder and this projection used to discard it.
|
|
67
|
+
*/
|
|
68
|
+
heldBy?: ClaimCounterparty;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** A committed notify-instead-of-abort stale-write collision. */
|
|
72
|
+
export interface ConflictEvent {
|
|
73
|
+
clientTxId: string;
|
|
74
|
+
rows: readonly {
|
|
75
|
+
model: string;
|
|
76
|
+
id: string;
|
|
77
|
+
fields: readonly string[];
|
|
78
|
+
writtenBy?: ParticipantKind;
|
|
79
|
+
}[];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** The narrow behavior a transaction-layer coordination observer implements. */
|
|
83
|
+
export interface CoordinationObserver {
|
|
84
|
+
captureClaim(event: ClaimEvent): void;
|
|
85
|
+
captureConflict(event: ConflictEvent): void;
|
|
86
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `@abloatai/transaction/coordination` entry point. It re-exports the wire
|
|
3
|
+
* schemas and inferred types for the three coordination layers: presence (who
|
|
4
|
+
* is currently active), claims (taking exclusive hold of a target before
|
|
5
|
+
* writing it), and stale-context guards (rejecting a write that was based on an
|
|
6
|
+
* out-of-date read). The definitions themselves live in the sibling schema
|
|
7
|
+
* module.
|
|
8
|
+
*
|
|
9
|
+
* Exports are listed by name rather than re-exported wholesale, so every symbol
|
|
10
|
+
* that becomes part of this package's public API is a deliberate choice.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// Runtime schemas + helpers.
|
|
14
|
+
export {
|
|
15
|
+
// Shared primitives
|
|
16
|
+
participantKindSchema,
|
|
17
|
+
wireParticipantKindSchema,
|
|
18
|
+
participantKindFromWire,
|
|
19
|
+
descriptionFromMeta,
|
|
20
|
+
claimDescription,
|
|
21
|
+
DEFAULT_CLAIM_DESCRIPTION,
|
|
22
|
+
targetRefSchema,
|
|
23
|
+
// Layer 3 — optimistic stale-context
|
|
24
|
+
onStaleModeSchema,
|
|
25
|
+
writeGuardSchema,
|
|
26
|
+
staleNotificationSchema,
|
|
27
|
+
readDependencySchema,
|
|
28
|
+
trackDependencySchema,
|
|
29
|
+
// Layer 2 — pessimistic claim / claim-lease
|
|
30
|
+
claimStatusSchema,
|
|
31
|
+
wireClaimStatusSchema,
|
|
32
|
+
wireClaimSummarySchema,
|
|
33
|
+
claimErrorSchema,
|
|
34
|
+
wireClaimSchema,
|
|
35
|
+
claimRejectionSchema,
|
|
36
|
+
// The rest of the claim frames, each the validation boundary for one
|
|
37
|
+
// server-sent event — see WS_INBOUND_FRAMES for where they are applied.
|
|
38
|
+
claimLostSchema,
|
|
39
|
+
claimAcquiredSchema,
|
|
40
|
+
claimGrantedSchema,
|
|
41
|
+
claimQueuedSchema,
|
|
42
|
+
claimQueueSchema,
|
|
43
|
+
claimQueueEntrySchema,
|
|
44
|
+
claimExpiredSchema,
|
|
45
|
+
claimEventReasonSchema,
|
|
46
|
+
modelTargetSchema,
|
|
47
|
+
// The one claim record, and the peer-visible projection of it.
|
|
48
|
+
claimRecordSchema,
|
|
49
|
+
heldClaimStatusSchema,
|
|
50
|
+
modelClaimSchema,
|
|
51
|
+
claimBeginPayloadSchema,
|
|
52
|
+
claimAbandonPayloadSchema,
|
|
53
|
+
claimReorderPayloadSchema,
|
|
54
|
+
claimHeartbeatPayloadSchema,
|
|
55
|
+
claimHeartbeatAckPayloadSchema,
|
|
56
|
+
claimHeartbeatBatchPayloadSchema,
|
|
57
|
+
claimHeartbeatBatchAckPayloadSchema,
|
|
58
|
+
// Read interest — what a connection receives, leased (`claim`/`release`,
|
|
59
|
+
// the frames behind `join`) and unleased (`update_subscription`).
|
|
60
|
+
MAX_FRAME_SYNC_GROUPS,
|
|
61
|
+
participantClaimPayloadSchema,
|
|
62
|
+
participantReleasePayloadSchema,
|
|
63
|
+
updateSubscriptionPayloadSchema,
|
|
64
|
+
subscriptionAckPayloadSchema,
|
|
65
|
+
// Commit operation — carries the optimistic write-guard
|
|
66
|
+
commitOperationTypeSchema,
|
|
67
|
+
commitOperationSchema,
|
|
68
|
+
// Layer 1 — presence
|
|
69
|
+
presenceKindSchema,
|
|
70
|
+
presenceActivitySchema,
|
|
71
|
+
presenceUpdateSchema,
|
|
72
|
+
presenceUpdatePayloadSchema,
|
|
73
|
+
// Deprecated alias, removed in 0.36.0 — this line publishes it.
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
75
|
+
presenceUpdateFrameSchema,
|
|
76
|
+
} from './schema.js';
|
|
77
|
+
|
|
78
|
+
// Conflict-policy runtime — the engine detects a conflict, and the policy
|
|
79
|
+
// decides what to do about it. These are re-exported here so that server-side
|
|
80
|
+
// code can reach both the coordination vocabulary and its default conflict
|
|
81
|
+
// resolution from this one subpath, without importing the full client from the
|
|
82
|
+
// package root.
|
|
83
|
+
export { defaultPolicy, capabilityPreemptPolicy, interpretConflictAxis } from '../policy/types.js';
|
|
84
|
+
export type {
|
|
85
|
+
Conflict,
|
|
86
|
+
ConflictAxis,
|
|
87
|
+
ConflictDecision,
|
|
88
|
+
ConflictKind,
|
|
89
|
+
ConflictOperation,
|
|
90
|
+
ConflictPolicy,
|
|
91
|
+
StaleContextConflict,
|
|
92
|
+
ClaimHeldConflict,
|
|
93
|
+
} from '../policy/types.js';
|
|
94
|
+
|
|
95
|
+
// Inferred types, one per schema (plus the standalone aliases).
|
|
96
|
+
export type {
|
|
97
|
+
// Shared primitives
|
|
98
|
+
ParticipantKind,
|
|
99
|
+
TargetRef,
|
|
100
|
+
// Layer 3 — optimistic stale-context
|
|
101
|
+
OnStaleMode,
|
|
102
|
+
WriteGuard,
|
|
103
|
+
StaleNotification,
|
|
104
|
+
ReadDependency,
|
|
105
|
+
TrackDependency,
|
|
106
|
+
// Layer 2 — pessimistic claim / claim-lease
|
|
107
|
+
ClaimStatus,
|
|
108
|
+
WireClaimStatus,
|
|
109
|
+
WireClaimSummary,
|
|
110
|
+
ClaimError,
|
|
111
|
+
WireClaim,
|
|
112
|
+
ClaimRejection,
|
|
113
|
+
ClaimLost,
|
|
114
|
+
ClaimAcquired,
|
|
115
|
+
ClaimGranted,
|
|
116
|
+
ClaimQueued,
|
|
117
|
+
ClaimQueue,
|
|
118
|
+
ClaimQueueEntry,
|
|
119
|
+
ClaimExpired,
|
|
120
|
+
ClaimEventReason,
|
|
121
|
+
ModelTarget,
|
|
122
|
+
ClaimRecord,
|
|
123
|
+
HeldClaimStatus,
|
|
124
|
+
ModelClaim,
|
|
125
|
+
ClaimBeginPayload,
|
|
126
|
+
ClaimAbandonPayload,
|
|
127
|
+
ClaimReorderPayload,
|
|
128
|
+
ClaimHeartbeatPayload,
|
|
129
|
+
ClaimHeartbeatAckPayload,
|
|
130
|
+
ClaimHeartbeatBatchPayload,
|
|
131
|
+
ClaimHeartbeatBatchAckPayload,
|
|
132
|
+
// Read interest — leased and unleased
|
|
133
|
+
ParticipantClaimPayload,
|
|
134
|
+
ParticipantReleasePayload,
|
|
135
|
+
UpdateSubscriptionPayload,
|
|
136
|
+
SubscriptionAckPayload,
|
|
137
|
+
// Commit operation — carries the optimistic write-guard
|
|
138
|
+
CommitOperationType,
|
|
139
|
+
CommitOperation,
|
|
140
|
+
AnyCommitOperation,
|
|
141
|
+
// Layer 1 — presence
|
|
142
|
+
PresenceKind,
|
|
143
|
+
PresenceActivity,
|
|
144
|
+
PresenceUpdate,
|
|
145
|
+
PresenceUpdatePayload,
|
|
146
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
147
|
+
PresenceUpdateFrame,
|
|
148
|
+
} from './schema.js';
|
|
149
|
+
|
|
150
|
+
// In-process observation events. These are behavior-facing projections, not
|
|
151
|
+
// duplicate wire declarations; the wire contracts remain in schema.ts.
|
|
152
|
+
export type {
|
|
153
|
+
ClaimEvent,
|
|
154
|
+
ClaimCounterparty,
|
|
155
|
+
ConflictEvent,
|
|
156
|
+
CoordinationObserver,
|
|
157
|
+
} from './events.js';
|
|
158
|
+
|
|
159
|
+
// The conflict rule itself — whether two claims on one row collide. It is the
|
|
160
|
+
// protocol's decision, not the server's deployment of it, so it lives here and
|
|
161
|
+
// every claim authority imports it.
|
|
162
|
+
export { targetsConflict } from './targetConflict.js';
|
|
163
|
+
|
|
164
|
+
// The locator itself — what a claim points at, and the projections that keep
|
|
165
|
+
// its three entity spellings (`entityType`/`entityId`, `model`/`id`,
|
|
166
|
+
// `type`/`id`) saying the same thing while they coexist.
|
|
167
|
+
export type {
|
|
168
|
+
BatchFence,
|
|
169
|
+
ClaimTargetDetails,
|
|
170
|
+
ClaimTargetSource,
|
|
171
|
+
EntityLocator,
|
|
172
|
+
} from './locator.js';
|
|
173
|
+
export {
|
|
174
|
+
batchFence,
|
|
175
|
+
fenceTokenFor,
|
|
176
|
+
isTargetTuple,
|
|
177
|
+
subTarget,
|
|
178
|
+
wireTarget,
|
|
179
|
+
modelTarget,
|
|
180
|
+
streamTarget,
|
|
181
|
+
} from './locator.js';
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The locator — what a claim points at, in every spelling it travels under.
|
|
3
|
+
*
|
|
4
|
+
* A target has two halves. The sub-entity half (`path`, `range`, `field`,
|
|
5
|
+
* `fields`, `meta`) is spelled identically everywhere; the entity half is not.
|
|
6
|
+
* It is `entityType`/`entityId` on the wire, `model`/`id` on the HTTP DTO and
|
|
7
|
+
* the SDK's model surface, and `type`/`id` on the claim handle and the wait
|
|
8
|
+
* line. The three coexist deliberately — unifying them changes every surface at
|
|
9
|
+
* once, and that is scheduled behind the protocol version — but while they
|
|
10
|
+
* coexist, the translation between them belongs in one place.
|
|
11
|
+
*
|
|
12
|
+
* It was copied member by member at more than twenty sites instead, which is
|
|
13
|
+
* how `fields` came to be added to the schema and to the conflict rule while
|
|
14
|
+
* several hops quietly dropped it: the rule learned to compare field sets while
|
|
15
|
+
* no path carried one, so the fix looked complete and changed nothing. Widening
|
|
16
|
+
* the locator again should touch this module and the schema, not every hop.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { ClaimPart, ModelTarget, TargetRef, WireClaim } from './schema.js';
|
|
20
|
+
import {
|
|
21
|
+
fieldSelection,
|
|
22
|
+
type FieldRef,
|
|
23
|
+
type FieldSelector,
|
|
24
|
+
} from '../schema/fieldRef.js';
|
|
25
|
+
import { partName } from './schema.js';
|
|
26
|
+
import type { ClaimTarget, PresenceTarget } from '../types/streams.js';
|
|
27
|
+
import type { ResolveClaimMeta } from '../types/global.js';
|
|
28
|
+
// The one declared→wire conversion for claim metadata; `declaredMeta` is its
|
|
29
|
+
// counterpart, called by the decodes that build a public claim.
|
|
30
|
+
import { wireMeta } from './claimMeta.js';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The part of a claim that narrows it below the whole entity. A claim with none
|
|
34
|
+
* of these set is a claim on the entity itself.
|
|
35
|
+
*
|
|
36
|
+
* `meta` is carried because it travels with the target everywhere else, not
|
|
37
|
+
* because the rule reads it: application metadata is opaque to coordination and
|
|
38
|
+
* never decides a conflict.
|
|
39
|
+
*/
|
|
40
|
+
export type ClaimTargetDetails = Pick<
|
|
41
|
+
WireClaim,
|
|
42
|
+
'field' | 'fields' | 'meta'
|
|
43
|
+
>;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* A locator as a *caller* may hold it — identical to {@link ClaimTargetDetails}
|
|
47
|
+
* except that `meta` may already be the shape the program registered on
|
|
48
|
+
* `Register`'s `ClaimMeta` slot, which an `interface` registration makes
|
|
49
|
+
* distinct from the wire's open record.
|
|
50
|
+
*
|
|
51
|
+
* A projection that only accepted the wire spelling would push the conversion
|
|
52
|
+
* back out to every call site that starts from a public target — the claim
|
|
53
|
+
* handle, the model surface, the HTTP claim params — which is the same
|
|
54
|
+
* member-by-member copying this module exists to end.
|
|
55
|
+
*/
|
|
56
|
+
export type ClaimTargetSource<T = Record<string, unknown>> =
|
|
57
|
+
Omit<ClaimTargetDetails, 'meta' | 'field' | 'fields'> & {
|
|
58
|
+
/** A schema field reference, wire name, or low-level app-defined part. */
|
|
59
|
+
readonly field?: string | ClaimPart | FieldRef;
|
|
60
|
+
readonly fields?:
|
|
61
|
+
| readonly (string | ClaimPart | FieldRef)[]
|
|
62
|
+
| FieldSelector<T>;
|
|
63
|
+
readonly meta?: ClaimTargetDetails['meta'] | ResolveClaimMeta;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Copy the sub-entity part of a locator from one target shape to another.
|
|
68
|
+
*
|
|
69
|
+
* These five members are spelled identically wherever a target appears, so this
|
|
70
|
+
* owns all of them and the entity half is handled by its own projections below.
|
|
71
|
+
*
|
|
72
|
+
* Absent members are omitted rather than set to `undefined`, so a projected
|
|
73
|
+
* target can be spread into an object under `exactOptionalPropertyTypes`.
|
|
74
|
+
*
|
|
75
|
+
* The result is wire-shaped, `meta` included: this is the projection every path
|
|
76
|
+
* out of the SDK goes through, so it is also the single declared→wire crossing
|
|
77
|
+
* for claim metadata. The way back is {@link declaredMeta}, at the two decodes
|
|
78
|
+
* that build a public claim.
|
|
79
|
+
*/
|
|
80
|
+
export function subTarget<T = Record<string, unknown>>(
|
|
81
|
+
// `null` as well as absent, because the claim body declares its target
|
|
82
|
+
// nullish and the projection is most useful exactly where that body is read.
|
|
83
|
+
source: ClaimTargetSource<T> | null | undefined,
|
|
84
|
+
model?: string,
|
|
85
|
+
): ClaimTargetDetails {
|
|
86
|
+
if (!source) return {};
|
|
87
|
+
const selection =
|
|
88
|
+
typeof source.fields === 'function'
|
|
89
|
+
? source.fields(fieldSelection(model ?? ''))
|
|
90
|
+
: source.fields;
|
|
91
|
+
const selectedFields =
|
|
92
|
+
selection === undefined
|
|
93
|
+
? undefined
|
|
94
|
+
: Array.isArray(selection)
|
|
95
|
+
? selection
|
|
96
|
+
: [selection];
|
|
97
|
+
return {
|
|
98
|
+
// Part names cross to their wire spelling here — the one declared→wire
|
|
99
|
+
// seam — so a `part('B2')` object never leaks into a frame or a URL.
|
|
100
|
+
...(source.field !== undefined ? { field: partName(source.field) } : {}),
|
|
101
|
+
...(selectedFields !== undefined ? { fields: selectedFields.map(partName) } : {}),
|
|
102
|
+
...(source.meta !== undefined ? { meta: wireMeta(source.meta) } : {}),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Whether a target was given in the `[type, id]` shorthand rather than the
|
|
108
|
+
* object form.
|
|
109
|
+
*
|
|
110
|
+
* A predicate rather than an assertion, because `Array.isArray` leaves a
|
|
111
|
+
* readonly tuple in both branches and the alternative — asserting the object
|
|
112
|
+
* form — describes the locator by hand at every call site that resolves one.
|
|
113
|
+
*/
|
|
114
|
+
export function isTargetTuple(
|
|
115
|
+
target: PresenceTarget,
|
|
116
|
+
): target is readonly [type: string, id: string] {
|
|
117
|
+
return Array.isArray(target);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* An entity named in any of the three spellings a claim travels under.
|
|
122
|
+
*
|
|
123
|
+
* The union is discriminated by which key is present, and `{ model, id }` and
|
|
124
|
+
* `{ type, id }` share `id` — so the read below tests `entityType` first, then
|
|
125
|
+
* `model`, and falls through to `type`. A source carrying both `model` and
|
|
126
|
+
* `type` is not expressible here and does not occur; it would take the earlier
|
|
127
|
+
* branch if it did.
|
|
128
|
+
*/
|
|
129
|
+
export type EntityLocator =
|
|
130
|
+
| Pick<TargetRef, 'entityType' | 'entityId'>
|
|
131
|
+
| Pick<ModelTarget, 'model' | 'id'>
|
|
132
|
+
| Pick<ClaimTarget, 'type' | 'id'>;
|
|
133
|
+
|
|
134
|
+
/** The entity as a name and an identifier, whichever spelling named it. */
|
|
135
|
+
function entityOf(source: EntityLocator): readonly [string, string] {
|
|
136
|
+
if ('entityType' in source) return [source.entityType, source.entityId];
|
|
137
|
+
if ('model' in source) return [source.model, source.id];
|
|
138
|
+
return [source.type, source.id];
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** The entity half in the wire's spelling — claim frames, presence activity. */
|
|
142
|
+
export function wireTarget(
|
|
143
|
+
source: EntityLocator,
|
|
144
|
+
): Pick<TargetRef, 'entityType' | 'entityId'> {
|
|
145
|
+
const [entityType, entityId] = entityOf(source);
|
|
146
|
+
return { entityType, entityId };
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** The entity half in the spelling SDK callers and the HTTP routes read. */
|
|
150
|
+
export function modelTarget(
|
|
151
|
+
source: EntityLocator,
|
|
152
|
+
): Pick<ModelTarget, 'model' | 'id'> {
|
|
153
|
+
const [model, id] = entityOf(source);
|
|
154
|
+
return { model, id };
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** The entity half as the claim handle and the wait line carry it. */
|
|
158
|
+
export function streamTarget(
|
|
159
|
+
source: EntityLocator,
|
|
160
|
+
): Pick<ClaimTarget, 'type' | 'id'> {
|
|
161
|
+
const [type, id] = entityOf(source);
|
|
162
|
+
return { type, id };
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* A batch claim's grant: its fencing token, and the one row it was granted over.
|
|
167
|
+
*
|
|
168
|
+
* A claim's `readAt` generalises across a batch; its token does not. The token
|
|
169
|
+
* is evidence of one row's place in the grant order, so it belongs only on the
|
|
170
|
+
* operation writing the row the claim covers. Presented anywhere else the server
|
|
171
|
+
* refuses it, because a token that travels is a fence any writer can raise.
|
|
172
|
+
*/
|
|
173
|
+
export type BatchFence = Pick<ModelTarget, 'model' | 'id'> & {
|
|
174
|
+
readonly token: number;
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
/** The batch's grant, or nothing when there is no claim, or none with a token. */
|
|
178
|
+
export function batchFence(
|
|
179
|
+
source: EntityLocator | null | undefined,
|
|
180
|
+
token: number | null | undefined,
|
|
181
|
+
): BatchFence | null {
|
|
182
|
+
return source == null || token == null
|
|
183
|
+
? null
|
|
184
|
+
: { ...modelTarget(source), token };
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* The token an operation carries: its own if it names one, the batch's when it
|
|
189
|
+
* writes the claimed row, otherwise none.
|
|
190
|
+
*/
|
|
191
|
+
export function fenceTokenFor(
|
|
192
|
+
fence: BatchFence | null,
|
|
193
|
+
model: string,
|
|
194
|
+
id: string | null,
|
|
195
|
+
): number | null {
|
|
196
|
+
if (fence === null || id === null) return null;
|
|
197
|
+
return model.toLowerCase() === fence.model.toLowerCase() && id === fence.id
|
|
198
|
+
? fence.token
|
|
199
|
+
: null;
|
|
200
|
+
}
|