@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,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The canonical interface every data-source backend implements, together with the bridge
|
|
3
|
+
* that wires an implementation into the `dataSource()` HTTP handler. This package
|
|
4
|
+
* defines the contract and ships adapters for three object-relational mappers —
|
|
5
|
+
* {@link prismaDataSource}, {@link drizzleDataSource}, and {@link kyselyDataSource} —
|
|
6
|
+
* each verified by shared mutation checks plus endpoint-only outbox checks. The
|
|
7
|
+
* direct Kysely wrapper runs only the shared mutation contract. You can also
|
|
8
|
+
* write your own.
|
|
9
|
+
*
|
|
10
|
+
* An endpoint adapter reads and writes your database, and it owns the transactional
|
|
11
|
+
* outbox and idempotency bookkeeping as well, so you never write those by hand.
|
|
12
|
+
* Hand it to the handler in one slot:
|
|
13
|
+
*
|
|
14
|
+
* export const POST = dataSource({
|
|
15
|
+
* schema, apiKey: process.env.ABLO_API_KEY!,
|
|
16
|
+
* adapter: prismaDataSource(prisma, schema),
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* That is the path to teach. {@link sourceHandlersFromAdapter} is the lower-level
|
|
20
|
+
* bridge behind it — it expands one adapter into the handler's `commit`, `events`,
|
|
21
|
+
* and per-model `load` and `list` operations, and is worth reaching for only when
|
|
22
|
+
* you want to override one of those while the adapter serves the rest.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import type { SourceListQuery, SourceRequestContext } from './types.js';
|
|
26
|
+
import type {
|
|
27
|
+
AdapterCapabilities,
|
|
28
|
+
ChangeSet,
|
|
29
|
+
EventsPage,
|
|
30
|
+
Migration,
|
|
31
|
+
} from './contract.js';
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* A single row keyed by the schema's field names (for example `operatorId`), not
|
|
35
|
+
* by physical column names. Each adapter is the boundary that translates between
|
|
36
|
+
* the two, mapping a field name to whatever the underlying database column is
|
|
37
|
+
* called. Values are typed as `unknown`, so a caller must narrow a value before
|
|
38
|
+
* using it.
|
|
39
|
+
*/
|
|
40
|
+
export type Row = Record<string, unknown>;
|
|
41
|
+
|
|
42
|
+
/** A read request handed to an adapter: either a single-row load by id, or a filtered list. */
|
|
43
|
+
export type AdapterReadRequest =
|
|
44
|
+
| { readonly kind: 'load'; readonly model: string; readonly id: string; readonly scope?: SourceRequestContext }
|
|
45
|
+
| { readonly kind: 'list'; readonly model: string; readonly query?: SourceListQuery; readonly scope?: SourceRequestContext };
|
|
46
|
+
|
|
47
|
+
/** What {@link MutationAdapter.commit} returns: the rows as they stand after the write. */
|
|
48
|
+
export interface AdapterCommitResult {
|
|
49
|
+
/** The affected rows after the write. The change log is derived from these. */
|
|
50
|
+
readonly rows: readonly Row[];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Guarantees shared by direct and endpoint mutation wrappers. Both apply row DML
|
|
55
|
+
* and write the permanent idempotency ledger in one transaction. The scoped,
|
|
56
|
+
* server-authored `correlationId` is the ledger key; a caller-authored operation
|
|
57
|
+
* transaction id is never used as that namespace.
|
|
58
|
+
*/
|
|
59
|
+
export interface MutationAdapter {
|
|
60
|
+
readonly capabilities: AdapterCapabilities;
|
|
61
|
+
/** Infrastructure migrations required by this wrapper's advertised capabilities. */
|
|
62
|
+
migrations(): readonly Migration[];
|
|
63
|
+
/** The rows matching a load or list request. */
|
|
64
|
+
read(req: AdapterReadRequest): Promise<readonly Row[]>;
|
|
65
|
+
/**
|
|
66
|
+
* Applies a change set in one transaction, keyed by its scoped `correlationId`.
|
|
67
|
+
* Replaying the same correlation and canonical request hash returns the original
|
|
68
|
+
* rows without applying DML again; a different hash fails closed.
|
|
69
|
+
*/
|
|
70
|
+
commit(change: ChangeSet): Promise<AdapterCommitResult>;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Endpoint-only extension of {@link MutationAdapter}. Its commit writes one
|
|
75
|
+
* correlated outbox event per operation in the same transaction as the DML and
|
|
76
|
+
* ledger. Direct wrappers deliberately do not implement this interface: WAL is
|
|
77
|
+
* their authoritative source feed and they must never write `ablo_outbox`.
|
|
78
|
+
*/
|
|
79
|
+
export interface DataSourceAdapter extends MutationAdapter {
|
|
80
|
+
readonly capabilities: AdapterCapabilities & { readonly outboxEvents: true };
|
|
81
|
+
/** Reads outbox events after `cursor` (`null` starts from the beginning), up to `limit` events. */
|
|
82
|
+
events(cursor: string | null, limit: number): Promise<EventsPage>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export type { AdapterCapabilities, ChangeSet, Migration, OutboxEvent, EventsPage } from './contract.js';
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Drizzle adapter for the data-source interface. It implements the same
|
|
3
|
+
* {@link DataSourceAdapter} contract as {@link prismaDataSource} and passes the
|
|
4
|
+
* same conformance suite, built against Drizzle's query API:
|
|
5
|
+
* - `db.transaction(async (tx) => …)` runs an interactive transaction that
|
|
6
|
+
* commits or rolls back as a unit.
|
|
7
|
+
* - `db.execute(sql`…`)` runs parameterized raw SQL; `sql.identifier()` safely
|
|
8
|
+
* quotes dynamic table and column names, and `sql`${value}`` parameterizes
|
|
9
|
+
* values.
|
|
10
|
+
*
|
|
11
|
+
* Table and column names come from your schema, not from a hand-written Drizzle
|
|
12
|
+
* table. Because this adapter issues raw SQL, it would otherwise bypass any
|
|
13
|
+
* field-to-column translation, so it derives every name from the same rule the
|
|
14
|
+
* table provisioner uses:
|
|
15
|
+
* table = `model.tableName ?? key`
|
|
16
|
+
* column = `fieldMeta.column ?? camelToSnake(field)` (plus the tenancy column)
|
|
17
|
+
* This keeps the tables `ablo migrate` creates (for example `operator_id`) and the
|
|
18
|
+
* columns this adapter reads and writes in agreement. You define the schema once
|
|
19
|
+
* and point the engine at your Postgres database. The adapter is the translation
|
|
20
|
+
* boundary: the rows it accepts and returns, and the outbox `data` it writes, are
|
|
21
|
+
* keyed by field name, while the physical columns it touches are snake_case.
|
|
22
|
+
*
|
|
23
|
+
* Two things to know about drivers:
|
|
24
|
+
* 1. Interactive `db.transaction` needs a driver that supports it. Neon's
|
|
25
|
+
* `neon-http` driver is single-shot and does not, so use `neon-serverless`
|
|
26
|
+
* (over WebSocket) or `pg`; under `neon-http` the commit path throws at
|
|
27
|
+
* runtime.
|
|
28
|
+
* 2. The `db.execute` result shape is driver-specific — `postgres-js` returns an
|
|
29
|
+
* array-like row list, while `node-postgres` returns `{ rows }`. `rowsOf`
|
|
30
|
+
* normalizes both.
|
|
31
|
+
*
|
|
32
|
+
* Every write goes through `sql` and `db.execute` rather than the fluent builder,
|
|
33
|
+
* which keeps the adapter one small, fully typed unit with no per-driver builder
|
|
34
|
+
* generics.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
import { AbloValidationError } from '../../errors.js';
|
|
38
|
+
import { sql, type SQL } from 'drizzle-orm';
|
|
39
|
+
import type {
|
|
40
|
+
AdapterCommitResult,
|
|
41
|
+
AdapterReadRequest,
|
|
42
|
+
DataSourceAdapter,
|
|
43
|
+
Row,
|
|
44
|
+
} from '../adapter.js';
|
|
45
|
+
import type { ChangeSet, EventsPage, Migration, Operation } from '../contract.js';
|
|
46
|
+
import { outboxEventSchema } from '../contract.js';
|
|
47
|
+
import { adapterTableMigrations } from '../migrations.js';
|
|
48
|
+
import {
|
|
49
|
+
assertSourceIdempotencyIntent,
|
|
50
|
+
assertSourceIdempotencyRetention,
|
|
51
|
+
SOURCE_IDEMPOTENCY_RETENTION,
|
|
52
|
+
sourceChangeIntentHash,
|
|
53
|
+
} from '../idempotency.js';
|
|
54
|
+
import type { Schema, SchemaRecord } from '../../schema/schema.js';
|
|
55
|
+
import { toSchemaJSON } from '../../schema/serialize.js';
|
|
56
|
+
import { camelToSnake, snakeToCamel } from '../../schema/ddl.js';
|
|
57
|
+
import { tenancyColumn } from '../../schema/tenancy.js';
|
|
58
|
+
import { ABLO_POSTGRES_COMMIT_ECHO_PREFIX } from '../types.js';
|
|
59
|
+
|
|
60
|
+
/** The subset of a Drizzle database/transaction handle the adapter calls. */
|
|
61
|
+
export interface DrizzleLike {
|
|
62
|
+
execute(query: SQL): Promise<DrizzleExecuteResult>;
|
|
63
|
+
transaction<T>(fn: (tx: DrizzleLike) => Promise<T>): Promise<T>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** `db.execute` is array-like (postgres-js) or `{ rows }` (node-postgres). */
|
|
67
|
+
export type DrizzleExecuteResult = readonly Row[] | { readonly rows: readonly Row[] };
|
|
68
|
+
|
|
69
|
+
function rowsOf(result: DrizzleExecuteResult): readonly Row[] {
|
|
70
|
+
return Array.isArray(result) ? result : (result as { readonly rows: readonly Row[] }).rows;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function rowId(op: Operation): string {
|
|
74
|
+
const id = op.id ?? (op.input?.id as string | undefined);
|
|
75
|
+
if (typeof id !== 'string' || id.length === 0) {
|
|
76
|
+
throw new AbloValidationError(`operation on "${op.model}" requires an id`, { code: 'source_operation_id_required' });
|
|
77
|
+
}
|
|
78
|
+
return id;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** `col1, col2` as a safely-quoted identifier list. */
|
|
82
|
+
const identList = (cols: readonly string[]): SQL =>
|
|
83
|
+
sql.join(cols.map((c) => sql.identifier(c)), sql`, `);
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Per-model name resolution, computed once from the schema. `table` is the physical
|
|
87
|
+
* table name. The override maps record only the fields whose column name diverges
|
|
88
|
+
* from `camelToSnake(field)` — an explicit `field.from('…')` or a custom tenancy
|
|
89
|
+
* column — while every other field falls back to the plain casing rule. Keeping
|
|
90
|
+
* only the exceptions makes the maps small and lets the reverse direction
|
|
91
|
+
* (`snakeToCamel`) invert the common case without a lookup.
|
|
92
|
+
*/
|
|
93
|
+
interface ModelColumns {
|
|
94
|
+
readonly table: string;
|
|
95
|
+
readonly fieldToColumn: ReadonlyMap<string, string>;
|
|
96
|
+
readonly columnToField: ReadonlyMap<string, string>;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function buildColumnMaps(schema: Schema): ReadonlyMap<string, ModelColumns> {
|
|
100
|
+
const json = toSchemaJSON(schema);
|
|
101
|
+
const out = new Map<string, ModelColumns>();
|
|
102
|
+
for (const [key, model] of Object.entries(json.models)) {
|
|
103
|
+
const fieldToColumn = new Map<string, string>();
|
|
104
|
+
const columnToField = new Map<string, string>();
|
|
105
|
+
const register = (field: string, column: string): void => {
|
|
106
|
+
// The default rule already covers `camelToSnake(field)`; only record real
|
|
107
|
+
// divergences so the reverse map never shadows a clean round-trip.
|
|
108
|
+
if (column === camelToSnake(field)) return;
|
|
109
|
+
fieldToColumn.set(field, column);
|
|
110
|
+
columnToField.set(column, field);
|
|
111
|
+
};
|
|
112
|
+
for (const [field, meta] of Object.entries(model.fields)) {
|
|
113
|
+
if (meta.column) register(field, meta.column);
|
|
114
|
+
}
|
|
115
|
+
const orgColumn = tenancyColumn(model.tenancy);
|
|
116
|
+
if (orgColumn) register('organizationId', orgColumn);
|
|
117
|
+
out.set(key, { table: model.tableName ?? key, fieldToColumn, columnToField });
|
|
118
|
+
}
|
|
119
|
+
return out;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function drizzleDataSource<S extends SchemaRecord>(
|
|
123
|
+
db: DrizzleLike,
|
|
124
|
+
schema: Schema<S>,
|
|
125
|
+
): DataSourceAdapter {
|
|
126
|
+
const maps = buildColumnMaps(schema);
|
|
127
|
+
const modelColumns = (model: string): ModelColumns => {
|
|
128
|
+
const mc = maps.get(model);
|
|
129
|
+
if (!mc) throw new AbloValidationError(`drizzleDataSource: no model "${model}" in schema`, { code: 'source_adapter_misconfigured' });
|
|
130
|
+
return mc;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
const columnFor = (mc: ModelColumns, field: string): string =>
|
|
134
|
+
mc.fieldToColumn.get(field) ?? camelToSnake(field);
|
|
135
|
+
const fieldFor = (mc: ModelColumns, column: string): string =>
|
|
136
|
+
mc.columnToField.get(column) ?? snakeToCamel(column);
|
|
137
|
+
|
|
138
|
+
/** Field-keyed row to column-keyed row, for INSERT and UPDATE values. */
|
|
139
|
+
const toColumns = (mc: ModelColumns, row: Row): Row => {
|
|
140
|
+
const out: Row = {};
|
|
141
|
+
for (const k of Object.keys(row)) out[columnFor(mc, k)] = row[k];
|
|
142
|
+
return out;
|
|
143
|
+
};
|
|
144
|
+
/** Column-keyed row (from `RETURNING *` or `SELECT *`) back to a field-keyed row, for reads and results. */
|
|
145
|
+
const toFields = (mc: ModelColumns, row: Row): Row => {
|
|
146
|
+
const out: Row = {};
|
|
147
|
+
for (const k of Object.keys(row)) out[fieldFor(mc, k)] = row[k];
|
|
148
|
+
return out;
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
const applyOperation = async (tx: DrizzleLike, op: Operation): Promise<Row> => {
|
|
152
|
+
const mc = modelColumns(op.model);
|
|
153
|
+
const table = sql.identifier(mc.table);
|
|
154
|
+
const id = rowId(op);
|
|
155
|
+
const input = op.input ?? {};
|
|
156
|
+
|
|
157
|
+
if (op.type === 'DELETE') {
|
|
158
|
+
const deleted = rowsOf(await tx.execute(sql`DELETE FROM ${table} WHERE id = ${id} RETURNING *`));
|
|
159
|
+
return deleted[0] ? toFields(mc, deleted[0]) : { id };
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (op.type === 'CREATE') {
|
|
163
|
+
const data = toColumns(mc, { id, ...input });
|
|
164
|
+
const cols = Object.keys(data);
|
|
165
|
+
const values = sql.join(cols.map((c) => sql`${data[c]}`), sql`, `);
|
|
166
|
+
const inserted = rowsOf(
|
|
167
|
+
await tx.execute(sql`INSERT INTO ${table} (${identList(cols)}) VALUES (${values}) RETURNING *`),
|
|
168
|
+
);
|
|
169
|
+
return inserted[0] ? toFields(mc, inserted[0]) : { id, ...input };
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// UPDATE / ARCHIVE / UNARCHIVE — a SET clause + the lifecycle field. The
|
|
173
|
+
// lifecycle field is `archivedAt` (camelCase) and goes through `toColumns`
|
|
174
|
+
// like any other, so it lands in `archived_at` — same column the provisioner
|
|
175
|
+
// emits and the Prisma adapter writes (no per-adapter casing divergence).
|
|
176
|
+
const patch = toColumns(mc, {
|
|
177
|
+
...input,
|
|
178
|
+
...(op.type === 'ARCHIVE' ? { archivedAt: new Date() } : {}),
|
|
179
|
+
...(op.type === 'UNARCHIVE' ? { archivedAt: null } : {}),
|
|
180
|
+
});
|
|
181
|
+
const assignments = sql.join(
|
|
182
|
+
Object.keys(patch).map((c) => sql`${sql.identifier(c)} = ${patch[c]}`),
|
|
183
|
+
sql`, `,
|
|
184
|
+
);
|
|
185
|
+
const updated = rowsOf(
|
|
186
|
+
await tx.execute(sql`UPDATE ${table} SET ${assignments} WHERE id = ${id} RETURNING *`),
|
|
187
|
+
);
|
|
188
|
+
return updated[0] ? toFields(mc, updated[0]) : { id, ...input };
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
return {
|
|
192
|
+
capabilities: {
|
|
193
|
+
transactions: true,
|
|
194
|
+
propose: false,
|
|
195
|
+
schemaIntrospection: true,
|
|
196
|
+
postgresWalEcho: true,
|
|
197
|
+
outboxEvents: true,
|
|
198
|
+
},
|
|
199
|
+
|
|
200
|
+
migrations(): readonly Migration[] {
|
|
201
|
+
return adapterTableMigrations();
|
|
202
|
+
},
|
|
203
|
+
|
|
204
|
+
async read(req: AdapterReadRequest): Promise<readonly Row[]> {
|
|
205
|
+
const mc = modelColumns(req.model);
|
|
206
|
+
const table = sql.identifier(mc.table);
|
|
207
|
+
if (req.kind === 'load') {
|
|
208
|
+
const rows = rowsOf(await db.execute(sql`SELECT * FROM ${table} WHERE id = ${req.id} LIMIT 1`));
|
|
209
|
+
return rows.map((r) => toFields(mc, r));
|
|
210
|
+
}
|
|
211
|
+
const limit = req.query?.limit ?? 1000;
|
|
212
|
+
const rows = rowsOf(await db.execute(sql`SELECT * FROM ${table} LIMIT ${limit}`));
|
|
213
|
+
return rows.map((r) => toFields(mc, r));
|
|
214
|
+
},
|
|
215
|
+
|
|
216
|
+
async commit(change: ChangeSet): Promise<AdapterCommitResult> {
|
|
217
|
+
const requestHash = sourceChangeIntentHash(change);
|
|
218
|
+
return db.transaction(async (tx) => {
|
|
219
|
+
const cached = rowsOf(
|
|
220
|
+
await tx.execute(
|
|
221
|
+
sql`SELECT response, request_hash AS "requestHash", expires_at AS "expiresAt"
|
|
222
|
+
FROM ablo_idempotency
|
|
223
|
+
WHERE client_tx_id = ${change.correlationId} LIMIT 1`,
|
|
224
|
+
),
|
|
225
|
+
);
|
|
226
|
+
const cachedRow = cached[0];
|
|
227
|
+
if (cachedRow) {
|
|
228
|
+
assertSourceIdempotencyIntent(cachedRow.requestHash, requestHash);
|
|
229
|
+
assertSourceIdempotencyRetention(cachedRow.expiresAt);
|
|
230
|
+
return { rows: cachedRow.response as Row[] };
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
const rows: Row[] = [];
|
|
234
|
+
for (const [index, op] of change.operations.entries()) {
|
|
235
|
+
const row = await applyOperation(tx, op);
|
|
236
|
+
rows.push(row);
|
|
237
|
+
const entityId = String(row.id ?? rowId(op));
|
|
238
|
+
await tx.execute(sql`
|
|
239
|
+
INSERT INTO ablo_outbox (
|
|
240
|
+
id, model, entity_id, type, data,
|
|
241
|
+
correlation_id, transaction_id, occurred_at
|
|
242
|
+
)
|
|
243
|
+
VALUES (
|
|
244
|
+
${`${change.correlationId}:${index}`}, ${op.model}, ${entityId}, ${op.type},
|
|
245
|
+
${op.type === 'DELETE' ? null : JSON.stringify(row)}::jsonb,
|
|
246
|
+
${change.correlationId}, ${op.transactionId ?? null}, ${Date.now()}
|
|
247
|
+
)`);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
await tx.execute(sql`
|
|
251
|
+
INSERT INTO ablo_idempotency (client_tx_id, response, request_hash, expires_at)
|
|
252
|
+
VALUES (
|
|
253
|
+
${change.correlationId}, ${JSON.stringify(rows)}::jsonb, ${requestHash},
|
|
254
|
+
now() + ${SOURCE_IDEMPOTENCY_RETENTION}::interval
|
|
255
|
+
)`);
|
|
256
|
+
if (change.echo?.kind === 'postgres-wal') {
|
|
257
|
+
await tx.execute(
|
|
258
|
+
sql`SELECT pg_logical_emit_message(true, ${ABLO_POSTGRES_COMMIT_ECHO_PREFIX}, ${change.echo.payload})`,
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
return { rows };
|
|
262
|
+
});
|
|
263
|
+
},
|
|
264
|
+
|
|
265
|
+
async events(cursor: string | null, limit: number): Promise<EventsPage> {
|
|
266
|
+
const after = cursor ?? '0';
|
|
267
|
+
const rows = rowsOf(
|
|
268
|
+
await db.execute(sql`
|
|
269
|
+
SELECT cursor, id, model, entity_id, type, data, organization_id,
|
|
270
|
+
client_tx_id, correlation_id, transaction_id, occurred_at
|
|
271
|
+
FROM ablo_outbox WHERE cursor > ${after} ORDER BY cursor ASC LIMIT ${limit}`),
|
|
272
|
+
);
|
|
273
|
+
const events = rows.map((r) =>
|
|
274
|
+
outboxEventSchema.parse({
|
|
275
|
+
id: r.id,
|
|
276
|
+
model: r.model,
|
|
277
|
+
entityId: r.entity_id,
|
|
278
|
+
type: r.type,
|
|
279
|
+
data: r.data ?? null,
|
|
280
|
+
organizationId: r.organization_id ?? null,
|
|
281
|
+
clientTxId: r.client_tx_id ?? null,
|
|
282
|
+
correlationId: r.correlation_id ?? null,
|
|
283
|
+
transactionId: r.transaction_id ?? null,
|
|
284
|
+
occurredAt: r.occurred_at != null ? Number(r.occurred_at) : null,
|
|
285
|
+
cursor: String(r.cursor),
|
|
286
|
+
}),
|
|
287
|
+
);
|
|
288
|
+
return { events, nextCursor: events.at(-1)?.cursor ?? null };
|
|
289
|
+
},
|
|
290
|
+
};
|
|
291
|
+
}
|